agy تنها ارائهدهندهٔ مدل؛ حذف بخش ارائهدهندهها و افزودن زنجیرهٔ انتخاب مدل
- حذف کامل providerهای mock و openai_compatible: دامنه، آداپوترها، رجیستری، کانفیگ، seed و رابطٔ مدیریت - بخش «ارائهدهندهها» از کنسول حذف شد؛ ورود اکانتها فقط از صفحهٔ اکانتهای agy - صفحهٔ مدلها بازطراحی شد: ارائهدهنده → اکانت → مدل (کاتالوگ لحظهای و زندهٔ همان اکانت از Google) → افورت استدلال؛ بدون هیچ ورود دستی نام مدل - مدلها ستون reasoning_effort گرفتند؛ آداپتور آن را به thinkingConfig (بودجهٔ ۱۰۲۴ تا ۳۲۷۶۸) ترجمه میکند و فقط به مدلهای استدلالی میفرستد - مهاجرت c2d3e4f5b6a7: افزودن reasoning_effort و حذف ردیفهای providerهای قدیمی - تستها: ۲۴۶ تست بکاند و ۵۱ تست فرانت سبز؛ ruff و mypy و tsc و eslint تمیز
This commit is contained in:
@@ -14,13 +14,10 @@ from app.domain.base import new_id, utcnow
|
||||
|
||||
|
||||
class ProviderType(StrEnum):
|
||||
MOCK = "mock"
|
||||
OPENAI_COMPATIBLE = "openai_compatible"
|
||||
ANTHROPIC = "anthropic"
|
||||
GEMINI = "gemini"
|
||||
OPENROUTER = "openrouter"
|
||||
#: Google Antigravity (``agy``) — OAuth accounts billed through a Google AI
|
||||
#: subscription. Credentials of this type are *accounts*, not API keys.
|
||||
#: subscription. It is the *only* provider the platform talks to; the
|
||||
#: previous ``mock`` / ``openai_compatible`` kinds were removed with the
|
||||
#: single-provider decision, and the migration drops their rows.
|
||||
AGY = "agy"
|
||||
|
||||
|
||||
@@ -34,6 +31,11 @@ class CredentialStatus(StrEnum):
|
||||
ERROR = "error"
|
||||
|
||||
|
||||
#: agy reasoning efforts, cheapest first. The admin console offers exactly
|
||||
#: these; the adapter maps each to a thinking budget (see adapters/agy.py).
|
||||
REASONING_EFFORTS: tuple[str, ...] = ("minimal", "low", "medium", "high", "xhigh")
|
||||
|
||||
|
||||
class RoutingMode(StrEnum):
|
||||
FAST = "fast"
|
||||
CHEAP = "cheap"
|
||||
@@ -65,7 +67,7 @@ class RateUnit(StrEnum):
|
||||
@dataclass(slots=True, kw_only=True)
|
||||
class Provider:
|
||||
name: str
|
||||
type: ProviderType = ProviderType.MOCK
|
||||
type: ProviderType = ProviderType.AGY
|
||||
base_url: str = ""
|
||||
id: str = field(default_factory=new_id)
|
||||
is_active: bool = True
|
||||
@@ -74,12 +76,10 @@ class Provider:
|
||||
|
||||
@dataclass(slots=True, kw_only=True)
|
||||
class ModelCredential:
|
||||
"""One credential for a provider.
|
||||
"""One credential for the agy provider — i.e. one Google *account*.
|
||||
|
||||
For key-based providers ``encrypted_api_key`` holds the encrypted API key and
|
||||
the agy fields stay empty. For the agy provider the credential *is an
|
||||
account*: ``encrypted_api_key`` holds the encrypted JSON blob
|
||||
``{"refresh_token": ..., "project_id": ..., "email": ...}`` while ``email`` /
|
||||
``encrypted_api_key`` holds the encrypted JSON blob
|
||||
``{"refresh_token": ..., "project_id": ..., "email": ...}``, while ``email`` /
|
||||
``project_id`` duplicate the identity columns so the admin console can show
|
||||
and rotate accounts without touching the ciphertext.
|
||||
"""
|
||||
@@ -107,6 +107,10 @@ class AiModel:
|
||||
capabilities: list[str] = field(default_factory=list)
|
||||
input_price_per_1m: float = 0.0
|
||||
output_price_per_1m: float = 0.0
|
||||
#: agy reasoning effort: ``minimal | low | medium | high | xhigh`` (empty =
|
||||
#: provider default). Only thinking-capable models receive it; the adapter
|
||||
#: maps it to a ``thinkingConfig`` budget.
|
||||
reasoning_effort: str = ""
|
||||
id: str = field(default_factory=new_id)
|
||||
is_active: bool = True
|
||||
created_at: datetime = field(default_factory=utcnow)
|
||||
|
||||
Reference in New Issue
Block a user