Skip to main content

ChatHub

ChatHub is DIAL's general-purpose productivity agent. It is a family of Quick Apps. Each variant pairs a chat LLM with the same capabilities: vision, document search, web search, image generation, and Python code interpretation. Users ask, and the orchestrator picks the tool for each turn. This reference covers what a ChatHub variant is made of, how to define one, and how to customize it. It is for platform engineers who offer ChatHub in a DIAL deployment. It assumes you know Quick Apps and Quick App applications in DIAL Core.

What a variant is made of​

A ChatHub variant is a Quick App application with three parts:

  1. Orchestrator. The chat LLM that drives the conversation, and its sampling parameters.
  2. System prompt. A predefined prompt that matches the tool-calling conventions of the model family.
  3. Tool sets. References to two predefined Toolsets, chathub and py_interpreter. Together they make up ChatHub.

A predefined reference is a pointer, such as { "type": "predefined", "template_name": "chathub" }. It is replaced with the template's definition when the variant is loaded.

Predefined building blocks​

KindNameContents
System prompt (system_prompt.template)gpt_prompt, anthropic_prompt, gemini_promptA prompt for GPT, Claude, or Gemini models
Toolset (tool_sets[].template_name)chathubA dial-deployment Toolset with the dial_rag, image_generation, and web_search tools
py_interpreterAn internal Toolset with the py_interpreter tool
Tool (predefined-tool entries)dial_ragrag_search_tool: searches the attached documents, calling the dial-rag deployment
web_searchweb_search_tool: searches the web, calling the gemini-2.5-pro-google-search deployment
image_generationimage_generation_tool: generates images, calling the gpt-image-1 deployment
py_interpreterinternal_code_execution_python_interpreter: runs Python code

The tools call these deployments by name, so your DIAL Core must have them, or you must point the tools elsewhere. The Python interpreter runs through DIAL Core unless the backend's Python interpreter variables say otherwise.

Define a variant​

A ChatHub variant is an entry in the applications section of the DIAL Core configuration. This one is condensed from the backend's sample GPT-5 variant:

{
"applications": {
"chat_hub_gpt5_quickapp": {
"displayName": "ChatHub - GPT-5 (QuickApp)",
"description": "Agent with vision, image generation, documents RAG, web search and python code interpretation capabilities.",
"applicationTypeSchemaId": "https://mydial.epam.com/custom_application_schemas/quickapps2",
"applicationProperties": {
"orchestrator": {
"deployment": {
"deployment_id": "gpt-5-2025-08-07",
"parameters": { "seed": 820288 }
},
"system_prompt": { "type": "predefined", "template": "gpt_prompt" }
},
"contexts": [],
"tool_sets": [
{ "type": "predefined", "template_name": "chathub" },
{ "type": "predefined", "template_name": "py_interpreter" }
],
"conversation_starters": {
"starters": [
{ "title": "Weather", "text": "What's the weather in London?" },
{ "title": "Abilities", "text": "What can you do?" },
{ "title": "Tools", "text": "What tools do you have?" }
]
}
},
"features": { "systemPromptSupported": false },
"inputAttachmentTypes": ["*/*"]
}
}
}

The backend's samples still use two deprecated forms: deployment.name for deployment.deployment_id, and the top-level starters list of strings for conversation_starters.

To add a variant for another model:

  1. Choose an application key, such as chat_hub_my_variant_quickapp, and set displayName and description.
  2. Set orchestrator.deployment.deployment_id to the DIAL model's deployment ID.
  3. Set orchestrator.system_prompt.template to the prompt of the model's family.
  4. Keep the chathub and py_interpreter Toolsets. They are what makes the application a ChatHub.

The backend maps each predefined prompt to the models it suits. A variant for a model outside that mapping still validates, but its orchestrator may not get a prompt that matches the model's conventions. Add the model to CONFIG_PROMPT_MAPPING.

The backend repository ships sample variants for Claude, GPT, and Gemini models in docker_compose_files/core/configuration/chathub/.

note

Keep "systemPromptSupported": false in each variant's features, as for every Quick App. See Quick App applications.

Customize a variant​

Every variant shares the same predefined templates. To change one variant only, use the patterns below. They follow one rule: a predefined reference stays a pointer and takes one optional override patch. When the patch would outweigh the template, write the tool in full instead.

