2026-05-20 22:03:57 -05:00
|
|
|
|
"""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
|
2026-05-20 22:03:57 -05:00
|
|
|
|
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
|
|
|
|
|
|
|
|
|
|
|
|
|
2026-05-20 22:03:57 -05:00
|
|
|
|
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
|
2026-05-20 22:03:57 -05:00
|
|
|
|
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 # 0–100
|
|
|
|
|
|
reset_in_ms: int | None = None
|
|
|
|
|
|
source: str = "provider_native"
|
|
|
|
|
|
confidence: str = "high"
|
|
|
|
|
|
|
|
|
|
|
|
|
2026-05-20 22:03:57 -05:00
|
|
|
|
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
|
2026-05-21 01:01:05 -05:00
|
|
|
|
source: str # provider_native | provider_api_rate_limit | local_jsonl_estimate | configured_limit
|
|
|
|
|
|
confidence: str # high | medium | low
|
2026-05-20 22:03:57 -05:00
|
|
|
|
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
|
2026-05-20 22:03:57 -05:00
|
|
|
|
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)"
|
2026-05-20 22:03:57 -05:00
|
|
|
|
models: list[str] = []
|
2026-05-20 23:22:54 -05:00
|
|
|
|
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
|
2026-05-20 22:03:57 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class ProviderCredentialRead(SQLModel):
|
2026-05-21 03:29:35 -05:00
|
|
|
|
"""Safe read schema — api_key and session_key are never included."""
|
2026-05-20 22:03:57 -05:00
|
|
|
|
|
|
|
|
|
|
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
|
2026-05-20 22:03:57 -05:00
|
|
|
|
base_url: str | None
|
|
|
|
|
|
active: bool
|
|
|
|
|
|
created_at: datetime
|
|
|
|
|
|
updated_at: datetime
|