Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ export class AiService {
temperature: 0.7,
};

const response = await this.chatService.chat.completions.create(params);
const response = await this.chatService.chat.completions.create(params, { maxRetries: 0 });

@dmlvr dmlvr Sep 9, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

let's add maxRetries to the params object here and all next demos, where we have params object

const data = { choices: response.choices };

return data.choices[0].message?.content;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -106,13 +106,23 @@ export class AppService {
this.messages.push({ role: 'assistant', content: aiResponse });
this.renderAssistantMessage(aiResponse);
}, 200);
} catch {
} catch (err: unknown) {
this.typingUsersSubject.next([]);
this.messages.pop();
this.alertLimitReached();
this.alertError(this.getErrorMessage(err));
}
}

private getErrorMessage(err: unknown): string {
if (typeof err === 'object' && err !== null) {
const e = err as { error?: { message?: unknown }; message?: unknown };
if (typeof e.error?.message === 'string') return e.error.message;
if (typeof e.message === 'string') return e.message;
}
if (typeof err === 'string') return err;
return 'Unknown error';
}

updateLastMessage(text = this.REGENERATION_TEXT) {
const items = this.dataSource.items();
const lastMessage = items.at(-1);
Expand All @@ -135,9 +145,9 @@ export class AppService {
this.dataSource.store().push([{ type: 'insert', data: message }]);
}

alertLimitReached() {
alertError(message: string) {
this.setAlerts([{
message: 'Request limit reached, try again in a minute.',
message,
}]);

setTimeout(() => {
Expand All @@ -156,9 +166,9 @@ export class AppService {

this.updateLastMessage(aiResponse);
this.messages.at(-1).content = aiResponse;
} catch {
} catch (err: unknown) {
this.updateLastMessage(this.messages.at(-1).content);
this.alertLimitReached();
this.alertError(this.getErrorMessage(err));
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ export async function getAIResponse(messages: AIMessage[], delay?: number): Prom
temperature: 0.7,
};

const response = await chatService.chat.completions.create(params);
const response = await chatService.chat.completions.create(params, { maxRetries: 0 });
const data = { choices: response.choices };

if (delay) {
Expand Down
26 changes: 18 additions & 8 deletions apps/demos/Demos/Chat/AIAndChatbotIntegration/React/useApi.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,16 @@ const dataItemToMessage = (item: ChatTypes.Message): AIMessage => ({

const getMessageHistory = (): AIMessage[] => [...dataSource.items()].map(dataItemToMessage);

const getErrorMessage = (err: unknown): string => {
if (typeof err === 'object' && err !== null) {
const e = err as { error?: { message?: unknown }; message?: unknown };
if (typeof e.error?.message === 'string') return e.error.message;
if (typeof e.message === 'string') return e.message;
}
if (typeof err === 'string') return err;
return 'Unknown error';
};

export const useApi = () => {
const [alerts, setAlerts] = useState<ChatTypes.Alert[]>([]);

Expand All @@ -55,9 +65,9 @@ export const useApi = () => {
}]);
}, []);

const alertLimitReached = useCallback((): void => {
const alertError = useCallback((message: string): void => {
setAlerts([{
message: 'Request limit reached, try again in a minute.',
message,
}]);

setTimeout(() => {
Expand All @@ -77,10 +87,10 @@ export const useApi = () => {
author: assistant,
text: aiResponse,
});
} catch {
alertLimitReached();
} catch (err: unknown) {
alertError(getErrorMessage(err));
}
}, [alertLimitReached, insertMessage]);
}, [alertError, insertMessage]);

const regenerateLastAIResponse = useCallback(async (): Promise<void> => {
const messageHistory = getMessageHistory();
Expand All @@ -92,11 +102,11 @@ export const useApi = () => {
if (typeof aiResponse === 'string') {
updateLastMessageContent(aiResponse);
}
} catch {
} catch (err: unknown) {
updateLastMessageContent(messageHistory.at(-1)?.content as string);
alertLimitReached();
alertError(getErrorMessage(err));
}
}, [alertLimitReached, updateLastMessageContent]);
}, [alertError, updateLastMessageContent]);

return {
alerts,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ export async function getAIResponse(messages, delay) {
max_completion_tokens: 1000,
temperature: 0.7,
};
const response = await chatService.chat.completions.create(params);
const response = await chatService.chat.completions.create(params, { maxRetries: 0 });
const data = { choices: response.choices };
if (delay) {
await wait(delay);
Expand Down
25 changes: 17 additions & 8 deletions apps/demos/Demos/Chat/AIAndChatbotIntegration/ReactJs/useApi.js
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,15 @@ const dataItemToMessage = (item) => ({
content: item.text,
});
const getMessageHistory = () => [...dataSource.items()].map(dataItemToMessage);
const getErrorMessage = (err) => {
if (typeof err === 'object' && err !== null) {
const e = err;
if (typeof e.error?.message === 'string') return e.error.message;
if (typeof e.message === 'string') return e.message;
}
if (typeof err === 'string') return err;
return 'Unknown error';
};
export const useApi = () => {
const [alerts, setAlerts] = useState([]);
const insertMessage = useCallback((data) => {
Expand All @@ -44,10 +53,10 @@ export const useApi = () => {
},
]);
}, []);
const alertLimitReached = useCallback(() => {
const alertError = useCallback((message) => {
setAlerts([
{
message: 'Request limit reached, try again in a minute.',
message,
},
]);
setTimeout(() => {
Expand All @@ -65,11 +74,11 @@ export const useApi = () => {
author: assistant,
text: aiResponse,
});
} catch {
alertLimitReached();
} catch (err) {
alertError(getErrorMessage(err));
}
},
[alertLimitReached, insertMessage],
[alertError, insertMessage],
);
const regenerateLastAIResponse = useCallback(async () => {
const messageHistory = getMessageHistory();
Expand All @@ -79,11 +88,11 @@ export const useApi = () => {
if (typeof aiResponse === 'string') {
updateLastMessageContent(aiResponse);
}
} catch {
} catch (err) {
updateLastMessageContent(messageHistory.at(-1)?.content);
alertLimitReached();
alertError(getErrorMessage(err));
}
}, [alertLimitReached, updateLastMessageContent]);
}, [alertError, updateLastMessageContent]);
return {
alerts,
insertMessage,
Expand Down
23 changes: 16 additions & 7 deletions apps/demos/Demos/Chat/AIAndChatbotIntegration/Vue/App.vue
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,16 @@ function renderAssistantMessage(text: string): void {
dataSource.store().push([{ type: 'insert', data: message }]);
}

function getErrorMessage(err: unknown): string {
if (typeof err === 'object' && err !== null) {
const e = err as { error?: { message?: unknown }; message?: unknown };
if (typeof e.error?.message === 'string') return e.error.message;
if (typeof e.message === 'string') return e.message;
}
if (typeof err === 'string') return err;
return 'Unknown error';
}

async function processMessageSending(
message: DxChatTypes.TextMessage,
event: Events.EventObject | undefined,
Expand All @@ -125,18 +135,18 @@ async function processMessageSending(
messages.push({ role: 'assistant', content: aiResponse });
renderAssistantMessage(aiResponse);
}, 200);
} catch {
} catch (err: unknown) {
typingUsers.value = [];
messages.pop();
alertLimitReached();
alertError(getErrorMessage(err));
} finally {
toggleDisabledState(false, event);
}
}

function alertLimitReached(): void {
function alertError(message: string): void {
alerts.value = [{
message: 'Request limit reached, try again in a minute.',
message,
}];

setTimeout(() => {
Expand All @@ -156,12 +166,11 @@ async function regenerate(): Promise<void> {
if (lastMessage?.content) {
lastMessage.content = aiResponse;
}
} catch {
} catch (err: unknown) {
if (lastMessage?.content) {
updateLastMessage(lastMessage.content);
}

alertLimitReached();
alertError(getErrorMessage(err));
} finally {
toggleDisabledState(false);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ export async function getAIResponse(messages: AIMessage[]): Promise<AIResponse>
temperature: 0.7,
};

const response = await chatService.chat.completions.create(params as any);
const response = await chatService.chat.completions.create(params as any, { maxRetries: 0 });
const data = { choices: response.choices };

return data.choices[0].message?.content || '';
Expand Down
22 changes: 15 additions & 7 deletions apps/demos/Demos/Chat/AIAndChatbotIntegration/jQuery/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -26,16 +26,16 @@ $(() => {
temperature: 0.7,
};

const response = await chatService.chat.completions.create(params);
const response = await chatService.chat.completions.create(params, { maxRetries: 0 });
const data = { choices: response.choices };

return data.choices[0].message?.content;
}

function alertLimitReached() {
function alertError(message) {
instance.option({
alerts: [{
message: 'Request limit reached, try again in a minute.',
message,
}],
});

Expand Down Expand Up @@ -70,10 +70,14 @@ $(() => {

renderAssistantMessage(aiResponse);
}, 200);
} catch {
} catch (err) {
instance.option({ typingUsers: [] });
messages.pop();
alertLimitReached();
const errorMessage =
err.error?.message ??

@dmlvr dmlvr Sep 9, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

let's move it to getErrorMessage for consistency of demos and reuse it in line 96

err.message ??
'Unknown error';
alertError(errorMessage);
} finally {
toggleDisabledState(false, event);
}
Expand All @@ -87,9 +91,13 @@ $(() => {

updateLastMessage(aiResponse);
messages.at(-1).content = aiResponse;
} catch {
} catch (err) {
updateLastMessage(messages.at(-1).content);
alertLimitReached();
const errorMessage =
err.error?.message ??
err.message ??
'Unknown error';
alertError(errorMessage);
} finally {
toggleDisabledState(false);
}
Expand Down