diff --git a/README.md b/README.md index a2fec8e..eab2f76 100644 --- a/README.md +++ b/README.md @@ -86,7 +86,7 @@ python -m src.gateway.server [TencentDB-Agent-Memory](https://github.com/TencentCloud/TencentDB-Agent-Memory) 的核心机制是「proxy 不改协议、每轮向上下文注入 L2/L3 记忆」——**本仓库的 34 组实验量化的正是这套机制的成本语义**:同一份记忆,锁死注入 vs 动态注入成本差 7.3×;低于模型阈值静默不缓存;断点布局直接决定前缀稳定性。 -可拆出提上游的方向:AgentMemory proxy 目前**没有 `cache_control` 断点布局与缓存命中率埋点**——本仓库的断点布局(3 固定 + 1 滚动)与 5 项埋点(E29 已与真实端点对账)可作为参考实现。 +可拆出提上游的方向(已核对上游源码,表述以其现状为准):上游 MemoryProxy 对缓存断点是**被动保留**的——透传客户端已有的 `cache_control`(`injection/adapters/anthropic.ts`),注入记忆时**特意不加**断点(`session/context-injector.ts` 注释申明理由),usage 管道也已采集 `cache_read_input_tokens`(`credit-reporter.ts`,用于计费上报)。**上游缺的不是埋点字段,而是「注入方式 × 命中率」的量化依据与主动策略**:本仓库的 34 组实验数据(锁死 vs 动态 7.3×、确定性序列化 74.8% vs 24.9%、逐模型阈值表)+ 主动断点布局(3 固定 + 1 滚动)+ 确定性序列化流程,可作为上游注入策略的参考实现与决策依据。 ## 目录 diff --git a/docs/REVIEW.md b/docs/REVIEW.md index d62f977..c49ea73 100644 --- a/docs/REVIEW.md +++ b/docs/REVIEW.md @@ -1,7 +1,7 @@ # 代码评审材料(Code Review Pack) > 版本 v1.2(2026-09-02)| src 1493 行 + tools/experiments/tests 1065 行(纯标准库,零第三方依赖,Python 3.11+) -> 测试:**40 项单测全过 + 11 项端到端冒烟全过**(2026-09-09,含第三轮自查回归)+ Groq 真实链路验证通过(2026-09-01) +> 测试:**44 项单测全过 + 11 项端到端冒烟全过**(2026-09-09,含第三轮自查回归 + property-based 性质测试)+ Groq 真实链路验证通过(2026-09-01) > 本版差异:**两轮代码自查发现 9 个真实 bug,全部修复并各配回归测试**(见第六节) ## 一、整体架构(IR 星型) @@ -112,7 +112,7 @@ do_POST(路由 /v1/{source}/to/{target},未知协议 → 400) | `verify_cache.py` | 152 | **验站脚本**:唯一随机 run_id 前缀两步验证(预热看 creation → 复发看 read);PASS/PARTIAL/FAIL;`max_tokens:0` 被拒自动降级 1 | | `smoke_e2e.py` | 164 | **v1.2 新增**:端到端冒烟——真起 mock + 网关两个子进程,跑 5 组 11 项断言(直通/跨协议/多轮链/预热/非法路由),退出码 0/1 | -### tests/ —— 测试(25 项全过) +### tests/ —— 测试(44 项全过) | 测试类 | 覆盖 | | ------ | ---- | @@ -123,12 +123,17 @@ do_POST(路由 /v1/{source}/to/{target},未知协议 → 400) | `TestGatewayPolicies` | 预热四类拒绝、记忆注入去重+cap+cap 三级生效 | | `TestAuditFindings` | **v1.2 新增**:9 条自查回归测试(见第六节),每条对应一个修过的 bug | | `TestStatefulChainE2E` | **v1.2 新增**:真起网关+mock 的多轮 prev_id 链路(0→2→4 条重放累积)、预热轮不进响应链 | +| `TestCrossProtocolToolArgs` | **v1.4 新增**:跨协议工具参数守恒(bug #10 回归) | +| `TestThinkingSignature` | **v1.4 新增**:thinking signature / redacted 往返(bug #11 回归) | +| `TestToolIdMap` | **v1.4 新增**:工具 ID 双向映射(含 Anthropic→Chat→Anthropic 还原、并发分叉不串号) | +| `TestAssistantFromUpstream` | **v1.4 新增**:状态层重放保留 thinking / tool_use 结构化块 | +| `TestPropertyRoundTrip` | **v1.4 新增**:property-based 往返(440 随机用例、固定种子可复现):断点恒在 [3,4] / 未知字段必降级 / 工具参数守恒 / signature 守恒 | ## 四、已验证记录 | 验证 | 结果 | 日期 | | ---- | ---- | ---- | -| 25 项单测(`-W error::ResourceWarning` 下零警告) | ✅ 全过 | 2026-09-02 | +| 44 项单测(`-W error::ResourceWarning` 下零警告,含第三轮自查回归 + property-based) | ✅ 全过 | 2026-09-09 | | 11 项端到端冒烟(子进程级,`tools/smoke_e2e.py`) | ✅ 全过 | 2026-09-02 | | 多轮 previous_response_id 链路(0→2→4 条重放) | ✅ 修复后通过 | 2026-09-02 | | Groq 真实链路(Chat 直通 + Responses→Chat + usage 归一 + 埋点) | ✅ | 2026-09-01 | @@ -186,7 +191,7 @@ do_POST(路由 /v1/{source}/to/{target},未知协议 → 400) - **工具调用 ID 双向持久映射**(问题清单组4#3):`src/state/idmap.py`——会话级 canonical ↔ 各协议外部形式,SQLite 持久、铸造稳定、会话间隔离;网关 to_ir 后归一、from_ir 前翻译、落库前翻回 canonical。`TestToolIdMap` 5 项(含 Anthropic→Chat→Anthropic 还原、并发分叉不串号) - **状态层重放保留结构化块**:`base.assistant_from_upstream()` 保留 thinking(signature/redacted)与 tool_use(含解析后 tool_input)入历史,取代只取文本的 `_assistant_message`。`TestAssistantFromUpstream` 4 项 -测试 25 → **40 项全过** + 11 项端到端冒烟全过。 +测试 25 → **40 项全过** + 11 项端到端冒烟全过。(其后的 property-based 提交再增至 **44 项**,见 CHANGELOG 2026-09-09 末节。) ## 六、已知缺口(修复后剩余)