86 lines
2.3 KiB
Python
86 lines
2.3 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] = []
|
|
sample_model: str | None = None
|
|
sample_input_tokens: int | None = None
|
|
sample_output_tokens: int | None = None
|
|
sample_latency_ms: int | None = None
|
|
# 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
|