客户端LLM去配置化 #214
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
客户端llm配置锁死,不让配,api-server转发LLM请求
客户端 LLM 去配置化技术方案补记
背景
AGC 旧模型把 LLM Provider 当作用户可配置项:用户需要理解 API Key、Base URL、模型、API 协议,并配置全局 / Agent 级路由。这带来三个问题:
本需求将 AGC 正式发行版收敛为“平台登录态 + api-server 官方代理 + 每用户 Router 账号”的链路。
目标
external_api_key正式 Key 体系,并为 Router 账号 Saga 增加独立状态表。非目标
客户端方案
正式构建固定使用
codex_app_server模式:llm.apiKey、llm.baseUrl、llm.model、llm.apiKind、agentLlm和编辑器 API Key。/llm-status、/llm-routes只返回安全状态,不返回 Router 地址、模型、协议或凭据字段。DirectProject 调用链:
本机 Provider Proxy 的安全边界:
POST /responses。X-Codex-*账户额度类响应头,避免 Codex 误判平台代理为 ChatGPT 账号额度。api-server 转发方案
新增
/api/llm/responses:apiKey、baseUrl、provider、apiKind、agentLlm、agentMode及各 snake_case 变体。/responses。Router 账号与数据模型
新增
llm_router_account表,保存每用户 Router provisioning Saga 状态:account_keyowner_user_idroute_originidempotency_keyrouter_account_idexternal_api_key_idcredential_ciphertextaccount_jsonstatusattempt_countlease_until_microsnext_retry_at_microslast_errorcredential_versioncreated_atupdated_atexternal_api_key继续作为正式 Key 记录,末尾追加兼容字段:purpose,默认external-editor,Router 固定为llm-routersecret_ciphertextprovider_account_idprovider_base_urlprovider_modelprovider_account_jsoncredential_version普通 External Editor Key 仍保持“明文只显示一次、后端只存 hash/prefix”;LLM Router Key 不走一次性明文返回,客户端永远不可见。
Provisioning 流程
每个平台用户对应一个稳定 Router 账号:
owner_user_id与固定 provisioning secret 派生稳定凭据。agc_user_+ 11 位短哈希,满足 New API 20 字符限制。remark保存完整平台owner_user_id,便于 Router 侧统计回溯。taonier;登录 Router;查询 / 创建固定 Tokenagc_auto_generate;Token / API Key 分组固定为default;签发 API Key。plan_id=1订阅:无 active 订阅时创建;已过期或剩余时间不足 24 小时时续期;剩余超过 24 小时时复用。llm_router_account/external_api_key。认证成功后会触发幂等账号准备;如果首次 LLM 请求时仍缺有效本地行,请求路径会同步执行同一 provisioning 流程。任一步外部结果不确定时进入 reconciliation 状态,禁止盲目重复注册。
环境与安全边界
GENARRATIVE_LLM_ROUTER_API_KEY_ENCRYPTION_SECRET;缺省使用带域分离的 JWT secret 派生密钥;生产应配置专用 secret。扣费方案
请求前门禁:
MUD_POINTS_INSUFFICIENT,不发起 Router 请求。成功后扣费:
Idempotency-Key/X-Idempotency-Key,缺省 request id。owner_user_id + idempotency_key派生。waivedPoints,LLM 响应仍返回给用户。response.completed/response.incomplete后结算。后台查询
新增 admin-only 专用接口
GET /admin/api/external-api-keys,支持 owner、keyId、name、keyPrefix、createdAfter / createdBefore、status、purpose。约束:
key_hash、明文 Key、密文或原始行 JSON。external_api_key做安全脱敏 / 拒绝。验证
已覆盖的定向验证包括:
X-Codex-*剥离测试待验收 / 风险
remark中的完整平台 user id,后续如 Router 协议变化需同步映射方案。再加一个模型选择的菜单,需要支持显示名称映射到实际调用名称,白名单形式