- AIMessage.content: Union[str, List[dict]] for text-only and multimodal (e.g. image_url) - Image requests with content array now pass validation and are forwarded to AI
125 lines
2.7 KiB
Python
125 lines
2.7 KiB
Python
from pydantic import BaseModel, ConfigDict
|
|
from typing import List, Optional, Union
|
|
from datetime import datetime
|
|
|
|
# Heir Schemas
|
|
class HeirBase(BaseModel):
|
|
name: str
|
|
|
|
class HeirCreate(HeirBase):
|
|
pass
|
|
|
|
class HeirOut(HeirBase):
|
|
id: int
|
|
user_id: int
|
|
model_config = ConfigDict(from_attributes=True)
|
|
|
|
# User Schemas
|
|
class UserCreate(BaseModel):
|
|
username: str
|
|
password: str
|
|
email: str
|
|
|
|
class UserLogin(BaseModel):
|
|
username: str
|
|
password: str
|
|
|
|
class UserOut(BaseModel):
|
|
id: int
|
|
username: str
|
|
public_key: Optional[str] = None
|
|
is_admin: bool = False
|
|
guale: bool = False
|
|
tier: Optional[str] = None
|
|
tier_expires_at: Optional[datetime] = None
|
|
last_active_at: Optional[datetime] = None
|
|
#heirs: List[HeirOut] = []
|
|
model_config = ConfigDict(from_attributes=True)
|
|
|
|
class LoginResponse(BaseModel):
|
|
access_token: str
|
|
token_type: str
|
|
user: UserOut
|
|
|
|
|
|
# Asset Schemas (renamed from Article)
|
|
class AssetBase(BaseModel):
|
|
title: str
|
|
type: Optional[str] = "note"
|
|
|
|
class AssetCreate(AssetBase):
|
|
private_key_shard: str
|
|
content_inner_encrypted: str
|
|
|
|
class AssetOut(AssetBase):
|
|
id: int
|
|
author_id: int
|
|
private_key_shard: str
|
|
content_outer_encrypted: str
|
|
created_at: Optional[datetime] = None
|
|
updated_at: Optional[datetime] = None
|
|
heir_id: Optional[int] = None
|
|
heir_email: Optional[str] = None
|
|
model_config = ConfigDict(from_attributes=True)
|
|
|
|
class AssetClaim(BaseModel):
|
|
asset_id: int
|
|
private_key_shard: str
|
|
|
|
class AssetClaimOut(AssetClaim):
|
|
id: int
|
|
result: str
|
|
|
|
class AssetAssign(BaseModel):
|
|
asset_id: int
|
|
heir_email: str
|
|
|
|
class AssetDelete(BaseModel):
|
|
asset_id: int
|
|
|
|
class DeclareGuale(BaseModel):
|
|
username: str
|
|
|
|
# AI Proxy Schemas (content: str for text-only, list for multimodal e.g. image_url)
|
|
class AIMessage(BaseModel):
|
|
role: str
|
|
content: Union[str, List[dict]]
|
|
|
|
class AIRequest(BaseModel):
|
|
messages: List[AIMessage]
|
|
model: Optional[str] = None
|
|
|
|
class AIResponse(BaseModel):
|
|
id: str
|
|
object: str
|
|
created: int
|
|
model: str
|
|
choices: List[dict]
|
|
usage: dict
|
|
|
|
|
|
# Subscription Plans Schemas
|
|
class SubscriptionPlansBase(BaseModel):
|
|
name: str
|
|
max_heirs: int
|
|
weekly_token_limit: int
|
|
max_assets: int
|
|
max_storage_mb: int
|
|
can_use_ai_proxy: bool
|
|
description: Optional[str] = None
|
|
|
|
class SubscriptionPlansOut(SubscriptionPlansBase):
|
|
id: int
|
|
model_config = ConfigDict(from_attributes=True)
|
|
|
|
# AI Role Schemas
|
|
class AIRoleBase(BaseModel):
|
|
id: int
|
|
name: str
|
|
description: str
|
|
systemPrompt: str
|
|
icon: str
|
|
iconFamily: str
|
|
|
|
class AIRoleOut(AIRoleBase):
|
|
model_config = ConfigDict(from_attributes=True) |