Python: Fix Python pyright package scoping and typing remediation (#4426)

* Fix Python pyright package scoping and typing remediation

Implements issue #4407 by removing the root pyright include, adding package-level pyright includes, and resolving pyright/mypy typing issues across Python packages. Also cleans unnecessary casts and applies line-level, rule-specific ignores where external libraries are too dynamic.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Reduce pyright cost in handoff cloning

Simplify cloned_options construction in HandoffAgentExecutor to avoid expensive TypedDict narrowing/inference in _handoff.py, which was causing pyright to spend a long time in orchestrations.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix types

* Fix lint and type-check regressions

Resolve current Python package check failures across lint, pyright, and mypy after recent code changes, including purview/declarative pyright issues and multiple ruff simplification findings.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fixed hooks

* Stabilize package tests and test tasks

Resolve cross-package non-integration test failures, simplify streaming type flow, harden locale/culture handling, and standardize package test poe tasks to exclude integration tests where applicable.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* lots of small fixes

* Fix current Python test regressions

Address current failing unit tests in azure-ai, bedrock, and azure-cosmos while keeping Bedrock parsing logic inline (no new static helper methods).

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* small fixes

* small fixes

* removed pydantic from json

* final updates

* fix core

* fix tests

* fix obser

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
Eduard van Valkenburg
2026-03-05 15:32:24 +00:00
committed by GitHub
co-authored by Copilot
parent 4a043c6c66
commit 55ddd841b7
122 changed files with 2328 additions and 2407 deletions
@@ -124,7 +124,6 @@ class CosmosHistoryProvider(BaseHistoryProvider):
self._database_client = self._cosmos_client.get_database_client(self.database_name)
async def get_messages(self, session_id: str | None, **kwargs: Any) -> list[Message]:
"""Retrieve stored messages for this session from Azure Cosmos DB."""
await self._ensure_container_proxy()
@@ -146,8 +145,15 @@ class CosmosHistoryProvider(BaseHistoryProvider):
messages: list[Message] = []
async for item in items:
message_payload = item.get("message")
if isinstance(message_payload, dict):
messages.append(Message.from_dict(message_payload))
if not isinstance(message_payload, dict):
logger.warning("Skipping Cosmos DB item with non-mapping message payload.")
continue
try:
msg = Message.from_dict(message_payload) # pyright: ignore[reportUnknownArgumentType]
except ValueError as e:
logger.warning("Failed to deserialize message from Cosmos DB item: %s", e)
continue
messages.append(msg)
return messages
@@ -205,12 +211,8 @@ class CosmosHistoryProvider(BaseHistoryProvider):
async def list_sessions(self) -> list[str]:
"""List all session IDs stored in this provider's Cosmos container."""
await self._ensure_container_proxy()
query = (
"SELECT DISTINCT VALUE c.session_id FROM c WHERE c.source_id = @source_id"
)
parameters: list[dict[str, object]] = [
{"name": "@source_id", "value": self.source_id}
]
query = "SELECT DISTINCT VALUE c.session_id FROM c WHERE c.source_id = @source_id"
parameters: list[dict[str, object]] = [{"name": "@source_id", "value": self.source_id}]
# without a partition key, it is automatically a cross-partition query
items = self._container_proxy.query_items(query=query, parameters=parameters) # type: ignore[union-attr]
@@ -249,11 +251,9 @@ class CosmosHistoryProvider(BaseHistoryProvider):
if self._database_client is None:
raise RuntimeError("Cosmos database client is not initialized.")
self._container_proxy = (
await self._database_client.create_container_if_not_exists(
id=self.container_name,
partition_key=PartitionKey(path="/session_id"),
)
self._container_proxy = await self._database_client.create_container_if_not_exists(
id=self.container_name,
partition_key=PartitionKey(path="/session_id"),
)
@staticmethod
+2 -1
View File
@@ -61,6 +61,7 @@ omit = [
[tool.pyright]
extends = "../../pyproject.toml"
include = ["agent_framework_azure_cosmos"]
[tool.mypy]
plugins = ['pydantic.mypy']
@@ -85,7 +86,7 @@ executor.type = "uv"
include = "../../shared_tasks.toml"
[tool.poe.tasks]
mypy = "mypy --config-file $POE_ROOT/pyproject.toml agent_framework_azure_cosmos"
test = "pytest --cov=agent_framework_azure_cosmos --cov-report=term-missing:skip-covered tests"
test = "pytest -m \"not integration\" --cov=agent_framework_azure_cosmos --cov-report=term-missing:skip-covered tests"
integration-tests = "pytest tests/test_cosmos_history_provider.py -m integration"
[build-system]
@@ -5,10 +5,11 @@ import asyncio
import os
from agent_framework.azure import AzureOpenAIResponsesClient
from agent_framework_azure_cosmos import CosmosHistoryProvider
from azure.identity.aio import AzureCliCredential
from dotenv import load_dotenv
from agent_framework_azure_cosmos import CosmosHistoryProvider
# Load environment variables from .env file.
load_dotenv()
@@ -31,7 +32,6 @@ Optional:
"""
async def main() -> None:
"""Run the Cosmos history provider sample with an Agent."""
project_endpoint = os.getenv("AZURE_AI_PROJECT_ENDPOINT")
@@ -9,15 +9,16 @@ from contextlib import suppress
from typing import Any
from unittest.mock import AsyncMock, MagicMock, patch
import agent_framework_azure_cosmos._history_provider as history_provider_module
import pytest
from agent_framework import AgentResponse, Message
from agent_framework._sessions import AgentSession, SessionContext
from agent_framework.exceptions import SettingNotFoundError
from agent_framework_azure_cosmos._history_provider import CosmosHistoryProvider
from azure.cosmos.aio import CosmosClient
from azure.cosmos.exceptions import CosmosResourceNotFoundError
import agent_framework_azure_cosmos._history_provider as history_provider_module
from agent_framework_azure_cosmos._history_provider import CosmosHistoryProvider
skip_if_cosmos_integration_tests_disabled = pytest.mark.skipif(
any(
os.getenv(name, "") == ""
@@ -357,9 +358,10 @@ class TestCosmosHistoryProviderClose:
async def test_async_context_manager_preserves_original_exception(self, mock_container: MagicMock) -> None:
provider = CosmosHistoryProvider(source_id="mem", container_client=mock_container)
with patch.object(
provider, "close", AsyncMock(side_effect=RuntimeError("close failed"))
), pytest.raises(ValueError, match="inner error"):
with (
patch.object(provider, "close", AsyncMock(side_effect=RuntimeError("close failed"))),
pytest.raises(ValueError, match="inner error"),
):
async with provider:
raise ValueError("inner error")