From 65fd73191716b78c09b831510af2f7e338b9b1ae Mon Sep 17 00:00:00 2001 From: Matthew Zhou Date: Fri, 13 Dec 2024 11:48:07 -0800 Subject: [PATCH] feat: Catch composio errors and return informative errors in the endpoint (#2247) --- letta/server/rest_api/routers/v1/tools.py | 24 +++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/letta/server/rest_api/routers/v1/tools.py b/letta/server/rest_api/routers/v1/tools.py index 1b5e2eac..d288ca02 100644 --- a/letta/server/rest_api/routers/v1/tools.py +++ b/letta/server/rest_api/routers/v1/tools.py @@ -1,6 +1,8 @@ from typing import List, Optional from composio.client.collections import ActionModel, AppModel +from composio.client.enums.base import EnumStringNotFound +from composio.exceptions import ComposioSDKError from fastapi import APIRouter, Body, Depends, Header, HTTPException from letta.errors import LettaToolCreateError @@ -248,8 +250,26 @@ def add_composio_tool( """ actor = server.get_user_or_default(user_id=user_id) composio_api_key = get_composio_key(server, actor=actor) - tool_create = ToolCreate.from_composio(action_name=composio_action_name, api_key=composio_api_key) - return server.tool_manager.create_or_update_tool(pydantic_tool=Tool(**tool_create.model_dump()), actor=actor) + + try: + tool_create = ToolCreate.from_composio(action_name=composio_action_name, api_key=composio_api_key) + return server.tool_manager.create_or_update_tool(pydantic_tool=Tool(**tool_create.model_dump()), actor=actor) + except EnumStringNotFound: + raise HTTPException( + status_code=400, # Bad Request + detail={ + "message": f"Cannot find composio action with name `{composio_action_name}`.", + "composio_action_name": composio_action_name, + }, + ) + except ComposioSDKError: + raise HTTPException( + status_code=400, # Bad Request + detail={ + "message": f"No connected account found for tool `{composio_action_name}`. You need to connect the relevant app in Composio order to use the tool.", + "composio_action_name": composio_action_name, + }, + ) # TODO: Factor this out to somewhere else