Releases: epam/ai-dial-quickapps-backend
Release list
0.9.0
Features
- [Preview] Lazy on-demand attachment strategy for the orchestrator — admin context files and user uploads are exposed as metadata via
internal_attachments_available_context/internal_attachments_get_content, and bytes reach the model only when it requests a specific file; opt in per-app withorchestrator.attachment_strategy.type = "lazy_on_demand"#228 (#309) - [Preview] Folder contexts — admins attach a DIAL folder once and its files and subfolders expand automatically into
internal_attachments_available_context(with new / updated / removed membership tracking), instead of oneFileContextConfigper file; recursion bounded bymax_depth#65 (#362) - [Preview] Offload large tool responses to DIAL files — responses exceeding a byte threshold are uploaded to file storage and replaced in history with a notice the model reads back on demand, protecting the context window; a DIAL Files sub-feature configured via
features.dial_files.tool_call_result_offloadwithTOOL_CALL_RESULT_OFFLOAD__*env defaults #64 (#234) - [Preview] Hook result reuse via a
refresh_conditionTTL — a(ASSISTANT/tool_calls, TOOL)hook can reuse its last result from conversation history untilttl_minuteselapses, then re-fetch, sparing repeated tool calls for slowly-changing data #363 (#364) - [Preview] Validate tools referenced in
hooksconfig and surface an error on the stage when a referenced tool does not exist #333 (#349) - External
http(s)URLs as first-class file references — deployment-tool attachments, REST/MCPfile:base64::/file:text::, and Python-interpreter input now accept external URLs, gated by a two-tier egress policy (adminEXTERNAL_URL_FETCH_*env caps, per-appfeatures.external_url_fetchnarrows) #258 (#279) - Find and search across the DIAL files workspace —
searchnow scans folder subtrees (output_mode,name_filter,max_depth, configurablemax_files_scanned) and a newfindtool locates files by name/path glob via metadata only; part of the now-GA DIAL files toolkit (see #377) #342 (#352) - Render file-tool stage
contentverbatim — reuse theformatfield onFormattedParameterConfigto wrap values in auto-sized fenced code blocks (so markdown content shows literal text, not a rendered document) and add anorderfield so long params likecontentrender after short ones likepath#353 (#365) - Support the
tool_choiceparameter on chat completion requests, mirroring DIAL Core'stool_choice(string or named-tool-choice object) #182 (#367) - Deployment-wide stage display override via the new
DEFAULT_STAGE_DISPLAY_LEVELenv variable —error/info/debug(case-insensitive); when set, wins over every app'sfeatures.stage_display.level#334 (#340) - Graduate the DIAL files tools to GA —
list/read_lines/search/find/write/edit/delete/copy/moveand thefeatures.dial_filesconfig field are no longer gated byENABLE_PREVIEW_FEATURES; thetool_call_result_offloadsub-feature stays behind the preview flag (#377)
Fixes
- Friendlier DIAL file-tool error handling — normalize service-layer 404s to "file/folder not found" instead of leaking raw exceptions, list the agent home root as
(empty folder)when nothing is written yet, show relative display paths instead of internalfiles/{bucket}/…URLs, and makewrite_fileoverwrite=truecreate-or-replace in a single upload #345 (#354) - Resolve recursive
$defsreferences in MCP tool input schemas — preserve the localjsonreffallback when FastMCP'sdereference_refs()leaves circular refs unresolved, so tool initialization no longer fails withUnresolved $ref '#/$defs/...'; also pins FastMCP to PyPI3.4.2(#379) - Prevent nested code fences from breaking skill and file-tool stage rendering — wrap arbitrary tool/response content with a fence one backtick longer than the longest run inside it (shared
fenced_code_blockhelper), so embedded```no longer closes the wrapper early in skill, MCP, REST, and init-error stages (#371) - Patch HIGH-severity CVEs in transitive deps blocking the Docker build (Trivy gate) —
cryptography→ 49.0.0 (GHSA-537c-gmf6-5ccf),pyjwt→ 2.13.0 (CVE-2026-48526),python-multipart→ 0.0.32 (CVE-2026-53539),starlette→ 1.3.1 (CVE-2026-54283);poetry.lock-only (#370)
Other
- Bump
starlettefrom 1.0.0 to 1.0.1 — picks up a fix to ignore a malformedHostheader when constructingrequest.url(#355) - Bump
pydantic-settingsfrom 2.13.1 to 2.14.2 — security patch release that preventsNestedSecretsSettingsSourcefrom following symlinks outsidesecrets_dir(#381)
Deployment Changes
New environment variables
| Variable | Default | Description |
|---|---|---|
DEFAULT_STAGE_DISPLAY_LEVEL |
unset | Deployment-wide override for the stage visibility threshold (error, info, debug; case-insensitive). When set, wins over every app's features.stage_display.level. Unset defers to the per-app config (which defaults to info). |
EXTERNAL_URL_FETCH_ENABLED |
false |
Admin cap on fetching external (non-DIAL) URLs. When false, no app may fetch external URLs regardless of its manifest; the deployment-handoff branch (deployments with features.url_attachments) is unaffected. Apps can opt out per-app via features.external_url_fetch.enabled. |
EXTERNAL_URL_FETCH_HOST_ALLOWLIST |
— | Comma-separated allowlist of host patterns for external URL fetches. Unset means no admin-level host restriction. Patterns: exact host (example.com) or *.example.com. Re-checked on every redirect hop. Per-app features.external_url_fetch.host_allowlist narrows (intersection). |
EXTERNAL_URL_FETCH_MAX_REDIRECTS |
5 |
Maximum HTTP redirects on external URL fetches (0 ≤ x ≤ 10). Each hop is SSRF-checked. |
EXTERNAL_URL_FETCH_CONNECT_TIMEOUT_SECONDS |
5.0 |
TCP connect timeout (seconds, > 0) for external URL fetches. Read/write/pool timeouts use the resolved tool timeout. |
TOOL_CALL_RESULT_OFFLOAD__ENABLED_BY_DEFAULT |
true |
Default value of the per-app enabled flag (features.dial_files.tool_call_result_offload.enabled); apps set enabled: false to disable offload. |
TOOL_CALL_RESULT_OFFLOAD__SIZE_THRESHOLD |
40000 |
Default byte threshold above which a tool-call response is offloaded to a DIAL file. Apps override per-app via features.dial_files.tool_call_result_offload.size_threshold. |
TOOL_CALL_RESULT_OFFLOAD__EXCLUDED_TOOLS |
[] |
Default JSON list of additional tool names exempt from offloading. The read-back tools (internal_file_read_lines, internal_file_search) are always excluded so a read-back slice is never re-offloaded. Apps add more per-app. |
Behavioral changes
Note
The DIAL files tools have graduated to GA and are now active regardless of ENABLE_PREVIEW_FEATURES:
- DIAL files tools —
list/read_lines/search/find/write/edit/delete/copy/moveand thefeatures.dial_filesconfig field (#377)
The tool_call_result_offload sub-feature (features.dial_files.tool_call_result_offload, with its TOOL_CALL_RESULT_OFFLOAD__* env defaults) remains preview-gated.
0.9.0-rc.2
0.9.0-rc.1
Features
- Graduate the DIAL files tools to GA —
list/read_lines/search/find/write/edit/delete/copy/moveand thefeatures.dial_filesconfig field are no longer gated byENABLE_PREVIEW_FEATURES; thetool_call_result_offloadsub-feature stays behind the preview flag (#377) - [Preview] Folder contexts — admins attach a DIAL folder once and its files and subfolders expand automatically into
internal_attachments_available_context(with new / updated / removed membership tracking), instead of oneFileContextConfigper file; recursion bounded bymax_depth#65 (#362) - Support the
tool_choiceparameter on chat completion requests, mirroring DIAL Core'stool_choice(string or named-tool-choice object) #182 (#367) - [Preview] Hook result reuse via a
refresh_conditionTTL — a(ASSISTANT/tool_calls, TOOL)hook can reuse its last result from conversation history untilttl_minuteselapses, then re-fetch, sparing repeated tool calls for slowly-changing data #363 (#364)
Fixes
- Resolve recursive
$defsreferences in MCP tool input schemas — preserve the localjsonreffallback when FastMCP'sdereference_refs()leaves circular refs unresolved, so tool initialization no longer fails withUnresolved $ref '#/$defs/...'; also pins FastMCP to PyPI3.4.2(#379) - Patch HIGH-severity CVEs in transitive deps blocking the Docker build (Trivy gate) —
cryptography→ 49.0.0 (GHSA-537c-gmf6-5ccf),pyjwt→ 2.13.0 (CVE-2026-48526),python-multipart→ 0.0.32 (CVE-2026-53539),starlette→ 1.3.1 (CVE-2026-54283);poetry.lock-only (#370) - Prevent nested code fences from breaking skill and file-tool stage rendering — wrap arbitrary tool/response content with a fence one backtick longer than the longest run inside it (shared
fenced_code_blockhelper), so embedded```no longer closes the wrapper early in skill, MCP, REST, and init-error stages (#371)
Other
- Bump
pydantic-settingsfrom 2.13.1 to 2.14.2 — security patch release that preventsNestedSecretsSettingsSourcefrom following symlinks outsidesecrets_dir(#381)
Deployment Changes
Behavioral changes
Note
The DIAL files tools have graduated to GA and are now active regardless of ENABLE_PREVIEW_FEATURES:
- DIAL files tools —
list/read_lines/search/find/write/edit/delete/copy/moveand thefeatures.dial_filesconfig field (#377)
The tool_call_result_offload sub-feature (features.dial_files.tool_call_result_offload, with its TOOL_CALL_RESULT_OFFLOAD__* env defaults) remains preview-gated.
0.8.1
Fixes
- Resolve circular
$refleft unresolved by FastMCP'sdereference_refs()— falls back tojsonref.replace_refs()so recursive MCP tool input schemas (e.g. aconditionsarray referencing#/$defs/condition) no longer fail tool initialization (backport #379)
Other
- Bump vulnerable transitive dependencies to patched versions — clears 5 HIGH CVEs on the 0.8 line:
pyjwt2.12.1→2.13.0 (CVE-2026-48526),cryptography46.0.7→49.0.0 (GHSA-537c-gmf6-5ccf),starlette1.0.0→1.3.1 (CVE-2026-48818, CVE-2026-54283)
0.7.1
Fixes
- Resolve circular
$refleft unresolved by FastMCP'sdereference_refs()— falls back tojsonref.replace_refs()so recursive MCP tool input schemas (e.g. aconditionsarray referencing#/$defs/condition) no longer fail tool initialization (backport #379)
Other
- Bump vulnerable transitive dependencies to patched versions — clears 8 HIGH CVEs on the 0.7 line:
pyjwt2.12.1→2.13.0 (CVE-2026-48526),cryptography46.0.7→49.0.0 (GHSA-537c-gmf6-5ccf),python-multipart0.0.26→0.0.32 (CVE-2026-42561, CVE-2026-53539),starlette1.0.0→1.3.1 (CVE-2026-48818, CVE-2026-54283), andurllib32.6.3→2.7.0 (CVE-2026-44431, CVE-2026-44432) (48779bc)
0.9.0-rc.0
Features
- [Preview] Lazy on-demand attachment strategy for the orchestrator — admin context files and user uploads are exposed as metadata via
internal_attachments_available_context/internal_attachments_get_content, and bytes reach the model only when it requests a specific file; opt in per-app withorchestrator.attachment_strategy.type = "lazy_on_demand"#228 (#309) - External
http(s)URLs as first-class file references — deployment-tool attachments, REST/MCPfile:base64::/file:text::, and Python-interpreter input now accept external URLs, gated by a two-tier egress policy (adminEXTERNAL_URL_FETCH_*env caps, per-appfeatures.external_url_fetchnarrows) #258 (#279) - [Preview] Offload large tool responses to DIAL files — responses exceeding a byte threshold are uploaded to file storage and replaced in history with a notice the model reads back on demand, protecting the context window; a DIAL Files sub-feature configured via
features.dial_files.tool_call_result_offloadwithTOOL_CALL_RESULT_OFFLOAD__*env defaults #64 (#234) - [Preview] Workspace-wide file discovery in the DIAL files toolkit —
searchnow scans folder subtrees (output_mode,name_filter,max_depth, configurablemax_files_scanned) and a newfindtool locates files by name/path glob via metadata only #342 (#352) - Deployment-wide stage display override via the new
DEFAULT_STAGE_DISPLAY_LEVELenv variable —error/info/debug(case-insensitive); when set, wins over every app'sfeatures.stage_display.level#334 (#340) - [Preview] Validate tools referenced in
hooksconfig and surface an error on the stage when a referenced tool does not exist #333 (#349) - [Preview] Render file-tool stage
contentverbatim — reuse theformatfield onFormattedParameterConfigto wrap values in auto-sized fenced code blocks (so markdown content shows literal text, not a rendered document) and add anorderfield so long params likecontentrender after short ones likepath#353 (#365)
Fixes
- [Preview] Friendlier DIAL file-tool error handling — normalize service-layer 404s to "file/folder not found" instead of leaking raw exceptions, list the agent home root as
(empty folder)when nothing is written yet, show relative display paths instead of internalfiles/{bucket}/…URLs, and makewrite_fileoverwrite=truecreate-or-replace in a single upload #345 (#354)
Other
- Bump
starlettefrom 1.0.0 to 1.0.1 — picks up a fix to ignore a malformedHostheader when constructingrequest.url(#355)
Deployment Changes
New environment variables
| Variable | Default | Description |
|---|---|---|
DEFAULT_STAGE_DISPLAY_LEVEL |
unset | Deployment-wide override for the stage visibility threshold (error, info, debug; case-insensitive). When set, wins over every app's features.stage_display.level. Unset defers to the per-app config (which defaults to info). |
EXTERNAL_URL_FETCH_ENABLED |
false |
Admin cap on fetching external (non-DIAL) URLs. When false, no app may fetch external URLs regardless of its manifest; the deployment-handoff branch (deployments with features.url_attachments) is unaffected. Apps can opt out per-app via features.external_url_fetch.enabled. |
EXTERNAL_URL_FETCH_HOST_ALLOWLIST |
— | Comma-separated allowlist of host patterns for external URL fetches. Unset means no admin-level host restriction. Patterns: exact host (example.com) or *.example.com. Re-checked on every redirect hop. Per-app features.external_url_fetch.host_allowlist narrows (intersection). |
EXTERNAL_URL_FETCH_MAX_REDIRECTS |
5 |
Maximum HTTP redirects on external URL fetches (0 ≤ x ≤ 10). Each hop is SSRF-checked. |
EXTERNAL_URL_FETCH_CONNECT_TIMEOUT_SECONDS |
5.0 |
TCP connect timeout (seconds, > 0) for external URL fetches. Read/write/pool timeouts use the resolved tool timeout. |
TOOL_CALL_RESULT_OFFLOAD__ENABLED_BY_DEFAULT |
true |
Default value of the per-app enabled flag (features.dial_files.tool_call_result_offload.enabled); apps set enabled: false to disable offload. |
TOOL_CALL_RESULT_OFFLOAD__SIZE_THRESHOLD |
40000 |
Default byte threshold above which a tool-call response is offloaded to a DIAL file. Apps override per-app via features.dial_files.tool_call_result_offload.size_threshold. |
TOOL_CALL_RESULT_OFFLOAD__EXCLUDED_TOOLS |
[] |
Default JSON list of additional tool names exempt from offloading. The read-back tools (internal_file_read_lines, internal_file_search) are always excluded so a read-back slice is never re-offloaded. Apps add more per-app. |
0.8.0
Features
- New
dial-apptoolset — given a DIAL deployment id, routes transparently to either MCP (when the deployment advertisesfeatures.mcp == true) or chat completion (otherwise); atransport: "auto" | "mcp" | "chat-completion"field (default"auto") lets admins pin the choice #215 (#243) - [Preview] New DIAL files toolset — exposes
list_files,read_file_lines,search_in_file,write_file,edit_file,delete_file,copy_file,move_fileagainst anagent_home_dir(defaultfiles/{appdata}/); per-app opt-in viafeatures.dial_fileswith optionalenabled_toolsallowlist #256 (#257) - Per-app overrides for predefined tool and toolset templates via a new optional
overridefield carrying a JSON Merge Patch (RFC 7396) — ChatHub variants can swap a deployment, tweak a tool description, or disable a single tool per-app without forking templates globally or duplicating inline JSON #14 #273 (#269) - Layered predefined default application configuration for the QuickApps builder — operators ship a
default_configuration.jsonat each predefined content layer (built-in +PREDEFINED_EXTRA_PATHS), shallow-merged in layer order, exposed to the UI via the newGET /v1/configuration-support/default-configurationendpoint withtool_setsresolved server-side #120 (#323) - Generic synthetic tool-call injector (v2) — replaces the bespoke read-files plumbing with a reusable mechanism for injecting synthetic tool calls into message history #235 (#255)
- [Preview] Config-driven synthetic tool-call injection (hooks) — declare
(ASSISTANT/tool_calls, TOOL)injections in the app manifest's newhooksarray without writing Python;on_request_startevent withalways/append_if_changedfrequency (#275) - Default orchestrator deployment via the new
DEFAULT_ORCHESTRATOR_DEPLOYMENT_IDenv variable — applied at runtime when an app manifest omitsorchestrator.deployment, and surfaced as the JSON-schemadefaultso DIAL Core can pre-fill new manifests #315 (#316) - Per-app
features.stage_display.level—error/info(default) /debugthresholds for which tool-execution stages surface in the DIAL UI;debugreveals synthetic/system stages for manifest authors; deprecatesdisplay.stage.show = false(still honored atinfowith a warning) #293 (#307) - Pass orchestrator deployment's native configuration tools alongside QuickApps tools — enables Gemini 3+ native function-calling features (e.g. Google Search, code execution) when the orchestrator deployment declares them #104 (#301)
- Type-scoped DIAL Core routes for
/v1/configuration-support/*— co-located with the QuickApps application type viadial:applicationTypeRoutesinstead of a detached global route, anddial:attachmentPathslets DIAL Core enforce ACL on prompt URLs inskills/validaterequest bodies #318 (#319) - Trust custom corporate root CAs via the new
USE_SYSTEM_CA_CERTSopt-in — merges*.crtfiles mounted under/certificates/with the Alpine system bundle at container startup and exportsSSL_CERT_FILEso outboundhttpxcalls succeed behind TLS-intercepting proxies #335 (#336) - Lenient skill frontmatter parsing aligned with the Agent Skills spec — tolerates BOM, CRLF, leading whitespace, trailing fences, and unquoted-colon descriptions; cosmetic violations become warnings instead of skipping the skill; affects both predefined and DIAL-prompt-sourced skills #313 (#314)
- Configurable agent file-download size limit — replaces the hardcoded 10 MiB cap in
DialFileServicewithDEFAULT_FILE_LOADING_SIZE_LIMIT(deployment-wide) andfeatures.file_loading.size_limit(per-app override) (#274) - Graduate Time Awareness feature to GA —
features.timestampis no longer gated byENABLE_PREVIEW_FEATURES#288 (#290) - Graduate DIAL Prompt Skills feature to GA — the
skillsconfig field andDialPromptSkillsModuleare no longer gated byENABLE_PREVIEW_FEATURES#289 (#291)
Fixes
- Apply the configured fallback strategy when an MCP tool result carries
IsError: true— previously the error path skipped the fallback and surfaced the raw failure to the model #328 (#329) - Propagate DIAL field-level markers (
dial:resource,dial:file,format) to deprecated legacy-alias properties — manifests stored under a legacy key were validating but DIAL Core's schema-driven auto-share couldn't key off the missing markers, surfacing as403 Forbiddenon referenced resources #311 (#312) - Render Agent skill stage content as a fenced code block and drop the redundant parameters chunk — embedded
#/##headings in skill bodies no longer render as oversized bold text when the stage is expanded #320 (#322) - Enrich synthetic tool results with metadata — synthetic tool messages now flow through the same
ToolCallResultEnricherpipeline as real tool results, so message state (e.g. timestamp) is attached consistently #296 (#297) - Restore OTEL
trace_id/span_id/resource.service.name/trace_sampledin QuickApps logs via a newOtelAwareFormatterthat matchesadapter-openai's wire format when correlation is on and renders nothing otherwise #284 (#285) - Preserve millisecond precision in
TimestampMetadata.response_timestamp— Pydantic's defaultdatetime.isoformat()was dropping fractional digits on whole-second boundaries, leaving downstream consumers (UI, analytics, persistence) with inconsistent sub-second precision #278 (#281) - Align integration test modules after recent refactors (#276)
Other
- Normalize DIAL deployment-id field naming —
DialDeploymentConfig.name→deployment_idandDialMCPToolSet.dial_id→deployment_id; legacy keys keep validating viavalidation_alias, and the published JSON schema retains deprecated siblings under ananyOfso existing manifests stay valid #286 (#287) - Refresh integration coverage for the current model lineup — add Claude 4.6 tests, update Claude 4.5 model name, add ChatHub configs for the new models (#277); remove GPT-4.1 tool cache files and Claude 3.7/4 references (#283) (#294)
- Enhance issue templates and add a
🛠️ Tech debttemplate (#292) - Drop venv-activation hints from
CLAUDE.md—maketargets already run viapoetry run(#272) - Bump
authlibfrom 1.6.11 to 1.6.12 — picks up a fix for redirecting to an unvalidatedredirect_urionInvalidScopeErrorin OIDC implicit/hybrid grants (#299) - Bump
idnafrom 3.11 to 3.15 — picks up CVE-2026-45409 mitigation hardening from 3.14 (#321) - Bump
python-multipartfrom 0.0.26 to 0.0.27 (#280) - Bump
urllib3from 2.6.3 to 2.7.0 (#295)
Deployment Changes
New environment variables
| Variable | Default | Description |
|---|---|---|
DEFAULT_ORCHESTRATOR_DEPLOYMENT_ID |
— | Default DIAL deployment id used as the orchestrator model when a QuickApp manifest omits orchestrator.deployment. Also surfaces as the JSON-schema default for that field so DIAL Core can pre-fill new manifests. Apps can override per-app. |
DEFAULT_FILE_LOADING_SIZE_LIMIT |
10485760 |
Deployment-wide cap (bytes, > 0; default 10 MiB) on files the agent downloads. Overridden per-app by features.file_loading.size_limit in the manifest. |
USE_SYSTEM_CA_CERTS |
unset | When set to 1, merges every *.crt file under /certificates/ with the Alpine system CA bundle at container startup and exports SSL_CERT_FILE to the merged path so outbound HTTP calls trust private/corporate root CAs. Opt-in; unset keeps existing behaviour. |
Behavioral changes
Note
Two preview-gated features have graduated to GA and are now active regardless of ENABLE_PREVIEW_FEATURES:
DIAL Configuration changes
Important
Operators must update DIAL Core's configuration when upgrading to this release. The /v1/configuration-support/* endpoints are no longer served via a global DIAL Core routes entry — they are declared on the QuickApps application type itself.
Required migration (#319):
- Remove any
quick_apps2-style entry from DIAL Core's globalroutesblock (it will be ignored from now on). - Add the new
dial:applicationTypeRoutesblock to the QuickApps entry underapplicationTypeSchemas— apply the schema snippet from PR #319 verbatim.
Schema deprecations
Caution
Still accepted in app manifests, but will be removed in future versions (#287).
| Legacy key | Replacement | Affected config model |
|---|---|---|
name (deployment field) |
deployment_id |
DialDeploymentConfig |
dial_id |
deployment_id |
DialMCPToolSet |
0.8.0-rc.2
Features
- Trust custom corporate root CAs via the new
USE_SYSTEM_CA_CERTSopt-in — merges*.crtfiles mounted under/certificates/with the Alpine system bundle at container startup and exportsSSL_CERT_FILEso outboundhttpxcalls succeed behind TLS-intercepting proxies #335 (#336) - Layered predefined default application configuration for the QuickApps builder — operators ship a
default_configuration.jsonat each predefined content layer (built-in +PREDEFINED_EXTRA_PATHS), shallow-merged in layer order, exposed to the UI via the newGET /v1/configuration-support/default-configurationendpoint withtool_setsresolved server-side #120 (#323)
Deployment Changes
New environment variables
| Variable | Default | Description |
|---|---|---|
USE_SYSTEM_CA_CERTS |
unset | When set to 1, merges every *.crt file under /certificates/ with the Alpine system CA bundle at container startup and exports SSL_CERT_FILE to the merged path so outbound HTTP calls trust private/corporate root CAs. Opt-in; unset keeps existing behaviour. |
0.8.0-rc.1
Features
- [Preview] New DIAL files toolset — exposes
list_files,read_file_lines,search_in_file,write_file,edit_file,delete_file,copy_file,move_fileagainst anagent_home_dir(defaultfiles/{appdata}/); per-app opt-in viafeatures.dial_fileswith optionalenabled_toolsallowlist #256 (#257) - [Preview] Config-driven synthetic tool-call injection (hooks) — declare
(ASSISTANT/tool_calls, TOOL)injections in the app manifest's newhooksarray without writing Python;on_request_startevent withalways/append_if_changedfrequency (#275) - Default orchestrator deployment via the new
DEFAULT_ORCHESTRATOR_DEPLOYMENT_IDenv variable — applied at runtime when an app manifest omitsorchestrator.deployment, and surfaced as the JSON-schemadefaultso DIAL Core can pre-fill new manifests #315 (#316) - Per-app
features.stage_display.level—error/info(default) /debugthresholds for which tool-execution stages surface in the DIAL UI;debugreveals synthetic/system stages for manifest authors; deprecatesdisplay.stage.show = false(still honored atinfowith a warning) #293 (#307) - Pass orchestrator deployment's native configuration tools alongside QuickApps tools — enables Gemini 3+ native function-calling features (e.g. Google Search, code execution) when the orchestrator deployment declares them #104 (#301)
- Type-scoped DIAL Core routes for
/v1/configuration-support/*— co-located with the QuickApps application type viadial:applicationTypeRoutesinstead of a detached global route, anddial:attachmentPathslets DIAL Core enforce ACL on prompt URLs inskills/validaterequest bodies #318 (#319) - Lenient skill frontmatter parsing aligned with the Agent Skills spec — tolerates BOM, CRLF, leading whitespace, trailing fences, and unquoted-colon descriptions; cosmetic violations become warnings instead of skipping the skill; affects both predefined and DIAL-prompt-sourced skills #313 (#314)
Fixes
- Apply the configured fallback strategy when an MCP tool result carries
IsError: true— previously the error path skipped the fallback and surfaced the raw failure to the model #328 (#329) - Propagate DIAL field-level markers (
dial:resource,dial:file,format) to deprecated legacy-alias properties — manifests stored under a legacy key were validating but DIAL Core's schema-driven auto-share couldn't key off the missing markers, surfacing as403 Forbiddenon referenced resources #311 (#312) - Render Agent skill stage content as a fenced code block and drop the redundant parameters chunk — embedded
#/##headings in skill bodies no longer render as oversized bold text when the stage is expanded #320 (#322)
Other
- Bump
authlibfrom 1.6.11 to 1.6.12 — picks up a fix for redirecting to an unvalidatedredirect_urionInvalidScopeErrorin OIDC implicit/hybrid grants (#299) - Bump
idnafrom 3.11 to 3.15 — picks up CVE-2026-45409 mitigation hardening from 3.14 (#321)
Deployment Changes
New environment variables
| Variable | Default | Description |
|---|---|---|
DEFAULT_ORCHESTRATOR_DEPLOYMENT_ID |
— | Default DIAL deployment id used as the orchestrator model when a QuickApp manifest omits orchestrator.deployment. Also surfaces as the JSON-schema default for that field so DIAL Core can pre-fill new manifests. Apps can override per-app. |
DIAL Configuration changes
Important
Operators must update DIAL Core's configuration when upgrading to this release. The /v1/configuration-support/* endpoints are no longer served via a global DIAL Core routes entry — they are declared on the QuickApps application type itself.
Required migration (#319):
- Remove any
quick_apps2-style entry from DIAL Core's globalroutesblock (it will be ignored from now on). - Add the new
dial:applicationTypeRoutesblock to the QuickApps entry underapplicationTypeSchemas— apply the schema snippet from PR #319 verbatim.
0.8.0-rc.0
Features
- New
dial-apptoolset — given a DIAL deployment id, routes transparently to either MCP (when the deployment advertisesfeatures.mcp == true) or chat completion (otherwise); atransport: "auto" | "mcp" | "chat-completion"field (default"auto") lets admins pin the choice #215 (#243) - Per-app overrides for predefined tool and toolset templates via a new optional
overridefield carrying a JSON Merge Patch (RFC 7396) — ChatHub variants can swap a deployment, tweak a tool description, or disable a single tool per-app without forking templates globally or duplicating inline JSON #14 #273 (#269) - Generic synthetic tool-call injector (v2) — replaces the bespoke read-files plumbing with a reusable mechanism for injecting synthetic tool calls into message history #235 (#255)
- Configurable agent file-download size limit — replaces the hardcoded 10 MiB cap in
DialFileServicewithDEFAULT_FILE_LOADING_SIZE_LIMIT(deployment-wide) andfeatures.file_loading.size_limit(per-app override) (#274) - Graduate Time Awareness feature to GA —
features.timestampis no longer gated byENABLE_PREVIEW_FEATURES#288 (#290) - Graduate DIAL Prompt Skills feature to GA — the
skillsconfig field andDialPromptSkillsModuleare no longer gated byENABLE_PREVIEW_FEATURES#289 (#291)
Fixes
- Enrich synthetic tool results with metadata — synthetic tool messages now flow through the same
ToolCallResultEnricherpipeline as real tool results, so message state (e.g. timestamp) is attached consistently #296 (#297) - Restore OTEL
trace_id/span_id/resource.service.name/trace_sampledin QuickApps logs via a newOtelAwareFormatterthat matchesadapter-openai's wire format when correlation is on and renders nothing otherwise #284 (#285) - Preserve millisecond precision in
TimestampMetadata.response_timestamp— Pydantic's defaultdatetime.isoformat()was dropping fractional digits on whole-second boundaries, leaving downstream consumers (UI, analytics, persistence) with inconsistent sub-second precision #278 (#281) - Align integration test modules after recent refactors (#276)
Other
- Normalize DIAL deployment-id field naming —
DialDeploymentConfig.name→deployment_idandDialMCPToolSet.dial_id→deployment_id; legacy keys keep validating viavalidation_alias, and the published JSON schema retains deprecated siblings under ananyOfso existing manifests stay valid #286 (#287) - Refresh integration coverage for the current model lineup — add Claude 4.6 tests, update Claude 4.5 model name, add ChatHub configs for the new models (#277); remove GPT-4.1 tool cache files and Claude 3.7/4 references #283 (#294)
- Enhance issue templates and add a
🛠️ Tech debttemplate (#292) - Drop venv-activation hints from
CLAUDE.md—maketargets already run viapoetry run(#272) - Bump
python-multipartfrom 0.0.26 to 0.0.27 (#280) - Bump
urllib3from 2.6.3 to 2.7.0 (#295)
Schema deprecations
Caution
Still accepted in app manifests, but will be removed in future versions (#287).
| Legacy key | Replacement | Affected config model |
|---|---|---|
name (deployment field) |
deployment_id |
DialDeploymentConfig |
dial_id |
deployment_id |
DialMCPToolSet |
Deployment Changes
New environment variables
| Variable | Default | Description |
|---|---|---|
DEFAULT_FILE_LOADING_SIZE_LIMIT |
10485760 |
Deployment-wide cap (bytes, > 0; default 10 MiB) on files the agent downloads. Overridden per-app by features.file_loading.size_limit in the manifest. |