Zenith Wang commited on
Commit
b37d787
·
1 Parent(s): 765ca1b

Add support for delta.reasoning field to properly display CoT streaming

Browse files
Files changed (1) hide show
  1. app.py +50 -25
app.py CHANGED
@@ -207,36 +207,61 @@ def process_message(message, history, images, system_prompt, temperature, max_to
207
  in_reasoning = False
208
  reasoning_content = ""
209
  final_content = ""
 
210
 
211
  for chunk in response:
212
- if chunk.choices and chunk.choices[0].delta:
213
- delta_content = chunk.choices[0].delta.content
214
- if delta_content:
215
- full_response += delta_content
 
 
 
 
216
 
217
- # 检测reasoning标签
218
- if '<reasoning>' in full_response and not in_reasoning:
219
- in_reasoning = True
220
- parts = full_response.split('<reasoning>')
221
- if len(parts) > 1:
222
- reasoning_content = parts[1]
223
 
224
- if in_reasoning and '</reasoning>' in full_response:
225
- in_reasoning = False
226
- parts = full_response.split('</reasoning>')
227
- if len(parts) > 1:
228
- reasoning_content = parts[0].split('<reasoning>')[-1]
229
- final_content = parts[1]
230
- elif in_reasoning:
231
- reasoning_content = full_response.split('<reasoning>')[-1]
232
- elif '</reasoning>' in full_response:
233
- parts = full_response.split('</reasoning>')
234
- if len(parts) > 1:
235
- final_content = parts[1]
236
  else:
237
- # 没有reasoning标签的情况
238
- if '<reasoning>' not in full_response:
239
- final_content = full_response
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
240
 
241
  # 格式化显示
242
  if reasoning_content and final_content:
 
207
  in_reasoning = False
208
  reasoning_content = ""
209
  final_content = ""
210
+ has_reasoning_field = False
211
 
212
  for chunk in response:
213
+ if chunk.choices and chunk.choices[0]:
214
+ delta = chunk.choices[0].delta
215
+
216
+ # 优先检查 delta.reasoning 字段(Step-3 API 的 CoT 内容)
217
+ if hasattr(delta, 'reasoning') and delta.reasoning:
218
+ has_reasoning_field = True
219
+ reasoning_content += delta.reasoning
220
+ print(f"[DEBUG] CoT chunk: {delta.reasoning[:50] if len(delta.reasoning) > 50 else delta.reasoning}")
221
 
222
+ # 实时更新显示 CoT 内容
223
+ if final_content:
224
+ display_text = f"💭 **Chain of Thought:**\n\n{reasoning_content}\n\n---\n\n📝 **Answer:**\n\n{final_content}"
225
+ else:
226
+ display_text = f"💭 **Chain of Thought:**\n\n{reasoning_content}\n\n---\n\n📝 **Answer:**\n\n*Generating...*"
 
227
 
228
+ history[-1][1] = display_text
229
+ yield history
230
+
231
+ # 处理常规 content 字段
232
+ delta_content = delta.content if hasattr(delta, 'content') else None
233
+ if delta_content:
234
+ # 如果通过 reasoning 字段获取了 CoT,content 就是最终答案
235
+ if has_reasoning_field:
236
+ final_content += delta_content
237
+ full_response += delta_content
 
 
238
  else:
239
+ # 否则尝试解析 <reasoning> 标签
240
+ full_response += delta_content
241
+
242
+ # 检测reasoning标签
243
+ if '<reasoning>' in full_response and not in_reasoning:
244
+ in_reasoning = True
245
+ parts = full_response.split('<reasoning>')
246
+ if len(parts) > 1:
247
+ reasoning_content = parts[1]
248
+
249
+ if in_reasoning and '</reasoning>' in full_response:
250
+ in_reasoning = False
251
+ parts = full_response.split('</reasoning>')
252
+ if len(parts) > 1:
253
+ reasoning_content = parts[0].split('<reasoning>')[-1]
254
+ final_content = parts[1]
255
+ elif in_reasoning:
256
+ reasoning_content = full_response.split('<reasoning>')[-1]
257
+ elif '</reasoning>' in full_response:
258
+ parts = full_response.split('</reasoning>')
259
+ if len(parts) > 1:
260
+ final_content = parts[1]
261
+ else:
262
+ # 没有reasoning标签的情况
263
+ if '<reasoning>' not in full_response:
264
+ final_content = full_response
265
 
266
  # 格式化显示
267
  if reasoning_content and final_content: