Last time, I showed how I built my FPL team using AI and kept it updated with the latest information. It did pretty well. It read the stats, weighed up the fixtures and produced a valid team with reasoning that felt coherent and thoughtful.
But I couldn't shake the feeling that we were leaving some significant performance boosts on the table.
Right now, the model has no real injury context - it can't tell the difference between a one-week knock and a season-ending injury, or spot that someone is simply away on international duty. It sees the probabilities, but not the narratives.
It also receives no qualitative guidance beyond the raw stats. And language models (unsurprisingly) reason far more naturally over language than over columns of numbers. A little structured insight could go a long way.
Then there's scale. We hand the model 600+ players in a single prompt and expect it to find the right signals among all that noise. That's a significant search problem to compress into one response.
So this post is about tightening the system - improving the pipeline so the model can focus on what actually matters, and hopefully select a stronger team.
Adding Context: Extending My RAG Layer
To address this, I need to give the model access to information it doesn't currently have.
In fact, I was already doing this - just in a very basic way. The pipeline retrieves the current player list, team data and fixtures from my datastore and feeds them into the prompt.
That's a form of Retrieval-Augmented Generation (RAG).
I'm not relying purely on whatever the model remembers from its training data. In post 1, I showed what happens when you do that: the model happily selects players who no longer play in the Premier League - like Estupiñán who moved to Italy. This is a classic knowledge cut-off problem - and the main reason people use RAG in the first place. Models need fresh information to make reliable decisions.
At its core, RAG is simple. Instead of asking a model to answer from memory, you first retrieve relevant external information, then pass that into the prompt so it can reason over it directly. The retrieval step grounds the model in reality. The generation step turns that
context into a decision.
Retrieve first. Generate second.

Modern RAG systems can get elaborate - vector databases, semantic search layers, multi-stage re-ranking pipelines, agent loops and other intricate constructions. My current build is far simpler: pull fresh structured data, attach it to the prompt, let the model reason.
But I can push this pattern further.
So far, I've only retrieved structured stats and fixtures. Next, I want to retrieve narrative context - injury updates, expert commentary and qualitative signals - and fold that into the pipeline before the team-building prompt ever runs.
It's the same principle - just with slightly more ambition.
Extension 1: Injury Context
One of the key things the model missed was the subtlety around injury and availability context. Right now, the model just sees a probability of playing in the next match, it doesn't know the reason why. This is potentially problematic, since it treats a player with a season-ending injury the same as a player who is just unavailable for one gameweek due to a minor injury, suspension or just general squad rotation and could be benched to prevent the transfer. The model doesn't have this context to make a decision.
As humans we do, we know that if a cheap £4.0m player is suspended for one gameweek, we can just drop them to the bench for that week, but we also know that if there is no chance of them playing all season we can transfer them out for someone who at least has a chance of playing.
So I need to help the model understand and give it this context.
So in my RAG pipeline I extended it by adding an enrichment step prior to team selection.
The FPL API does provide some injury context, but I have a feeling that news sources might provide more detailed and nuanced information on this. Therefore I opted to fire off a new prompt to scour the web for the latest injury and availability news on each player on a team by team basis.
Why Query by Team?
By doing it on a team by team basis I'm making a trade off. I could query each player individually - but with 600+ players in the game, that's 600+ prompts per gameweek. That's expensive and unnecessary. At the other extreme, I could stuff all players into a single giant prompt. But that's very unstable and a huge ask for the model, likely leading to hallucinations and missed players. Grouping by club is a sensible midpoint.
Grouping by team does also have some advantages, the team has the same natural context, all the players are playing the same fixture. There's also the important added benefit of news searches, the source of the information for each team is likely to come from the same press conference or injury report, making it far more efficient.
How It Fits Into the Pipeline?
Architecturally, this sits before team selection.
- Pull fresh FPL data from the datastore
- Group players by club
- For each club:
- Build a prompt with squad list + gameweek context
- Query the model and allow it to search the web
- Return one structured line per player (JSON only)
- Persist the injury enrichment back into the datastore
- Use enriched data in the final team-building prompt

