Skip to content

Latest commit

 

History

History
113 lines (88 loc) · 4.28 KB

File metadata and controls

113 lines (88 loc) · 4.28 KB

TokenRouter Development Constraints

不可违反的硬约束。任何 Agent 在编码前必须阅读。 最后更新:2026-04-16


1. MVP 范围锁(Phase 1)

以下约束在 MVP 阶段绝对不可突破

维度 约束
入站协议 仅支持 OpenAI 兼容格式 (POST /v1/chat/completions)
出站厂商 第一个版本仅 DeepSeek V3.2(通过 OpenAI 兼容接口)。Anthropic / OpenAI 等通过预留的 OutboundAdapter 接口后续接入
架构形态 单体 Go 服务,编译为单一二进制
状态设计 完全无状态。不维护任何 session、对话历史、用户上下文
分块策略 静态四分块(System / Tool / History / Query)。禁止引入动态前缀优化算法
缓存策略 静态缓存注入(Anthropic cache_control)。无动态模板选择
去重范围 仅对非流式请求 (stream=false) 做并发去重
路由策略 按 model 名称做固定映射。禁止成本最优路由、智能路由
语义处理 不解析 content 语义,不做语义缓存,不做 embedding 匹配

明确不在 MVP 范围内

  • Anthropic / Google 原生入站接口
  • 对话历史托管(session 状态)
  • 流式请求去重
  • 动态分块(Observer / Clusterer / 模板池)
  • 语义缓存
  • 复杂能力协商(function calling 格式自动转换)
  • 多地域部署
  • 团队/组织管理、SSO
  • 商业化功能(支付、订阅、发票)

2. 文档与代码关系

当前项目处于文档先行阶段。Go 代码文件尚未存在

  • 所有文档中对项目结构文件路径代码示例的描述均为设计意图,不代表文件已存在。
  • Agent 在实施编码任务时,必须根据文档从零创建文件,而不是假设文件已存在并尝试修改。
  • cmd/server/main.gogo.mod.env.exampleMakefile 等文件目前均不存在,需要时由 Agent 创建。

3. 变更控制红线

红线 说明
新增外部依赖 任何新的第三方库引入必须经过 ADR 流程或记录在 PRD 技术栈中
ADR 保护 ADR 文档只记录决策结论,不记录实现细节。禁止因代码变更而修改 ADR
Archive 保护 docs/archive/adapter-design.md 为历史归档文档,禁止删除
Phase 2 文档隔离 所有 Phase 2/3 算法文档必须放在 docs/research/ 目录下,不得进入 MVP 执行路径
接口文档同步 新增/修改 interface 后,必须同步更新 CODE_WIKI.md
API 契约同步 新增/修改 HTTP 端点后,必须同步更新 API_CONTRACT.md

4. 性能与质量强制要求

4.1 性能指标

  • KV Cache 命中率 > 40%(MVP 目标,通过 DeepSeek prompt_cache_hit_tokens 度量)
  • P99 延迟增加 < 100ms(不含厂商响应时间)
  • 吞吐量 > 500 req/s(MVP 目标,标准负载:10 条 messages,5 个 tools,~2000 tokens)
  • 首 Token 延迟增加 < 50ms

4.2 测试覆盖率

模块 最低覆盖率 备注
Canonicalizer 100% 字节级确定性必须严格保证
Chunker 80%
Arranger 80%
Hasher 80%
Outbound Adapters 70%

4.3 代码质量红线

  • 所有外部 I/O 调用必须处理 error禁止吞掉错误
  • 并发访问共享状态必须使用 sync.RWMutex 或 channel 保护
  • 所有测试必须是表格驱动(table-driven)
  • 禁止使用 interface{} 传递业务数据(配置解析除外)
  • 禁止在 internal/ 之外编写业务逻辑

5. 编码规范

5.1 错误处理

// 正确:wrap 错误并带上模块前缀
blocks, err := chunker.Chunk(env)
if err != nil {
    return fmt.Errorf("chunker: %w", err)
}

// 禁止:吞掉错误
blocks, _ := chunker.Chunk(env)

5.2 日志

  • 使用 Zap 结构化日志
  • key 使用 snake_case
  • 错误日志必须包含 error 字段

5.3 配置

  • 所有配置项通过环境变量注入
  • pkg/config/ 为统一加载入口
  • 默认值应在代码中显式声明,不依赖隐式零值

5.4 测试

  • 优先 TDD:先写测试再写实现
  • Mock 策略:Mock 接口,不 Mock 具体实现
  • 集成测试必须使用 httptest.Server