HADI MOUMENI

The Wire

An earnings call is a performance. Management picks every word carefully, sounds confident in the prepared remarks, and gets vaguer when the analysts start pushing in Q&A. I wanted something that reads the transcript the way a skeptical analyst would, pulling out the sentiment, the risk language, and the forward guidance, without a model that just makes quotes up. So the whole system is built around one rule: every claim has to be grounded in an exact quote from the call, or it gets thrown out. It runs entirely on a free local model, no API keys.

Highlights

  • Three specialist agents (sentiment, risk, guidance) run in parallel, then a separate verifier agent re-checks every quote against the transcript and drops anything it can’t ground. A 7B model hallucinates, so this is what keeps the output trustworthy anyway. Grounding rate is the headline metric (100% on the bundled sample).
  • Conviction is scaled by the grounding rate, so the thesis literally can’t be more confident than the evidence backing it.
  • Separates prepared remarks from unscripted Q&A and flags when management gets more hedged live, a caution signal you’d miss reading top to bottom.
  • Runs on a free local model (Ollama + Qwen2.5-7B) with a deterministic heuristic fallback so it always produces something. The model layer is provider-agnostic, so the same code swaps to Groq’s free tier in the cloud.

Tech Stack

  • Python + FastAPI - Pipeline and API
  • Ollama (Qwen2.5-7B) - Local, free LLM; provider-agnostic (Groq Llama-3.3-70B optional in the cloud)
  • rapidfuzz - Fuzzy substring match that grounds every quote against the transcript
  • Pydantic - Thin per-agent schemas kept small enough for a 7B to fill reliably
  • SQLite - Thesis persistence
  • Astro - Single-page UI

Notes

  • The whole project is really one idea: don’t trust the model, verify it. An independent grounding pass turned an unreliable 7B into a pipeline I’d actually believe.
  • Tuning the fuzzy-match threshold was the crux. Strict enough to catch a fabricated quote, loose enough to allow a light paraphrase. Too tight and real quotes get dropped, too loose and the grounding means nothing.
  • Same generate-locally, display-in-cloud split as P4P. The 7B is free on my Mac but too big for a cheap VM, so generation runs locally and Fly.io just serves the stored theses.
  • The heuristic fallback started as a test shim and became a real feature. The UI shows which mode produced each thesis.
  • I’d like to pull in real market data next and check whether the stance actually predicts the post-call move.

Check it out: The Wire