From c389d452e9325c86476f211b5aa2070b97eb0bb4 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Wed, 5 Aug 2026 17:30:12 +0000 Subject: [PATCH 1/2] Add Kimi K2.6 serverless rate limiting test report Characterize adaptive TPM headers and 429 behavior for accounts/fireworks/models/kimi-k2p6 across phased, stress, and burst test scenarios. Co-authored-by: tarunipaleru --- kimi-k2p6-rate-limit-report.md | 150 +++ kimi-k2p6-rate-limit-results.json | 1344 ++++++++++++++++++++++++++ kimi-k2p6-rpm-stress.json | 270 ++++++ kimi-k2p6-stress-results.json | 20 + scripts/kimi_k2p6_rate_limit_test.py | 256 +++++ scripts/kimi_k2p6_stress_test.py | 94 ++ 6 files changed, 2134 insertions(+) create mode 100644 kimi-k2p6-rate-limit-report.md create mode 100644 kimi-k2p6-rate-limit-results.json create mode 100644 kimi-k2p6-rpm-stress.json create mode 100644 kimi-k2p6-stress-results.json create mode 100644 scripts/kimi_k2p6_rate_limit_test.py create mode 100644 scripts/kimi_k2p6_stress_test.py diff --git a/kimi-k2p6-rate-limit-report.md b/kimi-k2p6-rate-limit-report.md new file mode 100644 index 0000000..b4524d4 --- /dev/null +++ b/kimi-k2p6-rate-limit-report.md @@ -0,0 +1,150 @@ +# Kimi K2.6 Serverless Rate Limiting Test Report + +**Date:** August 5, 2026 +**Provider:** Fireworks AI (serverless) +**Model:** `accounts/fireworks/models/kimi-k2p6` +**Endpoint:** `POST https://api.fireworks.ai/inference/v1/chat/completions` + +--- + +## Executive Summary + +Kimi K2.6 on Fireworks serverless exposes **adaptive per-model token rate limits** via response headers. Under moderate parallel load (≤15 concurrent, ≤512 output tokens), all **224/224 requests succeeded** with no throttling. Under an aggressive burst of **200 tiny requests at 100-way concurrency**, **12/200 (6%) returned HTTP 429**, triggered by **generated-token TPM exhaustion** (`x-ratelimit-remaining-tokens-generated: 0`), not prompt-token or account RPM limits. + +The observed adaptive ceiling for generated tokens **dropped from 216,000 TPM to 36,000 TPM** during the burst, demonstrating the adaptive shrink behavior described in Fireworks docs. + +--- + +## Observed Rate Limit Headers + +After sustained load, all three TPM dimensions are reported: + +| Header | Observed Limit (TPM) | Docs Default Ceiling | +|--------|---------------------:|---------------------:| +| `x-ratelimit-limit-tokens-prompt` | 11,250,000 | 21,600,000 | +| `x-ratelimit-limit-tokens-cache-adjusted-prompt` | 5,400,000 | 5,400,000 | +| `x-ratelimit-limit-tokens-generated` | 216,000 → **36,000** (after burst) | 216,000 | + +Equivalent TPS (limit ÷ 60): + +| Dimension | Initial TPS | Post-burst TPS | +|-----------|------------:|---------------:| +| Total prompt | 187,500 | 187,500 | +| Uncached prompt | 90,000 | 90,000 | +| Generated | 3,600 | **600** | + +The account's effective prompt limit (11.25M TPM) is below the documented default ceiling, consistent with adaptive limits that grow with usage history. + +--- + +## Test Phases + +### Phase 1 — Characterization (74 requests, moderate load) + +| Phase | Requests | Concurrency | Success | 429 | 503 | Avg Latency | +|-------|----------|-------------|---------|-----|-----|-------------| +| Baseline single | 1 | 1 | 1/1 | 0 | 0 | 0.45s | +| Steady low parallel | 10 | 2 | 10/10 | 0 | 0 | 1.25s | +| Moderate parallel | 20 | 5 | 20/20 | 0 | 0 | 4.13s | +| Burst parallel | 30 | 15 | 30/30 | 0 | 0 | 1.73s | +| Heavy output (256 tok) | 8 | 4 | 8/8 | 0 | 0 | 5.44s | +| Recovery (2s spacing) | 5 | 1 | 5/5 | 0 | 0 | 4.64s | + +**Finding:** No throttling at ≤15 concurrency with output up to 256 tokens. Remaining-token counters decrement predictably but stay well above zero. + +### Phase 2 — Token Stress (150 requests, high concurrency) + +| Scenario | Requests | Concurrency | Success | 429 | 503 | +|----------|----------|-------------|---------|-----|-----| +| stress_50x20 | 50 | 20 | 50/50 | 0 | 0 | +| stress_100x50 | 100 | 50 | 100/100 | 0 | 0 | + +**Finding:** Even 50-way concurrent requests with 512 max output tokens did not trigger 429. Generated-token remaining stayed above zero (lowest observed: ~208,898 of 216,000). + +### Phase 3 — RPM / Generated-TPM Burst (200 requests, 100-way concurrency) + +| Metric | Value | +|--------|------:| +| Total requests | 200 | +| Concurrency | 100 | +| `max_tokens` | 1 | +| Wall time | 3.13s | +| Effective RPM | ~3,840 | +| Success (200) | 188 (94%) | +| Throttled (429) | 12 (6%) | +| Load shed (503) | 0 | + +**429 trigger condition:** + +``` +x-ratelimit-remaining-tokens-generated: 0 +x-ratelimit-limit-tokens-generated: 36000 (shrunk from 216000) +x-ratelimit-over-limit: no (still reports "no") +``` + +**429 error body:** + +```json +{ + "object": "error", + "type": "invalid_request_error", + "code": "invalid_request_error", + "message": "rate limit exceeded, please try again later" +} +``` + +First 429 appeared at request index 18 (~0.23s into the burst). All 429 responses returned in <260ms (fail-fast, no queueing). + +--- + +## Key Findings + +### 1. Generated TPM Is the First Bottleneck for Burst Traffic + +When firing many concurrent requests with even minimal output (`max_tokens=1`), the **generated-token bucket exhausts first**. Prompt-token remaining stayed above 11.2M (of 11.25M limit) at the time of 429s. + +### 2. Adaptive Limits Shrink Under Burst + +The generated-token limit dropped from **216,000 → 36,000 TPM** (6× reduction) during the burst test. This matches Fireworks' documented adaptive behavior: limits grow and shrink based on usage patterns; ramping too quickly causes 429s. + +### 3. `x-ratelimit-over-limit: no` on 429 Responses + +Even when returning HTTP 429, the `x-ratelimit-over-limit` header remained `"no"`. Clients should treat **HTTP status code 429** and **`remaining-tokens-*: 0`** as the authoritative throttle signals, not the over-limit flag alone. + +### 4. No 503 Load Shedding Observed + +Across 374 total requests, zero `503 Service Overloaded` responses were observed. Throttling manifested exclusively as 429 rate-limit errors. + +### 5. Account RPM Limit Not Hit + +Peak effective throughput was ~3,840 RPM, well below the documented 6,000 RPM account-wide ceiling. The 429s in Phase 3 were token-bucket driven, not request-count driven. + +--- + +## Recommendations for Kimi K2.6 Clients + +1. **Always set `max_tokens` explicitly** — Kimi K2.6 can produce long reasoning traces; unbounded output accelerates generated-TPM consumption. +2. **Use exponential backoff on 429** — Fail-fast responses (<300ms) indicate bucket exhaustion; retry after a brief delay. +3. **Monitor all three header dimensions** — Track `remaining-tokens-prompt`, `remaining-tokens-cache-adjusted-prompt`, and `remaining-tokens-generated`. +4. **Ramp concurrency gradually** — Jumping to 50–100 concurrent requests causes adaptive limit shrink and 429s even when per-request token usage is tiny. +5. **Separate rate-limit from load-shed** — 429 = token/RPM bucket; 503 = deployment saturation. Different remediation strategies apply. + +--- + +## Artifacts + +| File | Description | +|------|-------------| +| `scripts/kimi_k2p6_rate_limit_test.py` | Phased characterization test harness | +| `scripts/kimi_k2p6_stress_test.py` | High-concurrency token stress test | +| `kimi-k2p6-rate-limit-results.json` | Raw results from Phase 1 | +| `kimi-k2p6-stress-results.json` | Raw results from Phase 2 | +| `kimi-k2p6-rpm-stress.json` | Raw results from Phase 3 burst | + +--- + +## References + +- [Fireworks Serverless Rate Limits](https://docs.fireworks.ai/serverless/rate-limits) +- [Account Quotas & RPM Limits](https://docs.fireworks.ai/guides/quotas_usage/account-quotas) +- [Kimi K2 Family on Fireworks](https://docs.fireworks.ai/models/kimi-k2) diff --git a/kimi-k2p6-rate-limit-results.json b/kimi-k2p6-rate-limit-results.json new file mode 100644 index 0000000..51db3df --- /dev/null +++ b/kimi-k2p6-rate-limit-results.json @@ -0,0 +1,1344 @@ +{ + "model": "accounts/fireworks/models/kimi-k2p6", + "timestamp_utc": "2026-08-05T17:26:41Z", + "phases": { + "baseline_single": { + "total": 1, + "status_counts": { + "200": 1 + }, + "success_rate": 1.0, + "latency_s": { + "min": 0.4495302739999829, + "max": 0.4495302739999829, + "mean": 0.4495302739999829, + "p50": 0.4495302739999829 + }, + "latest_rate_limit_headers": { + "x-ratelimit-limit-tokens-prompt": "11250000", + "x-ratelimit-remaining-tokens-prompt": "11249984", + "x-ratelimit-over-limit": "no" + }, + "first_429_index": null, + "first_503_index": null, + "sample_errors": [] + }, + "steady_low_parallel": { + "total": 10, + "status_counts": { + "200": 10 + }, + "success_rate": 1.0, + "latency_s": { + "min": 0.8768106880000062, + "max": 1.7742476210000007, + "mean": 1.246523089100006, + "p50": 1.2186630235000138 + }, + "latest_rate_limit_headers": { + "x-ratelimit-limit-tokens-prompt": "11250000", + "x-ratelimit-remaining-tokens-prompt": "11249981", + "x-ratelimit-over-limit": "no" + }, + "first_429_index": null, + "first_503_index": null, + "sample_errors": [] + }, + "moderate_parallel": { + "total": 20, + "status_counts": { + "200": 20 + }, + "success_rate": 1.0, + "latency_s": { + "min": 1.969659390000004, + "max": 13.489280185000013, + "mean": 4.133620091849998, + "p50": 2.4672788430000026 + }, + "latest_rate_limit_headers": { + "x-ratelimit-limit-tokens-prompt": "11250000", + "x-ratelimit-limit-tokens-cache-adjusted-prompt": "5400000", + "x-ratelimit-limit-tokens-generated": "216000", + "x-ratelimit-remaining-tokens-prompt": "11246712", + "x-ratelimit-remaining-tokens-cache-adjusted-prompt": "5397325", + "x-ratelimit-remaining-tokens-generated": "213145", + "x-ratelimit-over-limit": "no" + }, + "first_429_index": null, + "first_503_index": null, + "sample_errors": [] + }, + "burst_parallel": { + "total": 30, + "status_counts": { + "200": 30 + }, + "success_rate": 1.0, + "latency_s": { + "min": 0.9237531930000102, + "max": 5.309711937000003, + "mean": 1.7330934568333343, + "p50": 1.2951424485000018 + }, + "latest_rate_limit_headers": { + "x-ratelimit-limit-tokens-prompt": "11250000", + "x-ratelimit-remaining-tokens-prompt": "11246421", + "x-ratelimit-over-limit": "no" + }, + "first_429_index": null, + "first_503_index": null, + "sample_errors": [] + }, + "heavy_output": { + "total": 8, + "status_counts": { + "200": 8 + }, + "success_rate": 1.0, + "latency_s": { + "min": 3.6082314209999993, + "max": 8.83252007499999, + "mean": 5.444448210249995, + "p50": 4.831071655499997 + }, + "latest_rate_limit_headers": { + "x-ratelimit-limit-tokens-prompt": "11250000", + "x-ratelimit-limit-tokens-cache-adjusted-prompt": "5400000", + "x-ratelimit-limit-tokens-generated": "216000", + "x-ratelimit-remaining-tokens-prompt": "11246402", + "x-ratelimit-remaining-tokens-cache-adjusted-prompt": "5397037", + "x-ratelimit-remaining-tokens-generated": "208898", + "x-ratelimit-over-limit": "no" + }, + "first_429_index": null, + "first_503_index": null, + "sample_errors": [] + }, + "recovery_wait": { + "total": 5, + "status_counts": { + "200": 5 + }, + "success_rate": 1.0, + "latency_s": { + "min": 0.7583341669999868, + "max": 6.704704643000014, + "mean": 4.639633552999999, + "p50": 4.8563677970000185 + }, + "latest_rate_limit_headers": { + "x-ratelimit-limit-tokens-prompt": "11250000", + "x-ratelimit-limit-tokens-cache-adjusted-prompt": "5400000", + "x-ratelimit-limit-tokens-generated": "216000", + "x-ratelimit-remaining-tokens-prompt": "11245059", + "x-ratelimit-remaining-tokens-cache-adjusted-prompt": "5396694", + "x-ratelimit-remaining-tokens-generated": "209111", + "x-ratelimit-over-limit": "no" + }, + "first_429_index": null, + "first_503_index": null, + "sample_errors": [] + } + }, + "raw_results": [ + { + "phase": "baseline_single", + "index": 0, + "status_code": 200, + "latency_s": 0.4495302739999829, + "prompt_tokens": 16, + "completion_tokens": 16, + "error": null, + "headers": { + "x-ratelimit-limit-tokens-prompt": "11250000", + "x-ratelimit-remaining-tokens-prompt": "11249984", + "x-ratelimit-over-limit": "no" + } + }, + { + "phase": "steady_low_parallel", + "index": 0, + "status_code": 200, + "latency_s": 1.7430589570000166, + "prompt_tokens": 19, + "completion_tokens": 64, + "error": null, + "headers": { + "x-ratelimit-limit-tokens-prompt": "11250000", + "x-ratelimit-remaining-tokens-prompt": "11249981", + "x-ratelimit-over-limit": "no" + } + }, + { + "phase": "steady_low_parallel", + "index": 1, + "status_code": 200, + "latency_s": 1.7742476210000007, + "prompt_tokens": 19, + "completion_tokens": 64, + "error": null, + "headers": { + "x-ratelimit-limit-tokens-prompt": "11250000", + "x-ratelimit-remaining-tokens-prompt": "11249962", + "x-ratelimit-over-limit": "no" + } + }, + { + "phase": "steady_low_parallel", + "index": 2, + "status_code": 200, + "latency_s": 0.9262403500000005, + "prompt_tokens": 19, + "completion_tokens": 64, + "error": null, + "headers": { + "x-ratelimit-limit-tokens-prompt": "11250000", + "x-ratelimit-limit-tokens-cache-adjusted-prompt": "5400000", + "x-ratelimit-remaining-tokens-prompt": "11249891", + "x-ratelimit-remaining-tokens-cache-adjusted-prompt": "5399910", + "x-ratelimit-over-limit": "no" + } + }, + { + "phase": "steady_low_parallel", + "index": 3, + "status_code": 200, + "latency_s": 0.8847273050000126, + "prompt_tokens": 19, + "completion_tokens": 64, + "error": null, + "headers": { + "x-ratelimit-limit-tokens-prompt": "11250000", + "x-ratelimit-remaining-tokens-prompt": "11249981", + "x-ratelimit-over-limit": "no" + } + }, + { + "phase": "steady_low_parallel", + "index": 4, + "status_code": 200, + "latency_s": 0.8768106880000062, + "prompt_tokens": 19, + "completion_tokens": 64, + "error": null, + "headers": { + "x-ratelimit-limit-tokens-prompt": "11250000", + "x-ratelimit-limit-tokens-cache-adjusted-prompt": "5400000", + "x-ratelimit-remaining-tokens-prompt": "11249872", + "x-ratelimit-remaining-tokens-cache-adjusted-prompt": "5399891", + "x-ratelimit-over-limit": "no" + } + }, + { + "phase": "steady_low_parallel", + "index": 5, + "status_code": 200, + "latency_s": 0.9169327669999916, + "prompt_tokens": 19, + "completion_tokens": 64, + "error": null, + "headers": { + "x-ratelimit-limit-tokens-prompt": "11250000", + "x-ratelimit-limit-tokens-cache-adjusted-prompt": "5400000", + "x-ratelimit-remaining-tokens-prompt": "11249853", + "x-ratelimit-remaining-tokens-cache-adjusted-prompt": "5399891", + "x-ratelimit-over-limit": "no" + } + }, + { + "phase": "steady_low_parallel", + "index": 6, + "status_code": 200, + "latency_s": 1.2291536480000218, + "prompt_tokens": 19, + "completion_tokens": 64, + "error": null, + "headers": { + "x-ratelimit-limit-tokens-prompt": "11250000", + "x-ratelimit-limit-tokens-cache-adjusted-prompt": "5400000", + "x-ratelimit-limit-tokens-generated": "216000", + "x-ratelimit-remaining-tokens-prompt": "11249929", + "x-ratelimit-remaining-tokens-cache-adjusted-prompt": "5399948", + "x-ratelimit-remaining-tokens-generated": "215706", + "x-ratelimit-over-limit": "no" + } + }, + { + "phase": "steady_low_parallel", + "index": 7, + "status_code": 200, + "latency_s": 1.2081723990000057, + "prompt_tokens": 19, + "completion_tokens": 64, + "error": null, + "headers": { + "x-ratelimit-limit-tokens-prompt": "11250000", + "x-ratelimit-limit-tokens-cache-adjusted-prompt": "5400000", + "x-ratelimit-limit-tokens-generated": "216000", + "x-ratelimit-remaining-tokens-prompt": "11249796", + "x-ratelimit-remaining-tokens-cache-adjusted-prompt": "5399948", + "x-ratelimit-remaining-tokens-generated": "215706", + "x-ratelimit-over-limit": "no" + } + }, + { + "phase": "steady_low_parallel", + "index": 8, + "status_code": 200, + "latency_s": 1.3116970739999942, + "prompt_tokens": 19, + "completion_tokens": 64, + "error": null, + "headers": { + "x-ratelimit-limit-tokens-prompt": "11250000", + "x-ratelimit-limit-tokens-cache-adjusted-prompt": "5400000", + "x-ratelimit-limit-tokens-generated": "216000", + "x-ratelimit-remaining-tokens-prompt": "11249777", + "x-ratelimit-remaining-tokens-cache-adjusted-prompt": "5399869", + "x-ratelimit-remaining-tokens-generated": "215706", + "x-ratelimit-over-limit": "no" + } + }, + { + "phase": "steady_low_parallel", + "index": 9, + "status_code": 200, + "latency_s": 1.5941900820000114, + "prompt_tokens": 19, + "completion_tokens": 64, + "error": null, + "headers": { + "x-ratelimit-limit-tokens-prompt": "11250000", + "x-ratelimit-remaining-tokens-prompt": "11249981", + "x-ratelimit-over-limit": "no" + } + }, + { + "phase": "moderate_parallel", + "index": 0, + "status_code": 200, + "latency_s": 2.112493157999978, + "prompt_tokens": 21, + "completion_tokens": 128, + "error": null, + "headers": { + "x-ratelimit-limit-tokens-prompt": "11250000", + "x-ratelimit-limit-tokens-cache-adjusted-prompt": "5400000", + "x-ratelimit-limit-tokens-generated": "216000", + "x-ratelimit-remaining-tokens-prompt": "11249756", + "x-ratelimit-remaining-tokens-cache-adjusted-prompt": "5399860", + "x-ratelimit-remaining-tokens-generated": "215130", + "x-ratelimit-over-limit": "no" + } + }, + { + "phase": "moderate_parallel", + "index": 1, + "status_code": 200, + "latency_s": 2.0788152279999963, + "prompt_tokens": 21, + "completion_tokens": 128, + "error": null, + "headers": { + "x-ratelimit-limit-tokens-prompt": "11250000", + "x-ratelimit-limit-tokens-cache-adjusted-prompt": "5400000", + "x-ratelimit-limit-tokens-generated": "216000", + "x-ratelimit-remaining-tokens-prompt": "11249735", + "x-ratelimit-remaining-tokens-cache-adjusted-prompt": "5399860", + "x-ratelimit-remaining-tokens-generated": "215130", + "x-ratelimit-over-limit": "no" + } + }, + { + "phase": "moderate_parallel", + "index": 2, + "status_code": 200, + "latency_s": 13.457547730999977, + "prompt_tokens": 21, + "completion_tokens": 128, + "error": null, + "headers": { + "x-ratelimit-limit-tokens-prompt": "11250000", + "x-ratelimit-remaining-tokens-prompt": "11249958", + "x-ratelimit-over-limit": "no" + } + }, + { + "phase": "moderate_parallel", + "index": 3, + "status_code": 200, + "latency_s": 13.489280185000013, + "prompt_tokens": 21, + "completion_tokens": 128, + "error": null, + "headers": { + "x-ratelimit-limit-tokens-prompt": "11250000", + "x-ratelimit-remaining-tokens-prompt": "11249979", + "x-ratelimit-over-limit": "no" + } + }, + { + "phase": "moderate_parallel", + "index": 4, + "status_code": 200, + "latency_s": 1.969659390000004, + "prompt_tokens": 21, + "completion_tokens": 128, + "error": null, + "headers": { + "x-ratelimit-limit-tokens-prompt": "11250000", + "x-ratelimit-limit-tokens-cache-adjusted-prompt": "5400000", + "x-ratelimit-limit-tokens-generated": "216000", + "x-ratelimit-remaining-tokens-prompt": "11249714", + "x-ratelimit-remaining-tokens-cache-adjusted-prompt": "5399860", + "x-ratelimit-remaining-tokens-generated": "215130", + "x-ratelimit-over-limit": "no" + } + }, + { + "phase": "moderate_parallel", + "index": 5, + "status_code": 200, + "latency_s": 11.484700843000013, + "prompt_tokens": 21, + "completion_tokens": 128, + "error": null, + "headers": { + "x-ratelimit-limit-tokens-prompt": "11250000", + "x-ratelimit-remaining-tokens-prompt": "11249632", + "x-ratelimit-over-limit": "no" + } + }, + { + "phase": "moderate_parallel", + "index": 6, + "status_code": 200, + "latency_s": 2.724387605000004, + "prompt_tokens": 21, + "completion_tokens": 128, + "error": null, + "headers": { + "x-ratelimit-limit-tokens-prompt": "11250000", + "x-ratelimit-remaining-tokens-prompt": "11249958", + "x-ratelimit-over-limit": "no" + } + }, + { + "phase": "moderate_parallel", + "index": 7, + "status_code": 200, + "latency_s": 2.5724797000000024, + "prompt_tokens": 21, + "completion_tokens": 128, + "error": null, + "headers": { + "x-ratelimit-limit-tokens-prompt": "11250000", + "x-ratelimit-remaining-tokens-prompt": "11249979", + "x-ratelimit-over-limit": "no" + } + }, + { + "phase": "moderate_parallel", + "index": 8, + "status_code": 200, + "latency_s": 7.027807866999979, + "prompt_tokens": 21, + "completion_tokens": 128, + "error": null, + "headers": { + "x-ratelimit-limit-tokens-prompt": "11250000", + "x-ratelimit-limit-tokens-cache-adjusted-prompt": "5400000", + "x-ratelimit-limit-tokens-generated": "216000", + "x-ratelimit-remaining-tokens-prompt": "11249569", + "x-ratelimit-remaining-tokens-cache-adjusted-prompt": "5399745", + "x-ratelimit-remaining-tokens-generated": "214482", + "x-ratelimit-over-limit": "no" + } + }, + { + "phase": "moderate_parallel", + "index": 9, + "status_code": 200, + "latency_s": 2.3967286900000033, + "prompt_tokens": 21, + "completion_tokens": 128, + "error": null, + "headers": { + "x-ratelimit-limit-tokens-prompt": "11250000", + "x-ratelimit-remaining-tokens-prompt": "11249979", + "x-ratelimit-over-limit": "no" + } + }, + { + "phase": "moderate_parallel", + "index": 10, + "status_code": 200, + "latency_s": 2.073006573999976, + "prompt_tokens": 21, + "completion_tokens": 128, + "error": null, + "headers": { + "x-ratelimit-limit-tokens-prompt": "11250000", + "x-ratelimit-limit-tokens-cache-adjusted-prompt": "5400000", + "x-ratelimit-limit-tokens-generated": "216000", + "x-ratelimit-remaining-tokens-prompt": "11249653", + "x-ratelimit-remaining-tokens-cache-adjusted-prompt": "5399787", + "x-ratelimit-remaining-tokens-generated": "214682", + "x-ratelimit-over-limit": "no" + } + }, + { + "phase": "moderate_parallel", + "index": 11, + "status_code": 200, + "latency_s": 2.157902584999988, + "prompt_tokens": 21, + "completion_tokens": 128, + "error": null, + "headers": { + "x-ratelimit-limit-tokens-prompt": "11250000", + "x-ratelimit-limit-tokens-cache-adjusted-prompt": "5400000", + "x-ratelimit-limit-tokens-generated": "216000", + "x-ratelimit-remaining-tokens-prompt": "11249156", + "x-ratelimit-remaining-tokens-cache-adjusted-prompt": "5399370", + "x-ratelimit-remaining-tokens-generated": "214194", + "x-ratelimit-over-limit": "no" + } + }, + { + "phase": "moderate_parallel", + "index": 12, + "status_code": 200, + "latency_s": 2.537828996000002, + "prompt_tokens": 21, + "completion_tokens": 128, + "error": null, + "headers": { + "x-ratelimit-limit-tokens-prompt": "11250000", + "x-ratelimit-limit-tokens-cache-adjusted-prompt": "5400000", + "x-ratelimit-limit-tokens-generated": "216000", + "x-ratelimit-remaining-tokens-prompt": "11249166", + "x-ratelimit-remaining-tokens-cache-adjusted-prompt": "5399387", + "x-ratelimit-remaining-tokens-generated": "214281", + "x-ratelimit-over-limit": "no" + } + }, + { + "phase": "moderate_parallel", + "index": 13, + "status_code": 200, + "latency_s": 2.110844061999984, + "prompt_tokens": 21, + "completion_tokens": 128, + "error": null, + "headers": { + "x-ratelimit-limit-tokens-prompt": "11250000", + "x-ratelimit-limit-tokens-cache-adjusted-prompt": "5400000", + "x-ratelimit-limit-tokens-generated": "216000", + "x-ratelimit-remaining-tokens-prompt": "11249171", + "x-ratelimit-remaining-tokens-cache-adjusted-prompt": "5399387", + "x-ratelimit-remaining-tokens-generated": "214006", + "x-ratelimit-over-limit": "no" + } + }, + { + "phase": "moderate_parallel", + "index": 14, + "status_code": 200, + "latency_s": 2.8061243049999973, + "prompt_tokens": 21, + "completion_tokens": 128, + "error": null, + "headers": { + "x-ratelimit-limit-tokens-prompt": "11250000", + "x-ratelimit-limit-tokens-cache-adjusted-prompt": "5400000", + "x-ratelimit-limit-tokens-generated": "216000", + "x-ratelimit-remaining-tokens-prompt": "11249154", + "x-ratelimit-remaining-tokens-cache-adjusted-prompt": "5399410", + "x-ratelimit-remaining-tokens-generated": "214006", + "x-ratelimit-over-limit": "no" + } + }, + { + "phase": "moderate_parallel", + "index": 15, + "status_code": 200, + "latency_s": 2.8343422460000056, + "prompt_tokens": 21, + "completion_tokens": 128, + "error": null, + "headers": { + "x-ratelimit-limit-tokens-prompt": "11250000", + "x-ratelimit-limit-tokens-cache-adjusted-prompt": "5400000", + "x-ratelimit-limit-tokens-generated": "216000", + "x-ratelimit-remaining-tokens-prompt": "11249173", + "x-ratelimit-remaining-tokens-cache-adjusted-prompt": "5399382", + "x-ratelimit-remaining-tokens-generated": "214114", + "x-ratelimit-over-limit": "no" + } + }, + { + "phase": "moderate_parallel", + "index": 16, + "status_code": 200, + "latency_s": 2.540057544000007, + "prompt_tokens": 21, + "completion_tokens": 128, + "error": null, + "headers": { + "x-ratelimit-limit-tokens-prompt": "11250000", + "x-ratelimit-limit-tokens-cache-adjusted-prompt": "5400000", + "x-ratelimit-limit-tokens-generated": "216000", + "x-ratelimit-remaining-tokens-prompt": "11249152", + "x-ratelimit-remaining-tokens-cache-adjusted-prompt": "5399382", + "x-ratelimit-remaining-tokens-generated": "214114", + "x-ratelimit-over-limit": "no" + } + }, + { + "phase": "moderate_parallel", + "index": 17, + "status_code": 200, + "latency_s": 2.0378839930000083, + "prompt_tokens": 21, + "completion_tokens": 128, + "error": null, + "headers": { + "x-ratelimit-limit-tokens-prompt": "11250000", + "x-ratelimit-limit-tokens-cache-adjusted-prompt": "5400000", + "x-ratelimit-limit-tokens-generated": "216000", + "x-ratelimit-remaining-tokens-prompt": "11249593", + "x-ratelimit-remaining-tokens-cache-adjusted-prompt": "5399357", + "x-ratelimit-remaining-tokens-generated": "214251", + "x-ratelimit-over-limit": "no" + } + }, + { + "phase": "moderate_parallel", + "index": 18, + "status_code": 200, + "latency_s": 2.1159235450000153, + "prompt_tokens": 21, + "completion_tokens": 128, + "error": null, + "headers": { + "x-ratelimit-limit-tokens-prompt": "11250000", + "x-ratelimit-limit-tokens-cache-adjusted-prompt": "5400000", + "x-ratelimit-limit-tokens-generated": "216000", + "x-ratelimit-remaining-tokens-prompt": "11246730", + "x-ratelimit-remaining-tokens-cache-adjusted-prompt": "5399357", + "x-ratelimit-remaining-tokens-generated": "214251", + "x-ratelimit-over-limit": "no" + } + }, + { + "phase": "moderate_parallel", + "index": 19, + "status_code": 200, + "latency_s": 2.1445875900000146, + "prompt_tokens": 21, + "completion_tokens": 128, + "error": null, + "headers": { + "x-ratelimit-limit-tokens-prompt": "11250000", + "x-ratelimit-limit-tokens-cache-adjusted-prompt": "5400000", + "x-ratelimit-limit-tokens-generated": "216000", + "x-ratelimit-remaining-tokens-prompt": "11246712", + "x-ratelimit-remaining-tokens-cache-adjusted-prompt": "5397325", + "x-ratelimit-remaining-tokens-generated": "213145", + "x-ratelimit-over-limit": "no" + } + }, + { + "phase": "burst_parallel", + "index": 0, + "status_code": 200, + "latency_s": 0.9237531930000102, + "prompt_tokens": 15, + "completion_tokens": 64, + "error": null, + "headers": { + "x-ratelimit-limit-tokens-prompt": "11250000", + "x-ratelimit-remaining-tokens-prompt": "11249970", + "x-ratelimit-over-limit": "no" + } + }, + { + "phase": "burst_parallel", + "index": 1, + "status_code": 200, + "latency_s": 1.3765895720000003, + "prompt_tokens": 15, + "completion_tokens": 64, + "error": null, + "headers": { + "x-ratelimit-limit-tokens-prompt": "11250000", + "x-ratelimit-limit-tokens-cache-adjusted-prompt": "5400000", + "x-ratelimit-limit-tokens-generated": "216000", + "x-ratelimit-remaining-tokens-prompt": "11246784", + "x-ratelimit-remaining-tokens-cache-adjusted-prompt": "5397349", + "x-ratelimit-remaining-tokens-generated": "212498", + "x-ratelimit-over-limit": "no" + } + }, + { + "phase": "burst_parallel", + "index": 2, + "status_code": 200, + "latency_s": 1.5193182350000143, + "prompt_tokens": 15, + "completion_tokens": 64, + "error": null, + "headers": { + "x-ratelimit-limit-tokens-prompt": "11250000", + "x-ratelimit-limit-tokens-cache-adjusted-prompt": "5400000", + "x-ratelimit-limit-tokens-generated": "216000", + "x-ratelimit-remaining-tokens-prompt": "11249163", + "x-ratelimit-remaining-tokens-cache-adjusted-prompt": "5399360", + "x-ratelimit-remaining-tokens-generated": "212907", + "x-ratelimit-over-limit": "no" + } + }, + { + "phase": "burst_parallel", + "index": 3, + "status_code": 200, + "latency_s": 0.9528534089999994, + "prompt_tokens": 15, + "completion_tokens": 64, + "error": null, + "headers": { + "x-ratelimit-limit-tokens-prompt": "11250000", + "x-ratelimit-remaining-tokens-prompt": "11249955", + "x-ratelimit-over-limit": "no" + } + }, + { + "phase": "burst_parallel", + "index": 4, + "status_code": 200, + "latency_s": 0.9517804159999912, + "prompt_tokens": 15, + "completion_tokens": 64, + "error": null, + "headers": { + "x-ratelimit-limit-tokens-prompt": "11250000", + "x-ratelimit-remaining-tokens-prompt": "11249985", + "x-ratelimit-over-limit": "no" + } + }, + { + "phase": "burst_parallel", + "index": 5, + "status_code": 200, + "latency_s": 1.4148320680000097, + "prompt_tokens": 15, + "completion_tokens": 64, + "error": null, + "headers": { + "x-ratelimit-limit-tokens-prompt": "11250000", + "x-ratelimit-limit-tokens-cache-adjusted-prompt": "5400000", + "x-ratelimit-limit-tokens-generated": "216000", + "x-ratelimit-remaining-tokens-prompt": "11246754", + "x-ratelimit-remaining-tokens-cache-adjusted-prompt": "5397349", + "x-ratelimit-remaining-tokens-generated": "212498", + "x-ratelimit-over-limit": "no" + } + }, + { + "phase": "burst_parallel", + "index": 6, + "status_code": 200, + "latency_s": 1.1147605699999872, + "prompt_tokens": 15, + "completion_tokens": 64, + "error": null, + "headers": { + "x-ratelimit-limit-tokens-prompt": "11250000", + "x-ratelimit-limit-tokens-cache-adjusted-prompt": "5400000", + "x-ratelimit-limit-tokens-generated": "216000", + "x-ratelimit-remaining-tokens-prompt": "11246785", + "x-ratelimit-remaining-tokens-cache-adjusted-prompt": "5397326", + "x-ratelimit-remaining-tokens-generated": "212341", + "x-ratelimit-over-limit": "no" + } + }, + { + "phase": "burst_parallel", + "index": 7, + "status_code": 200, + "latency_s": 1.4158787460000042, + "prompt_tokens": 15, + "completion_tokens": 64, + "error": null, + "headers": { + "x-ratelimit-limit-tokens-prompt": "11250000", + "x-ratelimit-limit-tokens-cache-adjusted-prompt": "5400000", + "x-ratelimit-limit-tokens-generated": "216000", + "x-ratelimit-remaining-tokens-prompt": "11246769", + "x-ratelimit-remaining-tokens-cache-adjusted-prompt": "5397349", + "x-ratelimit-remaining-tokens-generated": "212498", + "x-ratelimit-over-limit": "no" + } + }, + { + "phase": "burst_parallel", + "index": 8, + "status_code": 200, + "latency_s": 1.1494519590000039, + "prompt_tokens": 15, + "completion_tokens": 64, + "error": null, + "headers": { + "x-ratelimit-limit-tokens-prompt": "11250000", + "x-ratelimit-limit-tokens-cache-adjusted-prompt": "5400000", + "x-ratelimit-limit-tokens-generated": "216000", + "x-ratelimit-remaining-tokens-prompt": "11246770", + "x-ratelimit-remaining-tokens-cache-adjusted-prompt": "5397326", + "x-ratelimit-remaining-tokens-generated": "212341", + "x-ratelimit-over-limit": "no" + } + }, + { + "phase": "burst_parallel", + "index": 9, + "status_code": 200, + "latency_s": 1.2462186180000003, + "prompt_tokens": 15, + "completion_tokens": 64, + "error": null, + "headers": { + "x-ratelimit-limit-tokens-prompt": "11250000", + "x-ratelimit-limit-tokens-cache-adjusted-prompt": "5400000", + "x-ratelimit-limit-tokens-generated": "216000", + "x-ratelimit-remaining-tokens-prompt": "11246800", + "x-ratelimit-remaining-tokens-cache-adjusted-prompt": "5397326", + "x-ratelimit-remaining-tokens-generated": "212341", + "x-ratelimit-over-limit": "no" + } + }, + { + "phase": "burst_parallel", + "index": 10, + "status_code": 200, + "latency_s": 1.1293881349999992, + "prompt_tokens": 15, + "completion_tokens": 64, + "error": null, + "headers": { + "x-ratelimit-limit-tokens-prompt": "11250000", + "x-ratelimit-remaining-tokens-prompt": "11249970", + "x-ratelimit-over-limit": "no" + } + }, + { + "phase": "burst_parallel", + "index": 11, + "status_code": 200, + "latency_s": 1.6545148459999837, + "prompt_tokens": 15, + "completion_tokens": 64, + "error": null, + "headers": { + "x-ratelimit-limit-tokens-prompt": "11250000", + "x-ratelimit-limit-tokens-cache-adjusted-prompt": "5400000", + "x-ratelimit-limit-tokens-generated": "216000", + "x-ratelimit-remaining-tokens-prompt": "11249148", + "x-ratelimit-remaining-tokens-cache-adjusted-prompt": "5399360", + "x-ratelimit-remaining-tokens-generated": "212907", + "x-ratelimit-over-limit": "no" + } + }, + { + "phase": "burst_parallel", + "index": 12, + "status_code": 200, + "latency_s": 1.0952261200000066, + "prompt_tokens": 15, + "completion_tokens": 64, + "error": null, + "headers": { + "x-ratelimit-limit-tokens-prompt": "11250000", + "x-ratelimit-remaining-tokens-prompt": "11249955", + "x-ratelimit-over-limit": "no" + } + }, + { + "phase": "burst_parallel", + "index": 13, + "status_code": 200, + "latency_s": 1.0968196240000054, + "prompt_tokens": 15, + "completion_tokens": 64, + "error": null, + "headers": { + "x-ratelimit-limit-tokens-prompt": "11250000", + "x-ratelimit-remaining-tokens-prompt": "11249985", + "x-ratelimit-over-limit": "no" + } + }, + { + "phase": "burst_parallel", + "index": 14, + "status_code": 200, + "latency_s": 1.6555409970000028, + "prompt_tokens": 15, + "completion_tokens": 64, + "error": null, + "headers": { + "x-ratelimit-limit-tokens-prompt": "11250000", + "x-ratelimit-limit-tokens-cache-adjusted-prompt": "5400000", + "x-ratelimit-limit-tokens-generated": "216000", + "x-ratelimit-remaining-tokens-prompt": "11249133", + "x-ratelimit-remaining-tokens-cache-adjusted-prompt": "5399360", + "x-ratelimit-remaining-tokens-generated": "212907", + "x-ratelimit-over-limit": "no" + } + }, + { + "phase": "burst_parallel", + "index": 15, + "status_code": 200, + "latency_s": 2.139889748999991, + "prompt_tokens": 15, + "completion_tokens": 64, + "error": null, + "headers": { + "x-ratelimit-limit-tokens-prompt": "11250000", + "x-ratelimit-remaining-tokens-prompt": "11249985", + "x-ratelimit-over-limit": "no" + } + }, + { + "phase": "burst_parallel", + "index": 16, + "status_code": 200, + "latency_s": 2.092999118999984, + "prompt_tokens": 15, + "completion_tokens": 64, + "error": null, + "headers": { + "x-ratelimit-limit-tokens-prompt": "11250000", + "x-ratelimit-remaining-tokens-prompt": "11249955", + "x-ratelimit-over-limit": "no" + } + }, + { + "phase": "burst_parallel", + "index": 17, + "status_code": 200, + "latency_s": 2.086777927000014, + "prompt_tokens": 15, + "completion_tokens": 64, + "error": null, + "headers": { + "x-ratelimit-limit-tokens-prompt": "11250000", + "x-ratelimit-remaining-tokens-prompt": "11249970", + "x-ratelimit-over-limit": "no" + } + }, + { + "phase": "burst_parallel", + "index": 18, + "status_code": 200, + "latency_s": 1.144329980000009, + "prompt_tokens": 15, + "completion_tokens": 64, + "error": null, + "headers": { + "x-ratelimit-limit-tokens-prompt": "11250000", + "x-ratelimit-remaining-tokens-prompt": "11249970", + "x-ratelimit-over-limit": "no" + } + }, + { + "phase": "burst_parallel", + "index": 19, + "status_code": 200, + "latency_s": 1.0560014700000124, + "prompt_tokens": 15, + "completion_tokens": 64, + "error": null, + "headers": { + "x-ratelimit-limit-tokens-prompt": "11250000", + "x-ratelimit-remaining-tokens-prompt": "11249985", + "x-ratelimit-over-limit": "no" + } + }, + { + "phase": "burst_parallel", + "index": 20, + "status_code": 200, + "latency_s": 1.2520901720000097, + "prompt_tokens": 15, + "completion_tokens": 64, + "error": null, + "headers": { + "x-ratelimit-limit-tokens-prompt": "11250000", + "x-ratelimit-remaining-tokens-prompt": "11249955", + "x-ratelimit-over-limit": "no" + } + }, + { + "phase": "burst_parallel", + "index": 21, + "status_code": 200, + "latency_s": 1.525174015999994, + "prompt_tokens": 15, + "completion_tokens": 64, + "error": null, + "headers": { + "x-ratelimit-limit-tokens-prompt": "11250000", + "x-ratelimit-remaining-tokens-prompt": "11246656", + "x-ratelimit-over-limit": "no" + } + }, + { + "phase": "burst_parallel", + "index": 22, + "status_code": 200, + "latency_s": 1.6753569660000096, + "prompt_tokens": 15, + "completion_tokens": 64, + "error": null, + "headers": { + "x-ratelimit-limit-tokens-prompt": "11250000", + "x-ratelimit-remaining-tokens-prompt": "11249985", + "x-ratelimit-over-limit": "no" + } + }, + { + "phase": "burst_parallel", + "index": 23, + "status_code": 200, + "latency_s": 1.338194724999994, + "prompt_tokens": 15, + "completion_tokens": 64, + "error": null, + "headers": { + "x-ratelimit-limit-tokens-prompt": "11250000", + "x-ratelimit-remaining-tokens-prompt": "11246641", + "x-ratelimit-over-limit": "no" + } + }, + { + "phase": "burst_parallel", + "index": 24, + "status_code": 200, + "latency_s": 5.309711937000003, + "prompt_tokens": 15, + "completion_tokens": 64, + "error": null, + "headers": { + "x-ratelimit-limit-tokens-prompt": "11250000", + "x-ratelimit-limit-tokens-cache-adjusted-prompt": "5400000", + "x-ratelimit-limit-tokens-generated": "216000", + "x-ratelimit-remaining-tokens-prompt": "11249205", + "x-ratelimit-remaining-tokens-cache-adjusted-prompt": "5397319", + "x-ratelimit-remaining-tokens-generated": "212828", + "x-ratelimit-over-limit": "no" + } + }, + { + "phase": "burst_parallel", + "index": 25, + "status_code": 200, + "latency_s": 5.130342642999977, + "prompt_tokens": 15, + "completion_tokens": 64, + "error": null, + "headers": { + "x-ratelimit-limit-tokens-prompt": "11250000", + "x-ratelimit-limit-tokens-cache-adjusted-prompt": "5400000", + "x-ratelimit-limit-tokens-generated": "216000", + "x-ratelimit-remaining-tokens-prompt": "11246465", + "x-ratelimit-remaining-tokens-cache-adjusted-prompt": "5397319", + "x-ratelimit-remaining-tokens-generated": "212828", + "x-ratelimit-over-limit": "no" + } + }, + { + "phase": "burst_parallel", + "index": 26, + "status_code": 200, + "latency_s": 5.186301154000006, + "prompt_tokens": 15, + "completion_tokens": 64, + "error": null, + "headers": { + "x-ratelimit-limit-tokens-prompt": "11250000", + "x-ratelimit-limit-tokens-cache-adjusted-prompt": "5400000", + "x-ratelimit-limit-tokens-generated": "216000", + "x-ratelimit-remaining-tokens-prompt": "11249190", + "x-ratelimit-remaining-tokens-cache-adjusted-prompt": "5397319", + "x-ratelimit-remaining-tokens-generated": "212828", + "x-ratelimit-over-limit": "no" + } + }, + { + "phase": "burst_parallel", + "index": 27, + "status_code": 200, + "latency_s": 1.235240860999994, + "prompt_tokens": 15, + "completion_tokens": 64, + "error": null, + "headers": { + "x-ratelimit-limit-tokens-prompt": "11250000", + "x-ratelimit-remaining-tokens-prompt": "11249985", + "x-ratelimit-over-limit": "no" + } + }, + { + "phase": "burst_parallel", + "index": 28, + "status_code": 200, + "latency_s": 1.0229154160000178, + "prompt_tokens": 15, + "completion_tokens": 64, + "error": null, + "headers": { + "x-ratelimit-limit-tokens-prompt": "11250000", + "x-ratelimit-remaining-tokens-prompt": "11246436", + "x-ratelimit-over-limit": "no" + } + }, + { + "phase": "burst_parallel", + "index": 29, + "status_code": 200, + "latency_s": 1.1005510619999939, + "prompt_tokens": 15, + "completion_tokens": 64, + "error": null, + "headers": { + "x-ratelimit-limit-tokens-prompt": "11250000", + "x-ratelimit-remaining-tokens-prompt": "11246421", + "x-ratelimit-over-limit": "no" + } + }, + { + "phase": "heavy_output", + "index": 0, + "status_code": 200, + "latency_s": 5.2359516649999875, + "prompt_tokens": 21, + "completion_tokens": 256, + "error": null, + "headers": { + "x-ratelimit-limit-tokens-prompt": "11250000", + "x-ratelimit-remaining-tokens-prompt": "11249937", + "x-ratelimit-over-limit": "no" + } + }, + { + "phase": "heavy_output", + "index": 1, + "status_code": 200, + "latency_s": 5.66713300699999, + "prompt_tokens": 21, + "completion_tokens": 256, + "error": null, + "headers": { + "x-ratelimit-limit-tokens-prompt": "11250000", + "x-ratelimit-remaining-tokens-prompt": "11249958", + "x-ratelimit-over-limit": "no" + } + }, + { + "phase": "heavy_output", + "index": 2, + "status_code": 200, + "latency_s": 7.799037986999991, + "prompt_tokens": 21, + "completion_tokens": 256, + "error": null, + "headers": { + "x-ratelimit-limit-tokens-prompt": "11250000", + "x-ratelimit-limit-tokens-cache-adjusted-prompt": "5400000", + "x-ratelimit-limit-tokens-generated": "216000", + "x-ratelimit-remaining-tokens-prompt": "11246505", + "x-ratelimit-remaining-tokens-cache-adjusted-prompt": "5397059", + "x-ratelimit-remaining-tokens-generated": "209741", + "x-ratelimit-over-limit": "no" + } + }, + { + "phase": "heavy_output", + "index": 3, + "status_code": 200, + "latency_s": 4.426191646000007, + "prompt_tokens": 21, + "completion_tokens": 256, + "error": null, + "headers": { + "x-ratelimit-limit-tokens-prompt": "11250000", + "x-ratelimit-remaining-tokens-prompt": "11249979", + "x-ratelimit-over-limit": "no" + } + }, + { + "phase": "heavy_output", + "index": 4, + "status_code": 200, + "latency_s": 4.187831545999984, + "prompt_tokens": 21, + "completion_tokens": 256, + "error": null, + "headers": { + "x-ratelimit-limit-tokens-prompt": "11250000", + "x-ratelimit-limit-tokens-cache-adjusted-prompt": "5400000", + "x-ratelimit-limit-tokens-generated": "216000", + "x-ratelimit-remaining-tokens-prompt": "11246382", + "x-ratelimit-remaining-tokens-cache-adjusted-prompt": "5397013", + "x-ratelimit-remaining-tokens-generated": "209741", + "x-ratelimit-over-limit": "no" + } + }, + { + "phase": "heavy_output", + "index": 5, + "status_code": 200, + "latency_s": 3.6082314209999993, + "prompt_tokens": 21, + "completion_tokens": 256, + "error": null, + "headers": { + "x-ratelimit-limit-tokens-prompt": "11250000", + "x-ratelimit-limit-tokens-cache-adjusted-prompt": "5400000", + "x-ratelimit-limit-tokens-generated": "216000", + "x-ratelimit-remaining-tokens-prompt": "11246419", + "x-ratelimit-remaining-tokens-cache-adjusted-prompt": "5397013", + "x-ratelimit-remaining-tokens-generated": "209741", + "x-ratelimit-over-limit": "no" + } + }, + { + "phase": "heavy_output", + "index": 6, + "status_code": 200, + "latency_s": 8.83252007499999, + "prompt_tokens": 21, + "completion_tokens": 256, + "error": null, + "headers": { + "x-ratelimit-limit-tokens-prompt": "11250000", + "x-ratelimit-limit-tokens-cache-adjusted-prompt": "5400000", + "x-ratelimit-limit-tokens-generated": "216000", + "x-ratelimit-remaining-tokens-prompt": "11249979", + "x-ratelimit-remaining-tokens-cache-adjusted-prompt": "5399335", + "x-ratelimit-remaining-tokens-generated": "213747", + "x-ratelimit-over-limit": "no" + } + }, + { + "phase": "heavy_output", + "index": 7, + "status_code": 200, + "latency_s": 3.7986883350000085, + "prompt_tokens": 21, + "completion_tokens": 256, + "error": null, + "headers": { + "x-ratelimit-limit-tokens-prompt": "11250000", + "x-ratelimit-limit-tokens-cache-adjusted-prompt": "5400000", + "x-ratelimit-limit-tokens-generated": "216000", + "x-ratelimit-remaining-tokens-prompt": "11246402", + "x-ratelimit-remaining-tokens-cache-adjusted-prompt": "5397037", + "x-ratelimit-remaining-tokens-generated": "208898", + "x-ratelimit-over-limit": "no" + } + }, + { + "phase": "recovery_wait", + "index": 0, + "status_code": 200, + "latency_s": 4.8563677970000185, + "prompt_tokens": 11, + "completion_tokens": 8, + "error": null, + "headers": { + "x-ratelimit-limit-tokens-prompt": "11250000", + "x-ratelimit-limit-tokens-cache-adjusted-prompt": "5400000", + "x-ratelimit-limit-tokens-generated": "216000", + "x-ratelimit-remaining-tokens-prompt": "11246029", + "x-ratelimit-remaining-tokens-cache-adjusted-prompt": "5397041", + "x-ratelimit-remaining-tokens-generated": "207563", + "x-ratelimit-over-limit": "no" + } + }, + { + "phase": "recovery_wait", + "index": 1, + "status_code": 200, + "latency_s": 4.493718208999979, + "prompt_tokens": 11, + "completion_tokens": 8, + "error": null, + "headers": { + "x-ratelimit-limit-tokens-prompt": "11250000", + "x-ratelimit-limit-tokens-cache-adjusted-prompt": "5400000", + "x-ratelimit-limit-tokens-generated": "216000", + "x-ratelimit-remaining-tokens-prompt": "11243768", + "x-ratelimit-remaining-tokens-cache-adjusted-prompt": "5395120", + "x-ratelimit-remaining-tokens-generated": "206663", + "x-ratelimit-over-limit": "no" + } + }, + { + "phase": "recovery_wait", + "index": 2, + "status_code": 200, + "latency_s": 6.704704643000014, + "prompt_tokens": 11, + "completion_tokens": 8, + "error": null, + "headers": { + "x-ratelimit-limit-tokens-prompt": "11250000", + "x-ratelimit-limit-tokens-cache-adjusted-prompt": "5400000", + "x-ratelimit-limit-tokens-generated": "216000", + "x-ratelimit-remaining-tokens-prompt": "11243851", + "x-ratelimit-remaining-tokens-cache-adjusted-prompt": "5395186", + "x-ratelimit-remaining-tokens-generated": "206226", + "x-ratelimit-over-limit": "no" + } + }, + { + "phase": "recovery_wait", + "index": 3, + "status_code": 200, + "latency_s": 6.385042948999995, + "prompt_tokens": 11, + "completion_tokens": 8, + "error": null, + "headers": { + "x-ratelimit-limit-tokens-prompt": "11250000", + "x-ratelimit-limit-tokens-cache-adjusted-prompt": "5400000", + "x-ratelimit-limit-tokens-generated": "216000", + "x-ratelimit-remaining-tokens-prompt": "11243952", + "x-ratelimit-remaining-tokens-cache-adjusted-prompt": "5395642", + "x-ratelimit-remaining-tokens-generated": "206921", + "x-ratelimit-over-limit": "no" + } + }, + { + "phase": "recovery_wait", + "index": 4, + "status_code": 200, + "latency_s": 0.7583341669999868, + "prompt_tokens": 11, + "completion_tokens": 8, + "error": null, + "headers": { + "x-ratelimit-limit-tokens-prompt": "11250000", + "x-ratelimit-limit-tokens-cache-adjusted-prompt": "5400000", + "x-ratelimit-limit-tokens-generated": "216000", + "x-ratelimit-remaining-tokens-prompt": "11245059", + "x-ratelimit-remaining-tokens-cache-adjusted-prompt": "5396694", + "x-ratelimit-remaining-tokens-generated": "209111", + "x-ratelimit-over-limit": "no" + } + } + ] +} \ No newline at end of file diff --git a/kimi-k2p6-rpm-stress.json b/kimi-k2p6-rpm-stress.json new file mode 100644 index 0000000..221a6a5 --- /dev/null +++ b/kimi-k2p6-rpm-stress.json @@ -0,0 +1,270 @@ +{ + "elapsed_s": 3.13, + "rpm_equivalent": 3839.8, + "status_counts": { + "200": 188, + "429": 12 + }, + "first_429": { + "i": 18, + "status": 429, + "lat": 0.233, + "err": { + "object": "error", + "type": "invalid_request_error", + "code": "invalid_request_error", + "message": "rate limit exceeded, please try again later" + }, + "h": { + "x-ratelimit-limit-tokens-cache-adjusted-prompt": "5400000", + "x-ratelimit-limit-tokens-generated": "36000", + "x-ratelimit-limit-tokens-prompt": "11250000", + "x-ratelimit-over-limit": "no", + "x-ratelimit-remaining-tokens-cache-adjusted-prompt": "5398911", + "x-ratelimit-remaining-tokens-generated": "0", + "x-ratelimit-remaining-tokens-prompt": "11247531" + } + }, + "sample_errors": [ + { + "i": 18, + "status": 429, + "lat": 0.233, + "err": { + "object": "error", + "type": "invalid_request_error", + "code": "invalid_request_error", + "message": "rate limit exceeded, please try again later" + }, + "h": { + "x-ratelimit-limit-tokens-cache-adjusted-prompt": "5400000", + "x-ratelimit-limit-tokens-generated": "36000", + "x-ratelimit-limit-tokens-prompt": "11250000", + "x-ratelimit-over-limit": "no", + "x-ratelimit-remaining-tokens-cache-adjusted-prompt": "5398911", + "x-ratelimit-remaining-tokens-generated": "0", + "x-ratelimit-remaining-tokens-prompt": "11247531" + } + }, + { + "i": 53, + "status": 429, + "lat": 0.225, + "err": { + "object": "error", + "type": "invalid_request_error", + "code": "invalid_request_error", + "message": "rate limit exceeded, please try again later" + }, + "h": { + "x-ratelimit-limit-tokens-cache-adjusted-prompt": "5400000", + "x-ratelimit-limit-tokens-generated": "36000", + "x-ratelimit-limit-tokens-prompt": "11250000", + "x-ratelimit-over-limit": "no", + "x-ratelimit-remaining-tokens-cache-adjusted-prompt": "5398911", + "x-ratelimit-remaining-tokens-generated": "0", + "x-ratelimit-remaining-tokens-prompt": "11247531" + } + }, + { + "i": 90, + "status": 429, + "lat": 0.218, + "err": { + "object": "error", + "type": "invalid_request_error", + "code": "invalid_request_error", + "message": "rate limit exceeded, please try again later" + }, + "h": { + "x-ratelimit-limit-tokens-cache-adjusted-prompt": "5400000", + "x-ratelimit-limit-tokens-generated": "36000", + "x-ratelimit-limit-tokens-prompt": "11250000", + "x-ratelimit-over-limit": "no", + "x-ratelimit-remaining-tokens-cache-adjusted-prompt": "5398911", + "x-ratelimit-remaining-tokens-generated": "0", + "x-ratelimit-remaining-tokens-prompt": "11247531" + } + }, + { + "i": 103, + "status": 429, + "lat": 0.15, + "err": { + "object": "error", + "type": "invalid_request_error", + "code": "invalid_request_error", + "message": "rate limit exceeded, please try again later" + }, + "h": { + "x-ratelimit-limit-tokens-cache-adjusted-prompt": "5400000", + "x-ratelimit-limit-tokens-generated": "36000", + "x-ratelimit-limit-tokens-prompt": "11250000", + "x-ratelimit-over-limit": "no", + "x-ratelimit-remaining-tokens-cache-adjusted-prompt": "5398911", + "x-ratelimit-remaining-tokens-generated": "0", + "x-ratelimit-remaining-tokens-prompt": "11250000" + } + }, + { + "i": 104, + "status": 429, + "lat": 0.101, + "err": { + "object": "error", + "type": "invalid_request_error", + "code": "invalid_request_error", + "message": "rate limit exceeded, please try again later" + }, + "h": { + "x-ratelimit-limit-tokens-cache-adjusted-prompt": "5400000", + "x-ratelimit-limit-tokens-generated": "36000", + "x-ratelimit-limit-tokens-prompt": "11250000", + "x-ratelimit-over-limit": "no", + "x-ratelimit-remaining-tokens-cache-adjusted-prompt": "5398911", + "x-ratelimit-remaining-tokens-generated": "0", + "x-ratelimit-remaining-tokens-prompt": "11247531" + } + }, + { + "i": 110, + "status": 429, + "lat": 0.15, + "err": { + "object": "error", + "type": "invalid_request_error", + "code": "invalid_request_error", + "message": "rate limit exceeded, please try again later" + }, + "h": { + "x-ratelimit-limit-tokens-cache-adjusted-prompt": "5400000", + "x-ratelimit-limit-tokens-generated": "36000", + "x-ratelimit-limit-tokens-prompt": "11250000", + "x-ratelimit-over-limit": "no", + "x-ratelimit-remaining-tokens-cache-adjusted-prompt": "5398911", + "x-ratelimit-remaining-tokens-generated": "0", + "x-ratelimit-remaining-tokens-prompt": "11250000" + } + }, + { + "i": 111, + "status": 429, + "lat": 0.149, + "err": { + "object": "error", + "type": "invalid_request_error", + "code": "invalid_request_error", + "message": "rate limit exceeded, please try again later" + }, + "h": { + "x-ratelimit-limit-tokens-cache-adjusted-prompt": "5400000", + "x-ratelimit-limit-tokens-generated": "36000", + "x-ratelimit-limit-tokens-prompt": "11250000", + "x-ratelimit-over-limit": "no", + "x-ratelimit-remaining-tokens-cache-adjusted-prompt": "5398911", + "x-ratelimit-remaining-tokens-generated": "0", + "x-ratelimit-remaining-tokens-prompt": "11250000" + } + }, + { + "i": 112, + "status": 429, + "lat": 0.149, + "err": { + "object": "error", + "type": "invalid_request_error", + "code": "invalid_request_error", + "message": "rate limit exceeded, please try again later" + }, + "h": { + "x-ratelimit-limit-tokens-cache-adjusted-prompt": "5400000", + "x-ratelimit-limit-tokens-generated": "36000", + "x-ratelimit-limit-tokens-prompt": "11250000", + "x-ratelimit-over-limit": "no", + "x-ratelimit-remaining-tokens-cache-adjusted-prompt": "5398911", + "x-ratelimit-remaining-tokens-generated": "0", + "x-ratelimit-remaining-tokens-prompt": "11250000" + } + }, + { + "i": 134, + "status": 429, + "lat": 0.144, + "err": { + "object": "error", + "type": "invalid_request_error", + "code": "invalid_request_error", + "message": "rate limit exceeded, please try again later" + }, + "h": { + "x-ratelimit-limit-tokens-cache-adjusted-prompt": "5400000", + "x-ratelimit-limit-tokens-generated": "36000", + "x-ratelimit-limit-tokens-prompt": "11250000", + "x-ratelimit-over-limit": "no", + "x-ratelimit-remaining-tokens-cache-adjusted-prompt": "5398911", + "x-ratelimit-remaining-tokens-generated": "0", + "x-ratelimit-remaining-tokens-prompt": "11250000" + } + }, + { + "i": 144, + "status": 429, + "lat": 0.255, + "err": { + "object": "error", + "type": "invalid_request_error", + "code": "invalid_request_error", + "message": "rate limit exceeded, please try again later" + }, + "h": { + "x-ratelimit-limit-tokens-cache-adjusted-prompt": "5400000", + "x-ratelimit-limit-tokens-generated": "36000", + "x-ratelimit-limit-tokens-prompt": "11250000", + "x-ratelimit-over-limit": "no", + "x-ratelimit-remaining-tokens-cache-adjusted-prompt": "5398911", + "x-ratelimit-remaining-tokens-generated": "0", + "x-ratelimit-remaining-tokens-prompt": "11250000" + } + }, + { + "i": 153, + "status": 429, + "lat": 0.152, + "err": { + "object": "error", + "type": "invalid_request_error", + "code": "invalid_request_error", + "message": "rate limit exceeded, please try again later" + }, + "h": { + "x-ratelimit-limit-tokens-cache-adjusted-prompt": "5400000", + "x-ratelimit-limit-tokens-generated": "36000", + "x-ratelimit-limit-tokens-prompt": "11250000", + "x-ratelimit-over-limit": "no", + "x-ratelimit-remaining-tokens-cache-adjusted-prompt": "5398911", + "x-ratelimit-remaining-tokens-generated": "0", + "x-ratelimit-remaining-tokens-prompt": "11250000" + } + }, + { + "i": 178, + "status": 429, + "lat": 0.104, + "err": { + "object": "error", + "type": "invalid_request_error", + "code": "invalid_request_error", + "message": "rate limit exceeded, please try again later" + }, + "h": { + "x-ratelimit-limit-tokens-cache-adjusted-prompt": "5400000", + "x-ratelimit-limit-tokens-generated": "36000", + "x-ratelimit-limit-tokens-prompt": "11250000", + "x-ratelimit-over-limit": "no", + "x-ratelimit-remaining-tokens-cache-adjusted-prompt": "5398911", + "x-ratelimit-remaining-tokens-generated": "0", + "x-ratelimit-remaining-tokens-prompt": "11250000" + } + } + ] +} \ No newline at end of file diff --git a/kimi-k2p6-stress-results.json b/kimi-k2p6-stress-results.json new file mode 100644 index 0000000..18f125a --- /dev/null +++ b/kimi-k2p6-stress-results.json @@ -0,0 +1,20 @@ +{ + "scenarios": { + "stress_50x20": { + "status_counts": { + "200": 50 + }, + "first_429": null, + "sample_429s": [], + "sample_503s": [] + }, + "stress_100x50": { + "status_counts": { + "200": 100 + }, + "first_429": null, + "sample_429s": [], + "sample_503s": [] + } + } +} \ No newline at end of file diff --git a/scripts/kimi_k2p6_rate_limit_test.py b/scripts/kimi_k2p6_rate_limit_test.py new file mode 100644 index 0000000..58ada01 --- /dev/null +++ b/scripts/kimi_k2p6_rate_limit_test.py @@ -0,0 +1,256 @@ +#!/usr/bin/env python3 +"""Rate limit characterization for Kimi K2.6 on Fireworks serverless.""" + +from __future__ import annotations + +import argparse +import asyncio +import json +import os +import statistics +import time +from dataclasses import asdict, dataclass, field +from typing import Any + +import httpx + +MODEL = "accounts/fireworks/models/kimi-k2p6" +API_URL = "https://api.fireworks.ai/inference/v1/chat/completions" +RATE_LIMIT_HEADERS = [ + "x-ratelimit-limit-tokens-prompt", + "x-ratelimit-limit-tokens-cache-adjusted-prompt", + "x-ratelimit-limit-tokens-generated", + "x-ratelimit-remaining-tokens-prompt", + "x-ratelimit-remaining-tokens-cache-adjusted-prompt", + "x-ratelimit-remaining-tokens-generated", + "x-ratelimit-over-limit", + "retry-after", +] + + +@dataclass +class RequestResult: + phase: str + index: int + status_code: int + latency_s: float + prompt_tokens: int | None = None + completion_tokens: int | None = None + error: str | None = None + headers: dict[str, str] = field(default_factory=dict) + + +def extract_rate_headers(headers: httpx.Headers) -> dict[str, str]: + out: dict[str, str] = {} + for key in RATE_LIMIT_HEADERS: + if key in headers: + out[key] = headers[key] + return out + + +async def send_request( + client: httpx.AsyncClient, + *, + phase: str, + index: int, + prompt: str, + max_tokens: int, +) -> RequestResult: + payload = { + "model": MODEL, + "messages": [{"role": "user", "content": prompt}], + "max_tokens": max_tokens, + } + started = time.perf_counter() + try: + response = await client.post(API_URL, json=payload) + latency = time.perf_counter() - started + body: dict[str, Any] = {} + try: + body = response.json() + except json.JSONDecodeError: + body = {} + + usage = body.get("usage") or {} + error = None + if response.status_code >= 400: + error = body.get("error", body) + + return RequestResult( + phase=phase, + index=index, + status_code=response.status_code, + latency_s=latency, + prompt_tokens=usage.get("prompt_tokens"), + completion_tokens=usage.get("completion_tokens"), + error=str(error) if error else None, + headers=extract_rate_headers(response.headers), + ) + except Exception as exc: # noqa: BLE001 + return RequestResult( + phase=phase, + index=index, + status_code=0, + latency_s=time.perf_counter() - started, + error=str(exc), + ) + + +async def run_phase( + client: httpx.AsyncClient, + *, + phase: str, + count: int, + concurrency: int, + prompt: str, + max_tokens: int, + delay_s: float = 0.0, +) -> list[RequestResult]: + semaphore = asyncio.Semaphore(concurrency) + results: list[RequestResult] = [] + + async def one(index: int) -> None: + async with semaphore: + if delay_s > 0: + await asyncio.sleep(index * delay_s) + results.append( + await send_request( + client, + phase=phase, + index=index, + prompt=prompt, + max_tokens=max_tokens, + ) + ) + + await asyncio.gather(*(one(i) for i in range(count))) + return sorted(results, key=lambda item: item.index) + + +def summarize(results: list[RequestResult]) -> dict[str, Any]: + by_status: dict[int, int] = {} + latencies = [r.latency_s for r in results if r.status_code == 200] + header_samples: list[dict[str, str]] = [] + for result in results: + by_status[result.status_code] = by_status.get(result.status_code, 0) + 1 + if result.headers: + header_samples.append(result.headers) + + latest_headers = header_samples[-1] if header_samples else {} + return { + "total": len(results), + "status_counts": by_status, + "success_rate": by_status.get(200, 0) / len(results) if results else 0.0, + "latency_s": { + "min": min(latencies) if latencies else None, + "max": max(latencies) if latencies else None, + "mean": statistics.mean(latencies) if latencies else None, + "p50": statistics.median(latencies) if latencies else None, + }, + "latest_rate_limit_headers": latest_headers, + "first_429_index": next( + (r.index for r in results if r.status_code == 429), + None, + ), + "first_503_index": next( + (r.index for r in results if r.status_code == 503), + None, + ), + "sample_errors": [ + {"index": r.index, "status": r.status_code, "error": r.error} + for r in results + if r.status_code != 200 + ][:5], + } + + +async def main() -> None: + parser = argparse.ArgumentParser() + parser.add_argument("--output", required=True) + args = parser.parse_args() + + api_key = os.environ.get("FIREWORKS_API_KEY") + if not api_key: + raise SystemExit("FIREWORKS_API_KEY is required") + + timeout = httpx.Timeout(120.0, connect=30.0) + headers = {"Authorization": f"Bearer {api_key}"} + + report: dict[str, Any] = { + "model": MODEL, + "timestamp_utc": time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime()), + "phases": {}, + "raw_results": [], + } + + async with httpx.AsyncClient(headers=headers, timeout=timeout) as client: + phases = [ + { + "name": "baseline_single", + "count": 1, + "concurrency": 1, + "prompt": "Reply with exactly one word: hello.", + "max_tokens": 16, + }, + { + "name": "steady_low_parallel", + "count": 10, + "concurrency": 2, + "prompt": "In one short sentence, explain what rate limiting means.", + "max_tokens": 64, + }, + { + "name": "moderate_parallel", + "count": 20, + "concurrency": 5, + "prompt": "Write a 2-sentence summary of adaptive token rate limits.", + "max_tokens": 128, + }, + { + "name": "burst_parallel", + "count": 30, + "concurrency": 15, + "prompt": "List five synonyms for 'fast'.", + "max_tokens": 64, + }, + { + "name": "heavy_output", + "count": 8, + "concurrency": 4, + "prompt": "Write a detailed 150-word explanation of HTTP 429 errors.", + "max_tokens": 256, + }, + { + "name": "recovery_wait", + "count": 5, + "concurrency": 1, + "prompt": "Say OK.", + "max_tokens": 8, + "delay_s": 2.0, + }, + ] + + for spec in phases: + phase_name = spec["name"] + print(f"Running phase: {phase_name}", flush=True) + results = await run_phase( + client, + phase=phase_name, + count=spec["count"], + concurrency=spec["concurrency"], + prompt=spec["prompt"], + max_tokens=spec["max_tokens"], + delay_s=spec.get("delay_s", 0.0), + ) + report["phases"][phase_name] = summarize(results) + report["raw_results"].extend(asdict(r) for r in results) + await asyncio.sleep(3) + + with open(args.output, "w", encoding="utf-8") as handle: + json.dump(report, handle, indent=2) + + print(f"Wrote {args.output}") + + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/scripts/kimi_k2p6_stress_test.py b/scripts/kimi_k2p6_stress_test.py new file mode 100644 index 0000000..9ce213a --- /dev/null +++ b/scripts/kimi_k2p6_stress_test.py @@ -0,0 +1,94 @@ +#!/usr/bin/env python3 +"""Aggressive Kimi K2.6 rate-limit stress test.""" + +from __future__ import annotations + +import asyncio +import json +import os +import time + +import httpx + +MODEL = "accounts/fireworks/models/kimi-k2p6" +URL = "https://api.fireworks.ai/inference/v1/chat/completions" + + +async def one(client: httpx.AsyncClient, i: int) -> dict: + payload = { + "model": MODEL, + "messages": [ + { + "role": "user", + "content": ( + "Write a detailed 300-word essay about distributed systems, " + "covering consistency, availability, and partition tolerance." + ), + } + ], + "max_tokens": 512, + } + started = time.perf_counter() + try: + resp = await client.post(URL, json=payload) + body = resp.json() if resp.headers.get("content-type", "").startswith("application/json") else {} + return { + "index": i, + "status": resp.status_code, + "latency_s": round(time.perf_counter() - started, 3), + "error": body.get("error"), + "headers": { + k: v + for k, v in resp.headers.items() + if k.startswith("x-ratelimit") or k == "retry-after" + }, + } + except Exception as exc: # noqa: BLE001 + return { + "index": i, + "status": 0, + "latency_s": round(time.perf_counter() - started, 3), + "error": str(exc), + "headers": {}, + } + + +async def main() -> None: + api_key = os.environ["FIREWORKS_API_KEY"] + timeout = httpx.Timeout(180.0, connect=30.0) + headers = {"Authorization": f"Bearer {api_key}"} + + scenarios = [ + {"name": "stress_50x20", "count": 50, "concurrency": 20}, + {"name": "stress_100x50", "count": 100, "concurrency": 50}, + ] + + report: dict = {"scenarios": {}} + async with httpx.AsyncClient(headers=headers, timeout=timeout) as client: + for spec in scenarios: + print(f"Running {spec['name']}", flush=True) + sem = asyncio.Semaphore(spec["concurrency"]) + + async def run(i: int) -> dict: + async with sem: + return await one(client, i) + + results = await asyncio.gather(*(run(i) for i in range(spec["count"]))) + status_counts: dict[int, int] = {} + for r in results: + status_counts[r["status"]] = status_counts.get(r["status"], 0) + 1 + report["scenarios"][spec["name"]] = { + "status_counts": status_counts, + "first_429": next((r for r in results if r["status"] == 429), None), + "sample_429s": [r for r in results if r["status"] == 429][:3], + "sample_503s": [r for r in results if r["status"] == 503][:3], + } + await asyncio.sleep(5) + + with open("/workspace/kimi-k2p6-stress-results.json", "w", encoding="utf-8") as f: + json.dump(report, f, indent=2) + print(json.dumps(report, indent=2)) + + +if __name__ == "__main__": + asyncio.run(main()) From 02b86a50e1ac2a03c8d74151dab1065963f359f8 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Wed, 5 Aug 2026 17:46:43 +0000 Subject: [PATCH 2/2] Add Clay (ryan-chang-33dcc0) rate-limit investigation Prometheus shows 62 kimi-k2p6 HTTP 429s with rejection_reason=tokens_prompt during a sharp ramp at 2026-08-05 01:21-01:23 UTC, despite smoothed TPM utilization staying well below adaptive ceilings. Co-authored-by: tarunipaleru --- ryan-chang-33dcc0-rate-limit-investigation.md | 144 ++++++++++++++++++ 1 file changed, 144 insertions(+) create mode 100644 ryan-chang-33dcc0-rate-limit-investigation.md diff --git a/ryan-chang-33dcc0-rate-limit-investigation.md b/ryan-chang-33dcc0-rate-limit-investigation.md new file mode 100644 index 0000000..bf31a50 --- /dev/null +++ b/ryan-chang-33dcc0-rate-limit-investigation.md @@ -0,0 +1,144 @@ +# Investigation: Rate Limiting for `ryan-chang-33dcc0` (Clay) + +**Account:** `accounts/ryan-chang-33dcc0` (`Clay [Production]`, ryan.chang@clay.com) +**Window:** last 24h from 2026-08-05 ~17:40 UTC (covering 2026-08-04 17:40 → 2026-08-05 17:40) +**Primary model involved:** `accounts/fireworks/models/kimi-k2p6` / deployment `accounts/fireworks/deployments/kimi-k2p6` +**Source:** GCP Managed Prometheus (`fw-ai-cp-prod`) + billing usage API + +--- + +## Verdict + +Clay was rate-limited on **Kimi K2.6**, but **not because sustained TPM sat at their adaptive ceilings**. + +Prometheus records **62 HTTP 429s** with: + +| Field | Value | +|-------|-------| +| `rejection_reason` | `tokens_prompt` | +| `http_code_allowlisted` | `429` | +| Deployment | `kimi-k2p6` | +| When | **2026-08-05 01:21–01:23 UTC** (8 + 39 + 15) | + +That lines up with a sharp traffic ramp on kimi-k2p6 (≈25 → **349 req/min** within ~6 minutes). Adaptive limits were still raising during the burst. This matches Fireworks’ documented behavior: ramping too quickly causes 429s even when average utilization looks “fine.” + +--- + +## Why dashboards can look under-limit + +Against **global RLM** limits for kimi-k2p6 (5‑minute averages), peak utilization in the last 24h was: + +| Dimension | Peak rate | Adaptive limit | Peak util | +|-----------|----------:|---------------:|----------:| +| `tokens_generated` | ~7,040 | ~17,334 | **~41%** | +| `tokens_prompt` | ~68,264 | ~533,334 | **~13%** | +| `tokens_cache_adjusted_prompt` | ~27,860 | 200k→250k | **~11–14%** | + +So if you only compare smoothed rate mirrors to current limits, Clay does **not** look like they hit TPM caps. + +Two important caveats: + +1. **`tokens_prompt` rate_mirror was missing/0 during the exact 429 window**, so that dimension’s utilization is not observable at the moment of rejection. +2. Limits were **still adapting upward** during the incident (see below), so a short admission burst can exceed the *then-current* bucket even if later averages look low. + +--- + +## Incident timeline (kimi-k2p6, 2026-08-05 UTC) + +Successful request volume (per-minute deltas from `requests_total_per_account_total`): + +| Time (UTC) | Successful req/min | `tokens_prompt` 429s | Other errors | +|------------|-------------------:|---------------------:|-------------:| +| 01:16 | 25 | 0 | 0 | +| 01:17 | 118 | 0 | 0 | +| 01:18 | 206 | 0 | 0 | +| 01:19 | 307 | 0 | 0 | +| 01:20 | 345 | 0 | 0 | +| **01:21** | **349** | **8** | 0 | +| **01:22** | **277** | **39** | 2 | +| **01:23** | **194** | **15** | 5 | +| 01:24 | 154 | 0 | 5 | +| 01:25 | 110 | 0 | 3 | + +Adaptive limits on the same deployment during that hour: + +| Metric | Before burst | After raise | +|--------|-------------:|------------:| +| `global_rlm_tokens_prompt_limit_per_account` | 426,667 | **533,334** | +| `global_rlm_tokens_cache_adjusted_prompt_limit_per_account` | 200,000 | **250,000** | +| `global_rlm_tokens_generated_limit_per_account` | 13,867 | **17,334** | + +Additional signal: **`global_rlm_tokens_cache_adjusted_prompt_limit_at_upper_bound_per_account = 1`** for kimi-k2p6 throughout — uncached/cache-adjusted prompt limit is pinned at its ceiling and cannot auto-raise further. No 429s were labeled `tokens_cache_adjusted_prompt` in this window (count ≈ 0), but the ceiling being maxed is relevant for headroom. + +No meaningful volume of: + +- `concurrency_limit` (583) +- `pid_shed_load` (583) + +in this window. + +--- + +## Usage context (billing API, serverless) + +Rough 24h serverless token volume for this account: + +| Model | Prompt tokens | Cached prompt | Completion | +|-------|--------------:|--------------:|-----------:| +| **kimi-k2p6** | **~335M** (across day buckets) | **~266M** | **~11.6M** | +| deepseek-v4-flash | ~46M | ~0 | ~9.0M | +| glm-5p2 | ~15.4M | ~9.6M | ~1.1M | +| kimi-k3 | ~0.5M | ~0.2M | ~19k | + +Kimi K2.6 dominates. Cache hit rate on kimi-k2p6 is high (~79% of prompt tokens cached in the latest day bucket), which is why cache-adjusted headroom matters. + +Account has **no on-demand deployments** (`deployments` list empty) — this is serverless-only for inference. + +--- + +## What did *not* cause it + +- **Account-wide 6,000 RPM cap:** peak observed request throughput on kimi-k2p6 was ~5–6 RPS (~300–350 RPM), far below 6,000. +- **Sustained generated-TPM exhaustion:** peak ~41% of adaptive generated limit. +- **Sustained total-prompt TPM exhaustion (as averaged):** peak ~13% of adaptive prompt limit in rate_mirror (with the caveat that mirror data was absent during the 429 minute). +- **Load shed / concurrency 583s:** essentially none in the incident window. + +Note on `requests_limit_per_account`: the series is stuck at **1.0** for kimi-k2p6 while successful traffic clearly runs at several RPS. Treat that series as a **stale/floor signal**, not the effective request limiter. The authoritative rejection label is `tokens_prompt`. + +--- + +## Root-cause summary + +1. Clay ramped **kimi-k2p6** hard around **01:16–01:21 UTC**. +2. The rate limiter rejected **62 requests** as **`tokens_prompt` / HTTP 429** at **01:21–01:23**. +3. Adaptive prompt / cache-adjusted / generated limits were mid-raise; cache-adjusted prompt was already **at upper bound**. +4. Smoothed TPM utilization metrics therefore **understate** why 429s happened — this is a **burst / adaptive-ramp** problem on the prompt-token dimension, not “they sat at 100% of the published ceiling for hours.” + +--- + +## Suggested follow-ups + +1. Confirm with Clay the client concurrency / retry behavior around 01:20 UTC (likely a batch or agent fan-out). +2. If they need higher prompt/uncached headroom on kimi-k2p6, raise the **cache-adjusted prompt ceiling** (already at upper bound) and/or grant a reservation — adaptive alone cannot lift it further. +3. Advise gradual ramp + exponential backoff on 429; document that `rejection_reason=tokens_prompt` can fire during bursts even when Grafana averages look <50%. +4. Investigate why `tokens_prompt_rate_mirror_per_account` went to 0 during the incident (observability gap on the exact rejecting dimension). + +--- + +## Prometheus queries used + +```promql +# Adaptive limits +global_rlm_tokens_prompt_limit_per_account{account="ryan-chang-33dcc0", deployment="accounts/fireworks/deployments/kimi-k2p6"} +global_rlm_tokens_cache_adjusted_prompt_limit_per_account{account="ryan-chang-33dcc0", deployment="accounts/fireworks/deployments/kimi-k2p6"} +global_rlm_tokens_generated_limit_per_account{account="ryan-chang-33dcc0", deployment="accounts/fireworks/deployments/kimi-k2p6"} +global_rlm_tokens_cache_adjusted_prompt_limit_at_upper_bound_per_account{account="ryan-chang-33dcc0", deployment="accounts/fireworks/deployments/kimi-k2p6"} + +# Rate mirrors +tokens_prompt_rate_mirror_per_account{account="ryan-chang-33dcc0", deployment="accounts/fireworks/deployments/kimi-k2p6"} +tokens_cache_adjusted_prompt_rate_mirror_per_account{account="ryan-chang-33dcc0", deployment="accounts/fireworks/deployments/kimi-k2p6"} +tokens_generated_rate_mirror_per_account{account="ryan-chang-33dcc0", deployment="accounts/fireworks/deployments/kimi-k2p6"} + +# Rejections (authoritative) +requests_total_per_account_total{account="ryan-chang-33dcc0", deployment="accounts/fireworks/deployments/kimi-k2p6", rejection_reason="tokens_prompt"} +```