4949
5050<script setup lang="ts">
5151import { ref , onBeforeMount } from ' vue' ;
52+ import { AzureOpenAI } from ' openai' ;
5253import DxChat , { type DxChatTypes } from ' devextreme-vue/chat' ;
5354import DxButton from ' devextreme-vue/button' ;
5455import { loadMessages } from ' devextreme-vue/common/core/localization' ;
55- import { AzureOpenAI } from ' openai' ;
56+ import { type Events } from ' devextreme-vue/common/core' ;
57+
5658import {
5759 dictionary ,
5860 messages ,
@@ -67,40 +69,40 @@ import {
6769
6870const chatService = new AzureOpenAI (AzureOpenAIConfig );
6971
70- const typingUsers = ref ([]);
71- const alerts = ref ([]);
72+ const typingUsers = ref <{ id : string , name : string }[]> ([]);
73+ const alerts = ref <{ message : string }[]> ([]);
7274const isDisabled = ref (false );
7375const copyButtonIcon = ref (' copy' );
7476
7577onBeforeMount (() => {
7678 loadMessages (dictionary );
7779});
7880
79- async function getAIResponse(messages ) {
80- const params = {
81+ async function getAIResponse(messages : DxChatTypes . Message []) : Promise < string > {
82+ const params: Record < string , any > = {
8183 messages ,
8284 model: AzureOpenAIConfig .deployment ,
8385 max_tokens: 1000 ,
8486 temperature: 0.7 ,
8587 };
8688
87- const response = await chatService .chat .completions .create (params );
89+ const response = await chatService .chat .completions .create (params as any );
8890 const data = { choices: response .choices };
8991
90- return data .choices [0 ].message ?.content ;
92+ return data .choices [0 ].message ?.content || ' ' ;
9193}
9294
93- function toggleDisabledState(disabled , event = undefined ) {
95+ function toggleDisabledState(disabled : boolean , event ? : Events . EventObject ) : void {
9496 isDisabled .value = disabled ;
9597
9698 if (disabled ) {
97- event ?.target .blur ();
99+ ( event ?.target as HTMLElement )? .blur ();
98100 } else {
99- event ?.target .focus ();
101+ ( event ?.target as HTMLElement )? .focus ();
100102 }
101103}
102104
103- function updateLastMessage(text = REGENERATION_TEXT ) {
105+ function updateLastMessage(text : string = REGENERATION_TEXT ): void {
104106 const items = dataSource .items ();
105107 const lastMessage = items .at (- 1 );
106108
@@ -111,7 +113,7 @@ function updateLastMessage(text = REGENERATION_TEXT) {
111113 }]);
112114}
113115
114- function renderAssistantMessage(text ) {
116+ function renderAssistantMessage(text : string ) : void {
115117 const message = {
116118 id: Date .now (),
117119 timestamp: new Date (),
@@ -122,7 +124,10 @@ function renderAssistantMessage(text) {
122124 dataSource .store ().push ([{ type: ' insert' , data: message }]);
123125}
124126
125- async function processMessageSending(message , event ) {
127+ async function processMessageSending(
128+ message : DxChatTypes .TextMessage ,
129+ event : Events .EventObject | undefined ,
130+ ): Promise <void > {
126131 toggleDisabledState (true , event );
127132
128133 messages .push ({ role: ' user' , content: message .text });
@@ -145,7 +150,7 @@ async function processMessageSending(message, event) {
145150 }
146151}
147152
148- function alertLimitReached() {
153+ function alertLimitReached(): void {
149154 alerts .value = [{
150155 message: ' Request limit reached, try again in a minute.' ,
151156 }];
@@ -155,31 +160,38 @@ function alertLimitReached() {
155160 }, ALERT_TIMEOUT );
156161}
157162
158- async function regenerate() {
163+ async function regenerate(): Promise < void > {
159164 toggleDisabledState (true );
165+ const lastMessage = messages .at (- 1 );
160166
161167 try {
162168 const aiResponse = await getAIResponse (messages .slice (0 , - 1 ));
163169
164170 updateLastMessage (aiResponse );
165- messages .at (- 1 ).content = aiResponse ;
171+
172+ if (lastMessage ?.content ) {
173+ lastMessage .content = aiResponse ;
174+ }
166175 } catch {
167- updateLastMessage (messages .at (- 1 ).content );
176+ if (lastMessage ?.content ) {
177+ updateLastMessage (lastMessage .content );
178+ }
179+
168180 alertLimitReached ();
169181 } finally {
170182 toggleDisabledState (false );
171183 }
172184}
173185
174- function onMessageEntered({ message , event }: DxChatTypes .MessageEnteredEvent ) {
186+ function onMessageEntered({ message , event }: DxChatTypes .MessageEnteredEvent ): void {
175187 dataSource .store ().push ([{ type: ' insert' , data: { id: Date .now (), ... message } }]);
176188
177189 if (! alerts .value .length ) {
178190 processMessageSending (message , event );
179191 }
180192}
181193
182- function onCopyButtonClick(message ) {
194+ function onCopyButtonClick(message : { text : string }) : void {
183195 navigator .clipboard ?.writeText (message .text );
184196 copyButtonIcon .value = ' check' ;
185197
@@ -188,7 +200,7 @@ function onCopyButtonClick(message) {
188200 }, 2500 );
189201}
190202
191- function onRegenerateButtonClick() {
203+ function onRegenerateButtonClick(): void {
192204 updateLastMessage ();
193205 regenerate ();
194206}
0 commit comments