From 2f11ad79cf1b0c2550304a568fcc061401f466ea Mon Sep 17 00:00:00 2001 From: Jeroen Schweitzer Date: Wed, 14 Jan 2026 15:07:55 +0100 Subject: [PATCH] fix: handle mode as string due to use_enum_values=True The BaseSchema has use_enum_values=True which makes Pydantic store enum values as strings. Added _get_mode() helper to convert back to PermissionMode enum before passing to agent methods. Co-Authored-By: Claude Opus 4.5 --- webber-api/src/domains/agents/router.py | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/webber-api/src/domains/agents/router.py b/webber-api/src/domains/agents/router.py index 120d38d..283d9d3 100644 --- a/webber-api/src/domains/agents/router.py +++ b/webber-api/src/domains/agents/router.py @@ -23,6 +23,13 @@ from src.domains.agents.schemas import ( AgentListResponse, PermissionMode, ) + + +def _get_mode(mode_value: str | PermissionMode) -> PermissionMode: + """Convert mode string to enum (handles use_enum_values=True).""" + if isinstance(mode_value, PermissionMode): + return mode_value + return PermissionMode(mode_value) from src.shared.logging import logged, get_logger logger = get_logger(__name__) @@ -56,18 +63,21 @@ async def run_agent(request: AgentRunRequest) -> AgentRunResponse: detail=f"Unknown agent type: {request.agent_type}" ) + # Convert mode string to enum (use_enum_values=True in schema) + mode = _get_mode(request.mode) + try: # Run the agent with mode response = await agent.run( request.prompt, working_dir=request.working_dir, - mode=request.mode, + mode=mode, ) return AgentRunResponse( response=response, agent_type=request.agent_type, - mode=request.mode, + mode=request.mode, # Keep original for response success=True, ) @@ -103,19 +113,22 @@ async def stream_agent(request: AgentRunRequest) -> StreamingResponse: detail=f"Unknown agent type: {request.agent_type}" ) + # Convert mode string to enum (use_enum_values=True in schema) + mode = _get_mode(request.mode) + async def generate(): try: async for chunk in agent.run_stream( request.prompt, working_dir=request.working_dir, - mode=request.mode, + mode=mode, ): # SSE format: data: {json}\n\n event = {"event": "chunk", "data": chunk} yield f"data: {json.dumps(event)}\n\n" # Signal completion - yield f"data: {json.dumps({'event': 'done', 'mode': request.mode.value})}\n\n" + yield f"data: {json.dumps({'event': 'done', 'mode': mode.value})}\n\n" except Exception as e: logger.exception(f"Stream error: {e}")