@@ -7,6 +7,7 @@ export const AiChatBackendDemo: React.FC = () => {
77 const [ input , setInput ] = React . useState ( '' ) ;
88 const [ loading , setLoading ] = React . useState ( false ) ;
99 const [ error , setError ] = React . useState ( '' ) ;
10+ const [ stream , setStream ] = React . useState ( true ) ;
1011 const abortRef = React . useRef < AbortController | null > ( null ) ;
1112
1213 const onSend = async ( ) => {
@@ -21,11 +22,12 @@ export const AiChatBackendDemo: React.FC = () => {
2122 const assistantDraft : ChatMessage = { role : 'assistant' , content : '' } ;
2223 setMessages ( prev => [ ...prev , assistantDraft ] ) ;
2324 try {
24- await callBackendAi ( {
25+ const result = await callBackendAi ( {
2526 model,
2627 messages : nextMessages ,
2728 signal : controller . signal ,
28- onChunk : ( m : { role : 'assistant' ; content : string ; reasoning_content : string ; timestamp : string } ) => {
29+ stream,
30+ onChunk : ( m : { role : 'assistant' ; content : string ; reasoning_content : string ; timestamp : string } ) => {
2931 assistantDraft . content = m . content ;
3032 setMessages ( prev => {
3133 const copy = [ ...prev ] ;
@@ -34,6 +36,13 @@ export const AiChatBackendDemo: React.FC = () => {
3436 } ) ;
3537 }
3638 } ) ;
39+ if ( ! stream ) {
40+ setMessages ( prev => {
41+ const copy = [ ...prev ] ;
42+ copy [ copy . length - 1 ] = { role : 'assistant' , content : result . content } ;
43+ return copy ;
44+ } ) ;
45+ }
3746 } catch ( e ) {
3847 setError ( e instanceof Error ? e . message : '调用失败' ) ;
3948 } finally {
@@ -51,6 +60,10 @@ export const AiChatBackendDemo: React.FC = () => {
5160 < h2 className = "text-base sm:text-lg font-semibold text-gray-900" > AI 后端代理演示</ h2 >
5261 < div className = "grid grid-cols-1 sm:grid-cols-3 gap-3" >
5362 < input className = "px-3 py-2 border rounded col-span-1 sm:col-span-1" placeholder = "Model" value = { model } onChange = { ( e ) => setModel ( e . target . value ) } />
63+ < label className = "flex items-center gap-2 text-sm col-span-1" >
64+ < input type = "checkbox" checked = { stream } onChange = { ( e ) => setStream ( e . target . checked ) } />
65+ < span > 流式</ span >
66+ </ label >
5467 </ div >
5568 < div className = "h-64 border rounded p-3 overflow-auto bg-gray-50" >
5669 { messages . map ( ( m , i ) => (
0 commit comments