config.py
1 """ 2 Configuration endpoints for Ag3ntum API. 3 4 Provides admin-only endpoints for inspecting and managing system configuration. 5 """ 6 from typing import Optional 7 8 from fastapi import APIRouter, Depends, Query 9 from pydantic import BaseModel, Field 10 11 from ..deps import require_admin 12 from ...core.prompt_manager import get_prompt_manager 13 14 router = APIRouter(prefix="/config", tags=["config"]) 15 16 17 class SystemPromptResponse(BaseModel): 18 """Response from GET /config/system_prompt.""" 19 20 prompt: str = Field(description="The rendered system prompt") 21 role: str = Field(description="Role template used") 22 model: str = Field(description="Model name in prompt context") 23 available_roles: list[str] = Field(description="Available role templates") 24 prompt_modules: list[str] = Field(description="Prompt modules included") 25 26 27 class ReloadResponse(BaseModel): 28 """Response from POST /config/prompts/reload.""" 29 30 status: str = Field(description="Reload status") 31 cache_entries_cleared: int = Field(description="Number of cache entries cleared") 32 33 34 @router.get("/system_prompt", response_model=SystemPromptResponse) 35 async def get_system_prompt( 36 role: str = Query( 37 default="default", 38 description="Role template to use (from prompts/roles/<role>.md)" 39 ), 40 model: str = Query( 41 default="claude-sonnet-4-20250514", 42 description="Model name to include in prompt context" 43 ), 44 enable_skills: bool = Query( 45 default=True, 46 description="Whether to enable skills section in prompt" 47 ), 48 _admin=Depends(require_admin), # Require admin access 49 ) -> SystemPromptResponse: 50 """ 51 Get the current system prompt as it would be sent to Claude. 52 53 **Admin only** - requires admin role. 54 55 This endpoint renders the system prompt with the specified parameters, 56 allowing admins to inspect what the agent sees as its instructions. 57 58 The response includes: 59 - The fully rendered system prompt 60 - Metadata about the role and model used 61 - Available roles and prompt modules for reference 62 """ 63 manager = get_prompt_manager() 64 65 # Build the system prompt 66 prompt = manager.build_system_prompt( 67 role=role, 68 model=model, 69 session_id=None, # Preview mode 70 docker_workspace_path="/workspace", 71 permissions=None, # No specific permissions for preview 72 enable_skills=enable_skills, 73 external_mounts=None, # No mounts for preview 74 ) 75 76 return SystemPromptResponse( 77 prompt=prompt, 78 role=role, 79 model=model, 80 available_roles=manager.get_available_roles(), 81 prompt_modules=manager.get_prompt_modules(), 82 ) 83 84 85 @router.post("/prompts/reload", response_model=ReloadResponse) 86 async def reload_prompts( 87 _admin=Depends(require_admin), # Require admin access 88 ) -> ReloadResponse: 89 """ 90 Hot-reload prompt templates and override configuration. 91 92 **Admin only** - requires admin role. 93 94 Clears the prompt template cache and reloads the override allowlist 95 from config/prompt-overrides.yaml. New sessions will use the updated 96 prompts. Existing sessions are not affected. 97 """ 98 manager = get_prompt_manager() 99 cleared = manager.reload() 100 101 return ReloadResponse( 102 status="ok", 103 cache_entries_cleared=cleared, 104 )