Skip to content

Python: perf(foundry-hosting): FoundryAgentSessionStore rebuilds FoundryStateStore (credential + metadata round-trip) on every request #8280

Open

Description

Describe the bug / perf issue

FoundryAgentSessionStore (the default agent-session SessionStore for hosted MAF agents) rebuilds its backing FoundryStateStore on every get/set/delete. Each _get_store() call goes through FoundryStateStore.get_or_create("agent_sessions", user_isolation=True), which:

  1. constructs a fresh credential (empty token cache → a new managed-identity token fetch), and
  2. issues an agent_sessions metadata round-trip (GET/POST state_stores) before the actual item operation.

Because the hosting infra calls set() in the finally of every Responses request, this redundant credential + metadata work lands on the critical path of every request.

Component

python / foundry_hosting — FoundryAgentSessionStore (_state_store.py).

Expected behavior

The agent-session scope ("agent_sessions", user_isolation=True) is identical for every request, so the backing store should be resolved once and reused for the process lifetime. Only the real item GET/PUT/DELETE should remain on the hot path — not a per-request credential build + metadata round-trip.

Measured impact

500 cold + 500 warm streaming requests per agent, concurrency 50, private/VNet Foundry project, gpt-4o-mini, 0 errors / 0 throttled. Same-conditions A/B, baseline vs cached Responses agent (ms, p50):

Metric Baseline Cached Δ
WARM TTLB p50 7,736 7,464 −272 ms (−3.5%)
WARM TTFB p50 5,680 5,683 ~flat

The win is the elimination of the per-request credential + metadata round-trip; the remaining warm latency is the model first-token floor (~5.7 s TTFB), unaffected by this change.

Proposed fix

Cache one per-event-loop, per-scope FoundryStateStore for the agent-session scope (guarded by a per-loop lock with double-checked init; keyed by the running loop via a WeakKeyDictionary so a closed loop's store is GC'd, and keyed by scope so subclasses overriding DEFAULT_ROOT_SCOPE are isolated). Item get/set/delete semantics stay byte-for-byte identical; checkpoint / function-approval stores are left untouched (not on the per-request hot path).

Fix implemented in PR #8178 (closed pending this tracking issue).

Activity

  1. added
    pythonUsage: [Issues, PRs], Target: Python
    triageUsage: [Issues], Target: All issues that still need to be triaged
    on Sep 11, 2026
  2. changed the title [-]perf(foundry-hosting): FoundryAgentSessionStore rebuilds FoundryStateStore (credential + metadata round-trip) on every request[/-] [+]Python: perf(foundry-hosting): FoundryAgentSessionStore rebuilds FoundryStateStore (credential + metadata round-trip) on every request[/+] on Sep 11, 2026
  3. added
    reproducedUsage: [Issues], Target: all issues that can be reproduced by the triage workflow
    on Sep 14, 2026
  4. github-actions commented on Sep 14, 2026

    @github-actions
    Contributor

    🤖 Automated triage reproduction notes (agent-authored — trust but verify)

    Agent analysis

    python/packages/foundry_hosting/agent_framework_foundry_hosting/_state_store.py::FoundryAgentSessionStore._get_store resolves a new backing store whenever set/get/delete is called, including session persistence from _responses.py’s request-finalization path. Minimal repro: mock FoundryStateStore.get_or_create, call set/get/delete sequentialy one FoundryAgentSessionStore, and observe an await count of 3 rather than 1.

    • Failing test: python/packages/foundry_hosting/tests/test_state_store.py::test_agent_session_store_reuses_resolved_store
    • Files examined: python/packages/foundry_hosting/agent_framework_foundry_hosting/_state_store.py, python/packages/foundry_hosting/agent_framework_foundry_hosting/_responses.py, python/packages/foundry_hosting/tests/test_state_store.py, python/packages/foundry_hosting/pyproject.toml, azure/ai/agentserver/core/storage/_state.py
    • Tests run: test_agent_session_store_reuses_resolved_store, existing agent_session tests
    • Current version: 1.0.0b260910
  5. added
    foundryUsage: [Issues, PRs], Target: all Foundry integrations
    hostingUsage: [Issues, PRs], Target: all hosting related solutions
    and removed
    triageUsage: [Issues], Target: All issues that still need to be triaged
    on Sep 14, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Labels

foundryUsage: [Issues, PRs], Target: all Foundry integrationshostingUsage: [Issues, PRs], Target: all hosting related solutionspythonUsage: [Issues, PRs], Target: PythonreproducedUsage: [Issues], Target: all issues that can be reproduced by the triage workflow

Type

Projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions