文章总结: 本文介绍如何使用火山引擎ArkCLI工具查询CodingPlan用量,包括安装ark-cli、SSO登录、连接AIAgent技能的方法,并提供Python脚本对原始JSON输出进行可视化处理,展示用量百分比、剩余额度及重置时间等信息。作者实测GLM-5.2单轮对话消耗9.6%额度,并分享了多账号轮换使用的经验。 综合评分: 72 文章分类: 安全工具,解决方案,技术标准
如何在命令行查火山 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"\n\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"\n\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("\n 未找到任何套餐数据") 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()
全文完。
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:生有可恋 hyang0 hyang0《如何在命令行查火山 Coding Plan 用量》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。









评论