How we used Kimi (Moonshot AI) to build an on-chain AI rival for CloutCall, a Monad Metropolis hackathon project.
The game
CloutCall is a prediction game about the internet's favourite argument: "this is going to blow up." Every market asks one question about a public YouTube video: will it pass N views by a deadline? Players sign in with Face ID (Mera passkeys on Monad), make a call in one tap, and dare a friend to take the other side.
We wanted a rival that is always there, always has an opinion, and shows its work. So we built CloutBot, powered by Kimi.
What Kimi does
For every open market CloutBot hasn't called yet, our agent (resolver/src/agent.ts):
Pulls the video's live signals from the YouTube Data API: views, likes, comments, hours since publish.
Turns them into numbers a model can reason about: average views per hour so far, views per hour still needed to hit the target, like rate and comment rate, and the gap to target.
Sends that to Kimi (kimi-k2.6) through Moonshot's OpenAI-compatible chat completions API, at temperature: 0.3 with response_format: json_object.
Gets back a structured call: side (YES/NO), a calibrated confidence (50–95), predictedViews at the deadline, and a short reasoning.
Stakes points sized by confidence (50 to 300 points) and writes the pick, confidence, predicted views, model name and reasoning to our AgentJournal contract on Monad before calls close.
Because the pick and reasoning are on-chain before the deadline, CloutBot can't quietly change its mind. Players see what it said, then tap "Take the other side".
Why Kimi
It reasons from numbers instead of vibes. Given "needs 41k views/hour, currently doing 18k/hour, 9 hours left", Kimi gives a confident NO and explains the gap in one sentence. That reasoning is the product: it's what players argue with.
Reliable structured output. JSON mode plus a strict schema meant we could parse every response, clamp confidence to a sane range, and never let a malformed answer stake points.
OpenAI-compatible API. We integrated in an afternoon with a plain fetch, no SDK lock-in, and unit-tested it with a mocked fetch (resolver/test/kimi.test.ts).
What it added to the product
Kimi turned a two-player game into a game you can always play. Every market has an opponent with a public, explained position. That gave us our hook, Humans vs AI: a live scoreboard (indexed by Envio) of whether people predict virality better than a model, and a per-player "beat the AI" count on the leaderboard.
It also made the cold start easier. A new market isn't empty; CloutBot has already called it, so the first human has someone to disagree with.
Try it
Live app (Monad testnet): https://cloutcall.vercel.app
Code: https://github.com/ayush-agrawal001/cloutCall — see resolver/src/kimi.ts and resolver/src/agent.ts.
Can you beat the bot?
Top comments (1)
tr.ee/dev-to
Some comments may only be visible to logged-in visitors. Sign in to view all comments.