"""用户面 API schema(神识阁数据源:BYOK 密钥与用量)。""" from pydantic import BaseModel, Field ByokType = str # openai_compatible / anthropic / gemini(契约词典 §14.2,神识侧校验) class ByokKeyView(BaseModel): """BYOK 密钥脱敏形态(API 永不回明文)。""" model_config = {"extra": "allow"} # 神识侧字段直通(id/name/type/base_url/model/api_key_mask/…) class ByokKeyListResponse(BaseModel): keys: list[dict] = Field(default_factory=list, description="脱敏密钥清单。") class RegisterByokKeyRequest(BaseModel): """登记用户自带密钥。""" name: str = Field(min_length=1, max_length=120, description="密钥备注名。") type: ByokType = Field(description="端点类型:openai_compatible / anthropic / gemini。") base_url: str = Field(min_length=1, max_length=500, description="Provider Base URL。") api_key: str = Field(min_length=8, max_length=500, description="密钥明文(仅本次请求可见,落库即加密)。") model: str = Field(min_length=1, max_length=200, description="该密钥承载的上游模型名。") class UsageRow(BaseModel): """用量聚合行(用户×模型×端点)。""" model_config = {"extra": "allow"} class MyUsageResponse(BaseModel): rows: list[dict] = Field(default_factory=list, description="用量聚合行。") quota: dict | None = Field(default=None, description="配额总览(budget/used/reserved)。")