Skip to main content
Back to all posts
Nov. 20267 min read

Call It: an AI runs my Twitch predictions while I play, and 10 of 12 payouts matched chess.com's record

Twitch Predictions are locked behind Affiliate, and someone still has to open every bet and call the result by hand. Call It watches the game through OBS and does it: it opens the bet, locks it, pays out and clips the moment, on any channel. On a chess stream it had never seen, 10 of 12 payouts matched chess.com's record and it refunded 8 bets rather than guess.

TwitchConOpenAI CodexTwitch APIEventSubOBSAI AgentTypeScriptHackathon
I wrote this post for the Codex x TwitchCon Hackathon (Devpost, November 2026), and built Call It for the same submission. Source at github.com/JonathanSolvesProblems/call-it; it runs on your own machine with your own Twitch login and API key, so there is no hosted version to click. The live stream it was filmed on and a clip it made are linked below.
The claim in one sentence: on a 2.4-hour chess stream Call It had never seen, 10 of 12 game-result payouts matched chess.com's public game records, graded by a script with no model in it, and it refunded 8 bets instead of guessing. It was measured on one streamer's chess VODs, so the held-out run tests unseen games, not an unseen layout, and on the stream I tuned on it started at 4 of 10.
Title card on a dark purple grid: a circular headshot above the words Codex x TwitchCon Hackathon, Call It in large letters, and the line It watches your game and runs the bets.
Call It watches your game through OBS and runs the prediction bets in your Twitch chat. Any channel, no Affiliate needed.

Mid-pull, chat can only watch

I used to stream WoW on a small channel. Mid-pull, both hands on the keyboard, my chat could only watch. Twitch has a betting game for exactly that moment, Predictions, but it is locked behind Affiliate, and even with it someone has to start every bet and call the result by hand. Call It does that job. It watches the game through OBS and runs prediction bets in chat: it opens them when a fight is about to start, locks them near the end, settles them when the result is on screen, and posts a clip and a stream marker. Any channel can run it, with no Affiliate, no mods and no server to host.

A Twitch VOD of my game Orvandel during a boss fight against The Bellows, with the Call It overlay reading Will The Bellows be defeated? with Bellows down at 300 points from 1 bettor, a webcam in the corner, and chat showing the bot's BET, LOCKED and Refunded messages beside viewer bets like !1 300.
Live on Twitch: a boss appears and Call It opens the bet on its own. Chat bets with !1 or !2; here my main account plays the viewer.

What happened on stream

On my own game, Orvandel, an MMO I built, live on Twitch: a boss title card appears and Call It opens "Will The Bellows be defeated?" in chat. A viewer bets !1 300 (my main account, playing the viewer). The overlay card fills as points come in, and near the end of the fight it locks. When the kill banner shows, a fast model proposes the result and a second, stronger model checks the frames before anyone is paid. The payout lands in chat with a clip link, and a marker goes into the VOD. The agent makes all three Twitch calls itself.

The Call It overlay card on stream during the fight, filling as viewers bet points on each outcome before it locks.
The overlay card on stream fills as points come in, then locks near the end of the fight.
Twitch chat after the kill: Call It announces the payout to the winning side, posts a clip link, and a stream marker is added to the VOD.
The payout lands in chat with a clip link, and a marker goes into the VOD. The agent makes all three Twitch calls itself.

How it decides

Every 4 seconds gpt-5.4-mini sees the last three OBS frames, the bet state and the recent decisions, and must call exactly one tool: wait, open_bet, lock_bet, resolve_bet or cancel_bet. Code never picks the action; it only enforces limits: one bet at a time, a gap between bets, question and outcome length, a timeout refund, and spend caps. A proposed payout goes to a second look on gpt-6.1-sol, which sees the proposal frames and the newer frames and settles on the outcome the frames prove, or rejects it. Every decision, with the frames it saw, is in the decision log.

The Call It debug page: the current bet Will The Bellows be defeated?, resolved, the latest game frame, and a Recent decisions list showing wait, lock_bet and resolve_bet from gpt-5.4-mini and confirm_resolution from gpt-6.1-sol saying The Bellows has been defeated.
Every payout gets a second look: gpt-5.4-mini proposes the result, gpt-6.1-sol checks the frames before anyone is paid.

When it can't see the result, it refunds

It once opened a bet while I was talking to a quest-giver, saw no fight, and gave everyone their points back. A refund is the agent's answer whenever the frames do not prove an outcome, and the broadcaster or a moderator can force one at any time with !callit cancel.

The Twitch VOD on Orvandel's character screen with the Call It overlay reading Refunded, Points returned, The fight ended without a visible defeat or wipe, and chat showing the bot's refund message and a clip link.
When it cannot see a result it refunds: the fight ended without a visible defeat or wipe, so every stake was returned.

Measured against something I do not control

My own game cannot grade a bet, because I wrote it. So I replayed real chess streams through the same loop and graded every game-result payout against chess.com's public game records, with a script that has no model in it. On a 2.4-hour stream Call It had never seen, 10 of 12 payouts matched the record and it refunded 8 bets instead of guessing. The second look stepped in on 11 of 18 proposed payouts (5 wrong winners corrected, 6 payouts from another game's result rejected) and was right all 11 times. Before those fixes, on the stream I tuned on, it was 4 of 10. The run files, decision logs and grades are in eval/results/, and npm run grade re-grades them with no model calls.

Results card headed Graded against chess.com's official game records, A 2.4-hour stream Call It had never seen: 10 of 12 payouts matched the record, and 8 refunded instead of guessing, citing eval/results/2893451280-heldout/grade-final.json and noting the grader has no model in it.
Graded against chess.com game records on a 2.4-hour stream it had never seen: 10 of 12 payouts matched, 8 bets refunded.

Built in one Codex thread

All product code was written in OpenAI Codex, in one thread, from SPEC.md and AGENTS.md: 18 prompts, 26 commits, 72 tests. Codex wrote the Twitch EventSub client, the device-code auth, the agent loop and tool schemas, the guards and spend caps, the points ledger and payout math, the second look, the clip and marker calls, the overlay, replay mode and the chess grader. Every prompt I sent is in CODEX_PROMPTS.md in the order it was sent, and the commit history shows the build step by step. I used Claude Code alongside Codex for planning, prompt review, live testing and the evaluation runs.

The OpenAI Codex app on a thread titled Build Twitch auth and chat setup: a prompt asking for the fixes from the live demo stream, Codex's summary that typecheck and all 72 tests pass and the work is committed, and a changes panel listing nine edited source and test files.
Built in one OpenAI Codex thread from SPEC.md and AGENTS.md: 18 prompts, 26 commits, 72 tests. Every prompt is in the repo.

What is not claimed

The 10 of 12 is graded by chess.com's records, not by me or by a model, but it comes from one streamer's chess VODs, so the held-out run tests unseen games on a layout the agent had already been tuned on, and twelve payouts is a small number. The live demo on my own game has no outside grader at all, which is why the measurement is on chess. The agent reads pixels and can be wrong: the second look reduces payout mistakes but does not guarantee them away, and the streamer can refund any bet with !callit cancel. It runs bets in chat mode with its own points; native Channel Points Predictions for Affiliate channels are the next step. Clips and markers are made only while the channel is really live, and live mode defaults to a cap of 600 model calls.

Related project

Call It: an agent that watches your game through OBS and runs your Twitch chat's prediction bets, opening, locking, paying out and clipping the moment, on any channel with no Affiliate needed

View the project