Configure the document actions shown in the Action dropdown in Chat and Workflow. These controls live in the Agents and Actions tab, but remain separate from the global agent and custom action cards below.
+
+ Chat: 2-300 | Workflow: 2-1000
+
+
+ Use these settings to explicitly allow Analyze and Document Comparison in the Chat and Workflow Action dropdowns without bundling them into the global agent or custom action configuration cards below.
+
+ Configure custom actions and tools to extend functionality with integrations and specialized capabilities.
+
+
+ {% if not settings.enable_semantic_kernel %}
+
+ Actions are not available while agents are disabled. Enable agents above to configure actions.
+
+ {% else %}
+
+
+
Global Actions
+
+
+
Disable a global action to keep the configuration without exposing it to runtime action loading until it is re-enabled.
+ {% if settings.per_user_semantic_kernel %}
+
+
+
Workspace Action Feature Toggles
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {% endif %}
+
+
+
+
Core Action Toggles
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Tabular Processing Action
+
+
+ Automatically enabled when Enhanced Citations is enabled
+
+
+
+
+
+
Display Name
+
Description
+
Actions
+
+
+
+
+
+ {% endif %}
+
+
diff --git a/application/single_app/templates/admin/_panes/agents.html b/application/single_app/templates/admin/_panes/agents.html
index 622dde43d..889caa9cc 100644
--- a/application/single_app/templates/admin/_panes/agents.html
+++ b/application/single_app/templates/admin/_panes/agents.html
@@ -23,112 +23,6 @@
{% set analyze_capability = settings.document_action_capabilities.analyze %}
{% set comparison_capability = settings.document_action_capabilities.comparison %}
-
-
-
-
Document Action Capabilities
-
Configure the document actions shown in the Action dropdown in Chat and Workflow. These controls live in the Agents and Actions tab, but remain separate from the global agent and custom action cards below.
-
- Chat: 2-300 | Workflow: 2-1000
-
-
- Use these settings to explicitly allow Analyze and Document Comparison in the Chat and Workflow Action dropdowns without bundling them into the global agent or custom action configuration cards below.
-
- Configure custom actions and tools to extend functionality with integrations and specialized capabilities.
-
-
- {% if not settings.enable_semantic_kernel %}
-
- Actions are not available while agents are disabled. Enable agents above to configure actions.
-
- {% else %}
-
-
-
Global Actions
-
-
-
Disable a global action to keep the configuration without exposing it to runtime action loading until it is re-enabled.
- {% if settings.per_user_semantic_kernel %}
-
-
-
Workspace Action Feature Toggles
-
-
-
-
-
-
-
-
-
-
-
-
-
- {% endif %}
-
-
-
-
Core Action Toggles
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Tabular Processing Action
-
-
- Automatically enabled when Enhanced Citations is enabled
-
-
-
-
-
-
Display Name
-
Description
-
Actions
-
-
-
-
-
- {% endif %}
-
- {% if mcp_ui_enabled %}
-
-
-
-
- Inbound MCP Server
-
-
- Configure the governed SimpleChat MCP endpoint used by external MCP clients. Personal tools use delegated user tokens by default; tool access remains deny-by-default until authentication, source, client, and governance policy all allow the request.
-
-
-
- Preview
-
-
-
-
-
- Enable only after the Microsoft Entra delegated scope, delegated user app role, client app allowlist, source allowlist, and SimpleChat governance item policies are configured. Personal MCP tools require delegated user context plus an assigned user role. The app-only role is reserved for future non-personal service/admin tools.
-
-
-
-
-
-
Runtime Gate
-
-
-
-
-
-
-
-
-
Default: DelegatedMcpServerAccess. VS Code and other user clients must present this delegated scope.
-
-
-
-
-
Default: InboundMCPUserAccess. Governance determines which users/groups can use tools after this Entra role and delegated scope pass.
-
-
-
-
-
Default: InboundMCPAppAccess. Reserved for future app-only MCP tools and still governed separately.
-
-
-
-
-
-
-
Endpoint Contract
-
-
MCP endpoint
-
{{ inbound_mcp_resource_path }}
-
Protected resource metadata
-
{{ inbound_mcp_prm_path }}
-
Transport
-
Streamable HTTP JSON-RPC
-
Current tool surface
-
Personal delegated tools only.
-
Tool identity
-
Delegated user token required for personal data.
-
-
- Endpoint paths are fixed in application routing for this initial UI slice. Change the app setting below for the source header only.
-
-
-
-
-
-
-
-
-
Request Size & Throttling
-
Protect the inbound MCP endpoint from oversized payloads and noisy clients. Rate limits are enforced per caller and tool category across app instances.
-
-
-
-
-
-
-
-
-
-
-
Default: 65536. Range: 1 KB to 1 MB.
-
-
-
-
-
Default: 60. Applies to each throttle category.
-
-
-
-
-
Default: 120.
-
-
-
-
-
Default: 30.
-
-
-
-
-
Default: 10.
-
-
-
- Application Insights events include mcp_request_id, caller app, delegated user, source, tool, duration, result status, and rate-limit category without recording prompts, document content, bearer tokens, or secrets.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Allowed client app IDs
-
Required allowlist. Empty means no MCP clients can connect.
-
-
-
-
-
-
-
-
Client app ID
-
Description
-
Actions
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Off allows only the configured SimpleChat tenant. Turning this on auto-includes the SimpleChat tenant and lets admins add more tenants.
-
-
-
-
Allowed tenant IDs
-
-
-
-
-
-
-
Tenant ID
-
Description
-
Actions
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Default on accepts any source signal at the runtime allowlist layer. Turn off to require explicit source values here. In both modes, admins must still create an inbound MCP source governance policy before tools are returned.
-
-
-
-
-
Default: X-SimpleChat-MCP-Source.
-
-
- Source IDs are read from the configured header when present. This is a client-provided value and can be spoofed unless a trusted gateway, APIM policy, or similar control sets/enforces it.
-
-
-
-
- Create an inbound_mcp_source policy for * to choose which users or groups can use inbound MCP from any accepted source.
-
-
-
-
-
-
-
- After adding allowed source IDs, create an inbound_mcp_source policy for * or a specific source to choose which users or groups can use inbound MCP.
-
-
-
-
-
-
-
Allowed source IDs
-
-
-
-
-
-
-
Source value
-
Description
-
Actions
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Add MCP Entry
-
-
-
-
-
-
-
-
-
Value is required.
-
-
-
-
-
Use descriptions to explain who owns this app, tenant, or source value without making the value easy to guess.
-
-
-
-
-
-
-
-
-
-
-
Inbound MCP overview
-
-
-
-
- SimpleChat exposes a governed Streamable HTTP MCP endpoint for approved external MCP clients. Authentication handles tenant, client, delegated scope, and Entra role checks; governance decides which users/groups and source IDs can use tools.
-
-
-
-
Runtime checks
-
-
Client app ID must be in the allowed client list.
-
Tenant must be the SimpleChat tenant unless additional tenants are enabled.
-
Delegated personal tools require the configured scope and user role.
-
Governance uses inbound_mcp_source policies to decide which users or groups can use each accepted source.
-
-
-
-
Source header guidance
-
- The configured source header is an advisory control-plane signal. Treat it like an APIM subscription-key label, not strong identity. For stronger assurance, set or overwrite it at a trusted gateway and avoid relying on client-provided values alone.
-
-
-
-
Available MCP tools
-
-
-
-
-
Tool
-
Scope
-
Operation
-
Description
-
-
-
- {% for tool in inbound_mcp_tools %}
-
-
-
{{ tool.display_name }}
- {{ tool.id }}
-
-
{{ tool.scope }}
-
{{ tool.resource_family }} / {{ tool.operation }}
-
{{ tool.description }}
-
- {% endfor %}
-
-
-
-
-
Application Insights starter queries
-
- Use these KQL queries in Application Insights Logs to validate inbound MCP traffic, denials, and tool latency. They rely on safe structured dimensions emitted by the inbound MCP route and do not require prompt, message, document, token, or secret values.
-
-
-
-
-
-
-
-
-
-
traces
-| where timestamp > ago(24h)
-| where message has "[InboundMCP]"
-| summarize requests=count(), failures=countif(tostring(customDimensions.result_status) !in ("", "success", "accepted")) by bin(timestamp, 1h)
-| order by timestamp desc
-
-
-
-
-
-
-
-
-
-
-
traces
-| where timestamp > ago(24h)
-| where message has "[InboundMCP]"
-| where isnotempty(tostring(customDimensions.error_type))
-| summarize events=count() by tostring(customDimensions.error_type), tostring(customDimensions.caller_app_id), tostring(customDimensions.source_id)
-| order by events desc
-
-
-
-
-
-
-
-
-
-
-
traces
-| where timestamp > ago(24h)
-| where message has "Inbound MCP tool call"
-| where isnotempty(tostring(customDimensions.tool_id))
-| summarize calls=count(), avg_duration_ms=avg(todouble(customDimensions.duration_ms)), p95_duration_ms=percentile(todouble(customDimensions.duration_ms), 95) by tostring(customDimensions.tool_id), tostring(customDimensions.result_status)
-| order by calls desc
-
-
-
-
-
-
-
-
-
-
-
traces
-| where timestamp > ago(24h)
-| where message has "Inbound MCP tool call denied by rate limit"
-| summarize denials=count() by tostring(customDimensions.rate_limit_category), tostring(customDimensions.tool_id), tostring(customDimensions.caller_app_id)
-| order by denials desc
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Verify App Service Authentication exclusions
-
-
-
-
- Required before enabling inbound MCP:
- If Azure App Service Authentication redirects unauthenticated requests, add excluded paths so MCP clients can discover protected resource metadata and so SimpleChat can enforce bearer-token MCP access itself.
-
-
- Run the following PowerShell with Azure CLI from Azure Cloud Shell or any authenticated terminal. SimpleChat pre-fills the script from this App Service's environment when possible.
-
Attempts to verify that the SimpleChat API app exposes the required delegated scope and inbound MCP app roles.
-
Uses SimpleChat's Resource Manager endpoint for public, government, or custom clouds.
-
Creates a timestamped backup of current authsettingsV2 before applying changes.
-
-
-
-
- {% if inbound_mcp_easy_auth_script_context.missing_values %}
-
- SimpleChat could not derive every required value. Replace the placeholders in the script before running it:
- {{ inbound_mcp_easy_auth_script_context.missing_values | join(", ") }}.
-
- {% endif %}
- {% if inbound_mcp_easy_auth_script_context.scope_check_missing_values %}
-
- SimpleChat could not derive every value needed for the delegated-scope and role preflight. Replace these placeholders if you want the script to validate the app registration before changing Easy Auth:
- {{ inbound_mcp_easy_auth_script_context.scope_check_missing_values | join(", ") }}.
-
- {% endif %}
- {% if inbound_mcp_easy_auth_script_context.uses_custom_cloud_match %}
-
- This deployment uses a custom Azure environment. The script searches your registered Azure CLI clouds for one with the same Resource Manager endpoint. If none is registered, register the custom cloud first and rerun the script.
-
- {% endif %}
-
-
-
{{ inbound_mcp_easy_auth_script }}
-
-
- The verification checks these public unauthenticated endpoints and expects SimpleChat JSON responses, not Microsoft sign-in HTML:
-
-
-
\ No newline at end of file
diff --git a/application/single_app/templates/admin/_panes/classification.html b/application/single_app/templates/admin/_panes/classification.html
index 425eeedcf..8a4dc6e11 100644
--- a/application/single_app/templates/admin/_panes/classification.html
+++ b/application/single_app/templates/admin/_panes/classification.html
@@ -42,6 +42,4 @@
Classification Categories
-
-
\ No newline at end of file
diff --git a/application/single_app/templates/admin/_panes/cosmos.html b/application/single_app/templates/admin/_panes/cosmos.html
index 33cf6b0f3..6163be982 100644
--- a/application/single_app/templates/admin/_panes/cosmos.html
+++ b/application/single_app/templates/admin/_panes/cosmos.html
@@ -1138,6 +1138,4 @@
diff --git a/application/single_app/templates/admin/_panes/inbound-mcp.html b/application/single_app/templates/admin/_panes/inbound-mcp.html
new file mode 100644
index 000000000..3676ea641
--- /dev/null
+++ b/application/single_app/templates/admin/_panes/inbound-mcp.html
@@ -0,0 +1,535 @@
+
+ {% if mcp_ui_enabled %}
+
+
+
+
+ Inbound MCP Server
+
+
+ Configure the governed SimpleChat MCP endpoint used by external MCP clients. Personal tools use delegated user tokens by default; tool access remains deny-by-default until authentication, source, client, and governance policy all allow the request.
+
+
+
+ Preview
+
+
+
+
+
+ Enable only after the Microsoft Entra delegated scope, delegated user app role, client app allowlist, source allowlist, and SimpleChat governance item policies are configured. Personal MCP tools require delegated user context plus an assigned user role. The app-only role is reserved for future non-personal service/admin tools.
+
+
+
+
+
+
Runtime Gate
+
+
+
+
+
+
+
+
+
Default: DelegatedMcpServerAccess. VS Code and other user clients must present this delegated scope.
+
+
+
+
+
Default: InboundMCPUserAccess. Governance determines which users/groups can use tools after this Entra role and delegated scope pass.
+
+
+
+
+
Default: InboundMCPAppAccess. Reserved for future app-only MCP tools and still governed separately.
+
+
+
+
+
+
+
Endpoint Contract
+
+
MCP endpoint
+
{{ inbound_mcp_resource_path }}
+
Protected resource metadata
+
{{ inbound_mcp_prm_path }}
+
Transport
+
Streamable HTTP JSON-RPC
+
Current tool surface
+
Personal delegated tools only.
+
Tool identity
+
Delegated user token required for personal data.
+
+
+ Endpoint paths are fixed in application routing for this initial UI slice. Change the app setting below for the source header only.
+
+
+
+
+
+
+
+
+
Request Size & Throttling
+
Protect the inbound MCP endpoint from oversized payloads and noisy clients. Rate limits are enforced per caller and tool category across app instances.
+
+
+
+
+
+
+
+
+
+
+
Default: 65536. Range: 1 KB to 1 MB.
+
+
+
+
+
Default: 60. Applies to each throttle category.
+
+
+
+
+
Default: 120.
+
+
+
+
+
Default: 30.
+
+
+
+
+
Default: 10.
+
+
+
+ Application Insights events include mcp_request_id, caller app, delegated user, source, tool, duration, result status, and rate-limit category without recording prompts, document content, bearer tokens, or secrets.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Allowed client app IDs
+
Required allowlist. Empty means no MCP clients can connect.
+
+
+
+
+
+
+
+
Client app ID
+
Description
+
Actions
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Off allows only the configured SimpleChat tenant. Turning this on auto-includes the SimpleChat tenant and lets admins add more tenants.
+
+
+
+
Allowed tenant IDs
+
+
+
+
+
+
+
Tenant ID
+
Description
+
Actions
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Default on accepts any source signal at the runtime allowlist layer. Turn off to require explicit source values here. In both modes, admins must still create an inbound MCP source governance policy before tools are returned.
+
+
+
+
+
Default: X-SimpleChat-MCP-Source.
+
+
+ Source IDs are read from the configured header when present. This is a client-provided value and can be spoofed unless a trusted gateway, APIM policy, or similar control sets/enforces it.
+
+
+
+
+ Create an inbound_mcp_source policy for * to choose which users or groups can use inbound MCP from any accepted source.
+
+
+
+
+
+
+
+ After adding allowed source IDs, create an inbound_mcp_source policy for * or a specific source to choose which users or groups can use inbound MCP.
+
+
+
+
+
+
+
Allowed source IDs
+
+
+
+
+
+
+
Source value
+
Description
+
Actions
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Add MCP Entry
+
+
+
+
+
+
+
+
+
Value is required.
+
+
+
+
+
Use descriptions to explain who owns this app, tenant, or source value without making the value easy to guess.
+
+
+
+
+
+
+
+
+
+
+
Inbound MCP overview
+
+
+
+
+ SimpleChat exposes a governed Streamable HTTP MCP endpoint for approved external MCP clients. Authentication handles tenant, client, delegated scope, and Entra role checks; governance decides which users/groups and source IDs can use tools.
+
+
+
+
Runtime checks
+
+
Client app ID must be in the allowed client list.
+
Tenant must be the SimpleChat tenant unless additional tenants are enabled.
+
Delegated personal tools require the configured scope and user role.
+
Governance uses inbound_mcp_source policies to decide which users or groups can use each accepted source.
+
+
+
+
Source header guidance
+
+ The configured source header is an advisory control-plane signal. Treat it like an APIM subscription-key label, not strong identity. For stronger assurance, set or overwrite it at a trusted gateway and avoid relying on client-provided values alone.
+
+
+
+
Available MCP tools
+
+
+
+
+
Tool
+
Scope
+
Operation
+
Description
+
+
+
+ {% for tool in inbound_mcp_tools %}
+
+
+
{{ tool.display_name }}
+ {{ tool.id }}
+
+
{{ tool.scope }}
+
{{ tool.resource_family }} / {{ tool.operation }}
+
{{ tool.description }}
+
+ {% endfor %}
+
+
+
+
+
Application Insights starter queries
+
+ Use these KQL queries in Application Insights Logs to validate inbound MCP traffic, denials, and tool latency. They rely on safe structured dimensions emitted by the inbound MCP route and do not require prompt, message, document, token, or secret values.
+
+
+
+
+
+
+
+
+
+
traces
+| where timestamp > ago(24h)
+| where message has "[InboundMCP]"
+| summarize requests=count(), failures=countif(tostring(customDimensions.result_status) !in ("", "success", "accepted")) by bin(timestamp, 1h)
+| order by timestamp desc
+
+
+
+
+
+
+
+
+
+
+
traces
+| where timestamp > ago(24h)
+| where message has "[InboundMCP]"
+| where isnotempty(tostring(customDimensions.error_type))
+| summarize events=count() by tostring(customDimensions.error_type), tostring(customDimensions.caller_app_id), tostring(customDimensions.source_id)
+| order by events desc
+
+
+
+
+
+
+
+
+
+
+
traces
+| where timestamp > ago(24h)
+| where message has "Inbound MCP tool call"
+| where isnotempty(tostring(customDimensions.tool_id))
+| summarize calls=count(), avg_duration_ms=avg(todouble(customDimensions.duration_ms)), p95_duration_ms=percentile(todouble(customDimensions.duration_ms), 95) by tostring(customDimensions.tool_id), tostring(customDimensions.result_status)
+| order by calls desc
+
+
+
+
+
+
+
+
+
+
+
traces
+| where timestamp > ago(24h)
+| where message has "Inbound MCP tool call denied by rate limit"
+| summarize denials=count() by tostring(customDimensions.rate_limit_category), tostring(customDimensions.tool_id), tostring(customDimensions.caller_app_id)
+| order by denials desc
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Verify App Service Authentication exclusions
+
+
+
+
+ Required before enabling inbound MCP:
+ If Azure App Service Authentication redirects unauthenticated requests, add excluded paths so MCP clients can discover protected resource metadata and so SimpleChat can enforce bearer-token MCP access itself.
+
+
+ Run the following PowerShell with Azure CLI from Azure Cloud Shell or any authenticated terminal. SimpleChat pre-fills the script from this App Service's environment when possible.
+
Attempts to verify that the SimpleChat API app exposes the required delegated scope and inbound MCP app roles.
+
Uses SimpleChat's Resource Manager endpoint for public, government, or custom clouds.
+
Creates a timestamped backup of current authsettingsV2 before applying changes.
+
+
+
+
+ {% if inbound_mcp_easy_auth_script_context.missing_values %}
+
+ SimpleChat could not derive every required value. Replace the placeholders in the script before running it:
+ {{ inbound_mcp_easy_auth_script_context.missing_values | join(", ") }}.
+
+ {% endif %}
+ {% if inbound_mcp_easy_auth_script_context.scope_check_missing_values %}
+
+ SimpleChat could not derive every value needed for the delegated-scope and role preflight. Replace these placeholders if you want the script to validate the app registration before changing Easy Auth:
+ {{ inbound_mcp_easy_auth_script_context.scope_check_missing_values | join(", ") }}.
+
+ {% endif %}
+ {% if inbound_mcp_easy_auth_script_context.uses_custom_cloud_match %}
+
+ This deployment uses a custom Azure environment. The script searches your registered Azure CLI clouds for one with the same Resource Manager endpoint. If none is registered, register the custom cloud first and rerun the script.
+
+ {% endif %}
+
+
+
{{ inbound_mcp_easy_auth_script }}
+
+
+ The verification checks these public unauthenticated endpoints and expects SimpleChat JSON responses, not Microsoft sign-in HTML:
+
+
/.well-known/oauth-protected-resource
+
/.well-known/oauth-protected-resource/api/mcp
+
/.well-known/oauth-protected-resource/mcp
+
/.well-known/oauth-authorization-server
+
/api/mcp
+
/api/mcp/health
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {% endif %}
+
diff --git a/application/single_app/templates/admin/_panes/ai-models.html b/application/single_app/templates/admin/_panes/model-endpoints.html
similarity index 53%
rename from application/single_app/templates/admin/_panes/ai-models.html
rename to application/single_app/templates/admin/_panes/model-endpoints.html
index 98e6590d4..5c9683ad4 100644
--- a/application/single_app/templates/admin/_panes/ai-models.html
+++ b/application/single_app/templates/admin/_panes/model-endpoints.html
@@ -1,4 +1,4 @@
-
+
Configure all AI model settings including GPT for text generation, embeddings for semantic search, and image generation capabilities.
@@ -235,396 +235,6 @@
Global Endpoints
{% endif %}
-
-
-
- Embeddings Configuration
-
-
- Configure your embeddings settings. These are used for semantic search, knowledge-base lookups, etc.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Save pending changes to settings before clicking Fetch Embedding Models
-
-
-
-
-
-
-
-
-
- Fetch Models lists deployments through the Azure management plane. Test Connection, chat generation, file uploads, embedding generation, and image generation call the Azure OpenAI data plane. These paths can use different credentials and require different roles.
-
-
-
Credential purpose
-
-
-
-
-
Action
-
Plane
-
Credential used
-
Role or secret
-
-
-
-
-
Legacy GPT, embedding, or image Fetch Models
-
Management plane
-
The SimpleChat app registration or service principal, such as the -ar Entra application created for the deployment.
-
Cognitive Services User on the Azure OpenAI resource, or an equivalent role that can read deployments.
-
-
-
Global endpoint modal Fetch Models
-
Management plane
-
The endpoint modal identity selected for discovery, such as managed identity or service principal.
-
Cognitive Services User on the Azure OpenAI resource, or an equivalent role that can read deployments.
-
-
-
GPT, embedding, or image generation with Key authentication selected
-
Data plane
-
The Azure OpenAI key saved in this settings section.
-
Azure OpenAI resource key from Keys and Endpoint.
-
-
-
GPT, embedding, or image generation with Managed Identity selected
-
Data plane
-
The App Service managed identity, such as the -app managed identity.
-
Cognitive Services OpenAI User on the Azure OpenAI resource.
-
-
-
-
-
-
Where to get values
-
-
Open the Azure OpenAI resource in the Azure portal.
-
Copy the endpoint from Resource Management > Keys and Endpoint.
-
If using Key authentication for runtime calls, copy Key 1 or Key 2 from the same page.
-
Copy the subscription ID and resource group from the resource Overview page. These are required for Fetch Models.
-
If using APIM, use the APIM endpoint, deployment path or name, API version, and APIM subscription key instead of the direct Azure OpenAI key.
-
-
-
Recommended setup
-
-
For key-backed legacy GPT, embeddings, or image generation, grant the SimpleChat service principal the management-plane role so admins can fetch model deployments, then store the Azure OpenAI key for data-plane generation.
-
For managed identity runtime, grant the App Service managed identity Cognitive Services OpenAI User for data-plane generation. If the same managed identity should also fetch deployments, grant it the management-plane discovery role too.
-
Fetch only discovers deployment names and model metadata. It does not prove that embedding or image generation inference will succeed; use Test Embedding Connection or Test Image Connection after selecting a deployment.
Default Retention PoliciesImportant: Deleted items respect your archiving settings. If conversation archiving is enabled, items will be archived before deletion. Activity logs are created for all deletions.
-
-
\ No newline at end of file
diff --git a/application/single_app/templates/admin_settings.html b/application/single_app/templates/admin_settings.html
index 0d1d9e4b1..a34e450cf 100644
--- a/application/single_app/templates/admin_settings.html
+++ b/application/single_app/templates/admin_settings.html
@@ -953,6 +953,9 @@
12. Enhanced Citations and Image Generation
{% set group_is_first = loop.first %}
{% for admin_tab in admin_group.tabs %}
{% set is_default_tab = group_is_first and loop.first %}
+ {% if not admin_tab.condition
+ or (admin_tab.condition == 'enable_agent_template_gallery' and app_settings.enable_agent_template_gallery)
+ or (admin_tab.condition == 'mcp_ui_enabled' and mcp_ui_enabled) %}
12. Enhanced Citations and Image Generation
{% endif %}
{% include "admin/_panes/agents.html" %}
+ {% include "admin/_panes/actions.html" %}
+ {% include "admin/_panes/inbound-mcp.html" %}
@@ -1003,7 +1009,9 @@
12. Enhanced Citations and Image Generation
{% include "admin/_panes/custom-pages.html" %}
- {% include "admin/_panes/ai-models.html" %}
+ {% include "admin/_panes/model-endpoints.html" %}
+ {% include "admin/_panes/embeddings.html" %}
+ {% include "admin/_panes/image-generation.html" %}
{% include "admin/_panes/control-center-config.html" %}
@@ -1088,6 +1096,83 @@
Confirm permanen
Save Settings
+
+
+
+
+
+
Azure OpenAI Model Setup Guide
+
+
+
+
+ Fetch Models lists deployments through the Azure management plane. Test Connection, chat generation, file uploads, embedding generation, and image generation call the Azure OpenAI data plane. These paths can use different credentials and require different roles.
+
+
+
Credential purpose
+
+
+
+
+
Action
+
Plane
+
Credential used
+
Role or secret
+
+
+
+
+
Legacy GPT, embedding, or image Fetch Models
+
Management plane
+
The SimpleChat app registration or service principal, such as the -ar Entra application created for the deployment.
+
Cognitive Services User on the Azure OpenAI resource, or an equivalent role that can read deployments.
+
+
+
Global endpoint modal Fetch Models
+
Management plane
+
The endpoint modal identity selected for discovery, such as managed identity or service principal.
+
Cognitive Services User on the Azure OpenAI resource, or an equivalent role that can read deployments.
+
+
+
GPT, embedding, or image generation with Key authentication selected
+
Data plane
+
The Azure OpenAI key saved in this settings section.
+
Azure OpenAI resource key from Keys and Endpoint.
+
+
+
GPT, embedding, or image generation with Managed Identity selected
+
Data plane
+
The App Service managed identity, such as the -app managed identity.
+
Cognitive Services OpenAI User on the Azure OpenAI resource.
+
+
+
+
+
+
Where to get values
+
+
Open the Azure OpenAI resource in the Azure portal.
+
Copy the endpoint from Resource Management > Keys and Endpoint.
+
If using Key authentication for runtime calls, copy Key 1 or Key 2 from the same page.
+
Copy the subscription ID and resource group from the resource Overview page. These are required for Fetch Models.
+
If using APIM, use the APIM endpoint, deployment path or name, API version, and APIM subscription key instead of the direct Azure OpenAI key.
+
+
+
Recommended setup
+
+
For key-backed legacy GPT, embeddings, or image generation, grant the SimpleChat service principal the management-plane role so admins can fetch model deployments, then store the Azure OpenAI key for data-plane generation.
+
For managed identity runtime, grant the App Service managed identity Cognitive Services OpenAI User for data-plane generation. If the same managed identity should also fetch deployments, grant it the management-plane discovery role too.
+
Fetch only discovers deployment names and model metadata. It does not prove that embedding or image generation inference will succeed; use Test Embedding Connection or Test Image Connection after selecting a deployment.
+
+
+
+
+
+
+
diff --git a/docs/explanation/features/ADMIN_SETTINGS_IA_REWORK_STATUS.md b/docs/explanation/features/ADMIN_SETTINGS_IA_REWORK_STATUS.md
index 8fd27d02d..1426a3870 100644
--- a/docs/explanation/features/ADMIN_SETTINGS_IA_REWORK_STATUS.md
+++ b/docs/explanation/features/ADMIN_SETTINGS_IA_REWORK_STATUS.md
@@ -22,8 +22,8 @@ Development ─── feature/admin-settings-ia ──┬── #1297 stage 1
└──► final PR ──► Development
```
-Current version: **0.260.014**. Fingerprint: **462 field names / 110 card ids**.
-Navigation: **14 groups / 36 tabs / 88 sections**.
+Current version: **0.260.015**. Fingerprint: **462 field names / 110 card ids**.
+Navigation: **14 groups / 40 tabs / 88 sections**.
### Shipped
@@ -116,6 +116,12 @@ moved from Scale to Security that way.
| Knowledge | **Search & Extract dismantled.** → Web & Research, Search Index, Document Extraction (+ metadata extraction and multi-modal vision from Workspaces), Audio & Video |
| Workspaces | → Workspace Types, Files & Sharing (+ shared conversation file approvals from AI Models), Global Identities |
| Workflow | **New group**, split out of Workspaces |
+| AI Models | → Model Endpoints (carries the legacy modal and its nested Chat Model card), Embeddings, Image Generation |
+| Agents & Actions | → Agents, Actions, Inbound MCP (whole tab behind `mcp_ui_enabled`) |
+
+**Only Backup & Recovery is left**, and it is the hardest: complication I4, a
+~985-line migration workflow that must split across Backup / Migrate / Restore
+/ Jobs as one unit.
### Card container ids are not the nav section ids
@@ -137,9 +143,34 @@ Run `list_pane_cards.py` for the real container id rather than assuming.
### Trap: gpt-configuration is inside a modal
`gpt-configuration` is **not** a top-level card. It lives inside
-`legacyModelSettingsModal` in the AI Models pane. Splitting AI Models means
-moving a modal, not a card, which is why AI Models and Agents are deliberately
-left for their own change rather than bundled with Knowledge and Workspaces.
+`legacyModelSettingsModal` in the AI Models pane.
+
+**How this was resolved.** The modal was relocated to sit directly after
+`multi-endpoint-configuration`, the card holding its trigger. The split then
+assigned `multi-endpoint-configuration, gpt-configuration` to the same tab, so
+the modal's opening lines, the nested card and the closing lines all landed in
+`model-endpoints.html` in order and the modal reassembled intact.
+
+### Three more splitting rules learned
+
+- **A modal shared by cards that end up in different tabs must go to the
+ shell.** `legacyModelDiscoveryIdentityGuideModal` is opened from endpoints,
+ embeddings and image generation. Check for form fields first: a modal with a
+ `name=` attribute cannot move outside the `