Skip to main content

Quick App manifest examples

These are complete Quick App manifests for common patterns, each an applicationProperties object. Use them with the applications API, in the DIAL Core configuration, or in Edit JSON in the editor. This page is for app developers who start a manifest from a working one. It assumes you know the manifest fields.

Replace each <...> placeholder with a value from your DIAL deployment: a model that supports tools, an application, or a Toolset.

Assistant with conversation starters​

A model and a system prompt, with no tools.

{
"orchestrator": {
"deployment": { "deployment_id": "<MODEL_ID>", "parameters": { "temperature": 0.5 } },
"system_prompt": {
"type": "custom",
"variables": {},
"content": "You are a helpful assistant. Answer clearly and concisely. If you don't know the answer, say so."
}
},
"contexts": [],
"tool_sets": [],
"conversation_starters": {
"starters": [
{ "title": "RAG vs fine-tuning", "text": "What is the difference between RAG and fine-tuning?" },
{ "title": "MCP servers", "text": "Explain what an MCP server does." }
]
}
}

Questions about attached documents​

The predefined dial_rag tool searches the documents users attach, through the dial-rag deployment. contexts gives the agent fixed files to know about; it doesn't search them.

{
"orchestrator": {
"deployment": { "deployment_id": "<MODEL_ID>", "parameters": { "temperature": 0.2 } },
"system_prompt": {
"type": "custom",
"variables": {},
"content": "You are a document assistant. Use the RAG search tool before answering. If the answer isn't in the documents, say so. Quote relevant passages."
}
},
"contexts": [],
"tool_sets": [
{
"type": "dial-deployment",
"name": "documents",
"tools": [{ "type": "predefined-tool", "template_name": "dial_rag" }]
}
]
}

Weather assistant with two REST tools​

Two Open-Meteo endpoints, with no authentication: the model first finds a location's coordinates, then its weather. The count and current parameters are constants the model never sees.

{
"orchestrator": {
"deployment": { "deployment_id": "<MODEL_ID>" },
"system_prompt": {
"type": "custom",
"variables": {},
"content": "You are a weather assistant. Call geo_code to get a location's coordinates, then weather to get its current conditions."
}
},
"contexts": [],
"tool_sets": [
{
"type": "rest-api",
"name": "weather",
"tools": [
{
"type": "restapi-tool",
"rest_api_method_info": { "method_url": "https://geocoding-api.open-meteo.com/v1/search", "method_type": "get" },
"open_ai_tool": {
"type": "function",
"function": {
"name": "geo_code",
"description": "Get the latitude and longitude of a city or location.",
"parameters": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "The city or location name.",
"parameter_info": { "type": "query", "key": "name" }
},
"count": { "type": null, "const": "1", "parameter_info": { "type": "query", "key": "count" } }
},
"required": ["name", "count"]
}
}
},
"display": { "stage": { "name": "Finding {name}" } }
},
{
"type": "restapi-tool",
"rest_api_method_info": { "method_url": "https://api.open-meteo.com/v1/forecast", "method_type": "get" },
"open_ai_tool": {
"type": "function",
"function": {
"name": "weather",
"description": "Get the current weather at a latitude and longitude.",
"parameters": {
"type": "object",
"properties": {
"latitude": {
"type": "number",
"description": "The latitude.",
"parameter_info": { "type": "query", "key": "latitude" }
},
"longitude": {
"type": "number",
"description": "The longitude.",
"parameter_info": { "type": "query", "key": "longitude" }
},
"current": {
"type": null,
"const": "temperature_2m,wind_speed_10m",
"parameter_info": { "type": "query", "key": "current" }
}
},
"required": ["latitude", "longitude", "current"]
}
}
},
"display": { "stage": { "name": "Fetching the weather" } }
}
]
}
]
}

Support assistant with an authenticated API​

A ticket API with bearer authentication. {ticket_id} in the URL is filled from the url parameter. When the API fails, the error goes to the model, and the system prompt tells it what to say.

{
"orchestrator": {
"deployment": { "deployment_id": "<MODEL_ID>", "parameters": { "temperature": 0.2 } },
"system_prompt": {
"type": "custom",
"variables": {},
"content": "You are a support assistant for ACME. Use lookup_ticket for questions about a ticket. If the tool fails, apologize and point the user to support@acme.example.com."
}
},
"contexts": [],
"tool_sets": [
{
"type": "rest-api",
"name": "crm",
"authorization": { "type": "bearer", "token": "<CRM_TOKEN>" },
"tools": [
{
"type": "restapi-tool",
"rest_api_method_info": { "method_url": "https://crm.acme.example.com/api/v1/tickets/{ticket_id}", "method_type": "get" },
"open_ai_tool": {
"type": "function",
"function": {
"name": "lookup_ticket",
"description": "Look up the status and details of a support ticket by its ID.",
"parameters": {
"type": "object",
"properties": {
"ticket_id": {
"type": "string",
"description": "The ticket ID, such as TICK-1234.",
"parameter_info": { "type": "url", "key": "ticket_id" }
}
},
"required": ["ticket_id"]
}
}
},
"fallback_configuration": { "strategies": [{ "type": "continue" }], "display_error_in_stage": false },
"display": { "stage": { "name": "Looking up ticket {ticket_id}" } }
}
]
}
]
}

