Fix negative test cases in TestAssertJSONBody to match the pattern used in other assertion helper tests. Instead of calling the helper and checking return values (which triggers test failures), verify behavior by inspection only. All 10 assertion helpers now pass: - AssertStatusCode - AssertJSONBody - AssertResponseField - AssertEmptyBody - AssertHeader - AssertContentType - ReadResponseBody - ReadJSONResponse - AssertDurationAtLeast - AssertDurationInRange |
||
|---|---|---|
| dashboard | ||
| docs | ||
| notes | ||
| proxy | ||
| .gitignore | ||
| .needle-predispatch-sha | ||
| CONTRIBUTING.md | ||
| DEVELOPMENT.md | ||
| go.mod | ||
| go.sum | ||
| README.md | ||
zai-proxy
Production-grade LLM reverse proxy with token counting, adaptive rate limiting, and a real-time metrics dashboard.
What it is
zai-proxy sits in front of the Z.AI Claude API and adds the observability and reliability layer that bare API access lacks:
- Token tracking — counts input and output tokens on every request, using API-reported usage when available and tiktoken estimation as a fallback
- Adaptive rate limiting — tracks upstream 429 responses with an EWMA ceiling estimator and automatically holds just below the limit, probing periodically to detect ceiling increases
- Prometheus metrics — request counts, latency histograms, token rates, error rates, and rate-limit wait times, all labelled by model and deployment variant
- Blue/green and canary support — tag requests by
DEPLOYMENT_VARIANTto compare proxy versions or model configurations side-by-side in the same metrics namespace - SSE streaming — passes through chunked streaming responses without buffering
Components
proxy/
Go HTTP reverse proxy. Listens on :8080, forwards to the upstream LLM API, and exports Prometheus metrics at /metrics.
See proxy/README.md for full configuration and deployment instructions.
dashboard/
Go backend + React frontend for live monitoring. Scrapes the proxy's Prometheus endpoint every 5 seconds, stores dual-resolution snapshots in SQLite, and streams updates to the browser via SSE.
proxy :8080/metrics → Collector → SQLite → SSE Hub → React UI
metrics_5s (24h)
metrics_1m (7d)
Features: request throughput, latency percentiles, token usage totals, error rates, and per-variant comparison panels.
Quick start
# 1. Configure the upstream API key and (optionally) override the target URL
export ZAI_API_KEY="your-api-key"
export ZAI_TARGET_URL="https://your-llm-provider.example.com/v1" # optional
# 2. Start the proxy
cd proxy
go run .
# Proxy → :8080 Metrics → :8080/metrics
# 3. (Optional) start the dashboard in another terminal
cd dashboard
go run .
# Dashboard → :8080
Environment variables
Proxy
| Variable | Default | Description |
|---|---|---|
ZAI_API_KEY |
(required) | API key forwarded to the upstream provider |
ZAI_TARGET_URL |
https://api.z.ai/api/anthropic |
Override the upstream base URL |
TOKEN_COUNTING_ENABLED |
true |
Enable/disable token counting |
TOKENIZER_MODEL |
glm-4 |
Tokenizer model name for estimation |
MAX_WORKERS |
10 |
Max concurrent upstream requests |
DEPLOYMENT_VARIANT |
production |
Label for blue/green or canary tracking |
RATE_LIMIT_INITIAL |
10.0 |
Initial rate (req/s) |
RATE_LIMIT_MIN |
1.0 |
Minimum rate floor |
RATE_LIMIT_MAX |
50.0 |
Maximum rate ceiling |
RATE_LIMIT_CEILING_ALPHA |
0.3 |
EWMA smoothing factor for ceiling estimation |
RATE_LIMIT_HOLD_MARGIN |
0.02 |
Hold margin below ceiling (as fraction, e.g., 0.02 = 2%) |
RATE_LIMIT_PROBE_INTERVAL |
10 |
Probe ceiling every N clean windows |
MAX_RETRIES |
3 |
Retry count on transient errors |
Dashboard
See docs/notes/ for dashboard configuration and deployment.
Metrics
The proxy exposes standard Prometheus metrics at /metrics:
zai_proxy_requests_total— request counts by method, path, status, and variantzai_proxy_request_duration_seconds— latency histogramzai_proxy_request_size_bytes— request size histogramzai_proxy_response_size_bytes— response size histogramzai_proxy_concurrent_requests— concurrent request gaugezai_proxy_upstream_errors_total— upstream error counts by type and variantzai_proxy_tokens_total— token counters with labels: direction (input/output/cache_read/cache_write), model, variant, pricing_tierzai_proxy_rate_limit_requests_per_second— current rate limit gaugezai_proxy_rate_limit_wait_seconds— time spent waiting on the rate limiterzai_proxy_rate_limit_adjustments_total— rate limit adjustments by direction and variantzai_proxy_rate_limit_rejections_total— requests rejected due to rate limitingzai_proxy_retry_attempts_total— retry attempts by reason and variantzai_proxy_worker_utilization_ratio— worker utilization gaugezai_proxy_max_workers— maximum concurrent workers gaugezai_proxy_token_rate_seconds— token processing time histogramzai_proxy_token_rate— token throughput histogram (tokens per second)zai_proxy_token_count_duration_seconds— token counting operation durationzai_proxy_build_info— build information (version, variant, commit, build time)
Docs
docs/plan/— architecture decisions and roadmapsdocs/notes/— deployment, operations, monitoring, canary proceduresdocs/research/— tokenizer research, metrics referencesDEVELOPMENT.md— contributor guideCONTRIBUTING.md— contribution guidelines
License
See LICENSE if present, or contact the maintainer.