最新资讯
reddit.com OpenAI 称 Astra 仅满足 10% 安全任务标准 dev.to FreeToken:在自有 GPU 上运行前沿 MoE 模型及其内存需求 dev.to 当 AI Agent 说“完成”时,究竟完成了什么? dev.to 部署 Underdog Bark 3.0 Pro:逐字转写、自定义后端与分块设置 dev.to 为艰难对话构建 AI:五个 Agent、一条安全正则与一位盲评监督者 techcrunch.com Palo Alto Networks 洽谈以 5 亿美元收购 AI Agent 安全初创公司 Clutch theinformation.com 黄仁勋被要求就涉华间谍指控向国会作简报 www.infoq.com Edera 推出 Object Capability Bounded Authority,试图将凭证与 AI Agent 工作负载隔离 wechat 这波杀疯了!旗舰级模型不限量、1个月视频额度免费领 bloomberg.com AI 抛售蔓延至信用市场,软银领跌亚洲美元债 dev.to 如何在专用 GPU 服务器上用 OpenAI 兼容 API 部署 LLM dev.to 审计 153 份 Claude Code 与 Codex 会话记录:User-Agent 与 URL 中的邮箱泄露
多元动态
登录 注册
智能体 dev.to · @Casey Sun

当免费额度不再便宜:面向 Agent 后端的负载退出测试

原文 我的收藏

文章讨论把夜间 Agent 任务迁移到免费端点后的隐性退化:免费容量不会突然宕机,而是随并发与重试累积出现延迟、重试放大、冷启动惩罚和队列债务。作者提出一个探针、一张决策表和一组可写入 CI 的退出判据,用于判断何时应离开免费层。

AI推荐理由 面向 Agent 后端的免费额度退出判据,提出重试放大、冷路径惩罚、队列债务三类退化效应,并给出探针、决策表和可接入 CI 的退出标准;属于工程经验分享,无实测数据与基准,价值在方法论而非结论。

62

正文

