81 lines
2.3 KiB
Python
81 lines
2.3 KiB
Python
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)
|