Ihza MahendraResume
Back to Agentic & multimodal systems
Agentic & multimodal systems

Multi-character AI team for realistic work practice

A chat system that surrounds a person with a full cast of AI coworkers, a manager, peers, and specialists, each with their own personality and memory, so working through a task feels like working inside a real company.

What it is

A conversation system that puts a person inside a fictional company, working alongside a small cast of AI coworkers built for that task: a manager who gives direction, a senior peer who reviews their thinking, and specialists who can answer questions in their own lane. Each character keeps its own memory of the conversation and its own view of the assignment. Whichever character actually fits what's happening next speaks up: the manager when direction is needed, a peer when the person is checking their own work, a specialist when a question falls outside the manager's expertise. The team can also send over voice notes, reference material, or a starter file for the task, and the person can attach their own images, PDFs, or notes back into the conversation.

What it's for

Working through a task alone, talking to a single generic chatbot, doesn't feel like a real job. A person benefits from a team to talk to: a manager who gives direction the way a real manager would, peers who push back, specialists who hand over exactly what's needed. The conversation also has to feel continuous, like a team that has been working with this person the whole time, not a fresh chat window every session, and every message has to quietly inform how the person is being read without slowing the reply down.

How it was built

A FastAPI WebSocket connection per person, with each AI character running as its own cached agent so the model never reloads its context between turns. The characters are cast up front for each task, given specific roles (a manager, peers, specialists) that stay consistent for the whole task. Before the person even types their first message, a prewarm step pulls the conversation history, the task brief, and the person's running profile in parallel, so the first reply has zero loading delay. Every turn passes through a router that decides four things at once: which character should speak, whether the person is doing the work, asking for help, or asking for a resource, what to attach to the reply (a voice note, a reference document, a starter file), and what signals to record about how the person is doing. The person can attach their own images, PDFs, or notes back to any message, and the system reads them inline. While a character's reply streams back, the same message is scored and logged in the background so the person's profile keeps updating in real time without slowing down the reply. Gemini and Claude are swapped in per character depending on the role. The same system also runs a short debrief conversation at the end of the task, before the person moves on to whatever comes next.

My role

Sole author of the conversation engine, the WebSocket prewarm path, and the per-turn calibration fanout.

Built with
PythonFastAPIWebSocketsGeminiPer-agent cachingMessage queue

Want the full technical depth, the tradeoffs, what broke, what I'd do differently? Ask the agent about this project.