Probing a live GLM Coding Plan key showed the Anthropic-compat /v1/messages
response carries NO rate-limit headers. z.ai instead exposes a dedicated status
endpoint (found via github.com/rygel/AIUsageTracker):
GET https://api.z.ai/api/monitor/usage/quota/limit
Authorization: <raw key> (no "Bearer") Accept-Language: en-US,en
-> data.limits[] of TOKENS_LIMIT windows {percentage 0-100, nextResetTime ms, unit,number}
+ data.level (plan tier)
ZaiProvider now GETs that: the shortest TOKENS_LIMIT window -> the 5h bar (s/sr),
the longest -> the weekly bar (w/wr); the monthly TIME_LIMIT (web-tool quota) is
ignored; level -> status ("Lite"/"Pro"/…), any window at 100% -> "limited". It's
a status GET, so it does NOT spend the prompt-metered plan — no self-throttle
needed, polls on the normal cadence. Monitor URL derives from the configured
base host.
Verified live: s=1% (5h, resets ~4.9h), w=2% (weekly, resets ~6.5d), st="Lite".
test_zai rewritten for the JSON envelope (9 tests). probe_zai.py repointed to the
monitor endpoint. 122 passed, 2 Linux-only failures (baseline).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
36 lines
1.1 KiB
Python
36 lines
1.1 KiB
Python
#!/usr/bin/env python3
|
|
"""One-off diagnostic for the z.ai GLM Coding Plan usage endpoint (the source
|
|
ZaiProvider reads). Dumps the raw quota JSON so the window mapping can be
|
|
checked against a live plan.
|
|
|
|
Usage (key via env so it never lands in shell history):
|
|
ZAI_API_KEY=... python tools/probe_zai.py [host]
|
|
|
|
Default host = https://api.z.ai . It's a status GET — it does NOT spend the
|
|
prompt-metered plan. The API key is read from the environment and never printed.
|
|
"""
|
|
import json
|
|
import os
|
|
import sys
|
|
|
|
import httpx
|
|
|
|
HOST = (sys.argv[1] if len(sys.argv) > 1 else "https://api.z.ai").rstrip("/")
|
|
KEY = os.environ.get("ZAI_API_KEY") or os.environ.get("ANTHROPIC_AUTH_TOKEN")
|
|
|
|
if not KEY:
|
|
sys.exit("Set ZAI_API_KEY in the environment first (it is not printed).")
|
|
|
|
url = f"{HOST}/api/monitor/usage/quota/limit"
|
|
print(f"GET {url}")
|
|
try:
|
|
resp = httpx.get(url, headers={"Authorization": KEY, "Accept-Language": "en-US,en"}, timeout=30.0)
|
|
except httpx.HTTPError as e:
|
|
sys.exit(f"request failed: {e}")
|
|
|
|
print(f"HTTP {resp.status_code}\n")
|
|
try:
|
|
print(json.dumps(resp.json(), indent=2, ensure_ascii=False))
|
|
except ValueError:
|
|
print(resp.text[:1000])
|