From cbeb220f00b65bbd8d087dd46a385b593f34dde7 Mon Sep 17 00:00:00 2001 From: Debanjum Date: Wed, 12 Nov 2025 10:40:17 -0800 Subject: [PATCH] Show validation errors in UX if agent creation, update fails Previously we only showed unsafe prompt errors to user when creating/updating agent. Errors in name collision were not shown on the web app ux. This change ensures that such validation errors are bubbled up to the user in the UX. So they can resolve the agent create/update error on their end. --- src/khoj/routers/api_agents.py | 73 ++++++++++++++++++++-------------- 1 file changed, 44 insertions(+), 29 deletions(-) diff --git a/src/khoj/routers/api_agents.py b/src/khoj/routers/api_agents.py index 5c701e85..d8bab057 100644 --- a/src/khoj/routers/api_agents.py +++ b/src/khoj/routers/api_agents.py @@ -5,6 +5,7 @@ from datetime import datetime, timedelta, timezone from typing import Dict, List, Optional from asgiref.sync import sync_to_async +from django.core.exceptions import ValidationError from fastapi import APIRouter, Request from fastapi.responses import Response from pydantic import BaseModel @@ -389,22 +390,29 @@ async def create_agent( else: agent_chat_model = None - agent = await AgentAdapters.aupdate_agent( - user, - body.name, - body.persona, - body.privacy_level, - body.icon, - body.color, - agent_chat_model, - body.files, - body.input_tools, - body.output_modes, - body.slug, - body.is_hidden, - ) - agent.chat_model = await AgentAdapters.aget_agent_chat_model(agent, user) + try: + agent = await AgentAdapters.aupdate_agent( + user, + body.name, + body.persona, + body.privacy_level, + body.icon, + body.color, + agent_chat_model, + body.files, + body.input_tools, + body.output_modes, + body.slug, + body.is_hidden, + ) + except ValidationError as e: + return Response( + content=json.dumps({"error": e.message}), + media_type="application/json", + status_code=400, + ) + agent.chat_model = await AgentAdapters.aget_agent_chat_model(agent, user) agents_packet = { "slug": agent.slug, "name": agent.name, @@ -462,21 +470,28 @@ async def update_agent( else: agent_chat_model = None - agent = await AgentAdapters.aupdate_agent( - user, - body.name, - body.persona, - body.privacy_level, - body.icon, - body.color, - agent_chat_model, - body.files, - body.input_tools, - body.output_modes, - body.slug, - ) - agent.chat_model = await AgentAdapters.aget_agent_chat_model(agent, user) + try: + agent = await AgentAdapters.aupdate_agent( + user, + body.name, + body.persona, + body.privacy_level, + body.icon, + body.color, + agent_chat_model, + body.files, + body.input_tools, + body.output_modes, + body.slug, + ) + except ValidationError as e: + return Response( + content=json.dumps({"error": e.message}), + media_type="application/json", + status_code=400, + ) + agent.chat_model = await AgentAdapters.aget_agent_chat_model(agent, user) agents_packet = { "slug": agent.slug, "name": agent.name,