尚未检测到更新。GitHub 发布版本后会显示在这里。
Co na to AI: denní česká hra. 100 AI jsme se zeptali a teď hledáme osm nejčastějších odpovědí.
翻译准备中
正在加载完整 README。
查看完整 README ↗Daily Czech guessing game in the spirit of Family Feud / Co na to Češi: „100 AI jsme se zeptali a teď hledáme osm nejčastějších odpovědí na otázku…“ Live at https://ai100.appwrite.network. Every day one survey question goes to 100 AI answerers (a different OpenRouter model per answerer, each playing a different Czech persona). Their answers are merged, and the player guesses the 8 most common. Five wrong guesses and the game is over.
Scoring: an answer is worth 10 points per AI that gave it, and clearing the board adds 200. Tapping a hidden answer offers two clues. "Odkrýt písmeno" reveals the next letter, up to 3, and never the whole word; each one takes a quarter of that answer's points, so a hinted answer is always worth more than a miss and less than finding it with fewer letters. "Kdo to řekl?" is free: it describes the personas who gave the answer ("hlavně důchodci z Moravy") and names the youngest and the oldest.
Stack: TanStack Start, React 19, Tailwind 4, shadcn/ui (radix). Node 22.18+ (the pipeline runs TypeScript directly with Node's type stripping).
npm install
npm run dev # http://localhost:3000
npm test # matching, scoring, Prague day switch, stats, pipeline shapes
npm run build # production build in dist/
Routes: / today's game, /hra/YYYY-MM-DD a past day, /finale this week's Finále (/finale/<Monday> for earlier weeks), /archiv the archive, /dotazani the 100 respondents (/obsazeni redirects there), /vlastni/<id> a custom game, /admin the admin for accounts with the admin label. /sitemap.xml lists the main pages and every published day, and robots.txt points to it.
A new puzzle starts at 00:00 Europe/Prague. Puzzle #1 is 2026-10-01 (LAUNCH_DATE in src/lib/day.ts). The server only returns puzzles whose date is on or before today in Prague, so the client never receives future boards. The answers in a payload are XOR'd with a per-day key and base64-encoded, so they aren't readable at a glance. That is obfuscation, not security.
echo 'OPENROUTER_API_KEY=sk-or-...' > .env
npm run pipeline # make sure today + the next 6 days have puzzles
npm run pipeline -- --days 14 # keep 14 days queued
npm run pipeline -- --date 2026-11-02 # one day
npm run pipeline -- --date 2026-11-02 --force # redo a day
npm run pipeline -- --recluster 2026-11-02 # re-run only the judge on the saved answers
npm run pipeline -- --rejudge puzzles/2026-11-02.json # re-cluster a published board from its stored answers
npm run pipeline -- --aliases puzzles/2026-11-02.json # rewrite only the answer key (accepted guesses)
For each date the pipeline does seven things:
questions/YYYY-MM.json.data/answerers.json. Each is a model + persona pair. The prompt is in Czech, temperature 0.9, and asks for a single word, not one repeated from the question, as structured JSON when the model supports it, plain text otherwise. The persona only lightly colours the answer. A failing model is retried, then replaced by a spare from pipeline/lib/roster.ts. Reasoning effort is set from the catalogue: off where a model doesn't need it, the lowest level where it is mandatory.JUDGE_MODEL, default anthropic/claude-opus-5.5). The judge merges them into single-word canonical answers: same thing, same root (zákon, zákoník), inflections, typos; a list answer counts for its most common item. Every answer must be used exactly once, otherwise the judge is asked again.rejected, and a reserve question (questions/reserve-*.json) is tried for that date instead.puzzles/YYYY-MM-DD.json (the board, the long tail, who said what, cost) and runs/YYYY-MM-DD--<question>.json (every raw response, attempt, latency and cost, plus the judge's output).Each run prints the top 8, the top share, the cost and any gate flags.
.github/workflows/puzzles.yml tops the queue up every night and commits the new files. It needs the OPENROUTER_API_KEY repository secret.
Questions live in questions/YYYY-MM.json:
{ "id": "chata", "date": "2026-10-24", "text": "Co si berete s sebou na chatu?", "tags": ["chata"], "status": "approved" }
status is draft | approved | used | rejected; the pipeline only uses approved ones. The bank is dated through 2027-10-31 and has 50 undated reserves. A good question has an open but finite answer space. Avoid one obvious answer ("Jmenujte ovoce" gives 70 % jablko) and avoid hundreds of equally likely ones. Keep it under 70 characters.
Questions come from questions/ (dated through 2027-10-31, plus reserves) and from the questions table, which refills itself:
以上为 README 的开头部分。其余内容请阅读原文。 查看完整 README ↗