如何在命令行查火山 Coding Plan 用量
原创
hyang0
hyang0
生有可恋
2026年6月27日 09:00
湖北
在小说阅读器读本章
去阅读
火山提供了 Ark CLI 工具以及对应的 Claude Code Skill ,可以直接在 Claude Code 中查用量。
效果如下:
通过 arkcli 是可以查看所使用的 coding plan 的情况的。
不过使用前需要先通过 ark cli 登录,登录后 sso 状态会保留一段时间(47h)。
ark cli 安装:
npm install -g @volcengine/ark-cli
登录:
# 登录方式 :火山 SSO 浏览器登录 (推荐)arkcli auth login volc-sso
安装 skills :
# 装 skill 到你常用的 AI Agent (Claude Code / Cursor / trae / Gemini CLI 等)arkcli +connect
为了使用方便,我又将这个skill封了一层方便自己用。
封装好的 skill 使用效果如下:
测试了一下,底层使用的命令是:
$ arkcli usage plan
输出不是很直观:
除了使用安装的 skill ,也可以直接写一个 Python 脚本处理命令输出。
处理后的效果:
火山的 GLM-5.2 是不太够用,一轮对话差不多要用掉9.6%,查之前是0%,写了一个下面的脚本就用了周额度的1.3%,如果用的比较多的还真不够用。我两个号轮着在用,这个号用的比较少,可以作为用量参考。以后写代码都是要花钱的,古法编程不花钱。
脚本:
#!/usr/bin/env python3\"\"\"arkcli usage plan 输出封装工具方便查看 coding plan 用量\"\"\"import jsonimport subprocessimport sysfrom datetime import datetimedef get_usage_plan(): \"\"\"调用 arkcli usage plan 获取数据\"\"\" try: result = subprocess.run( [\"arkcli\", \"usage\", \"plan\", \"--format\", \"json\"], capture_output=True, text=True, check=True ) return json.loads(result.stdout) except FileNotFoundError: print(\"错误: 未找到 arkcli 命令\", file=sys.stderr) sys.exit(1) except subprocess.CalledProcessError as e: print(f\"错误: arkcli 命令执行失败\", file=sys.stderr) if e.stderr: try: err_json = json.loads(e.stderr) if err_json.get(\"error\", {}).get(\"message\"): print(f\" {err_json['error']['message']}\", file=sys.stderr) except: print(f\" {e.stderr}\", file=sys.stderr) sys.exit(1) except json.JSONDecodeError: print(\"错误: 无法解析 arkcli 输出\", file=sys.stderr) sys.exit(1)def format_timestamp(ts): \"\"\"格式化时间戳 (自动处理秒/毫秒)\"\"\" if ts == -1: return \"无数据\" try: # 判断是秒还是毫秒 if ts > 9999999999: # 大于这个值说明是毫秒 dt = datetime.fromtimestamp(ts / 1000) else: dt = datetime.fromtimestamp(ts) return dt.strftime(\"%Y-%m-%d %H:%M:%S\") except (ValueError, OSError): return \"无效时间\"def get_progress_bar(percent, width=30): \"\"\"生成进度条\"\"\" filled = int(width * percent / 100) bar = \"█\" * filled + \"░\" * (width - filled) return bardef get_percent_color(percent): \"\"\"根据百分比获取颜色代码\"\"\" if percent >= 80: return \"\\033[91m\" # 红色 elif percent >= 50: return \"\\033[93m\" # 黄色 else: return \"\\033[92m\" # 绿色def print_coding_plan(item): \"\"\"打印 Coding Plan 详情\"\"\" product_name = { \"coding-plan\": \"Coding Plan (个人版)\", \"coding-plan-team\": \"Coding Plan (团队版)\" }.get(item[\"product\"], item[\"product\"]) print(f\"\
\\033[1;34m{product_name}\\033[0m\") print(\"─\" * 60) if not item.get(\"subscribed\", False): print(\" 未订阅\") return if \"updated_at\" in item: print(f\" 数据更新: {format_timestamp(item['updated_at'])}\") print() periods = item.get(\"periods\", []) if not periods: print(\" 暂无用量数据\") return period_labels = { \"session\": \"会话周期\", \"weekly\": \"每周额度\", \"monthly\": \"每月额度\", \"5h\": \"5小时额度\" } for period in periods: label = period_labels.get(period[\"label\"], period[\"label\"]) percent = float(period.get(\"percent\", 0)) color = get_percent_color(percent) reset = \"\\033[0m\" print(f\" \\033[1m{label}\\033[0m\") print(f\" 进度: {color}{get_progress_bar(percent)} {percent:.1f}%{reset}\") if \"used\" in period and \"total\" in period: used = period[\"used\"] total = period[\"total\"] remaining = total - used print(f\" 用量: {used:,} / {total:,} (剩余: {remaining:,})\") print(f\" 重置: {format_timestamp(period.get('reset_at', -1))}\") print()def print_agent_plan(item): \"\"\"打印 Agent Plan 详情\"\"\" product_name = { \"agent-plan\": \"Agent Plan (个人版)\", \"agent-plan-team\": \"Agent Plan (团队版)\" }.get(item[\"product\"], item[\"product\"]) tier = item.get(\"tier\", \"\") if tier: product_name += f\" - {tier}\" print(f\"\
\\033[1;35m{product_name}\\033[0m\") print(\"─\" * 60) if not item.get(\"subscribed\", False): print(\" 未订阅\") return if \"seat_id\" in item: print(f\" 席位: {item['seat_id']}\") print() periods = item.get(\"periods\", []) if not periods: print(\" 暂无用量数据\") return period_labels = { \"session\": \"会话周期\", \"weekly\": \"每周额度\", \"monthly\": \"每月额度\", \"5h\": \"5小时额度\" } for period in periods: label = period_labels.get(period[\"label\"], period[\"label\"]) percent = float(period.get(\"percent\", 0)) color = get_percent_color(percent) reset = \"\\033[0m\" print(f\" \\033[1m{label}\\033[0m\") print(f\" 进度: {color}{get_progress_bar(percent)} {percent:.1f}%{reset}\") if \"used\" in period and \"total\" in period: used = period[\"used\"] total = period[\"total\"] remaining = total - used print(f\" 用量: {used:,} / {total:,} AFP (剩余: {remaining:,})\") print(f\" 重置: {format_timestamp(period.get('reset_at', -1))}\") print()def print_viewer(viewer): \"\"\"打印查看者信息\"\"\" print(\"\\033[1;36m\" + \"=\" * 60 + \"\\033[0m\") print(\"\\033[1;36mARK 套餐用量查看\\033[0m\") print(\"\\033[1;36m\" + \"=\" * 60 + \"\\033[0m\") print() print(\"\\033[1m当前身份:\\033[0m\") auth_method = viewer.get(\"auth_method\", \"unknown\") auth_display = { \"sso\": \"SSO 登录\", \"aksk\": \"AK/SK 登录\", \"apikey\": \"API Key 登录\", \"none\": \"未登录\" }.get(auth_method, auth_method) print(f\" 认证方式: {auth_display}\") if viewer.get(\"profile\"): print(f\" 当前 Profile: {viewer['profile']}\") if viewer.get(\"region\"): print(f\" 区域: {viewer['region']}\") if viewer.get(\"user_name\"): print(f\" 用户: {viewer['user_name']}\") if viewer.get(\"account_id\"): print(f\" 账号: {viewer['account_id']}\")def main(): \"\"\"主函数\"\"\" data = get_usage_plan() viewer = data.get(\"viewer\", {}) items = data.get(\"items\", []) print_viewer(viewer) if not items: print(\"\
未找到任何套餐数据\") return # 先打印 coding plan,再打印 agent plan coding_items = [i for i in items if \"coding-plan\" in i[\"product\"]] agent_items = [i for i in items if \"agent-plan\" in i[\"product\"]] for item in coding_items: print_coding_plan(item) for item in agent_items: print_agent_plan(item) print(\"─\" * 60) print()if __name__ == \"__main__\": main()
全文完。
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。









评论