Skip to content

Commit a5a491c

Browse files
Zedwagmarker dao ®
andauthored
Chat AI Demo: Add model to params, fix import in Vue demo
Co-authored-by: marker dao ® <[email protected]>
1 parent f268b71 commit a5a491c

File tree

9 files changed

+76
-117
lines changed

9 files changed

+76
-117
lines changed

apps/demos/Demos/Chat/AIAndChatbotIntegration/Angular/app/app.service.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@ export class AppService {
105105
async getAIResponse(messages) {
106106
const params = {
107107
messages,
108+
model: this.AzureOpenAIConfig.deployment,
108109
max_tokens: 1000,
109110
temperature: 0.7,
110111
};

apps/demos/Demos/Chat/AIAndChatbotIntegration/React/App.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ const chatService = new AzureOpenAI(AzureOpenAIConfig);
3131
async function getAIResponse(messages) {
3232
const params = {
3333
messages,
34+
model: AzureOpenAIConfig.deployment,
3435
max_tokens: 1000,
3536
temperature: 0.7,
3637
};

apps/demos/Demos/Chat/AIAndChatbotIntegration/ReactJs/App.js

Lines changed: 27 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -4,122 +4,103 @@ import { AzureOpenAI } from 'openai';
44
import CustomStore from 'devextreme/data/custom_store';
55
import DataSource from 'devextreme/data/data_source';
66
import { loadMessages } from 'devextreme/localization';
7-
import {
7+
import {
88
user,
99
assistant,
1010
AzureOpenAIConfig,
1111
REGENERATION_TEXT,
1212
CHAT_DISABLED_CLASS,
13-
ALERT_TIMEOUT
13+
ALERT_TIMEOUT,
1414
} from './data.js';
1515
import Message from './Message.js';
1616

1717
const store = [];
1818
const messages = [];
19-
2019
loadMessages({
2120
en: {
2221
'dxChat-emptyListMessage': 'Chat is Empty',
2322
'dxChat-emptyListPrompt': 'AI Assistant is ready to answer your questions.',
2423
'dxChat-textareaPlaceholder': 'Ask AI Assistant...',
2524
},
2625
});
27-
2826
const chatService = new AzureOpenAI(AzureOpenAIConfig);
29-
3027
async function getAIResponse(messages) {
3128
const params = {
3229
messages,
30+
model: AzureOpenAIConfig.deployment,
3331
max_tokens: 1000,
3432
temperature: 0.7,
3533
};
36-
3734
const response = await chatService.chat.completions.create(params);
3835
const data = { choices: response.choices };
39-
4036
return data.choices[0].message?.content;
4137
}
42-
4338
function updateLastMessage(text = REGENERATION_TEXT) {
4439
const items = dataSource.items();
4540
const lastMessage = items.at(-1);
46-
47-
dataSource.store().push([{
48-
type: 'update',
49-
key: lastMessage.id,
50-
data: { text },
51-
}]);
41+
dataSource.store().push([
42+
{
43+
type: 'update',
44+
key: lastMessage.id,
45+
data: { text },
46+
},
47+
]);
5248
}
53-
5449
function renderAssistantMessage(text) {
5550
const message = {
5651
id: Date.now(),
5752
timestamp: new Date(),
5853
author: assistant,
5954
text,
6055
};
61-
6256
dataSource.store().push([{ type: 'insert', data: message }]);
6357
}
64-
6558
const customStore = new CustomStore({
6659
key: 'id',
67-
load: () => {
68-
return new Promise((resolve) => {
69-
setTimeout(() => {
70-
resolve([...store]);
71-
}, 0);
72-
});
73-
},
74-
insert: (message) => {
75-
return new Promise((resolve) => {
76-
setTimeout(() => {
77-
store.push(message);
78-
resolve(message);
79-
});
60+
load: () => new Promise((resolve) => {
61+
setTimeout(() => {
62+
resolve([...store]);
63+
}, 0);
64+
}),
65+
insert: (message) => new Promise((resolve) => {
66+
setTimeout(() => {
67+
store.push(message);
68+
resolve(message);
8069
});
81-
},
70+
}),
8271
});
83-
8472
const dataSource = new DataSource({
8573
store: customStore,
8674
paginate: false,
87-
})
88-
75+
});
8976
export default function App() {
9077
const [alerts, setAlerts] = useState([]);
9178
const [typingUsers, setTypingUsers] = useState([]);
9279
const [classList, setClassList] = useState('');
93-
9480
function alertLimitReached() {
95-
setAlerts([{
96-
message: 'Request limit reached, try again in a minute.'
97-
}]);
98-
81+
setAlerts([
82+
{
83+
message: 'Request limit reached, try again in a minute.',
84+
},
85+
]);
9986
setTimeout(() => {
10087
setAlerts([]);
10188
}, ALERT_TIMEOUT);
10289
}
103-
10490
function toggleDisabledState(disabled, event = undefined) {
10591
setClassList(disabled ? CHAT_DISABLED_CLASS : '');
106-
10792
if (disabled) {
10893
event?.target.blur();
10994
} else {
11095
event?.target.focus();
11196
}
112-
};
113-
97+
}
11498
async function processMessageSending(message, event) {
11599
toggleDisabledState(true, event);
116-
117100
messages.push({ role: 'user', content: message.text });
118101
setTypingUsers([assistant]);
119-
120102
try {
121103
const aiResponse = await getAIResponse(messages);
122-
123104
setTimeout(() => {
124105
setTypingUsers([]);
125106
messages.push({ role: 'assistant', content: aiResponse });
@@ -133,13 +114,10 @@ export default function App() {
133114
toggleDisabledState(false, event);
134115
}
135116
}
136-
137117
async function regenerate() {
138118
toggleDisabledState(true);
139-
140119
try {
141120
const aiResponse = await getAIResponse(messages.slice(0, -1));
142-
143121
updateLastMessage(aiResponse);
144122
messages.at(-1).content = aiResponse;
145123
} catch {
@@ -149,20 +127,16 @@ export default function App() {
149127
toggleDisabledState(false);
150128
}
151129
}
152-
153130
function onMessageEntered({ message, event }) {
154131
dataSource.store().push([{ type: 'insert', data: { id: Date.now(), ...message } }]);
155-
156132
if (!alerts.length) {
157133
processMessageSending(message, event);
158134
}
159135
}
160-
161136
function onRegenerateButtonClick() {
162137
updateLastMessage();
163138
regenerate();
164139
}
165-
166140
return (
167141
<Chat
168142
className={classList}

apps/demos/Demos/Chat/AIAndChatbotIntegration/ReactJs/Message.js

Lines changed: 39 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -5,59 +5,49 @@ import remarkParse from 'remark-parse';
55
import remarkRehype from 'remark-rehype';
66
import rehypeStringify from 'rehype-stringify';
77
import HTMLReactParser from 'html-react-parser';
8-
98
import { REGENERATION_TEXT } from './data.js';
109

1110
function convertToHtml(value) {
12-
const result = unified()
13-
.use(remarkParse)
14-
.use(remarkRehype)
15-
.use(rehypeStringify)
16-
.processSync(value)
17-
.toString();
18-
19-
return result;
11+
const result = unified()
12+
.use(remarkParse)
13+
.use(remarkRehype)
14+
.use(rehypeStringify)
15+
.processSync(value)
16+
.toString();
17+
return result;
2018
}
21-
2219
function Message({ message }, onRegenerateButtonClick) {
23-
const [icon, setIcon] = useState('copy');
24-
25-
if (message.text === REGENERATION_TEXT) {
26-
return <span>{REGENERATION_TEXT}</span>;
27-
}
28-
29-
function onCopyButtonClick() {
30-
navigator.clipboard?.writeText(message.text);
31-
setIcon('check');
32-
33-
setTimeout(() => {
34-
setIcon('copy');
35-
}, 2500);
36-
}
37-
38-
return (
39-
<React.Fragment>
40-
<div
41-
className='dx-chat-messagebubble-text'
42-
>
43-
{HTMLReactParser(convertToHtml(message.text))}
44-
</div>
45-
<div className='dx-bubble-button-container'>
46-
<Button
47-
icon={icon}
48-
stylingMode='text'
49-
hint='Copy'
50-
onClick={onCopyButtonClick}
51-
/>
52-
<Button
53-
icon='refresh'
54-
stylingMode='text'
55-
hint='Regenerate'
56-
onClick={onRegenerateButtonClick}
57-
/>
58-
</div>
59-
</React.Fragment>
60-
)
20+
const [icon, setIcon] = useState('copy');
21+
if (message.text === REGENERATION_TEXT) {
22+
return <span>{REGENERATION_TEXT}</span>;
23+
}
24+
function onCopyButtonClick() {
25+
navigator.clipboard?.writeText(message.text);
26+
setIcon('check');
27+
setTimeout(() => {
28+
setIcon('copy');
29+
}, 2500);
30+
}
31+
return (
32+
<React.Fragment>
33+
<div className="dx-chat-messagebubble-text">
34+
{HTMLReactParser(convertToHtml(message.text))}
35+
</div>
36+
<div className="dx-bubble-button-container">
37+
<Button
38+
icon={icon}
39+
stylingMode="text"
40+
hint="Copy"
41+
onClick={onCopyButtonClick}
42+
/>
43+
<Button
44+
icon="refresh"
45+
stylingMode="text"
46+
hint="Regenerate"
47+
onClick={onRegenerateButtonClick}
48+
/>
49+
</div>
50+
</React.Fragment>
51+
);
6152
}
62-
6353
export default Message;

apps/demos/Demos/Chat/AIAndChatbotIntegration/ReactJs/data.js

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,13 @@ export const AzureOpenAIConfig = {
44
apiVersion: '2024-02-01',
55
endpoint: 'https://public-api.devexpress.com/demo-openai',
66
apiKey: 'DEMO',
7-
}
8-
7+
};
98
export const REGENERATION_TEXT = 'Regeneration...';
109
export const CHAT_DISABLED_CLASS = 'dx-chat-disabled';
1110
export const ALERT_TIMEOUT = 1000 * 60;
12-
1311
export const user = {
1412
id: 'user',
1513
};
16-
1714
export const assistant = {
1815
id: 'assistant',
1916
name: 'Virtual Assistant',
Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,5 @@
11
import React from 'react';
22
import ReactDOM from 'react-dom';
3-
43
import App from './App.js';
54

6-
ReactDOM.render(
7-
<App />,
8-
document.getElementById('app'),
9-
);
5+
ReactDOM.render(<App />, document.getElementById('app'));

apps/demos/Demos/Chat/AIAndChatbotIntegration/Vue/App.vue

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,9 @@ import { ref, onBeforeMount } from 'vue';
5353
import DxChat from 'devextreme-vue/chat';
5454
import DxButton from 'devextreme-vue/button';
5555
import { loadMessages } from 'devextreme/localization';
56-
import { AzureOpenAI } from 'openai';
56+
import openai from 'openai';
5757
import {
5858
dictionary,
59-
store,
6059
messages,
6160
user,
6261
assistant,
@@ -67,7 +66,7 @@ import {
6766
ALERT_TIMEOUT,
6867
} from './data.ts';
6968
70-
const chatService = new AzureOpenAI(AzureOpenAIConfig);
69+
const chatService = new openai.AzureOpenAI(AzureOpenAIConfig);
7170
7271
const typingUsers = ref([]);
7372
const alerts = ref([]);
@@ -81,6 +80,7 @@ onBeforeMount(() => {
8180
async function getAIResponse(messages) {
8281
const params = {
8382
messages,
83+
model: AzureOpenAIConfig.deployment,
8484
max_tokens: 1000,
8585
temperature: 0.7,
8686
};
@@ -91,7 +91,7 @@ async function getAIResponse(messages) {
9191
return data.choices[0].message?.content;
9292
}
9393
94-
function toggleDisabledState(disabled, event) {
94+
function toggleDisabledState(disabled, event = undefined) {
9595
isDisabled.value = disabled;
9696
9797
if (disabled) {

apps/demos/Demos/Chat/AIAndChatbotIntegration/Vue/data.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,7 @@ export const CHAT_DISABLED_CLASS = 'dx-chat-disabled';
2626
export const ALERT_TIMEOUT = 1000 * 60;
2727

2828
export const user = {
29-
id: 'c94c0e76-fb49-4b9b-8f07-9f93ed93b4f3',
30-
name: 'John Doe',
29+
id: 'user',
3130
};
3231

3332
export const assistant = {

apps/demos/Demos/Chat/AIAndChatbotIntegration/jQuery/index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ $(() => {
2121
async function getAIResponse(messages) {
2222
const params = {
2323
messages,
24+
model: deployment,
2425
max_tokens: 1000,
2526
temperature: 0.7,
2627
};

0 commit comments

Comments
 (0)