/ src / api / routes / config.py
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      )