1. 入口与路由
- HTTP:
POST /api/v1/test-case/check/consistency(在api.py里挂到prefix="/test-case/check")。 - 实现文件:
backend/app/api/v1/endpoints/check.py。 - 前端:
frontend/src/views/test-case/check/index.vue优先带?stream=true走 SSE 式流式;失败时再request.upload到同一路径(不传stream,相当于非流式)。
2. 三条执行路径(由查询参数决定)
| 条件 | 实际做的事 |
|---|---|
stream=true(页面主路径) |
StreamingResponse → _check_with_stream:AutoGen 的 AssistantAgent + DeepSeek 客户端,model_client_stream=True,把 chunk 打成 data: {...}\n\n 推给前端。 |
use_agent=true(前端默认不传,一般为 false) |
_check_with_agent:试图用 agent_factory.create_agent(AgentTypes.TEST_CASE_CHECKER) 创建 TestCaseCheckerAgent,并往 SingleThreadedAgentRuntime 上 register_agent。当前代码里 若运行时不存在 register_agent会直接降级 到下面的「旧方法」。 |
默认(stream=false 且 use_agent=false) |
_check_with_legacy_method:同样是 AssistantAgent + DeepSeek,on_messages 一次性拿完整回复再解析 JSON。 |
因此:日常从页面点「检查」时,主要是流式路径;兜底是非流式的「直接 LLM」路径。
TestCaseCheckerAgent 只有在显式 use_agent=true 且运行时支持 register_agent 时才会真正跑通;否则会在 check.py 里降级到 _check_with_legacy_method。
3. 用了哪个「智能体」
- 名义上的业务智能体:
TestCaseCheckerAgent(backend/app/agents/test_case/test_case_checker_agent.py),在工厂里注册为AgentTypes.TEST_CASE_CHECKER(app/agents/factory.py)。 - 实际承担推理的组件(流式 / 非流式主路径):都是 AutoGen
AssistantAgent,名字在代码里写死为"consistency_checker",并不是多智能体编排,而是 单助手 + 一次大模型调用。 TestCaseCheckerAgent内部:若被调用,会通过BaseAgent发进度/流式片段,核心对比仍是对get_deepseek_model_client()做create_stream,再本地拼 JSON 解析。
4. 调用了哪些模块(按数据流)
- 上传与解析(CPU 密集丢线程池):
app.utils.file_parser---parse_docx、parse_pdf、parse_xmind、extract_text_from_xmind。 - 消息模型(仅智能体路径):
TestCaseCheckRequest/TestCaseCheckResponse等 ---app.core.messages.test_case。 - 工厂(仅
use_agent路径):agent_factory---app.agents.factory;create_agent对非图类智能体默认会注入get_deepseek_model_client()。 - 流收集(仅
use_agent路径):StreamResponseCollector---app.core.agents.collector。 - 大模型:
get_deepseek_model_client---app.core.llms(基于autogen_ext.models.openai.OpenAIChatCompletionClient)。 - AutoGen:
AssistantAgent、TextMessage、CancellationToken;流式路径还用ModelClientStreamingChunkEvent;智能体路径用SingleThreadedAgentRuntime、TopicId、TopicTypes等。
5. 用的是什么大模型
- 提供商 / 协议:DeepSeek 的 OpenAI 兼容接口(
DEEPSEEK_BASE_URL,默认https://api.deepseek.com/v1)。 - 模型名:配置为
deepseek-chat(见get_deepseek_model_client)。 - 密钥:仅
DEEPSEEK_API_KEY(与你在项目里「只用 DeepSeek」的设定一致)。 - 超时:用例检查里常量
CHECK_LLM_TIMEOUT = 420秒(7 分钟) 传给get_deepseek_model_client;智能体路径若走通,还有asyncio.wait_for(..., 60)等待最终回调的上限(与 LLM 7 分钟是不同层)。
6. 内容截断
- 流式 / legacy:
CHECK_CONTENT_LIMIT = 35000字符,PRD 与用例各截断后再拼进 prompt。 TestCaseCheckerAgent:内部max_content_length为 50000(若智能体路径生效,截断策略与上面两条略有不同)。
架构图

"真实生效"的主链路是 前端 stream=true → 后端 _check_with_stream → AssistantAgent → DeepSeek(deepseek-chat) → SSE 回前端。