Orchestration
The orchestrator is the LLM that drives a Quick App. The backend turns each chat completion request into an agent loop: the orchestrator answers, calls tools, reads their results, and answers again. This page covers how a request is processed, the agent loop, the orchestrator model, and the system prompt. It is for platform engineers and app developers who configure Quick Apps. It assumes you know the Quick Apps capabilities.
How a request is processed
- Validate the messages. The
messagesarray must have the shape(system)? (user assistant)* user. Tool messages and misplaced system messages are rejected with400. Every problem is listed in one response. - Apply the system message policy. A leading system message with text is rejected with
400, unless the backend'sALLOW_OVERRIDE_SYSTEM_MESSAGEistrue. See System prompt. - Resolve templates. Predefined prompts, Toolsets, and tools are replaced with their definitions, and each
overridepatch is applied. A failure is reported in the Initialization issues stage. - Build the tools and skills. Each Toolset's tools are created, and DIAL skills are fetched. If an MCP Toolset needs sign-in, the user is asked once for all of them. See MCP Toolsets.
- Prepare the messages. This runs once per request. The system prompt is built, and synthetic tool-call pairs are added for the context files, the current time, and any skills picked on the message.
- Run the agent loop.
Tools or skills that fail to load don't stop the request. They are listed in the Initialization issues stage, and the request continues without them. See Errors.
Agent loop
The orchestrator repeats one iteration until the LLM answers without tool calls:
- Increment the iteration counter. If it exceeds the maximum, stop with an error message.
- Send the prepared messages to the LLM and stream its response.
- Collect the content, attachments, and tool calls from the stream.
- If the response has tool calls, run them in parallel, add their results to the conversation, and start the next iteration. Otherwise, finalize the answer.
The loop ends when the LLM answers without tool calls, when the iteration limit is reached, or on an unrecoverable error.
- Iteration limit.
orchestrator.max_iterationsin the manifest, default15. There is no unlimited setting;0or less stops the request with an error before the first LLM call. The backend'sDEFAULT_AGENT_MAX_ITERATIONSsets the default for every app. - Tool history. The tool calls of a turn are stored with the assistant message, and restored as tool-call pairs on the next turn. The orchestrator sees what it did before.
Orchestrator model
orchestrator.deployment names a DIAL model and its parameters:
{
"orchestrator": {
"deployment": {
"deployment_id": "<MODEL_ID>",
"parameters": { "temperature": 0.5, "reasoning_effort": "high" }
}
}
}
- Default model. When a manifest leaves out
deployment, the backend'sDEFAULT_ORCHESTRATOR_DEPLOYMENT_IDis used. The schema also offers it as the default for new manifests. - Parameters. Sampling parameters,
max_tokens, andstopare passed to the model.reasoning_effortis dropped, with a warning in the Initialization issues stage, when the model doesn't advertisefeatures.reasoningEfforts.custom_fields.configurationis forwarded too, for model features such as Anthropicbetas. - Model-side tools. Tools the model's deployment declares in DIAL Core as
static_functiondefaults, such as search grounding on Gemini, are sent to the model with the app's tools. The model runs them on its side; the backend doesn't execute them. - Model stages.
orchestrator.propagate_stages, defaulttrue, shows the model's own stages, such as reasoning steps, in the answer.
The fields are in Orchestrator.