The key is that the team-building model never performs web search itself. It receives the enriched information with all the relevant context.
The Prompt
To trigger the enrichment search we need a prompt. The prompt contains:
- Task specification
- Gameweek context for the team
- The squad list
- Player stats
- JSON output structure
For each player we request that the model returns a short sentence summarising the injury news and playing likelihood for the player, preceded by a flag indicating the player's availability status, either Fit, Minor doubt, Major doubt or Out.
It's reasonably self-explanatory from the example prompt below. You can clearly see all these elements.
Your task is to collate the latest injury news on players in the Arsenal squad. Your outputs will be used to assess whether each player is fit for the upcoming gameweek.
GAMEWEEK CONTEXT:
- Season: 2025/2026
- Gameweek: 26
- Team: Arsenal
- Fixture: Arsenal are double gameweek: away to Brentford on Thursday 12th February 2026 at 20:00 and away to Wolves on Wednesday 18th February 2026 at 20:00
- Fixture difficulty: 2.5
- Double gameweek: This is a double gameweek.
Squad & stats below are for context only. Do NOT copy this section into the output. Focus on returning the JSON exactly as specified later.
ARSENAL SQUAD:
David Raya Martín (GK, £5.9m)
[STATS] PPG: 3.7, Form: 3.7, Total Points: 108, Minutes: 2340, Clean Sheets: 13, Goals Conceded: 18, Saves: 37, Bonus: 5, BPS: 433, ICT: 41.4, Ownership: 35.3%, Availability: 100.0%
Kepa Arrizabalaga Revuelta (GK, £4.1m)
[STATS] PPG: 0.0, Form: 0.0, Total Points: 0, Minutes: 0, Clean Sheets: 0, Goals Conceded: 0, Saves: 0, Bonus: 0, BPS: 0, ICT: 0.0, Ownership: 0.4%, Availability: 100.0%
Karl Hein (GK, £4.0m)
[STATS] PPG: 0.0, Form: 0.0, Total Points: 0, Minutes: 0, Clean Sheets: 0, Goals Conceded: 0, Saves: 0, Bonus: 0, BPS: 0, ICT: 0.0, Ownership: 0.2%, Availability: 0.0%
Tommy Setford (GK, £3.9m)
[STATS] PPG: 0.0, Form: 0.0, Total Points: 0, Minutes: 0, Clean Sheets: 0, Goals Conceded: 0, Saves: 0, Bonus: 0, BPS: 0, ICT: 0.0, Ownership: 0.2%, Availability: 100.0%
Gabriel dos Santos Magalhães (DEF, £7.1m)
[STATS] PPG: 4.3, Form: 4.3, Total Points: 138, Minutes: 1715, Clean Sheets: 12, Goals Conceded: 11, Bonus: 18, BPS: 463, ICT: 84.9, Ownership: 43.0%, Availability: 100.0%
Jurriën Timber (DEF, £6.4m)
[STATS] PPG: 3.2, Form: 3.2, Total Points: 123, Minutes: 2089, Clean Sheets: 12, Goals Conceded: 16, Bonus: 7, BPS: 448, ICT: 107.9, Ownership: 31.1%, Availability: 100.0%
Riccardo Calafiori (DEF, £5.6m)
[STATS] PPG: 1.3, Form: 1.3, Total Points: 85, Minutes: 1346, Clean Sheets: 10, Goals Conceded: 7, Bonus: 4, BPS: 309, ICT: 56.6, Ownership: 6.5%, Availability: 100.0%
William Saliba (DEF, £6.1m)
[STATS] PPG: 3.7, Form: 3.7, Total Points: 83, Minutes: 1714, Clean Sheets: 10, Goals Conceded: 12, Bonus: 4, BPS: 370, ICT: 48.3, Ownership: 14.4%, Availability: 100.0%
Piero Hincapié (DEF, £5.1m)
[STATS] PPG: 2.3, Form: 2.3, Total Points: 49, Minutes: 1123, Clean Sheets: 3, Goals Conceded: 12, Bonus: 4, BPS: 196, ICT: 35.7, Ownership: 0.6%, Availability: 100.0%
Benjamin White (DEF, £5.1m)
[STATS] PPG: 1.2, Form: 1.2, Total Points: 30, Minutes: 409, Clean Sheets: 3, Goals Conceded: 4, Bonus: 3, BPS: 112, ICT: 25.0, Ownership: 0.5%, Availability: 100.0%
Cristhian Mosquera (DEF, £5.3m)
[STATS] PPG: 0.7, Form: 0.7, Total Points: 21, Minutes: 519, Clean Sheets: 1, Goals Conceded: 5, Bonus: 1, BPS: 99, ICT: 15.0, Ownership: 0.1%, Availability: 100.0%
Myles Lewis-Skelly (DEF, £5.1m)
[STATS] PPG: 0.0, Form: 0.0, Total Points: 12, Minutes: 311, Clean Sheets: 0, Goals Conceded: 5, Bonus: 0, BPS: 36, ICT: 9.4, Ownership: 1.4%, Availability: 100.0%
Jakub Kiwior (DEF, £5.4m)
[STATS] PPG: 0.0, Form: 0.0, Total Points: 0, Minutes: 0, Clean Sheets: 0, Goals Conceded: 0, Bonus: 0, BPS: 0, ICT: 0.0, Ownership: 0.0%, Availability: 0.0%
Brayden Clarke (DEF, £3.8m)
[STATS] PPG: 0.0, Form: 0.0, Total Points: 0, Minutes: 0, Clean Sheets: 0, Goals Conceded: 0, Bonus: 0, BPS: 0, ICT: 0.0, Ownership: 0.4%, Availability: 100.0%
Maldini Kacurri (DEF, £3.9m)
[STATS] PPG: 0.0, Form: 0.0, Total Points: 0, Minutes: 0, Clean Sheets: 0, Goals Conceded: 0, Bonus: 0, BPS: 0, ICT: 0.0, Ownership: 0.1%, Availability: 0.0%
Josh Nichols (DEF, £3.7m)
[STATS] PPG: 0.0, Form: 0.0, Total Points: 0, Minutes: 0, Clean Sheets: 0, Goals Conceded: 0, Bonus: 0, BPS: 0, ICT: 0.0, Ownership: 0.2%, Availability: 100.0%
Marli Salmon (DEF, £4.0m)
[STATS] PPG: 0.0, Form: 0.0, Total Points: 0, Minutes: 0, Clean Sheets: 0, Goals Conceded: 0, Bonus: 0, BPS: 0, ICT: 0.0, Ownership: 0.0%, Availability: 100.0%
Declan Rice (MID, £7.6m)
[STATS] PPG: 2.7, Form: 2.7, Total Points: 138, Minutes: 2145, Goals: 4, Assists: 7, Bonus: 18, BPS: 590, ICT: 171.6, Ownership: 35.5%, Availability: 100.0%
Martín Zubimendi Ibáñez (MID, £5.3m)
[STATS] PPG: 4.3, Form: 4.3, Total Points: 103, Minutes: 2175, Goals: 5, Assists: 1, Bonus: 9, BPS: 468, ICT: 103.6, Ownership: 5.9%, Availability: 100.0%
Bukayo Saka (MID, £9.8m)
[STATS] PPG: 0.7, Form: 0.7, Total Points: 102, Minutes: 1563, Goals: 4, Assists: 7, Bonus: 10, BPS: 396, ICT: 161.7, Ownership: 7.7%, Availability: 50.0%
Leandro Trossard (MID, £6.8m)
[STATS] PPG: 2.3, Form: 2.3, Total Points: 94, Minutes: 1495, Goals: 5, Assists: 5, Bonus: 9, BPS: 337, ICT: 121.4, Ownership: 1.3%, Availability: 75.0%
Eberechi Eze (MID, £7.2m)
[STATS] PPG: 0.7, Form: 0.7, Total Points: 71, Minutes: 1123, Goals: 4, Assists: 3, Bonus: 6, BPS: 274, ICT: 73.9, Ownership: 7.8%, Availability: 100.0%
Mikel Merino Zazón (MID, £5.4m)
[STATS] PPG: 1.3, Form: 1.3, Total Points: 66, Minutes: 996, Goals: 4, Assists: 3, Bonus: 5, BPS: 238, ICT: 72.6, Ownership: 0.9%, Availability: 0.0%
Martin Ødegaard (MID, £7.8m)
[STATS] PPG: 1.7, Form: 1.7, Total Points: 58, Minutes: 1057, Goals: 1, Assists: 5, Bonus: 5, BPS: 236, ICT: 80.7, Ownership: 1.7%, Availability: 50.0%
Noni Madueke (MID, £6.8m)
[STATS] PPG: 4.7, Form: 4.7, Total Points: 48, Minutes: 764, Goals: 2, Assists: 1, Bonus: 6, BPS: 165, ICT: 66.7, Ownership: 1.5%, Availability: 100.0%
Gabriel Martinelli Silva (MID, £6.8m)
[STATS] PPG: 1.7, Form: 1.7, Total Points: 38, Minutes: 613, Goals: 1, Assists: 3, Bonus: 1, BPS: 131, ICT: 49.3, Ownership: 1.1%, Availability: 100.0%
Ethan Nwaneri (MID, £5.0m)
[STATS] PPG: 0.0, Form: 0.0, Total Points: 8, Minutes: 165, Goals: 0, Assists: 0, Bonus: 0, BPS: 20, ICT: 5.4, Ownership: 0.1%, Availability: 0.0%
Max Dowman (MID, £4.2m)
[STATS] PPG: 0.0, Form: 0.0, Total Points: 5, Minutes: 27, Goals: 0, Assists: 1, Bonus: 0, BPS: 13, ICT: 2.8, Ownership: 0.4%, Availability: 0.0%
Christian Nørgaard (MID, £5.1m)
[STATS] PPG: 0.2, Form: 0.2, Total Points: 4, Minutes: 32, Goals: 0, Assists: 0, Bonus: 0, BPS: 14, ICT: 2.4, Ownership: 0.1%, Availability: 100.0%
Fábio Ferreira Vieira (MID, £5.4m)
[STATS] PPG: 0.0, Form: 0.0, Total Points: 0, Minutes: 0, Goals: 0, Assists: 0, Bonus: 0, BPS: 0, ICT: 0.0, Ownership: 0.0%, Availability: 0.0%
Ismeal Kabia (MID, £4.5m)
[STATS] PPG: 0.0, Form: 0.0, Total Points: 0, Minutes: 0, Goals: 0, Assists: 0, Bonus: 0, BPS: 0, ICT: 0.0, Ownership: 0.1%, Availability: 0.0%
Albert Sambi Lokonga (MID, £4.5m)
[STATS] PPG: 0.0, Form: 0.0, Total Points: 0, Minutes: 0, Goals: 0, Assists: 0, Bonus: 0, BPS: 0, ICT: 0.0, Ownership: 0.0%, Availability: 0.0%
Andre Harriman-Annous (MID, £4.4m)
[STATS] PPG: 0.0, Form: 0.0, Total Points: 0, Minutes: 0, Goals: 0, Assists: 0, Bonus: 0, BPS: 0, ICT: 0.0, Ownership: 0.0%, Availability: 100.0%
Viktor Gyökeres (FWD, £8.8m)
[STATS] PPG: 3.7, Form: 3.7, Total Points: 76, Minutes: 1572, Goals: 8, Assists: 0, Bonus: 8, BPS: 273, ICT: 100.4, Ownership: 13.3%, Availability: 100.0%
Gabriel Fernando de Jesus (FWD, £6.4m)
[STATS] PPG: 1.3, Form: 1.3, Total Points: 17, Minutes: 279, Goals: 2, Assists: 0, Bonus: 0, BPS: 69, ICT: 32.5, Ownership: 0.7%, Availability: 100.0%
Kai Havertz (FWD, £7.3m)
[STATS] PPG: 1.2, Form: 1.2, Total Points: 8, Minutes: 156, Goals: 0, Assists: 1, Bonus: 0, BPS: 40, ICT: 8.8, Ownership: 1.0%, Availability: 100.0%
YOUR TASK
For each player in the squad list provide one short sentence summarising the injury news and playing likelihood for the player in the format:
INSERT_PLAYER_AVAILABILITY_STATUS - <short sentence summarising the injury news and playing likelihood for the player>
- INSERT_PLAYER_AVAILABILITY_STATUS must be one of: Fit, Minor doubt, Major doubt, Out.
- The sentence after the dash is mandatory and should explain why the player received that status, based on your research and injury news.
- Do not return only the status. A sentence is required for every player.
- Example: Fit - Haaland is fit and available for selection.
DECISION MAKING CRITERIA:
1. Use the latest news, tips, and recommendations from trusted sources (official FPL, reliable football news outlets, manager press conferences). You may use your web search tool to fetch the most recent information.
2. If it is early in the season (Gameweek < 6), be cautious with stats since the sample size is small.
3. Factors to weigh include:
- Current availability of the player as of gameweek 26. E.g., currently injured, currently suspended, currently on international duty, etc.
- Current injury status of the player. E.g., minor injury, major injury, long term injury, etc.
- Likelihood of playing in the next gameweek (percentage).
- Expected return date.
- Any reasons for whether the player could be rested for the this gameweek.
- Any reason the player is currently out of the squad and not included, e.g., long term suspension, banned,injury or personal issues.
OUTPUT INSTRUCTIONS:
- You must return only valid JSON.
- No commentary, no markdown, no extra text.
- The output must strictly follow the JSON structure below.
- Every player from the squad list must be included exactly as written (copy keys exactly).
- Do not rename, re-order, or omit any player.
JSON STRUCTURE:
(First, produce the JSON with empty strings for each player. Then, fill them in with your injury news.)
{
"David Raya Martín": "",
"Kepa Arrizabalaga Revuelta": "",
"Karl Hein": "",
"Tommy Setford": "",
"Gabriel dos Santos Magalhães": "",
"William Saliba": "",
"Riccardo Calafiori": "",
"Jurriën Timber": "",
"Jakub Kiwior": "",
"Myles Lewis-Skelly": "",
"Benjamin White": "",
"Brayden Clarke": "",
"Maldini Kacurri": "",
"Josh Nichols": "",
"Bukayo Saka": "",
"Martin Ødegaard": "",
"Noni Madueke": "",
"Gabriel Martinelli Silva": "",
"Leandro Trossard": "",
"Declan Rice": "",
"Mikel Merino Zazón": "",
"Fábio Ferreira Vieira": "",
"Christian Nørgaard": "",
"Ethan Nwaneri": "",
"Martín Zubimendi Ibáñez": "",
"Ismeal Kabia": "",
"Albert Sambi Lokonga": "",
"Kai Havertz": "",
"Gabriel Fernando de Jesus": "",
"Eberechi Eze": "",
"Cristhian Mosquera": "",
"Viktor Gyökeres": "",
"Max Dowman": "",
"Andre Harriman-Annous": "",
"Piero Hincapié": "",
"Marli Salmon": ""
}
Important: You MUST respond with ONLY valid JSON. Do not include any markdown, explanations, or text outside the JSON structure.
FINAL CHECK:
Before returning your answer, double-check that your output is valid JSON, that it includes every player exactly as listed, and that no names are changed, skipped, or added.
Running The Prompt
For this task, I use Gemini 2.5 Flash-Lite.
For parameters, I use:
- temperature: 0.2
- max_output_tokens: 16384
- top_p: 0.8
- top_k: 25
These were selected because I didn't want loads of output tokens and I don't need it to be especially creative, just pull the necessary info together.
This enrichment step runs 20 times per gameweek. Using a large reasoning model here would be expensive and unnecessary. The task is not deep analysis - it's structured summarisation. A lightweight, cheaper model is sufficient.
This is an important pattern in multi-stage systems: use heavy models where reasoning matters; use cheaper models where formatting and summarisation are the goal.
Here are the results:
{
"Albert Sambi Lokonga": "Out - Albert Sambi Lokonga is currently unavailable and not in the squad.",
"Andre Harriman-Annous": "Fit - Andre Harriman-Annous is available for selection.",
"Benjamin White": "Fit - White is a regular starter and is expected to be available for the double gameweek.",
"Brayden Clarke": "Fit - Brayden Clarke is available for selection.",
"Bukayo Saka": "Minor doubt - Bukayo Saka has a minor availability issue but is likely to be available for at least one of the fixtures.",
"Christian Nørgaard": "Fit - Christian Nørgaard is available for selection.",
"Cristhian Mosquera": "Fit - Mosquera is available for selection and could feature in the upcoming games.",
"David Raya Martín": "Fit - David Raya is the first-choice goalkeeper and is expected to be available for both fixtures.",
"Declan Rice": "Fit - Declan Rice is a crucial midfielder and is expected to be available for both fixtures.",
"Eberechi Eze": "Fit - Eze is available for selection and is a key attacking player.",
"Ethan Nwaneri": "Out - Ethan Nwaneri is currently unavailable and not in the squad.",
"Fábio Ferreira Vieira": "Out - Fábio Ferreira Vieira is currently unavailable and not in the squad.",
"Gabriel Fernando de Jesus": "Fit - Gabriel Jesus is available for selection and is a strong option for the double gameweek.",
"Gabriel Martinelli Silva": "Fit - Martinelli is available for selection and is a strong option for the double gameweek.",
"Gabriel dos Santos Magalhães": "Fit - Gabriel is a key defender and is expected to be available for the double gameweek.",
"Ismeal Kabia": "Out - Ismeal Kabia is currently unavailable and not in the squad.",
"Jakub Kiwior": "Out - Jakub Kiwior is currently unavailable and not in the squad.",
"Josh Nichols": "Fit - Josh Nichols is available for selection.",
"Jurriën Timber": "Fit - Timber has returned from a long-term injury and is available for selection.",
"Kai Havertz": "Fit - Kai Havertz is available for selection and could feature in the double gameweek.",
"Karl Hein": "Out - Karl Hein is currently unavailable and not in the squad.",
"Kepa Arrizabalaga Revuelta": "Fit - Kepa is the backup goalkeeper and is available for selection.",
"Leandro Trossard": "Minor doubt - Leandro Trossard has a minor availability issue but is likely to be available for at least one of the fixtures.",
"Maldini Kacurri": "Out - Maldini Kacurri is currently unavailable and not in the squad.",
"Martin Ødegaard": "Minor doubt - Martin Ødegaard has a minor availability issue but is likely to be available for at least one of the fixtures.",
"Martín Zubimendi Ibáñez": "Fit - Zubimendi is available for selection and is a regular starter.",
"Max Dowman": "Out - Max Dowman is currently unavailable and not in the squad.",
"Mikel Merino Zazón": "Out - Mikel Merino Zazón is currently unavailable and not in the squad.",
"Myles Lewis-Skelly": "Fit - Lewis-Skelly is a young player and is available for selection.",
"Noni Madueke": "Fit - Madueke is available for selection and could feature in the upcoming games.",
"Piero Hincapié": "Fit - Hincapié is available for selection and could feature in the upcoming games.",
"Riccardo Calafiori": "Fit - Calafiori is available for selection and could feature in the upcoming games.",
"Tommy Setford": "Fit - Tommy Setford is a young goalkeeper and is available for selection.",
"Viktor Gyökeres": "Fit - Gyökeres is a key striker and is expected to be available for both fixtures.",
"William Saliba": "Fit - Saliba is a regular starter and should be available for both matches."
}
The results seems fairly consistent with what's expected. It weeds out the players who are on loan like Ismeal Kabia and Jakub Kiwior, and the players who have longer term injuries like Max Dowman. Interestingly it also flags players with potential availability issues like Leandro Trossard and Martin Ødegaard. This is important context for the model that it just doesn't get from the stats alone.
Handling Missing Players
Even with strict formatting, things occasionally fail.
A player might be omitted from the JSON or a name might be slightly altered or a response might just outright fail.
Rather than retry the entire team prompt, I run a clean-up pass at the end.
After running enrichment for every club, I check which players are missing. I then issue a small follow-up prompt covering only those players.
This second pass isn't grouped by team anymore, so it lacks some team-level context. But in practice there are usually only one or two missing players, so it's not a major issue. The important part is robustness and to tidy up any issues that might have slipped through.
I repeat this pass a few times until all the players are accounted for, at most this takes two passes - typically only one.
Summary
I now enrich my data store with injury information by making 20 injury and availability enrichment calls per gameweek - one per team. It's not perfect, but it strikes a pragmatic balance between cost, stability and signal. I still retain FPL's "chance of playing" as a structured backstop filter, so the model has both quantitative and qualitative context. Once retrieved, the injury information is stored in the datastore and injected directly into the team-building prompt under each player's stats. For example:
Declan Rice (MID, £7.6m)
[STATS] PPG: 2.7, Form: 2.7, Total Points: 138, Minutes: 2145, Goals: 4, Assists: 7, Bonus: 18, BPS: 590, ICT: 171.6, Ownership: 35.5%, Availability: 100.0%
[INJURY NEWS] Fit - Declan Rice is a crucial midfielder and is expected to be available for both fixtures.
Martín Zubimendi Ibáñez (MID, £5.3m)
[STATS] PPG: 4.3, Form: 4.3, Total Points: 103, Minutes: 2175, Goals: 5, Assists: 1, Bonus: 9, BPS: 468, ICT: 103.6, Ownership: 5.9%, Availability: 100.0%
[INJURY NEWS] Fit - Zubimendi is available for selection and is a regular starter.
Bukayo Saka (MID, £9.8m)
[STATS] PPG: 0.7, Form: 0.7, Total Points: 102, Minutes: 1563, Goals: 4, Assists: 7, Bonus: 10, BPS: 396, ICT: 161.7, Ownership: 7.7%, Availability: 50.0%
[INJURY NEWS] Minor doubt - Saka has a minor availability issue but is likely to be available for at least one of the fixtures.
Leandro Trossard (MID, £6.8m)
[STATS] PPG: 2.3, Form: 2.3, Total Points: 94, Minutes: 1495, Goals: 5, Assists: 5, Bonus: 9, BPS: 337, ICT: 121.4, Ownership: 1.3%, Availability: 75.0%
[INJURY NEWS] Minor doubt - Trossard has a minor availability issue but is likely to be available for at least one of the fixtures.
The combination of structured [STATS] and enriched [INJURY NEWS] works well because the stats provide hard, quantitative grounding, while the injury news adds qualitative context. Together, the model has a fuller picture to reason over each player's availability and importance.
With injury context in place, I can now apply the same approach to hints, tips, and recommendations - bringing in qualitative insights to guide player selection even further, capturing nuances that stats alone can't provide.
Extension 2: Player Insights and Hints/Tips
When I normally build my FPL team (manually), one of the things I spend the most time on is reading hints, tips and recommendations from expert sources. These come from official "FPL analysts" who put the hours in pouring over stats, fixtures and player form. For a human manager, this qualitative insight is invaluable: it highlights rotation risk, set-piece duties, subtle form shifts and tactical context that raw stats alone can't capture.
So why not give the model access to the same type of guidance? This is the idea behind the second enrichment in our RAG pipeline: feeding the model the latest expert insights for each player, alongside stats and injury context, so it can reason over a richer, more human-like insights.
How It Fits Into the Pipeline
Architecturally, this enrichment sits alongside the injury context pipeline and follows the same pattern.
- Pull fresh FPL data from the datastore
- Group players by club
- For each club:
- Build a prompt with squad list + gameweek context
- Query the model and allow it to search the web
- Return one structured line per player (JSON only)
- Persist the expert insights back into the datastore
- Use enriched data in the final team-building prompt