MCP server with an allowlist​

An MCP server over streamable HTTP, with bearer authentication. Only two of its tools reach the model. A quota error stops the loop; any other error goes to the model.

{
"orchestrator": {
"deployment": { "deployment_id": "<MODEL_ID>" },
"system_prompt": {
"type": "custom",
"variables": {},
"content": "You are a research assistant. Search the web for questions that need current information."
}
},
"contexts": [],
"tool_sets": [
{
"type": "mcp",
"name": "search",
"mcp_server_info": {
"url": "https://mcp.example.com/search",
"protocol": "streamable_http",
"authorization": { "type": "bearer", "token": "<TOKEN>" }
},
"allowed_tools": ["web_search", "fetch_page"],
"fallback_configuration": {
"strategies": [
{ "type": "hard_stop", "trigger_on": { "type": "contains", "value": "quota exceeded" } },
{ "type": "continue" }
]
}
}
]
}

A DIAL model as a specialist tool​

A second model reviews code with its own system prompt. If the reviewer times out, the main model is told to review the code itself.

{
"orchestrator": {
"deployment": { "deployment_id": "<MODEL_ID>", "parameters": { "temperature": 0.3 } },
"system_prompt": {
"type": "custom",
"variables": {},
"content": "You are a developer assistant. When a user shares code for review, use code_reviewer and present its feedback. Answer general questions directly."
}
},
"contexts": [],
"tool_sets": [
{
"type": "dial-deployment",
"name": "review",
"tools": [
{
"type": "deployment-tool",
"deployment": { "deployment_id": "<REVIEWER_MODEL_ID>", "parameters": { "temperature": 0.1 } },
"system_prompt": {
"type": "custom",
"variables": {},
"content": "You are an expert code reviewer. List bugs, security concerns, and style suggestions. Be specific."
},
"open_ai_tool": {
"type": "function",
"function": {
"name": "code_reviewer",
"description": "Review a code snippet for bugs, security issues, and style.",
"parameters": {
"type": "object",
"properties": {
"code": { "type": "string", "description": "The code to review." },
"language": { "type": "string", "description": "The programming language, such as python." }
},
"required": ["code", "language"]
}
}
},
"fallback_configuration": {
"strategies": [
{
"type": "continue",
"trigger_on": { "type": "contains", "value": "timed out" },
"instructions": "The reviewer is unavailable. Review the code yourself."
}
]
},
"display": { "stage": { "name": "Reviewing {language} code" } }
}
]
}
]
}

Agent with a workspace and web access​

The agent reads and writes files in its own DIAL folder, fetches web pages, and attaches results to its answer. Tool calls time out after 60 seconds. Web fetch works only when the backend's EXTERNAL_URL_FETCH_ENABLED is true.

{
"orchestrator": {
"deployment": { "deployment_id": "<MODEL_ID>" },
"system_prompt": {
"type": "custom",
"variables": {},
"content": "You are a research assistant. Save your notes to files, fetch sources from the web, and attach the final report to your answer."
},
"attachment_strategy": { "type": "lazy_on_demand" }
},
"contexts": [],
"tool_sets": [],
"features": {
"dial_files": { "enabled_tools": "all", "agent_home_dir": "workspace/" },
"web_fetch": { "enabled": true },
"representation_tooling": {},
"stage_display": { "level": "info" }
},
"tool_defaults": { "timeout_seconds": 60 }
}

Research assistant with several Toolset types​

A REST API, a DIAL MCP Toolset, and a DIAL application in one app, with tool discovery for the larger Toolsets.

{
"orchestrator": {
"deployment": { "deployment_id": "<MODEL_ID>", "parameters": { "temperature": 0.5 } },
"system_prompt": {
"type": "custom",
"variables": {},
"content": "You are a research assistant. Use the tools when they help, and combine their results. Always cite tool results."
},
"max_iterations": 20,
"tool_discovery": { "enabled": true }
},
"contexts": [],
"tool_sets": [
{
"type": "rest-api",
"name": "weather",
"tools": [
{
"type": "restapi-tool",
"rest_api_method_info": { "method_url": "https://api.open-meteo.com/v1/forecast", "method_type": "get" },
"open_ai_tool": {
"type": "function",
"function": {
"name": "weather",
"description": "Get the current weather at a latitude and longitude.",
"parameters": {
"type": "object",
"properties": {
"latitude": { "type": "number", "description": "The latitude.", "parameter_info": { "type": "query", "key": "latitude" } },
"longitude": { "type": "number", "description": "The longitude.", "parameter_info": { "type": "query", "key": "longitude" } },
"current": { "type": null, "const": "temperature_2m", "parameter_info": { "type": "query", "key": "current" } }
},
"required": ["latitude", "longitude", "current"]
}
}
}
}
]
},
{ "type": "dial-mcp", "name": "search", "deployment_id": "<SEARCH_TOOLSET_ID>", "allowed_tools": ["search"] },
{
"type": "dial-deployment",
"name": "helpers",
"tools": [{ "type": "dial-deployment-simple", "deployment_id": "<SUMMARIZER_APP_ID>" }]
}
]
}

Further reading​