Voice
You can talk to an agent while it works. Add direction as you think of it, ask what it is doing, and answer its questions out loud, without stopping the work. Everything said on the call is written to the session's log, so the thread reads afterwards as if the conversation happened in it, because it did.
How it works
A call is a realtime voice model joined to one session. The agent is whatever already runs that session (harnesses), unchanged. The two never talk to each other directly. The voice writes to the log, the agent reads its turns from the log, and the voice hears about the agent's work from the log.
The voice is the agent's mouth and ears, not a second mind. It takes turns, says "go on", hears you interrupt and passes on what you say. It does not answer anything about the work itself. While a call is open the agent knows it, and writes its replies for the ear: short sentences, no code, no ids, one point at a time. When a turn finishes, the voice says the agent's reply close to word for word, in parts, so you can cut in. While the agent works, the voice can tell you that it is working and on what, read from the log. It never fills the gap with words of its own.
Every final line on the call, yours and the voice's, is appended to the session's log and marked as spoken. Writing a line does not wake the agent. A line reaches the agent as an instruction only when it is relayed, which queues a run on it. Lines nobody relayed reach the agent as context. If the agent is already busy, a relayed line waits in line like any message (sessions). The thread groups a call's lines together, between the typed messages around it.
While the call is open, the voice hears three things from the log. When the agent asks a question, you hear it, with its options and the recommended one, at your next pause. You answer out loud and the answer goes back into the thread. When a turn ends, you hear what it said. When a subtask becomes blocked, you hear that too.
A call has a home session, and it follows the sessions that agent handed work to. Their questions and finished turns reach the call as well. To speak to one of them, the voice addresses it by name; the line lands in that session and links back to the call, so the whole transcript stays at home.
In a call with other people. A call can also hold several people, with cameras and a shared screen, and the session's agent joins as one more participant. The host chooses what it does, each on its own: Transcribe writes what is said to the session's log; Take notes marks decisions and action items as drafts while they are agreed; Act sends what is said to the agent as work, as a typed message would; and Participate lets it speak and answer out loud, or keeps its replies in the thread. With no mode on, it hears nothing. Work it does on Act waits for a person in the same places a typed message would. When the call ends, the session keeps the spoken lines, any recording and the drafted action items, and nothing is sent or created until a person says so. The call itself is drawn by the Calls app, an app built on these same parts.
The audio goes straight from your window to the voice provider. It never passes through the Mod desktop app, the relay or our servers. To start a call, the window asks the desktop app for a short-lived key. The desktop app asks Mod's inference router with your Mod sign-in, and the router mints the key from the provider. The provider's own key stays in the router, and your Mod sign-in stays in the desktop app, so neither reaches the page. Each call counts against your account's request limit (models).
Using it as you build
In the window, the composer's main button starts a call when the composer is empty. While the agent is working, a small call button sits beside Stop. On a call the button becomes Stop, which ends the call, not the agent's turn, and two controls appear: a speaker toggle that mutes the voice and a mic that mutes you. You can still type on a call; the button sends what you typed and goes back to Stop. The new pane has the same button, and starts a session to hold the call.
The voice has four tools, the same ones a person has in the thread:
tell_agent send what you said to a session the call follows
session_state status, goal, subtasks and last reply, plus what is on your screen
answer_question answer the pending question at home or in a named session
stop_agent stop the running turn
Each spoken line on the log carries two fields an app or script can read:
voiceCallId the call the line belongs to; the thread groups by it
spokenBy "person" or "voice"
A line relayed to another session also carries voiceHomeSessionId and voiceHomeEntryId, so its reader can find the call. The voice's own lines are written as system, never as the agent's reply.
There is one default voice, OpenAI Realtime. A second provider, ElevenLabs, sits behind the same interface and is chosen with the voice.provider setting. The call is held in the language of your window's locale.
Limits
- Voice needs the Mod desktop app running. A browser with no desktop app has no voice.
- A window holds one call at a time. Starting a new one hangs up the old one.
- A call reaches only its home session and the sessions that agent handed work to. A call on a channel that can address any session is a later design.