Inspiration

New Yorkers file 317,000 complaints a month with 311. The city also has 1,384 open jobs. Nobody connects the two. What if the answer to "rats on my block" was not a ticket, but the job that fixes it?

What it does

Tell it what is wrong on your block, typed or spoken. It answers with:

  • how many neighbors reported the same thing in the last 30 days, by borough
  • which agency owns it, and how the city usually closes the case (real 311 resolution text)
  • the open city job that would let you fix it yourself, with the posted salary
  • what people already in that civil service title really earn, from payroll data
  • a first month on the job, drafted only from the posting's own duties

Stop complaining, start fixing.

How we built it

Three NYC Open Data sets live in Elasticsearch Serverless: city job postings (semantic_text embedded by Mistral through an inference endpoint), 30-day 311 complaint aggregates with top resolution texts, and FY2025 citywide payroll grouped by title. A Mistral Large 4 agent uses function calling over four Python tools: hybrid word-plus-meaning job search, aggregations, complaint lookup and real pay. Mistral structured output built the join key between 311 agency names and job posting agency names. Voxtral transcribes spoken complaints. A small Mistral model gates off-topic input before any search runs.

Challenges

  • Meaning search alone ranked "Staff Writer" above developers for "write code for the city". Hybrid search fixed it.
  • Elastic scored nonsense input almost the same as a real complaint, so an LLM intent gate does the validation, not the score.
  • Mistral Large 4 reasons by default; turning reasoning off cut answers from 58 seconds to 9.
  • Payroll loaded only annual titles at first. Carpenters are paid per day. Reloaded with every pay basis.
  • Dates in the jobs feed arrive as "05-DEC-2026".

What we learned

RAG is retrieve then generate, and retrieval needs words and meaning together. Elastic finds, Mistral decides and explains, Python is the phone line between them.

What's next

A hybrid retriever with reciprocal rank fusion, Elastic Agent Builder over the same indices, and Voxtral text-to-speech for the answer.

Built With

Share this project:

Updates

Submission history