@@ -9,12 +9,13 @@ import WorkspaceSplitDivider from './WorkspaceSplitDivider'
99import {
1010 listSessions , createSession , getSession , deleteSession , forkSession , clearSessionContext ,
1111 setSessionContext , ephemeralAsk ,
12- sendSessionChat , getHealth , listAvailableModels , setSessionModel ,
12+ streamSessionChat , getHealth , listAvailableModels , setSessionModel ,
1313} from '../api/client'
1414import type {
1515 ChatDisplayMessage , EphemeralAskTurn , MessageSelection , SessionContextRef , SessionSelectionContextRef ,
1616 SessionMeta , AvailableModel ,
1717} from '../types/chat'
18+ import type { ChatLiveTrace } from '../types/chatProgress'
1819import { previewSelectionText } from '../utils/formatContextRefPreview'
1920import { innoTokens } from '../theme/tokens'
2021import { useBreakpoint , useSidebarPreference , useSidebarOverlayMode , useSidebarResizeSync } from '../hooks/useBreakpoint'
@@ -190,6 +191,7 @@ export default function ChatApp() {
190191 const [ contextRef , setContextRef ] = useState < SessionContextRef | null > ( null )
191192 const [ input , setInput ] = useState ( '' )
192193 const [ loading , setLoading ] = useState ( false )
194+ const [ liveTrace , setLiveTrace ] = useState < ChatLiveTrace | null > ( null )
193195 const [ error , setError ] = useState ( '' )
194196 const [ availableModels , setAvailableModels ] = useState < AvailableModel [ ] > ( [ ] )
195197 const [ sessionModel , setSessionModelState ] = useState < string | undefined > ( )
@@ -341,6 +343,7 @@ export default function ChatApp() {
341343
342344 setInput ( '' )
343345 setLoading ( true )
346+ setLiveTrace ( { steps : [ ] , thinkingLabel : '模型正在思考…' } )
344347 setError ( '' )
345348
346349 const optimistic : ChatDisplayMessage = {
@@ -350,11 +353,52 @@ export default function ChatApp() {
350353 }
351354 setMessages ( prev => [ ...prev , optimistic ] )
352355
356+ let resolvedSessionId = sessionId
357+
353358 try {
354- const result = await sendSessionChat ( sessionId , msg , sessionModel )
355- const sid = result . session_id && result . session_id !== sessionId ? result . session_id : sessionId
356- if ( result . session_id && result . session_id !== sessionId ) {
357- setActiveId ( result . session_id )
359+ await streamSessionChat ( sessionId , msg , ( event ) => {
360+ if ( event . type === 'thinking' ) {
361+ setLiveTrace ( prev => ( {
362+ steps : prev ?. steps ?? [ ] ,
363+ thinkingLabel : event . label ,
364+ thinkingSnippet : event . snippet ?? prev ?. thinkingSnippet ,
365+ } ) )
366+ return
367+ }
368+ if ( event . type === 'tool_start' ) {
369+ setLiveTrace ( prev => ( {
370+ thinkingLabel : prev ?. thinkingLabel ,
371+ thinkingSnippet : prev ?. thinkingSnippet ,
372+ steps : [ ...( prev ?. steps ?? [ ] ) , event . step ] ,
373+ } ) )
374+ return
375+ }
376+ if ( event . type === 'tool_done' ) {
377+ setLiveTrace ( prev => ( {
378+ thinkingLabel : prev ?. thinkingLabel ?? '模型正在整理结果…' ,
379+ thinkingSnippet : prev ?. thinkingSnippet ,
380+ steps : ( prev ?. steps ?? [ ] ) . map ( step =>
381+ step . id === event . step . id ? event . step : step ,
382+ ) ,
383+ } ) )
384+ return
385+ }
386+ if ( event . type === 'reply' ) {
387+ setLiveTrace ( prev => ( {
388+ steps : prev ?. steps ?? [ ] ,
389+ thinkingLabel : '正在生成回复…' ,
390+ thinkingSnippet : prev ?. thinkingSnippet ,
391+ } ) )
392+ return
393+ }
394+ if ( event . type === 'done' ) {
395+ resolvedSessionId = event . session_id || resolvedSessionId
396+ }
397+ } , sessionModel )
398+
399+ const sid = resolvedSessionId
400+ if ( sid !== sessionId ) {
401+ setActiveId ( sid )
358402 }
359403 const fresh = await getSession ( sid )
360404 setMessages ( fresh . messages )
@@ -373,6 +417,7 @@ export default function ChatApp() {
373417 setMessages ( prev => prev . slice ( 0 , - 1 ) )
374418 }
375419 } finally {
420+ setLiveTrace ( null )
376421 setLoading ( false )
377422 }
378423 }
@@ -609,6 +654,7 @@ export default function ChatApp() {
609654 contextRef = { contextRef }
610655 input = { input }
611656 loading = { loading }
657+ liveTrace = { liveTrace }
612658 error = { error }
613659 availableModels = { availableModels }
614660 sessionModel = { sessionModel }
0 commit comments