Pipeline/backend/app/schemas/provider_credentials.py

82 lines
2.1 KiB
Python

"""Schemas for AI provider credential CRUD endpoints."""
from __future__ import annotations
from datetime import datetime
from uuid import UUID
from sqlmodel import SQLModel
RUNTIME_ANNOTATION_TYPES = (datetime, UUID)
class ProviderCredentialCreate(SQLModel):
provider: str
account_key: str
display_name: str = ""
api_key: str | None = None
base_url: str | None = None
active: bool = True
class ProviderCredentialTestRequest(SQLModel):
provider: str
account_key: str = "test"
api_key: str | None = None
base_url: str | None = None
class ProviderCredentialUpdate(SQLModel):
display_name: str | None = None
api_key: str | None = None # None = keep existing; "" = clear it
base_url: str | None = None
active: bool | None = None
class TokenWindowRead(SQLModel):
limit: int | None = None
remaining: int | None = None
used: int | None = None
pct_used: float | None = None
reset_at: str | None = None # ISO 8601 UTC
reset_in_ms: int | None = None # ms until reset
class RequestWindowRead(SQLModel):
limit: int | None = None
remaining: int | None = None
reset_at: str | None = None
reset_in_ms: int | None = None
class ProviderUsageLiveRead(SQLModel):
"""Real-time token usage and rate limit data fetched directly from the provider API."""
provider: str
account_key: str
checked_at: str # ISO 8601 UTC
reachable: bool
error: str | None = None
tokens: TokenWindowRead
input_tokens: TokenWindowRead # Anthropic splits input tokens separately
requests: RequestWindowRead
models: list[str] = []
# Optional debugging aid: exact rate-limit header names returned by provider.
debug_rate_limit_headers: list[str] | None = None
class ProviderCredentialRead(SQLModel):
"""Safe read schema — api_key is never included."""
id: UUID
organization_id: UUID
provider: str
account_key: str
display_name: str
api_key_last_four: str | None
has_api_key: bool
base_url: str | None
active: bool
created_at: datetime
updated_at: datetime