From d5487e616f93ea8648b1a8c6072dde3c8895af9a Mon Sep 17 00:00:00 2001 From: eavanvalkenburg Date: Fri, 6 Nov 2026 15:49:36 +0100 Subject: [PATCH 1/4] Bump Python package versions for 1.25.0 release Release all 44 publishing workspace distributions with shipping changes since python-1.24.0, including the Python 3.10 removal. Use the approved minor bumps for Core/root, AG-UI, and Declarative, patch bumps for other changed stable integrations, and 261106 stamps for changed alpha/beta packages; no optional cohort-only bump. Update the Core standard-install cohort, apply strict API-based Core floors, and align exact hosting pins. Include the four Python Dependabot updates and the reviewed release batch manifest. Changelog includes the anticipated #10147 fix; the draft must wait for that PR to merge and be incorporated before release. Lab remains excluded from publication, with only its dependency lock updated. --- python/.github/release-python-1.25.0.json | 183 ++++++++++++++++++ python/CHANGELOG.md | 71 ++++++- python/packages/a2a/pyproject.toml | 2 +- python/packages/ag-ui/pyproject.toml | 6 +- python/packages/anthropic/pyproject.toml | 2 +- .../packages/azure-ai-search/pyproject.toml | 2 +- .../azure-contentunderstanding/pyproject.toml | 2 +- .../azure-cosmos-memory/pyproject.toml | 2 +- python/packages/azure-cosmos/pyproject.toml | 2 +- .../packages/azure-documentdb/pyproject.toml | 2 +- python/packages/bedrock/pyproject.toml | 2 +- python/packages/chatkit/pyproject.toml | 2 +- python/packages/claude/pyproject.toml | 2 +- python/packages/copilotstudio/pyproject.toml | 2 +- python/packages/core/pyproject.toml | 56 +++--- python/packages/declarative/pyproject.toml | 4 +- python/packages/devui/pyproject.toml | 6 +- python/packages/duckdb/pyproject.toml | 2 +- python/packages/foundry/pyproject.toml | 2 +- .../packages/foundry_hosting/pyproject.toml | 4 +- python/packages/foundry_local/pyproject.toml | 2 +- python/packages/gemini/pyproject.toml | 2 +- python/packages/github_copilot/pyproject.toml | 2 +- python/packages/hosting-a2a/pyproject.toml | 4 +- python/packages/hosting-mcp/pyproject.toml | 4 +- .../packages/hosting-responses/pyproject.toml | 4 +- .../packages/hosting-telegram/pyproject.toml | 4 +- python/packages/hosting/pyproject.toml | 2 +- python/packages/hyperlight/pyproject.toml | 2 +- python/packages/lab/uv.lock | 6 +- python/packages/mem0/pyproject.toml | 2 +- python/packages/mistral/pyproject.toml | 2 +- python/packages/mongodb/pyproject.toml | 2 +- python/packages/monty/pyproject.toml | 2 +- python/packages/nvidia/pyproject.toml | 2 +- python/packages/ollama/pyproject.toml | 2 +- python/packages/openai/pyproject.toml | 4 +- python/packages/oracle/pyproject.toml | 2 +- python/packages/orchestrations/pyproject.toml | 2 +- python/packages/postgres/pyproject.toml | 2 +- python/packages/purview/pyproject.toml | 2 +- python/packages/qdrant/pyproject.toml | 2 +- python/packages/redis/pyproject.toml | 2 +- python/packages/sql-server/pyproject.toml | 2 +- python/packages/tools/pyproject.toml | 2 +- python/packages/typesafe/pyproject.toml | 2 +- python/pyproject.toml | 6 +- .../invocations/telegram/uv.lock | 6 +- python/tooling/requirements-typing.txt | 4 +- python/uv.lock | 102 +++++----- 50 files changed, 396 insertions(+), 144 deletions(-) create mode 100644 python/.github/release-python-1.25.0.json diff --git a/python/.github/release-python-1.25.0.json b/python/.github/release-python-1.25.0.json new file mode 100644 index 00000000000..b24fb8d4da2 --- /dev/null +++ b/python/.github/release-python-1.25.0.json @@ -0,0 +1,183 @@ +{ + "tag": "python-1.25.0", + "packages": { + "agent-framework": "1.25.0", + "agent-framework-a2a": "1.0.0b261106", + "agent-framework-ag-ui": "1.8.0", + "agent-framework-anthropic": "1.0.0b261106", + "agent-framework-azure-ai-search": "1.0.0b261106", + "agent-framework-azure-contentunderstanding": "1.0.0b261106", + "agent-framework-azure-cosmos": "1.0.0b261106", + "agent-framework-azure-cosmos-memory": "1.0.0a261106", + "agent-framework-azure-documentdb": "1.0.0a261106", + "agent-framework-bedrock": "1.0.0b261106", + "agent-framework-chatkit": "1.0.0b261106", + "agent-framework-claude": "1.0.0b261106", + "agent-framework-copilotstudio": "1.0.0b261106", + "agent-framework-core": "1.25.0", + "agent-framework-declarative": "1.5.0", + "agent-framework-devui": "1.0.0b261106", + "agent-framework-duckdb": "1.0.0a261106", + "agent-framework-foundry": "1.16.1", + "agent-framework-foundry-hosting": "1.0.0b261106", + "agent-framework-foundry-local": "1.0.0b261106", + "agent-framework-gemini": "1.0.0b261106", + "agent-framework-github-copilot": "2.1.2", + "agent-framework-hosting": "1.0.0a261106", + "agent-framework-hosting-a2a": "1.0.0a261106", + "agent-framework-hosting-mcp": "1.0.0a261106", + "agent-framework-hosting-responses": "1.0.0a261106", + "agent-framework-hosting-telegram": "1.0.0a261106", + "agent-framework-hyperlight": "1.0.0b261106", + "agent-framework-mem0": "1.0.0b261106", + "agent-framework-mistral": "1.0.0b261106", + "agent-framework-mongodb": "1.0.0a261106", + "agent-framework-monty": "1.0.0b261106", + "agent-framework-nvidia": "1.0.0a261106", + "agent-framework-ollama": "1.0.0b261106", + "agent-framework-openai": "1.18.1", + "agent-framework-oracle": "1.0.0a261106", + "agent-framework-orchestrations": "1.4.2", + "agent-framework-postgres": "1.0.0a261106", + "agent-framework-purview": "1.0.0b261106", + "agent-framework-qdrant": "1.0.0a261106", + "agent-framework-redis": "1.0.0b261106", + "agent-framework-sql-server": "1.0.0a261106", + "agent-framework-tools": "1.0.0b261106", + "agent-framework-typesafe": "1.0.0a261106" + }, + "smoke_imports": { + "agent-framework": [ + "agent_framework:Agent" + ], + "agent-framework-a2a": [ + "agent_framework.a2a:A2AAgent" + ], + "agent-framework-ag-ui": [ + "agent_framework.ag_ui:AgentFrameworkAgent" + ], + "agent-framework-anthropic": [ + "agent_framework.anthropic:AnthropicClient" + ], + "agent-framework-azure-ai-search": [ + "agent_framework.azure:AzureAISearchStore" + ], + "agent-framework-azure-contentunderstanding": [ + "agent_framework.foundry:ContentUnderstandingContextProvider" + ], + "agent-framework-azure-cosmos": [ + "agent_framework.azure:CosmosStore" + ], + "agent-framework-azure-cosmos-memory": [ + "agent_framework_azure_cosmos_memory:CosmosMemoryContextProvider" + ], + "agent-framework-azure-documentdb": [ + "agent_framework_azure_documentdb:AzureDocumentDBStore" + ], + "agent-framework-bedrock": [ + "agent_framework.amazon:BedrockChatClient" + ], + "agent-framework-chatkit": [ + "agent_framework.chatkit:stream_agent_response" + ], + "agent-framework-claude": [ + "agent_framework.anthropic:ClaudeAgent" + ], + "agent-framework-copilotstudio": [ + "agent_framework.microsoft:CopilotStudioAgent" + ], + "agent-framework-core": [ + "agent_framework:Message" + ], + "agent-framework-declarative": [ + "agent_framework.declarative:AgentFactory" + ], + "agent-framework-devui": [ + "agent_framework.devui:serve" + ], + "agent-framework-duckdb": [ + "agent_framework_duckdb:DuckDBStore" + ], + "agent-framework-foundry": [ + "agent_framework.foundry:FoundryAgent" + ], + "agent-framework-foundry-hosting": [ + "agent_framework.foundry:FoundryAgentSessionStore" + ], + "agent-framework-foundry-local": [ + "agent_framework.foundry:FoundryLocalClient" + ], + "agent-framework-gemini": [ + "agent_framework.gemini:GeminiEmbeddingClient" + ], + "agent-framework-github-copilot": [ + "agent_framework.github:GitHubCopilotAgent" + ], + "agent-framework-hosting": [ + "agent_framework_hosting:AgentState" + ], + "agent-framework-hosting-a2a": [ + "agent_framework_hosting_a2a:AgentA2AAdapter" + ], + "agent-framework-hosting-mcp": [ + "agent_framework_hosting_mcp:AgentMCPTool" + ], + "agent-framework-hosting-responses": [ + "agent_framework_hosting_responses:responses_from_run" + ], + "agent-framework-hosting-telegram": [ + "agent_framework_hosting_telegram:telegram_to_run" + ], + "agent-framework-hyperlight": [ + "agent_framework.hyperlight:HyperlightCodeActProvider" + ], + "agent-framework-mem0": [ + "agent_framework.mem0:Mem0ContextProvider" + ], + "agent-framework-mistral": [ + "agent_framework.mistral:MistralChatClient" + ], + "agent-framework-mongodb": [ + "agent_framework_mongodb:MongoDBStore" + ], + "agent-framework-monty": [ + "agent_framework.monty:MontyCodeActProvider" + ], + "agent-framework-nvidia": [ + "agent_framework_nvidia:NvidiaEmbeddingClient" + ], + "agent-framework-ollama": [ + "agent_framework.ollama:OllamaChatClient" + ], + "agent-framework-openai": [ + "agent_framework.openai:OpenAIChatClient" + ], + "agent-framework-oracle": [ + "agent_framework_oracle:OracleStore" + ], + "agent-framework-orchestrations": [ + "agent_framework.orchestrations:SequentialBuilder" + ], + "agent-framework-postgres": [ + "agent_framework_postgres:PostgresStore" + ], + "agent-framework-purview": [ + "agent_framework.microsoft:PurviewPolicyMiddleware" + ], + "agent-framework-qdrant": [ + "agent_framework_qdrant:QdrantStore" + ], + "agent-framework-redis": [ + "agent_framework.redis:RedisStore" + ], + "agent-framework-sql-server": [ + "agent_framework_sql_server:SqlServerStore" + ], + "agent-framework-tools": [ + "agent_framework.tools:LocalShellTool" + ], + "agent-framework-typesafe": [ + "agent_framework_typesafe:TypeSafeChatClient" + ] + } +} diff --git a/python/CHANGELOG.md b/python/CHANGELOG.md index c5211d5639b..8f2392a756e 100644 --- a/python/CHANGELOG.md +++ b/python/CHANGELOG.md @@ -7,6 +7,74 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [1.25.0] - 2026-11-06 + +### Added +- **agent-framework-core**, **agent-framework-foundry-hosting**: Support callable MCP discovery approval policies and honor Foundry Toolbox approval metadata, including tool-name and read-only filters, explicit caller overrides, and policy refresh for retained tools ([#10136](https://github.com/microsoft/agent-framework/pull/10136)) + +### Changed +- **agent-framework**, **agent-framework-a2a**, **agent-framework-ag-ui**, **agent-framework-anthropic**, **agent-framework-azure-ai-search**, **agent-framework-azure-contentunderstanding**, **agent-framework-azure-cosmos**, **agent-framework-azure-cosmos-memory**, **agent-framework-azure-documentdb**, **agent-framework-bedrock**, **agent-framework-chatkit**, **agent-framework-claude**, **agent-framework-copilotstudio**, **agent-framework-core**, **agent-framework-declarative**, **agent-framework-devui**, **agent-framework-duckdb**, **agent-framework-foundry**, **agent-framework-foundry-hosting**, **agent-framework-foundry-local**, **agent-framework-gemini**, **agent-framework-github-copilot**, **agent-framework-hosting**, **agent-framework-hosting-a2a**, **agent-framework-hosting-mcp**, **agent-framework-hosting-responses**, **agent-framework-hosting-telegram**, **agent-framework-hyperlight**, **agent-framework-mem0**, **agent-framework-mistral**, **agent-framework-mongodb**, **agent-framework-monty**, **agent-framework-nvidia**, **agent-framework-ollama**, **agent-framework-openai**, **agent-framework-oracle**, **agent-framework-orchestrations**, **agent-framework-postgres**, **agent-framework-purview**, **agent-framework-qdrant**, **agent-framework-redis**, **agent-framework-sql-server**, **agent-framework-tools**, **agent-framework-typesafe**: [BREAKING] Remove Python 3.10 installation eligibility and obsolete compatibility branches; require Python 3.11 or later ([#9948](https://github.com/microsoft/agent-framework/pull/9948)) + + **Migration:** Upgrade Python 3.10 environments to Python 3.11 or later before installing this release. Existing integration-specific Python upper bounds still apply; Foundry Local supports Python 3.11-3.14. +- **agent-framework-core**, **agent-framework-declarative**: [BREAKING] Bound MCP tool and prompt discovery to 100 pages and 1,000 items per catalog, default framework-owned request timeouts to 30 seconds, and preserve the complete catalog snapshot when refresh fails ([#10042](https://github.com/microsoft/agent-framework/pull/10042)) + + **Migration:** Increase `max_discovery_pages` or `max_discovery_items` for larger catalogs, or set either to `None` only for a trusted MCP server. Pass `request_timeout=None` to an MCP tool to restore unlimited request timing. Caller-owned clients retain their own transport and timeout policy. `DefaultMCPToolHandler` exposes the discovery limits and requires Core 1.25. +- **agent-framework-ag-ui**, **agent-framework-core**, **agent-framework-hosting**: [BREAKING] Bind live workflow agent executors and their sessions to one authorization scope, reject cross-scope execution before model calls, and reject `WorkflowAgent.as_tool()` in AG-UI endpoints ([#10035](https://github.com/microsoft/agent-framework/pull/10035)) + + **Migration:** Use `AgentFrameworkWorkflow(workflow_factory=...)` with a factory that creates new workflows, `AgentExecutor` instances, and `AgentSession` instances for each call. A shared builder still reuses its executors, even with `cache_target=False`. Use `single_user=True` only when all callers are the same principal. Cross-scope reuse now reports `WORKFLOW_SCOPE_CONFLICT`; workflow-agent tools report `WORKFLOW_AGENT_TOOL_UNSUPPORTED`. Serve those workflows directly through a factory instead. This guard covers live executor/session identity, not state loaded from shared storage or custom tool functions that invoke workflows. AG-UI requires Core 1.25 for the wrapped-agent ownership check. +- **agent-framework-core**: [BREAKING] Align graph and functional workflow invocation spans with OpenTelemetry GenAI conventions ([#9900](https://github.com/microsoft/agent-framework/pull/9900)) + + **Migration:** Replace exact `workflow.run` span-name filters with `gen_ai.operation.name == "invoke_workflow"`, and replace `workflow.name` attribute lookups with `gen_ai.workflow.name`. Named spans use `invoke_workflow {workflow_name}`; unnamed graph workflows use `invoke_workflow` and omit the semantic name attribute. `OtelAttr.WORKFLOW_RUN_SPAN` now contains the base operation name, not every exported span's full name. Runtime/checkpoint workflow identity and conversation/error attribute names are unchanged. +- **agent-framework-declarative**: [BREAKING] Create and close a fresh MCP protocol session for every handler invocation, including `tools/list`, instead of caching initialized sessions across workflows ([#8662](https://github.com/microsoft/agent-framework/pull/8662)) + + **Migration:** Replace `async with DefaultMCPToolHandler(...) as handler:` with ordinary `handler = DefaultMCPToolHandler(...)` construction. Remove `cache_max_size` and handler `aclose()` calls. Manage borrowed HTTP clients separately, and cancel and await active invocations before closing them. Implicit server-session continuity no longer survives later calls, approval waits, or checkpoint resumes; use explicit remote state handles or an explicitly scoped custom `MCPToolHandler` when continuity is required. Workflow checkpoints and approval verification are unchanged; no checkpoint migration flag is introduced. +- **agent-framework-foundry-local**: [BREAKING] Migrate to Foundry Local SDK 2.3.1, support SDK-registered local models, and prepare the selected model before first inference while retaining the OpenAI-compatible transport ([#9322](https://github.com/microsoft/agent-framework/pull/9322)) + + **Migration:** Install `foundry-local-sdk>=2.3.1,<3` on Python 3.11-3.14 and a supported platform: Apple Silicon macOS, Linux x86_64/aarch64, or Windows x64/ARM64. Configure the shared SDK manager before the first client when custom settings are needed. `bootstrap=False` requires an initialized manager and running web service; `prepare_model=False` still loads the selected model on the first request. Remove unsupported `do_sample` and `early_stopping` options. Close client HTTP resources before closing the shared manager once at application shutdown. Image support has not been verified; audio and embeddings are outside this SDK migration. +- **agent-framework-hyperlight**, **agent-framework-monty**: [BREAKING] Redact host-tool exception details before generated code resumes, preserve the diagnostic policy in serialized execution state, and isolate Hyperlight sandbox caches by policy ([#9971](https://github.com/microsoft/agent-framework/pull/9971)) + + **Migration:** Handle generic `RuntimeError` diagnostics instead of matching original host exception types by default. Set the host-side `include_detailed_errors=True` option only for trusted channels that need original exception types and messages. This option is separate from sensitive-data logging and outer-client error handling. +- **agent-framework-ag-ui**, **agent-framework-devui**, **agent-framework-foundry**, **agent-framework-monty**, **tests**: Expand supported FastAPI and Azure AI Projects dependency ranges, require Pydantic Monty 1.0 or later with the updated runtime bridge, and refresh development dependencies and the standalone Lab lockfile ([#10096](https://github.com/microsoft/agent-framework/pull/10096)) +- **agent-framework-core**, **agent-framework-redis**: Enable Redis integration and its standard-install dependency on Python 3.15, and widen the supported RedisVL range to include 0.31 without raising the existing lower bound ([#10143](https://github.com/microsoft/agent-framework/pull/10143)) +- **agent-framework**, **agent-framework-core**: Advance the exact Core pin and standard-install dependency cohort to the versions in this release. +- **agent-framework-ag-ui**, **agent-framework-declarative**, **agent-framework-foundry-hosting**, **agent-framework-openai**: Require Core 1.25 for the wrapped-agent ownership link, MCP discovery-limit parameters, callable discovery approval policy, or local shell-result replay marker. Retain other Core floors under the strict API-usage policy. +- **agent-framework-hosting-a2a**, **agent-framework-hosting-mcp**, **agent-framework-hosting-responses**, **agent-framework-hosting-telegram**: Keep the exact shared hosting dependency pin aligned with its co-released version. +- **agent-framework-purview**: Clarify binary-content classification behavior ([#10103](https://github.com/microsoft/agent-framework/pull/10103)) +- **docs**: Clarify optional usage counters and OpenTelemetry logging-handler behavior, make response overview examples runnable, and remove an unused URI pattern while correcting workflow-cycle documentation ([#9783](https://github.com/microsoft/agent-framework/pull/9783), [#9897](https://github.com/microsoft/agent-framework/pull/9897), [#9617](https://github.com/microsoft/agent-framework/pull/9617), [#10105](https://github.com/microsoft/agent-framework/pull/10105)) +- **docs**, **samples**: Correct Foundry model and connection environment variables in multimodal, Content Understanding, ChatKit, and red-teaming setup guidance, and repair the Rubric evaluator documentation link ([#9735](https://github.com/microsoft/agent-framework/pull/9735), [#9740](https://github.com/microsoft/agent-framework/pull/9740), [#9758](https://github.com/microsoft/agent-framework/pull/9758), [#9781](https://github.com/microsoft/agent-framework/pull/9781), [#9906](https://github.com/microsoft/agent-framework/pull/9906)) +- **docs**: Add Bhived and Donkey Development Kit community projects, and strengthen API-design and PR-review guidance ([#10032](https://github.com/microsoft/agent-framework/pull/10032), [#10086](https://github.com/microsoft/agent-framework/pull/10086), [#10038](https://github.com/microsoft/agent-framework/pull/10038)) +- **tests**: Expand optional MCP tool regression coverage and refresh mypy, ty, and standalone Lab test tooling without releasing the excluded Lab workspace ([#9937](https://github.com/microsoft/agent-framework/pull/9937), [#10117](https://github.com/microsoft/agent-framework/pull/10117), [#10118](https://github.com/microsoft/agent-framework/pull/10118), [#10119](https://github.com/microsoft/agent-framework/pull/10119), [#10120](https://github.com/microsoft/agent-framework/pull/10120)) +- **tests**: Correct native changed-package path routing in repository tooling ([#9947](https://github.com/microsoft/agent-framework/pull/9947)) +- **agent-framework-ag-ui**, **agent-framework-devui**, **tests**: Upgrade root and integration-extra pytest pins together to 9.2.0 and the pinned ty and Zuban checkers to 0.0.95 and 0.10.2 ([#10115](https://github.com/microsoft/agent-framework/pull/10115), [#10140](https://github.com/microsoft/agent-framework/pull/10140)) +- **tests**, **samples**: Refresh the standalone Lab and Telegram hosted-agent sample lockfiles to OAuthlib 4.0.1; Lab remains outside the release batch ([#10129](https://github.com/microsoft/agent-framework/pull/10129), [#10128](https://github.com/microsoft/agent-framework/pull/10128)) + +### Fixed +- **agent-framework-core**, **agent-framework-foundry-hosting**: Scope HTTP headers to each outgoing request so MCP tools, prompts, and Foundry Toolbox resource reads with matching effective headers can overlap while isolating identity changes. Bound admission and recovery with separate `request_timeout` budgets, not end-to-end deadlines. Caller-owned connection lifecycles remain unchanged; applications must still order state-dependent operations that share server-side MCP session state ([#10147](https://github.com/microsoft/agent-framework/pull/10147)) +- **agent-framework-core**: Preserve tools supplied by context providers and accept tuple-valued function results ([#9403](https://github.com/microsoft/agent-framework/pull/9403), [#9679](https://github.com/microsoft/agent-framework/pull/9679)) +- **agent-framework-core**: Preserve termination results through agent and chat middleware, sort function-schema properties deterministically for prompt caching, and accept whole-number floats for JSON Schema integer parameters ([#9681](https://github.com/microsoft/agent-framework/pull/9681), [#8960](https://github.com/microsoft/agent-framework/pull/8960), [#9852](https://github.com/microsoft/agent-framework/pull/9852)) +- **agent-framework-core**: Honor serialization exclusions for chat-client additional properties, return an empty output-type list when executor discovery is deferred, and deserialize `NoneType` request-info values ([#9943](https://github.com/microsoft/agent-framework/pull/9943), [#9942](https://github.com/microsoft/agent-framework/pull/9942), [#9998](https://github.com/microsoft/agent-framework/pull/9998)) +- **agent-framework-core**: Keep uncovered sessions pending after partial memory consolidation, quarantine unreadable memory state instead of failing every turn, and retain finished background tasks until cleared or released ([#9294](https://github.com/microsoft/agent-framework/pull/9294), [#9547](https://github.com/microsoft/agent-framework/pull/9547), [#9387](https://github.com/microsoft/agent-framework/pull/9387)) +- **agent-framework-core**: Fail closed on invalid FIDES tool policy and changed invocation authority, defer hidden-value materialization until policy approval, and preserve lone Unicode surrogates in durable state ([#9875](https://github.com/microsoft/agent-framework/pull/9875)) +- **agent-framework-ag-ui**, **agent-framework-core**: Preserve citations through client and agent streaming and response aggregation ([#9094](https://github.com/microsoft/agent-framework/pull/9094)) +- **agent-framework-ag-ui**: Emit one start event for each replayed declaration-only tool call ([#9770](https://github.com/microsoft/agent-framework/pull/9770)) +- **agent-framework-anthropic**: Include cache tokens in input usage and surface streamed citation annotations with character-location document titles ([#9859](https://github.com/microsoft/agent-framework/pull/9859), [#9898](https://github.com/microsoft/agent-framework/pull/9898)) +- **agent-framework-anthropic**: Serialize hosted MCP tool-result content for replay and preserve `redacted_thinking` blocks in tool loops ([#9972](https://github.com/microsoft/agent-framework/pull/9972), [#10106](https://github.com/microsoft/agent-framework/pull/10106)) +- **agent-framework-azure-cosmos**, **agent-framework-mongodb**, **agent-framework-oracle**, **agent-framework-postgres**, **agent-framework-qdrant**, **agent-framework-redis**: Prefer injected storage clients over ambient connection settings without taking ownership of caller resources ([#9996](https://github.com/microsoft/agent-framework/pull/9996), [#9982](https://github.com/microsoft/agent-framework/pull/9982), [#9985](https://github.com/microsoft/agent-framework/pull/9985), [#9983](https://github.com/microsoft/agent-framework/pull/9983), [#9993](https://github.com/microsoft/agent-framework/pull/9993), [#9977](https://github.com/microsoft/agent-framework/pull/9977)) +- **agent-framework-bedrock**: Preserve parallel tool results and prefer explicit boto3 session or injected-client regions over `BEDROCK_REGION` ([#9796](https://github.com/microsoft/agent-framework/pull/9796), [#9967](https://github.com/microsoft/agent-framework/pull/9967)) +- **agent-framework-claude**, **agent-framework-gemini**: Skip connection-setting resolution when the caller supplies an SDK client ([#9984](https://github.com/microsoft/agent-framework/pull/9984), [#9969](https://github.com/microsoft/agent-framework/pull/9969)) +- **agent-framework-declarative**: Pass extra model configuration through regular request options ([#10005](https://github.com/microsoft/agent-framework/pull/10005)) +- **agent-framework-devui**: Accept IPv6 loopback Host headers when bound to loopback ([#9712](https://github.com/microsoft/agent-framework/pull/9712)) +- **agent-framework-foundry**: Attach reasoning replay data to its owning message, sanitize nested SDK models in hosted tools, honor `FOUNDRY_MODEL` in evaluation, and accept injected embedding clients without endpoint settings ([#9931](https://github.com/microsoft/agent-framework/pull/9931), [#9789](https://github.com/microsoft/agent-framework/pull/9789), [#9981](https://github.com/microsoft/agent-framework/pull/9981), [#9991](https://github.com/microsoft/agent-framework/pull/9991)) +- **agent-framework-foundry-hosting**: Preserve request metadata in hosted responses ([#9745](https://github.com/microsoft/agent-framework/pull/9745)) +- **agent-framework-github-copilot**: Reject unsupported function middleware and sum streamed usage across model calls ([#10090](https://github.com/microsoft/agent-framework/pull/10090), [#10088](https://github.com/microsoft/agent-framework/pull/10088)) +- **agent-framework-github-copilot**: Narrow bare `PermissionDecisionApproveForSession()` decisions for URL prompts to one-time approval instead of inferring a hostname scope. Supply an explicit `domain=` for intentional session-scoped URL access; explicit scopes and structured tool approvals remain unchanged ([#10149](https://github.com/microsoft/agent-framework/pull/10149)) +- **agent-framework-hosting-mcp**: Validate agent MCP tool arguments before invocation ([#10036](https://github.com/microsoft/agent-framework/pull/10036)) +- **agent-framework-hyperlight**, **agent-framework-monty**: Deduplicate CodeAct FIDES compatibility warnings ([#9788](https://github.com/microsoft/agent-framework/pull/9788)) +- **agent-framework-ollama**: Report the correct streaming finish reason for tool calls ([#9763](https://github.com/microsoft/agent-framework/pull/9763)) +- **agent-framework-openai**: Prefer an injected Azure OpenAI deployment over environment model aliases ([#9987](https://github.com/microsoft/agent-framework/pull/9987)) +- **agent-framework-core**, **agent-framework-openai**: Complete empty local shell calls without orphaning history and preserve their local results during service-side continuation ([#9803](https://github.com/microsoft/agent-framework/pull/9803)) +- **agent-framework-tools**: Terminate the shell process group on stateless shell timeouts ([#9483](https://github.com/microsoft/agent-framework/pull/9483)) + ## [1.24.0] - 2026-10-30 > [!WARNING] @@ -1946,7 +2014,8 @@ Release candidate for **agent-framework-core** and **agent-framework-azure-ai** For more information, see the [announcement blog post](https://devblogs.microsoft.com/foundry/introducing-microsoft-agent-framework-the-open-source-engine-for-agentic-ai-apps/). -[Unreleased]: https://github.com/microsoft/agent-framework/compare/python-1.24.0...HEAD +[Unreleased]: https://github.com/microsoft/agent-framework/compare/python-1.25.0...HEAD +[1.25.0]: https://github.com/microsoft/agent-framework/compare/python-1.24.0...python-1.25.0 [1.24.0]: https://github.com/microsoft/agent-framework/compare/python-1.23.0...python-1.24.0 [1.23.0]: https://github.com/microsoft/agent-framework/compare/python-1.22.0...python-1.23.0 [1.22.0]: https://github.com/microsoft/agent-framework/compare/python-1.21.0...python-1.22.0 diff --git a/python/packages/a2a/pyproject.toml b/python/packages/a2a/pyproject.toml index a65850cd3c5..e116037846b 100644 --- a/python/packages/a2a/pyproject.toml +++ b/python/packages/a2a/pyproject.toml @@ -4,7 +4,7 @@ description = "A2A integration for Microsoft Agent Framework." authors = [{ name = "Microsoft", email = "af-support@microsoft.com"}] readme = "README.md" requires-python = ">=3.11" -version = "1.0.0b261030" +version = "1.0.0b261106" license-files = ["LICENSE"] urls.homepage = "https://aka.ms/agent-framework" urls.source = "https://github.com/microsoft/agent-framework/tree/main/python" diff --git a/python/packages/ag-ui/pyproject.toml b/python/packages/ag-ui/pyproject.toml index eb4c6c0fc31..fe36a7125bb 100644 --- a/python/packages/ag-ui/pyproject.toml +++ b/python/packages/ag-ui/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "agent-framework-ag-ui" -version = "1.7.1" +version = "1.8.0" description = "AG-UI protocol integration for Agent Framework" readme = "README.md" license-files = ["LICENSE"] @@ -23,7 +23,7 @@ classifiers = [ "Typing :: Typed", ] dependencies = [ - "agent-framework-core>=1.22.0,<2", + "agent-framework-core>=1.25.0,<2", "ag-ui-protocol>=0.1.19,<0.2", "fastapi>=0.121.0,<0.163.0", "httpx>=0.28.1,<1", @@ -33,7 +33,7 @@ dependencies = [ [project.optional-dependencies] dev = [ - "pytest==9.1.1", + "pytest==9.2.0", ] # A2UI (agent-generated UI) support. Optional: the agent_framework_ag_ui._a2ui # modules import this lazily, so the base package works without it. diff --git a/python/packages/anthropic/pyproject.toml b/python/packages/anthropic/pyproject.toml index 8c2868e3c42..3bc8cc037ee 100644 --- a/python/packages/anthropic/pyproject.toml +++ b/python/packages/anthropic/pyproject.toml @@ -4,7 +4,7 @@ description = "Anthropic integration for Microsoft Agent Framework." authors = [{ name = "Microsoft", email = "af-support@microsoft.com"}] readme = "README.md" requires-python = ">=3.11" -version = "1.0.0b261030" +version = "1.0.0b261106" license-files = ["LICENSE"] urls.homepage = "https://aka.ms/agent-framework" urls.source = "https://github.com/microsoft/agent-framework/tree/main/python" diff --git a/python/packages/azure-ai-search/pyproject.toml b/python/packages/azure-ai-search/pyproject.toml index 9904d63efb8..5ba3912e9e8 100644 --- a/python/packages/azure-ai-search/pyproject.toml +++ b/python/packages/azure-ai-search/pyproject.toml @@ -4,7 +4,7 @@ description = "Azure AI Search integration for Microsoft Agent Framework." authors = [{ name = "Microsoft", email = "af-support@microsoft.com"}] readme = "README.md" requires-python = ">=3.11" -version = "1.0.0b261030" +version = "1.0.0b261106" license-files = ["LICENSE"] urls.homepage = "https://aka.ms/agent-framework" urls.source = "https://github.com/microsoft/agent-framework/tree/main/python" diff --git a/python/packages/azure-contentunderstanding/pyproject.toml b/python/packages/azure-contentunderstanding/pyproject.toml index ab01cacc912..c00fc957752 100644 --- a/python/packages/azure-contentunderstanding/pyproject.toml +++ b/python/packages/azure-contentunderstanding/pyproject.toml @@ -4,7 +4,7 @@ description = "Azure Content Understanding integration for Microsoft Agent Frame authors = [{ name = "Microsoft", email = "af-support@microsoft.com" }] readme = "README.md" requires-python = ">=3.11" -version = "1.0.0b261030" +version = "1.0.0b261106" license-files = ["LICENSE"] urls.homepage = "https://aka.ms/agent-framework" urls.source = "https://github.com/microsoft/agent-framework/tree/main/python" diff --git a/python/packages/azure-cosmos-memory/pyproject.toml b/python/packages/azure-cosmos-memory/pyproject.toml index fa5a3d901a0..b61e5726a33 100644 --- a/python/packages/azure-cosmos-memory/pyproject.toml +++ b/python/packages/azure-cosmos-memory/pyproject.toml @@ -4,7 +4,7 @@ description = "Azure Cosmos DB Agent Memory Toolkit integration for Microsoft Ag authors = [{ name = "Microsoft", email = "af-support@microsoft.com"}] readme = "README.md" requires-python = ">=3.11" -version = "1.0.0a261022" +version = "1.0.0a261106" license-files = ["LICENSE"] urls.homepage = "https://aka.ms/agent-framework" urls.source = "https://github.com/microsoft/agent-framework/tree/main/python" diff --git a/python/packages/azure-cosmos/pyproject.toml b/python/packages/azure-cosmos/pyproject.toml index 2216695859a..64b53f414a8 100644 --- a/python/packages/azure-cosmos/pyproject.toml +++ b/python/packages/azure-cosmos/pyproject.toml @@ -4,7 +4,7 @@ description = "Azure Cosmos DB for NoSQL integrations for Microsoft Agent Framew authors = [{ name = "Microsoft", email = "af-support@microsoft.com"}] readme = "README.md" requires-python = ">=3.11" -version = "1.0.0b261030" +version = "1.0.0b261106" license-files = ["LICENSE"] urls.homepage = "https://aka.ms/agent-framework" urls.source = "https://github.com/microsoft/agent-framework/tree/main/python" diff --git a/python/packages/azure-documentdb/pyproject.toml b/python/packages/azure-documentdb/pyproject.toml index 39125ada58b..b3ef0d6a677 100644 --- a/python/packages/azure-documentdb/pyproject.toml +++ b/python/packages/azure-documentdb/pyproject.toml @@ -4,7 +4,7 @@ description = "Azure DocumentDB vector stores for Microsoft Agent Framework." authors = [{ name = "Microsoft", email = "af-support@microsoft.com" }] readme = "README.md" requires-python = ">=3.11" -version = "1.0.0a261030" +version = "1.0.0a261106" license-files = ["LICENSE"] urls.homepage = "https://aka.ms/agent-framework" urls.source = "https://github.com/microsoft/agent-framework/tree/main/python" diff --git a/python/packages/bedrock/pyproject.toml b/python/packages/bedrock/pyproject.toml index 138a0aaf9d1..72e25fd8d80 100644 --- a/python/packages/bedrock/pyproject.toml +++ b/python/packages/bedrock/pyproject.toml @@ -4,7 +4,7 @@ description = "Amazon Bedrock integration for Microsoft Agent Framework." authors = [{ name = "Microsoft", email = "af-support@microsoft.com"}] readme = "README.md" requires-python = ">=3.11" -version = "1.0.0b261030" +version = "1.0.0b261106" license-files = ["LICENSE"] urls.homepage = "https://aka.ms/agent-framework" urls.source = "https://github.com/microsoft/agent-framework/tree/main/python" diff --git a/python/packages/chatkit/pyproject.toml b/python/packages/chatkit/pyproject.toml index da6575ce843..1894d5026ca 100644 --- a/python/packages/chatkit/pyproject.toml +++ b/python/packages/chatkit/pyproject.toml @@ -4,7 +4,7 @@ description = "OpenAI ChatKit integration for Microsoft Agent Framework." authors = [{ name = "Microsoft", email = "af-support@microsoft.com"}] readme = "README.md" requires-python = ">=3.11" -version = "1.0.0b261030" +version = "1.0.0b261106" license-files = ["LICENSE"] urls.homepage = "https://aka.ms/agent-framework" urls.source = "https://github.com/microsoft/agent-framework/tree/main/python" diff --git a/python/packages/claude/pyproject.toml b/python/packages/claude/pyproject.toml index 162ed4cc006..0b217060ec5 100644 --- a/python/packages/claude/pyproject.toml +++ b/python/packages/claude/pyproject.toml @@ -4,7 +4,7 @@ description = "Claude Agent SDK integration for Microsoft Agent Framework." authors = [{ name = "Microsoft", email = "af-support@microsoft.com"}] readme = "README.md" requires-python = ">=3.11" -version = "1.0.0b261030" +version = "1.0.0b261106" license-files = ["LICENSE"] urls.homepage = "https://aka.ms/agent-framework" urls.source = "https://github.com/microsoft/agent-framework/tree/main/python" diff --git a/python/packages/copilotstudio/pyproject.toml b/python/packages/copilotstudio/pyproject.toml index 39a4d113d50..cc5cb0d44eb 100644 --- a/python/packages/copilotstudio/pyproject.toml +++ b/python/packages/copilotstudio/pyproject.toml @@ -4,7 +4,7 @@ description = "Copilot Studio integration for Microsoft Agent Framework." authors = [{ name = "Microsoft", email = "af-support@microsoft.com"}] readme = "README.md" requires-python = ">=3.11" -version = "1.0.0b261030" +version = "1.0.0b261106" license-files = ["LICENSE"] urls.homepage = "https://aka.ms/agent-framework" urls.source = "https://github.com/microsoft/agent-framework/tree/main/python" diff --git a/python/packages/core/pyproject.toml b/python/packages/core/pyproject.toml index d4c2c814d59..187cf3de1d6 100644 --- a/python/packages/core/pyproject.toml +++ b/python/packages/core/pyproject.toml @@ -4,7 +4,7 @@ description = "Microsoft Agent Framework for building AI Agents with Python. Thi authors = [{ name = "Microsoft", email = "af-support@microsoft.com"}] readme = "README.md" requires-python = ">=3.11" -version = "1.24.0" +version = "1.25.0" license-files = ["LICENSE"] urls.homepage = "https://aka.ms/agent-framework" urls.source = "https://github.com/microsoft/agent-framework/tree/main/python" @@ -36,35 +36,35 @@ dependencies = [ all = [ "mcp>=2.2.0,<3", "tenacity>=9.1.4,<9.2.0", - "agent-framework-a2a>=1.0.0b261030,<2", - "agent-framework-ag-ui>=1.7.1,<2", - "agent-framework-anthropic>=1.0.0b261030,<2", - "agent-framework-azure-ai-search>=1.0.0b261030,<2", - "agent-framework-azure-contentunderstanding>=1.0.0b261030,<2", - "agent-framework-azure-cosmos>=1.0.0b261030,<2", + "agent-framework-a2a>=1.0.0b261106,<2", + "agent-framework-ag-ui>=1.8.0,<2", + "agent-framework-anthropic>=1.0.0b261106,<2", + "agent-framework-azure-ai-search>=1.0.0b261106,<2", + "agent-framework-azure-contentunderstanding>=1.0.0b261106,<2", + "agent-framework-azure-cosmos>=1.0.0b261106,<2", "agent-framework-azurefunctions>=1.0.0b260922,<2", - "agent-framework-bedrock>=1.0.0b261030,<2", - "agent-framework-chatkit>=1.0.0b261030,<2", - "agent-framework-claude>=1.0.0b261030,<2", - "agent-framework-copilotstudio>=1.0.0b261030,<2", - "agent-framework-declarative>=1.4.1,<2", - "agent-framework-devui>=1.0.0b261030,<2", + "agent-framework-bedrock>=1.0.0b261106,<2", + "agent-framework-chatkit>=1.0.0b261106,<2", + "agent-framework-claude>=1.0.0b261106,<2", + "agent-framework-copilotstudio>=1.0.0b261106,<2", + "agent-framework-declarative>=1.5.0,<2", + "agent-framework-devui>=1.0.0b261106,<2", "agent-framework-durabletask>=1.0.0b260922,<2", - "agent-framework-foundry>=1.16.0,<2", - "agent-framework-foundry-hosting>=1.0.0b261030,<2", - "agent-framework-foundry-local>=1.0.0b261030,<2; python_version >= '3.11' and python_version < '3.15' and ((sys_platform == 'darwin' and platform_machine == 'arm64') or (sys_platform == 'linux' and (platform_machine == 'x86_64' or platform_machine == 'aarch64')) or (sys_platform == 'win32' and (platform_machine == 'AMD64' or platform_machine == 'ARM64' or platform_machine == 'x86_64' or platform_machine == 'aarch64')))", - "agent-framework-gemini>=1.0.0b261030,<2", - "agent-framework-github-copilot>=2.1.1,<3", - "agent-framework-hyperlight>=1.0.0b261030,<2; (sys_platform == 'linux' and platform_machine == 'x86_64') or (sys_platform == 'win32' and platform_machine == 'AMD64')", - "agent-framework-mem0>=1.0.0b261030,<2", - "agent-framework-mistral>=1.0.0b261030,<2", - "agent-framework-monty>=1.0.0b261030,<2", - "agent-framework-ollama>=1.0.0b261030,<2", - "agent-framework-openai>=1.18.0,<2", - "agent-framework-orchestrations>=1.4.1,<2", - "agent-framework-purview>=1.0.0b261030,<2", - "agent-framework-redis>=1.0.0b261030,<2", - "agent-framework-tools>=1.0.0b261030,<2", + "agent-framework-foundry>=1.16.1,<2", + "agent-framework-foundry-hosting>=1.0.0b261106,<2", + "agent-framework-foundry-local>=1.0.0b261106,<2; python_version >= '3.11' and python_version < '3.15' and ((sys_platform == 'darwin' and platform_machine == 'arm64') or (sys_platform == 'linux' and (platform_machine == 'x86_64' or platform_machine == 'aarch64')) or (sys_platform == 'win32' and (platform_machine == 'AMD64' or platform_machine == 'ARM64' or platform_machine == 'x86_64' or platform_machine == 'aarch64')))", + "agent-framework-gemini>=1.0.0b261106,<2", + "agent-framework-github-copilot>=2.1.2,<3", + "agent-framework-hyperlight>=1.0.0b261106,<2; (sys_platform == 'linux' and platform_machine == 'x86_64') or (sys_platform == 'win32' and platform_machine == 'AMD64')", + "agent-framework-mem0>=1.0.0b261106,<2", + "agent-framework-mistral>=1.0.0b261106,<2", + "agent-framework-monty>=1.0.0b261106,<2", + "agent-framework-ollama>=1.0.0b261106,<2", + "agent-framework-openai>=1.18.1,<2", + "agent-framework-orchestrations>=1.4.2,<2", + "agent-framework-purview>=1.0.0b261106,<2", + "agent-framework-redis>=1.0.0b261106,<2", + "agent-framework-tools>=1.0.0b261106,<2", ] [dependency-groups] diff --git a/python/packages/declarative/pyproject.toml b/python/packages/declarative/pyproject.toml index 346031270ea..11c94508359 100644 --- a/python/packages/declarative/pyproject.toml +++ b/python/packages/declarative/pyproject.toml @@ -4,7 +4,7 @@ description = "Declarative specification support for Microsoft Agent Framework." authors = [{ name = "Microsoft", email = "af-support@microsoft.com"}] readme = "README.md" requires-python = ">=3.11" -version = "1.4.1" +version = "1.5.0" license-files = ["LICENSE"] urls.homepage = "https://aka.ms/agent-framework" urls.source = "https://github.com/microsoft/agent-framework/tree/main/python" @@ -21,7 +21,7 @@ classifiers = [ "Typing :: Typed", ] dependencies = [ - "agent-framework-core>=1.23.0,<2", + "agent-framework-core>=1.25.0,<2", "httpx>=0.27,<0.29", "httpx2>=2.0.0,<3", "powerfx>=0.0.32,<0.0.35; python_version < '3.14'", diff --git a/python/packages/devui/pyproject.toml b/python/packages/devui/pyproject.toml index 33f39563e4a..253a45d9197 100644 --- a/python/packages/devui/pyproject.toml +++ b/python/packages/devui/pyproject.toml @@ -4,7 +4,7 @@ description = "Debug UI for Microsoft Agent Framework with OpenAI-compatible API authors = [{ name = "Microsoft", email = "af-support@microsoft.com"}] readme = "README.md" requires-python = ">=3.11" -version = "1.0.0b261030" +version = "1.0.0b261106" license-files = ["LICENSE"] urls.homepage = "https://github.com/microsoft/agent-framework" urls.source = "https://github.com/microsoft/agent-framework/tree/main/python" @@ -32,12 +32,12 @@ classifiers = [ [project.optional-dependencies] dev = [ - "pytest==9.1.1", + "pytest==9.2.0", "watchdog==6.0.0", "agent-framework-orchestrations>=1.0,<2.0", ] all = [ - "pytest==9.1.1", + "pytest==9.2.0", "watchdog==6.0.0", ] diff --git a/python/packages/duckdb/pyproject.toml b/python/packages/duckdb/pyproject.toml index 2f294bc2c1b..4a171dd9e60 100644 --- a/python/packages/duckdb/pyproject.toml +++ b/python/packages/duckdb/pyproject.toml @@ -4,7 +4,7 @@ description = "DuckDB vector stores for Microsoft Agent Framework." authors = [{ name = "Microsoft", email = "af-support@microsoft.com" }] readme = "README.md" requires-python = ">=3.11" -version = "1.0.0a261030" +version = "1.0.0a261106" license-files = ["LICENSE"] urls.homepage = "https://aka.ms/agent-framework" urls.source = "https://github.com/microsoft/agent-framework/tree/main/python" diff --git a/python/packages/foundry/pyproject.toml b/python/packages/foundry/pyproject.toml index 2106996e498..c7dd653c6dd 100644 --- a/python/packages/foundry/pyproject.toml +++ b/python/packages/foundry/pyproject.toml @@ -4,7 +4,7 @@ description = "Microsoft Foundry integrations for Microsoft Agent Framework." authors = [{ name = "Microsoft", email = "af-support@microsoft.com"}] readme = "README.md" requires-python = ">=3.11" -version = "1.16.0" +version = "1.16.1" license-files = ["LICENSE"] urls.homepage = "https://aka.ms/agent-framework" urls.source = "https://github.com/microsoft/agent-framework/tree/main/python" diff --git a/python/packages/foundry_hosting/pyproject.toml b/python/packages/foundry_hosting/pyproject.toml index c2191c8dfc7..e9a40d543ee 100644 --- a/python/packages/foundry_hosting/pyproject.toml +++ b/python/packages/foundry_hosting/pyproject.toml @@ -4,7 +4,7 @@ description = "Foundry Hosting integration for Microsoft Agent Framework." authors = [{ name = "Microsoft", email = "af-support@microsoft.com"}] readme = "README.md" requires-python = ">=3.11" -version = "1.0.0b261030" +version = "1.0.0b261106" license-files = ["LICENSE"] urls.homepage = "https://aka.ms/agent-framework" urls.source = "https://github.com/microsoft/agent-framework/tree/main/python" @@ -23,7 +23,7 @@ classifiers = [ "Typing :: Typed", ] dependencies = [ - "agent-framework-core>=1.24.0,<2", + "agent-framework-core>=1.25.0,<2", "azure-ai-agentserver-core>=2.1.0,<3", "azure-ai-agentserver-responses>=2.2.0b1,<3", "azure-ai-agentserver-invocations>=1.1.0,<2", diff --git a/python/packages/foundry_local/pyproject.toml b/python/packages/foundry_local/pyproject.toml index c49ffcecb51..f66b3996cef 100644 --- a/python/packages/foundry_local/pyproject.toml +++ b/python/packages/foundry_local/pyproject.toml @@ -4,7 +4,7 @@ description = "Foundry Local integration for Microsoft Agent Framework." authors = [{ name = "Microsoft", email = "af-support@microsoft.com"}] readme = "README.md" requires-python = ">=3.11,<3.15" -version = "1.0.0b261030" +version = "1.0.0b261106" license-files = ["LICENSE"] urls.homepage = "https://aka.ms/agent-framework" urls.source = "https://github.com/microsoft/agent-framework/tree/main/python" diff --git a/python/packages/gemini/pyproject.toml b/python/packages/gemini/pyproject.toml index 1712788dc46..cd84e3f7dbc 100644 --- a/python/packages/gemini/pyproject.toml +++ b/python/packages/gemini/pyproject.toml @@ -4,7 +4,7 @@ description = "Google Gemini integration for Microsoft Agent Framework." authors = [{ name = "Microsoft", email = "af-support@microsoft.com"}] readme = "README.md" requires-python = ">=3.11" -version = "1.0.0b261030" +version = "1.0.0b261106" license-files = ["LICENSE"] urls.homepage = "https://aka.ms/agent-framework" urls.source = "https://github.com/microsoft/agent-framework/tree/main/python" diff --git a/python/packages/github_copilot/pyproject.toml b/python/packages/github_copilot/pyproject.toml index 6f0efded93b..ad23d3d64a3 100644 --- a/python/packages/github_copilot/pyproject.toml +++ b/python/packages/github_copilot/pyproject.toml @@ -4,7 +4,7 @@ description = "GitHub Copilot integration for Microsoft Agent Framework." authors = [{ name = "Microsoft", email = "af-support@microsoft.com"}] readme = "README.md" requires-python = ">=3.11" -version = "2.1.1" +version = "2.1.2" license-files = ["LICENSE"] urls.homepage = "https://aka.ms/agent-framework" urls.source = "https://github.com/microsoft/agent-framework/tree/main/python" diff --git a/python/packages/hosting-a2a/pyproject.toml b/python/packages/hosting-a2a/pyproject.toml index 0799c37b264..f66e92fd8fc 100644 --- a/python/packages/hosting-a2a/pyproject.toml +++ b/python/packages/hosting-a2a/pyproject.toml @@ -4,7 +4,7 @@ description = "A2A conversion helpers for app-owned Agent Framework hosting." authors = [{ name = "Microsoft", email = "af-support@microsoft.com"}] readme = "README.md" requires-python = ">=3.11" -version = "1.0.0a261030" +version = "1.0.0a261106" license-files = ["LICENSE"] urls.homepage = "https://aka.ms/agent-framework" urls.source = "https://github.com/microsoft/agent-framework/tree/main/python" @@ -25,7 +25,7 @@ classifiers = [ dependencies = [ "a2a-sdk>=1.0.0,<2", "agent-framework-core>=1.22.0,<2", - "agent-framework-hosting==1.0.0a261030", + "agent-framework-hosting==1.0.0a261106", ] [tool.uv] diff --git a/python/packages/hosting-mcp/pyproject.toml b/python/packages/hosting-mcp/pyproject.toml index cb3cc23f5e8..2a834c28775 100644 --- a/python/packages/hosting-mcp/pyproject.toml +++ b/python/packages/hosting-mcp/pyproject.toml @@ -4,7 +4,7 @@ description = "Agent and workflow MCP tool adapters for app-owned hosting." authors = [{ name = "Microsoft", email = "af-support@microsoft.com"}] readme = "README.md" requires-python = ">=3.11" -version = "1.0.0a261030" +version = "1.0.0a261106" license-files = ["LICENSE"] urls.homepage = "https://aka.ms/agent-framework" urls.source = "https://github.com/microsoft/agent-framework/tree/main/python" @@ -24,7 +24,7 @@ classifiers = [ ] dependencies = [ "agent-framework-core>=1.19.0,<2", - "agent-framework-hosting==1.0.0a261030", + "agent-framework-hosting==1.0.0a261106", "jsonschema>=4.20.0,<5", "mcp>=2.2.0,<3", "pydantic>=2,<3", diff --git a/python/packages/hosting-responses/pyproject.toml b/python/packages/hosting-responses/pyproject.toml index 4fb41493442..4c47a1b4358 100644 --- a/python/packages/hosting-responses/pyproject.toml +++ b/python/packages/hosting-responses/pyproject.toml @@ -4,7 +4,7 @@ description = "OpenAI Responses-shaped helpers for agent-framework-hosting." authors = [{ name = "Microsoft", email = "af-support@microsoft.com"}] readme = "README.md" requires-python = ">=3.11" -version = "1.0.0a261030" +version = "1.0.0a261106" license-files = ["LICENSE"] urls.homepage = "https://aka.ms/agent-framework" urls.source = "https://github.com/microsoft/agent-framework/tree/main/python" @@ -24,7 +24,7 @@ classifiers = [ ] dependencies = [ "agent-framework-core>=1.22.0,<2", - "agent-framework-hosting==1.0.0a261030", + "agent-framework-hosting==1.0.0a261106", "openai>=1.99.0,<4", ] diff --git a/python/packages/hosting-telegram/pyproject.toml b/python/packages/hosting-telegram/pyproject.toml index fd16f1e02ed..497d208fbb9 100644 --- a/python/packages/hosting-telegram/pyproject.toml +++ b/python/packages/hosting-telegram/pyproject.toml @@ -4,7 +4,7 @@ description = "Telegram Bot API-shaped helpers for agent-framework-hosting." authors = [{ name = "Microsoft", email = "af-support@microsoft.com"}] readme = "README.md" requires-python = ">=3.11" -version = "1.0.0a261030" +version = "1.0.0a261106" license-files = ["LICENSE"] urls.homepage = "https://aka.ms/agent-framework" urls.source = "https://github.com/microsoft/agent-framework/tree/main/python" @@ -24,7 +24,7 @@ classifiers = [ ] dependencies = [ "agent-framework-core>=1.13.0,<2", - "agent-framework-hosting==1.0.0a261030", + "agent-framework-hosting==1.0.0a261106", ] [tool.uv] diff --git a/python/packages/hosting/pyproject.toml b/python/packages/hosting/pyproject.toml index 782e575ce52..27e2ed361fa 100644 --- a/python/packages/hosting/pyproject.toml +++ b/python/packages/hosting/pyproject.toml @@ -4,7 +4,7 @@ description = "Execution-state helpers for app-owned Agent Framework hosting rou authors = [{ name = "Microsoft", email = "af-support@microsoft.com"}] readme = "README.md" requires-python = ">=3.11" -version = "1.0.0a261030" +version = "1.0.0a261106" license-files = ["LICENSE"] urls.homepage = "https://aka.ms/agent-framework" urls.source = "https://github.com/microsoft/agent-framework/tree/main/python" diff --git a/python/packages/hyperlight/pyproject.toml b/python/packages/hyperlight/pyproject.toml index d229a3a6616..8cd17c2d765 100644 --- a/python/packages/hyperlight/pyproject.toml +++ b/python/packages/hyperlight/pyproject.toml @@ -4,7 +4,7 @@ description = "Hyperlight CodeAct integrations for Microsoft Agent Framework." authors = [{ name = "Microsoft", email = "af-support@microsoft.com"}] readme = "README.md" requires-python = ">=3.11" -version = "1.0.0b261030" +version = "1.0.0b261106" license-files = ["LICENSE"] urls.homepage = "https://aka.ms/agent-framework" urls.source = "https://github.com/microsoft/agent-framework/tree/main/python" diff --git a/python/packages/lab/uv.lock b/python/packages/lab/uv.lock index de20b5724d0..69b53c7e647 100644 --- a/python/packages/lab/uv.lock +++ b/python/packages/lab/uv.lock @@ -3757,11 +3757,11 @@ wheels = [ [[package]] name = "oauthlib" -version = "4.0.0" +version = "4.0.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/7a/d8/a1bcc8ba112a627f8ffbdc212a78ce18d3ac07e91a5ca65d27918eee25a1/oauthlib-4.0.0.tar.gz", hash = "sha256:efb274799819440f95b4ab3b818869f1ce9ae26c5beacba0201d1a1b76b54f86", size = 187232, upload-time = "2026-09-28T06:01:18.77Z" } +sdist = { url = "https://files.pythonhosted.org/packages/33/17/2bb072de0b990303c985f26869fd47bb179024a051f47e7f9d208eb92f8e/oauthlib-4.0.1.tar.gz", hash = "sha256:3d73febdb6faa00f277c81fb04be7b7586fb96fc3b7f0b9c772dada69a25ede7", size = 191219, upload-time = "2026-10-31T09:52:58.008Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d9/f4/78229a1066068ca14fc60fb26cf7381cabe4382261392b90e5f9552722d4/oauthlib-4.0.0-py3-none-any.whl", hash = "sha256:624c28c13a0a59cabf9747dfa52af63be3e512a7f2714df16e91b5b3a145e6cd", size = 159715, upload-time = "2026-09-28T06:01:17.008Z" }, + { url = "https://files.pythonhosted.org/packages/df/ef/3b8adde1b32a6f540758bff734d3442c621734c83708e5f02b0ba2f43b84/oauthlib-4.0.1-py3-none-any.whl", hash = "sha256:498a298876e996301950a5b053d12c31628bb7b895db03666430c69ce182eb61", size = 161934, upload-time = "2026-10-31T09:52:56.206Z" }, ] [[package]] diff --git a/python/packages/mem0/pyproject.toml b/python/packages/mem0/pyproject.toml index 2cdde07f1b5..c1b8a71d230 100644 --- a/python/packages/mem0/pyproject.toml +++ b/python/packages/mem0/pyproject.toml @@ -4,7 +4,7 @@ description = "Mem0 integration for Microsoft Agent Framework." authors = [{ name = "Microsoft", email = "af-support@microsoft.com"}] readme = "README.md" requires-python = ">=3.11" -version = "1.0.0b261030" +version = "1.0.0b261106" license-files = ["LICENSE"] urls.homepage = "https://aka.ms/agent-framework" urls.source = "https://github.com/microsoft/agent-framework/tree/main/python" diff --git a/python/packages/mistral/pyproject.toml b/python/packages/mistral/pyproject.toml index e8e0f986b63..eee4de207ed 100644 --- a/python/packages/mistral/pyproject.toml +++ b/python/packages/mistral/pyproject.toml @@ -4,7 +4,7 @@ description = "Mistral AI integration for Microsoft Agent Framework." authors = [{ name = "Microsoft", email = "af-support@microsoft.com"}] readme = "README.md" requires-python = ">=3.11" -version = "1.0.0b261030" +version = "1.0.0b261106" license-files = ["LICENSE"] urls.homepage = "https://learn.microsoft.com/en-us/agent-framework/" urls.source = "https://github.com/microsoft/agent-framework/tree/main/python" diff --git a/python/packages/mongodb/pyproject.toml b/python/packages/mongodb/pyproject.toml index dffab1ec755..6f43b46197c 100644 --- a/python/packages/mongodb/pyproject.toml +++ b/python/packages/mongodb/pyproject.toml @@ -4,7 +4,7 @@ description = "MongoDB vector stores for Microsoft Agent Framework." authors = [{ name = "Microsoft", email = "af-support@microsoft.com" }] readme = "README.md" requires-python = ">=3.11" -version = "1.0.0a261030" +version = "1.0.0a261106" license-files = ["LICENSE"] urls.homepage = "https://aka.ms/agent-framework" urls.source = "https://github.com/microsoft/agent-framework/tree/main/python" diff --git a/python/packages/monty/pyproject.toml b/python/packages/monty/pyproject.toml index 46c80fffbf8..6e838ae1393 100644 --- a/python/packages/monty/pyproject.toml +++ b/python/packages/monty/pyproject.toml @@ -4,7 +4,7 @@ description = "Monty CodeAct integrations for Microsoft Agent Framework." authors = [{ name = "Microsoft", email = "af-support@microsoft.com"}] readme = "README.md" requires-python = ">=3.11" -version = "1.0.0b261030" +version = "1.0.0b261106" license-files = ["LICENSE"] urls.homepage = "https://aka.ms/agent-framework" urls.source = "https://github.com/microsoft/agent-framework/tree/main/python" diff --git a/python/packages/nvidia/pyproject.toml b/python/packages/nvidia/pyproject.toml index 948c4026152..1b6d5205f24 100644 --- a/python/packages/nvidia/pyproject.toml +++ b/python/packages/nvidia/pyproject.toml @@ -4,7 +4,7 @@ description = "NVIDIA Integrations for Microsoft Agent Framework." authors = [{ name = "Microsoft", email = "af-support@microsoft.com" }] readme = "README.md" requires-python = ">=3.11" -version = "1.0.0a261030" +version = "1.0.0a261106" license-files = ["LICENSE"] urls.homepage = "https://aka.ms/agent-framework" urls.source = "https://github.com/microsoft/agent-framework/tree/main/python" diff --git a/python/packages/ollama/pyproject.toml b/python/packages/ollama/pyproject.toml index b40418a90f7..ca88cf6e5ee 100644 --- a/python/packages/ollama/pyproject.toml +++ b/python/packages/ollama/pyproject.toml @@ -4,7 +4,7 @@ description = "Ollama integration for Microsoft Agent Framework." authors = [{ name = "Microsoft", email = "af-support@microsoft.com"}] readme = "README.md" requires-python = ">=3.11" -version = "1.0.0b261030" +version = "1.0.0b261106" license-files = ["LICENSE"] urls.homepage = "https://learn.microsoft.com/en-us/agent-framework/" urls.source = "https://github.com/microsoft/agent-framework/tree/main/python" diff --git a/python/packages/openai/pyproject.toml b/python/packages/openai/pyproject.toml index af5f9ebb14b..155da7b477b 100644 --- a/python/packages/openai/pyproject.toml +++ b/python/packages/openai/pyproject.toml @@ -4,7 +4,7 @@ description = "OpenAI integrations for Microsoft Agent Framework." authors = [{ name = "Microsoft", email = "af-support@microsoft.com"}] readme = "README.md" requires-python = ">=3.11" -version = "1.18.0" +version = "1.18.1" license-files = ["LICENSE"] urls.homepage = "https://aka.ms/agent-framework" urls.source = "https://github.com/microsoft/agent-framework/tree/main/python" @@ -23,7 +23,7 @@ classifiers = [ "Typing :: Typed", ] dependencies = [ - "agent-framework-core>=1.24.0,<2", + "agent-framework-core>=1.25.0,<2", "openai>=2.25.0,<4", ] diff --git a/python/packages/oracle/pyproject.toml b/python/packages/oracle/pyproject.toml index 6e679001b49..1b6c7682346 100644 --- a/python/packages/oracle/pyproject.toml +++ b/python/packages/oracle/pyproject.toml @@ -4,7 +4,7 @@ description = "Oracle AI Database native vector stores for Microsoft Agent Frame authors = [{ name = "Microsoft", email = "af-support@microsoft.com" }] readme = "README.md" requires-python = ">=3.11" -version = "1.0.0a261030" +version = "1.0.0a261106" license-files = ["LICENSE"] urls.homepage = "https://aka.ms/agent-framework" urls.source = "https://github.com/microsoft/agent-framework/tree/main/python" diff --git a/python/packages/orchestrations/pyproject.toml b/python/packages/orchestrations/pyproject.toml index 352d240ec1e..8b4a9ee316e 100644 --- a/python/packages/orchestrations/pyproject.toml +++ b/python/packages/orchestrations/pyproject.toml @@ -4,7 +4,7 @@ description = "Orchestration patterns for Microsoft Agent Framework. Includes Se authors = [{ name = "Microsoft", email = "af-support@microsoft.com"}] readme = "README.md" requires-python = ">=3.11" -version = "1.4.1" +version = "1.4.2" license-files = ["LICENSE"] urls.homepage = "https://aka.ms/agent-framework" urls.source = "https://github.com/microsoft/agent-framework/tree/main/python" diff --git a/python/packages/postgres/pyproject.toml b/python/packages/postgres/pyproject.toml index 3815ce96918..bf707d1fb63 100644 --- a/python/packages/postgres/pyproject.toml +++ b/python/packages/postgres/pyproject.toml @@ -4,7 +4,7 @@ description = "PostgreSQL and pgvector integration for Microsoft Agent Framework authors = [{ name = "Microsoft", email = "af-support@microsoft.com" }] readme = "README.md" requires-python = ">=3.11" -version = "1.0.0a261030" +version = "1.0.0a261106" license-files = ["LICENSE"] urls.homepage = "https://aka.ms/agent-framework" urls.source = "https://github.com/microsoft/agent-framework/tree/main/python" diff --git a/python/packages/purview/pyproject.toml b/python/packages/purview/pyproject.toml index cfa8d5eb4ea..872398bb468 100644 --- a/python/packages/purview/pyproject.toml +++ b/python/packages/purview/pyproject.toml @@ -4,7 +4,7 @@ description = "Microsoft Purview (Graph dataSecurityAndGovernance) integration f authors = [{ name = "Microsoft", email = "af-support@microsoft.com"}] readme = "README.md" requires-python = ">=3.11" -version = "1.0.0b261030" +version = "1.0.0b261106" license-files = ["LICENSE"] urls.homepage = "https://github.com/microsoft/agent-framework" urls.source = "https://github.com/microsoft/agent-framework/tree/main/python" diff --git a/python/packages/qdrant/pyproject.toml b/python/packages/qdrant/pyproject.toml index e065235db92..82633af7782 100644 --- a/python/packages/qdrant/pyproject.toml +++ b/python/packages/qdrant/pyproject.toml @@ -4,7 +4,7 @@ description = "Qdrant vector stores for Microsoft Agent Framework." authors = [{ name = "Microsoft", email = "af-support@microsoft.com" }] readme = "README.md" requires-python = ">=3.11" -version = "1.0.0a261030" +version = "1.0.0a261106" license-files = ["LICENSE"] urls.homepage = "https://aka.ms/agent-framework" urls.source = "https://github.com/microsoft/agent-framework/tree/main/python" diff --git a/python/packages/redis/pyproject.toml b/python/packages/redis/pyproject.toml index d10faab076d..50b869942b0 100644 --- a/python/packages/redis/pyproject.toml +++ b/python/packages/redis/pyproject.toml @@ -4,7 +4,7 @@ description = "Redis integration for Microsoft Agent Framework." authors = [{ name = "Microsoft", email = "af-support@microsoft.com"}] readme = "README.md" requires-python = ">=3.11" -version = "1.0.0b261030" +version = "1.0.0b261106" license-files = ["LICENSE"] urls.homepage = "https://aka.ms/agent-framework" urls.source = "https://github.com/microsoft/agent-framework/tree/main/python" diff --git a/python/packages/sql-server/pyproject.toml b/python/packages/sql-server/pyproject.toml index 64900d93309..6ec70909b18 100644 --- a/python/packages/sql-server/pyproject.toml +++ b/python/packages/sql-server/pyproject.toml @@ -4,7 +4,7 @@ description = "SQL Server native vector integration for Microsoft Agent Framewor authors = [{ name = "Microsoft", email = "af-support@microsoft.com" }] readme = "README.md" requires-python = ">=3.11" -version = "1.0.0a261030" +version = "1.0.0a261106" license-files = ["LICENSE"] urls.homepage = "https://aka.ms/agent-framework" urls.source = "https://github.com/microsoft/agent-framework/tree/main/python" diff --git a/python/packages/tools/pyproject.toml b/python/packages/tools/pyproject.toml index 301302078cd..d22a4b2f09c 100644 --- a/python/packages/tools/pyproject.toml +++ b/python/packages/tools/pyproject.toml @@ -4,7 +4,7 @@ description = "Built-in tools for the Microsoft Agent Framework (local shell, an authors = [{ name = "Microsoft", email = "af-support@microsoft.com"}] readme = "README.md" requires-python = ">=3.11" -version = "1.0.0b261030" +version = "1.0.0b261106" license-files = ["LICENSE"] urls.homepage = "https://aka.ms/agent-framework" urls.source = "https://github.com/microsoft/agent-framework/tree/main/python" diff --git a/python/packages/typesafe/pyproject.toml b/python/packages/typesafe/pyproject.toml index 325f80be25c..035e08aa501 100644 --- a/python/packages/typesafe/pyproject.toml +++ b/python/packages/typesafe/pyproject.toml @@ -4,7 +4,7 @@ description = "TypeSafe AI integration for Microsoft Agent Framework." authors = [{ name = "Microsoft", email = "af-support@microsoft.com" }] readme = "README.md" requires-python = ">=3.11" -version = "1.0.0a261030" +version = "1.0.0a261106" license-files = ["LICENSE"] urls.homepage = "https://aka.ms/agent-framework" urls.source = "https://github.com/microsoft/agent-framework/tree/main/python" diff --git a/python/pyproject.toml b/python/pyproject.toml index fda326ba5c8..b00147c68ca 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -4,7 +4,7 @@ description = "Microsoft Agent Framework for building AI Agents with Python. Thi authors = [{ name = "Microsoft", email = "af-support@microsoft.com"}] readme = "README.md" requires-python = ">=3.11" -version = "1.24.0" +version = "1.25.0" license-files = ["LICENSE"] urls.homepage = "https://aka.ms/agent-framework" urls.source = "https://github.com/microsoft/agent-framework/tree/main/python" @@ -23,13 +23,13 @@ classifiers = [ "Typing :: Typed", ] dependencies = [ - "agent-framework-core[all]==1.24.0", + "agent-framework-core[all]==1.25.0", ] [dependency-groups] dev = [ "uv==0.13.5", - "pytest==9.1.1", + "pytest==9.2.0", "pytest-asyncio==1.4.1", "pytest-cov==7.1.0", "pytest-xdist[psutil]==3.8.0", diff --git a/python/samples/04-hosting/foundry-hosted-agents/invocations/telegram/uv.lock b/python/samples/04-hosting/foundry-hosted-agents/invocations/telegram/uv.lock index dcbf8fc2ec4..ab2375a0b8f 100644 --- a/python/samples/04-hosting/foundry-hosted-agents/invocations/telegram/uv.lock +++ b/python/samples/04-hosting/foundry-hosted-agents/invocations/telegram/uv.lock @@ -1037,11 +1037,11 @@ wheels = [ [[package]] name = "oauthlib" -version = "4.0.0" +version = "4.0.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/7a/d8/a1bcc8ba112a627f8ffbdc212a78ce18d3ac07e91a5ca65d27918eee25a1/oauthlib-4.0.0.tar.gz", hash = "sha256:efb274799819440f95b4ab3b818869f1ce9ae26c5beacba0201d1a1b76b54f86", size = 187232, upload-time = "2026-09-28T06:01:18.77Z" } +sdist = { url = "https://files.pythonhosted.org/packages/33/17/2bb072de0b990303c985f26869fd47bb179024a051f47e7f9d208eb92f8e/oauthlib-4.0.1.tar.gz", hash = "sha256:3d73febdb6faa00f277c81fb04be7b7586fb96fc3b7f0b9c772dada69a25ede7", size = 191219, upload-time = "2026-10-31T09:52:58.008Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d9/f4/78229a1066068ca14fc60fb26cf7381cabe4382261392b90e5f9552722d4/oauthlib-4.0.0-py3-none-any.whl", hash = "sha256:624c28c13a0a59cabf9747dfa52af63be3e512a7f2714df16e91b5b3a145e6cd", size = 159715, upload-time = "2026-09-28T06:01:17.008Z" }, + { url = "https://files.pythonhosted.org/packages/df/ef/3b8adde1b32a6f540758bff734d3442c621734c83708e5f02b0ba2f43b84/oauthlib-4.0.1-py3-none-any.whl", hash = "sha256:498a298876e996301950a5b053d12c31628bb7b895db03666430c69ce182eb61", size = 161934, upload-time = "2026-10-31T09:52:56.206Z" }, ] [[package]] diff --git a/python/tooling/requirements-typing.txt b/python/tooling/requirements-typing.txt index a4999b9a445..ed27f34d800 100644 --- a/python/tooling/requirements-typing.txt +++ b/python/tooling/requirements-typing.txt @@ -1,5 +1,5 @@ mypy==2.4.1 pyrefly==1.4.0 pyright==1.1.414 -ty==0.0.94 -zuban==0.10.1 +ty==0.0.95 +zuban==0.10.2 diff --git a/python/uv.lock b/python/uv.lock index 3ee4848c659..732b31233d2 100644 --- a/python/uv.lock +++ b/python/uv.lock @@ -117,7 +117,7 @@ wheels = [ [[package]] name = "agent-framework" -version = "1.24.0" +version = "1.25.0" source = { virtual = "." } dependencies = [ { name = "agent-framework-core", extra = ["all"] }, @@ -159,7 +159,7 @@ dev = [ { name = "mcp" }, { name = "opentelemetry-sdk" }, { name = "poethepoet", specifier = "==0.49.0" }, - { name = "pytest", specifier = "==9.1.1" }, + { name = "pytest", specifier = "==9.2.0" }, { name = "pytest-asyncio", specifier = "==1.4.1" }, { name = "pytest-cov", specifier = "==7.1.0" }, { name = "pytest-retry", specifier = "==1.7.0" }, @@ -176,7 +176,7 @@ tool-runtime = [ [[package]] name = "agent-framework-a2a" -version = "1.0.0b261030" +version = "1.0.0b261106" source = { editable = "packages/a2a" } dependencies = [ { name = "a2a-sdk" }, @@ -199,7 +199,7 @@ test = [{ name = "agent-framework-orchestrations", editable = "packages/orchestr [[package]] name = "agent-framework-ag-ui" -version = "1.7.1" +version = "1.8.0" source = { editable = "packages/ag-ui" } dependencies = [ { name = "ag-ui-protocol" }, @@ -230,7 +230,7 @@ requires-dist = [ { name = "agent-framework-core", editable = "packages/core" }, { name = "fastapi", specifier = ">=0.121.0,<0.163.0" }, { name = "httpx", specifier = ">=0.28.1,<1" }, - { name = "pytest", marker = "extra == 'dev'", specifier = "==9.1.1" }, + { name = "pytest", marker = "extra == 'dev'", specifier = "==9.2.0" }, { name = "sse-starlette", specifier = ">=3.4.5,<4" }, { name = "uvicorn", extras = ["standard"], specifier = ">=0.30.0,<1" }, ] @@ -241,7 +241,7 @@ test = [{ name = "agent-framework-orchestrations", editable = "packages/orchestr [[package]] name = "agent-framework-anthropic" -version = "1.0.0b261030" +version = "1.0.0b261106" source = { editable = "packages/anthropic" } dependencies = [ { name = "agent-framework-core" }, @@ -268,7 +268,7 @@ dev = [ [[package]] name = "agent-framework-azure-ai-search" -version = "1.0.0b261030" +version = "1.0.0b261106" source = { editable = "packages/azure-ai-search" } dependencies = [ { name = "agent-framework-core" }, @@ -285,7 +285,7 @@ requires-dist = [ [[package]] name = "agent-framework-azure-contentunderstanding" -version = "1.0.0b261030" +version = "1.0.0b261106" source = { editable = "packages/azure-contentunderstanding" } dependencies = [ { name = "agent-framework-core" }, @@ -306,7 +306,7 @@ requires-dist = [ [[package]] name = "agent-framework-azure-cosmos" -version = "1.0.0b261030" +version = "1.0.0b261106" source = { editable = "packages/azure-cosmos" } dependencies = [ { name = "agent-framework-core" }, @@ -323,7 +323,7 @@ requires-dist = [ [[package]] name = "agent-framework-azure-cosmos-memory" -version = "1.0.0a261022" +version = "1.0.0a261106" source = { editable = "packages/azure-cosmos-memory" } dependencies = [ { name = "agent-framework-core" }, @@ -354,7 +354,7 @@ dev = [ [[package]] name = "agent-framework-azure-documentdb" -version = "1.0.0a261030" +version = "1.0.0a261106" source = { editable = "packages/azure-documentdb" } dependencies = [ { name = "agent-framework-core" }, @@ -384,7 +384,7 @@ wheels = [ [[package]] name = "agent-framework-bedrock" -version = "1.0.0b261030" +version = "1.0.0b261106" source = { editable = "packages/bedrock" } dependencies = [ { name = "agent-framework-core" }, @@ -401,7 +401,7 @@ requires-dist = [ [[package]] name = "agent-framework-chatkit" -version = "1.0.0b261030" +version = "1.0.0b261106" source = { editable = "packages/chatkit" } dependencies = [ { name = "agent-framework-core" }, @@ -416,7 +416,7 @@ requires-dist = [ [[package]] name = "agent-framework-claude" -version = "1.0.0b261030" +version = "1.0.0b261106" source = { editable = "packages/claude" } dependencies = [ { name = "agent-framework-core" }, @@ -431,7 +431,7 @@ requires-dist = [ [[package]] name = "agent-framework-copilotstudio" -version = "1.0.0b261030" +version = "1.0.0b261106" source = { editable = "packages/copilotstudio" } dependencies = [ { name = "agent-framework-core" }, @@ -450,7 +450,7 @@ requires-dist = [ [[package]] name = "agent-framework-core" -version = "1.24.0" +version = "1.25.0" source = { editable = "packages/core" } dependencies = [ { name = "msgspec" }, @@ -572,7 +572,7 @@ test = [ [[package]] name = "agent-framework-declarative" -version = "1.4.1" +version = "1.5.0" source = { editable = "packages/declarative" } dependencies = [ { name = "agent-framework-core" }, @@ -605,7 +605,7 @@ test = [{ name = "tenacity", specifier = ">=9.1.4,<9.2.0" }] [[package]] name = "agent-framework-devui" -version = "1.0.0b261030" +version = "1.0.0b261106" source = { editable = "packages/devui" } dependencies = [ { name = "agent-framework-core" }, @@ -633,8 +633,8 @@ requires-dist = [ { name = "fastapi", specifier = ">=0.115.0,<0.163.0" }, { name = "openai", specifier = ">=2.45.0,<4" }, { name = "opentelemetry-sdk", specifier = ">=1.39.0,<2" }, - { name = "pytest", marker = "extra == 'all'", specifier = "==9.1.1" }, - { name = "pytest", marker = "extra == 'dev'", specifier = "==9.1.1" }, + { name = "pytest", marker = "extra == 'all'", specifier = "==9.2.0" }, + { name = "pytest", marker = "extra == 'dev'", specifier = "==9.2.0" }, { name = "uvicorn", extras = ["standard"], specifier = ">=0.30.0,<1" }, { name = "watchdog", marker = "extra == 'all'", specifier = "==6.0.0" }, { name = "watchdog", marker = "extra == 'dev'", specifier = "==6.0.0" }, @@ -643,7 +643,7 @@ provides-extras = ["dev", "all"] [[package]] name = "agent-framework-duckdb" -version = "1.0.0a261030" +version = "1.0.0a261106" source = { editable = "packages/duckdb" } dependencies = [ { name = "agent-framework-core" }, @@ -676,7 +676,7 @@ wheels = [ [[package]] name = "agent-framework-foundry" -version = "1.16.0" +version = "1.16.1" source = { editable = "packages/foundry" } dependencies = [ { name = "agent-framework-core" }, @@ -707,7 +707,7 @@ test = [{ name = "agent-framework-ag-ui", editable = "packages/ag-ui" }] [[package]] name = "agent-framework-foundry-hosting" -version = "1.0.0b261030" +version = "1.0.0b261106" source = { editable = "packages/foundry_hosting" } dependencies = [ { name = "agent-framework-core" }, @@ -746,7 +746,7 @@ test = [ [[package]] name = "agent-framework-foundry-local" -version = "1.0.0b261030" +version = "1.0.0b261106" source = { editable = "packages/foundry_local" } dependencies = [ { name = "agent-framework-core" }, @@ -763,7 +763,7 @@ requires-dist = [ [[package]] name = "agent-framework-gemini" -version = "1.0.0b261030" +version = "1.0.0b261106" source = { editable = "packages/gemini" } dependencies = [ { name = "agent-framework-core" }, @@ -778,7 +778,7 @@ requires-dist = [ [[package]] name = "agent-framework-github-copilot" -version = "2.1.1" +version = "2.1.2" source = { editable = "packages/github_copilot" } dependencies = [ { name = "agent-framework-core" }, @@ -793,7 +793,7 @@ requires-dist = [ [[package]] name = "agent-framework-hosting" -version = "1.0.0a261030" +version = "1.0.0a261106" source = { editable = "packages/hosting" } dependencies = [ { name = "agent-framework-core" }, @@ -804,7 +804,7 @@ requires-dist = [{ name = "agent-framework-core", editable = "packages/core" }] [[package]] name = "agent-framework-hosting-a2a" -version = "1.0.0a261030" +version = "1.0.0a261106" source = { editable = "packages/hosting-a2a" } dependencies = [ { name = "a2a-sdk" }, @@ -821,7 +821,7 @@ requires-dist = [ [[package]] name = "agent-framework-hosting-mcp" -version = "1.0.0a261030" +version = "1.0.0a261106" source = { editable = "packages/hosting-mcp" } dependencies = [ { name = "agent-framework-core" }, @@ -842,7 +842,7 @@ requires-dist = [ [[package]] name = "agent-framework-hosting-responses" -version = "1.0.0a261030" +version = "1.0.0a261106" source = { editable = "packages/hosting-responses" } dependencies = [ { name = "agent-framework-core" }, @@ -871,7 +871,7 @@ test = [ [[package]] name = "agent-framework-hosting-telegram" -version = "1.0.0a261030" +version = "1.0.0a261106" source = { editable = "packages/hosting-telegram" } dependencies = [ { name = "agent-framework-core" }, @@ -886,7 +886,7 @@ requires-dist = [ [[package]] name = "agent-framework-hyperlight" -version = "1.0.0b261030" +version = "1.0.0b261106" source = { editable = "packages/hyperlight" } dependencies = [ { name = "agent-framework-core" }, @@ -905,7 +905,7 @@ requires-dist = [ [[package]] name = "agent-framework-mem0" -version = "1.0.0b261030" +version = "1.0.0b261106" source = { editable = "packages/mem0" } dependencies = [ { name = "agent-framework-core" }, @@ -920,7 +920,7 @@ requires-dist = [ [[package]] name = "agent-framework-mistral" -version = "1.0.0b261030" +version = "1.0.0b261106" source = { editable = "packages/mistral" } dependencies = [ { name = "agent-framework-core" }, @@ -935,7 +935,7 @@ requires-dist = [ [[package]] name = "agent-framework-mongodb" -version = "1.0.0a261030" +version = "1.0.0a261106" source = { editable = "packages/mongodb" } dependencies = [ { name = "agent-framework-core" }, @@ -950,7 +950,7 @@ requires-dist = [ [[package]] name = "agent-framework-monty" -version = "1.0.0b261030" +version = "1.0.0b261106" source = { editable = "packages/monty" } dependencies = [ { name = "agent-framework-core" }, @@ -965,7 +965,7 @@ requires-dist = [ [[package]] name = "agent-framework-nvidia" -version = "1.0.0a261030" +version = "1.0.0a261106" source = { editable = "packages/nvidia" } dependencies = [ { name = "agent-framework-core" }, @@ -992,7 +992,7 @@ test = [ [[package]] name = "agent-framework-ollama" -version = "1.0.0b261030" +version = "1.0.0b261106" source = { editable = "packages/ollama" } dependencies = [ { name = "agent-framework-core" }, @@ -1015,7 +1015,7 @@ test = [{ name = "openai", specifier = ">=2.25.0,<4" }] [[package]] name = "agent-framework-openai" -version = "1.18.0" +version = "1.18.1" source = { editable = "packages/openai" } dependencies = [ { name = "agent-framework-core" }, @@ -1038,7 +1038,7 @@ test = [{ name = "agent-framework-ag-ui", editable = "packages/ag-ui" }] [[package]] name = "agent-framework-oracle" -version = "1.0.0a261030" +version = "1.0.0a261106" source = { editable = "packages/oracle" } dependencies = [ { name = "agent-framework-core" }, @@ -1053,7 +1053,7 @@ requires-dist = [ [[package]] name = "agent-framework-orchestrations" -version = "1.4.1" +version = "1.4.2" source = { editable = "packages/orchestrations" } dependencies = [ { name = "agent-framework-core" }, @@ -1064,7 +1064,7 @@ requires-dist = [{ name = "agent-framework-core", editable = "packages/core" }] [[package]] name = "agent-framework-postgres" -version = "1.0.0a261030" +version = "1.0.0a261106" source = { editable = "packages/postgres" } dependencies = [ { name = "agent-framework-core" }, @@ -1082,7 +1082,7 @@ requires-dist = [ [[package]] name = "agent-framework-purview" -version = "1.0.0b261030" +version = "1.0.0b261106" source = { editable = "packages/purview" } dependencies = [ { name = "agent-framework-core" }, @@ -1099,7 +1099,7 @@ requires-dist = [ [[package]] name = "agent-framework-qdrant" -version = "1.0.0a261030" +version = "1.0.0a261106" source = { editable = "packages/qdrant" } dependencies = [ { name = "agent-framework-core" }, @@ -1114,7 +1114,7 @@ requires-dist = [ [[package]] name = "agent-framework-redis" -version = "1.0.0b261030" +version = "1.0.0b261106" source = { editable = "packages/redis" } dependencies = [ { name = "agent-framework-core" }, @@ -1134,7 +1134,7 @@ requires-dist = [ [[package]] name = "agent-framework-sql-server" -version = "1.0.0a261030" +version = "1.0.0a261106" source = { editable = "packages/sql-server" } dependencies = [ { name = "agent-framework-core" }, @@ -1149,7 +1149,7 @@ requires-dist = [ [[package]] name = "agent-framework-tools" -version = "1.0.0b261030" +version = "1.0.0b261106" source = { editable = "packages/tools" } dependencies = [ { name = "agent-framework-core" }, @@ -1164,7 +1164,7 @@ requires-dist = [ [[package]] name = "agent-framework-typesafe" -version = "1.0.0a261030" +version = "1.0.0a261106" source = { editable = "packages/typesafe" } dependencies = [ { name = "agent-framework-core" }, @@ -5001,7 +5001,7 @@ wheels = [ [[package]] name = "pytest" -version = "9.1.1" +version = "9.2.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, @@ -5010,9 +5010,9 @@ dependencies = [ { name = "pluggy" }, { name = "pygments" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e4/47/b9efed96c114afcfa3c9d3fe98a76a1d14c74a9e266d397cf6eb64be5e01/pytest-9.1.1.tar.gz", hash = "sha256:1088fbde8f2b49d95a549a195707afa7a76a3ce9bcadc26b6d71f0ffda5fe313", size = 1636369, upload-time = "2026-06-19T10:58:32.857Z" } +sdist = { url = "https://files.pythonhosted.org/packages/79/42/bb4641652e58dedeac2ec51abc1f8cae4fee4ec63899a0999016229a0f2a/pytest-9.2.0.tar.gz", hash = "sha256:97c4f3b1f3c7414aa36465e09b8220f1d03627993bd51b1282e193753c80557b", size = 1797555, upload-time = "2026-10-27T21:30:20.728Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/24/25/1de2678b631f5a49215c6c96fff41ba892b0a34df68d6d80292b1b48aa7f/pytest-9.1.1-py3-none-any.whl", hash = "sha256:37a86b45efb9a47a61a36449063e8e18d0cab3161329fc099eb21783169c4f0c", size = 386536, upload-time = "2026-06-19T10:58:31.347Z" }, + { url = "https://files.pythonhosted.org/packages/51/39/1f5d8c8877a0fa327db959c19341d4be61660de1ab6b7391f9eb805bcd67/pytest-9.2.0-py3-none-any.whl", hash = "sha256:07acdcf88ec174f907dc01af70bf52d49b014bbab03faeeade31c96b18c2e588", size = 411776, upload-time = "2026-10-27T21:30:19.131Z" }, ] [[package]] From 0d6af3f9bb2a766a70721c52b460e6c4cf447064 Mon Sep 17 00:00:00 2001 From: eavanvalkenburg Date: Fri, 6 Nov 2026 16:06:22 +0100 Subject: [PATCH 2/4] Fix SQL Server cancellation test exception-info narrowing --- .../packages/sql-server/tests/sql_server/test_vector_store.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/packages/sql-server/tests/sql_server/test_vector_store.py b/python/packages/sql-server/tests/sql_server/test_vector_store.py index f1725d56f27..329e2201da9 100644 --- a/python/packages/sql-server/tests/sql_server/test_vector_store.py +++ b/python/packages/sql-server/tests/sql_server/test_vector_store.py @@ -572,7 +572,7 @@ def fail_after_cancellation(*args): connection.close.assert_called_once() assert any( "worker failed after caller cancellation" in record.message - and record.exc_info is not None + and isinstance(record.exc_info, tuple) and isinstance(record.exc_info[1], IntegrationException) and record.exc_info[1].__cause__ is driver_error for record in caplog.records From ad4114c11233b496c3c1170b96dc8ff623aa1fca Mon Sep 17 00:00:00 2001 From: eavanvalkenburg Date: Fri, 6 Nov 2026 16:43:04 +0100 Subject: [PATCH 3/4] Retain deprecated declarative MCP cache parameter and correct release notes Accept legacy positive cache_max_size values with a deprecation warning, without restoring initialized-session caching. Keep per-invocation security isolation and the approved 1.5.0 version, document the compatibility behavior and remaining lifecycle migration, and extend real-protocol isolation tests for explicit legacy values. Remove the changelog claim and reference for still-open PR #9617. --- ...53-python-invocation-owned-mcp-sessions.md | 7 ++++-- python/CHANGELOG.md | 6 ++--- python/packages/declarative/AGENTS.md | 5 ++++- python/packages/declarative/README.md | 11 +++++++--- .../_workflows/_mcp_handler.py | 12 ++++++++++ .../test_default_mcp_tool_handler.py | 22 ++++++++++++++++++- .../references/declarative.md | 4 +++- 7 files changed, 56 insertions(+), 11 deletions(-) diff --git a/docs/decisions/0053-python-invocation-owned-mcp-sessions.md b/docs/decisions/0053-python-invocation-owned-mcp-sessions.md index 2c0c303f428..8cfae516bc1 100644 --- a/docs/decisions/0053-python-invocation-owned-mcp-sessions.md +++ b/docs/decisions/0053-python-invocation-owned-mcp-sessions.md @@ -32,8 +32,11 @@ client. This separates HTTP connection pooling from MCP protocol-session ownership without introducing a factory abstraction or new transport options. Core already supports both ownership modes, so no Core changes are necessary. -Remove the initialized-client cache, `cache_max_size`, `aclose()`, and the handler -async context manager. Hosts own admission, deadlines, cancellation, and shutdown +Remove the initialized-client cache, `aclose()`, and the handler async context +manager. Retain `cache_max_size` as a deprecated, ignored compatibility parameter; +positive values emit `DeprecationWarning`, non-positive values still raise +`ValueError`, and omission emits no warning. It does not restore session caching. +Hosts own admission, deadlines, cancellation, and shutdown coordination. They must cancel and await active invocations before disposing borrowed HTTP clients. diff --git a/python/CHANGELOG.md b/python/CHANGELOG.md index 8f2392a756e..b16823af7ca 100644 --- a/python/CHANGELOG.md +++ b/python/CHANGELOG.md @@ -25,9 +25,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - **agent-framework-core**: [BREAKING] Align graph and functional workflow invocation spans with OpenTelemetry GenAI conventions ([#9900](https://github.com/microsoft/agent-framework/pull/9900)) **Migration:** Replace exact `workflow.run` span-name filters with `gen_ai.operation.name == "invoke_workflow"`, and replace `workflow.name` attribute lookups with `gen_ai.workflow.name`. Named spans use `invoke_workflow {workflow_name}`; unnamed graph workflows use `invoke_workflow` and omit the semantic name attribute. `OtelAttr.WORKFLOW_RUN_SPAN` now contains the base operation name, not every exported span's full name. Runtime/checkpoint workflow identity and conversation/error attribute names are unchanged. -- **agent-framework-declarative**: [BREAKING] Create and close a fresh MCP protocol session for every handler invocation, including `tools/list`, instead of caching initialized sessions across workflows ([#8662](https://github.com/microsoft/agent-framework/pull/8662)) +- **agent-framework-declarative**: [BREAKING] Prevent cross-workflow MCP state sharing by creating and closing a fresh protocol session for every handler invocation, including `tools/list`, instead of caching initialized sessions. This security fix ships in 1.5.0; the legacy `cache_max_size` parameter remains accepted as a deprecated no-op ([#8662](https://github.com/microsoft/agent-framework/pull/8662)) - **Migration:** Replace `async with DefaultMCPToolHandler(...) as handler:` with ordinary `handler = DefaultMCPToolHandler(...)` construction. Remove `cache_max_size` and handler `aclose()` calls. Manage borrowed HTTP clients separately, and cancel and await active invocations before closing them. Implicit server-session continuity no longer survives later calls, approval waits, or checkpoint resumes; use explicit remote state handles or an explicitly scoped custom `MCPToolHandler` when continuity is required. Workflow checkpoints and approval verification are unchanged; no checkpoint migration flag is introduced. + **Migration:** Replace `async with DefaultMCPToolHandler(...) as handler:` with ordinary `handler = DefaultMCPToolHandler(...)` construction and remove handler `aclose()` calls. Existing positive `cache_max_size` values are accepted but ignored and emit `DeprecationWarning`; remove the parameter to stop the warning. Non-positive values still raise `ValueError`. Manage borrowed HTTP clients separately, and cancel and await active invocations before closing them. Implicit server-session continuity no longer survives later calls, approval waits, or checkpoint resumes; use explicit remote state handles or an explicitly scoped custom `MCPToolHandler` when continuity is required. Workflow checkpoints and approval verification are unchanged; no checkpoint migration flag is introduced. - **agent-framework-foundry-local**: [BREAKING] Migrate to Foundry Local SDK 2.3.1, support SDK-registered local models, and prepare the selected model before first inference while retaining the OpenAI-compatible transport ([#9322](https://github.com/microsoft/agent-framework/pull/9322)) **Migration:** Install `foundry-local-sdk>=2.3.1,<3` on Python 3.11-3.14 and a supported platform: Apple Silicon macOS, Linux x86_64/aarch64, or Windows x64/ARM64. Configure the shared SDK manager before the first client when custom settings are needed. `bootstrap=False` requires an initialized manager and running web service; `prepare_model=False` still loads the selected model on the first request. Remove unsupported `do_sample` and `early_stopping` options. Close client HTTP resources before closing the shared manager once at application shutdown. Image support has not been verified; audio and embeddings are outside this SDK migration. @@ -40,7 +40,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - **agent-framework-ag-ui**, **agent-framework-declarative**, **agent-framework-foundry-hosting**, **agent-framework-openai**: Require Core 1.25 for the wrapped-agent ownership link, MCP discovery-limit parameters, callable discovery approval policy, or local shell-result replay marker. Retain other Core floors under the strict API-usage policy. - **agent-framework-hosting-a2a**, **agent-framework-hosting-mcp**, **agent-framework-hosting-responses**, **agent-framework-hosting-telegram**: Keep the exact shared hosting dependency pin aligned with its co-released version. - **agent-framework-purview**: Clarify binary-content classification behavior ([#10103](https://github.com/microsoft/agent-framework/pull/10103)) -- **docs**: Clarify optional usage counters and OpenTelemetry logging-handler behavior, make response overview examples runnable, and remove an unused URI pattern while correcting workflow-cycle documentation ([#9783](https://github.com/microsoft/agent-framework/pull/9783), [#9897](https://github.com/microsoft/agent-framework/pull/9897), [#9617](https://github.com/microsoft/agent-framework/pull/9617), [#10105](https://github.com/microsoft/agent-framework/pull/10105)) +- **docs**: Clarify optional usage counters and OpenTelemetry logging-handler behavior, and remove an unused URI pattern while correcting workflow-cycle documentation ([#9783](https://github.com/microsoft/agent-framework/pull/9783), [#9897](https://github.com/microsoft/agent-framework/pull/9897), [#10105](https://github.com/microsoft/agent-framework/pull/10105)) - **docs**, **samples**: Correct Foundry model and connection environment variables in multimodal, Content Understanding, ChatKit, and red-teaming setup guidance, and repair the Rubric evaluator documentation link ([#9735](https://github.com/microsoft/agent-framework/pull/9735), [#9740](https://github.com/microsoft/agent-framework/pull/9740), [#9758](https://github.com/microsoft/agent-framework/pull/9758), [#9781](https://github.com/microsoft/agent-framework/pull/9781), [#9906](https://github.com/microsoft/agent-framework/pull/9906)) - **docs**: Add Bhived and Donkey Development Kit community projects, and strengthen API-design and PR-review guidance ([#10032](https://github.com/microsoft/agent-framework/pull/10032), [#10086](https://github.com/microsoft/agent-framework/pull/10086), [#10038](https://github.com/microsoft/agent-framework/pull/10038)) - **tests**: Expand optional MCP tool regression coverage and refresh mypy, ty, and standalone Lab test tooling without releasing the excluded Lab workspace ([#9937](https://github.com/microsoft/agent-framework/pull/9937), [#10117](https://github.com/microsoft/agent-framework/pull/10117), [#10118](https://github.com/microsoft/agent-framework/pull/10118), [#10119](https://github.com/microsoft/agent-framework/pull/10119), [#10120](https://github.com/microsoft/agent-framework/pull/10120)) diff --git a/python/packages/declarative/AGENTS.md b/python/packages/declarative/AGENTS.md index a52064c2ea8..79ede254c8d 100644 --- a/python/packages/declarative/AGENTS.md +++ b/python/packages/declarative/AGENTS.md @@ -29,7 +29,10 @@ shared HTTP client without sharing protocol sessions. Invocation cleanup closes the session and any internally owned HTTP client, never caller-owned HTTP clients. The handler forwards its configurable `max_discovery_pages` and `max_discovery_items` limits to every internally created `MCPStreamableHTTPTool`. -The handler has no cache, `cache_max_size`, `aclose()`, or async context manager. +The handler has no cache, `aclose()`, or async context manager. It accepts the +legacy `cache_max_size` parameter as a deprecated no-op for compatibility: +positive values emit `DeprecationWarning`, non-positive values raise `ValueError`, +and omission emits no warning. The parameter never enables session sharing. Hosts own admission, deadlines, cancellation, and shutdown of active calls; cancel and await them before closing any borrowed HTTP client. diff --git a/python/packages/declarative/README.md b/python/packages/declarative/README.md index 652d03b30ff..10260b76adb 100644 --- a/python/packages/declarative/README.md +++ b/python/packages/declarative/README.md @@ -72,7 +72,7 @@ on HTTPX internals. Compatibility tests cover HTTPX 0.27.0 and 0.28.1. ## MCP handler session lifetime -**Breaking change:** `DefaultMCPToolHandler` creates and closes a fresh MCP +**Security fix:** `DefaultMCPToolHandler` creates and closes a fresh MCP tool/session for every invocation, including `tools/list`. Independently constructed workflows may safely share a handler without sharing MCP protocol state, even with identical endpoint and header configuration. There is no @@ -91,8 +91,13 @@ produce `MCPToolResult(is_error=True)` and populate `output.result` with an erro string. Custom handlers should return error results only for tool-level errors; raised exceptions are not converted into workflow results. -The handler no longer accepts `cache_max_size` or implements `aclose()` or an -async context manager. Replace `async with DefaultMCPToolHandler() as handler:` +The legacy `cache_max_size` parameter is accepted for compatibility, but is +deprecated and ignored. Passing a positive value emits `DeprecationWarning`; +zero and negative values still raise `ValueError`. Omitting it emits no warning. +It cannot restore session caching or sharing. + +The handler no longer implements `aclose()` or an async context manager. +Replace `async with DefaultMCPToolHandler() as handler:` with `handler = DefaultMCPToolHandler()` and remove handler shutdown calls. Continue to manage caller-owned HTTP clients with their own context manager. Hosts must cancel and await active invocations before closing borrowed clients; diff --git a/python/packages/declarative/agent_framework_declarative/_workflows/_mcp_handler.py b/python/packages/declarative/agent_framework_declarative/_workflows/_mcp_handler.py index b4a8c18b9d9..e704a40a41d 100644 --- a/python/packages/declarative/agent_framework_declarative/_workflows/_mcp_handler.py +++ b/python/packages/declarative/agent_framework_declarative/_workflows/_mcp_handler.py @@ -14,6 +14,7 @@ import asyncio import json import logging +import warnings from collections.abc import Awaitable, Callable from dataclasses import dataclass, field from typing import TYPE_CHECKING, Any, ClassVar, Protocol, runtime_checkable @@ -103,6 +104,8 @@ class DefaultMCPToolHandler: Keyword Args: client_provider: Optional per-invocation provider of a borrowed HTTP client. + cache_max_size: Deprecated compatibility parameter. Positive values are + accepted with a warning but ignored; sessions are never cached. max_discovery_pages: Maximum pages accepted per tool catalog fetch. Defaults to 100; ``None`` disables the limit. max_discovery_items: Maximum tools accepted per tool catalog fetch. @@ -121,9 +124,18 @@ def __init__( self, *, client_provider: ClientProvider | None = None, + cache_max_size: int | None = None, max_discovery_pages: int | None = 100, max_discovery_items: int | None = 1_000, ) -> None: + if cache_max_size is not None: + if cache_max_size <= 0: + raise ValueError(f"cache_max_size must be positive, got {cache_max_size}") + warnings.warn( + "cache_max_size is deprecated and has no effect. Each invocation uses a new MCP session.", + DeprecationWarning, + stacklevel=2, + ) if max_discovery_pages is not None and max_discovery_pages <= 0: raise ValueError("max_discovery_pages must be positive or None.") if max_discovery_items is not None and max_discovery_items <= 0: diff --git a/python/packages/declarative/tests/declarative/test_default_mcp_tool_handler.py b/python/packages/declarative/tests/declarative/test_default_mcp_tool_handler.py index 8243fb6de1b..62e299bebc0 100644 --- a/python/packages/declarative/tests/declarative/test_default_mcp_tool_handler.py +++ b/python/packages/declarative/tests/declarative/test_default_mcp_tool_handler.py @@ -54,15 +54,24 @@ async def test_invocations_own_separate_clients( @pytest.mark.parametrize("provider_mode", ["none", "fallback", "borrowed"]) @pytest.mark.parametrize("concurrent", [False, True]) +@pytest.mark.parametrize("cache_max_size", [None, 1, 32]) async def test_real_protocol_sessions_are_terminated_before_return( stateful_mcp_server: tuple[Server[Any], dict[str, list[str]], list[httpx.AsyncClient]], provider_mode: str, concurrent: bool, + cache_max_size: int | None, ) -> None: server, histories, clients = stateful_mcp_server caller_client = httpx.AsyncClient() if provider_mode == "borrowed" else None provider = AsyncMock(return_value=caller_client) - handler = DefaultMCPToolHandler(client_provider=None if provider_mode == "none" else provider) + if cache_max_size is None: + handler = DefaultMCPToolHandler(client_provider=None if provider_mode == "none" else provider) + else: + with pytest.warns(DeprecationWarning, match="cache_max_size is deprecated and has no effect"): + handler = DefaultMCPToolHandler( + client_provider=None if provider_mode == "none" else provider, + cache_max_size=cache_max_size, + ) invocation = MCPToolInvocation("http://127.0.0.1:8000/mcp", "remember", headers={"X-Test": "same-config"}) try: async with server.session_manager.run(): @@ -310,6 +319,17 @@ def test_invalid_discovery_limit_raises(option: str, value: int) -> None: DefaultMCPToolHandler(max_discovery_items=value) +def test_default_cache_size_does_not_warn(recwarn: pytest.WarningsRecorder) -> None: + DefaultMCPToolHandler() + assert not recwarn + + +@pytest.mark.parametrize("cache_max_size", [0, -1]) +def test_invalid_deprecated_cache_size_raises(cache_max_size: int) -> None: + with pytest.raises(ValueError, match="cache_max_size must be positive"): + DefaultMCPToolHandler(cache_max_size=cache_max_size) + + async def test_list_tools_rejects_arguments_before_provider(mcp_tool_constructor: MagicMock) -> None: provider = AsyncMock() with pytest.raises(ValueError, match="The reserved MCP 'tools/list' operation does not accept tool arguments"): diff --git a/skills/agent-framework-builder-python/references/declarative.md b/skills/agent-framework-builder-python/references/declarative.md index f5a0a2cc59e..75e35714609 100644 --- a/skills/agent-framework-builder-python/references/declarative.md +++ b/skills/agent-framework-builder-python/references/declarative.md @@ -25,7 +25,9 @@ maturity. Check current package status and public docstrings before making compa - Review the documented HTTP body limits and handler ownership rules; use a custom handler when host policy requires different authentication, retries, SSRF controls, or transport behavior. - `DefaultMCPToolHandler` opens and closes a fresh MCP session per invocation, including `tools/list`. - Instantiate it normally, not with `async with`; it has no `cache_max_size` or `aclose()`. + Instantiate it normally, not with `async with`; it has no `aclose()`. + The legacy `cache_max_size` parameter is deprecated and ignored. Positive values emit `DeprecationWarning`; + non-positive values raise `ValueError`. Omit it in new code; it cannot restore session sharing. Its optional `client_provider` may return a borrowed, reusable HTTP client, but protocol state is never shared. Cancel and await active calls before closing borrowed clients. Implicit server state does not survive later calls, approval waits, or checkpoint resumes; use explicit remote state handles or a custom scoped handler if needed. From 74973c2a11ca38fc655b4e7a4f1dd6dcd4cbaee4 Mon Sep 17 00:00:00 2001 From: eavanvalkenburg Date: Fri, 6 Nov 2026 16:47:48 +0100 Subject: [PATCH 4/4] Simplify deprecated MCP cache parameter handling and undo skill edits --- ...053-python-invocation-owned-mcp-sessions.md | 4 ++-- python/CHANGELOG.md | 2 +- python/packages/declarative/AGENTS.md | 4 ++-- python/packages/declarative/README.md | 4 ++-- .../_workflows/_mcp_handler.py | 6 ++---- .../test_default_mcp_tool_handler.py | 18 +++++------------- .../references/declarative.md | 4 +--- 7 files changed, 15 insertions(+), 27 deletions(-) diff --git a/docs/decisions/0053-python-invocation-owned-mcp-sessions.md b/docs/decisions/0053-python-invocation-owned-mcp-sessions.md index 8cfae516bc1..810421b664f 100644 --- a/docs/decisions/0053-python-invocation-owned-mcp-sessions.md +++ b/docs/decisions/0053-python-invocation-owned-mcp-sessions.md @@ -34,8 +34,8 @@ Core already supports both ownership modes, so no Core changes are necessary. Remove the initialized-client cache, `aclose()`, and the handler async context manager. Retain `cache_max_size` as a deprecated, ignored compatibility parameter; -positive values emit `DeprecationWarning`, non-positive values still raise -`ValueError`, and omission emits no warning. It does not restore session caching. +non-`None` values emit `DeprecationWarning` without validation, and omission or +`None` emits no warning. It does not restore session caching. Hosts own admission, deadlines, cancellation, and shutdown coordination. They must cancel and await active invocations before disposing borrowed HTTP clients. diff --git a/python/CHANGELOG.md b/python/CHANGELOG.md index b16823af7ca..931afcf93b7 100644 --- a/python/CHANGELOG.md +++ b/python/CHANGELOG.md @@ -27,7 +27,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 **Migration:** Replace exact `workflow.run` span-name filters with `gen_ai.operation.name == "invoke_workflow"`, and replace `workflow.name` attribute lookups with `gen_ai.workflow.name`. Named spans use `invoke_workflow {workflow_name}`; unnamed graph workflows use `invoke_workflow` and omit the semantic name attribute. `OtelAttr.WORKFLOW_RUN_SPAN` now contains the base operation name, not every exported span's full name. Runtime/checkpoint workflow identity and conversation/error attribute names are unchanged. - **agent-framework-declarative**: [BREAKING] Prevent cross-workflow MCP state sharing by creating and closing a fresh protocol session for every handler invocation, including `tools/list`, instead of caching initialized sessions. This security fix ships in 1.5.0; the legacy `cache_max_size` parameter remains accepted as a deprecated no-op ([#8662](https://github.com/microsoft/agent-framework/pull/8662)) - **Migration:** Replace `async with DefaultMCPToolHandler(...) as handler:` with ordinary `handler = DefaultMCPToolHandler(...)` construction and remove handler `aclose()` calls. Existing positive `cache_max_size` values are accepted but ignored and emit `DeprecationWarning`; remove the parameter to stop the warning. Non-positive values still raise `ValueError`. Manage borrowed HTTP clients separately, and cancel and await active invocations before closing them. Implicit server-session continuity no longer survives later calls, approval waits, or checkpoint resumes; use explicit remote state handles or an explicitly scoped custom `MCPToolHandler` when continuity is required. Workflow checkpoints and approval verification are unchanged; no checkpoint migration flag is introduced. + **Migration:** Replace `async with DefaultMCPToolHandler(...) as handler:` with ordinary `handler = DefaultMCPToolHandler(...)` construction and remove handler `aclose()` calls. Existing non-`None` `cache_max_size` values are accepted without validation but ignored and emit `DeprecationWarning`; omit the parameter or pass `None` to stop the warning. Manage borrowed HTTP clients separately, and cancel and await active invocations before closing them. Implicit server-session continuity no longer survives later calls, approval waits, or checkpoint resumes; use explicit remote state handles or an explicitly scoped custom `MCPToolHandler` when continuity is required. Workflow checkpoints and approval verification are unchanged; no checkpoint migration flag is introduced. - **agent-framework-foundry-local**: [BREAKING] Migrate to Foundry Local SDK 2.3.1, support SDK-registered local models, and prepare the selected model before first inference while retaining the OpenAI-compatible transport ([#9322](https://github.com/microsoft/agent-framework/pull/9322)) **Migration:** Install `foundry-local-sdk>=2.3.1,<3` on Python 3.11-3.14 and a supported platform: Apple Silicon macOS, Linux x86_64/aarch64, or Windows x64/ARM64. Configure the shared SDK manager before the first client when custom settings are needed. `bootstrap=False` requires an initialized manager and running web service; `prepare_model=False` still loads the selected model on the first request. Remove unsupported `do_sample` and `early_stopping` options. Close client HTTP resources before closing the shared manager once at application shutdown. Image support has not been verified; audio and embeddings are outside this SDK migration. diff --git a/python/packages/declarative/AGENTS.md b/python/packages/declarative/AGENTS.md index 79ede254c8d..decc399d7d9 100644 --- a/python/packages/declarative/AGENTS.md +++ b/python/packages/declarative/AGENTS.md @@ -31,8 +31,8 @@ The handler forwards its configurable `max_discovery_pages` and `max_discovery_i limits to every internally created `MCPStreamableHTTPTool`. The handler has no cache, `aclose()`, or async context manager. It accepts the legacy `cache_max_size` parameter as a deprecated no-op for compatibility: -positive values emit `DeprecationWarning`, non-positive values raise `ValueError`, -and omission emits no warning. The parameter never enables session sharing. +non-`None` values emit `DeprecationWarning` without validation, and omission or +`None` emits no warning. The parameter never enables session sharing. Hosts own admission, deadlines, cancellation, and shutdown of active calls; cancel and await them before closing any borrowed HTTP client. diff --git a/python/packages/declarative/README.md b/python/packages/declarative/README.md index 10260b76adb..e9f034aad2a 100644 --- a/python/packages/declarative/README.md +++ b/python/packages/declarative/README.md @@ -92,8 +92,8 @@ string. Custom handlers should return error results only for tool-level errors; raised exceptions are not converted into workflow results. The legacy `cache_max_size` parameter is accepted for compatibility, but is -deprecated and ignored. Passing a positive value emits `DeprecationWarning`; -zero and negative values still raise `ValueError`. Omitting it emits no warning. +deprecated and ignored. Passing any non-`None` value emits `DeprecationWarning`; +the value is not validated. Omitting it or passing `None` emits no warning. It cannot restore session caching or sharing. The handler no longer implements `aclose()` or an async context manager. diff --git a/python/packages/declarative/agent_framework_declarative/_workflows/_mcp_handler.py b/python/packages/declarative/agent_framework_declarative/_workflows/_mcp_handler.py index e704a40a41d..17aff0ef28b 100644 --- a/python/packages/declarative/agent_framework_declarative/_workflows/_mcp_handler.py +++ b/python/packages/declarative/agent_framework_declarative/_workflows/_mcp_handler.py @@ -104,8 +104,8 @@ class DefaultMCPToolHandler: Keyword Args: client_provider: Optional per-invocation provider of a borrowed HTTP client. - cache_max_size: Deprecated compatibility parameter. Positive values are - accepted with a warning but ignored; sessions are never cached. + cache_max_size: Deprecated compatibility parameter. Non-``None`` values + emit a warning but are ignored; sessions are never cached. max_discovery_pages: Maximum pages accepted per tool catalog fetch. Defaults to 100; ``None`` disables the limit. max_discovery_items: Maximum tools accepted per tool catalog fetch. @@ -129,8 +129,6 @@ def __init__( max_discovery_items: int | None = 1_000, ) -> None: if cache_max_size is not None: - if cache_max_size <= 0: - raise ValueError(f"cache_max_size must be positive, got {cache_max_size}") warnings.warn( "cache_max_size is deprecated and has no effect. Each invocation uses a new MCP session.", DeprecationWarning, diff --git a/python/packages/declarative/tests/declarative/test_default_mcp_tool_handler.py b/python/packages/declarative/tests/declarative/test_default_mcp_tool_handler.py index 62e299bebc0..c3b4667d6ec 100644 --- a/python/packages/declarative/tests/declarative/test_default_mcp_tool_handler.py +++ b/python/packages/declarative/tests/declarative/test_default_mcp_tool_handler.py @@ -54,24 +54,15 @@ async def test_invocations_own_separate_clients( @pytest.mark.parametrize("provider_mode", ["none", "fallback", "borrowed"]) @pytest.mark.parametrize("concurrent", [False, True]) -@pytest.mark.parametrize("cache_max_size", [None, 1, 32]) async def test_real_protocol_sessions_are_terminated_before_return( stateful_mcp_server: tuple[Server[Any], dict[str, list[str]], list[httpx.AsyncClient]], provider_mode: str, concurrent: bool, - cache_max_size: int | None, ) -> None: server, histories, clients = stateful_mcp_server caller_client = httpx.AsyncClient() if provider_mode == "borrowed" else None provider = AsyncMock(return_value=caller_client) - if cache_max_size is None: - handler = DefaultMCPToolHandler(client_provider=None if provider_mode == "none" else provider) - else: - with pytest.warns(DeprecationWarning, match="cache_max_size is deprecated and has no effect"): - handler = DefaultMCPToolHandler( - client_provider=None if provider_mode == "none" else provider, - cache_max_size=cache_max_size, - ) + handler = DefaultMCPToolHandler(client_provider=None if provider_mode == "none" else provider) invocation = MCPToolInvocation("http://127.0.0.1:8000/mcp", "remember", headers={"X-Test": "same-config"}) try: async with server.session_manager.run(): @@ -321,12 +312,13 @@ def test_invalid_discovery_limit_raises(option: str, value: int) -> None: def test_default_cache_size_does_not_warn(recwarn: pytest.WarningsRecorder) -> None: DefaultMCPToolHandler() + DefaultMCPToolHandler(cache_max_size=None) assert not recwarn -@pytest.mark.parametrize("cache_max_size", [0, -1]) -def test_invalid_deprecated_cache_size_raises(cache_max_size: int) -> None: - with pytest.raises(ValueError, match="cache_max_size must be positive"): +@pytest.mark.parametrize("cache_max_size", [-1, 0, 1, 32]) +def test_deprecated_cache_size_warns(cache_max_size: int) -> None: + with pytest.warns(DeprecationWarning, match="cache_max_size is deprecated and has no effect"): DefaultMCPToolHandler(cache_max_size=cache_max_size) diff --git a/skills/agent-framework-builder-python/references/declarative.md b/skills/agent-framework-builder-python/references/declarative.md index 75e35714609..f5a0a2cc59e 100644 --- a/skills/agent-framework-builder-python/references/declarative.md +++ b/skills/agent-framework-builder-python/references/declarative.md @@ -25,9 +25,7 @@ maturity. Check current package status and public docstrings before making compa - Review the documented HTTP body limits and handler ownership rules; use a custom handler when host policy requires different authentication, retries, SSRF controls, or transport behavior. - `DefaultMCPToolHandler` opens and closes a fresh MCP session per invocation, including `tools/list`. - Instantiate it normally, not with `async with`; it has no `aclose()`. - The legacy `cache_max_size` parameter is deprecated and ignored. Positive values emit `DeprecationWarning`; - non-positive values raise `ValueError`. Omit it in new code; it cannot restore session sharing. + Instantiate it normally, not with `async with`; it has no `cache_max_size` or `aclose()`. Its optional `client_provider` may return a borrowed, reusable HTTP client, but protocol state is never shared. Cancel and await active calls before closing borrowed clients. Implicit server state does not survive later calls, approval waits, or checkpoint resumes; use explicit remote state handles or a custom scoped handler if needed.