The current wave of agent-gatekeeper posts keeps circling the same failure. A free endpoint works in the demo. Then it stalls under burst load. I don't want to find that out in production. So I built a small burn-test harness. It turns vague 'free model' claims into measurable rows.
MonkeyCode's free tier is the target. The project describes itself as open source. It advertises a free model endpoint and a free server option. The token allowance is listed as 30 million tokens. I treat those numbers as claims, not facts. Disclosure: This article was prepared as part of MonkeyCode's product outreach.
What I measure
A free endpoint is only useful if four things stay readable.
- Latency under normal prompts.
- Latency growth when prompt size jumps.
- Error class under burst traffic.
- Free server health over a longer window.
Skip those four and you will discover the limit at the worst time.
The harness
This Python script is endpoint-agnostic. Point it at any OpenAI-style chat completions endpoint.
# burn.py
import os, time, json, urllib.request, urllib.error
ENDPOINT = os.environ['ENDPOINT']
KEY = os.environ['API_KEY']
MODEL = os.environ.get('MODEL', 'free-model')
def call(prompt, timeout=20):
payload = json.dumps({
'model': MODEL,
'messages': [{'role': 'user', 'content': prompt}],
}).encode()
req = urllib.request.Request(
ENDPOINT,
data=payload,
headers={
'Authorization': f'Bearer {KEY}',
'Content-Type': 'application/json',
},
)
started = time.time()
try:
with urllib.request.urlopen(req, timeout=timeout) as resp:
body = resp.read()
return {
'ok': True,
'ms': round((time.time() - started) * 1000),
'bytes': len(body),
'status': resp.status,
}
except urllib.error.HTTPError as e:
return {
'ok': False,
'ms': round((time.time() - started) * 1000),
'status': e.code,
'retry_after': e.headers.get('Retry-After'),
}
except Exception as e:
return {'ok': False, 'error': type(e).__name__}
Run four scenarios. Short checks baseline. Long checks token scaling. Burst checks rate-limit reset behavior.
python - <<'PY'
from burn import call
short = 'Summarize this: ' + ('hello ' * 10)
medium = 'Return keys only: ' + ('context ' * 200)
long = 'Tag intent in: ' + ('noisy ' * 800)
burst = 'Reply ok to: ' + ('ping ' * 50)
for label, prompt in [('short', short), ('medium', medium), ('long', long)]:
print(label, call(prompt))
for i in range(8):
print('burst', i, call(burst))
PY
Sample output, not a benchmark
This block is a fixture. It shows the shape I want. It is not a measured result from the public endpoint.
short {'ok': True, 'ms': 612, 'bytes': 241, 'status': 200}
medium {'ok': True, 'ms': 1187, 'bytes': 492, 'status': 200}
long {'ok': True, 'ms': 2841, 'bytes': 938, 'status': 200}
burst 4 {'ok': False, 'ms': 97, 'status': 429, 'retry_after': '4'}
burst 5 {'ok': False, 'ms': 91, 'status': 429, 'retry_after': '4'}
Scoring table
Thresholds are my solo-builder limits. They are not industry rules.
| Signal | Green | Yellow | Red |
|---|---|---|---|
| Short prompt p50 | under 1.5s | 1.5s to 4s | over 4s |
| Long prompt vs short | under 6x | 6x to 12x | over 12x |
| Burst 429 count | 0 | 1 to 2 | over 2 |
| Retry-After behavior | fixed reset | jitter | missing or zero |
A red row does not mean the service is bad. It means the free tier is not suited to my task. That is a useful exit.
Server health check
The free server option needs a separate probe. A model endpoint can stay healthy while the server silently drops requests. Run this loop from a machine close to the deployment.
for i in $(seq 1 40); do
code=$(curl -s -o /dev/null -w '%{http_code}' \
-H 'Authorization: Bearer $API_KEY' \
'$SERVER/health' || echo 'fail')
echo "$i $code"
sleep 20
done
I watch for two failure classes. The first is a non-200 status. The second is a total failure from DNS or connection refused. Both count against the free server claim.
Where I would draw the line
Green means I can use the free model for text cleanup, small summarization, and non-blocking helper calls. Yellow means I add caching and a timeout. Red means I keep the free endpoint out of any request path a user waits on.
For the free server, a single failed health check is not fatal. Two failures in one window are. I also cap the total token spend with a local ledger. That avoids a surprise when the 30 million token allowance runs out.
If you want to test MonkeyCode's free tier, point the harness at the documented endpoint. Your local error log will tell you more than a feature page can.
Limits and who should skip this
I did not publish a public benchmark here. Quotas, model names, and server specs change. Read the project docs before running the script. Do not send secrets or private user text through a free endpoint until you understand retention.
Skip this approach if you need low tail latency, guaranteed uptime, or compliance review. A free endpoint is a canary, not a foundation.
What I would test next
The next missing signal is partial failure. A long prompt can return truncated JSON without an HTTP error. If you run this against your own endpoint, tell me which failure mode you saw first: rate-limit jitter, silent truncation, or server flapping?
Top comments (0)