个人与团队模式使用说明
登录入口
- 统一登录入口:
/console。管理员与成员在同一个登录页填用户名与密码,角色由服务端识别。 - 旧的
/app地址保留为兼容跳转,会重定向到/console。 - 团队管理页:
/console/team。它只在团队模式下出现在导航里;个人模式访问会回到运行参数设置。 - 运行模式在 设置 → 运行参数 → 运行模式 分组里切换(旧的
/console/settings?tab=mode链接会转到运行参数)。 - 推理仍通过原来的
/v1/*;浏览器账户会话不能作为推理 Key。
默认是个人模式,原有个人 Key、路由、管理口令与控制台保持可用。 已有下游 Key 不会按名称自动认领为团队用户,也不会自动套上团队策略。 如果此前曾把旧 Key 发给别人,请在迁移时主动停用/轮换旧 Key,再发账户邀请; 不能把原个人/系统 Key 的继续可用误认为团队授权已经覆盖了它。
成员在控制台里看到什么
左侧导航只列出站长开给这个账户的能力,页面本身与控制台列表页是同一套组件:
- API Keys:遥测带(总数 / 启用 / 已记录 Tokens)、搜索与状态筛选、每行操作菜单 (编辑 / 启停 / 轮换 / 删除,轮换与删除先确认)、分页。轮换后直接弹出接入面板。
- 模型:只列该账户真正可用的模型,含供应商、能力标签、上下文窗口与授权候选数, 按模型家族分组;「接入」把模型名带进接入面板。站长开启个人路由时,每行还有 编排: 在抽屉里拖动调整该模型的上游顺序、开关单条上游、改权重,并可用「恢复站点默认顺序」交回。
- 请求日志(站长开启用量时):时间范围、Key / 模型 / 状态 / 请求 ID 筛选、导出 CSV, 行内展开输入 / 输出 / 缓存读写 tokens 与上游尝试次数;只含本人 Key 的请求。
- 个人路由(站长开启时):在模型页直接编排每个模型的上游顺序;编排结果按方案保存, 默认落在用户自己的那套,Key 可另外绑定命名方案。
- 个人设置:调用偏好、界面偏好与账户(密码 / 登录会话)。
用户可以调整的调用偏好
在 个人设置 → 调用偏好 里,用户可以把跨渠道故障转移关掉,或把个人重试上限收得比站点更紧。 两个前提:站长在该账户的策略上勾选了「允许用户调整故障转移与重试上限」,且只在团队模式下生效。
- 偏好只能收紧:个人上限不会超过站点设置,也绕不过模型级重试规则。
- 页面同时显示「站点默认」与按本人偏好计算出的「生效值」,避免看不出差别在哪。
- 关闭跨渠道转移不改变同渠道 Key 池策略;图像等非幂等请求照旧不重试。
- 站长未开放时该面板只读,直接调 API 也会被拒绝(
403 preferences_not_allowed)。
开启团队模式
- 使用原管理口令登录控制台,进入 设置 → 运行参数,展开 运行模式 分组。
- 创建站长账户(密码至少 10 个字符)。原控制台开启 TOTP 时还需原两步验证码。
- 将运行模式改为 团队模式 并保存。
- 进入 团队管理 → 权限与路由,编辑默认策略或新增策略:
- 勾选允许用户使用的公共路由成员;
- 选择允许的模型,或明确勾选「允许所有模型名称」;
- 设置每人 Key 数和请求速率;
- 需要时开启「允许个人路由」与「允许用户调整故障转移与重试上限」。
- 在 团队管理 → 成员与邀请 中生成邀请链接,对方激活后自行创建 Key。
- 在 团队管理 → 用户前端 中设置名称、Logo、主色、公告、登录页说明和开放模块。
默认策略不授予任何公共候选。 创建账户不等于授予全站渠道。 所有模型名称的开关也不会扩大公共成员授权。 邀请码只显示一次、7 天有效,可撤销;不需要邮件服务。
团队码与账户额度
码只有一张表(team_invites),靠 kind 分三种用途:
| kind | 用途 | 关键列 |
|---|---|---|
invite | 注册码(可在登录页用码注册;max_uses > 1 时多人可用同一个码) | policy_id、role、max_uses、quota_tokens(注册时给账户的初始额度) |
credit | 额度码(已登录成员兑入自己的额度池) | quota_tokens、max_uses |
recovery | 重置密码的一次性链接(绑定单个账户) | user_id |
- 明文只出现一次:表里只有
token_hash,生成响应里返回明文,列表只显示类型/标签/已用次数。 - 短码:16 位(80 位熵)分组显示
XXXX-XXXX-XXXX-XXXX,哈希存去掉分组符后的形式, 所以“去掉横线/小写/粘贴整条 URL”都能识别;旧的长 token 走原样哈希,继续可用。 - 同一账号不能重复兑同一个额度码(
team_code_redemptions唯一索引);一个码的总次数由used_count < max_uses约束。
账户额度(team_users.quota_total_tokens / quota_used_tokens,0 = 不限)与 Key 配额是两重限制:
- 准入:
RelayHandler.ensureQuota先查 Key 配额、再查账户额度(额度随 key 的 TeamAccess 快照带出,不额外查库),任一耗尽均返回 402。 - 计费:
store.RecordUsage在同一个事务里同时累加downstream_keys.quota_used_tokens与team_users.quota_used_tokens。
站长可在团队管理 > 成员列表直接改额度上限或清零用量(“充值与续期”);成员自己在个人设置里看余额、用兑换码充值。
第三方登录(GitHub / Linux.do)
团队模式支持用第三方账号登录(登录页上的按钮),配置路径:团队管理 → 第三方登录。
- 回调地址:控制台按当前站点地址给出
https://<域名>/auth/oauth/<provider>/callback, 复制到对方的应用设置(GitHub OAuth App / Linux.do Connect 接入)里。 - 端点默认官方地址,可在「高级:自定义端点」里覆盖:
authorize由浏览器访问,token/userinfo由网关服务器访问 —— 内外网分离部署时可以分别指向不同地址。 - 首次登录:开启「允许自助注册」时,第三方登录会按 provider 的稳定 id 找已有绑定; 没有就建一个新账户(用户名由 provider 昵称派生并去重),落到指定策略。 关闭时只能登录已存在的账户(先用邀请码/注册码建号)。
- 限制:被暂停的账户不能用第三方登录;一次回调只能完成一个浏览器发起的流程 (state 与 PKCE verifier 存在签名 cookie 里);token/userinfo 请求忽略容器的
HTTP_PROXY,只跟随运行设置里的全局出网代理。 - 解绑:成员详情里可解绑某个第三方账号(只影响登录方式,不删账户)。 清空 Client ID 保存则等于移除该 provider(密钥一并删除,登录页不再出现按钮)。
个人路由(按模型编排上游)
个人路由是「模型页里的上游编辑器」,不是另建一套模型。获权用户在 模型与接入 → 编排 里, 对单个模型拖动调整上游渠道顺序、开关单条上游、设置权重;顺序就是故障转移尝试的先后。
- 只能操作站长已授权的成员:上游列表就是授权集合,未授权的渠道不会出现,暗改也不行。
- 未编排的模型完全不受影响:继续走站点默认的成员与顺序。
- 已编排的模型以用户列表为准:列表里的上游参与(顺序按用户),被关掉或不在列表里的不参与; 关掉的条目仍留在列表里,方便重新打开。
- 「恢复站点默认顺序」删除该模型的编排,回到站点顺序(不是把站点顺序抄一遍)。
- 编排只影响本人请求;不动公共路由、不暴露上游凭据、不允许添加上游。
**方案(plan)**是编排的载体:用户在不选方案时编辑的是自己的默认方案(首次保存时自动创建), 他的 Key 只要不显式绑定就跟着它走。需要「同一账户两套目标」时,可在模型页顶部 新建方案, 再在 Key 的高级设置里绑定该方案;绑定后该 Key 只走这个方案里编排过的模型,其它模型仍是站点默认。
团队 Key 只提供已登记的标准推理端点,不把上游凭据委托为任意端点访问权; 客户端不能用 upstream_path / upstream_url / X-Meta-Upstream-Path 改道。 站长配置的供应商 profile、端点映射和 payload 规则继续生效。原个人 Key 的任意路径能力不变。
最终候选为 账户当前授权 ∩ 编排列表(若该模型被编排)∩ 可用候选。 撤销授权后,旧编排不会保留访问权。交集为空时拒绝转发,不偷偷回退到其他渠道。 停用个人路由权限后,绑定方案的 Key 会被拒绝;用户可把 Key 解除绑定(plan_id=0)。
管理角色
- 原管理凭证:保留既有管理能力,用于兼容、初始设置及应急。
- 站长账户:可进入原控制台、切换模式、定制用户前端、管理用户和授权。
- 管理员账户:仅可使用团队成员/邀请管理等获授权操作;不能修改运行模式、授权策略, 不能升级自己或他人的角色,不能访问原上游凭据、备份、插件、系统配置等接口。
- 普通用户:只可使用自己的 Key、
/me/*资源与个人路由。
账户登录在 /console 完成,管理员与成员同一个入口。站长/管理员登录后可进入团队管理页。 原管理口令登录方式继续保留;旧侧车插件的 iframe/专用管理 API 仍沿用既有管理凭证协议, 不要把用户会话或 API Key 作为插件管理凭证。
切回个人模式
设置保存后,团队用户页面与接口关闭,团队所属 Key 的后续调用被阻止。 所有团队会话撤销;账户、策略、Key 和历史记录不删除。 原个人 Key 不受影响。再次开启团队模式需要重新登录。
如果当前以团队站长账户操作,切回个人模式后,该会话也会退出; 请确保仍保留原管理口令。
Key、登录与数据安全
- 新 Key 使用加密安全随机数,数据库保存哈希与 MASTER_KEY 加密明文。
- 列表只返回末尾提示;只有本人按需查看/复制时返回明文,响应
no-store。 - 删除用户 Key 撤销凭据并移除加密明文,保留历史标识。
- 暂停/恢复账户不会覆盖各把 Key 自己的启停状态。
- 账户状态、策略和个人方案在每次新推理请求时读取,不依赖旧 Key 缓存中的权限。
- 用户会话使用 HttpOnly、SameSite Cookie;写请求要求 CSRF 令牌并校验 Origin。
- HTTPS 直连、同主机 HTTPS 登录 Origin 或已配置 HTTPS API Base URL 时设置 Secure。 生产部署请使用 HTTPS,并在用户前端设置正确的公开 HTTPS API Base URL; 反向代理应保留原 Host。当前默认采用同源部署,不开放跨站 Cookie API。
- 密码采用 SHA-256 预哈希后 bcrypt;不存在的账户也做 dummy hash 检查。
- 账户恢复链接只允许站长生成,1 小时有效、单次使用;恢复和修改密码均撤销会话。
- 不在 localStorage/sessionStorage 保存团队登录凭据。控制台只存一个无权限的 SSO 导航提示, 是否进入后台仍由服务器验证 Cookie 与角色。
- 数据库恢复会撤销团队会话和一次性链接,避免恢复已撤销凭据。
- 恢复出厂设置清空个人方案、团队请求及数字成员授权,避免成员 ID 重用导致越权; 团队账户与外观配置保留,需重新授权。
用量与客户端接入
用户请求页按实际请求而非尝试次数显示,支持时间与 Key 筛选,最多返回最近 200 条。 上游没有上报用量时显示「—」,不估算。Key 删除不会让已有请求历史消失。 本版不引入钱包或虚构剩余额度。
接入页提供 cURL、Python 配置及 CC Switch 导入。导入动作只声明已发起, 是否导入成功由客户端确认;没有调用本地客户端的静默安装/覆盖功能。 真实 Key 不要放进公开仓库、截图或转发链接。
构建与部署
cd web
npm run lint
npm run typecheck
npm test -- --run
npm run build
cd ..
go build -o bin/meta-gateway ./cmd/servernpm run build 产出单一控制台产物到 internal/webui/dist,由 go:embed 编进二进制。成员与管理员用的是同一份构建——角色由服务端按账号判定,前端不做第二套产物。
顺序不能颠倒:先 Node 再 Go。 改了 web/src 却没重新构建,Go 侧跑的还是旧界面。
本地开发用 npm run dev(4173,base 为 /console/),需要网关后端在 :4100 上跑着才有数据。
注册与账号策略
采用邀请制 + 账户密码,并支持 GitHub / Linux.do 第三方登录(登录页可自助注册,由站长开关控制)。
没有公开邮箱注册、用户级 TOTP、支付/订阅,界面上也没有对应的占位按钮——它们不影响成员、Key、授权与个人路由的完整使用流程。