diff --git a/backend/open_webui/utils/tools.py b/backend/open_webui/utils/tools.py index 3b449984f9..f7333d85be 100644 --- a/backend/open_webui/utils/tools.py +++ b/backend/open_webui/utils/tools.py @@ -814,6 +814,8 @@ def convert_openapi_to_tool_payload(openapi_spec): for path, methods in openapi_spec.get('paths', {}).items(): for method, operation in methods.items(): + if not isinstance(operation, dict): + continue if operation.get('operationId'): tool = { 'name': operation.get('operationId'), @@ -1324,6 +1326,8 @@ async def execute_tool_server( method_entry = None for http_method, operation in methods.items(): + if not isinstance(operation, dict): + continue if operation.get('operationId') == name: method_entry = (http_method.lower(), operation) break diff --git a/src/lib/apis/index.ts b/src/lib/apis/index.ts index 833979ada0..058c7f2c82 100644 --- a/src/lib/apis/index.ts +++ b/src/lib/apis/index.ts @@ -530,7 +530,9 @@ export const executeToolServer = async ( try { // Find the matching operationId in the OpenAPI spec const matchingRoute = Object.entries(serverData.openapi.paths).find(([_, methods]) => - Object.entries(methods as any).some(([__, operation]: any) => operation.operationId === name) + Object.entries(methods as any).some( + ([__, operation]: any) => operation && typeof operation === 'object' && operation.operationId === name + ) ); if (!matchingRoute) { @@ -540,7 +542,7 @@ export const executeToolServer = async ( const [routePath, methods] = matchingRoute; const methodEntry = Object.entries(methods as any).find( - ([_, operation]: any) => operation.operationId === name + ([_, operation]: any) => operation && typeof operation === 'object' && operation.operationId === name ); if (!methodEntry) { diff --git a/src/lib/utils/index.ts b/src/lib/utils/index.ts index 82ca9caaba..504ee8bc82 100644 --- a/src/lib/utils/index.ts +++ b/src/lib/utils/index.ts @@ -1395,7 +1395,8 @@ export const convertOpenApiToToolPayload = (openApiSpec) => { for (const [path, methods] of Object.entries(openApiSpec.paths)) { for (const [method, operation] of Object.entries(methods)) { - if (operation?.operationId) { + if (!operation || typeof operation !== 'object') continue; + if ((operation as any)?.operationId) { const tool = { name: operation.operationId, description: operation.description || operation.summary || 'No description available.',