The Prompt
The prompt follows the same pattern as the injury context prompt, but instead the task specification is all about gathering the latest expert insights for each player.
For each player we then request that the model returns a short sentence summarising the expert insights for the player, preceded by a flag indicating the player's tip status, either Must-have, Recommended, Rotation risk or Avoid.
An example prompt looks like this:
Your task is to collate the Fantasy Premier League (FPL) hints, tips, and recommendations for players in the Arsenal squad. Your outputs will be used to assess whether each player is a strong pick for the upcoming gameweek.
GAMEWEEK CONTEXT:
- Season: 2025/2026
- Gameweek: 26
- Team: Arsenal
- Fixture: Arsenal are double gameweek: away to Brentford on Thursday 12th February 2026 at 20:00 and away to Wolves on Wednesday 18th February 2026 at 20:00
- Fixture difficulty: 2.5
- Double gameweek: This is a double gameweek.
Squad & stats below are for context only. Do NOT copy this section into the output. Focus on returning the JSON exactly as specified later.
ARSENAL SQUAD:
David Raya Martín (GK, £5.9m)
[STATS] PPG: 3.7, Form: 3.7, Total Points: 108, Minutes: 2340, Clean Sheets: 13, Goals Conceded: 18, Saves: 37, Bonus: 5, BPS: 433, ICT: 41.4, Ownership: 35.3%, Availability: 100.0%
Kepa Arrizabalaga Revuelta (GK, £4.1m)
[STATS] PPG: 0.0, Form: 0.0, Total Points: 0, Minutes: 0, Clean Sheets: 0, Goals Conceded: 0, Saves: 0, Bonus: 0, BPS: 0, ICT: 0.0, Ownership: 0.4%, Availability: 100.0%
Karl Hein (GK, £4.0m)
[STATS] PPG: 0.0, Form: 0.0, Total Points: 0, Minutes: 0, Clean Sheets: 0, Goals Conceded: 0, Saves: 0, Bonus: 0, BPS: 0, ICT: 0.0, Ownership: 0.2%, Availability: 0.0%
Tommy Setford (GK, £3.9m)
[STATS] PPG: 0.0, Form: 0.0, Total Points: 0, Minutes: 0, Clean Sheets: 0, Goals Conceded: 0, Saves: 0, Bonus: 0, BPS: 0, ICT: 0.0, Ownership: 0.2%, Availability: 100.0%
Gabriel dos Santos Magalhães (DEF, £7.1m)
[STATS] PPG: 4.3, Form: 4.3, Total Points: 138, Minutes: 1715, Clean Sheets: 12, Goals Conceded: 11, Bonus: 18, BPS: 463, ICT: 84.9, Ownership: 43.0%, Availability: 100.0%
Jurriën Timber (DEF, £6.4m)
[STATS] PPG: 3.2, Form: 3.2, Total Points: 123, Minutes: 2089, Clean Sheets: 12, Goals Conceded: 16, Bonus: 7, BPS: 448, ICT: 107.9, Ownership: 31.1%, Availability: 100.0%
Riccardo Calafiori (DEF, £5.6m)
[STATS] PPG: 1.3, Form: 1.3, Total Points: 85, Minutes: 1346, Clean Sheets: 10, Goals Conceded: 7, Bonus: 4, BPS: 309, ICT: 56.6, Ownership: 6.5%, Availability: 100.0%
William Saliba (DEF, £6.1m)
[STATS] PPG: 3.7, Form: 3.7, Total Points: 83, Minutes: 1714, Clean Sheets: 10, Goals Conceded: 12, Bonus: 4, BPS: 370, ICT: 48.3, Ownership: 14.4%, Availability: 100.0%
Piero Hincapié (DEF, £5.1m)
[STATS] PPG: 2.3, Form: 2.3, Total Points: 49, Minutes: 1123, Clean Sheets: 3, Goals Conceded: 12, Bonus: 4, BPS: 196, ICT: 35.7, Ownership: 0.6%, Availability: 100.0%
Benjamin White (DEF, £5.1m)
[STATS] PPG: 1.2, Form: 1.2, Total Points: 30, Minutes: 409, Clean Sheets: 3, Goals Conceded: 4, Bonus: 3, BPS: 112, ICT: 25.0, Ownership: 0.5%, Availability: 100.0%
Cristhian Mosquera (DEF, £5.3m)
[STATS] PPG: 0.7, Form: 0.7, Total Points: 21, Minutes: 519, Clean Sheets: 1, Goals Conceded: 5, Bonus: 1, BPS: 99, ICT: 15.0, Ownership: 0.1%, Availability: 100.0%
Myles Lewis-Skelly (DEF, £5.1m)
[STATS] PPG: 0.0, Form: 0.0, Total Points: 12, Minutes: 311, Clean Sheets: 0, Goals Conceded: 5, Bonus: 0, BPS: 36, ICT: 9.4, Ownership: 1.4%, Availability: 100.0%
Jakub Kiwior (DEF, £5.4m)
[STATS] PPG: 0.0, Form: 0.0, Total Points: 0, Minutes: 0, Clean Sheets: 0, Goals Conceded: 0, Bonus: 0, BPS: 0, ICT: 0.0, Ownership: 0.0%, Availability: 0.0%
Brayden Clarke (DEF, £3.8m)
[STATS] PPG: 0.0, Form: 0.0, Total Points: 0, Minutes: 0, Clean Sheets: 0, Goals Conceded: 0, Bonus: 0, BPS: 0, ICT: 0.0, Ownership: 0.4%, Availability: 100.0%
Maldini Kacurri (DEF, £3.9m)
[STATS] PPG: 0.0, Form: 0.0, Total Points: 0, Minutes: 0, Clean Sheets: 0, Goals Conceded: 0, Bonus: 0, BPS: 0, ICT: 0.0, Ownership: 0.1%, Availability: 0.0%
Josh Nichols (DEF, £3.7m)
[STATS] PPG: 0.0, Form: 0.0, Total Points: 0, Minutes: 0, Clean Sheets: 0, Goals Conceded: 0, Bonus: 0, BPS: 0, ICT: 0.0, Ownership: 0.2%, Availability: 100.0%
Marli Salmon (DEF, £4.0m)
[STATS] PPG: 0.0, Form: 0.0, Total Points: 0, Minutes: 0, Clean Sheets: 0, Goals Conceded: 0, Bonus: 0, BPS: 0, ICT: 0.0, Ownership: 0.0%, Availability: 100.0%
Declan Rice (MID, £7.6m)
[STATS] PPG: 2.7, Form: 2.7, Total Points: 138, Minutes: 2145, Goals: 4, Assists: 7, Bonus: 18, BPS: 590, ICT: 171.6, Ownership: 35.5%, Availability: 100.0%
Martín Zubimendi Ibáñez (MID, £5.3m)
[STATS] PPG: 4.3, Form: 4.3, Total Points: 103, Minutes: 2175, Goals: 5, Assists: 1, Bonus: 9, BPS: 468, ICT: 103.6, Ownership: 5.9%, Availability: 100.0%
Bukayo Saka (MID, £9.8m)
[STATS] PPG: 0.7, Form: 0.7, Total Points: 102, Minutes: 1563, Goals: 4, Assists: 7, Bonus: 10, BPS: 396, ICT: 161.7, Ownership: 7.7%, Availability: 50.0%
Leandro Trossard (MID, £6.8m)
[STATS] PPG: 2.3, Form: 2.3, Total Points: 94, Minutes: 1495, Goals: 5, Assists: 5, Bonus: 9, BPS: 337, ICT: 121.4, Ownership: 1.3%, Availability: 75.0%
Eberechi Eze (MID, £7.2m)
[STATS] PPG: 0.7, Form: 0.7, Total Points: 71, Minutes: 1123, Goals: 4, Assists: 3, Bonus: 6, BPS: 274, ICT: 73.9, Ownership: 7.8%, Availability: 100.0%
Mikel Merino Zazón (MID, £5.4m)
[STATS] PPG: 1.3, Form: 1.3, Total Points: 66, Minutes: 996, Goals: 4, Assists: 3, Bonus: 5, BPS: 238, ICT: 72.6, Ownership: 0.9%, Availability: 0.0%
Martin Ødegaard (MID, £7.8m)
[STATS] PPG: 1.7, Form: 1.7, Total Points: 58, Minutes: 1057, Goals: 1, Assists: 5, Bonus: 5, BPS: 236, ICT: 80.7, Ownership: 1.7%, Availability: 50.0%
Noni Madueke (MID, £6.8m)
[STATS] PPG: 4.7, Form: 4.7, Total Points: 48, Minutes: 764, Goals: 2, Assists: 1, Bonus: 6, BPS: 165, ICT: 66.7, Ownership: 1.5%, Availability: 100.0%
Gabriel Martinelli Silva (MID, £6.8m)
[STATS] PPG: 1.7, Form: 1.7, Total Points: 38, Minutes: 613, Goals: 1, Assists: 3, Bonus: 1, BPS: 131, ICT: 49.3, Ownership: 1.1%, Availability: 100.0%
Ethan Nwaneri (MID, £5.0m)
[STATS] PPG: 0.0, Form: 0.0, Total Points: 8, Minutes: 165, Goals: 0, Assists: 0, Bonus: 0, BPS: 20, ICT: 5.4, Ownership: 0.1%, Availability: 0.0%
Max Dowman (MID, £4.2m)
[STATS] PPG: 0.0, Form: 0.0, Total Points: 5, Minutes: 27, Goals: 0, Assists: 1, Bonus: 0, BPS: 13, ICT: 2.8, Ownership: 0.4%, Availability: 0.0%
Christian Nørgaard (MID, £5.1m)
[STATS] PPG: 0.2, Form: 0.2, Total Points: 4, Minutes: 32, Goals: 0, Assists: 0, Bonus: 0, BPS: 14, ICT: 2.4, Ownership: 0.1%, Availability: 100.0%
Fábio Ferreira Vieira (MID, £5.4m)
[STATS] PPG: 0.0, Form: 0.0, Total Points: 0, Minutes: 0, Goals: 0, Assists: 0, Bonus: 0, BPS: 0, ICT: 0.0, Ownership: 0.0%, Availability: 0.0%
Ismeal Kabia (MID, £4.5m)
[STATS] PPG: 0.0, Form: 0.0, Total Points: 0, Minutes: 0, Goals: 0, Assists: 0, Bonus: 0, BPS: 0, ICT: 0.0, Ownership: 0.1%, Availability: 0.0%
Albert Sambi Lokonga (MID, £4.5m)
[STATS] PPG: 0.0, Form: 0.0, Total Points: 0, Minutes: 0, Goals: 0, Assists: 0, Bonus: 0, BPS: 0, ICT: 0.0, Ownership: 0.0%, Availability: 0.0%
Andre Harriman-Annous (MID, £4.4m)
[STATS] PPG: 0.0, Form: 0.0, Total Points: 0, Minutes: 0, Goals: 0, Assists: 0, Bonus: 0, BPS: 0, ICT: 0.0, Ownership: 0.0%, Availability: 100.0%
Viktor Gyökeres (FWD, £8.8m)
[STATS] PPG: 3.7, Form: 3.7, Total Points: 76, Minutes: 1572, Goals: 8, Assists: 0, Bonus: 8, BPS: 273, ICT: 100.4, Ownership: 13.3%, Availability: 100.0%
Gabriel Fernando de Jesus (FWD, £6.4m)
[STATS] PPG: 1.3, Form: 1.3, Total Points: 17, Minutes: 279, Goals: 2, Assists: 0, Bonus: 0, BPS: 69, ICT: 32.5, Ownership: 0.7%, Availability: 100.0%
Kai Havertz (FWD, £7.3m)
[STATS] PPG: 1.2, Form: 1.2, Total Points: 8, Minutes: 156, Goals: 0, Assists: 1, Bonus: 0, BPS: 40, ICT: 8.8, Ownership: 1.0%, Availability: 100.0%
YOUR TASK
For each player in the squad list provide one short sentence summarising the hints, tips and recommendations for the player in the format:
INSERT_PLAYER_TIP_STATUS - <short sentence summarising the hints, tips, and recommendations for the player>
- INSERT_PLAYER_TIP_STATUS must be one of: Must-have, Recommended, Avoid, Rotation risk.
- The sentence after the dash is mandatory and should explain why the player received that status, based on your research, recent form, expected minutes, fixture difficulty, and tactical insights.
- Do not return only the status. A sentence is required for every player.
- Example: Must-have - Haaland is starting every match, in excellent form, and has a favorable fixture.
DECISION MAKING CRITERIA:
1. Use the latest news, tips, and recommendations from trusted sources (official FPL, reliable football news outlets, manager press conferences). You may use your web search tool to fetch the most recent information.
2. If it is early in the season (Gameweek < 6), be cautious with stats since the sample size is small.
3. Stats should support decisions, but do not over-prioritize them over expert/insider insights.
4. Factors to weigh include:
- Recent form and performance
- Expected role and minutes
- Set-piece duties
- Fixture difficulty and schedule
- Transfer advice (buy/hold/sell)
- Tactical or rotation news
5. No player should be skipped. If information is limited, make the best possible judgment (for example, mark as "Rotation risk" if uncertain about playtime).
OUTPUT INSTRUCTIONS:
- You must return only valid JSON.
- No commentary, no markdown, no extra text.
- The output must strictly follow the JSON structure below.
- Every player from the squad list must be included exactly as written (copy keys exactly).
- Do not rename, re-order, or omit any player.
JSON STRUCTURE:
(First, produce the JSON with empty strings for each player. Then, fill them in with your recommendation.)
{
"David Raya Martín": "",
"Kepa Arrizabalaga Revuelta": "",
"Karl Hein": "",
"Tommy Setford": "",
"Gabriel dos Santos Magalhães": "",
"William Saliba": "",
"Riccardo Calafiori": "",
"Jurriën Timber": "",
"Jakub Kiwior": "",
"Myles Lewis-Skelly": "",
"Benjamin White": "",
"Brayden Clarke": "",
"Maldini Kacurri": "",
"Josh Nichols": "",
"Bukayo Saka": "",
"Martin Ødegaard": "",
"Noni Madueke": "",
"Gabriel Martinelli Silva": "",
"Leandro Trossard": "",
"Declan Rice": "",
"Mikel Merino Zazón": "",
"Fábio Ferreira Vieira": "",
"Christian Nørgaard": "",
"Ethan Nwaneri": "",
"Martín Zubimendi Ibáñez": "",
"Ismeal Kabia": "",
"Albert Sambi Lokonga": "",
"Kai Havertz": "",
"Gabriel Fernando de Jesus": "",
"Eberechi Eze": "",
"Cristhian Mosquera": "",
"Viktor Gyökeres": "",
"Max Dowman": "",
"Andre Harriman-Annous": "",
"Piero Hincapié": "",
"Marli Salmon": ""
}
Important: You MUST respond with ONLY valid JSON. Do not include any markdown, explanations, or text outside the JSON structure.
FINAL CHECK:
Before returning your answer, double-check that your output is valid JSON, that it includes every player exactly as listed, and that no names are changed, skipped, or added.
Clearly a lot of the structure is shared, the gameweek context for the team, the squad list and the JSON output structure. The key difference is focused on the task specification and the decision making criteria.
Running The Prompt
Again I used Gemini 2.5 Flash-Lite for this task, with the same parameters as before.
Here are the results:
{
"Albert Sambi Lokonga": "Avoid - Unlikely to be a regular starter and has not registered significant FPL points.",
"Andre Harriman-Annous": "Avoid - Young player with limited senior experience and unlikely to feature significantly.",
"Benjamin White": "Rotation risk - While a regular starter, White's minutes could be managed during a double gameweek, especially with other defensive options available.",
"Brayden Clarke": "Avoid - Young player with limited senior experience and unlikely to feature significantly.",
"Bukayo Saka": "Must-have - Despite a slight dip in form, Saka is Arsenal's main attacking threat and penalty taker, making him a must-have for the double gameweek, especially against weaker opposition.",
"Christian Nørgaard": "Avoid - Limited minutes and FPL output suggest he is not a viable option.",
"Cristhian Mosquera": "Avoid - Limited minutes and FPL output suggest he is not a viable option.",
"David Raya Martín": "Recommended - As Arsenal's primary goalkeeper, Raya is expected to start both games in the double gameweek and offers a good chance for clean sheets against Brentford and Wolves.",
"Declan Rice": "Recommended - Rice is a consistent performer in midfield, contributing defensively and offensively with occasional goals and assists, making him a solid option for the double gameweek.",
"Eberechi Eze": "Avoid - While a talented player, Eze is not currently at Arsenal and therefore not an option.",
"Ethan Nwaneri": "Avoid - Young player with limited senior experience and unlikely to feature significantly.",
"Fábio Ferreira Vieira": "Avoid - Unlikely to be a regular starter and has not registered significant FPL points.",
"Gabriel Fernando de Jesus": "Recommended - De Jesus is a proven goalscorer and will be looking to capitalize on Arsenal's attacking opportunities in the double gameweek, especially if he gets consistent starts.",
"Gabriel Martinelli Silva": "Rotation risk - While a talented player, Martinelli's minutes can be inconsistent, and he might be rotated during a double gameweek, making him a riskier pick.",
"Gabriel dos Santos Magalhães": "Must-have - A consistent performer at the back, Gabriel is a threat from set-pieces and a key part of Arsenal's strong defense, making him a prime candidate for clean sheets and potential goals in the double gameweek.",
"Ismeal Kabia": "Avoid - Young player with limited senior experience and unlikely to feature significantly.",
"Jakub Kiwior": "Avoid - Currently unavailable and not expected to feature.",
"Josh Nichols": "Avoid - Young player with limited senior experience and unlikely to feature significantly.",
"Jurriën Timber": "Recommended - Timber has been a consistent starter and offers good defensive potential, with a reasonable chance of contributing to clean sheets in both fixtures.",
"Kai Havertz": "Rotation risk - Havertz's role can be fluid, and while he offers attacking potential, his FPL output has been inconsistent, making him a rotation risk in a double gameweek.",
"Karl Hein": "Avoid - Third-choice goalkeeper with no expected game time.",
"Kepa Arrizabalaga Revuelta": "Avoid - Unlikely to feature given Raya's established role and the importance of the fixtures.",
"Leandro Trossard": "Recommended - Trossard offers versatility and goal-scoring threat, and with a double gameweek, he's likely to get significant minutes and could be a good differential option.",
"Maldini Kacurri": "Avoid - Young player with limited senior experience and unlikely to feature significantly.",
"Marli Salmon": "Avoid - Young player with limited senior experience and unlikely to feature significantly.",
"Martin Ødegaard": "Recommended - The captain is a key creative force for Arsenal and a reliable source of FPL points through assists and potential goals, especially in favorable fixtures.",
"Martín Zubimendi Ibáñez": "Recommended - Zubimendi has been a consistent goal-scoring midfielder and offers good value for his price point, making him a strong consideration for the double gameweek.",
"Max Dowman": "Avoid - Young player with limited senior experience and unlikely to feature significantly.",
"Mikel Merino Zazón": "Avoid - Currently unavailable and not expected to feature.",
"Myles Lewis-Skelly": "Avoid - Young player with limited senior experience and unlikely to feature significantly.",
"Noni Madueke": "Recommended - Madueke has shown flashes of brilliance and could be a differential pick for the double gameweek, offering attacking threat and potential goals.",
"Piero Hincapié": "Rotation risk - Hincapié is a solid defender but faces competition for places, and his minutes could be managed in a double gameweek, making him a rotation risk.",
"Riccardo Calafiori": "Rotation risk - While a starter, his FPL output has been inconsistent, and with a double gameweek, rotation is a possibility, though less likely given his importance.",
"Tommy Setford": "Avoid - Fourth-choice goalkeeper with no expected game time.",
"Viktor Gyökeres": "Must-have - Gyökeres is Arsenal's primary striker and a consistent goal threat, making him a top pick for the double gameweek against potentially weaker defenses.",
"William Saliba": "Recommended - Saliba is a guaranteed starter and a vital component of Arsenal's defense, offering clean sheet potential and a solid FPL base score."
}
This is a much more interesting read than the injury context.
It clearly flags premium assets who are must-haves like Saka, Gabriel and Gyökeres, with clear reasons for why they're essential: "main attacking threat and penalty taker", "threat from set-pieces and a key part of Arsenal's strong defense" and "primary striker and a consistent goal threat".
It recommends players who are likely to feature and consistent starters like Rice ("consistent performer in midfield, contributing defensively and offensively with occasional goals and assists"), Timber ("consistent starter and offers good defensive potential") and Saliba ("a guaranteed starter and a vital component of Arsenal's defense, offering clean sheet potential and a solid FPL base score").
It flags players who are rotation risks, like Havertz ("Havertz's role can be fluid, and while he offers attacking potential, his FPL output has been inconsistent, making him a rotation risk in a double gameweek") and Calafiori ("While a starter, his FPL output has been inconsistent, and with a double gameweek, rotation is a possibility, though less likely given his importance.").
It picks up on young players who are unlikely to feature, like Josh Nichols ("Young player with limited senior experience and unlikely to feature significantly."), those who are extremely unlikely to feature, like Tommy Setford ("Fourth-choice goalkeeper with no expected game time.") and those who are currently unavailable, like Mikel Merino Zazón ("Currently unavailable and not expected to feature.").
These are specific to this gameweek too, a double gameweek for Arsenal, which is clear from the reasonings.
We get a far richer picture of the players and their potential for the gameweek ahead. By itself this is actually a very insightful tool, but it will give our agent much more firepower to work with.
Handling Missing Players
The handling of missing players mirrors the injury enrichment step. After all teams have been processed, any players missing from the JSON are collected and queried in a follow-up pass. This ensures robustness without requiring a full rerun of all prompts.
Summary
With this second enrichment, each player in the datastore now has both injury context and expert insights attached. This gives the model richer qualitative information alongside the quantitative stats it already sees. The two streams sit in parallel in the RAG pipeline and are injected under each player in the team-building prompt, giving the model a fuller picture of availability, form, rotation risk and tactical importance.
Here's a snippet showing how the enriched information appears in the team-building prompt for a few players:
Declan Rice (MID, £7.6m)
[STATS] PPG: 2.7, Form: 2.7, Total Points: 138, Minutes: 2145, Goals: 4, Assists: 7, Bonus: 18, BPS: 590, ICT: 171.6, Ownership: 35.5%, Availability: 100.0%
[INJURY NEWS] Fit - Declan Rice is a crucial midfielder and is expected to be available for both fixtures.
[EXPERT INSIGHTS] Recommended - Rice is a consistent performer in midfield, contributing defensively and offensively with occasional goals and assists, making him a solid option for the double gameweek.
Martín Zubimendi Ibáñez (MID, £5.3m)
[STATS] PPG: 4.3, Form: 4.3, Total Points: 103, Minutes: 2175, Goals: 5, Assists: 1, Bonus: 9, BPS: 468, ICT: 103.6, Ownership: 5.9%, Availability: 100.0%
[INJURY NEWS] Fit - Zubimendi is available for selection and is a regular starter.
[EXPERT INSIGHTS] Recommended - Zubimendi has been a consistent goal-scoring midfielder and offers good value for his price point, making him a strong consideration for the double gameweek.
Bukayo Saka (MID, £9.8m)
[STATS] PPG: 0.7, Form: 0.7, Total Points: 102, Minutes: 1563, Goals: 4, Assists: 7, Bonus: 10, BPS: 396, ICT: 161.7, Ownership: 7.7%, Availability: 50.0%
[INJURY NEWS] Minor doubt - Saka has a minor availability issue but is likely to be available for at least one of the fixtures.
[EXPERT INSIGHTS] Must-have - Despite a slight dip in form, Saka is Arsenal's main attacking threat and penalty taker, making him a must-have for the double gameweek, especially against weaker opposition.
Leandro Trossard (MID, £6.8m)
[STATS] PPG: 2.3, Form: 2.3, Total Points: 94, Minutes: 1495, Goals: 5, Assists: 5, Bonus: 9, BPS: 337, ICT: 121.4, Ownership: 1.3%, Availability: 75.0%
[INJURY NEWS] Minor doubt - Trossard has a minor availability issue but is likely to be available for at least one of the fixtures.
[EXPERT INSIGHTS] Recommended - Trossard offers versatility and goal-scoring threat, and with a double gameweek, he's likely to get significant minutes and could be a good differential option.
This enriched context allows the final team-building model to reason over stats + availability + expert guidance, helping it make better-informed decisions.
This framework is highly extensible - you could add more granular insights, such as player performance against specific opponents, historical fixture trends or opponent defensive weaknesses. This is a powerful avenue for future enhancements.
This does create one problem though, this is a lot more information for the model to process, a task it was already struggling with. I need to find a way to scale the pipeline so the model can handle this. I'll tackle this in Part II using embeddings.