-
Notifications
You must be signed in to change notification settings - Fork 1
Credentials
这一页是配置里最容易踩坑的部分。配 Cookie 之前请先读完第一节。
变量接受两种写法(裸 ticket 值,或整段 Cookie 头 a=b; c=d),但两者在不同环境下命运不同:
| 环境 | 整段 Cookie 头 |
原因 |
|---|---|---|
| Vercel / EdgeOne Makers / Workers 面板 | ❌ 会被拒绝 | 值里含 ; 空格,面板报「变量值不能包含空格、换行、制表符等特殊字符」 |
本地 .env / .dev.vars
|
✅ 可以,但需转义 | 加载器会展开 $,见下 |
推荐一律只粘 login_aliyunid_ticket 的值本身 —— 它不含空格与换行,所有平台都能原样保存,
服务端会自动按 login_aliyunid_ticket=<值> 处理(裸值缺少 name= 时自动补前缀)。
Bun 的 .env 加载器与 Vite 的 loadEnv()(vite.config.ts 用的就是它)都会做 $VAR 变量展开。
这类 ticket 的值里含 $,未转义时后两段会被当作变量名、静默展开为空 ——
实测 153 字符的 ticket 只剩 130 字符,丢了 23 个字符,且没有任何警告。
# ❌ 错误:$a1b2 与 $deadbeef 被当作变量展开为空
ALIYUN_TOKENPLAN_COOKIE=EXAMPLE_ticket_8ffe$a1b2$deadbeef*rest
# ✅ 正确:每个字面 $ 前加反斜杠
ALIYUN_TOKENPLAN_COOKIE=EXAMPLE_ticket_8ffe\$a1b2\$deadbeef*rest上例是编造的占位值,只用来演示
$的位置。
损坏后的值发到网关只会返回 BailianGateway.Login.NotLogined —— 与「会话过期」的报错完全一致,
极易误判成 Cookie 失效。注意:加引号("…" / '…')在两种加载器下都无效,必须用 \$。
平台上(Vercel / EdgeOne / Workers 面板)直接粘原值,不要加反斜杠 —— 那里不做变量展开。
自检(在项目根目录执行,bun -e 会自动加载 .env):
bun -e 'console.log(process.env.ALIYUN_TOKENPLAN_COOKIE?.length ?? "not set")'输出的长度应与你在浏览器里复制的值一致;明显变短就说明 $ 被展开吃掉了。
长度对了不代表值是对的:长度自检只能抓被
$吃掉的截断, 抓不到「长度相同但是旧值」。怀疑没生效时,比对哈希而不是长度。
百炼可以「只粘 ticket 的值」绕开空格限制,模力方舟不行 —— 代金券查询要的就是整段会话 Cookie
(uuser_locale=zh-CN; abymg_id=…; BEC=… 这种),天生带 ; ,面板必定拒绝保存。
解法是存编码后的值:空格变 %20、分号变 %3B,没有空格与换行,面板照收;
服务端 normalizeSessionCookie()(server/gitee.ts)检测到值里含 % 且解码后出现 = 就自动还原,
业务代码拿到的始终是原始 Cookie 串,无需任何额外配置。
# 单引号保留空格;printf 不带尾部换行(echo 会写进 \n,同样是面板拒绝的字符)
COOKIE='uuser_locale=zh-CN; abymg_id=…; BEC=…'
printf '%s' "$(node -e 'process.stdout.write(encodeURIComponent(process.argv[1]))' "$COOKIE")" \
| vercel env add GITEE_AI_SESSION_COOKIE production只把空格换成 %20、分号保持原样也可以(启发式只看「含 % 且解码后有 =」);
本地 .env 两种写法都收,不要加 \$。
自检(还原后应看到带 ; 的整段,与浏览器里复制的一致):
bun -e 'console.log(decodeURIComponent(process.env.GITEE_AI_SESSION_COOKIE ?? ""))'每个平台支持多组凭据:第 1 组使用基础变量名,第 N 组在变量名后加 _N 后缀
(连续编号,遇到缺失即停)。例如 DeepSeek 三个账号:
DEEPSEEK_API_KEY、DEEPSEEK_API_KEY_2、DEEPSEEK_API_KEY_3。
成对凭据(AccessKey/SecretKey)同编号成组:
VOLC_ACCESS_KEY_ID_2 + VOLC_SECRET_KEY_2。
每个账号独立查询、独立容错,仪表盘按账号卡片展示。
中间断号会让后续组全部读不到:有
_1、_3却没有_2,读取在缺口处停止。 空态里会给提示,但很容易被忽略。
Key 掩码(sk-EXAM****PLE9)对人而言没有可读性 —— 同一平台挂 5 个 Key 时无法判断哪个是哪个。
给每个 Key 配一个别名,卡片主标题就显示别名,Key 掩码退居次要位置(仅作消歧)。
变量名规则:在凭据变量名前缀后加 _LABEL,第 N 组同样加 _LABEL_N,按序号与凭据配对。
# 5 个 OpenCode Go 订阅,按团队标注归属
OPENCODE_GO_API_KEY=sk-aaaa...
OPENCODE_GO_LABEL=前端团队专用订阅
OPENCODE_GO_API_KEY_2=sk-bbbb...
OPENCODE_GO_LABEL_2=后端团队专用 Key
OPENCODE_GO_API_KEY_3=sk-cccc...
OPENCODE_GO_LABEL_3=算法组(长上下文)各平台对应的别名前缀:
| 平台 | 凭据变量 | 别名变量 |
|---|---|---|
| DeepSeek | DEEPSEEK_API_KEY |
DEEPSEEK_LABEL |
| 火山方舟 | VOLC_ACCESS_KEY_ID |
VOLC_LABEL |
| 智谱 GLM | ZHIPU_API_KEY |
ZHIPU_LABEL |
| 阿里云(资源包 / Token Plan 组织·座席) | ALIYUN_ACCESS_KEY_ID |
ALIYUN_LABEL |
| 阿里 Token Plan 个人版(仅 Cookie) | ALIYUN_TOKENPLAN_COOKIE |
ALIYUN_TOKENPLAN_LABEL |
| 模力方舟 | GITEE_AI_API_KEY |
GITEE_LABEL |
| 百度千帆 | BAIDU_ACCESS_KEY_ID |
BAIDU_LABEL |
| OpenRouter | OPENROUTER_API_KEY |
OPENROUTER_LABEL |
| Kimi For Coding / MiniMax |
KIMI_API_KEY 等 |
KIMI_LABEL 等 |
| OpenCode Go | OPENCODE_GO_API_KEY |
OPENCODE_GO_LABEL |
-
按序号配对,不按值配对。
*_LABEL_2对应的是第 2 组凭据; 中间断号(有_1、_3没_2)会让后续组全部读不到。 -
别用
ALIYUN_LABEL标 Cookie 专属账号:没有 AK/SK 时ALIYUN_LABEL找不到配对项, 别名会被忽略 —— 这种情况请用ALIYUN_TOKENPLAN_LABEL。 -
同一序号两种凭据并存时(AK/SK + Cookie),别名取
ALIYUN_LABEL(两者本就是同一账号,只出一张卡)。
别名只影响展示,不参与任何鉴权或查询。
变量叫 TOKEN 而不是 KEY,是因为这个框里要填的是系统访问令牌,
不是控制台里 sk- 开头的模型调用密钥。两者都能通过站点鉴权,但权限不同,
填错的表现是「填了却永远读不到数据」:
-
系统访问令牌(推荐):登录你的 New API 站点 →「个人设置 → 安全设置 → 系统访问令牌」→ 生成,
把整串令牌粘进
NEWAPI_TOKEN。它能读管理接口,卡片字段最完整。 官方文档:https://docs.newapi.ai/zh/docs/api/management/auth -
模型调用密钥(
sk-…,可用但不推荐):程序检测到管理接口 401 后会自动降级到 OpenAI 兼容的 账单接口(/v1/dashboard/billing/*),读数仍然正确,但拿不到用户名与按模型明细。
不同站点的 quota 计费口径不一样(美元额度 / 人民币额度 / 自定义代币),
所以读数不能一律按 $ 显示。程序会先读站点的公开接口 GET {baseUrl}/api/status
(无需鉴权),拿到单位类型与换算参数后按站点官方口径折算 ——
换算规则照抄官方 setting/operation_setting/general_setting.go 与 logger.LogQuota:
quota_display_type |
显示符号 | 换算 |
|---|---|---|
USD(站点默认) |
$ |
quota / quota_per_unit |
CNY |
¥ |
quota / quota_per_unit × usd_exchange_rate |
CUSTOM |
custom_currency_symbol |
quota / quota_per_unit × custom_currency_exchange_rate |
TOKENS |
点 |
原始 quota(不折算) |
换算因子 ≤ 0 时按 1 处理,符号为空时按 ¤ 处理。/api/status 拿不到
(站点关闭该接口或字段缺失)时按官方默认值 USD 兜底 —— 官方默认展示类型本身就是 USD。
想探测货币单位要看
/api/status;官方文档里的GET /api/pricing只有模型价格表, 不含币种信息。
-
组织/座席视图(团队版)走 ModelStudio OpenAPI(ROA + AK/SK), 只需
AliyunTokenPlanReadOnlyAccess。 -
个人版用量(5 小时/7 天窗口、订阅状态、加购包、重置卡)官方未提供 AK/SK 直调的公开接口: 实测
GET https://dashscope.aliyuncs.com/api/v1/tokenplan/*(Bearer API Key)系列当前 在网关返回空体 404(路由未注册,非鉴权失败)。项目提供两条等价通道,Cookie 优先:-
控制台会话 Cookie(推荐,开箱可用) —— 与百炼控制台页面自身的请求完全一致:
POST https://bailian-cs.console.aliyun.com/data/api.json?action=BroadScopeAspnGateway&product=sfm_bailian&api=…Cookie 鉴权。登录 https://bailian.console.aliyun.com 后,从 DevTools → Application → Cookies →
bailian.console.aliyun.com, 复制login_aliyunid_ticket的值写入ALIYUN_TOKENPLAN_COOKIE(实测仅此一个 Cookie 即可;其余 Cookie、Origin/Referer 均非必需)。 无需 AK/SK,无需任何 RAM 授权;会话过期(通常数周)后重新复制即可。 仅有该 Cookie 时也可独立使用 —— 此账号会显示「仅配置会话 Cookie」,组织/座席区块自动隐藏。 取值写法见上文「Cookie 怎么填」—— 填错会静默损坏且报错与「会话过期」同形。 -
AK/SK 通道(官方 CLI
bl usage token-plan的等价实现,原生移植、无子进程): AK/SK 以ACS3-HMAC-SHA256调用GenerateCLIAccessToken换取控制台 access token, 再经控制台网关调用zeldaHttp.apikeyMgr./tokenplan/personal/api/v2/*。 此路径需要 RAM 子用户额外授予以下自定义策略:{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": "modelstudio:GenerateCLIAccessToken", "Resource": "*" } ] }
未配置 Cookie 且未授权时,页面会在「个人版套餐用量」处给出黄色提示,组织/座席视图不受影响。
-
ALIYUN_ACCESS_KEY_ID / ALIYUN_SECRET_KEY 与 ALIYUN_TOKENPLAN_COOKIE
各管一块数据,互不替代:
| 展示内容 | 依赖的凭据 | 缺失后果 |
|---|---|---|
阿里云百炼 Token 资源包实例(/api/usage 切片) |
ALIYUN_ACCESS_KEY_ID + ALIYUN_SECRET_KEY(BSS) |
该切片返回 NOT_CONFIGURED,「资源包」区块不显示 |
| Token Plan 组织 / 座席 / 共享包 | 同上(ModelStudio ROA) | 组织/座席区块隐藏 |
| Token Plan 个人版用量 |
ALIYUN_TOKENPLAN_COOKIE(或 AK/SK + 额外 RAM 授权,Cookie 优先) |
「个人版套餐用量」处显示黄色提示 |
结论:
- 加 Cookie 不会取代 AK/SK,两者负责不同数据;相同序号视为同一账号,只出一张卡片。
- 不要把 AK/SK 删掉:删了就同时丢掉「Token 资源包」和「组织/座席」两块。
- 只配 Cookie 也能用:个人版用量可独立查询,组织/座席区块自动隐藏。
- 多账号按序号一一配对:
ALIYUN_ACCESS_KEY_ID_2与ALIYUN_TOKENPLAN_COOKIE_2指同一账号。
本仓库是公开的,且历史上曾误提交过真实令牌(已用 git filter-repo 重写全部历史清除)。
因此:
- 绝不把真实 API Key、Cookie、Token 粘进任何入库文件;举例时用占位值。
- 测试夹具里的账号 id、命名空间、代金券码必须是编造的。
- 这里贴的东西按「所有人可见」对待。
细节见
CONTRIBUTING.md
与 安全模型。