Phase 1 spike:Pipecat Flows 兼容性验证,7 项全通过

按 P1-Pipecat Flows Agent化与记忆改造交接.md 的 Phase 1 要求,
只做独立 spike,不改生产入口。

新增
- p1/flows_spike.py:探索脚本,带请求体抓取与逐项诊断
- app/tests/test_flows_spike.py:断言版,复用探索脚本的检查项避免漂移

验证结果(9 个断言全过)
- DeepSeek 在 Flows 中流式输出中文(14–22 个 token 级分块)
- 工具调用参数聚合完整、无重复拼接;回灌后能出最终回答
- worker.cancel() 能立即终止 LLM 流
- role_message 生效(模型自称"桌面陪伴小助手")
- context 里只有一条 system 消息

三条最重要的结论
1. **不要装 pipecat-ai-flows**。Pipecat 1.10 内置 Flows(pipecat.flows),
   装了会报 _warn_if_standalone_flows_installed;且独立包 1.4.0 会把
   pipecat 从 1.10.0 降到 1.4.0。requirements.txt 已加说明。
2. **必须用 PipelineRunner().run(worker)**。直接 worker.run() 时 runner
   没挂上,工具执行失败并抛 "runner is not set; call attach() first",
   该异常被转成给 LLM 的通用错误串,handler 从不执行,默认日志看不到。
3. **await flow.initialize(node)**。它是协程但签名显示 -> None,
   漏 await 不报错,只是 role_message/task_messages/工具全部静默失效——
   极易误判成"框架不支持这些特性"。

另两条
- respond_immediately 默认 True,initialize 会立刻触发一轮回复,
  做归因测试时必须清空观察窗口,否则会归因错。
- role_message(走 system_instruction)与 task_messages 各产生一条
  system 消息,两者不要同时用;切回本地 vLLM 时会 400。

LLMService 选择:复用 Pipecat 的 DeepSeekLLMService。它自带
DeepSeekLLMAdapter 处理 reasoning_content 回传约束(我们 P0 踩过的坑),
thinking 默认 disabled,与既有结论一致。代价是失去本地 vLLM 降级
(Flows 要求 LLMService 实例,FallbackProvider 不能直接用;且当前
本机 vLLM 已停用,fallback 实际无可用目标)。

环境:NLTK punkt_tab 本地也需预装(服务器已有),spike 加了 fail-fast
检查与拷贝命令提示。
This commit is contained in:
ylhan
2026-09-16 13:13:39 +08:00
parent 20cfaa6ef7
commit c37a968548
4 changed files with 519 additions and 0 deletions
+20
View File
@@ -163,6 +163,26 @@ Pipecat 管传输、帧与 RTVI,自有 `ConversationEngine` 管会话语义。
9. Pipecat 会预热 NLTK `punkt_tab`;生产部署必须预装,不能在首个会话临时下载
10. `PipelineWorker` 自动发送 `StartFrame`,手工再发会造成重复启动帧
## Pipecat Flows 兼容性 spike(2026-09-16)
Phase 1 spike 已完成,7 项验证全通过。代码:`p1/flows_spike.py`(探索)+
`app/tests/test_flows_spike.py`(断言版)。完整结论见笔记库的
`P1-Flows兼容性Spike结论.md`。
**最重要的三条**:
1. **不要装 `pipecat-ai-flows`**。Pipecat 1.10 内置 Flows(`pipecat.flows`),
装独立包会报错提示卸载;且独立包 1.4.0 会把 pipecat 降到 1.4.0。
2. **用 `PipelineRunner().run(worker)`,不要直接 `worker.run()`**。
直接跑时 runner 没挂上,工具执行会失败,异常被转成一句通用的
"The function X failed and returned no result.",handler 从不执行。
3. **`await flow.initialize(node)`**。它是协程,但签名显示 `-> None` 看不出,
漏 await 不报错,只是 role_message/task_messages/工具全部静默失效。
另有两条:`respond_immediately` 默认 True(initialize 会立刻触发一轮回复,
做归因测试时要注意);`role_message` 与 `task_messages` 会**各产生一条
system 消息**,两者不要同时用(切回本地 vLLM 时会 400)。
## 踩过的坑
全部写在对应文件的注释里,这里只列索引,详见 `部署说明.md` §已知的坑: