diff --git a/app/constants.py b/app/constants.py
index 1dd64688..5156c7c0 100644
--- a/app/constants.py
+++ b/app/constants.py
@@ -3,3 +3,5 @@
)
INTERRUPT_CANCEL_REPLY = "Previous tool canceled by the user."
+
+BEDROCK_TOOL_ERROR_MESSAGE = "toolConfig field must be defined"
\ No newline at end of file
diff --git a/app/routers/websocket.py b/app/routers/websocket.py
index b5b76bbd..4ccc505a 100644
--- a/app/routers/websocket.py
+++ b/app/routers/websocket.py
@@ -19,6 +19,7 @@
from ..services.auth import get_user_id
from ..constants import CONTEXT_PARAMETERS_SUFFIX
+from ..constants import BEDROCK_TOOL_ERROR_MESSAGE
router = APIRouter()
@@ -104,6 +105,7 @@ async def websocket_endpoint(websocket: WebSocket, thread_id: str = None, llm: B
base_config["callbacks"] = [langfuse_handler]
while True:
+ is_bedrock_tool_error = False
try:
request = await websocket.receive_text()
request_id = str(uuid.uuid4())
@@ -127,13 +129,16 @@ async def websocket_endpoint(websocket: WebSocket, thread_id: str = None, llm: B
break
except Exception as e:
logging.error(f"An error occurred: {e}", exc_info=True)
+ is_bedrock_tool_error = BEDROCK_TOOL_ERROR_MESSAGE in str(e)
if websocket.client_state == WebSocketState.CONNECTED:
- await websocket.send_text(f'{json.dumps({"message": str(e)})}')
+ if not is_bedrock_tool_error:
+ await websocket.send_text(f'{json.dumps({"message": str(e)})}')
else:
break
finally:
if websocket.client_state == WebSocketState.CONNECTED:
- await websocket.send_text("")
+ if not is_bedrock_tool_error:
+ await websocket.send_text("")
async def _call_agent(
agent: CompiledStateGraph,
diff --git a/app/services/agent/middleware/ui_tools.py b/app/services/agent/middleware/ui_tools.py
index ec507fee..0eeb693c 100644
--- a/app/services/agent/middleware/ui_tools.py
+++ b/app/services/agent/middleware/ui_tools.py
@@ -1,5 +1,6 @@
import json
import logging
+import os
from typing import Any
from langchain.agents.middleware import AgentState, after_agent
@@ -12,6 +13,11 @@
from langgraph.runtime import Runtime
from ...ui_tools.selector import create_ui_tools_selector
+from ...llm import (
+ get_llm,
+ get_active_llm,
+ get_llm_model,
+)
def ui_tools_middleware(llm: BaseChatModel, only_when_direct: bool = False):
@@ -81,6 +87,12 @@ async def _dispatch_ui_tools_event(
List of selected UI tools, or empty list if dispatch was skipped.
"""
try:
+ activeLlm = get_active_llm()
+
+ if activeLlm.lower() == "bedrock":
+ logging.debug("Skipping UI tools dispatch for Bedrock to avoid toolConfig errors")
+ return []
+
request_metadata = config.get("configurable", {}).get("request_metadata", {})
ui_tools_config = request_metadata.get("ui_tools", {})