Skip to content

Python: Add agent-framework-azure-cosmos-memory context provider#6719

Open
TheovanKraay wants to merge 20 commits into
microsoft:mainfrom
TheovanKraay:feature/cosmos-memory-context-provider
Open

Python: Add agent-framework-azure-cosmos-memory context provider#6719
TheovanKraay wants to merge 20 commits into
microsoft:mainfrom
TheovanKraay:feature/cosmos-memory-context-provider

Conversation

@TheovanKraay

@TheovanKraay TheovanKraay commented Jun 24, 2026

Copy link
Copy Markdown
Contributor

Motivation & Context

Right now there's no first-party way to give agents long-term, per-user memory backed by Azure Cosmos DB. This PR adds an optional package, agent-framework-azure-cosmos-memory, that plugs Cosmos-backed memory into the standard ContextProvider extension point. On each run it pulls the user's relevant past memories and running summary into the agent's context, then saves new memories after the run. So you get the "agent that remembers the user across sessions" scenario without coupling core to Cosmos.

It builds on the azure-cosmos-agent-memory toolkit for storage, embeddings, and reconciliation, and installs as a standalone, opt-in package.

Description & Review Guide

  • What are the major changes?

    • New package python/packages/azure-cosmos-memory/ with CosmosMemoryContextProvider, implementing the framework's ContextProvider contract.
    • before_run retrieves per-user memories (semantic search) plus a user summary, injecting memories as context messages and the summary as instructions. Search and summary failures are handled separately so one doesn't block the other, and it warns once if there's no user_id.
    • after_run persists new memories from the turn.
    • README, AGENTS.md, two runnable samples (basic_usage.py, interactive_chat.py), 32 unit tests, and an integration test scaffold.
    • The package is excluded from the shared uv workspace (see below for why).
  • What is the impact of these changes?

    • Additive only. No changes to existing packages or public APIs.
    • The package is excluded from the uv workspace in python/pyproject.toml via [tool.uv.workspace] exclude. That's needed because its dependency azure-cosmos-agent-memory requires Python >=3.11 and a prompty prerelease (>=2.0.0a9), both of which are unsatisfiable against the monorepo's >=3.10 floor and if-necessary-or-explicit prerelease policy. Excluding it keeps root uv sync resolvable and leaves the committed uv.lock untouched, while the package is built and tested standalone.
    • The trade-off: it won't be built or tested by the monorepo CI matrix. If you'd rather have it as a full workspace member, that would mean raising the workspace floor to 3.11 and enabling the prompty prerelease. Happy to go whichever way you prefer.
  • What do you want reviewers to focus on?

    • The exclude decision in python/pyproject.toml, and whether you want this standalone or as a workspace member.
    • The ContextProvider integration semantics (how memories vs. summary are injected, and the independent failure handling).

Related Issue

Fixes #

Contribution Checklist

  • The code builds clean without any errors or warnings
  • All unit tests pass, and I have added new tests where possible
  • The PR follows the Contribution Guidelines
  • This PR is linked to an issue and there is no other open PR for this issue (see Related Issue above).
  • This is not a breaking change.

Copilot AI review requested due to automatic review settings June 24, 2026 20:06
@moonbox3 moonbox3 added documentation Usage: [Issues, PRs], Target: documentation in the code base and learn docs python Usage: [Issues, PRs], Target: Python labels Jun 24, 2026
@github-actions github-actions Bot changed the title Add agent-framework-azure-cosmos-memory context provider Python: Add agent-framework-azure-cosmos-memory context provider Jun 24, 2026

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds a new Python integration package, agent-framework-azure-cosmos-memory, introducing a CosmosMemoryContextProvider that persists and recalls long-term memories via Azure Cosmos DB using the azure-cosmos-agent-memory toolkit (including user-summary injection and retrieval-time context augmentation).

Changes:

  • Introduces CosmosMemoryContextProvider (async context manager + before_run/after_run hooks) plus package exports.
  • Adds documentation and samples demonstrating basic usage and an interactive Foundry-backed chat experience.
  • Adds unit tests (mocked client) and live-Azure integration tests (pytest markers).

Reviewed changes

Copilot reviewed 11 out of 11 changed files in this pull request and generated 8 comments.

