Participant Model
Every Call has two parties and one agent. On outbound calls, inbound
audio for the remote party is typically on the callee track - selecting the
wrong stream is a common integration error.
Parties vs agent
- Parties:
caller(who placed the call) andcallee(who was called). - One of them is always the
subscriber(your connector’s line); the other is the externalparticipant. - The agent is your code. It listens via
caller/callee.audio_stream()and speaks withsend_audio(). It is not a third party identity.
caller / callee are membership, not liveness - who the call is between, not who has picked up yet.
Inbound seeding
Outbound
After make_call + dial, the dialed party is typically on the callee track - stream call.callee.audio_stream().
The one rule: is the agent in the audio path?
Ambient modes (after connect())
Subscriber on inbound = your staff line (callee). On outbound = your line (caller).
