Which recipe when
| You need… | Use | In this repo |
|---|---|---|
| One job, a few tools, some judgement | LlmAgent with tools | Step 1 · Scout |
| Fixed steps, each using the last one's output | SequentialAgent + output_key + {placeholders} | Step 2 · Match Prep |
| Independent work on the same input, faster | ParallelAgent, then a merge step | Step 3 · Scouting Department |
| Refine until good enough | LoopAgent + a critic + exit_loop + max_iterations | Step 4 · Tribün |
| Different questions need different specialists | LlmAgent orchestrator + AgentTool + clear descriptions | Step 5 · Technical Director |
| The same agent on another data source | McpToolset instead of local tools | Bonus · live MCP |
And the habits that held across all of them: let tools do the counting, return small dicts with "not available" instead of null, build agents with factory functions, and keep the model name in one place.
Try it yourself
Add a compare_players tool to the scout and ask "Salah mı Franculino mu daha formda?" Give the scouting department a fourth scout. Make the Tribün stricter and count the rounds, then set max_iterations=1. Swap in the vague descriptions and watch the director stumble. The repo README has one challenge per step.
Code, data, Colab notebook and tests: github.com/omarcevi/trabzonspor_analyst. The data is a FotMob and ESPN snapshot from 30 October 2026, so injury news may have moved on.
Thanks to GDG Trabzon for hosting DevFest Trabzon 2026, and to everyone who spent part of their Saturday building a football staff out of agents with me.