Which agent should
you leverage?
An agent here is three things: a narrow slice of the data plane, a prompt that knows that domain's traps, and a hard budget. Twenty-eight of them ship with the app. This page is the map — what each kind is for, when to reach for it, and one worked example end to end.
The short version: you rarely pick. Ask the orchestrator a question and it routes to whichever specialists fit, runs the independent parts in parallel and synthesises one answer. You pick deliberately when you want a specific desk — or when you're building an agent of your own and need to know what shape it should be.
Six kinds of agent
Not a taxonomy for its own sake. Each kind has a different failure mode, so each one is built differently — different tool surface, different model tier, different budget.
The orchestrator
Holds no data tools at all. Its whole job is to read your question, decide which specialists it needs, delegate, and stitch the results into one answer. Keeping it toolless is the point — a router that could also fetch odds would fetch odds instead of routing.
One surface, read deeply
Each owns a slice of the data plane and the vocabulary that goes with it — odds specialists know vig removal, racing analysts know how to read a racecard, the news scout knows the difference between a confirmed out and beat-writer chatter.
Sandboxed, and made to be checked
These run real Python in an ephemeral sandbox: fit a model, calibrate it on holdout, replay it against captured odds history. The output is a number with an error bar attached, and every one of them persists what it produced so the next run can be scored against it.
Memory and limits
The unglamorous ones, and the ones that make the rest honest. They journal what you did, settle it against results, and gate any recommendation against your bankroll and open exposure. The bet notifier is deliberately denied price tools so it can only format what another agent already found — it cannot go and re-price anything itself.
One game, one platform
Where a game has its own rulebook, a general agent gives vague answers. FPL has 38 hard deadlines, price changes, four chips and a rolling transfer budget; DFS has salary caps and contest structures. Merging those two prompts would make both worse, so they're separate agents.
The ones that grow the platform
The generalist catches whatever no specialist covers, solves it in a sandbox, and — only for genuinely repeatable patterns — crystallises the method into a reusable skill. The agent builder goes one step further and turns a recurring need into a versioned agent of its own. Skills are markdown playbooks, never code: they guide the model and cannot grant a tool.
The full roster
Generated from the spec files in the agents repo. Every agent below ships in the free app — nothing here is held back. "Model" is the class the agent defaults to; you can pin a different model per agent or per conversation.
Product plane — the agents you talk to
| Agent | Kind | Model | What it does |
|---|---|---|---|
| orchestrator | Router | balanced | Routes, delegates, synthesises. Holds no data tools of its own. |
| odds_specialist | Data | balanced | Cross-book prices: implied probability, fair price, best price, same-game multis. |
| stats_specialist | Data | fast | Fixtures, results, boxscores, game logs, head-to-head, leaders, ladders, injuries. |
| racing_analyst | Data | balanced | Meetings, racecards, next-to-jump, results and dividends, futures, SRM, cross-book win/place. |
| prediction_market_analyst | Data | balanced | Kalshi and Polymarket contracts, and the exchange-vs-book gap once the vig is removed. |
| news_scout | Data | fast | Pre-game intel from X and league news: injuries, team news, weather — confirmed vs chatter. |
| modelling | Quant | balanced | Builds and calibrates probability models in the sandbox; persists versions and predictions. |
| value_scout | Quant | fast | +EV selections: calibrated model probabilities against vig-removed market prices. |
| arb_hunter | Quant | fast | Cross-book and exchange-vs-book arbitrage; sets standing arb watches. |
| backtester | Quant | fast | Replays predictions against captured odds history and results: ROI, hit-rate, CLV, variance. |
| data_analysis | Quant | balanced | Ad-hoc pandas/matplotlib work in a sandbox: play-by-play, advanced metrics, charts, CSV exports. |
| bet_tracker | Ledger | fast | Journals your bets (you place them), settles results, reports P&L, ROI, hit-rate, CLV. |
| bankroll_manager | Ledger | fast | Kelly/flat sizing guidance and the exposure gate — caps against bankroll and open bets. |
| bet_notifier | Ledger | fast | Formats a finding for delivery: selection, book, price, sizing, reasoning, sources. |
| market_steward | Ledger | fast | Maintains the canonical market dictionary as data; safe aliases applied, ambiguous ones reported. |
| concierge | Ledger | fast | Plain-language explainer — turns the team's findings into jargon-free answers. |
| fpl_manager | Domain | balanced | Fantasy Premier League: squad review, captaincy, transfers, chip timing. Advisory only — see below. |
| fantasy_advisor | Domain | balanced | DFS and season-long fantasy: projections from stats, salary-cap lineup optimisation, player research. |
| generalist | Meta | balanced | The catch-all. Solves what no specialist covers, then writes reusable skills from what it learned. |
| agent_builder | Meta | balanced | Builds a custom agent from a plain-English goal: drafts the prompt, picks the data and skills, versions it. |
| slack_manager | Meta | fast | Slack workspace housekeeping — channels, naming, topics, alert routing. |
Ops plane — maintains the platform itself
| Agent | Model | What it does |
|---|---|---|
| mcp_health | fast | Runs doctor plus the contract suite against the data plane; files issues on real breaks. |
| incident_triage | fast | Watches feed health; remediates within an allow-list (retry/disable/enable) or escalates. |
| eval_benchmark | fast | Runs the offline eval gate, records agent metrics, reports regressions. |
| repo_improver | strong | Proposes changes from feedback and telemetry; opens CI-gated PRs a human merges. |
| code_reviewer | strong | Reviews PRs diff-first: approve, or request changes. |
| site_manager | balanced | Keeps this site honest: uptime, catalogue drift, traffic, badge PRs. |
| docs_keeper | balanced | Keeps the docs in sync with the code; opens a PR when the roster or structure drifts. |
Worked example: the FPL Manager
The newest agent in the roster, and the clearest illustration of how a domain agent gets built. It is currently at version 0.1.0 — Phase 0 of a longer plan — and everything below is the real spec, not an illustration of one.
fpl_manager
Reads a real Fantasy Premier League squad and says what it would do — starting XI and bench order, captain and vice, any transfer worth making, chip timing — and why. It takes no actions. FPL's write endpoints exist and their payloads are known; they are deliberately not wired in.
The spec, in full
# src/sportsdata_agents/specs/fpl_manager.yaml spec_version: 1 agent: id: fpl_manager display_name: "FPL Manager" version: 0.1.0 model_tier: balanced system_prompt: | You advise on a Fantasy Premier League squad. You RECOMMEND; you never act. … tools: # groups, not capabilities — see right mcp_groups: [fpl.players, fpl.reference, fpl.fixtures, fpl.managers] native: [run_python] forbidden_capabilities: [sport.transactions] sandbox: ephemeral context: retrieval: jit verify: true limits: max_tool_calls: 25 max_tokens: 120000 cost_ceiling_usd: 0.40
Four decisions worth stealing
- Groups, not capabilities — a measured 38× saving
Capability tags are the cross-provider unit, and the old rule was to prefer them. With
63 providers in the catalogue they widen the tool
set instead of narrowing it:
ref.playersalone matches a dozen providers. The thirteen capabilities this agent needs resolve to 289 tools — about 115k tokens of definitions against a 120k budget, before a single question is asked. Naming FPL's four groups gives it all 16 of its tools for roughly 3k. - The prompt is mostly a list of traps
Not "you are a helpful FPL assistant". It's the five things that make advice silently
wrong:
selling_priceis notnow_cost(FPL returns half the rise when you sell); prices are tenths of a million; before the first deadline transfers are unlimited so the 4-point hit doesn't apply; a chip already played is gone; form and ownership come back as strings and compare wrong until converted. - Advisory is enforced, not promised
forbidden_capabilitieshard-denies the transactions surface, so the agent cannot acquire write access by accident later. Actually managing a squad is Phase 1 — behind a policy engine and an approval step. - Separate from fantasy_advisor on purpose That one is DFS-shaped: salary caps, contest rules, cash versus GPP. Season-long FPL is a different game, and merging the prompts would make both vaguer.
Why the tool budget is the whole ballgame
Every tool schema rides on every single call. The capability route spends ~115k of a 120k budget describing tools the agent will never use; the group route spends ~3k. Rule of thumb: if the agent plays one game on one platform, name the groups. If it genuinely spans providers, name capabilities.
What an answer looks like
Should I captain Haaland this week, and is my bench order right?
Deadline is Sat 02:30 AEST — everything below is relative to that. Your squad reads 3-4-3 with one change needed: Mbeumo starts ahead of Rogers (home, difficulty 2, versus an away trip at difficulty 4). Captain Haaland — he is the highest-projected option and at 62.4% ownership the armband elsewhere is a differential play, not a safety play. Name which you're optimising for: against a mini-league you're chasing, the differential is defensible; from in front it isn't. Vice on Salah, not your current pick — a benched vice wastes the armband when the captain doesn't play. Bench order 1–3: Rogers, Muric, Van den Berg. No transfer worth making; hold the free one. Two flags: Gvardiol is a 75% doubt (news 18:20), and your two Arsenal players face each other in GW17.
Anatomy of a spec
Every agent in the roster — and every one you build — is this same YAML document. The schema is strict: an unknown field is an error, not a shrug, so a typo fails loudly at load time instead of being silently ignored.
- id · display_name · version
- Identity, and semver. Pinning matters: a workspace can pin an agent version, and loading a deprecated one still works — it warns rather than breaking.
- plane: product | ops
- The hard split. Product agents serve you through the gateway; ops agents run under the platform's identity with platform credentials and are reachable only from the operator CLI.
- model_tier
fast,balanced,strong— or an explicitprovider/model. Most desks are fast; only review and repo work justifies strong.- system_prompt
- Where the domain knowledge lives. The good ones read as a list of the specific ways this domain makes an answer wrong, not as a personality.
- tools: mcp_capabilities | mcp_groups | native
- Capabilities span providers; groups scope to one. Native tools are deterministic in-process helpers — vig removal, Kelly fractions, lineup optimisation — that should never be an LLM's guess.
- skills
- Markdown playbooks loaded just in time. They guide the model; they cannot grant a tool or bypass a rule.
- forbidden_capabilities
- A hard deny-list, checked against the allow-list at validation. Defence in depth: it stops an agent quietly acquiring reach in a later edit.
- can_delegate_to
- Which other agents become callable tools. In practice only the orchestrator uses it.
- sandbox: none | ephemeral
- Whether the agent can execute code. Ephemeral means a fresh sandbox per run, discarded after.
- context · limits
- Retrieval policy, compaction on long runs, verification — and the ceilings: tool calls, steps, tokens, wall-clock, dollars. Every run is capped. There is no unbounded agent.
How to pick, in practice
orchestrator. It'll pull odds_specialist
and be done in one hop.backtester directly — it wants your prediction history and the
captured odds, and a routing hop adds nothing.fpl_manager. A general fantasy agent would answer, but vaguely —
the FPL rulebook is the hard part, not the data.data_analysis — sandboxed pandas and matplotlib, artifacts saved
to your machine.generalist solves it now; agent_builder turns it into
a permanent agent if it's going to recur.Build your own
The FPL Manager started as a plain-English description of a recurring need. That's
the intended path: describe the agent, let the builder draft the prompt, pick the data groups and
set the budgets, then version it. It persists locally and runs with
agents run --agent <id>.
Nothing leaves your machine.