API Keys 模块 API 文档

基础信息

  • Base URL: /api/apikeys
  • 认证方式: JWT Bearer Token

数据库表

api_keys 表

字段类型必填说明
idtext (PK)必填10位随机ID
bill_idtext (FK→bills)必填所属账单
owner_idtext (FK→users)必填Key 所有者用户ID
owner_typetext必填user(目前只有这一个值)
providertext必填AI 提供商(openai/anthropic/gemini 等)
modeltext必填模型名
api_key_encryptedtext必填Base64 编码(明文可解码,不是加密)
is_sharedinteger必填0=不共享, 1=共享给账单成员
priorityinteger必填优先级,数字越小越优先(默认100)
last_used_atdatetime选填最后使用时间
expires_atdatetime选填Key 过期时间
revoked_atdatetime选填撤销时间(设置后 = 已撤销)
created_atdatetime必填创建时间
updated_atdatetime必填更新时间
唯一约束: (bill_id, owner_type, owner_id, provider, model) — 同账单内不能有重复的 owner+provider+model 组合
Schema 问题:见 P06

user_provider_order 表(排序配置)

字段类型必填说明
idtext (PK)必填10位随机ID
bill_idtext (FK→bills)必填所属账单
user_idtext (FK→users)必填排序用户
providertext必填AI 提供商
modeltext必填模型名
owner_typetext必填Key 类型
owner_idtext必填Key 所有者ID
priorityinteger必填排序优先级
created_atdatetime必填创建时间
updated_atdatetime必填更新时间
唯一约束: (bill_id, user_id, provider, model, owner_type, owner_id)

接口列表


GET/api/apikeys/user

1. 获取用户在账单中的 Key 列表

触发时机: 进入 开发者页面(DeveloperPage) 时请求(查询当前用户在当前账单配置的 Key)
DeveloperPage 加载 → GET /apikeys/user?billId=xxx
查询参数:
参数类型必填说明
billIdstring必填账单ID(Query Param)
响应:
{
  "keys": [
    {
      "id": "string",
      "owner_type": "user",
      "owner_id": "string",
      "provider": "openai",
      "model": "gpt-4o",
      "is_shared": 0 | 1,
      "priority": 100,
      "created_at": "ISO8601"
    }
  ]
}
不返回 api_key_encrypted 明文

GET/api/apikeys/resolve-all/:billId

2. 获取账单全量可用 Key 条目

触发时机: 1. DataContext 初始化时fetchAiKeys(billId) 被调用(切换账单或进入设置页) 2. SettingsPage 加载时,与 /apikeys/user 一起并行请求 响应
{
  "available": [
    {
      "id": "...",
      "provider": "openai",
      "model": "gpt-4o",
      "owner_type": "user | bill",
      "owner_id": "...",
      "owner_nickname": "...",
      "priority": 1,
      "is_shared": 1,
      "is_self_owner": true,
      "order_key": "openai::gpt-4o::user::U7X9R1P2A1"
    }
  ],
  "suggestions": [ ... ]
}

POST/api/apikeys/verify/user

3. 测试 Key 连通性

触发时机: 在 开发者页面 点击某个 Key 卡片的「测试连接」按钮
DeveloperPage → 展开某 Key → 点击"测试连接" → POST /apikeys/verify/user
请求参数:
参数类型必填说明
providerstring必填AI 提供商
api_keystring必填Key 明文
modelstring必填模型名
billIdstring必填账单ID
后端处理: 调用 proxyChatByProvider 向该 Provider 发送测试请求(ping 消息)
测试失败不影响已保存的 Key,只做验证

PUT/api/apikeys/user

4. 保存或更新用户 Key

触发时机: 在 开发者页面 填写/修改 Key 信息后点击「保存」按钮
DeveloperPage → 填写 provider/model/api_key → 点击"保存" → PUT /apikeys/user
请求参数:
参数类型必填说明
providerstring必填提供商
api_keystring选填Key 明文(首次必填,后续可省略)
modelstring必填模型名
billIdstring必填账单ID
prioritynumber选填优先级,默认100
is_sharedboolean选填是否共享,默认 false
后端处理: 1. 校验 billId 有效 2. Base64 编码 Key 3. UPSERT:provider+model 组合存在则 UPDATE,否则 INSERT 4. is_shared=1 时同账单成员可使用此 Key
Schema 注意: is_shared 是 integer(0/1),不是 boolean,传布尔值会被 Number(is_shared) === 1 处理
重要: 首次保存必须提供 api_key 明文;后续更新可省略(用数据库已有值)

PATCH/api/apikeys/user/share

5. 切换 Key 共享状态

触发时机: 在 SettingsPage Key 卡片上点击「共享」开关
SettingsPage → Key 卡片 → 点击共享开关 → PATCH /apikeys/user/share
请求参数:
参数类型必填说明
billIdstring必填账单ID
providerstring必填提供商
modelstring必填模型名
is_sharedboolean必填是否共享

PATCH/api/apikeys/order/user

6. 批量更新 Key 排序

触发时机: 在 SettingsPage 拖拽调整 Key 顺序后触发
SettingsPage → 拖拽调整 Key 顺序 → PATCH /apikeys/order/user
前端可能未实现拖拽排序功能
请求参数:
参数类型必填说明
billIdstring必填账单ID
ordersarray必填排序数组

DELETE/api/apikeys/user/:provider

7. 删除用户 Key

触发时机: 在 SettingsPage Key 卡片上点击「删除」按钮
SettingsPage → Key 卡片 → 点击"删除" → DELETE /apikeys/user/:provider?billId=xxx&model=xxx
查询参数:
参数类型必填说明
billIdstring必填账单ID(Query Param)
modelstring选填不传则删除该 provider 下所有 Key

GET/api/apikeys/resolve/:billId

8. 获取账单最优 Key 列表(自动选择)

触发时机: 由后端 getResolvedApiKey 内部调用,前端通常不需要直接调用 响应
{
  "available": [
    {
      "provider": "openai",
      "model": "gpt-4o",
      "owner_type": "user",
      "owner_id": "user_id",
      "key": "sk-...",
      "priority": 1
    }
  ]
}

GET/api/apikeys/suggestions

9. 获取跨账单配置建议

触发时机: 在 SettingsPage 加载时获取可导入的 Key 建议
SettingsPage 加载 → GET /apikeys/suggestions?currentBillId=xxx
查询参数:
参数类型必填说明
currentBillIdstring选填当前账单ID(排除项)

POST/api/apikeys/import

10. 跨账单导入 Key 配置

触发时机: 在 SettingsPage 点击「从其他账单导入」并选择源账单后确认
SettingsPage → 点击"导入" → 选择源账单 → 点击确认 → POST /apikeys/import
请求参数:
参数类型必填说明
fromBillIdstring必填源账单ID
toBillIdstring必填目标账单ID(通常为当前账单)
providerstring选填过滤 provider
modelstring选填过滤 model
后端处理: UPSERT,同 provider+model 存在则覆盖,否则新增
Schema 注意:见 P11