Skip to content

div-anthropic D1: client.ts 云 provider 解耦 — 决定 seam 是否覆盖 bedrock/vertex/foundry 签名 #63

Description

@dahai80

背景

feat/div-anthropic 分支 Phase 5 已完成错误层解耦 (commit 93bf7838a31408): withRetry.ts / api/errors.ts / utils/errors.ts 等 12 个文件不再 instanceof APIError/APIUserAbortError,改用 isApiErrorLike/isAbortError 鸭子类型桥; 编译后二进制 0 处 @anthropic-ai/sdk 错误类引用; MLX smoke 200 OK。

但 SDK 运行时依赖的仍在: src/services/api/client.ts 对每个 provider 都 new Anthropic(...):

// line 1
import Anthropic from "@anthropic-ai/sdk";
// line 199 — firstParty + fusionMlx 都走这里 (fusionMlx 用 custom fetch 包装, 仍需 Anthropic 类)
return new Anthropic(clientConfig);
// line 226 foundry
const { AnthropicFoundry } = await import("@anthropic-ai/foundry-sdk");
return new AnthropicFoundry(foundryArgs) as unknown as Anthropic;
// line 265 bedrock (AWS SigV4 签名)
const { AnthropicBedrock } = await import("@anthropic-ai/bedrock-sdk");
return new AnthropicBedrock(bedrockArgs) as unknown as Anthropic;
// line 292 vertex (GCP token)
const { AnthropicVertex } = await import("@anthropic-ai/vertex-sdk");
return new AnthropicVertex(vertexArgs) as unknown as Anthropic;

因此 package.json@anthropic-ai/sdk / foundry-sdk 仍是运行时必需,无法移除。

问题

seam (streamViaSeam,flag LLM_ADAPTER_SEAM) 目前只覆盖 firstParty + fusionMlx 两条路径。client.ts 实例化的 SDK client 提供的不只是 HTTP 传输,还包括:

  • bedrock: AWS SigV4 请求签名 (@anthropic-ai/bedrock-sdk)
  • vertex: GCP OAuth token 获取与签名 (@anthropic-ai/vertex-sdk)
  • foundry: Foundry 私有协议适配 (@anthropic-ai/foundry-sdk)
  • firstParty/fusionMlx: SDK 的重试、流式协议、messages.create 入口 (seam 已可绕过)

要彻底去除 @anthropic-ai/sdk 运行时依赖,需让 seam 覆盖全部 provider,但 bedrock/vertex/foundry 的请求签名是 SDK 内部实现,seam 的 httpClient.ts 目前只做裸 HTTP POST,无签名能力。

约束

  • 跨仓规则: fusion-code 仓库只能改 fusion-code 自身。bedrock/vertex SDK 的签名逻辑属于上游,不能复制实现进 fusion-code。
  • 若自行实现 SigV4/Vertex token 签名,等于重新实现 SDK 核心能力,违反 Rule 2 (Simplicity)。

待评估方案

  1. seam 扩展签名层: 在 httpClient.ts 增加 per-provider 的 signRequest hook,bedrock/vertex 各自实现轻量签名 (需评估 SigV4/GCP token 的实现量)。
  2. 保留 SDK 仅用于云 provider: client.ts 仅在 bedrock/vertex/foundry 时 new Anthropic,firstParty/fusionMlx 走 seam 纯 HTTP。@anthropic-ai/sdk 变为 optional dep (云 provider 用户才装)。package.json 主依赖移除,降为 optionalDependencies
  3. 接受当前状态: Phase 5 错误层解耦已是独立价值 (seam 错误可重试/分类),SDK 依赖保留,标记为"已知技术债"。

请评估后选择方案。本 issue 解锁 D2 (package.json 移除)。

验收标准

  • 选定方案并记录决策
  • firstParty/fusionMlx 在 seam 下不 new Anthropic (若选方案 1/2)
  • bedrock/vertex/foundry 路径有明确归属 (自实现签名 / 保留 SDK / optional dep)
  • grep -rln "new Anthropic" src/ 结果与方案一致

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions