3 个子智能体完成后,从「正在生成最终审查报告...」到 LLM 输出第一个 token 卡顿约 3 分钟。
summary_input 约 15,000 字符。
create_deep_agent() 编译 LangGraph 状态图未预热deepseek-v4-flash 🔥🔥🔥文件:.env
SUMMARY_MODEL=deepseek-v4-flash文件:agents/review_agent.py
_get_summary_model() 函数(约 25 行),从 .env 读取 SUMMARY_MODEL 配置,fallback 到 DEEPAGENT_MODELcreate_summary_agent()(第 410-430 行):model=_get_model() → model=_get_summary_model()逻辑:子智能体继续用 deepseek-v4-pro 保证分析质量,summary 用 flash 模型——汇总任务本质是格式化重组已有内容,flash 完全够用,TTFT 预计从 ~3min 降至 ~15-30s。
文件:main.py(_warmup_agents() 函数,第 41-56 行)
from agents.review_agent import get_form_review_agent, get_data_consistency_agent, get_calc_verification_agent, get_summary_agent_warmup_agents() 末尾依次调用 4 个 review agent 的 gettertry/except 包裹每个调用,单个失败不影响其他效果:消除首次请求 ~10-30s 的图编译开销。
文件:agents/review_agent.py
_compress_result(text: str, max_chars: int = 8000) -> str 函数(约 30 行)
max_chars,直接返回|---| 标记的行)→ 标题行(##/###)→ 列表项 → 正文...[已截断,完整内容见子智能体原始输出]summary_input 前(第 865 行之前),对每个 result 调用 _compress_result()效果:降低输入 token 数,进一步减少 prefill 耗时,同时保留核心结构化数据。
文件:agents/review_agent.py(stream_review() 函数,第 897-917 行附近)
summary_agent.astream() 调用前,创建一个心跳 asyncio.Task:
asyncio.Queue 发送 heartbeat 事件heartbeat 事件处理:yield _sse_event("progress", message="模型正在处理中(已等待 XX 秒)...", agent="system")效果:用户能看到系统仍在工作,消除"卡死"错觉。前端已有的 progress 事件处理可复用,无需改前端。
文件:.env
OPENAI_TIMEOUT=180(3 分钟超时)文件:agents/vent_agent.py(_get_model() 函数,第 100-135 行)
OPENAI_TIMEOUT 环境变量init_chat_model(..., timeout=timeout)文件:agents/review_agent.py(新增的 _get_summary_model())
timeout效果:防止异常情况下无限挂起。
| 文件 | 改动量 | 改动类型 |
|---|---|---|
.env |
+2 行 | 新增配置项 |
agents/vent_agent.py |
~5 行 | _get_model() 添加 timeout 参数 |
agents/review_agent.py |
~80 行 | 新增 _get_summary_model()、_compress_result()、心跳协程;修改 create_summary_agent() |
main.py |
~15 行 | _warmup_agents() 添加 review agent 预热 |