AGC 支持 Anthropic 独立网关路由与后台协议选项

新增平台 Anthropic 网关路由 /api/llm/anthropic/{*path},复用账号 Router 凭据边界
OpenAI 侧规范路径改为 /api/llm/v1/responses 与 /api/llm/v1/chat/completions,旧路径保留兼容
baseUrl 不再携带路由与版本段,统一由协议自己拼 v1/<op>
cc 执行器改走平台网关,ANTHROPIC_AUTH_TOKEN 复用平台会话,不再直连 Router
后台模型目录 agentMode 增加 anthropic,管理页与客户端契约同步
补齐三条路由埋点与静态段白名单,新增三条回归测试
同步后端架构文档、模型别名文档与排障记忆
This commit is contained in:
kdletters
2026-10-01 19:41:08 +08:00
parent 44f415d057
commit d1f789cc10
14 changed files with 582 additions and 13 deletions
@@ -17,6 +17,9 @@ pub const AGC_MODEL_CATALOG_MAX_MODELS: usize = 32;
pub enum AgcAgentMode {
Codex,
Cc,
/// 显式 Anthropic Messages 协议。`cc` 是同一执行器的历史别名,
/// 新目录项应直接写 `anthropic`。
Anthropic,
}
impl Default for AgcAgentMode {
@@ -30,6 +33,7 @@ impl AgcAgentMode {
match self {
Self::Codex => "codex",
Self::Cc => "cc",
Self::Anthropic => "anthropic",
}
}
@@ -37,7 +41,8 @@ impl AgcAgentMode {
match value {
"codex" => Ok(Self::Codex),
"cc" => Ok(Self::Cc),
_ => Err("Agent 模式只允许 codex 或 cc".into()),
"anthropic" => Ok(Self::Anthropic),
_ => Err("Agent 模式只允许 codex、cc 或 anthropic".into()),
}
}
}
@@ -340,13 +345,21 @@ mod tests {
}
#[test]
fn catalog_agent_mode_accepts_codex_and_cc_only() {
fn catalog_agent_mode_accepts_codex_cc_and_anthropic_only() {
let mut catalog =
AgcModelCatalog::from_upstream_models(upstream(&["model-a", "model-b"]), 0).unwrap();
catalog.models[0].agent_mode = AgcAgentMode::Cc;
assert!(catalog.validate().is_ok());
assert_eq!(catalog.models[0].agent_mode.as_str(), "cc");
catalog.models[0].agent_mode = AgcAgentMode::Anthropic;
assert!(catalog.validate().is_ok());
assert_eq!(catalog.models[0].agent_mode.as_str(), "anthropic");
assert_eq!(
AgcAgentMode::parse("anthropic").unwrap(),
AgcAgentMode::Anthropic
);
let invalid: Result<AgcModelCatalog, _> = serde_json::from_str(
r#"{"revision":0,"defaultModelId":"model-a","models":[{"id":"model-a","alias":"model-a","modelId":"model-a","enabled":true,"agentMode":"provider"}]}"#,
);