Inspiration
"Five business days" said three times is still zero refunds. The failure is not the call; it is that nobody writes the promise down, so nobody notices when it breaks, and the complaint letter at the end has no dates and no quotes.
What it does
- Extracts commitments, offers and requested customer actions from a transcript, chat log or email thread, with the representative's verbatim words and a YYYY-MM-DD date resolved against the conversation date.
- Validates the model's answer in full before anything is stored: closed field set, exact types, enum values, real calendar dates, and every quote must appear word for word in the source. Anything else is rejected, never trusted; one retry feeds the reason back to the model.
- Computes explicit "N business days" dates in code rather than trusting the model's arithmetic.
- Keeps a ledger per case: commitments pending, kept or broken after a grace period; offers wait for the person's accept or decline; the next step is computed from the ledger, not by the model.
- Finds where to escalate with one runtime web search (Tavily) and writes a dated, quoted evidence pack for the written complaint.
How we built it
Standard-library Python: an OpenAI-compatible chat client with an origin allowlist (a local Ollama model today; Nebius Token Factory with NVIDIA Nemotron or the Hugging Face router when credits arrive), a JSON-schema response format, a full validator and quote guard, a JSON ledger, a one-page UI on the standard-library HTTP server, a loopback fake of the model API and 11 offline tests. Evaluation on the fixture transcripts, including failure cases, is in docs/evaluation.md.
Challenges
Making an extraction agent that cannot invent: the quote guard rejects any commitment whose words are not in the source, and dates are shown next to the quote so the person can correct the model's calendar arithmetic. Keeping decisions with the person: offers are recorded verbatim and never accepted by the agent.
Accomplishments
An agent whose output is fully checkable, a ledger that gets more specific with every call, and an evidence pack a person can attach to a complaint the same day.
What we learned
Small open models extract quotes reliably but resolve relative dates unevenly; showing the quote and the date side by side, with human correction and business-day arithmetic in code, beats trusting either alone.
What's next
Multi-language sources, e-mail ingestion, a hosted demo, and the Nemotron run on Nebius Token Factory.
Try it hosted
Live demo on Render's free tier: https://promisekeeper.onrender.com (demo mode: canned model responses for the three sample transcripts, since the free tier carries no model key; the README explains how to run it against Nebius Token Factory or a local model). First request after idle can take about a minute while the instance wakes.
Built With
- ollama
- openai-api
- pytest
- python
- tavily
Log in or sign up for Devpost to join the conversation.