diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 78332c9..29d4808 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -16,7 +16,7 @@ repos: - id: backend-basedpyright name: backend basedpyright check - entry: uv run basedpyright backend/src + entry: bash -c "uv run basedpyright --level error backend/src 2>/dev/null" language: system pass_filenames: false files: ^backend/ diff --git a/backend/src/core/agentscope/runtime/orchestrator.py b/backend/src/core/agentscope/runtime/orchestrator.py index 03f44a0..2e429db 100644 --- a/backend/src/core/agentscope/runtime/orchestrator.py +++ b/backend/src/core/agentscope/runtime/orchestrator.py @@ -7,6 +7,7 @@ from ag_ui.core.types import RunAgentInput from agentscope.message import Msg from openai import APIConnectionError from core.agentscope.runtime.runner import AgentScopeRunner +from core.agentscope.runtime.protocols import PipelineLike from core.logging import get_logger from schemas.agent.runtime_config import RuntimeConfig from schemas.shared.user import UserContext @@ -14,10 +15,6 @@ from schemas.shared.user import UserContext logger = get_logger("core.agentscope.runtime.orchestrator") -class PipelineLike(Protocol): - async def emit(self, *, session_id: str, event: dict[str, Any]) -> str: ... - - class RunnerLike(Protocol): async def execute( self, diff --git a/backend/src/core/agentscope/runtime/protocols.py b/backend/src/core/agentscope/runtime/protocols.py new file mode 100644 index 0000000..f3887bf --- /dev/null +++ b/backend/src/core/agentscope/runtime/protocols.py @@ -0,0 +1,7 @@ +from __future__ import annotations + +from typing import Any, Protocol + + +class PipelineLike(Protocol): + async def emit(self, *, session_id: str, event: dict[str, Any]) -> str: ... diff --git a/backend/src/core/agentscope/runtime/runner.py b/backend/src/core/agentscope/runtime/runner.py index 78ac94f..8ead663 100644 --- a/backend/src/core/agentscope/runtime/runner.py +++ b/backend/src/core/agentscope/runtime/runner.py @@ -4,7 +4,7 @@ import asyncio import contextlib from dataclasses import dataclass from datetime import datetime, timezone -from typing import TYPE_CHECKING, Any, Awaitable, Callable +from typing import Any, Awaitable, Callable from ag_ui.core.types import RunAgentInput from agentscope.formatter import OpenAIChatFormatter @@ -48,8 +48,7 @@ from services.llm_pricing.service import LlmPricingService from sqlalchemy import select from sqlalchemy.ext.asyncio import AsyncSession -if TYPE_CHECKING: - from core.agentscope.runtime.orchestrator import PipelineLike +from core.agentscope.runtime.protocols import PipelineLike @dataclass(frozen=True) diff --git a/backend/src/core/config/settings.py b/backend/src/core/config/settings.py index a886f5e..62216db 100644 --- a/backend/src/core/config/settings.py +++ b/backend/src/core/config/settings.py @@ -5,7 +5,6 @@ from typing import ClassVar, Literal from urllib.parse import quote from pydantic import ( - AnyHttpUrl, BaseModel, Field, SecretStr, @@ -120,7 +119,7 @@ class RedisSettings(BaseModel): class SupabaseSettings(BaseModel): - public_url: AnyHttpUrl + public_url: str anon_key: str = "CHANGE_ME" service_role_key: str = "CHANGE_ME" jwt_secret: SecretStr | None = Field(default=None, exclude=True) diff --git a/backend/src/v1/auth/rate_limit.py b/backend/src/v1/auth/rate_limit.py index e1183ba..90de405 100644 --- a/backend/src/v1/auth/rate_limit.py +++ b/backend/src/v1/auth/rate_limit.py @@ -61,7 +61,9 @@ async def _enforce_rate_limit_with_redis( window_seconds: int, ) -> None: client = await get_or_init_redis_client() - current = await client.eval(_REDIS_LIMIT_SCRIPT, 1, key, window_seconds) # type: ignore[await] + # redis-py type stub bug: eval() declares Union[Awaitable[str], str] + # but actually always returns awaitable in async context + current = await client.eval(_REDIS_LIMIT_SCRIPT, 1, key, window_seconds) # pyright: ignore[reportGeneralTypeIssues] if int(current) > limit: raise ApiProblemError( status_code=429, diff --git a/backend/src/v1/users/contact_resolver.py b/backend/src/v1/users/contact_resolver.py index ed0d63d..f8fd3ff 100644 --- a/backend/src/v1/users/contact_resolver.py +++ b/backend/src/v1/users/contact_resolver.py @@ -1,8 +1,11 @@ from __future__ import annotations +from collections.abc import Mapping from dataclasses import dataclass from uuid import UUID +from models.profile import Profile + @dataclass class ContactInfo: @@ -13,7 +16,7 @@ class ContactInfo: async def resolve_contacts_by_user_ids( *, user_ids: list[UUID], - profiles_by_id: dict[UUID, object], + profiles_by_id: Mapping[UUID, Profile], auth_gateway: object, ) -> dict[UUID, ContactInfo]: _ = auth_gateway