Show a summary per file
File Description
python/packages/azure-cosmos-memory/agent_framework_azure_cosmos_memory/_context_provider.py Implements the Cosmos-backed memory context provider (retrieval + storage + user-summary injection + flush).
python/packages/azure-cosmos-memory/agent_framework_azure_cosmos_memory/init.py Exports CosmosMemoryContextProvider and package version.
python/packages/azure-cosmos-memory/pyproject.toml Defines the new package, dependencies, and pytest/tooling configuration (Python >=3.11).
python/packages/azure-cosmos-memory/README.md End-user documentation, configuration guidance, and usage examples.
python/packages/azure-cosmos-memory/AGENTS.md Package-level developer guidance and key behaviors (user_id/thread_id, flush).
python/packages/azure-cosmos-memory/LICENSE Package license.
python/packages/azure-cosmos-memory/samples/basic_usage.py Minimal “raw hooks” sample calling before_run()/after_run() directly.
python/packages/azure-cosmos-memory/samples/interactive_chat.py Interactive CLI sample demonstrating an agent wired with Foundry + Cosmos memory provider.
python/packages/azure-cosmos-memory/tests/test_context_provider.py Unit tests for provider behavior with a mocked memory client (incl. context manager + flush).
python/packages/azure-cosmos-memory/tests/test_integration.py Live-Azure integration tests gated by env vars and markers.
python/packages/azure-cosmos-memory/tests/conftest.py Pytest marker registration for the package’s tests.

Comment thread python/packages/azure-cosmos-memory/tests/conftest.py Outdated
Comment thread python/packages/azure-cosmos-memory/README.md Outdated
Comment thread python/packages/azure-cosmos-memory/pyproject.toml
@github-actions

github-actions Bot commented Jun 25, 2026

Copy link
Copy Markdown
Contributor

Python Test Coverage

Python Test Coverage Report •
FileStmtsMissCoverMissing
packages/azure-cosmos-memory/agent_framework_azure_cosmos_memory
   _context_provider.py1350100% 
TOTAL44591523688% 

Python Unit Test Overview

Tests Skipped Failures Errors Time
9024 33 💤 0 ❌ 0 🔥 2m 26s ⏱️

@TheovanKraay TheovanKraay force-pushed the feature/cosmos-memory-context-provider branch from ab30779 to 4bc5c8e Compare June 25, 2026 14:36
Comment thread python/packages/azure-cosmos-memory/pyproject.toml Outdated
Comment thread python/packages/azure-cosmos-memory/samples/basic_usage.py Outdated
Comment thread python/packages/azure-cosmos-memory/samples/basic_usage.py Outdated
Comment thread python/packages/azure-cosmos-memory/samples/interactive_chat.py Outdated
Comment thread python/packages/azure-cosmos-memory/samples/basic_usage.py Outdated
Comment thread python/packages/azure-cosmos-memory/samples/interactive_chat.py Outdated
@TheovanKraay TheovanKraay force-pushed the feature/cosmos-memory-context-provider branch from 1150d87 to f110b8a Compare July 3, 2026 13:14
Comment thread python/packages/azure-cosmos-memory/samples/interactive_chat.py Outdated
Comment thread python/packages/azure-cosmos-memory/samples/interactive_chat.py Outdated
Comment thread python/packages/azure-cosmos-memory/pyproject.toml Outdated
Introduces CosmosMemoryContextProvider, a ContextProvider that wraps the azure-cosmos-agent-memory toolkit to give agents long-term, Cosmos DB-backed memory (fact/procedural recall + user summaries). Includes package scaffolding, unit tests (mocked client), live Azure integration tests (marked), samples, README, and AGENTS.md.

Draft: uv.lock is intentionally left unchanged. This package depends on azure-cosmos-agent-memory (requires Python >=3.11), which is unsatisfiable against the workspace's current >=3.10 floor, so adding it to the shared lock requires a workspace decision (raise floor to 3.11 or exclude from workspace). Test coverage to be expanded.
The package depends on azure-cosmos-agent-memory which requires Python
>=3.11 and a prompty pre-release (>=2.0.0a9). Both are unsatisfiable
against the workspace's >=3.10 floor and pre-release policy, causing
uv sync to fail in every Python CI job. Exclude the package from the
shared workspace so it is resolved and tested as a standalone package.
- Strip trailing whitespace from package files (pre-commit trailing-whitespace hook)
- Exclude the package README from markdown-code-lint: the package is excluded
  from the uv workspace, so its README snippets import a module that is not
  installed in the workspace env and Pyright cannot resolve it
- Wire credential into Cosmos and AI Foundry clients; let toolkit own
  DefaultAzureCredential when none supplied (remove dead import).
- Honor auto_extract=False by zeroing extraction/summary cadence thresholds.
- Skip whitespace-only conversation turns and store stripped content.
- Show confidence 0.0 and coerce confidence to float in _format_memories.
- Register both 'integration' and 'azure' pytest markers accurately.
- Fix duplicated install block in README.
- Update and extend unit tests for new credential wiring and fixes.
Follow the github_copilot pattern for a package with a Python 3.11-only
dependency: lower requires-python to >=3.10 and gate azure-cosmos-agent-memory
behind a python_version >= '3.11' marker. Add a direct, gated prompty
pre-release dependency so the workspace's if-necessary-or-explicit prerelease
policy permits the toolkit's transitive prompty requirement. Guard the test
modules with pytest.importorskip so the 3.10 CI leg skips cleanly. Remove the
workspace exclude and the markdown-code-lint exclude, and regenerate uv.lock.
Rename provider parameters to match Agent Framework conventions:
foundry_endpoint (was ai_foundry_endpoint) and embedding_model/chat_model
(were *_deployment_name). Move DEFAULT_* to module-level constants, type
memory_types as a Literal, use DEFAULT_CONTEXT_PROMPT as the default value,
and add ProcessorConfig/CosmosMemorySettings TypedDicts. Resolve connection
settings via agent_framework load_settings with required-field validation,
replacing the manual getenv/raise blocks. Scope user_id/thread_id to the
provider state and drop the unpreventable first-turn warning.

