Tuned against a real CheckJC captcha
Tested the LLM solver against the same composite image the human
flow sends via Telegram, with all four models we have in the
dropdown. Findings:
| Model | Result |
|---|---|
| gemini-2.5-flash-lite | ✅ 100% accurate, free tier, cheapest |
| gemini-2.5-flash | |
| gemini-2.5-pro | ❌ HTTP 429 — free tier quota is 0 |
| gemini-2.0-flash | ❌ HTTP 429 — legacy, existing customers only |
Changes:
- Default model is now
gemini-2.5-flash-lite(was 2.5-flash).
Cheapest of the four, works on the free tier without tuning. - Request body now always sends
thinkingConfig: {thinkingBudget: 0}. This makesgemini-2.5-flashanswer correctly (it's a
thinking model — without this it spends the output budget reasoning
and returns truncated text). Other models ignore the field
harmlessly. maxOutputTokensbumped from 32 to 64. 16 digits is ~10 tokens,
so 64 leaves comfortable headroom at no measurable extra cost.- Profile dropdown order updated to put the recommended option
first, with help text flagging which models need a paid plan. - The standalone debug script (
tests/debug_gemini_solver.py) is
updated to match the same defaults.
Image
ghcr.io/gonzalez8/checktime:1.9.6 / :1.9 / :latest
Upgrade
sed -i 's/^CHECK_TIME_VERSION=.*/CHECK_TIME_VERSION=1.9.6/' stack.env
docker compose pull app
docker compose up -d appAfter the deploy, new users who paste a Gemini API key without
touching the dropdown will use gemini-2.5-flash-lite automatically.
Existing users keep whatever model they previously selected.
Verify locally
python tests/debug_gemini_solver.py --api-key YOUR_KEY --image /path/to/composite.png
# Should print "SUCCESS: Gemini returned a well-formed 16-digit reply."