legco_ai_assistant/backend/app/routers/prompts.py

90 lines
2.6 KiB
Python

import logging
from fastapi import APIRouter, HTTPException
from app.core.dependencies import get_prompt_service
from app.models.prompts import (
ProfileListResponse,
ProfileItem,
PromptSetResponse,
PromptUpdateRequest,
PromptBatchUpdateRequest,
ResetToDefaultsRequest,
)
logger = logging.getLogger(__name__)
router = APIRouter(prefix="/api/v1/prompts", tags=["prompts"])
_VALID_NAMES = {"A", "B", "C"}
_VALID_STEPS = {
"decompose",
"filter",
"generate",
"generate_per_subq",
"filter_intro",
"filter_section",
"filter_outro",
}
def _ensure_valid_name(name: str) -> None:
if name not in _VALID_NAMES:
raise HTTPException(status_code=400, detail=f"Invalid profile name '{name}'. Must be one of A, B, C.")
def _ensure_valid_step(step: str) -> None:
if step not in _VALID_STEPS:
raise HTTPException(status_code=400, detail=f"Invalid step '{step}'. Must be one of decompose, filter, generate.")
@router.get("/profiles", response_model=ProfileListResponse)
def list_profiles():
svc = get_prompt_service()
profiles = [ProfileItem(**p) for p in svc.list_profiles()]
return ProfileListResponse(profiles=profiles)
@router.get("/profiles/{name}", response_model=PromptSetResponse)
def get_profile_prompts(name: str):
_ensure_valid_name(name)
svc = get_prompt_service()
prompts = svc.get_profile_prompts(name)
return PromptSetResponse(profile_name=name, prompts=prompts)
@router.put("/profiles/{name}/activate")
def activate_profile(name: str):
_ensure_valid_name(name)
svc = get_prompt_service()
svc.activate_profile(name)
return {"status": "ok", "active_profile": name}
@router.put("/profiles/{name}/all")
def update_all_prompts(name: str, body: PromptBatchUpdateRequest):
_ensure_valid_name(name)
svc = get_prompt_service()
svc.update_all_prompts(name, body.prompts)
return {"status": "ok", "profile": name}
@router.put("/profiles/{name}/reset")
def reset_to_defaults(name: str, body: ResetToDefaultsRequest | None = None):
_ensure_valid_name(name)
step = body.step if body else None
if step is not None:
_ensure_valid_step(step)
svc = get_prompt_service()
svc.reset_to_defaults(name, step=step)
return {"status": "ok", "profile": name, "reset_step": step or "all"}
@router.put("/profiles/{name}/{step}")
def update_prompt(name: str, step: str, body: PromptUpdateRequest):
_ensure_valid_name(name)
_ensure_valid_step(step)
svc = get_prompt_service()
svc.update_prompt(name, step, body.template)
return {"status": "ok", "profile": name, "step": step}