diff --git a/llm-provider-billing/SKILL.md b/llm-provider-billing/SKILL.md index 34a0a17..0f00efb 100644 --- a/llm-provider-billing/SKILL.md +++ b/llm-provider-billing/SKILL.md @@ -69,6 +69,7 @@ bash ~/.hermes/skills/custom/llm-provider-billing/scripts/bailian-token-plan.sh - **Console 鉴权**:首次运行前需浏览器一次性授权 `bl auth login --console --console-site domestic`(国内站) - **API Key 查不了配额**:`bl auth login --api-key ` / 环境变量里的 key(用户的是 `OPENAI_API_KEY`)只能调模型,不能查余量 - 授权凭据落盘 `~/.bailian/config.json`,登录一次长期有效;回调走本机 `127.0.0.1` 端口,浏览器必须与 CLI 同机 +- **会话有效期由服务端决定**(实测约 1 天级,bl CLI 无 TTL 参数可调,config.json 只存 36 位 opaque access_token,无 refresh token)——过期后 `bailian-token-plan.sh` **已内置自动续期**:检测到 expired 错误自动拉起 `bl auth login --console`,等回调写盘后重试查询。若本机浏览器保持阿里云「自动登录」登录态,整条链路无需人工点击 ### 返回结构(实测 2026-09-10) diff --git a/llm-provider-billing/scripts/bailian-token-plan.sh b/llm-provider-billing/scripts/bailian-token-plan.sh index 636a5e0..b3ee762 100644 --- a/llm-provider-billing/scripts/bailian-token-plan.sh +++ b/llm-provider-billing/scripts/bailian-token-plan.sh @@ -9,18 +9,71 @@ if ! command -v bl >/dev/null 2>&1; then exit 1 fi -AUTH=$(bl auth status --output json 2>/dev/null || true) -if ! echo "$AUTH" | grep -q '"authenticated": *true'; then - echo "❌ 百炼控制台未登录(API Key 只能调模型,查不了配额)。请先执行一次性授权:" >&2 - echo " bl auth login --console --console-site domestic" >&2 - exit 1 -fi +CFG_FILE="$HOME/.bailian/config.json" +# macOS / Linux 兼容的 mtime 秒数 +cfg_mtime() { + if [ -f "$CFG_FILE" ]; then + if command -v stat >/dev/null 2>&1; then + stat -f %m "$CFG_FILE" 2>/dev/null || stat -c %Y "$CFG_FILE" 2>/dev/null || echo 0 + else + echo 0 + fi + else + echo 0 + fi +} -echo "🔍 查询百炼 Token Plan 配额 ..." >&2 -if ! bl usage token-plan --output json > /tmp/bailian-token-plan.json 2>/tmp/bailian-token-plan.err; then - echo "❌ bl usage token-plan 失败:" >&2 - cat /tmp/bailian-token-plan.err >&2 - exit 1 +# 尝试查询;失败原因写入 /tmp/bailian-token-plan.err +query_token_plan() { + echo "🔍 查询百炼 Token Plan 配额 ..." >&2 + bl usage token-plan --output json > /tmp/bailian-token-plan.json 2>/tmp/bailian-token-plan.err +} + +# 控制台会话过期/未登录时自动续期:拉起浏览器授权,等 config.json 刷新,然后重试。 +# 前提:本机浏览器保持阿里云登录态(勾选「自动登录」),授权页会自动完成回调,无需点击。 +relogin_console() { + local before after mtime_before + mtime_before=$(cfg_mtime) + echo "⚠️ 控制台会话已过期/未登录,自动发起浏览器续期(15 分钟内有效)..." >&2 + bl auth login --console --console-site domestic >/tmp/bailian-relogin.log 2>&1 & + local LPID=$! + + # 最多等 150s:config.json 被刷新,或登录进程退出 + local i + for i in $(seq 1 30); do + sleep 5 + after=$(cfg_mtime) + if [ "$after" != "$mtime_before" ] && [ "$after" != "0" ]; then + wait "$LPID" 2>/dev/null || true + echo "✅ 控制台授权完成,继续查询" >&2 + return 0 + fi + if ! kill -0 "$LPID" 2>/dev/null; then + wait "$LPID" 2>/dev/null || true + break + fi + done + + # 仍然没刷新:杀掉可能残留的登录进程,提示手动完成 + kill "$LPID" 2>/dev/null || true + wait "$LPID" 2>/dev/null || true + echo "⚠️ 未检测到授权回调完成。请检查是否弹出浏览器并完成授权(保持阿里云「自动登录」可免点击),然后重跑本脚本。" >&2 + echo " 浏览器授权页若已关闭,可手动执行: bl auth login --console --console-site domestic" >&2 + return 1 +} + +if ! query_token_plan; then + if grep -qiE "not logged in|has expired|NotLogined" /tmp/bailian-token-plan.err; then + if ! relogin_console || ! query_token_plan; then + echo "❌ bl usage token-plan 仍失败:" >&2 + cat /tmp/bailian-token-plan.err >&2 + exit 1 + fi + else + echo "❌ bl usage token-plan 失败:" >&2 + cat /tmp/bailian-token-plan.err >&2 + exit 1 + fi fi cat /tmp/bailian-token-plan.json echo