Phase 2:抽出工具与策略层
按 P1-Pipecat Flows Agent化与记忆改造交接.md 的 Phase 2 完成。
legacy 路径行为不变,只是改为复用新工具层。
新增 app/agent/
- memory_policy.py:记忆写入/删除的裁决层。模型只提议,策略决定。
不依赖 LLM/网络/真实存储,可纯单元测试。
- 身份未确认 → 一律 reject,不碰私人记忆
- 模型传 owner_user_id/scope 等越权字段 → reject(不静默忽略)
- 只有用户明确说"记住/以后/别忘了/我的偏好是"才写 confirmed
- "记住我今天吃了香菜"这类一次性事件 → 降级 candidate
- 不采信模型自称的"用户明确要求"
- 模糊/多条删除 → needs_confirmation,不猜目标
- tools.py:工具 schema 与执行器,legacy 与 flows 共用。
- 身份由 ToolContext 注入,**不在工具参数里**
- 身份未确认时不暴露任何记忆工具(比暴露后拒绝更干净)
- 写入结果如实回报:candidate 明确告知"尚未生效",
删除如实返回"已删除/没有找到/需要确认",不把"请求已收到"说成"已做到"
- 工具失败转成给模型的文本,不拖垮本轮对话
- llm_service.py:Pipecat LLMService 工厂,固化 Phase 1 spike 的选型结论
(复用 DeepSeekLLMService;必须显式覆盖模型名为 deepseek-flash,
因为 Pipecat 默认的 deepseek-v4-flash 不存在)
改造 app/engine.py
- _execute_tool 改为委托 app/agent/tools.execute(),删除重复实现
- 本轮用户原话挂到实例上,供策略层判定语义等级
- 移除不再使用的 SearchError 导入
新增 app/tests/test_agent_tools.py:45 项断言,**不依赖 LLM/网络/SQLite**
(用 fake store)。覆盖交接文档 §十 的清单:越权参数、未确认身份、
明确记住 vs 推断、同 key 幂等、模糊删除、精确删除、跨用户隔离。
回归:test_agent_tools 45/45、test_memory 30/30、test_identity 19/19、
test_search 12/12、test_transport 4/4、test_profile_memory 22/22,无退化。
This commit is contained in:
@@ -0,0 +1,35 @@
|
||||
"""Agent 层:工具、记忆策略、Flows 装配。
|
||||
|
||||
Phase 2 起建立。**两条运行路径共用这一层**:
|
||||
|
||||
- legacy:`ConversationEngine` 的手写工具循环
|
||||
- flows:Pipecat Flows(Phase 3 接入,用 `AI_AGENT_RUNTIME` 切换)
|
||||
|
||||
分层意图:
|
||||
|
||||
tools.py 工具 schema 与执行器(身份由 ToolContext 注入)
|
||||
memory_policy.py 记忆写入/删除的裁决(模型只提议,策略决定)
|
||||
flows_runtime.py FlowManager 装配(Phase 3)
|
||||
|
||||
策略层是本层最重要的部分:交接文档要求
|
||||
"不要仅依赖'请不要误记'的 system prompt",
|
||||
所以这些判断必须是可测试的代码,而不是提示词里的请求。
|
||||
"""
|
||||
|
||||
from .memory_policy import (
|
||||
MemoryDecision,
|
||||
PolicyResult,
|
||||
decide_forget,
|
||||
decide_remember,
|
||||
)
|
||||
from .tools import (
|
||||
ToolContext,
|
||||
ToolOutcome,
|
||||
available_schemas,
|
||||
execute,
|
||||
)
|
||||
|
||||
__all__ = [
|
||||
"ToolContext", "ToolOutcome", "execute", "available_schemas",
|
||||
"MemoryDecision", "PolicyResult", "decide_remember", "decide_forget",
|
||||
]
|
||||
Reference in New Issue
Block a user