diff --git a/src/backend/base/langflow/__main__.py b/src/backend/base/langflow/__main__.py index b2100d250..e9bd3358e 100644 --- a/src/backend/base/langflow/__main__.py +++ b/src/backend/base/langflow/__main__.py @@ -10,6 +10,7 @@ import click import httpx import typer from dotenv import load_dotenv +from httpx import HTTPError from multiprocess import cpu_count from multiprocess.context import Process from packaging import version as pkg_version @@ -218,7 +219,7 @@ def run( if process is not None: process.terminate() sys.exit(0) - except Exception as e: + except Exception as e: # noqa: BLE001 logger.exception(e) sys.exit(1) @@ -231,7 +232,10 @@ def wait_for_server_ready(host, port): while status_code != httpx.codes.OK: try: status_code = httpx.get(f"http://{host}:{port}/health").status_code - except Exception: + except HTTPError: + time.sleep(1) + except Exception: # noqa: BLE001 + logger.opt(exception=True).debug("Error while waiting for the server to become ready.") time.sleep(1) diff --git a/src/backend/base/langflow/api/health_check_router.py b/src/backend/base/langflow/api/health_check_router.py index d80e85823..1f03c9fe0 100644 --- a/src/backend/base/langflow/api/health_check_router.py +++ b/src/backend/base/langflow/api/health_check_router.py @@ -48,16 +48,16 @@ async def health_check( stmt = select(Flow).where(Flow.id == uuid.uuid4()) session.exec(stmt).first() response.db = "ok" - except Exception as e: - logger.exception(e) + except Exception: # noqa: BLE001 + logger.exception("Error checking database") try: chat = get_chat_service() await chat.set_cache("health_check", str(user_id)) await chat.get_cache("health_check") response.chat = "ok" - except Exception as e: - logger.exception(e) + except Exception: # noqa: BLE001 + logger.exception("Error checking chat service") if response.has_error(): raise HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=response.model_dump()) diff --git a/src/backend/base/langflow/api/v1/callback.py b/src/backend/base/langflow/api/v1/callback.py index aa5d651f0..6b8f5076b 100644 --- a/src/backend/base/langflow/api/v1/callback.py +++ b/src/backend/base/langflow/api/v1/callback.py @@ -74,7 +74,7 @@ class AsyncStreamingLLMCallbackHandleSIO(AsyncCallbackHandler): # This is to emulate the stream of tokens for resp in resps: await self.socketio_service.emit_token(to=self.sid, data=resp.model_dump()) - except Exception: + except Exception: # noqa: BLE001 logger.exception("Error sending response") async def on_tool_error( diff --git a/src/backend/base/langflow/api/v1/chat.py b/src/backend/base/langflow/api/v1/chat.py index 334f9c9c9..cf0ad8d5a 100644 --- a/src/backend/base/langflow/api/v1/chat.py +++ b/src/backend/base/langflow/api/v1/chat.py @@ -60,7 +60,7 @@ async def try_running_celery_task(vertex, user_id): task = build_vertex.delay(vertex) vertex.task_id = task.id - except Exception: + except Exception: # noqa: BLE001 logger.opt(exception=True).debug("Error running task in celery") vertex.task_id = None await vertex.build(user_id=user_id) @@ -167,8 +167,8 @@ async def build_flow( if stop_component_id or start_component_id: try: first_layer = graph.sort_vertices(stop_component_id, start_component_id) - except Exception as exc: - logger.exception(exc) + except Exception: # noqa: BLE001 + logger.exception("Error sorting vertices") first_layer = graph.sort_vertices() else: first_layer = graph.sort_vertices() @@ -233,7 +233,7 @@ async def build_flow( top_level_vertices = graph.get_top_level_vertices(next_runnable_vertices) result_data_response = ResultDataResponse.model_validate(result_dict, from_attributes=True) - except Exception as exc: + except Exception as exc: # noqa: BLE001 if isinstance(exc, ComponentBuildException): params = exc.message tb = exc.formatted_traceback @@ -515,7 +515,7 @@ async def build_vertex( next_runnable_vertices = await graph.get_next_runnable_vertices(lock, vertex=vertex, cache=False) top_level_vertices = graph.get_top_level_vertices(next_runnable_vertices) result_data_response = ResultDataResponse.model_validate(result_dict, from_attributes=True) - except Exception as exc: + except Exception as exc: # noqa: BLE001 if isinstance(exc, ComponentBuildException): params = exc.message tb = exc.formatted_traceback @@ -690,7 +690,7 @@ async def build_vertex_stream( msg = f"No result found for vertex {vertex_id}" raise ValueError(msg) - except Exception as exc: + except Exception as exc: # noqa: BLE001 logger.exception("Error building Component") exc_message = parse_exception(exc) if exc_message == "The message must be an iterator or an async iterator.": diff --git a/src/backend/base/langflow/api/v1/endpoints.py b/src/backend/base/langflow/api/v1/endpoints.py index 4d5fefef8..7d3d32114 100644 --- a/src/backend/base/langflow/api/v1/endpoints.py +++ b/src/backend/base/langflow/api/v1/endpoints.py @@ -168,7 +168,7 @@ async def simple_run_flow_task( api_key_user=api_key_user, ) - except Exception: + except Exception: # noqa: BLE001 logger.exception(f"Error running flow {flow.id} task") diff --git a/src/backend/base/langflow/api/v1/flows.py b/src/backend/base/langflow/api/v1/flows.py index 109aa53fd..c29a1d14e 100644 --- a/src/backend/base/langflow/api/v1/flows.py +++ b/src/backend/base/langflow/api/v1/flows.py @@ -170,8 +170,8 @@ def read_flows( for example_flow in example_flows: if example_flow.id not in flow_ids: flows.append(example_flow) - except Exception as e: - logger.exception(e) + except Exception: # noqa: BLE001 + logger.exception("Error getting example flows") if remove_example_flows: flows = [flow for flow in flows if flow.folder_id != folder.id] diff --git a/src/backend/base/langflow/api/v1/store.py b/src/backend/base/langflow/api/v1/store.py index 7ae900302..4d0147a92 100644 --- a/src/backend/base/langflow/api/v1/store.py +++ b/src/backend/base/langflow/api/v1/store.py @@ -42,7 +42,7 @@ def get_optional_user_store_api_key( return None try: return auth_utils.decrypt_api_key(user.store_api_key, settings_service) - except Exception: + except Exception: # noqa: BLE001 logger.exception("Failed to decrypt API key") return user.store_api_key diff --git a/src/backend/base/langflow/api/v1/validate.py b/src/backend/base/langflow/api/v1/validate.py index bd36d95f5..aa3828c5e 100644 --- a/src/backend/base/langflow/api/v1/validate.py +++ b/src/backend/base/langflow/api/v1/validate.py @@ -17,7 +17,8 @@ def post_validate_code(code: Code): imports=errors.get("imports", {}), function=errors.get("function", {}), ) - except Exception as e: + except Exception as e: # noqa: BLE001 + logger.opt(exception=True).debug("Error validating code") return HTTPException(status_code=500, detail=str(e)) diff --git a/src/backend/base/langflow/base/tools/flow_tool.py b/src/backend/base/langflow/base/tools/flow_tool.py index 9884ab52b..050d45eab 100644 --- a/src/backend/base/langflow/base/tools/flow_tool.py +++ b/src/backend/base/langflow/base/tools/flow_tool.py @@ -102,7 +102,7 @@ class FlowTool(BaseTool): tweaks = self.build_tweaks_dict(args, kwargs) try: run_id = self.graph.run_id if self.graph else None - except Exception: + except Exception: # noqa: BLE001 logger.opt(exception=True).warning("Failed to set run_id") run_id = None run_outputs = await run_flow( diff --git a/src/backend/base/langflow/components/Notion/add_content_to_page.py b/src/backend/base/langflow/components/Notion/add_content_to_page.py index 4e773b6b1..df2ee857b 100644 --- a/src/backend/base/langflow/components/Notion/add_content_to_page.py +++ b/src/backend/base/langflow/components/Notion/add_content_to_page.py @@ -4,6 +4,7 @@ from typing import Any import requests from bs4 import BeautifulSoup from langchain.tools import StructuredTool +from loguru import logger from markdown import markdown from pydantic import BaseModel, Field @@ -82,7 +83,8 @@ class AddContentToPage(LCToolComponent): if hasattr(e, "response") and e.response is not None: error_message += f" Status code: {e.response.status_code}, Response: {e.response.text}" return error_message - except Exception as e: + except Exception as e: # noqa: BLE001 + logger.opt(exception=True).debug("Error adding content to Notion page") return f"Error: An unexpected error occurred while adding content to Notion page. {e}" def process_node(self, node): diff --git a/src/backend/base/langflow/components/Notion/list_database_properties.py b/src/backend/base/langflow/components/Notion/list_database_properties.py index acdd4b09b..ef7900e1e 100644 --- a/src/backend/base/langflow/components/Notion/list_database_properties.py +++ b/src/backend/base/langflow/components/Notion/list_database_properties.py @@ -1,5 +1,6 @@ import requests from langchain.tools import StructuredTool +from loguru import logger from pydantic import BaseModel, Field from langflow.base.langchain_utilities.model import LCToolComponent @@ -62,5 +63,6 @@ class NotionDatabaseProperties(LCToolComponent): return f"Error fetching Notion database properties: {e}" except ValueError as e: return f"Error parsing Notion API response: {e}" - except Exception as e: + except Exception as e: # noqa: BLE001 + logger.opt(exception=True).debug("Error fetching Notion database properties") return f"An unexpected error occurred: {e}" diff --git a/src/backend/base/langflow/components/Notion/list_pages.py b/src/backend/base/langflow/components/Notion/list_pages.py index a8cb846ca..8855e4040 100644 --- a/src/backend/base/langflow/components/Notion/list_pages.py +++ b/src/backend/base/langflow/components/Notion/list_pages.py @@ -3,6 +3,7 @@ from typing import Any import requests from langchain.tools import StructuredTool +from loguru import logger from pydantic import BaseModel, Field from langflow.base.langchain_utilities.model import LCToolComponent @@ -116,5 +117,6 @@ class NotionListPages(LCToolComponent): return f"Error querying Notion database: {e}" except KeyError: return "Unexpected response format from Notion API" - except Exception as e: + except Exception as e: # noqa: BLE001 + logger.opt(exception=True).debug("Error querying Notion database") return f"An unexpected error occurred: {e}" diff --git a/src/backend/base/langflow/components/Notion/page_content_viewer.py b/src/backend/base/langflow/components/Notion/page_content_viewer.py index 6e3b853eb..73a63c0f9 100644 --- a/src/backend/base/langflow/components/Notion/page_content_viewer.py +++ b/src/backend/base/langflow/components/Notion/page_content_viewer.py @@ -1,5 +1,6 @@ import requests from langchain.tools import StructuredTool +from loguru import logger from pydantic import BaseModel, Field from langflow.base.langchain_utilities.model import LCToolComponent @@ -63,7 +64,8 @@ class NotionPageContent(LCToolComponent): if hasattr(e, "response") and e.response is not None: error_message += f" Status code: {e.response.status_code}, Response: {e.response.text}" return error_message - except Exception as e: + except Exception as e: # noqa: BLE001 + logger.opt(exception=True).debug("Error retrieving Notion page content") return f"Error: An unexpected error occurred while retrieving Notion page content. {e}" def parse_blocks(self, blocks: list) -> str: diff --git a/src/backend/base/langflow/components/Notion/update_page_property.py b/src/backend/base/langflow/components/Notion/update_page_property.py index caea0e227..0df3cb0ac 100644 --- a/src/backend/base/langflow/components/Notion/update_page_property.py +++ b/src/backend/base/langflow/components/Notion/update_page_property.py @@ -104,7 +104,7 @@ class NotionPageUpdate(LCToolComponent): error_message = f"An error occurred while making the request: {e}" logger.exception(error_message) return error_message - except Exception as e: + except Exception as e: # noqa: BLE001 error_message = f"An unexpected error occurred: {e}" logger.exception(error_message) return error_message diff --git a/src/backend/base/langflow/components/assemblyai/AssemblyAIGetSubtitles.py b/src/backend/base/langflow/components/assemblyai/AssemblyAIGetSubtitles.py index 4a7992e58..687461442 100644 --- a/src/backend/base/langflow/components/assemblyai/AssemblyAIGetSubtitles.py +++ b/src/backend/base/langflow/components/assemblyai/AssemblyAIGetSubtitles.py @@ -1,4 +1,5 @@ import assemblyai as aai +from loguru import logger from langflow.custom import Component from langflow.io import DataInput, DropdownInput, IntInput, Output, SecretStrInput @@ -53,8 +54,9 @@ class AssemblyAIGetSubtitles(Component): try: transcript_id = self.transcription_result.data["id"] transcript = aai.Transcript.get_by_id(transcript_id) - except Exception as e: + except Exception as e: # noqa: BLE001 error = f"Getting transcription failed: {e}" + logger.opt(exception=True).debug(error) self.status = error return Data(data={"error": error}) diff --git a/src/backend/base/langflow/components/assemblyai/AssemblyAILeMUR.py b/src/backend/base/langflow/components/assemblyai/AssemblyAILeMUR.py index bd4c80465..af6bf18f8 100644 --- a/src/backend/base/langflow/components/assemblyai/AssemblyAILeMUR.py +++ b/src/backend/base/langflow/components/assemblyai/AssemblyAILeMUR.py @@ -1,4 +1,5 @@ import assemblyai as aai +from loguru import logger from langflow.custom import Component from langflow.io import DataInput, DropdownInput, FloatInput, IntInput, MultilineInput, Output, SecretStrInput @@ -134,7 +135,8 @@ class AssemblyAILeMUR(Component): result = Data(data=response) self.status = result return result - except Exception as e: + except Exception as e: # noqa: BLE001 + logger.opt(exception=True).debug("Error running LeMUR") error = f"An Error happened: {e}" self.status = error return Data(data={"error": error}) diff --git a/src/backend/base/langflow/components/assemblyai/AssemblyAIListTranscripts.py b/src/backend/base/langflow/components/assemblyai/AssemblyAIListTranscripts.py index b19517d05..bcbcc0a7c 100644 --- a/src/backend/base/langflow/components/assemblyai/AssemblyAIListTranscripts.py +++ b/src/backend/base/langflow/components/assemblyai/AssemblyAIListTranscripts.py @@ -1,4 +1,5 @@ import assemblyai as aai +from loguru import logger from langflow.custom import Component from langflow.io import BoolInput, DropdownInput, IntInput, MessageTextInput, Output, SecretStrInput @@ -85,7 +86,8 @@ class AssemblyAIListTranscripts(Component): self.status = transcripts return transcripts - except Exception as e: + except Exception as e: # noqa: BLE001 + logger.opt(exception=True).debug("Error listing transcripts") error_data = Data(data={"error": f"An error occurred: {e}"}) self.status = [error_data] return [error_data] diff --git a/src/backend/base/langflow/components/assemblyai/AssemblyAIPollTranscript.py b/src/backend/base/langflow/components/assemblyai/AssemblyAIPollTranscript.py index de5aa8e97..13d01e5da 100644 --- a/src/backend/base/langflow/components/assemblyai/AssemblyAIPollTranscript.py +++ b/src/backend/base/langflow/components/assemblyai/AssemblyAIPollTranscript.py @@ -1,4 +1,5 @@ import assemblyai as aai +from loguru import logger from langflow.custom import Component from langflow.field_typing.range_spec import RangeSpec @@ -49,8 +50,9 @@ class AssemblyAITranscriptionJobPoller(Component): try: transcript = aai.Transcript.get_by_id(self.transcript_id.data["transcript_id"]) - except Exception as e: + except Exception as e: # noqa: BLE001 error = f"Getting transcription failed: {e}" + logger.opt(exception=True).debug(error) self.status = error return Data(data={"error": error}) diff --git a/src/backend/base/langflow/components/assemblyai/AssemblyAIStartTranscript.py b/src/backend/base/langflow/components/assemblyai/AssemblyAIStartTranscript.py index 58a934cb8..1fdd3b5c8 100644 --- a/src/backend/base/langflow/components/assemblyai/AssemblyAIStartTranscript.py +++ b/src/backend/base/langflow/components/assemblyai/AssemblyAIStartTranscript.py @@ -180,6 +180,7 @@ class AssemblyAITranscriptionJobCreator(Component): result = Data(data={"transcript_id": transcript.id}) self.status = result return result - except Exception as e: + except Exception as e: # noqa: BLE001 + logger.opt(exception=True).debug("Error submitting transcription job") self.status = f"An error occurred: {e}" return Data(data={"error": f"An error occurred: {e}"}) diff --git a/src/backend/base/langflow/components/data/APIRequest.py b/src/backend/base/langflow/components/data/APIRequest.py index 20ebc8184..e97b2a88b 100644 --- a/src/backend/base/langflow/components/data/APIRequest.py +++ b/src/backend/base/langflow/components/data/APIRequest.py @@ -131,7 +131,8 @@ class APIRequestComponent(Component): response = await client.request(method, url, headers=headers, json=data, timeout=timeout) try: result = response.json() - except Exception: + except Exception: # noqa: BLE001 + logger.opt(exception=True).debug("Error decoding JSON response") result = response.text return Data( data={ @@ -150,7 +151,8 @@ class APIRequestComponent(Component): "error": "Request timed out", }, ) - except Exception as exc: + except Exception as exc: # noqa: BLE001 + logger.opt(exception=True).debug(f"Error making request to {url}") return Data( data={ "source": url, diff --git a/src/backend/base/langflow/components/deactivated/SubFlow.py b/src/backend/base/langflow/components/deactivated/SubFlow.py index d360df5aa..98de25e10 100644 --- a/src/backend/base/langflow/components/deactivated/SubFlow.py +++ b/src/backend/base/langflow/components/deactivated/SubFlow.py @@ -54,7 +54,7 @@ class SubFlowComponent(CustomComponent): inputs = get_flow_inputs(graph) # Add inputs to the build config build_config = self.add_inputs_to_build_config(inputs, build_config) - except Exception: + except Exception: # noqa: BLE001 logger.exception(f"Error getting flow {field_value}") return build_config diff --git a/src/backend/base/langflow/components/helpers/CurrentDate.py b/src/backend/base/langflow/components/helpers/CurrentDate.py index 32ed6a84d..5967a466b 100644 --- a/src/backend/base/langflow/components/helpers/CurrentDate.py +++ b/src/backend/base/langflow/components/helpers/CurrentDate.py @@ -1,6 +1,8 @@ from datetime import datetime from zoneinfo import ZoneInfo +from loguru import logger + from langflow.custom import Component from langflow.io import DropdownInput, Output from langflow.schema.message import Message @@ -67,7 +69,8 @@ class CurrentDateComponent(Component): result = f"Current date and time in {self.timezone}: {current_date}" self.status = result return Message(text=result) - except Exception as e: + except Exception as e: # noqa: BLE001 + logger.opt(exception=True).debug("Error getting current date") error_message = f"Error: {e}" self.status = error_message return Message(text=error_message) diff --git a/src/backend/base/langflow/components/helpers/MessageToData.py b/src/backend/base/langflow/components/helpers/MessageToData.py index ed9fb93d9..74ee49964 100644 --- a/src/backend/base/langflow/components/helpers/MessageToData.py +++ b/src/backend/base/langflow/components/helpers/MessageToData.py @@ -1,3 +1,5 @@ +from loguru import logger + from langflow.custom import Component from langflow.io import MessageInput, Output from langflow.schema import Data @@ -34,7 +36,8 @@ class MessageToDataComponent(Component): self.status = "Successfully converted Message to Data" return data - except Exception as e: + except Exception as e: # noqa: BLE001 error_message = f"Error converting Message to Data: {e}" + logger.opt(exception=True).debug(error_message) self.status = error_message return Data(data={"error": error_message}) diff --git a/src/backend/base/langflow/components/prototypes/FlowTool.py b/src/backend/base/langflow/components/prototypes/FlowTool.py index 8e795a535..23f512cca 100644 --- a/src/backend/base/langflow/components/prototypes/FlowTool.py +++ b/src/backend/base/langflow/components/prototypes/FlowTool.py @@ -85,7 +85,7 @@ class FlowToolComponent(LCToolComponent): graph = Graph.from_payload(flow_data.data["data"]) try: graph.set_run_id(self.graph.run_id) - except Exception: + except Exception: # noqa: BLE001 logger.opt(exception=True).warning("Failed to set run_id") inputs = get_flow_inputs(graph) tool = FlowTool( diff --git a/src/backend/base/langflow/components/prototypes/PythonFunction.py b/src/backend/base/langflow/components/prototypes/PythonFunction.py index 0105ed1d0..507c3b564 100644 --- a/src/backend/base/langflow/components/prototypes/PythonFunction.py +++ b/src/backend/base/langflow/components/prototypes/PythonFunction.py @@ -1,5 +1,7 @@ from collections.abc import Callable +from loguru import logger + from langflow.custom import Component from langflow.custom.utils import get_function from langflow.io import CodeInput, Output @@ -54,7 +56,8 @@ class PythonFunctionComponent(Component): try: func = get_function(function_code) return func() - except Exception as e: + except Exception as e: # noqa: BLE001 + logger.opt(exception=True).debug("Error executing function") return f"Error executing function: {e}" def execute_function_data(self) -> list[Data]: diff --git a/src/backend/base/langflow/components/prototypes/SubFlow.py b/src/backend/base/langflow/components/prototypes/SubFlow.py index c1e61be82..b18ad083a 100644 --- a/src/backend/base/langflow/components/prototypes/SubFlow.py +++ b/src/backend/base/langflow/components/prototypes/SubFlow.py @@ -46,7 +46,7 @@ class SubFlowComponent(Component): inputs = get_flow_inputs(graph) # Add inputs to the build config build_config = self.add_inputs_to_build_config(inputs, build_config) - except Exception: + except Exception: # noqa: BLE001 logger.exception(f"Error getting flow {field_value}") return build_config diff --git a/src/backend/base/langflow/components/toolkits/ComposioAPI.py b/src/backend/base/langflow/components/toolkits/ComposioAPI.py index be63876d9..33286be3f 100644 --- a/src/backend/base/langflow/components/toolkits/ComposioAPI.py +++ b/src/backend/base/langflow/components/toolkits/ComposioAPI.py @@ -65,7 +65,8 @@ class ComposioAPIComponent(LCToolComponent): try: entity.get_connection(app=app) return f"{app} CONNECTED" - except Exception: + except Exception: # noqa: BLE001 + logger.opt(exception=True).debug("Authorization error") return self._handle_authorization_failure(toolset, entity, app) def _handle_authorization_failure(self, toolset: ComposioToolSet, entity: Any, app: str) -> str: @@ -85,7 +86,7 @@ class ComposioAPIComponent(LCToolComponent): if auth_schemes[0].auth_mode == "API_KEY": return self._process_api_key_auth(entity, app) return self._initiate_default_connection(entity, app) - except Exception: + except Exception: # noqa: BLE001 logger.exception("Authorization error") return "Error" diff --git a/src/backend/base/langflow/components/tools/Calculator.py b/src/backend/base/langflow/components/tools/Calculator.py index ac27e9099..8295b2547 100644 --- a/src/backend/base/langflow/components/tools/Calculator.py +++ b/src/backend/base/langflow/components/tools/Calculator.py @@ -2,6 +2,7 @@ import ast import operator from langchain.tools import StructuredTool +from loguru import logger from pydantic import BaseModel, Field from langflow.base.langchain_utilities.model import LCToolComponent @@ -76,7 +77,8 @@ class CalculatorToolComponent(LCToolComponent): error_message = "Error: Division by zero" self.status = error_message return [Data(data={"error": error_message})] - except Exception as e: + except Exception as e: # noqa: BLE001 + logger.opt(exception=True).debug("Error evaluating expression") error_message = f"Error: {e}" self.status = error_message return [Data(data={"error": error_message})] diff --git a/src/backend/base/langflow/components/tools/PythonCodeStructuredTool.py b/src/backend/base/langflow/components/tools/PythonCodeStructuredTool.py index 2257f61a0..75b4090c9 100644 --- a/src/backend/base/langflow/components/tools/PythonCodeStructuredTool.py +++ b/src/backend/base/langflow/components/tools/PythonCodeStructuredTool.py @@ -4,6 +4,7 @@ from typing import Any from langchain.agents import Tool from langchain_core.tools import StructuredTool +from loguru import logger from pydantic.v1 import Field, create_model from pydantic.v1.fields import Undefined @@ -119,8 +120,9 @@ class PythonCodeStructuredTool(LCToolComponent): build_config["_functions"]["value"] = json.dumps(named_functions) build_config["_classes"]["value"] = json.dumps(classes) build_config["tool_function"]["options"] = names - except Exception as e: + except Exception as e: # noqa: BLE001 self.status = f"Failed to extract names: {e}" + logger.opt(exception=True).debug(self.status) build_config["tool_function"]["options"] = ["Failed to parse", str(e)] return build_config diff --git a/src/backend/base/langflow/components/tools/PythonREPLTool.py b/src/backend/base/langflow/components/tools/PythonREPLTool.py index 245262f52..e98a147ed 100644 --- a/src/backend/base/langflow/components/tools/PythonREPLTool.py +++ b/src/backend/base/langflow/components/tools/PythonREPLTool.py @@ -2,6 +2,7 @@ import importlib from langchain.tools import StructuredTool from langchain_experimental.utilities import PythonREPL +from loguru import logger from pydantic import BaseModel, Field from langflow.base.langchain_utilities.model import LCToolComponent @@ -73,7 +74,8 @@ class PythonREPLToolComponent(LCToolComponent): def run_python_code(code: str) -> str: try: return python_repl.run(code) - except Exception as e: + except Exception as e: # noqa: BLE001 + logger.opt(exception=True).debug("Error running Python code") return f"Error: {e}" tool = StructuredTool.from_function( diff --git a/src/backend/base/langflow/components/tools/SearXNGTool.py b/src/backend/base/langflow/components/tools/SearXNGTool.py index 8adb54ffa..5ca03e96a 100644 --- a/src/backend/base/langflow/components/tools/SearXNGTool.py +++ b/src/backend/base/langflow/components/tools/SearXNGTool.py @@ -5,6 +5,7 @@ from typing import Any import requests from langchain.agents import Tool from langchain_core.tools import StructuredTool +from loguru import logger from pydantic.v1 import Field, create_model from langflow.base.langchain_utilities.model import LCToolComponent @@ -72,8 +73,9 @@ class SearXNGToolComponent(LCToolComponent): build_config["categories"]["value"].remove(selected_category) languages = list(data["locales"]) build_config["language"]["options"] = languages.copy() - except Exception as e: + except Exception as e: # noqa: BLE001 self.status = f"Failed to extract names: {e}" + logger.opt(exception=True).debug(self.status) build_config["categories"]["options"] = ["Failed to parse", str(e)] return build_config @@ -107,7 +109,8 @@ class SearXNGToolComponent(LCToolComponent): num_results = min(SearxSearch._max_results, len(response["results"])) return [response["results"][i] for i in range(num_results)] - except Exception as e: + except Exception as e: # noqa: BLE001 + logger.opt(exception=True).debug("Error running SearXNG Search") return [f"Failed to search: {e}"] SearxSearch._url = self.url diff --git a/src/backend/base/langflow/components/tools/SerpAPI.py b/src/backend/base/langflow/components/tools/SerpAPI.py index 6adef8a9e..e24d0d021 100644 --- a/src/backend/base/langflow/components/tools/SerpAPI.py +++ b/src/backend/base/langflow/components/tools/SerpAPI.py @@ -2,6 +2,7 @@ from typing import Any from langchain.tools import StructuredTool from langchain_community.utilities.serpapi import SerpAPIWrapper +from loguru import logger from pydantic import BaseModel, Field from langflow.base.langchain_utilities.model import LCToolComponent @@ -87,6 +88,7 @@ class SerpAPIComponent(LCToolComponent): self.status = data_list return data_list - except Exception as e: + except Exception as e: # noqa: BLE001 + logger.opt(exception=True).debug("Error running SerpAPI") self.status = f"Error: {e}" return [Data(data={"error": str(e)}, text=str(e))] diff --git a/src/backend/base/langflow/components/tools/TavilyAISearch.py b/src/backend/base/langflow/components/tools/TavilyAISearch.py index e2ae170a6..9f690760f 100644 --- a/src/backend/base/langflow/components/tools/TavilyAISearch.py +++ b/src/backend/base/langflow/components/tools/TavilyAISearch.py @@ -2,6 +2,7 @@ from typing import Any import httpx from langchain.tools import StructuredTool +from loguru import logger from pydantic import BaseModel, Field from langflow.base.langchain_utilities.model import LCToolComponent @@ -154,7 +155,8 @@ Note: Check 'Advanced' for all options. error_message = f"HTTP error: {e.response.status_code} - {e.response.text}" self.status = error_message return [Data(data={"error": error_message})] - except Exception as e: + except Exception as e: # noqa: BLE001 + logger.opt(exception=True).debug("Error running Tavily Search") error_message = f"Unexpected error: {e}" self.status = error_message return [Data(data={"error": error_message})] diff --git a/src/backend/base/langflow/components/tools/YfinanceTool.py b/src/backend/base/langflow/components/tools/YfinanceTool.py index 53305d660..f7b652b7f 100644 --- a/src/backend/base/langflow/components/tools/YfinanceTool.py +++ b/src/backend/base/langflow/components/tools/YfinanceTool.py @@ -3,6 +3,7 @@ import pprint import yfinance as yf from langchain.tools import StructuredTool +from loguru import logger from pydantic import BaseModel, Field from langflow.base.langchain_utilities.model import LCToolComponent @@ -95,7 +96,8 @@ class YfinanceToolComponent(LCToolComponent): return data_list - except Exception as e: + except Exception as e: # noqa: BLE001 error_message = f"Error retrieving data: {e}" + logger.opt(exception=True).debug(error_message) self.status = error_message return [Data(data={"error": error_message})] diff --git a/src/backend/base/langflow/custom/code_parser/code_parser.py b/src/backend/base/langflow/custom/code_parser/code_parser.py index 9fcf12abe..c86d8c9ee 100644 --- a/src/backend/base/langflow/custom/code_parser/code_parser.py +++ b/src/backend/base/langflow/custom/code_parser/code_parser.py @@ -342,7 +342,7 @@ class CodeParser: for import_node in import_nodes: self.parse_imports(import_node) nodes.append(class_node) - except Exception: + except Exception: # noqa: BLE001 logger.exception("Error finding base class node") nodes.insert(0, node) class_details = ClassCodeDetails( diff --git a/src/backend/base/langflow/custom/custom_component/component.py b/src/backend/base/langflow/custom/custom_component/component.py index a5e8f0511..86ca415ea 100644 --- a/src/backend/base/langflow/custom/custom_component/component.py +++ b/src/backend/base/langflow/custom/custom_component/component.py @@ -8,6 +8,7 @@ from typing import TYPE_CHECKING, Any, ClassVar, get_type_hints import nanoid import yaml +from loguru import logger from pydantic import BaseModel from langflow.base.tools.constants import TOOL_OUTPUT_NAME @@ -338,7 +339,8 @@ class Component(CustomComponent): try: source_code = inspect.getsource(method) ast_tree = ast.parse(dedent(source_code)) - except Exception: + except Exception: # noqa: BLE001 + logger.opt(exception=True).debug(f"Could not get source code for method {method}") source_code = self._code ast_tree = ast.parse(dedent(source_code)) diff --git a/src/backend/base/langflow/custom/directory_reader/directory_reader.py b/src/backend/base/langflow/custom/directory_reader/directory_reader.py index 1d5795f4e..4a7c7a54c 100644 --- a/src/backend/base/langflow/custom/directory_reader/directory_reader.py +++ b/src/backend/base/langflow/custom/directory_reader/directory_reader.py @@ -77,9 +77,8 @@ class DirectoryReader: if component["error"] if with_errors else not component["error"]: component_tuple = (*build_component(component), component) components.append(component_tuple) - except Exception as e: - logger.debug(f"Error while loading component {component['name']}") - logger.debug(e) + except Exception: # noqa: BLE001 + logger.opt(exception=True).debug(f"Error while loading component {component['name']}") continue items.append({"name": menu["name"], "path": menu["path"], "components": components}) filtered = [menu for menu in items if menu["components"]] @@ -215,7 +214,7 @@ class DirectoryReader: """ try: file_content = self.read_file_content(file_path) - except Exception: + except Exception: # noqa: BLE001 logger.exception(f"Error while reading file {file_path}") return False, f"Could not read {file_path}" @@ -270,7 +269,8 @@ class DirectoryReader: if validation_result: try: output_types = self.get_output_types_from_code(result_content) - except Exception: + except Exception: # noqa: BLE001 + logger.opt(exception=True).debug("Error while getting output types from code") output_types = [component_name_camelcase] else: output_types = [component_name_camelcase] @@ -292,7 +292,7 @@ class DirectoryReader: async def process_file_async(self, file_path): try: file_content = self.read_file_content(file_path) - except Exception: + except Exception: # noqa: BLE001 logger.exception(f"Error while reading file {file_path}") return False, f"Could not read {file_path}" @@ -346,7 +346,7 @@ class DirectoryReader: if validation_result: try: output_types = await self.get_output_types_from_code_async(result_content) - except Exception: + except Exception: # noqa: BLE001 logger.exception("Error while getting output types from code") output_types = [component_name_camelcase] else: diff --git a/src/backend/base/langflow/custom/directory_reader/utils.py b/src/backend/base/langflow/custom/directory_reader/utils.py index dadffbf60..b379db9f9 100644 --- a/src/backend/base/langflow/custom/directory_reader/utils.py +++ b/src/backend/base/langflow/custom/directory_reader/utils.py @@ -132,7 +132,7 @@ def build_invalid_menu_items(menu_item): component_name, component_template = build_invalid_component(component) menu_items[component_name] = component_template logger.debug(f"Added {component_name} to invalid menu.") - except Exception: + except Exception: # noqa: BLE001 logger.exception(f"Error while creating custom component [{component_name}]") return menu_items @@ -165,6 +165,6 @@ def build_menu_items(menu_item): for component_name, component_template, component in menu_item["components"]: try: menu_items[component_name] = component_template - except Exception: + except Exception: # noqa: BLE001 logger.exception(f"Error while building custom component {component['output_types']}") return menu_items diff --git a/src/backend/base/langflow/graph/graph/base.py b/src/backend/base/langflow/graph/graph/base.py index d9200a919..785871d40 100644 --- a/src/backend/base/langflow/graph/graph/base.py +++ b/src/backend/base/langflow/graph/graph/base.py @@ -121,7 +121,7 @@ class Graph: self._snapshots: list[dict[str, Any]] = [] try: self.tracing_service: TracingService | None = get_tracing_service() - except Exception: + except Exception: # noqa: BLE001 logger.exception("Error getting tracing service") self.tracing_service = None if start is not None and end is not None: @@ -676,8 +676,8 @@ class Graph: cache_service = get_chat_service() if self.flow_id: await cache_service.set_cache(self.flow_id, self) - except Exception as exc: - logger.exception(exc) + except Exception: # noqa: BLE001 + logger.exception("Error setting cache") try: # Prioritize the webhook component if it exists @@ -1368,7 +1368,8 @@ class Graph: vertex._finalize_build() if vertex.result is not None: vertex.result.used_frozen_result = True - except Exception: + except Exception: # noqa: BLE001 + logger.opt(exception=True).debug("Error finalizing build") should_build = True except KeyError: should_build = True @@ -1747,8 +1748,8 @@ class Graph: if stop_component_id or start_component_id: try: first_layer = self.sort_vertices(stop_component_id, start_component_id) - except Exception as exc: - logger.exception(exc) + except Exception: # noqa: BLE001 + logger.exception("Error sorting vertices") first_layer = self.sort_vertices() else: first_layer = self.sort_vertices() diff --git a/src/backend/base/langflow/graph/graph/state_manager.py b/src/backend/base/langflow/graph/graph/state_manager.py index 5065a79ad..035e79290 100644 --- a/src/backend/base/langflow/graph/graph/state_manager.py +++ b/src/backend/base/langflow/graph/graph/state_manager.py @@ -16,7 +16,7 @@ class GraphStateManager: def __init__(self): try: self.state_service: StateService = get_state_service() - except Exception: + except Exception: # noqa: BLE001 logger.opt(exception=True).debug("Error getting state service. Defaulting to InMemoryStateService") from langflow.services.state.service import InMemoryStateService @@ -42,6 +42,6 @@ class GraphStateManager: for callback in self.observers[key]: try: callback(key, new_state, append=True) - except Exception: + except Exception: # noqa: BLE001 logger.exception(f"Error in observer {callback} for key {key}") logger.warning("Callbacks not implemented yet") diff --git a/src/backend/base/langflow/graph/utils.py b/src/backend/base/langflow/graph/utils.py index 0d236e8e4..1eb3c8876 100644 --- a/src/backend/base/langflow/graph/utils.py +++ b/src/backend/base/langflow/graph/utils.py @@ -155,7 +155,7 @@ async def log_transaction( with session_getter(get_db_service()) as session: inserted = crud_log_transaction(session, transaction) logger.debug(f"Logged transaction: {inserted.id}") - except Exception: + except Exception: # noqa: BLE001 logger.exception("Error logging transaction") @@ -183,7 +183,7 @@ def log_vertex_build( with session_getter(get_db_service()) as session: inserted = crud_log_vertex_build(session, vertex_build) logger.debug(f"Logged vertex build: {inserted.build_id}") - except Exception: + except Exception: # noqa: BLE001 logger.exception("Error logging vertex build") diff --git a/src/backend/base/langflow/graph/vertex/base.py b/src/backend/base/langflow/graph/vertex/base.py index ef7b8afab..6f5be61f9 100644 --- a/src/backend/base/langflow/graph/vertex/base.py +++ b/src/backend/base/langflow/graph/vertex/base.py @@ -371,7 +371,8 @@ class Vertex: if field.get("type") == "code": try: params[field_name] = ast.literal_eval(val) if val else None - except Exception: + except Exception: # noqa: BLE001 + logger.opt(exception=True).debug(f"Error evaluating code for {field_name}") params[field_name] = val elif field.get("type") in ["dict", "NestedDict"]: # When dict comes from the frontend it comes as a diff --git a/src/backend/base/langflow/initial_setup/setup.py b/src/backend/base/langflow/initial_setup/setup.py index 3d89e9999..2ee117d47 100644 --- a/src/backend/base/langflow/initial_setup/setup.py +++ b/src/backend/base/langflow/initial_setup/setup.py @@ -382,7 +382,7 @@ def copy_profile_pictures(): shutil.copytree(origin, target, dirs_exist_ok=True) logger.debug(f"Folder copied from '{origin}' to '{target}'") - except Exception: + except Exception: # noqa: BLE001 logger.exception("Error copying the folder") @@ -602,8 +602,8 @@ async def create_or_update_starter_projects(get_all_components_coro: Awaitable[d updated_project_data = update_edges_with_latest_component_versions(updated_project_data) try: Graph.from_payload(updated_project_data) - except Exception as e: - logger.exception(e) + except Exception: # noqa: BLE001 + logger.exception(f"Error loading project {project_name}") if updated_project_data != project_data: project_data = updated_project_data # We also need to update the project data in the file diff --git a/src/backend/base/langflow/interface/initialize/loading.py b/src/backend/base/langflow/interface/initialize/loading.py index 59a27fe39..54e8b2905 100644 --- a/src/backend/base/langflow/interface/initialize/loading.py +++ b/src/backend/base/langflow/interface/initialize/loading.py @@ -137,7 +137,7 @@ def update_params_with_load_from_db_fields( except TypeError as exc: raise exc - except Exception: + except Exception: # noqa: BLE001 logger.exception(f"Failed to get value for {field} from custom component. Setting it to None.") params[field] = None diff --git a/src/backend/base/langflow/interface/utils.py b/src/backend/base/langflow/interface/utils.py index 1367c334c..c165f2479 100644 --- a/src/backend/base/langflow/interface/utils.py +++ b/src/backend/base/langflow/interface/utils.py @@ -96,7 +96,7 @@ def setup_llm_caching(): set_langchain_cache(settings_service.settings) except ImportError: logger.warning(f"Could not import {settings_service.settings.cache_type}. ") - except Exception: + except Exception: # noqa: BLE001 logger.opt(exception=True).warning("Could not setup LLM caching.") diff --git a/src/backend/base/langflow/load/load.py b/src/backend/base/langflow/load/load.py index 1e775112b..46713cf3b 100644 --- a/src/backend/base/langflow/load/load.py +++ b/src/backend/base/langflow/load/load.py @@ -111,7 +111,7 @@ def run_flow_from_json( import nest_asyncio nest_asyncio.apply() - except Exception: + except Exception: # noqa: BLE001 logger.opt(exception=True).warning("Could not apply nest_asyncio") if tweaks is None: tweaks = {} diff --git a/src/backend/base/langflow/logging/logger.py b/src/backend/base/langflow/logging/logger.py index dc8998855..51cfd94ce 100644 --- a/src/backend/base/langflow/logging/logger.py +++ b/src/backend/base/langflow/logging/logger.py @@ -192,7 +192,7 @@ def configure( rotation="10 MB", # Log rotation based on file size serialize=True, ) - except Exception: + except Exception: # noqa: BLE001 logger.exception("Error setting up log file") if log_buffer.enabled(): diff --git a/src/backend/base/langflow/processing/base.py b/src/backend/base/langflow/processing/base.py index b12be39cb..d0e682669 100644 --- a/src/backend/base/langflow/processing/base.py +++ b/src/backend/base/langflow/processing/base.py @@ -30,7 +30,7 @@ def get_langfuse_callback(trace_id): try: trace = langfuse.trace(name="langflow-" + trace_id, id=trace_id) return trace.getNewHandler() - except Exception: + except Exception: # noqa: BLE001 logger.exception("Error initializing langfuse callback") return None diff --git a/src/backend/base/langflow/schema/artifact.py b/src/backend/base/langflow/schema/artifact.py index 026bc47ef..94a9d83bb 100644 --- a/src/backend/base/langflow/schema/artifact.py +++ b/src/backend/base/langflow/schema/artifact.py @@ -2,6 +2,7 @@ from collections.abc import Generator from enum import Enum from fastapi.encoders import jsonable_encoder +from loguru import logger from pydantic import BaseModel from langflow.schema import Data @@ -66,7 +67,8 @@ def post_process_raw(raw, artifact_type: str): try: raw = jsonable_encoder(raw) artifact_type = ArtifactType.OBJECT.value - except Exception: + except Exception: # noqa: BLE001 + logger.opt(exception=True).debug("Error converting to json") raw = "Built Successfully ✨" else: raw = "Built Successfully ✨" diff --git a/src/backend/base/langflow/schema/data.py b/src/backend/base/langflow/schema/data.py index 594fc3d12..0ffa0b119 100644 --- a/src/backend/base/langflow/schema/data.py +++ b/src/backend/base/langflow/schema/data.py @@ -5,6 +5,7 @@ from typing import TYPE_CHECKING, cast from langchain_core.documents import Document from langchain_core.messages import AIMessage, BaseMessage, HumanMessage from langchain_core.prompts.image import ImagePromptTemplate +from loguru import logger from pydantic import BaseModel, model_serializer, model_validator from langflow.utils.constants import MESSAGE_SENDER_AI, MESSAGE_SENDER_USER @@ -209,7 +210,8 @@ class Data(BaseModel): try: data = {k: v.to_json() if hasattr(v, "to_json") else v for k, v in self.data.items()} return json.dumps(data, indent=4) - except Exception: + except Exception: # noqa: BLE001 + logger.opt(exception=True).debug("Error converting Data to JSON") return str(self.data) def __contains__(self, key): diff --git a/src/backend/base/langflow/schema/schema.py b/src/backend/base/langflow/schema/schema.py index 8ca4ce95d..f73f2b00a 100644 --- a/src/backend/base/langflow/schema/schema.py +++ b/src/backend/base/langflow/schema/schema.py @@ -2,6 +2,7 @@ from collections.abc import AsyncIterator, Generator, Iterator from enum import Enum from typing import Literal +from loguru import logger from pydantic import BaseModel from typing_extensions import TypedDict @@ -141,5 +142,6 @@ def recursive_serialize_or_str(obj): # This a type BaseModel and not an instance of it return repr(obj) return str(obj) - except Exception: + except Exception: # noqa: BLE001 + logger.opt(exception=True).debug(f"Cannot serialize object {obj}") return str(obj) diff --git a/src/backend/base/langflow/services/auth/utils.py b/src/backend/base/langflow/services/auth/utils.py index ec065ba9a..912fe2a79 100644 --- a/src/backend/base/langflow/services/auth/utils.py +++ b/src/backend/base/langflow/services/auth/utils.py @@ -379,6 +379,7 @@ def decrypt_api_key(encrypted_api_key: str, settings_service=Depends(get_setting if isinstance(encrypted_api_key, str): try: decrypted_key = fernet.decrypt(encrypted_api_key.encode()).decode() - except Exception: + except Exception: # noqa: BLE001 + logger.opt(exception=True).debug("Failed to decrypt API key") decrypted_key = fernet.decrypt(encrypted_api_key).decode() return decrypted_key diff --git a/src/backend/base/langflow/services/database/models/user/crud.py b/src/backend/base/langflow/services/database/models/user/crud.py index 090ecca2d..1a0845d34 100644 --- a/src/backend/base/langflow/services/database/models/user/crud.py +++ b/src/backend/base/langflow/services/database/models/user/crud.py @@ -2,6 +2,7 @@ from datetime import datetime, timezone from uuid import UUID from fastapi import Depends, HTTPException, status +from loguru import logger from sqlalchemy.exc import IntegrityError from sqlalchemy.orm.attributes import flag_modified from sqlmodel import Session, select @@ -53,5 +54,5 @@ def update_user_last_login_at(user_id: UUID, db: Session = Depends(get_session)) user_data = UserUpdate(last_login_at=datetime.now(timezone.utc)) user = get_user_by_id(db, user_id) return update_user(user, user_data, db) - except Exception: - pass + except Exception: # noqa: BLE001 + logger.opt(exception=True).debug("Error updating user last login at") diff --git a/src/backend/base/langflow/services/database/service.py b/src/backend/base/langflow/services/database/service.py index 6ccde0053..16ba8e147 100644 --- a/src/backend/base/langflow/services/database/service.py +++ b/src/backend/base/langflow/services/database/service.py @@ -187,8 +187,8 @@ class DatabaseService(Service): # so we need to catch it try: session.exec(text("SELECT * FROM alembic_version")) - except Exception: - logger.info("Alembic not initialized") + except Exception: # noqa: BLE001 + logger.opt(exception=True).info("Alembic not initialized") should_initialize_alembic = True if should_initialize_alembic: @@ -206,7 +206,8 @@ class DatabaseService(Service): try: buffer.write(f"{datetime.now(tz=timezone.utc).astimezone().isoformat()}: Checking migrations\n") command.check(alembic_cfg) - except Exception as exc: + except Exception as exc: # noqa: BLE001 + logger.opt(exception=True).debug("Error checking migrations") if isinstance(exc, util.exc.CommandError | util.exc.AutogenerateDiffsDetected): command.upgrade(alembic_cfg, "head") time.sleep(3) @@ -215,7 +216,7 @@ class DatabaseService(Service): buffer.write(f"{datetime.now(tz=timezone.utc).astimezone()}: Checking migrations\n") command.check(alembic_cfg) except util.exc.AutogenerateDiffsDetected as exc: - logger.exception("AutogenerateDiffsDetected") + logger.exception("Error checking migrations") if not fix: msg = f"There's a mismatch between the models and the database.\n{exc}" raise RuntimeError(msg) from exc @@ -313,7 +314,7 @@ class DatabaseService(Service): with self.with_session() as session: teardown_superuser(settings_service, session) - except Exception: + except Exception: # noqa: BLE001 logger.exception("Error tearing down database") self.engine.dispose() diff --git a/src/backend/base/langflow/services/manager.py b/src/backend/base/langflow/services/manager.py index 00f09ab99..4b4947928 100644 --- a/src/backend/base/langflow/services/manager.py +++ b/src/backend/base/langflow/services/manager.py @@ -34,7 +34,7 @@ class ServiceManager: for factory in self.get_factories(): try: self.register_factory(factory) - except Exception: + except Exception: # noqa: BLE001 logger.exception(f"Error initializing {factory}") def register_factory( @@ -111,7 +111,7 @@ class ServiceManager: result = service.teardown() if asyncio.iscoroutine(result): await result - except Exception as exc: + except Exception as exc: # noqa: BLE001 logger.exception(exc) self.services = {} self.factories = {} diff --git a/src/backend/base/langflow/services/plugins/langfuse_plugin.py b/src/backend/base/langflow/services/plugins/langfuse_plugin.py index 1ad52b92c..2f69f6ea2 100644 --- a/src/backend/base/langflow/services/plugins/langfuse_plugin.py +++ b/src/backend/base/langflow/services/plugins/langfuse_plugin.py @@ -80,7 +80,7 @@ class LangfusePlugin(CallbackPlugin): if trace: return trace.getNewHandler() - except Exception: + except Exception: # noqa: BLE001 logger.exception("Error initializing langfuse callback") return None diff --git a/src/backend/base/langflow/services/plugins/service.py b/src/backend/base/langflow/services/plugins/service.py index ac5f8c921..238bb156d 100644 --- a/src/backend/base/langflow/services/plugins/service.py +++ b/src/backend/base/langflow/services/plugins/service.py @@ -40,7 +40,7 @@ class PluginService(Service): and attr not in [CallbackPlugin, BasePlugin] ): self.register_plugin(plugin_name, attr()) - except Exception: + except Exception: # noqa: BLE001 logger.exception(f"Error loading plugin {plugin_name}") def register_plugin(self, plugin_name, plugin_instance): diff --git a/src/backend/base/langflow/services/settings/base.py b/src/backend/base/langflow/services/settings/base.py index a3b62c4ab..68eed6582 100644 --- a/src/backend/base/langflow/services/settings/base.py +++ b/src/backend/base/langflow/services/settings/base.py @@ -277,7 +277,7 @@ class Settings(BaseSettings): logger.debug("Copying existing database to new location") copy2(f"./{db_file_name}", new_path) logger.debug(f"Copied existing database to {new_path}") - except Exception: + except Exception: # noqa: BLE001 logger.exception("Failed to copy database, using default path") new_path = f"./{db_file_name}" else: diff --git a/src/backend/base/langflow/services/settings/utils.py b/src/backend/base/langflow/services/settings/utils.py index 3a380a3b9..759e257cf 100644 --- a/src/backend/base/langflow/services/settings/utils.py +++ b/src/backend/base/langflow/services/settings/utils.py @@ -33,7 +33,7 @@ def write_secret_to_file(path: Path, value: str) -> None: f.write(value.encode("utf-8")) try: set_secure_permissions(path) - except Exception: + except Exception: # noqa: BLE001 logger.exception("Failed to set secure permissions on secret key") diff --git a/src/backend/base/langflow/services/socket/utils.py b/src/backend/base/langflow/services/socket/utils.py index 7bfdd9717..007877f7a 100644 --- a/src/backend/base/langflow/services/socket/utils.py +++ b/src/backend/base/langflow/services/socket/utils.py @@ -2,6 +2,7 @@ import time from collections.abc import Callable import socketio +from loguru import logger from sqlmodel import select from langflow.api.utils import format_elapsed_time @@ -35,7 +36,8 @@ async def get_vertices(sio, sid, flow_id, chat_service): # Emit the vertices to the client await sio.emit("vertices_order", data=vertices, to=sid) - except Exception as exc: + except Exception as exc: # noqa: BLE001 + logger.opt(exception=True).debug("Error getting vertices") await sio.emit("error", data=str(exc), to=sid) @@ -80,7 +82,8 @@ async def build_vertex( duration=duration, timedelta=timedelta, ) - except Exception as exc: + except Exception as exc: # noqa: BLE001 + logger.opt(exception=True).debug("Error building vertex") params = str(exc) valid = False result_dict = ResultDataResponse(results={}) @@ -99,5 +102,6 @@ async def build_vertex( response = VertexBuildResponse(valid=valid, params=params, id=vertex.id, data=result_dict) await sio.emit("vertex_build", data=response.model_dump(), to=sid) - except Exception as exc: + except Exception as exc: # noqa: BLE001 + logger.opt(exception=True).debug("Error building vertex") await sio.emit("error", data=str(exc), to=sid) diff --git a/src/backend/base/langflow/services/state/service.py b/src/backend/base/langflow/services/state/service.py index 838608e58..cb61f29e8 100644 --- a/src/backend/base/langflow/services/state/service.py +++ b/src/backend/base/langflow/services/state/service.py @@ -69,6 +69,6 @@ class InMemoryStateService(StateService): for callback in self.observers[key]: try: callback(key, new_state, append=True) - except Exception: + except Exception: # noqa: BLE001 logger.exception(f"Error in observer {callback} for key {key}") logger.warning("Callbacks not implemented yet") diff --git a/src/backend/base/langflow/services/store/service.py b/src/backend/base/langflow/services/store/service.py index a100db144..fd5f62fe9 100644 --- a/src/backend/base/langflow/services/store/service.py +++ b/src/backend/base/langflow/services/store/service.py @@ -161,7 +161,7 @@ class StoreService(Service): return response.json() except HTTPError as exc: raise exc - except Exception: + except Exception: # noqa: BLE001 logger.opt(exception=True).debug("Webhook failed") def build_tags_filter(self, tags: list[str]): @@ -587,7 +587,8 @@ class StoreService(Service): ) authorized = True result = updated_result - except Exception: + except Exception: # noqa: BLE001 + logger.opt(exception=True).debug("Error updating components with user data") # If we get an error here, it means the user is not authorized authorized = False return ListComponentResponseModel(results=result, authorized=authorized, count=comp_count) diff --git a/src/backend/base/langflow/services/store/utils.py b/src/backend/base/langflow/services/store/utils.py index 3c4c12dae..52666528c 100644 --- a/src/backend/base/langflow/services/store/utils.py +++ b/src/backend/base/langflow/services/store/utils.py @@ -1,6 +1,7 @@ from typing import TYPE_CHECKING import httpx +from loguru import logger if TYPE_CHECKING: from langflow.services.store.schema import ListComponentResponse @@ -47,7 +48,8 @@ def get_lf_version_from_pypi(): if response.status_code != httpx.codes.OK: return None return response.json()["info"]["version"] - except Exception: + except Exception: # noqa: BLE001 + logger.opt(exception=True).debug("Error getting the latest version of langflow from PyPI") return None diff --git a/src/backend/base/langflow/services/task/backends/anyio.py b/src/backend/base/langflow/services/task/backends/anyio.py index 990fc1f0d..b7dbf823d 100644 --- a/src/backend/base/langflow/services/task/backends/anyio.py +++ b/src/backend/base/langflow/services/task/backends/anyio.py @@ -37,7 +37,7 @@ class AnyIOTaskResult: async def run(self, func, *args, **kwargs): try: self._result = await func(*args, **kwargs) - except Exception as e: + except Exception as e: # noqa: BLE001 self._exception = e self._traceback = e.__traceback__ finally: @@ -72,7 +72,7 @@ class AnyIOBackend(TaskBackend): self.tasks[task_id] = task_result logger.info(f"Task {task_id} started.") return task_id, task_result - except Exception: + except Exception: # noqa: BLE001 logger.exception("An error occurred while launching the task") return None, None diff --git a/src/backend/base/langflow/services/task/service.py b/src/backend/base/langflow/services/task/service.py index 7ba34b530..a829cc6da 100644 --- a/src/backend/base/langflow/services/task/service.py +++ b/src/backend/base/langflow/services/task/service.py @@ -20,7 +20,7 @@ def check_celery_availability(): status = get_celery_worker_status(celery_app) logger.debug(f"Celery status: {status}") - except Exception: + except Exception: # noqa: BLE001 logger.opt(exception=True).debug("Celery not available") status = {"availability": None} return status diff --git a/src/backend/base/langflow/services/telemetry/service.py b/src/backend/base/langflow/services/telemetry/service.py index c8a5359d7..353077c2e 100644 --- a/src/backend/base/langflow/services/telemetry/service.py +++ b/src/backend/base/langflow/services/telemetry/service.py @@ -51,7 +51,7 @@ class TelemetryService(Service): func, payload, path = await self.telemetry_queue.get() try: await func(payload, path) - except Exception: + except Exception: # noqa: BLE001 logger.exception("Error sending telemetry data") finally: self.telemetry_queue.task_done() @@ -75,7 +75,7 @@ class TelemetryService(Service): logger.exception("HTTP error occurred") except httpx.RequestError: logger.exception("Request error occurred") - except Exception: + except Exception: # noqa: BLE001 logger.exception("Unexpected error occurred") async def log_package_run(self, payload: RunPayload): @@ -120,7 +120,7 @@ class TelemetryService(Service): self._start_time = datetime.now(timezone.utc) self.worker_task = asyncio.create_task(self.telemetry_worker()) asyncio.create_task(self.log_package_version()) - except Exception: + except Exception: # noqa: BLE001 logger.exception("Error starting telemetry service") async def flush(self): @@ -128,7 +128,7 @@ class TelemetryService(Service): return try: await self.telemetry_queue.join() - except Exception: + except Exception: # noqa: BLE001 logger.exception("Error flushing logs") async def stop(self): @@ -144,7 +144,7 @@ class TelemetryService(Service): with contextlib.suppress(asyncio.CancelledError): await self.worker_task await self.client.aclose() - except Exception: + except Exception: # noqa: BLE001 logger.exception("Error stopping tracing service") async def teardown(self): diff --git a/src/backend/base/langflow/services/tracing/langfuse.py b/src/backend/base/langflow/services/tracing/langfuse.py index f0f51afd6..3f7bf359a 100644 --- a/src/backend/base/langflow/services/tracing/langfuse.py +++ b/src/backend/base/langflow/services/tracing/langfuse.py @@ -57,7 +57,7 @@ class LangFuseTracer(BaseTracer): logger.exception("Could not import langfuse. Please install it with `pip install langfuse`.") return False - except Exception: + except Exception: # noqa: BLE001 logger.opt(exception=True).debug("Error setting up LangSmith tracer") return False diff --git a/src/backend/base/langflow/services/tracing/langsmith.py b/src/backend/base/langflow/services/tracing/langsmith.py index f57f62e8d..630baa7ba 100644 --- a/src/backend/base/langflow/services/tracing/langsmith.py +++ b/src/backend/base/langflow/services/tracing/langsmith.py @@ -41,7 +41,7 @@ class LangSmithTracer(BaseTracer): ) self._run_tree.add_event({"name": "Start", "time": datetime.now(timezone.utc).isoformat()}) self._children: dict[str, RunTree] = {} - except Exception: + except Exception: # noqa: BLE001 logger.opt(exception=True).debug("Error setting up LangSmith tracer") self._ready = False diff --git a/src/backend/base/langflow/services/tracing/langwatch.py b/src/backend/base/langflow/services/tracing/langwatch.py index 4609bc64c..8b1d578c7 100644 --- a/src/backend/base/langflow/services/tracing/langwatch.py +++ b/src/backend/base/langflow/services/tracing/langwatch.py @@ -46,7 +46,7 @@ class LangWatchTracer(BaseTracer): name=name_without_id, type="workflow", ) - except Exception: + except Exception: # noqa: BLE001 logger.opt(exception=True).debug("Error setting up LangWatch tracer") self._ready = False diff --git a/src/backend/base/langflow/services/tracing/service.py b/src/backend/base/langflow/services/tracing/service.py index dcbd9f64a..cb644e86f 100644 --- a/src/backend/base/langflow/services/tracing/service.py +++ b/src/backend/base/langflow/services/tracing/service.py @@ -63,7 +63,7 @@ class TracingService(Service): log_func, args = await self.logs_queue.get() try: await log_func(*args) - except Exception: + except Exception: # noqa: BLE001 logger.exception("Error processing log") finally: self.logs_queue.task_done() @@ -74,13 +74,13 @@ class TracingService(Service): try: self.running = True self.worker_task = asyncio.create_task(self.log_worker()) - except Exception: + except Exception: # noqa: BLE001 logger.exception("Error starting tracing service") async def flush(self): try: await self.logs_queue.join() - except Exception: + except Exception: # noqa: BLE001 logger.exception("Error flushing logs") async def stop(self): @@ -94,7 +94,7 @@ class TracingService(Service): self.worker_task.cancel() self.worker_task = None - except Exception: + except Exception: # noqa: BLE001 logger.exception("Error stopping tracing service") def _reset_io(self): @@ -109,7 +109,7 @@ class TracingService(Service): self._initialize_langsmith_tracer() self._initialize_langwatch_tracer() self._initialize_langfuse_tracer() - except Exception: + except Exception: # noqa: BLE001 logger.opt(exception=True).debug("Error initializing tracers") def _initialize_langsmith_tracer(self): @@ -166,7 +166,7 @@ class TracingService(Service): continue try: tracer.add_trace(trace_id, trace_name, trace_type, inputs, metadata, vertex) - except Exception: + except Exception: # noqa: BLE001 logger.exception(f"Error starting trace {trace_name}") def _end_traces(self, trace_id: str, trace_name: str, error: Exception | None = None): @@ -181,7 +181,7 @@ class TracingService(Service): error=error, logs=self._logs[trace_name], ) - except Exception: + except Exception: # noqa: BLE001 logger.exception(f"Error ending trace {trace_name}") def _end_all_traces(self, outputs: dict, error: Exception | None = None): @@ -190,7 +190,7 @@ class TracingService(Service): continue try: tracer.end(self.inputs, outputs=self.outputs, error=error, metadata=outputs) - except Exception: + except Exception: # noqa: BLE001 logger.exception("Error ending all traces") async def end(self, outputs: dict, error: Exception | None = None): diff --git a/src/backend/base/langflow/services/utils.py b/src/backend/base/langflow/services/utils.py index c13bff535..81d1be131 100644 --- a/src/backend/base/langflow/services/utils.py +++ b/src/backend/base/langflow/services/utils.py @@ -50,13 +50,14 @@ def get_or_create_super_user(session: Session, username, password, is_default): logger.debug("Creating superuser.") try: return create_super_user(username, password, db=session) - except Exception as exc: + except Exception as exc: # noqa: BLE001 if "UNIQUE constraint failed: user.username" in str(exc): # This is to deal with workers running this # at startup and trying to create the superuser # at the same time. - logger.debug("Superuser already exists.") + logger.opt(exception=True).debug("Superuser already exists.") return None + logger.opt(exception=True).debug("Error creating superuser.") def setup_superuser(settings_service, session: Session): @@ -117,13 +118,13 @@ async def teardown_services(): """ try: teardown_superuser(get_settings_service(), next(get_session())) - except Exception as exc: + except Exception as exc: # noqa: BLE001 logger.exception(exc) try: from langflow.services.manager import service_manager await service_manager.teardown() - except Exception as exc: + except Exception as exc: # noqa: BLE001 logger.exception(exc) diff --git a/src/backend/base/langflow/services/variable/kubernetes.py b/src/backend/base/langflow/services/variable/kubernetes.py index 4e1885688..9a0d821da 100644 --- a/src/backend/base/langflow/services/variable/kubernetes.py +++ b/src/backend/base/langflow/services/variable/kubernetes.py @@ -47,7 +47,7 @@ class KubernetesSecretService(VariableService, Service): name=secret_name, data=variables, ) - except Exception: + except Exception: # noqa: BLE001 logger.exception(f"Error creating {var} variable") else: diff --git a/src/backend/base/langflow/services/variable/service.py b/src/backend/base/langflow/services/variable/service.py index 909e91077..1b580568b 100644 --- a/src/backend/base/langflow/services/variable/service.py +++ b/src/backend/base/langflow/services/variable/service.py @@ -62,7 +62,7 @@ class DatabaseVariableService(VariableService, Service): _type=CREDENTIAL_TYPE, session=session, ) - except Exception: + except Exception: # noqa: BLE001 logger.exception(f"Error creating {var} variable") else: diff --git a/src/backend/base/langflow/utils/async_helpers.py b/src/backend/base/langflow/utils/async_helpers.py index 4edd9dfb2..4180555a4 100644 --- a/src/backend/base/langflow/utils/async_helpers.py +++ b/src/backend/base/langflow/utils/async_helpers.py @@ -22,7 +22,7 @@ def run_in_thread(coro): nonlocal result, exception try: result = asyncio.run(coro) - except Exception as e: + except Exception as e: # noqa: BLE001 exception = e thread = threading.Thread(target=target) diff --git a/src/backend/base/langflow/utils/util.py b/src/backend/base/langflow/utils/util.py index 95dec590f..696e98721 100644 --- a/src/backend/base/langflow/utils/util.py +++ b/src/backend/base/langflow/utils/util.py @@ -51,7 +51,8 @@ def build_template_from_function(name: str, type_to_loader_dict: dict, add_funct variables[class_field_items]["default"] = get_default_factory( module=_class.__base__.__module__, function=value_ ) - except Exception: + except Exception: # noqa: BLE001 + logger.opt(exception=True).debug(f"Error getting default factory for {value_}") variables[class_field_items]["default"] = None elif name_ != "name": variables[class_field_items][name_] = value_ diff --git a/src/backend/base/langflow/utils/validate.py b/src/backend/base/langflow/utils/validate.py index 6798da087..c507ffaa9 100644 --- a/src/backend/base/langflow/utils/validate.py +++ b/src/backend/base/langflow/utils/validate.py @@ -4,6 +4,7 @@ import importlib from types import FunctionType from typing import Optional, Union +from loguru import logger from pydantic import ValidationError from langflow.field_typing.constants import CUSTOM_COMPONENT_SUPPORTED_TYPES @@ -25,7 +26,8 @@ def validate_code(code): # Parse the code string into an abstract syntax tree (AST) try: tree = ast.parse(code) - except Exception as e: + except Exception as e: # noqa: BLE001 + logger.opt(exception=True).debug("Error parsing code") errors["function"]["errors"].append(str(e)) return errors @@ -48,7 +50,8 @@ def validate_code(code): code_obj = compile(ast.Module(body=[node], type_ignores=[]), "", "exec") try: exec(code_obj) - except Exception as e: + except Exception as e: # noqa: BLE001 + logger.opt(exception=True).debug("Error executing function code") errors["function"]["errors"].append(str(e)) # Return the errors dictionary diff --git a/src/backend/base/langflow/utils/version.py b/src/backend/base/langflow/utils/version.py index de14fc679..b25c59863 100644 --- a/src/backend/base/langflow/utils/version.py +++ b/src/backend/base/langflow/utils/version.py @@ -82,8 +82,8 @@ def fetch_latest_version(package_name: str, include_prerelease: bool) -> str | N return None # Handle case where no valid versions are found return max(valid_versions, key=lambda v: pkg_version.parse(v)) - except Exception as e: - logger.exception(e) + except Exception: # noqa: BLE001 + logger.exception("Error fetching latest version") return None diff --git a/src/backend/base/pyproject.toml b/src/backend/base/pyproject.toml index fb4c7ce7f..ba5f16a18 100644 --- a/src/backend/base/pyproject.toml +++ b/src/backend/base/pyproject.toml @@ -56,7 +56,6 @@ ignore = [ # Rules that are TODOs "ANN", "ARG", - "BLE", "D", "DOC", "EXE",