from typing import Any from fastapi import APIRouter, Depends, HTTPException from pydantic import BaseModel, Field from sqlalchemy.orm import Session from app.auth.deps import get_current_user from app.character.service import CharacterService from app.db.base import get_db from app.db.models import User router = APIRouter() class CharacterCardData(BaseModel): name: str = "Ассистент" description: str = "" personality: str = "" scenario: str = "" first_mes: str = "" mes_example: str = "" system_prompt: str = "" post_history_instructions: str = "" tags: list[str] = Field(default_factory=list) creator: str = "" creator_notes: str = "" alternate_greetings: list[str] = Field(default_factory=list) character_version: str = "1.0" appearance_tags: str = "" appearance_prose: str = "" lora_name: str = "" lora_weight: float = 0.8 rp_persona_id: str = "" sd_enabled: bool = True class CharacterCardV2(BaseModel): spec: str = "chara_card_v2" spec_version: str = "2.0" data: CharacterCardData @router.get("/character") def get_character( db: Session = Depends(get_db), user: User = Depends(get_current_user), ) -> dict[str, Any]: return CharacterService(db, user.id).get_card() @router.put("/character") def update_character( payload: CharacterCardV2, db: Session = Depends(get_db), user: User = Depends(get_current_user), ) -> dict[str, Any]: return CharacterService(db, user.id).save_card(payload.model_dump()) @router.get("/character/prompt") def get_character_prompt( db: Session = Depends(get_db), user: User = Depends(get_current_user), ) -> dict[str, str]: service = CharacterService(db, user.id) return { "system_prompt": service.get_system_prompt(), "first_mes": service.get_card().get("data", {}).get("first_mes", ""), } @router.post("/character/import") def import_character( payload: dict[str, Any], db: Session = Depends(get_db), user: User = Depends(get_current_user), ) -> dict[str, Any]: if not payload: raise HTTPException(status_code=400, detail="Empty card") return CharacterService(db, user.id).save_card(payload)