Using Agents to Commentate over Football

Nash0x7e22 pts0 comments

Nash 🥇💙 on X: "With the World Cup starting this week, I thought it would be the perfect time to revisit our AI Football commentator and look at how things have changed with the new model releases over the last 6 months. It’s no Thierry Henry, but models are getting better and faster at video https://t.co/m1bUnT53hX" / X<br>Post

Log inSign up

Post

Nash 🥇💙

@neevash

With the World Cup starting this week, I thought it would be the perfect time to revisit our AI Football commentator and look at how things have changed with the new model releases over the last 6 months. It’s no Thierry Henry, but models are getting better and faster at video ng here is running in real-time, the annotations are coming from @roboflow RF-DETR nano running locally, responsible for detecting players + ball, a processor specifically handling the match state and keeping track/understanding of possession, shirt colours, visible jersey numbers, pressure, and field position (backed by Gemini 3.5 Flash) and the commentator itself using OpenAI realtime.

@OpenAI Realtime receives the annotated video stream at 3 FPS and generates the spoken broadcast-style commentary. Detection events from RF-DETR trigger short prompts, and a debounce plus speaking guard keeps the agent from interrupting itself.

The important design choice is that the realtime model is not doing everything alone. Roboflow gives it visual structure, Gemini helps maintain continuity, and OpenAI Realtime handles the fast spoken delivery. The result is a smoother demo: users see the actual overlays, while the commentator can reference grounded details like “green number 6” or “white number 11” instead of giving generic sports commentary.

I’m excited about models like the recent Interaction model from @thinkymachines, capable of full-duplex understanding. Perhaps in another 6 months it’ll be worth coming back to this and comparing today’s models with tomorrow's :)

Github: github.com/GetStream/Visi…

Example: github.com/GetStream/Visi…

00:00

span:not(:empty)~span:not(:empty)]:before:content-['·'] [&>span:not(:empty)~span:not(:empty)]:before:px-1 [&>span:not(:empty)~span:not(:empty)]:before:shrink-0">10:05 PM · Jun 12, 202623Views

:host{display:inline-block;direction:ltr;white-space:nowrap;line-height:var(--number-flow-char-height, 1em) !important}span{display:inline-block}:host([data-will-change]) span{will-change:transform}.number,.digit{padding:round(nearest, calc(var(--number-flow-mask-height, 0.25em) / 2), 1px) 0}.symbol{white-space:pre}1number-flow-react > span{font-kerning:none;display:inline-block;line-height:var(--number-flow-char-height, 1em) !important;padding:calc(round(nearest, calc(var(--number-flow-mask-height, 0.25em) / 2), 1px) * 2) 0}1<br>:host{display:inline-block;direction:ltr;white-space:nowrap;line-height:var(--number-flow-char-height, 1em) !important}span{display:inline-block}:host([data-will-change]) span{will-change:transform}.number,.digit{padding:round(nearest, calc(var(--number-flow-mask-height, 0.25em) / 2), 1px) 0}.symbol{white-space:pre}2number-flow-react > span{font-kerning:none;display:inline-block;line-height:var(--number-flow-char-height, 1em) !important;padding:calc(round(nearest, calc(var(--number-flow-mask-height, 0.25em) / 2), 1px) * 2) 0}2

*]:shrink-0">New to X?<br>Sign up now to get your own personalized timeline!<br>Sign up with GoogleSign up with AppleCreate account<br>By signing up, you agree to the Terms of Service and Privacy Policy, including Cookie Use.

Relevant people<br>Nash 🥇💙@neevashFollow

Trending now

Don't miss what's happening<br>People on X are the first to know.

Log inSign up

number span height flow empty display

Related Articles