from fastapi import APIRouter from pydantic import BaseModel from typing import Any, Dict, Optional from src.config.runtime import behavior, _DEFAULT_BEHAVIOR router = APIRouter(prefix="/config/behavior", tags=["behavior"]) class BehaviorUpdateRequest(BaseModel): temperature: Optional[float] = None max_tokens: Optional[int] = None safety_weight: Optional[float] = None factuality_weight: Optional[float] = None truthfulness_weight: Optional[float] = None refusal_threshold: Optional[float] = None safla_learning_rate: Optional[float] = None safla_confidence_floor: Optional[float] = None retrieval_similarity: Optional[float] = None retrieval_confidence: Optional[float] = None retrieval_usage: Optional[float] = None @router.get("") async def get_behavior(): return { **behavior.to_dict(), "system_prompt_preview": behavior.build_system_prompt(), } @router.put("") async def update_behavior(req: BehaviorUpdateRequest): updates = {k: v for k, v in req.model_dump().items() if v is not None} behavior.apply(updates) return { **behavior.to_dict(), "system_prompt_preview": behavior.build_system_prompt(), } @router.post("/reset") async def reset_behavior(): behavior.apply(_DEFAULT_BEHAVIOR) return behavior.to_dict()