Hosted-agent integration matrix
This page records the exact hosted-agent component releases pinned by the GPT-RAG umbrella integration on 2026-08-07 and the independent evidence gates that remain fail closed.
Pins are integrated; runtime validation and release remain blocked
The umbrella manifest.json pins all four exact releases below and explicit
hosted-panel topology selection is supported. The manifest's umbrella tag
remains unreleased; use only a GPT-RAG source or release that contains
these pins rather than combining component tags independently.
HOSTED_CONTINUITY_ENABLED, PANEL_HISTORY_ENABLED,
PANEL_HISTORY_OWNER_BINDING_VALIDATED, and
PANEL_OPERATOR_SURFACES_ENABLED remain deployment-published false.
This documentation does not claim that their separate live evidence and
authorization procedures have completed. A prior validation attempt saw
the hosted agent version become active while session readiness returned
HTTP 424; that crash was root-caused to a gpt-rag-orchestrator circular
import and fixed in
orchestrator v4.0.1
(pinned below). Fixing that crash is a code-level correction, not a
substitute for the network-isolated live validation matrix below, which
has not yet been re-run. Treat the matrix as implemented and
crash-fixed configuration, not as a validated or shipped umbrella
release.
Exact integrated matrix
| Component | Release | Reviewed release commit | Relevant contract |
|---|---|---|---|
| GPT-RAG UI | v2.6.0 |
81d6515 |
Hosted/no-panel is the fresh UI default when CHAT_BACKEND is absent; continuity and panel surfaces remain opt-in and fail closed. |
| GPT-RAG orchestrator | v4.0.1 |
7e22840 |
Canonical hosted /responses is stateless and requires caller-supplied ordered input. Fixes the dependencies/connectors circular import that crashed the hosted entrypoint on startup (PR #311). |
| GPT-RAG ingestion | v2.7.0 |
84b9277 |
Metadata-only operator overview and document/corpus curation APIs. |
| AI Landing Zone | v2.5.1 |
9cc5859 |
Two-phase hosted-agent prerequisite/handoff support; both hosted flags default to false. Also allows the Foundry Agent Service's agent365.svc.cloud.microsoft observability endpoint through Azure Firewall under network isolation (v2.5.1, patch). |
The matrix implements the component portions of ADR-0003 and ADR-0004. It completes their coordinated pin and topology-composition step. It does not close their independent live evidence and authorization gates.
Modes and defaults
| Surface | Current behavior |
|---|---|
| Umbrella integration manifest | Pins the exact matrix above; its umbrella tag remains unreleased until release engineering stamps a GPT-RAG release. |
Fresh UI v2.6.0 process with no CHAT_BACKEND value |
Selects hosted_agent; invalid or incomplete hosted configuration fails startup. |
| Existing umbrella deployment | Its persisted topology is sticky. An unmarked pre-cutover deployment stays classic. |
DEPLOYMENT_TOPOLOGY=classic |
Explicit supported fallback; deploys UI, orchestrator, and ingestion Container Apps. |
DEPLOYMENT_TOPOLOGY=hosted-no-panel |
Fresh-deployment default. UI and ingestion remain in Container Apps; chat uses the hosted agent; no panel Cosmos containers are selected. |
DEPLOYMENT_TOPOLOGY=hosted-panel |
Explicit supported topology. Deploys UI and ingestion, omits the orchestrator Container App, and provisions only the owner-index and feedback metadata containers. User-history and operator routes still return 503 because their independent gates remain false. |
HOSTED_CONTINUITY_ENABLED |
false. The platform publisher force-seeds it to false. |
HOSTED_CONVERSATION_OWNER_BINDING |
delegated when continuity is enabled; capability is an explicit fallback only. |
PANEL_HISTORY_ENABLED / PANEL_HISTORY_OWNER_BINDING_VALIDATED / PANEL_OPERATOR_SURFACES_ENABLED |
Deployment-published false; topology support does not imply live surface enablement. |
AILZ PREPARE_HOSTED_AGENT / deployHostedAgent |
Both default to false. deployHostedAgent=true requires an immutable sha256: image digest. |
The platform contract publishes hosted history limits of 100 items and 32,000
estimated tokens with drop_oldest. UI v2.6.0 has standalone code defaults of
40 items and 8,000 tokens when those App Configuration values are absent.
The umbrella publishes the reviewed 100/32,000 values; operators must not
remove them and then assume the UI fallback values are equivalent.
Stateless hosted runtime contract
Orchestrator v4.0.1 performs no managed-Conversations create, read, append, or
delete operation in the hosted container. The caller supplies the complete,
bounded, oldest-to-newest history on every request.
For canonical POST /responses:
inputmay be a non-empty string for a single turn or a non-empty ordered array of text-only{role, content}messages;- an array must end in a non-empty
usermessage; - top-level
conversationandprevious_response_idare unsupported and each returns HTTP 422; - there is no server fallback or deprecation path that reconstructs history;
- the runtime builds only local, ephemeral strategy state and disables model-side storage for the generation call; and
- classic non-hosted
/responsesbehavior is unchanged.
{
"input": [
{"role": "user", "content": "What is the retention period?"},
{"role": "assistant", "content": "The policy states 30 days."},
{"role": "user", "content": "Who approves an exception?"}
],
"stream": true,
"store": false
}
POST /invocations remains a distinct compatibility protocol. Its
conversation_id is only an opaque label for response tagging and
conversation-scoped retrieval; it does not authorize or select a managed
Conversation. UI v2.6.0 currently sends complete ordered messages through
this compatibility route. An integrated umbrella cutover must explicitly align
the UI call route with the protocol and role evidence it validates.
Store false wire contract
Additional confirmed gap; fix pending release and re-pin
Exact-matrix live validation against a network-isolated deployment showed
that POST /responses succeeds when the caller sends store: false, but
an omitted or true store deterministically fails with a platform
storage_error. Root cause: the pinned
azure-ai-agentserver-responses==2.0.0b1 host auto-activates its own
network-bound Foundry storage provider whenever the process detects it is
running as a hosted agent and no explicit store override is supplied —
true of every real deployment — and only calls that provider when the
caller's store is true (an omitted store defaults to true per the
Responses contract). Orchestrator v4.0.1's already-stateless design
(previous section) hardcodes store: False only on the separate, inner
call the hosted strategy makes to the model; it does not touch the
outer, wire-level store field on the incoming request, which is the
one the auto-activated provider reads.
A fix that forces store: False unconditionally on every hosted
POST /responses call — regardless of what a caller sends or omits, for
both streaming and non-streaming requests, and rejecting
background: true (which requires store: true in the pinned SDK) — is
proposed in
orchestrator PR #313.
That PR is open, not yet released, and not yet pinned by this
umbrella's manifest.json, which still pins orchestrator v4.0.1
(the version with the gap). Do not describe the store contract as fixed,
validated, or safe under network isolation until: the PR is reviewed and
released; the umbrella manifest is re-pinned to the released version; and
the exact matrix (store unset / true / false, under
NETWORK_ISOLATION=true, streaming and non-streaming) is re-run live and
passes. This warning must remain until that re-run is recorded here.
Delegated owner binding
The trusted UI BFF owns managed-Conversation lifecycle. For every create, read, append, or delete in delegated mode, it:
- validates the signed-in user's Entra token;
- normalizes the validated
oid; - acquires its own service-identity Foundry token; and
- derives
x-ms-user-identityonly from that server-sideoid.
The browser cannot submit or override the owner header. The hosted runtime is not an identity-header source and receives no managed-Conversations RBAC.
The owner header is not an OAuth On-Behalf-Of token. OBO is used only for downstream retrieval authorization, such as Toolbox passing a user bearer to Foundry IQ or Azure AI Search for native permission trimming. Owner binding and retrieval authorization have different audiences and must not be substituted.
Protocol and RBAC evidence gate
UI v2.6.0 accepts an attested Responses protocol version >= 2.0.0. The
GPT-RAG platform validator is deliberately stricter: it requires the
live endpoint to route 100% to one agent version declaring exactly one
Responses 2.0.0 protocol entry.
The same validator requires exactly these direct assignments to the UI BFF:
| Role | Required permission |
|---|---|
Built-in Foundry Agent Consumer (eed3b665-ab3a-47b6-8f48-c9382fb1dad6) |
Exactly Microsoft.CognitiveServices/accounts/AIServices/endpoints/interact/action in DataActions, with no control-plane actions. |
Custom GPT-RAG Hosted Agent User Identity Impersonation (bef66abe-a495-530a-be1d-5d882fecff03) |
Exactly Microsoft.CognitiveServices/accounts/AIServices/agents/endpoints/UserIdentityImpersonation/action, with no other actions or exclusions. |
Both assignments must be direct ServicePrincipal assignments at the
individual agent resource:
/subscriptions/<sub>/resourceGroups/<rg>/providers/Microsoft.CognitiveServices/
accounts/<account>/projects/<project>/agents/<agent>
The custom role definition is assignable only within the hosted-agent resource group. Project-, account-, resource-group-, subscription-, inherited-, group-derived-, wildcard-, custom-equivalent-, or extra-DataAction assignments do not satisfy the gate. Foundry User and Project Runtime User are not substitutes.
If protocol, role definition, principal type, assignment scope, or identity
source cannot be proven, HOSTED_CONVERSATION_OWNER_BINDING_VALIDATED remains
false, continuity remains off, and compatible continuity/history operations
fail closed with HTTP 503.
Opaque handle failures
A genuinely absent handle starts a new conversation. A presented handle that is
foreign, stale, deleted, malformed, forged, expired, signed by a retired key, or
bound to another oid produces one opaque not-found result.
The BFF must not create a replacement conversation, invoke the hosted agent, or append a turn after such a failure. This prevents a success-shaped new chat from becoming an ownership or existence oracle. Transport and dependency failures remain explicit 5xx failures; they are not converted to not-found.
User panel surfaces
UI v2.6.0 includes owner-gated endpoints for:
| Endpoint | Behavior |
|---|---|
GET /panel/conversations |
Lists metadata for only the caller's owner-index rows, using an opaque signed, expiring, oid-bound cursor. |
GET /panel/conversations/{id}/messages |
Checks ownership before reading ordered content live from managed Conversations. |
POST /panel/conversations/{id}/feedback / GET /panel/conversations/{id}/feedback |
Stores and reads bounded metadata-only rating, category, comment, and message reference. |
DELETE /panel/conversations/{id} |
Deletes the managed Conversation first, then panel metadata. Metadata cleanup failure returns partial, not a false success. |
Missing and non-owner resources both return 404. Invalid or cross-user cursors return 422. Missing/invalid delegated tokens return 401; app-only tokens return 403. Downstream store failure returns 502. Undeployed or disabled user panel surfaces return 503.
Operator overview and corpus curation
Ingestion v2.7.0 includes:
GET /panel/overview/metrics;GET /panel/corpus-curation/queue; andPOST /panel/corpus-curation/{item_id}/decision.
Overview reads aggregate counts only from the panel owner-index and feedback
metadata containers. Any bucket below PANEL_OVERVIEW_MIN_CARDINALITY (default
5) is returned as null, not as a small exact count.
Corpus curation covers documents already handled by ingestion. The queue uses
the existing per-file-log Blob store, and approve, reject, or defer
decisions use the Blob's ETag for optimistic concurrency. It does not curate or
read conversation content and does not write curation decisions to Cosmos.
Operator endpoints require:
DEPLOY_ADMINISTRATIVE_PANEL=true;PANEL_OPERATOR_SURFACES_ENABLED=true;- an explicit
PANEL_OPERATOR_APP_ROLEorPANEL_OPERATOR_GROUP_ID; and - a validated delegated user bearer carrying that role or group.
App-only tokens are rejected. The umbrella publisher keeps
PANEL_OPERATOR_SURFACES_ENABLED=false, so an explicitly deployed
hosted-panel topology still returns 503 from these routes until the separate
operator evidence and authorization gate is completed.
Released ingestion dashboard browser-auth status
The ingestion v2.7.0 Vite dashboard does not initialize MSAL, acquire an
access token, or add an Authorization header for the new operator panel
requests. Its panelFetch uses plain browser fetch. The Overview and
Curation tabs therefore show the backend's real 401/403/503 response unless
an approved same-origin reverse-auth proxy adds the delegated operator
bearer. This differs from the classic orchestrator dashboard, whose SPA has
a working MSAL Authorization Code + PKCE flow.
Data confinement
Managed Conversations is the only chat-content store for the hosted design.
- Hosted/no-panel provisions no panel Cosmos containers and has no Cosmos continuity fallback.
- Hosted-panel uses only
panel-conversation-owner-indexandpanel-feedback, partitioned by/principal_id. - Cosmos may contain identifiers, titles, timestamps, principal IDs, ratings, category codes, bounded comments, and message references.
- Cosmos must never contain message bodies, citations, retrieved document content, or corpus document content.
- The hosted runtime identity has no Conversations role, impersonation role, capability key, or panel Cosmos role.
Deployment identity boundaries
- A private Azure AI Search deployment uses its explicit Search user-assigned
identity.
postProvisionpreservesSEARCH_SERVICE_UAI_RESOURCE_IDwhen already supplied or resolves it from the Search resource; it must not replace the value with an empty identity. - Panel setup resolves exactly one managed-identity principal from each target Container App. Zero or multiple distinct principals fail setup rather than guessing.
- The frontend principal receives Cosmos DB Built-in Data Contributor and
the ingestion principal receives Cosmos DB Built-in Data Reader, each
scoped separately to only
panel-conversation-owner-indexandpanel-feedback. - Neither principal receives panel access at Cosmos account scope. Ingestion receives no panel write access, and the hosted agent receives no panel Cosmos role.
Operator verification and rollback
The matrix and all three topologies are composed by the umbrella integration. For an explicit hosted-panel deployment, select the topology before the first provision:
azd env set DEPLOYMENT_TOPOLOGY hosted-panel
azd env set HOSTED_AGENT_RESOURCE_SCOPE "api://<application-id>/.default"
azd env set HOSTED_CONTINUITY_ENABLED false
azd provision
pwsh scripts/prepareHostedDeployment.ps1
azd provision
azd deploy
On POSIX systems, use scripts/prepareHostedDeployment.sh. The first provision
creates hosted prerequisites and the two metadata containers. The preparation
step resolves an immutable image digest; the second provision materializes the
hosted handoff. UI and ingestion are deployed, but the orchestrator Container
App is omitted. Do not override the deployment-published panel or continuity
evidence flags: their routes intentionally remain off/503.
The generated hosted-agent/azure.yaml prebuilt-image path must retain:
services:
orchestrator-agent:
host: azure.ai.agent
language: docker
docker:
remoteBuild: true
Before the child project runs azd deploy orchestrator-agent, the pre-deploy
hook sets AZD_AGENT_SKIP_ACR=true alongside the immutable
HOSTED_AGENT_IMAGE_VERSION. These settings tell the azure.ai.agent host to
deploy the prepared digest without replacing the reviewed Docker service
contract or launching a second ACR build.
Before those independent live surfaces can be enabled, validation must:
- deploy the immutable hosted image and verify the live Responses protocol;
- verify the two exact direct UI BFF role assignments at individual-agent scope and reject broader or extra access;
- verify browser-supplied owner headers are ignored and the BFF derives only
the validated
oid; - run two-user negative tests for cross-user read, continuation, history, feedback, and delete;
- prove the runtime performs zero managed-Conversations operations and hosted/no-panel constructs no Cosmos client;
- inject read/append failures and prove they cannot produce a success-shaped new conversation;
- validate Basic and network-isolated deployments; and
- separately validate panel user auth and the ingestion browser operator-token path before enabling panel flags.
The prior runtime attempt did not satisfy item 1: the agent version reached
active state, but session readiness returned HTTP 424. That specific crash
was root-caused to a dependencies/connectors circular import in the
hosted entrypoint (src/api/hosted_entrypoint.py imports dependencies
before anything else in the process has "warmed up" connectors, unlike
the classic entrypoint) and fixed in
orchestrator v4.0.1
(PR #311), pinned
above. Fixing the crash is necessary but not sufficient: item 1 and the
remaining evidence steps must still be re-run against a live,
network-isolated deployment before this integration can be described as
validated. Preserve the fail-closed flags and do not describe this
integration as runtime-validated or shipped until readiness and the
remaining evidence steps succeed.
The configuration contract uses:
| Key | Required value or default |
|---|---|
HOSTED_CONTINUITY_ENABLED |
false until all evidence passes |
HOSTED_CONVERSATION_OWNER_BINDING |
delegated; explicit fallback capability |
HOSTED_CONVERSATION_OWNER_BINDING_VALIDATED |
false until protocol and RBAC validation |
HOSTED_CONVERSATION_DELEGATED_IDENTITY_HEADER |
x-ms-user-identity |
HOSTED_CONVERSATION_DELEGATED_IDENTITY_SOURCE |
authenticated_ui_bff_principal |
HOSTED_AGENT_RESPONSES_PROTOCOL_VERSION |
platform contract: exactly 2.0.0 |
HOSTED_AGENT_PROTOCOL_VERSION |
UI v2.6.0 continuity attestation: >=2.0.0; deployments must keep it consistent with the exact platform Responses setting |
HOSTED_CONTINUITY_UNAVAILABLE_STATUS_CODE |
503 |
HOSTED_HISTORY_MAX_ITEMS / HOSTED_HISTORY_MAX_TOKENS |
umbrella defaults 100 / 32000 |
HOSTED_HISTORY_TRUNCATION |
drop_oldest |
PANEL_HISTORY_ENABLED / PANEL_HISTORY_OWNER_BINDING_VALIDATED / PANEL_OPERATOR_SURFACES_ENABLED |
deployment-published false |
PANEL_CONVERSATION_ENUMERATION_MODE |
owner_index |
PANEL_CURSOR_TTL_SECONDS / PANEL_OVERVIEW_MIN_CARDINALITY |
600 / 5 |
Rollback is a deployment/configuration operation, never a request-time retry:
- set
HOSTED_CONTINUITY_ENABLED=false; - select
DEPLOYMENT_TOPOLOGY=classicandCHAT_BACKEND=orchestrator; - re-provision and redeploy the manifest-pinned classic components;
- remove the UI BFF's exact agent-scoped Consumer and impersonation assignments; and
- disable panel flags before removing panel-only metadata containers.
Managed Conversations remains the system of record, so rollback does not require copying chat content into Cosmos. Panel owner-index and feedback rows are metadata and may be retained or removed under the deployment's retention policy.