From 4175600aa60bfb8db2885c9c08dab88398ff1005 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?marker=20dao=20=C2=AE?= Date: Tue, 26 Nov 2024 14:56:08 +0100 Subject: [PATCH] Chat: AI Integration jQuery demo --- .../AIAndChatbotIntegration/description.md | 1 + .../AIAndChatbotIntegration/jQuery/data.js | 12 ++ .../AIAndChatbotIntegration/jQuery/index.html | 20 ++ .../AIAndChatbotIntegration/jQuery/index.js | 203 ++++++++++++++++++ .../AIAndChatbotIntegration/jQuery/styles.css | 60 ++++++ apps/demos/menuMeta.json | 13 ++ ...ChatbotIntegration (fluent.blue.light).png | Bin 0 -> 19271 bytes ...atbotIntegration (material.blue.light).png | Bin 0 -> 19932 bytes .../etalons/Chat-AIAndChatbotIntegration.png | Bin 0 -> 17224 bytes 9 files changed, 309 insertions(+) create mode 100644 apps/demos/Demos/Chat/AIAndChatbotIntegration/description.md create mode 100644 apps/demos/Demos/Chat/AIAndChatbotIntegration/jQuery/data.js create mode 100644 apps/demos/Demos/Chat/AIAndChatbotIntegration/jQuery/index.html create mode 100644 apps/demos/Demos/Chat/AIAndChatbotIntegration/jQuery/index.js create mode 100644 apps/demos/Demos/Chat/AIAndChatbotIntegration/jQuery/styles.css create mode 100644 apps/demos/testing/etalons/Chat-AIAndChatbotIntegration (fluent.blue.light).png create mode 100644 apps/demos/testing/etalons/Chat-AIAndChatbotIntegration (material.blue.light).png create mode 100644 apps/demos/testing/etalons/Chat-AIAndChatbotIntegration.png diff --git a/apps/demos/Demos/Chat/AIAndChatbotIntegration/description.md b/apps/demos/Demos/Chat/AIAndChatbotIntegration/description.md new file mode 100644 index 00000000000..67c1bba41e2 --- /dev/null +++ b/apps/demos/Demos/Chat/AIAndChatbotIntegration/description.md @@ -0,0 +1 @@ +Chat is an interactive interface that allows users to send and receive messages in real time. diff --git a/apps/demos/Demos/Chat/AIAndChatbotIntegration/jQuery/data.js b/apps/demos/Demos/Chat/AIAndChatbotIntegration/jQuery/data.js new file mode 100644 index 00000000000..ca66557ff1e --- /dev/null +++ b/apps/demos/Demos/Chat/AIAndChatbotIntegration/jQuery/data.js @@ -0,0 +1,12 @@ +const deployment = 'gpt-4o-mini'; +const apiVersion = '2024-02-01'; +const endpoint = 'https://public-api.devexpress.com/demo-openai'; +const apiKey = 'DEMO'; +const REGENERATION_TEXT = 'Regeneration...'; +const user = { + id: 'user', +}; +const assistant = { + id: 'assistant', + name: 'Virtual Assistant', +}; diff --git a/apps/demos/Demos/Chat/AIAndChatbotIntegration/jQuery/index.html b/apps/demos/Demos/Chat/AIAndChatbotIntegration/jQuery/index.html new file mode 100644 index 00000000000..ad7bbbc745a --- /dev/null +++ b/apps/demos/Demos/Chat/AIAndChatbotIntegration/jQuery/index.html @@ -0,0 +1,20 @@ + + + + DevExtreme Demo + + + + + + + + + + + +
+
+
+ + diff --git a/apps/demos/Demos/Chat/AIAndChatbotIntegration/jQuery/index.js b/apps/demos/Demos/Chat/AIAndChatbotIntegration/jQuery/index.js new file mode 100644 index 00000000000..19e7c0d4019 --- /dev/null +++ b/apps/demos/Demos/Chat/AIAndChatbotIntegration/jQuery/index.js @@ -0,0 +1,203 @@ +import { AzureOpenAI } from 'https://esm.sh/openai'; +import { unified } from 'https://esm.sh/unified@11?bundle'; +import remarkParse from 'https://esm.sh/remark-parse@11?bundle'; +import remarkRehype from 'https://esm.sh/remark-rehype@11?bundle'; +import rehypeStringify from 'https://esm.sh/rehype-stringify@10?bundle'; + +$(() => { + const store = []; + let messages = []; + + DevExpress.localization.loadMessages({ + 'en': { + 'dxChat-emptyListMessage': 'Chat is Empty', + 'dxChat-emptyListPrompt': 'AI Assistant is ready to answer your questions.', + 'dxChat-textareaPlaceholder': 'Ask AI Assistant...', + }, + }); + + const chatService = new AzureOpenAI({ + dangerouslyAllowBrowser: true, + deployment, + endpoint, + apiVersion, + apiKey, + }); + + async function getAIResponse(messages) { + const params = { + messages: messages, + max_tokens: 1000, + temperature: 0.7, + }; + + const responseAzure = await chatService.chat.completions.create(params); + const data = { choices: responseAzure.choices }; + + return data.choices[0].message?.content; + }; + + function alertLimitReached() { + instance.option({ + alerts: [{ + message: 'Request limit reached, try again in a minute.', + }], + }); + + setTimeout(() => { + instance.option({ alerts: [] }); + }, 10000); + }; + + async function processMessageSending() { + instance.option({ typingUsers: [assistant] }); + + try { + const aiResponse = await getAIResponse(messages); + + setTimeout(() => { + instance.option({ typingUsers: [] }); + + messages.push({ role: 'assistant', content: aiResponse }); + + renderMessage(aiResponse); + }, 200); + } catch { + instance.option({ typingUsers: [] }); + alertLimitReached(); + } + }; + + async function regenerate() { + try { + const aiResponse = await getAIResponse(messages.slice(0, -1)); + + updateLastMessage(aiResponse); + messages.at(-1).content = aiResponse; + } catch { + updateLastMessage(messages.at(-1).content); + alertLimitReached(); + } + }; + + function renderMessage(text) { + const message = { + id: Date.now(), + timestamp: new Date(), + author: assistant, + text, + }; + + customStore.push([{ type: 'insert', data: message }]); + }; + + function updateLastMessage(text) { + const { items } = instance.option(); + const lastMessage = items.at(-1); + const data = { + text: text ?? REGENERATION_TEXT, + }; + + customStore.push([{ + type: 'update', + key: lastMessage.id, + data, + }]); + }; + + function convertToHtml(value) { + const result = unified() + .use(remarkParse) + .use(remarkRehype) + .use(rehypeStringify) + .processSync(value) + .toString(); + + return result; + }; + + const customStore = new DevExpress.data.CustomStore({ + key: 'id', + load: () => { + const d = $.Deferred(); + + setTimeout(function () { + d.resolve([...store]); + }); + + return d.promise(); + }, + insert: (message) => { + const d = $.Deferred(); + + setTimeout(function () { + store.push(message); + d.resolve(); + }); + + return d.promise(); + }, + }); + + const instance = $("#dx-ai-chat").dxChat({ + dataSource: customStore, + reloadOnChange: false, + showAvatar: false, + showDayHeaders: false, + user, + height: 710, + onMessageEntered: (e) => { + const { message } = e; + + customStore.push([{ type: 'insert', data: { id: Date.now(), ...message } }]); + messages.push({ role: 'user', content: message.text }); + + processMessageSending(); + }, + messageTemplate: (data, element) => { + const { message } = data; + + if (message.text === REGENERATION_TEXT) { + element.text(REGENERATION_TEXT); + return; + } + + const $textElement = $('
') + .addClass('dx-chat-messagebubble-text') + .html(convertToHtml(message.text)) + .appendTo(element); + + const $buttonContainer = $('
') + .addClass('dx-bubble-button-container'); + + $('
') + .dxButton({ + icon: 'copy', + stylingMode: 'text', + hint: 'Copy', + onClick: ({ component }) => { + navigator.clipboard.writeText($textElement.text()); + component.option({ icon: 'check' }); + setTimeout(() => { + component.option({ icon: 'copy' }); + }, 5000); + }, + }) + .appendTo($buttonContainer); + + $('
') + .dxButton({ + icon: 'refresh', + stylingMode: 'text', + hint: 'Regenerate', + onClick: () => { + updateLastMessage(); + regenerate(); + }, + }) + .appendTo($buttonContainer); + + $buttonContainer.appendTo(element); + }, + }).dxChat('instance'); +}); diff --git a/apps/demos/Demos/Chat/AIAndChatbotIntegration/jQuery/styles.css b/apps/demos/Demos/Chat/AIAndChatbotIntegration/jQuery/styles.css new file mode 100644 index 00000000000..4d6ace3854f --- /dev/null +++ b/apps/demos/Demos/Chat/AIAndChatbotIntegration/jQuery/styles.css @@ -0,0 +1,60 @@ +.demo-container { + display: flex; + justify-content: center; +} + +.dx-chat { + max-width: 900px; +} + +.dx-chat-messagelist-empty-image { + display: none; +} + +.dx-chat-messagelist-empty-message { + font-size: var(--dx-font-size-heading-5); +} + +.dx-chat-messagebubble-content, +.dx-chat-messagebubble-text { + display: flex; + flex-direction: column; +} + +.dx-bubble-button-container { + display: none; +} + +.dx-button { + display: inline-block; + color: var(--dx-color-icon); +} + +.dx-chat-messagegroup-alignment-start:last-child .dx-chat-messagebubble:last-child .dx-bubble-button-container { + display: flex; + gap: 4px; + margin-top: 8px; +} + +.dx-chat-messagebubble-content > div > p:first-child { + margin-top: 0; +} + +.dx-chat-messagebubble-content > div > p:last-child { + margin-bottom: 0; +} + +.dx-chat-messagebubble-content ol, +.dx-chat-messagebubble-content ul { + white-space: normal; +} + +.dx-chat-messagebubble-content h1, +.dx-chat-messagebubble-content h2, +.dx-chat-messagebubble-content h3, +.dx-chat-messagebubble-content h4, +.dx-chat-messagebubble-content h5, +.dx-chat-messagebubble-content h6 { + font-size: revert; + font-weight: revert; +} diff --git a/apps/demos/menuMeta.json b/apps/demos/menuMeta.json index d5bcf0617f8..5586b5df605 100644 --- a/apps/demos/menuMeta.json +++ b/apps/demos/menuMeta.json @@ -2076,6 +2076,19 @@ ] } ] + }, + { + "Name": "AI and Chatbot Integration", + "Equivalents": "AI, Chatbot, Assistant", + "Demos": [ + { + "Title": "AI and Chatbot Integration", + "Name": "AIAndChatbotIntegration", + "Widget": "Chat", + "DemoType": "Web", + "Badge": "New" + } + ] } ] }, diff --git a/apps/demos/testing/etalons/Chat-AIAndChatbotIntegration (fluent.blue.light).png b/apps/demos/testing/etalons/Chat-AIAndChatbotIntegration (fluent.blue.light).png new file mode 100644 index 0000000000000000000000000000000000000000..beca57f943aca8a4fef834d817555b62418e8722 GIT binary patch literal 19271 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 literal 0 HcmV?d00001 diff --git a/apps/demos/testing/etalons/Chat-AIAndChatbotIntegration.png b/apps/demos/testing/etalons/Chat-AIAndChatbotIntegration.png new file mode 100644 index 0000000000000000000000000000000000000000..1d9dcd6a8c2acec3d9b1ff5558145e63d12ed75e GIT binary patch literal 17224 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 literal 0 HcmV?d00001