Pipeline/backend/app/schemas/provider_credentials.py

108 lines
3.4 KiB
Python
Raw Normal View History

"""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
2026-05-21 03:29:35 -05:00
session_key: str | None = None # Claude.ai / ChatGPT session token for subscription usage
base_url: str | None = None
active: bool = True
2026-05-20 23:03:19 -05:00
class ProviderCredentialTestRequest(SQLModel):
provider: str
account_key: str = "test"
api_key: str | None = None
2026-05-21 03:29:35 -05:00
session_key: str | None = None
2026-05-20 23:03:19 -05:00
base_url: str | None = None
class ProviderCredentialUpdate(SQLModel):
display_name: str | None = None
2026-05-21 03:29:35 -05:00
api_key: str | None = None # None = keep existing; "" = clear it
session_key: str | None = None # None = keep existing; "" = clear it
base_url: str | None = None
active: bool | None = None
2026-05-21 03:29:35 -05:00
class SubscriptionWindowRead(SQLModel):
"""One subscription-plan usage window from a session/OAuth token."""
key: str # "five_hour" | "seven_day" | "seven_day_sonnet" | etc.
label: str # "Current session" | "All models" | "Sonnet" | "3h" | "Week"
pct_used: float # 0100
reset_in_ms: int | None = None
source: str = "provider_native"
confidence: str = "high"
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
source: str # provider_native | provider_api_rate_limit | local_jsonl_estimate | configured_limit
confidence: str # high | medium | low
error: str | None = None
tokens: TokenWindowRead
2026-05-21 02:25:50 -05:00
input_tokens: TokenWindowRead # Anthropic input-only window
output_tokens: TokenWindowRead # Anthropic output-only window
requests: RequestWindowRead
2026-05-21 03:29:35 -05:00
# Subscription usage windows — populated when session_key is configured
subscription_windows: list[SubscriptionWindowRead] = []
subscription_plan: str | None = None # e.g. "pro", "plus ($15.00)"
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
2026-05-20 23:03:19 -05:00
# Optional debugging aid: exact rate-limit header names returned by provider.
debug_rate_limit_headers: list[str] | None = None
class ProviderCredentialRead(SQLModel):
2026-05-21 03:29:35 -05:00
"""Safe read schema — api_key and session_key are 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
2026-05-21 03:29:35 -05:00
session_key_last_four: str | None = None
has_session_key: bool = False
base_url: str | None
active: bool
created_at: datetime
updated_at: datetime