The override field is a JSON Merge Patch:

  • Objects merge recursively.
  • Arrays replace the whole array; they don't merge or append.
  • null deletes a key.
  • The patch can't contain a type key at any depth, because type selects the kind of tool or Toolset. To change the kind, write the tool in full.

Swap a tool's deployment​

To give one variant a tenant-specific RAG deployment, dissolve the chathub bundle into a dial-deployment Toolset that lists the tools one by one. Then override the deployment of one of them:

{
"tool_sets": [
{
"name": "chat-hub",
"type": "dial-deployment",
"tools": [
{
"type": "predefined-tool",
"template_name": "dial_rag",
"override": { "deployment": { "deployment_id": "hr-rag-prod" } }
},
{ "type": "predefined-tool", "template_name": "image_generation" },
{ "type": "predefined-tool", "template_name": "web_search" }
]
},
{ "type": "predefined", "template_name": "py_interpreter" }
]
}

Everything else, such as the function, attachment rules, and fallback, comes from the template. Dissolving the bundle is what allows per-tool overrides and per-tool enabled flags. Overrides don't apply to dial-deployment-simple tools, whose configuration comes from DIAL Core.

Change a tool's description​

Nested objects merge, so this patch replaces only the description that the orchestrator sees:

{
"type": "predefined-tool",
"template_name": "web_search",
"override": {
"open_ai_tool": {
"function": {
"description": "Search the internal knowledge base for company-internal information."
}
}
}
}

Turn off one tool​

In the dissolved Toolset, set enabled: false on the tool. It is never loaded. An override on a disabled tool is kept but not applied, so setting enabled back to true restores both.

{
"tool_sets": [
{
"name": "chat-hub",
"type": "dial-deployment",
"tools": [
{ "type": "predefined-tool", "template_name": "dial_rag" },
{ "type": "predefined-tool", "template_name": "image_generation", "enabled": false },
{ "type": "predefined-tool", "template_name": "web_search" }
]
},
{ "type": "predefined", "template_name": "py_interpreter" }
]
}

Remove a Toolset​

Leave the Toolset out of tool_sets. This variant has no Python interpreter:

{
"tool_sets": [
{ "type": "predefined", "template_name": "chathub" }
]
}

Replace a tool​

When a tool needs another function name, parameter schema, or behavior, replace its predefined-tool entry with a full deployment-tool. Full and predefined tools can sit in the same Toolset:

{
"tool_sets": [
{
"name": "chat-hub",
"type": "dial-deployment",
"tools": [
{ "type": "predefined-tool", "template_name": "dial_rag" },
{ "type": "predefined-tool", "template_name": "web_search" },
{
"type": "deployment-tool",
"deployment": { "deployment_id": "internal-image-gen-v2" },
"open_ai_tool": {
"type": "function",
"function": {
"name": "image_generation_tool",
"description": "Custom image generator.",
"parameters": {
"type": "object",
"properties": {
"query": {
"type": "string",
"description": "Description of the image to generate."
}
},
"required": ["query"]
}
}
}
}
]
}
]
}

A full tool doesn't pick up later improvements to the template. Prefer it over override when a patch would be mostly null deletions. An example is an image model with style and aspect_ratio parameters in place of the template's own.

Rewrite the system prompt​

A predefined prompt is a pointer with no override. To change it, switch to type: custom and give the full text:

{
"system_prompt": {
"type": "custom",
"content": "You are an internal assistant for ACME Corp. ...",
"variables": {}
}
}

The predefined prompts are Markdown files in the backend repository, under config/predefined/prompt/; start from a copy. A custom prompt doesn't pick up later improvements to the predefined one.

Environment variables​

These backend variables affect every variant:

VariableEffect
PREDEFINED_EXTRA_PATHSA JSON list of folders of templates, layered over the built-in ones; later folders win. A template replaced here changes every variant that uses its name. Per-variant override patches still apply on top.
CONFIG_PROMPT_MAPPINGA JSON mapping of the predefined prompts, gpt_prompt, anthropic_prompt, and gemini_prompt, to the DIAL deployments they suit. Extend it when you add a model that should use an existing prompt.
ENABLE_PREVIEW_FEATURESWhen false, the default, preview features are off even if a variant configures them. Test variants that use them with the flag on before you promote them.

Further reading​