Rewrite the samples around Agent (not raw SessionContext), provider-scoped
state, and session-id threading; use PEP 723 inline dependencies instead of a
samples dependency group; use a plain input() loop; remove the dead custom
processor stub. Update README/AGENTS for the renamed parameters and env vars.
Add a samples ruff per-file-ignores entry now that the package is linted in CI.
Bump azure-cosmos-agent-memory to >=0.2.0b2 (adds the embeddings/chat client
injection seam) and add tests/test_emulator.py: an integration (not azure)
suite that exercises real Cosmos vector search with a quantizedFlat index
against a local Cosmos DB emulator, using deterministic in-memory fakes for
embeddings and chat so no Azure AI Foundry account or LLM is required.

To run on a stock emulator the fixture strips the toolkit's full-text index
(the provider only does pure vector search) and requests provisioned autoscale
throughput instead of serverless. The suite skips cleanly when no emulator is
reachable.
The package recently joined the uv workspace, so its source and tests are now covered by the Test Typing Checks and Package Checks gates for the first time.

tests: rename stale constructor kwargs to the current provider API (foundry_endpoint/embedding_model/chat_model); use a typed _STUB_AGENT for the unused agent param so pyright/pyrefly/ty/zuban all accept it; make processor_config values ints; assert non-None memory_client in the emulator tests.

source: relax reportUnknown*/reportOptional* for this package only (the toolkit ships no py.typed; mirrors the hosting-telegram precedent); decouple the conditional toolkit import from the annotation type; use settings.get(); fix memory_types list invariance; drop a redundant None guard; read role via getattr.
The provider now drains in-flight background memory extraction in __aexit__, so applications no longer need to call flush() in their own control flow; the client's close() would otherwise cancel pending extraction tasks. flush() is hardened against clients that expose no usable background-task registry.

sample: interactive_chat reads input via asyncio.to_thread so the event loop stays free and background extraction runs during the session; removes the manual flush now that the provider drains on exit.

tests: add explicit transparent-extraction integration tests (emulator: after_run schedules extraction and __aexit__ drains it; live Azure: a fact is extracted and recalled in a later session with no manual flush). Emulator tests reuse a single fixed database to avoid exhausting the emulator's partition budget across runs.
Adds a prompts_dir option to CosmosMemoryContextProvider that points the Agent Memory Toolkit pipeline at a caller-supplied directory of Prompty templates, so callers can override extract_memories.prompty to control what the extraction LLM produces. The toolkit exposes no public prompts-directory seam, so the provider contains the one internal touch (swapping the pipeline's template loader after the store connects); applies to both provider-built and supplied clients.

sample: interactive_chat_custom_extraction.py - the interactive chat wired with a custom coding-assistant extraction rubric. It derives a complete prompts directory at runtime (copies the bundled templates and augments extract_memories.prompty) so it stays schema-compatible with the installed toolkit.

tests: unit tests assert the provider redirects the pipeline loader only when prompts_dir is set; an emulator integration test proves end to end that a unique marker in a custom extract_memories.prompty reaches the extraction LLM call.
…ADME

Replaces the stale, non-functional CustomMemoryProcessor snippet with the working prompts_dir approach, lists the new interactive_chat_custom_extraction.py sample, and corrects the interactive-sample feature list.
Sample (comment): rename _new_thread to _new_session in both interactive samples (a new session is the new thread).

Provider (comment): replace the _memory_toolkit_available flag + __init__ ImportError guard with a plain guarded import that re-raises a clear ImportError, matching the github_copilot package's pattern for its 3.11-only SDK. Kept requires-python >=3.10 (bumping this one workspace member to 3.11 would force the entire uv workspace lock floor to 3.11). Tests now run importorskip before importing the package, mirroring github_copilot.
@TheovanKraay TheovanKraay force-pushed the feature/cosmos-memory-context-provider branch from 36e7769 to cb70fcc Compare July 9, 2026 19:40
Comment thread python/packages/azure-cosmos-memory/pyproject.toml Outdated
@TheovanKraay TheovanKraay requested a review from moonbox3 July 15, 2026 13:56
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Usage: [Issues, PRs], Target: documentation in the code base and learn docs python Usage: [Issues, PRs], Target: Python

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants