Skip to content

Commit d7ce9a5

Browse files
authored
feat: add generating state management to chat process (#655)
Signed-off-by: Bob Du <i@bobdu.cc>
1 parent 3f075bc commit d7ce9a5

File tree

6 files changed

+36
-2
lines changed

6 files changed

+36
-2
lines changed

service/src/chatgpt/index.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,11 @@ search result: <search_result>${searchResultContent}</search_result>`,
237237
if (!hasSearchResult && key.keyModel !== 'ResponsesAPI')
238238
(messages as OpenAI.Chat.ChatCompletionMessageParam[])[0].content = systemMessage
239239

240+
// Send generating status before starting to generate response
241+
process?.({
242+
generating: true,
243+
})
244+
240245
// Choose API by key model
241246
// ResponsesAPI branch (OpenAI Responses API)
242247
if (key.keyModel === 'ResponsesAPI') {

service/src/chatgpt/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ export interface ChatMessage {
1414
export interface ResponseChunk {
1515
id?: string
1616
searching?: boolean
17+
generating?: boolean
1718
searchQuery?: string
1819
searchResults?: SearchResult[]
1920
searchUsageTime?: number

service/src/routes/chat.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -302,6 +302,9 @@ router.post('/chat-process', [auth, limiter], async (req, res) => {
302302
if (chunk.searching !== undefined) {
303303
sendSSEData('searching', { searching: chunk.searching })
304304
}
305+
if (chunk.generating !== undefined) {
306+
sendSSEData('generating', { generating: chunk.generating })
307+
}
305308
if (chunk.searchQuery) {
306309
sendSSEData('search_query', { searchQuery: chunk.searchQuery })
307310
}

src/api/index.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ interface SSEEventHandlers {
2121
onMessage?: (data: any) => void
2222
onDelta?: (delta: { reasoning?: string, text?: string }) => void
2323
onSearching?: (data: { searching: boolean }) => void
24+
onGenerating?: (data: { generating: boolean }) => void
2425
onSearchQuery?: (data: { searchQuery: string }) => void
2526
onSearchResults?: (data: { searchResults: any[], searchUsageTime: number }) => void
2627
onComplete?: (data: any) => void
@@ -91,6 +92,9 @@ export function fetchChatAPIProcessSSE(
9192
else if (jsonData.searching !== undefined) {
9293
handlers.onSearching?.(jsonData)
9394
}
95+
else if (jsonData.generating !== undefined) {
96+
handlers.onGenerating?.(jsonData)
97+
}
9498
else if (jsonData.searchQuery) {
9599
handlers.onSearchQuery?.(jsonData)
96100
}

src/views/chat/components/Message/Text.vue

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,11 @@ const wrapClass = computed(() => {
5454
5555
const text = computed(() => {
5656
const value = props.text ?? ''
57-
if (!props.asRawText)
58-
return mdi.render(value)
57+
if (!props.asRawText) {
58+
const rendered = mdi.render(value)
59+
// If markdown is empty, render a p tag to ensure cursor can be displayed
60+
return rendered.trim() === '' ? '<p></p>' : rendered
61+
}
5962
return value
6063
})
6164

src/views/chat/index.vue

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,15 @@ async function onConversation() {
157157
},
158158
)
159159
},
160+
onGenerating: (data) => {
161+
chatStore.updateChatMessage(
162+
currentChatRoom.value!.roomId,
163+
dataSources.value.length - 1,
164+
{
165+
loading: data.generating,
166+
},
167+
)
168+
},
160169
onSearchQuery: (data) => {
161170
searchQuery = data.searchQuery
162171
searching = false
@@ -409,6 +418,15 @@ async function onRegenerate(index: number) {
409418
},
410419
)
411420
},
421+
onGenerating: (data) => {
422+
updateChatSome(
423+
currentChatRoom.value!.roomId,
424+
index,
425+
{
426+
loading: data.generating,
427+
},
428+
)
429+
},
412430
onSearchQuery: (data) => {
413431
searchQuery = data.searchQuery
414432
searching = false

0 commit comments

Comments
 (0)