diff --git a/src/opencode_a2a/client/__init__.py b/src/opencode_a2a/client/__init__.py index 28f83bb..212dd23 100644 --- a/src/opencode_a2a/client/__init__.py +++ b/src/opencode_a2a/client/__init__.py @@ -10,7 +10,6 @@ A2AUnsupportedBindingError, A2AUnsupportedOperationError, ) -from .types import A2AClientEvent, A2AClientEventStream, A2AClientMetadata __all__ = [ "A2AClient", @@ -21,8 +20,5 @@ "A2AUnsupportedBindingError", "A2AUnsupportedOperationError", "A2AClientSettings", - "A2AClientEvent", - "A2AClientEventStream", - "A2AClientMetadata", "load_settings", ] diff --git a/src/opencode_a2a/client/client.py b/src/opencode_a2a/client/client.py index 7b3801a..f58c4e8 100644 --- a/src/opencode_a2a/client/client.py +++ b/src/opencode_a2a/client/client.py @@ -35,7 +35,6 @@ from .errors import A2AUnsupportedBindingError from .payload_text import extract_text as extract_text_from_payload from .request_context import build_call_context, build_client_interceptors, split_request_metadata -from .types import A2AClientEvent class A2AClient: @@ -105,7 +104,9 @@ async def send_message( message_id: str | None = None, metadata: Mapping[str, Any] | None = None, extensions: list[str] | None = None, - ) -> AsyncIterator[A2AClientEvent]: + ) -> AsyncIterator[ + Message | tuple[Task, TaskStatusUpdateEvent | TaskArtifactUpdateEvent | None] | None + ]: """Send one user message and stream protocol events.""" await self._acquire_operation() try: @@ -144,9 +145,11 @@ async def send( message_id: str | None = None, metadata: Mapping[str, Any] | None = None, extensions: list[str] | None = None, - ) -> A2AClientEvent: + ) -> Message | tuple[Task, TaskStatusUpdateEvent | TaskArtifactUpdateEvent | None] | None: """Send a message and return the terminal response/event.""" - last_event: A2AClientEvent = None + last_event: ( + Message | tuple[Task, TaskStatusUpdateEvent | TaskArtifactUpdateEvent | None] | None + ) = None async for event in self.send_message( text, context_id=context_id, diff --git a/src/opencode_a2a/client/types.py b/src/opencode_a2a/client/types.py deleted file mode 100644 index 3028433..0000000 --- a/src/opencode_a2a/client/types.py +++ /dev/null @@ -1,21 +0,0 @@ -"""Public type hints for the lightweight opencode-a2a client facade.""" - -from __future__ import annotations - -from collections.abc import AsyncIterator, Mapping -from typing import Any - -from a2a.types import ( - Message, - Task, - TaskArtifactUpdateEvent, - TaskStatusUpdateEvent, -) - -A2AClientEvent = ( - Message | tuple[Task, TaskStatusUpdateEvent | TaskArtifactUpdateEvent | None] | None -) -A2AClientEventStream = AsyncIterator[A2AClientEvent] -A2AClientMetadata = Mapping[str, Any] - -__all__ = ["A2AClientEvent", "A2AClientEventStream", "A2AClientMetadata"] diff --git a/src/opencode_a2a/config.py b/src/opencode_a2a/config.py index c46effd..1638274 100644 --- a/src/opencode_a2a/config.py +++ b/src/opencode_a2a/config.py @@ -1,7 +1,7 @@ from __future__ import annotations import json -from typing import Annotated, Any, Literal, cast +from typing import Annotated, Any, Literal from pydantic import BeforeValidator, Field, model_validator from pydantic_settings import BaseSettings, NoDecode, SettingsConfigDict @@ -180,8 +180,3 @@ class Settings(BaseSettings): def _validate_sandbox_policy(self) -> Settings: SandboxPolicy.from_settings(self).validate_configuration() return self - - @classmethod - def from_env(cls) -> Settings: - settings_cls: type[BaseSettings] = cls - return cast(Settings, settings_cls()) diff --git a/src/opencode_a2a/server/application.py b/src/opencode_a2a/server/application.py index c229187..f741bf6 100644 --- a/src/opencode_a2a/server/application.py +++ b/src/opencode_a2a/server/application.py @@ -7,7 +7,7 @@ from contextlib import asynccontextmanager from contextvars import ContextVar, Token from functools import partial -from typing import TYPE_CHECKING +from typing import TYPE_CHECKING, cast import uvicorn from a2a.server.apps.jsonrpc.fastapi_app import A2AFastAPI @@ -29,6 +29,7 @@ from a2a.utils.errors import ServerError from fastapi import FastAPI, Request from fastapi.responses import JSONResponse +from pydantic_settings import BaseSettings from starlette.responses import StreamingResponse from ..client import A2AClient @@ -788,7 +789,8 @@ def _configure_logging(level: str) -> None: def main() -> None: - settings = Settings.from_env() + settings_cls: type[BaseSettings] = Settings + settings = cast(Settings, settings_cls()) app = create_app(settings) log_level = _normalize_log_level(settings.a2a_log_level) _configure_logging(log_level) diff --git a/tests/server/test_app_behaviors.py b/tests/server/test_app_behaviors.py index c533f06..00a8821 100644 --- a/tests/server/test_app_behaviors.py +++ b/tests/server/test_app_behaviors.py @@ -602,7 +602,7 @@ def _fake_get_logger(name: str | None = None) -> MagicMock: ) captured: dict[str, object] = {} - monkeypatch.setattr(app_module.Settings, "from_env", lambda: settings) + monkeypatch.setattr(app_module, "Settings", lambda: settings) monkeypatch.setattr(app_module, "create_app", lambda _settings: "app-object") monkeypatch.setattr( app_module,