背景
feat/div-anthropic 分支 Phase 5 已完成错误层解耦 (commit 93bf783→8a31408): 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)。
待评估方案
- seam 扩展签名层: 在
httpClient.ts 增加 per-provider 的 signRequest hook,bedrock/vertex 各自实现轻量签名 (需评估 SigV4/GCP token 的实现量)。
- 保留 SDK 仅用于云 provider:
client.ts 仅在 bedrock/vertex/foundry 时 new Anthropic,firstParty/fusionMlx 走 seam 纯 HTTP。@anthropic-ai/sdk 变为 optional dep (云 provider 用户才装)。package.json 主依赖移除,降为 optionalDependencies。
- 接受当前状态: Phase 5 错误层解耦已是独立价值 (seam 错误可重试/分类),SDK 依赖保留,标记为"已知技术债"。
请评估后选择方案。本 issue 解锁 D2 (package.json 移除)。
验收标准
背景
feat/div-anthropic分支 Phase 5 已完成错误层解耦 (commit93bf783→8a31408):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(...):因此
package.json的@anthropic-ai/sdk/foundry-sdk仍是运行时必需,无法移除。问题
seam (
streamViaSeam,flagLLM_ADAPTER_SEAM) 目前只覆盖 firstParty + fusionMlx 两条路径。client.ts实例化的 SDK client 提供的不只是 HTTP 传输,还包括:@anthropic-ai/bedrock-sdk)@anthropic-ai/vertex-sdk)@anthropic-ai/foundry-sdk)messages.create入口 (seam 已可绕过)要彻底去除
@anthropic-ai/sdk运行时依赖,需让 seam 覆盖全部 provider,但 bedrock/vertex/foundry 的请求签名是 SDK 内部实现,seam 的httpClient.ts目前只做裸 HTTP POST,无签名能力。约束
待评估方案
httpClient.ts增加 per-provider 的signRequesthook,bedrock/vertex 各自实现轻量签名 (需评估 SigV4/GCP token 的实现量)。client.ts仅在 bedrock/vertex/foundry 时new Anthropic,firstParty/fusionMlx 走 seam 纯 HTTP。@anthropic-ai/sdk变为 optional dep (云 provider 用户才装)。package.json 主依赖移除,降为optionalDependencies。请评估后选择方案。本 issue 解锁 D2 (package.json 移除)。
验收标准
new Anthropic(若选方案 1/2)grep -rln "new Anthropic" src/结果与方案一致