The turn pipeline
The turn pipeline is the processing loop that runs every time a user sends a message. It is the foundation that connects all other systems in the Agent Framework — the Observer, the Tool Caller, and V2V backward prompting are all components of this pipeline. Understanding it makes every other article in this section easier to follow.
How the turn pipeline works
User sends a message
│
▼
CAMainFlow assembles prompt and generates response
│
▼
broadcast_analyze_conversation event fires
│
├──► CAObserverFlow (queue)
│ Extracts user info, evaluates quality
│
├──► CAThoughtsFlow (interrupt)
│ Generates KEY DIRECTIVES for the next turn
│
└──► CANewoToolCaller (queue)
Detects action commitments, fires tools
▼ (outputs stored as attributes)
Next turn: CAMainFlow reads updated directives and context
Step-by-step walkthrough
1. Event received
When a user sends a message on any channel — phone, chat, Telegram, WhatsApp, or webcall — the platform fires a user_message event. For new conversations, a conversation_started event fires first and initializes the session.
2. CAMainFlow assembles the prompt and generates a response
The ConvoAgent's primary flow (CAMainFlow) picks up the incoming event and assembles a full context prompt from multiple sources:
- The agent's business context, scenarios, and procedures
- The compiled intent type map (working-hours or non-working-hours variant)
- KEY DIRECTIVES generated by the Observer on the previous turn
- Current booking and calendar action states
- RAG context, if enabled
With this context assembled, the ConvoAgent generates a response and sends it back to the user.
3. broadcast_analyze_conversation fires
After the ConvoAgent generates its response, CAMainFlow fires the broadcast_analyze_conversation system event. This event has three subscribers that all run at the same time.
4. Three flows run in parallel
| Flow | Interrupt mode | What it does |
|---|---|---|
CAObserverFlow | queue | Extracts user information (name, phone, email, language, opt-in preferences) from the latest exchange. Evaluates conversation quality on voice channels. |
CAThoughtsFlow | interrupt | Assembles the full supervisor context and generates KEY DIRECTIVES — structured step-by-step instructions for what the ConvoAgent should do next. |
CANewoToolCaller | queue | Analyzes the ConvoAgent's latest response for action commitments. Detects matching tools, resolves conflicts, and fires execution flows. |
Queue vs interrupt mode: CAThoughtsFlow runs in interrupt mode, meaning if a new broadcast_analyze_conversation event arrives before thought generation finishes, the in-progress run is cancelled and restarted with the latest conversation state. This ensures KEY DIRECTIVES always reflect the most recent exchange. The other two flows run in queue mode — they complete the current run before processing a new event.
5. Outputs feed into the next turn
Each flow's outputs become inputs for the following turn:
CAObserverFlow outputs:
- Extracted user information (name, phone, email, language, opt-in status) stored as persona attributes
- Working hours status
- Conversation quality flag (triggers recovery actions if score ≤ 3)
CAThoughtsFlow outputs:
- KEY DIRECTIVES stored as a persona attribute. On the next turn,
CAMainFlowreads these and injects them into the ConvoAgent's prompt as<CurrentTaskAnalysis>— telling the agent exactly which scenario step to execute next.
CANewoToolCaller outputs:
- Tool execution flows fire (e.g.,
CACheckingAvailabilityFlow,CAActionSendSMSInformationFlow,CAActionCallTransferFlow). These flows perform backend operations and may inject results back into the conversation via urgent messages or updated persona attributes.
Waiting mode
When a tool execution flow performs an operation that takes time — such as checking booking availability — the system enters waiting mode to prevent the ConvoAgent from acting on stale directives:
convoagent_activate_waiting_modeevent fires, pausing thought generation- If the user sends another message while waiting, the ConvoAgent responds without updated KEY DIRECTIVES
- When the tool result arrives, an
urgent_messageevent re-enables thought generation, and the next turn's directives incorporate the result
This prevents the Observer from generating directives that don't yet account for a pending tool result.
How the pipeline shapes agent behavior
Each turn is self-contained. The ConvoAgent generates a response based on whatever directives and context existed at the start of that turn. The parallel flows then update those directives for the next turn. This creates a continuously updated guidance loop:
| Turn | ConvoAgent response | Parallel output |
|---|---|---|
| 1 | Greets user, identifies intent | Observer detects language; Thoughts set Scenario 0 → Scenario 1 routing |
| 2 | Asks for phone number (Step 1.1) | Observer stores phone number; Thoughts advance to Step 1.2 |
| 3 | Asks for name (Step 1.2) | Observer stores name; Thoughts advance to Step 1.3 |
| 4 | Says code-phrase: "Let me check availability for Friday at 7 PM" | Tool Caller detects check_availability_tool; fires CACheckingAvailabilityFlow; waiting mode activates |
| 5 | Receives availability result | Observer updates availability context; Thoughts instruct ConvoAgent to confirm or offer alternatives |
See also
- The Observer system — Full reference for
CAObserverFlowandCAThoughtsFlow, including KEY DIRECTIVES format, field tracking, and quality scoring - The Supervisor and Tool Caller system — Full reference for
CANewoToolCaller, tool compilation, condition detection, and execution pipeline - V2V backward prompting — How KEY DIRECTIVES are injected into voice-to-voice models mid-conversation
Updated about 2 months ago
