Inspiration
We kept thinking about how messy real work messages are. Someone writes, "I got married last Saturday. Can I add my wife?" and it sounds like one simple question. It is not. It is an Insurance question, an HR question, a Payroll question and a Retirement question, all at once. Today a person has to read that message, guess where it goes, look up each policy by hand, and copy details between systems. That is slow, and it is easy to miss something. The policies are already written down. The problem is that nobody has time to connect them to the message. We wanted to see if we could build that connection for the ADP "AI for the Modern Enterprise" challenge.
What it does
Converge turns a messy messages into a policy-checked next steps, with a person approving before anything reaches ADP.
For example, an employee could ask a question about benefits, payroll, or company policy. Instead of a manager searching through long policy documents manually, Converge identifies which business area the request belongs to, searches the relevant policy information, and generates a structured response.
The dashboard can show things like:
- What the employee is asking for
- The urgency and category of the request
- Eligibility or policy information
- Important details from the relevant documents
- Recommended next steps
- A checklist of actions
- A suggested response back to the employee
Converge currently supports HR, Payroll, Insurance, and Retirement, and can also handle a message that involves more than one of these areas. We also integrated Slack so employee messages can flow into Converge and be analyzed without requiring teams to completely change how they already communicate.
How we built it
The backend is Python with FastAPI. The AI steps run through LangChain. By default we use Google Gemini, and the provider can be switched to OpenAI with one setting.
For policy search we used RAG, which stands for retrieval-augmented generation. In simple words, the AI looks up the policy first and then answers from what it found. Each policy PDF is read, split into small chunks, turned into embeddings, and saved in ChromaDB. Every business has its own collection. When a message comes in, we find the 3 closest chunks and send them to the AI with instructions written for that business. The AI returns a structured plan with a summary, next steps, a checklist, key facts and a mocked ADP endpoint.
The router is a short AI call. It reads the masked message and a one-line description of each business, then picks every business that has something to act on. If the AI call fails, a backup router matches keywords instead. The chosen businesses then run at the same time.
The dashboard is built with Next.js, React, TypeScript and Tailwind CSS. It has a Demo mode and a Live mode. The Outlook add-in is a side panel that sends an email to the backend and shows one card per business. We also wrote a PowerShell script that sends test messages to the API for demos.
Challenges we ran into
One message, many businesses. Deciding which businesses a message touches is harder than it looks. We used an AI router, then added a keyword router as a backup so the app still works when the AI call fails or hits a rate limit.
Keeping answers honest. We did not want the AI to make things up. So we give it only the retrieved policy text, tell it to use only facts from that text, and have it mark an answer as "Conditional" when the policy does not cover the question.
Privacy. Masking is trickier than it sounds. We mask SSNs, birth dates written next to words like "born" or "DOB", card numbers that pass a card checksum, and account or routing numbers. We leave other dates alone, such as a wedding date, because the policy answer needs them. This is a simple pattern-based filter, so it can miss names and addresses.
Slack without a linked workspace. We built the Slack part to Slack's event format. Slack sends each message to a webhook, expects a reply within seconds, and can send the same event twice. So our backend answers right away, does the AI work in the background, and skips bot messages and duplicates so it never replies to itself. We could not link a real Slack account in time, so we tested this by sending Slack-style test messages from the terminal.
Accomplishments that we're proud of
One message can be routed to four businesses, and each one answers from its own policy. A manager approves every action. Nothing is sent on its own. Sensitive numbers are masked before any AI call, and the dashboard shows a privacy notice when something was masked. Our Slack code is built and tested with simulated messages. A new business takes a settings entry and a policy document, not new code.
What we learned
How RAG really works: chunking, embeddings, and why retrieving the right paragraphs matters more than a clever prompt.
That a human approval step is a design choice, not a limit. It is what makes the AI safe to use.
What's next for converge
- Sign managers in with Microsoft and Slack.
- Add a trained PII detector and an enterprise AI agreement.
- Link a real Slack workspace, send Slack messages through the all-business router, and add more message sources such as meetings.
- Add domain packs for new businesses and other companies.
Built With
- chromadb
- fastapi
- google-gemini
- langchain
- next.js
- outlook-add-in
- python
- rag
- react
- slack-api
- tailwindcss
- typescript
Log in or sign up for Devpost to join the conversation.