| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 |
- # utils/streaming.py
- """流式输出工具函数"""
- import sys
- from typing import List
- from hello_agents import HelloAgentsLLM
- def should_stream(streaming: bool = None) -> bool:
- """
- 判断是否应该使用流式输出
- Args:
- streaming: 手动指定的流式输出设置(None = 自动检测)
- Returns:
- 是否使用流式输出
- """
- if streaming is None:
- # 自动检测:交互式终端使用流式输出
- return sys.stdout.isatty()
- return streaming
- def stream_response(llm: HelloAgentsLLM, messages: List[dict], silent: bool = False) -> str:
- """
- 执行流式 LLM 调用并打印结果
- Args:
- llm: HelloAgentsLLM 实例
- messages: LLM 消息列表
- silent: 是否静默模式(不打印输出)
- Returns:
- 完整的响应文本
- """
- full_response = ""
- previous_length = 0
- try:
- for chunk in llm.stream_invoke(messages):
- # chunk 是累积式的,只打印新增部分
- if len(chunk) > previous_length:
- new_content = chunk[previous_length:]
- if not silent:
- print(new_content, end='', flush=True)
- previous_length = len(chunk)
- # 保存完整响应
- full_response = chunk
- if not silent:
- print() # 换行
- return full_response
- except Exception as e:
- # 如果流式输出失败,降级到普通输出
- if not silent:
- print(f"\n[流式输出失败,使用普通输出: {e}]")
- return llm.invoke(messages)
|