When the Free Tier Stops Being Cheap: A Load-Based Exit Test for Agent Backends A team moves its nightly agent job onto a free endpoint. Week one looks perfect. Week four, the queue drains ten minutes late and the on-call engineer has no data. The endpoint did not break. The workload changed shape around it. Free tiers rarely fail loudly; they fail as latency, retries, and quiet queue debt. This post is a stop rule, not a sales pitch. It gives you one probe, one decision table, and a set of exit criteria you can wire into CI. The failure mode is a debt curve, not an outage Free capacity absorbs small workloads well. It degrades along a curve as concurrency and retries stack up. Three effects dominate that curve: Retry amplification. One slow call becomes three requests after timeouts. Cold-path penalty. An idle endpoint pays extra latency on the first call. Queue debt. Slow drains shift work into the next window, then compound. None of these raise an alert by default. You only see them if you measure the tail, not the mean. What a free tier honestly covers MonkeyCode is an open-source coding agent project. The operator states that it provides free model access and a free server option, with a free token allowance listed in the terms in effect on 2026-09-15. Quotas and hardware change often, so read the current terms page before you plan around any number. Disclosure: This article was prepared as part of MonkeyCode's product outreach. Free access answers a cost question. It does not answer a fitness question. The rest of this post measures fitness. Step 1: Probe four numbers You need four measurements before any migration decision: p50 and p95 latency under your real concurrency error and timeout rate after retries cold-start latency after an idle period total drain time for one realistic batch The script below is a template harness. It has not been executed against MonkeyCode for this article. Adapt the body shape to your provider, then run it in your own environment. #!/usr/bin/env python3 """free_tier_probe.py - measure tail latency and error rate on a JSON endpoint.""" import argparse, asyncio, json, os, time import httpx PROMPT = "Reply with exactly one word: pong" async def one_call(client, endpoint, headers, model, timeout_s): body = { "model": model, "messages": [{"role": "user", "content": PROMPT}], "max_tokens": 4, } t0 = time.perf_counter() try: resp = await client.post(endpoint, headers=headers, json=body, timeout=timeout_s) return {"ok": resp.status_code == 200, "status": resp.status_code, "ms": (time.perf_counter() - t0) * 1000} except Exception as exc: return {"ok": False, "status": type(exc).__name__, "ms": (time.perf_counter() - t0) * 1000} def percentile(values, q): if not values: return float("nan") ordered = sorted(values) idx = min(len(ordered) - 1, int(round(q * (len(ordered) - 1)))) return ordered[idx] async def run(endpoint, api_key, model, total, concurrency, timeout_s): headers = {"Authorization": f"Bearer {api_key}", "Content-Type": "application/json"} limits = httpx.Limits(max_connections=concurrency) async with httpx.AsyncClient(limits=limits) as client: sem = asyncio.Semaphore(concurrency) async def guarded(): async with sem: return await one_call(client, endpoint, headers, model, timeout_s) started = time.perf_counter() results = await asyncio.gather(*(guarded() for _ in range(total))) wall_s = time.perf_counter() - started return results, wall_s def summarize(results, wall_s, p95_budget_ms, error_budget): lat = [r["ms"] for r in results] errors = [r for r in results if not r["ok"]] report = { "requests": len(results), "wall_seconds": round(wall_s, 2), "p50_ms": round(percentile(lat, 0.50), 1), "p95_ms": round(percentile(lat, 0.95), 1), "max_ms": round(max(lat), 1), "error_rate": round(len(errors) / len(results), 4), } report["verdict"] = "pass" if ( report["p95_ms"] /v1/chat/completions \ --model \ --requests 200 --concurrency 8 \ --p95-budget-ms 6000 --error-budget 0.02 echo $? # 0 = keep it here, 1 = start the exit plan Enter fullscreen mode Exit fullscreen mode The exit code is the point. A probe that only prints a table gets ignored. A probe that fails CI forces a decision. Measure cold start separately. Wait at least thirty minutes idle, then time a single call. Record it next to the warm p50. Step 2: Read the decision table Workload shape Free tier fit Reason Local dev chat, one user Good Low concurrency hides tail latency Idempotent lint or test agent Conditional Safe only with capped retries Nightly batch inside a wide window Conditional Drain time must fit the window Interactive path with a latency SLO No No capacity guarantee to cite 10x burst fan-out No Retries multiply during bursts Contractual uptime obligations No You need a vendor commitment Conditional means the probe decides. "No" means no probe will save it. Step 3: Write exit criteria before you need them Write these down while the system is calm. Numbers below are policy examples, not product facts. Set your own. p95 exceeds three times your interactive budget on two consecutive runs. Error rate stays above two percent after retries are counted. Drain time exceeds the available window by more than twenty percent. Two incidents in one month trace to capacity instead of code. Engineer hours spent diagnosing exceed one month of the paid tier. Criterion five is the honest one. Free compute stops being free when it consumes senior time. Red flags that say stop now Your retry policy has grown from one attempt to three. The same job now needs a second scheduling window. Nobody can state the current concurrency ceiling. Dashboards show mean latency only. The team routes around the endpoint during releases. Any two of these means the exit plan should already exist. Better alternatives when the answer is no Move the workload to a paid tier with a written rate limit. Self-host a small inference server for steady, private traffic. Add a queue with backpressure so bursts shed instead of retry. Split the job: fast path stays free, slow path runs in batch. Degrade the feature deliberately instead of timing out. Most teams need two of these, not all five. Who should not use this approach Teams with uptime clauses in customer contracts. Workloads under data residency or audit constraints. Projects with no metrics pipeline to feed the probe. Jobs that cannot cap concurrency or retries. For everyone else, the probe is cheap and the answer arrives in an hour. The numbers decide Free access is a legitimate place to start an agent backend. It is a poor place to hide an unmeasured one. Run the probe against your free endpoint this week. If it passes, keep the workload there and revisit next quarter. If it fails, you now have a dated report to justify the next step, and a soft place to try the free server option before you commit to anything larger.

来源报道 · 1 篇 · 以下链接均前往原始媒体

← 返回精选动态 原文

更多内容