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 <noreply@anthropic.com>
This commit is contained in:
@@ -23,6 +23,13 @@ from src.domains.agents.schemas import (
|
|||||||
AgentListResponse,
|
AgentListResponse,
|
||||||
PermissionMode,
|
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
|
from src.shared.logging import logged, get_logger
|
||||||
|
|
||||||
logger = get_logger(__name__)
|
logger = get_logger(__name__)
|
||||||
@@ -56,18 +63,21 @@ async def run_agent(request: AgentRunRequest) -> AgentRunResponse:
|
|||||||
detail=f"Unknown agent type: {request.agent_type}"
|
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:
|
try:
|
||||||
# Run the agent with mode
|
# Run the agent with mode
|
||||||
response = await agent.run(
|
response = await agent.run(
|
||||||
request.prompt,
|
request.prompt,
|
||||||
working_dir=request.working_dir,
|
working_dir=request.working_dir,
|
||||||
mode=request.mode,
|
mode=mode,
|
||||||
)
|
)
|
||||||
|
|
||||||
return AgentRunResponse(
|
return AgentRunResponse(
|
||||||
response=response,
|
response=response,
|
||||||
agent_type=request.agent_type,
|
agent_type=request.agent_type,
|
||||||
mode=request.mode,
|
mode=request.mode, # Keep original for response
|
||||||
success=True,
|
success=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -103,19 +113,22 @@ async def stream_agent(request: AgentRunRequest) -> StreamingResponse:
|
|||||||
detail=f"Unknown agent type: {request.agent_type}"
|
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():
|
async def generate():
|
||||||
try:
|
try:
|
||||||
async for chunk in agent.run_stream(
|
async for chunk in agent.run_stream(
|
||||||
request.prompt,
|
request.prompt,
|
||||||
working_dir=request.working_dir,
|
working_dir=request.working_dir,
|
||||||
mode=request.mode,
|
mode=mode,
|
||||||
):
|
):
|
||||||
# SSE format: data: {json}\n\n
|
# SSE format: data: {json}\n\n
|
||||||
event = {"event": "chunk", "data": chunk}
|
event = {"event": "chunk", "data": chunk}
|
||||||
yield f"data: {json.dumps(event)}\n\n"
|
yield f"data: {json.dumps(event)}\n\n"
|
||||||
|
|
||||||
# Signal completion
|
# 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:
|
except Exception as e:
|
||||||
logger.exception(f"Stream error: {e}")
|
logger.exception(f"Stream error: {e}")
|
||||||
|
|||||||
Reference in New Issue
Block a user