What it does
You own hundreds of manufactured products — car seats, space heaters, blenders, baby formula, the airbag in your car. Recalls for them are issued constantly and published in full, for free, by government agencies. Essentially nobody reads them. There's no moment in anyone's week set aside for cross-referencing the CPSC bulletin against the contents of their kitchen. So people find out late, by accident, or never.
Recall does the reading. It learns what you own, watches CPSC, NHTSA and openFDA forever, and stays completely silent — until something you actually own is actually affected.
The engineering problem is deciding what not to tell you. An agent that fires on every loose brand match gets ignored within a week, and then it's there in the background failing silently on the day it matters. So matching runs in two layers that fail in opposite directions. A deterministic pass handles brand aliasing, model-number extraction and sale-window arithmetic — free, over everything — and deliberately passes ambiguity upward, because a pair wrongly dropped by a rule is never seen again while a pair wrongly kept costs one model call. Three Strands agents then handle the judgement: an extractor turning pasted receipts into inventory, a matcher deciding whether a notice covers a specific item, and a triage agent deciding whether it's worth interrupting someone and drafting what they should do.
The matcher has a third verdict beyond yes and no: need_info. A recall covering specific model numbers printed on a label under a car seat can't be resolved from a receipt. Guessing yes trains you to ignore the agent; guessing no puts a child in a recalled seat. So it asks, with a thirty-second instruction for what to check — and that question is the real decision the agent exists to surface.
Every dismissed recall is recorded in a silence log with the stage and reason. That's what distinguishes an agent that read four hundred notices and found nothing from one quietly broken for a month.
How I built it
Strands Agents SDK on Amazon Bedrock. Three specialists in recall/agents.py, each with a narrow system prompt returning a typed Pydantic model via structured_output — so an unexpected value degrades to digest rather than inventing an alert. A fourth conversational agent in recall/tools.py answers questions about your own possessions through five @tool functions and knows nothing except what those return. Feed adapters normalise three very different public APIs into one shape. FastAPI plus a single-page interface whose dominant state is "All clear." 18 tests, and a replay mode that runs the whole pipeline with no credentials so the demo is reproducible.
Challenges
Precision. Recall notices are prose: "certain 4Ever DLX seats, model numbers 2093054 and 2093055, sold January 2019 to March 2021." Your receipt says "Graco 4Ever car seat, March 2020." Keyword matching fires on every Graco item you own and misses the seat if the receipt says "Graco Children's Products." Getting the rules and the model to cover each other's blind spots — and knowing when neither can decide — was the whole build.
What's next
Reading order confirmations straight from a mailbox, and a household mode where one agent watches an elderly parent's home and routes alerts to an adult child.
Built With
- amazon-bedrock
- amazon-web-services
- boto3
- claude
- cpsc-api
- fastapi
- html
- javascript
- nhtsa-api
- openfda
- pydantic
- python
- strands-agents
- uvicorn
Log in or sign up for Devpost to join the conversation.