Inspiration

There isn't much experiential learning in law school, which I think is a real shame. They teach you how to think like a lawyer, but you don't spend much time actually being one. Mediation especially is a skill. You have to do it to learn it.

When schools do offer practice, the usual approach is to hire a local to play a role. Maybe an aspiring actor, maybe just somebody who was available that day. The actor gets a bit of script, the student gets one session, and that's usually it, because bringing people in is costly and time consuming. The actor may or may not stick to the script. And you typically get one actor in the room, when a real mediation has two parties.

I wanted something students could use as much as they want or need. Two clients instead of one, responding to each other and pushing back against each other. Parties who don't give in too easily, but who also don't overact the way a hired actor might. Cheap enough to practice on a random weeknight, and workable for a remote student who can't meet an actor in person. Professors can assign it, too. Down the road I want to hook it into Canvas so students can practice right from their course page.

The push to start now came from OpenAI announcing GPT-Live-1, their full-duplex voice model. That's what made me think this could finally work well enough to feel real. The API doesn't have that model yet, so this build runs on GPT-Realtime-2.1, and as soon as live-voice access arrives I'm excited to pipe it into the app and hear the difference.

How I built it

I built this with Codex. GPT-5.6 Sol wrote over 95 percent of the code, and I directed. My job was deciding how the room should work and whether what came out felt like a real mediation.

Under the hood, Maya and Sam each get their own voice session and their own memory. A hidden Room Director running GPT-5.6 Luna decides who speaks next and writes a short screened line for the voice model to perform. Regular application code stays in charge of who is present, who hears each event, and who has the floor. When the model is late or answers badly, a deterministic backup takes that turn.

Challenges

AI actors turned out to have the opposite problem from human actors. A human overacts. The AI parties started out far too agreeable: lots of "I hear you," quick concessions, everyone too reasonable. Getting them to stay stubborn without becoming cartoons took a screening layer that validates every line, plus a lot of me sending dialogue back because no real contractor talks like that.

Keeping secrets was the other fight. You can't just tell a model "don't reveal this" and trust it. So Sam never receives Maya's private caucus at all.

Latency was the third. Our smartest director produced a genuinely good turn in about 33 seconds, which is far too slow for a live conversation. Getting the app to actually use the model to write the script, at a speed that keeps up with the room, was the hardest part of the build. We got there with GPT-5.6 Luna, which is faster, and by sending it a lot less information to process on each turn.

What I learned

We had to write the rules for the AI actors into the code, because otherwise they would break them. I learned how hard it can be to get an AI to act like a disagreeable client. And I learned that directing an AI that writes 95 percent of the code is a real job: taste and the willingness to keep saying "a real person wouldn't do that" turned out to be my contribution, and the project needed them.

Built With

Share this project:

Updates