From 47c8824be689b6224ba6e6f2b28f1d1484a9ecb0 Mon Sep 17 00:00:00 2001 From: takatost Date: Sun, 29 Sep 2024 00:14:44 +0800 Subject: [PATCH] feat: move model request to plugin daemon --- api/configs/feature/__init__.py | 14 +++--- api/controllers/console/app/workflow.py | 18 ++++---- api/controllers/console/workspace/plugin.py | 8 ++-- api/controllers/inner_api/plugin/__init__.py | 2 +- api/controllers/inner_api/plugin/wraps.py | 45 ++++++++++--------- api/core/agent/entities.py | 1 + api/core/agent/fc_agent_runner.py | 4 +- .../agent_chat/generate_response_converter.py | 10 +++-- .../base_app_generate_response_converter.py | 7 ++- api/core/app/apps/base_app_generator.py | 9 ++-- api/core/app/apps/chat/app_generator.py | 3 +- .../apps/chat/generate_response_converter.py | 10 +++-- api/core/app/apps/completion/app_generator.py | 12 +++-- .../completion/generate_response_converter.py | 10 +++-- api/core/app/apps/workflow/app_generator.py | 16 +++---- .../workflow/generate_response_converter.py | 10 +++-- .../plugin_tool_callback_handler.py | 2 +- api/core/entities/parameter_entities.py | 2 +- api/core/entities/provider_entities.py | 4 +- api/core/file/tool_file_parser.py | 4 +- api/core/plugin/backwards_invocation/node.py | 2 +- api/core/rag/retrieval/dataset_retrieval.py | 4 +- api/core/tools/entities/tool_entities.py | 3 -- .../utils/workflow_configuration_sync.py | 2 +- api/core/tools/workflow_as_tool/provider.py | 30 +++++++------ api/models/base.py | 2 +- .../tools/api_tools_manage_service.py | 6 +-- api/services/workflow_service.py | 4 +- .../plugin/tools/test_fetch_all_tools.py | 1 - 29 files changed, 127 insertions(+), 118 deletions(-) diff --git a/api/configs/feature/__init__.py b/api/configs/feature/__init__.py index 1b0364c2fc..8e03415ae0 100644 --- a/api/configs/feature/__init__.py +++ b/api/configs/feature/__init__.py @@ -114,20 +114,18 @@ class PluginConfig(BaseSettings): """ Plugin configs """ + PLUGIN_API_URL: HttpUrl = Field( - description='Plugin API URL', - default='http://plugin:5002', + description="Plugin API URL", + default="http://plugin:5002", ) PLUGIN_API_KEY: str = Field( - description='Plugin API key', - default='plugin-api-key', + description="Plugin API key", + default="plugin-api-key", ) - INNER_API_KEY_FOR_PLUGIN: str = Field( - description='Inner api key for plugin', - default='inner-api-key' - ) + INNER_API_KEY_FOR_PLUGIN: str = Field(description="Inner api key for plugin", default="inner-api-key") class EndpointConfig(BaseSettings): diff --git a/api/controllers/console/app/workflow.py b/api/controllers/console/app/workflow.py index 19c6e14cc4..22a1fbb563 100644 --- a/api/controllers/console/app/workflow.py +++ b/api/controllers/console/app/workflow.py @@ -140,7 +140,7 @@ class DraftWorkflowImportApi(Resource): # The role of the current user in the ta table must be admin, owner, or editor if not current_user.is_editor: raise Forbidden() - + if not isinstance(current_user, Account): raise Forbidden() @@ -167,7 +167,7 @@ class AdvancedChatDraftWorkflowRunApi(Resource): # The role of the current user in the ta table must be admin, owner, or editor if not current_user.is_editor: raise Forbidden() - + if not isinstance(current_user, Account): raise Forbidden() @@ -209,7 +209,7 @@ class AdvancedChatDraftRunIterationNodeApi(Resource): # The role of the current user in the ta table must be admin, owner, or editor if not current_user.is_editor: raise Forbidden() - + if not isinstance(current_user, Account): raise Forbidden() @@ -246,7 +246,7 @@ class WorkflowDraftRunIterationNodeApi(Resource): # The role of the current user in the ta table must be admin, owner, or editor if not current_user.is_editor: raise Forbidden() - + if not isinstance(current_user, Account): raise Forbidden() @@ -283,7 +283,7 @@ class DraftWorkflowRunApi(Resource): # The role of the current user in the ta table must be admin, owner, or editor if not current_user.is_editor: raise Forbidden() - + if not isinstance(current_user, Account): raise Forbidden() @@ -336,7 +336,7 @@ class DraftWorkflowNodeRunApi(Resource): # The role of the current user in the ta table must be admin, owner, or editor if not current_user.is_editor: raise Forbidden() - + if not isinstance(current_user, Account): raise Forbidden() @@ -388,7 +388,7 @@ class PublishedWorkflowApi(Resource): # The role of the current user in the ta table must be admin, owner, or editor if not current_user.is_editor: raise Forbidden() - + if not isinstance(current_user, Account): raise Forbidden() @@ -428,7 +428,7 @@ class DefaultBlockConfigApi(Resource): # The role of the current user in the ta table must be admin, owner, or editor if not current_user.is_editor: raise Forbidden() - + if not isinstance(current_user, Account): raise Forbidden() @@ -464,7 +464,7 @@ class ConvertToWorkflowApi(Resource): # The role of the current user in the ta table must be admin, owner, or editor if not current_user.is_editor: raise Forbidden() - + if not isinstance(current_user, Account): raise Forbidden() diff --git a/api/controllers/console/workspace/plugin.py b/api/controllers/console/workspace/plugin.py index c3e89321d6..4001b69a59 100644 --- a/api/controllers/console/workspace/plugin.py +++ b/api/controllers/console/workspace/plugin.py @@ -17,11 +17,9 @@ class PluginDebuggingKeyApi(Resource): user = current_user if not user.is_admin_or_owner: raise Forbidden() - + tenant_id = user.current_tenant_id - return { - "key": PluginDebuggingService.get_plugin_debugging_key(tenant_id) - } + return {"key": PluginDebuggingService.get_plugin_debugging_key(tenant_id)} -api.add_resource(PluginDebuggingKeyApi, "/workspaces/current/plugin/debugging-key") \ No newline at end of file +api.add_resource(PluginDebuggingKeyApi, "/workspaces/current/plugin/debugging-key") diff --git a/api/controllers/inner_api/plugin/__init__.py b/api/controllers/inner_api/plugin/__init__.py index fd1918e6b2..48aad58ec8 100644 --- a/api/controllers/inner_api/plugin/__init__.py +++ b/api/controllers/inner_api/plugin/__init__.py @@ -1 +1 @@ -from .plugin import * \ No newline at end of file +from .plugin import * diff --git a/api/controllers/inner_api/plugin/wraps.py b/api/controllers/inner_api/plugin/wraps.py index aa1f36d33c..07249013f9 100644 --- a/api/controllers/inner_api/plugin/wraps.py +++ b/api/controllers/inner_api/plugin/wraps.py @@ -16,31 +16,36 @@ def get_tenant(view: Optional[Callable] = None): def decorated_view(*args, **kwargs): # fetch json body parser = reqparse.RequestParser() - parser.add_argument('tenant_id', type=str, required=True, location='json') - parser.add_argument('user_id', type=str, required=True, location='json') + parser.add_argument("tenant_id", type=str, required=True, location="json") + parser.add_argument("user_id", type=str, required=True, location="json") kwargs = parser.parse_args() - user_id = kwargs.get('user_id') - tenant_id = kwargs.get('tenant_id') + user_id = kwargs.get("user_id") + tenant_id = kwargs.get("tenant_id") - del kwargs['tenant_id'] - del kwargs['user_id'] + del kwargs["tenant_id"] + del kwargs["user_id"] try: - tenant_model = db.session.query(Tenant).filter( - Tenant.id == tenant_id, - ).first() + tenant_model = ( + db.session.query(Tenant) + .filter( + Tenant.id == tenant_id, + ) + .first() + ) except Exception: - raise ValueError('tenant not found') + raise ValueError("tenant not found") if not tenant_model: - raise ValueError('tenant not found') + raise ValueError("tenant not found") - kwargs['tenant_model'] = tenant_model - kwargs['user_id'] = user_id + kwargs["tenant_model"] = tenant_model + kwargs["user_id"] = user_id return view_func(*args, **kwargs) + return decorated_view if view is None: @@ -55,18 +60,18 @@ def plugin_data(view: Optional[Callable] = None, *, payload_type: type[BaseModel try: data = request.get_json() except Exception: - raise ValueError('invalid json') - + raise ValueError("invalid json") + try: payload = payload_type(**data) except Exception as e: - raise ValueError(f'invalid payload: {str(e)}') - - kwargs['payload'] = payload + raise ValueError(f"invalid payload: {str(e)}") + + kwargs["payload"] = payload return view_func(*args, **kwargs) - + return decorated_view - + if view is None: return decorator else: diff --git a/api/core/agent/entities.py b/api/core/agent/entities.py index b51a163549..5287b9a714 100644 --- a/api/core/agent/entities.py +++ b/api/core/agent/entities.py @@ -10,6 +10,7 @@ class AgentToolEntity(BaseModel): """ Agent Tool Entity. """ + provider_type: ToolProviderType provider_id: str tool_name: str diff --git a/api/core/agent/fc_agent_runner.py b/api/core/agent/fc_agent_runner.py index 991c542846..afdb1d70e2 100644 --- a/api/core/agent/fc_agent_runner.py +++ b/api/core/agent/fc_agent_runner.py @@ -366,9 +366,7 @@ class FunctionCallAgentRunner(BaseAgentRunner): return tool_calls - def _init_system_message( - self, prompt_template: str, prompt_messages: list[PromptMessage] - ) -> list[PromptMessage]: + def _init_system_message(self, prompt_template: str, prompt_messages: list[PromptMessage]) -> list[PromptMessage]: """ Initialize system message """ diff --git a/api/core/app/apps/agent_chat/generate_response_converter.py b/api/core/app/apps/agent_chat/generate_response_converter.py index 5f294432c9..99c95b296a 100644 --- a/api/core/app/apps/agent_chat/generate_response_converter.py +++ b/api/core/app/apps/agent_chat/generate_response_converter.py @@ -50,8 +50,9 @@ class AgentChatAppGenerateResponseConverter(AppGenerateResponseConverter): return response @classmethod - def convert_stream_full_response(cls, stream_response: Generator[ChatbotAppStreamResponse, None, None]) \ - -> Generator[dict | str, None, None]: + def convert_stream_full_response( + cls, stream_response: Generator[ChatbotAppStreamResponse, None, None] + ) -> Generator[dict | str, None, None]: """ Convert stream full response. :param stream_response: stream response @@ -80,8 +81,9 @@ class AgentChatAppGenerateResponseConverter(AppGenerateResponseConverter): yield response_chunk @classmethod - def convert_stream_simple_response(cls, stream_response: Generator[ChatbotAppStreamResponse, None, None]) \ - -> Generator[dict | str, None, None]: + def convert_stream_simple_response( + cls, stream_response: Generator[ChatbotAppStreamResponse, None, None] + ) -> Generator[dict | str, None, None]: """ Convert stream simple response. :param stream_response: stream response diff --git a/api/core/app/apps/base_app_generate_response_converter.py b/api/core/app/apps/base_app_generate_response_converter.py index e5b77538c7..c38e67d577 100644 --- a/api/core/app/apps/base_app_generate_response_converter.py +++ b/api/core/app/apps/base_app_generate_response_converter.py @@ -20,6 +20,7 @@ class AppGenerateResponseConverter(ABC): if isinstance(response, AppBlockingResponse): return cls.convert_blocking_full_response(response) else: + def _generate_full_response() -> Generator[dict | str, Any, None]: yield from cls.convert_stream_simple_response(response) @@ -28,6 +29,7 @@ class AppGenerateResponseConverter(ABC): if isinstance(response, AppBlockingResponse): return cls.convert_blocking_simple_response(response) else: + def _generate_simple_response() -> Generator[dict | str, Any, None]: yield from cls.convert_stream_simple_response(response) @@ -45,8 +47,9 @@ class AppGenerateResponseConverter(ABC): @classmethod @abstractmethod - def convert_stream_full_response(cls, stream_response: Generator[AppStreamResponse, None, None]) \ - -> Generator[dict | str, None, None]: + def convert_stream_full_response( + cls, stream_response: Generator[AppStreamResponse, None, None] + ) -> Generator[dict | str, None, None]: raise NotImplementedError @classmethod diff --git a/api/core/app/apps/base_app_generator.py b/api/core/app/apps/base_app_generator.py index 2da0fd0584..06a18864b7 100644 --- a/api/core/app/apps/base_app_generator.py +++ b/api/core/app/apps/base_app_generator.py @@ -64,11 +64,12 @@ class BaseAppGenerator: if isinstance(generator, dict): return generator else: + def gen(): for message in generator: if isinstance(message, dict): - yield f'data: {json.dumps(message)}\n\n' + yield f"data: {json.dumps(message)}\n\n" else: - yield f'event: {message}\n\n' - - return gen() \ No newline at end of file + yield f"event: {message}\n\n" + + return gen() diff --git a/api/core/app/apps/chat/app_generator.py b/api/core/app/apps/chat/app_generator.py index cec2217093..492ae49244 100644 --- a/api/core/app/apps/chat/app_generator.py +++ b/api/core/app/apps/chat/app_generator.py @@ -50,7 +50,8 @@ class ChatAppGenerator(MessageBasedAppGenerator): @overload def generate( - self, app_model: App, + self, + app_model: App, user: Union[Account, EndUser], args: Any, invoke_from: InvokeFrom, diff --git a/api/core/app/apps/chat/generate_response_converter.py b/api/core/app/apps/chat/generate_response_converter.py index c7e29686e9..f67df2f1ad 100644 --- a/api/core/app/apps/chat/generate_response_converter.py +++ b/api/core/app/apps/chat/generate_response_converter.py @@ -50,8 +50,9 @@ class ChatAppGenerateResponseConverter(AppGenerateResponseConverter): return response @classmethod - def convert_stream_full_response(cls, stream_response: Generator[ChatbotAppStreamResponse, None, None]) \ - -> Generator[dict | str, None, None]: + def convert_stream_full_response( + cls, stream_response: Generator[ChatbotAppStreamResponse, None, None] + ) -> Generator[dict | str, None, None]: """ Convert stream full response. :param stream_response: stream response @@ -80,8 +81,9 @@ class ChatAppGenerateResponseConverter(AppGenerateResponseConverter): yield response_chunk @classmethod - def convert_stream_simple_response(cls, stream_response: Generator[ChatbotAppStreamResponse, None, None]) \ - -> Generator[dict | str, None, None]: + def convert_stream_simple_response( + cls, stream_response: Generator[ChatbotAppStreamResponse, None, None] + ) -> Generator[dict | str, None, None]: """ Convert stream simple response. :param stream_response: stream response diff --git a/api/core/app/apps/completion/app_generator.py b/api/core/app/apps/completion/app_generator.py index 2e99e4ef70..729ff1e1e0 100644 --- a/api/core/app/apps/completion/app_generator.py +++ b/api/core/app/apps/completion/app_generator.py @@ -52,19 +52,17 @@ class CompletionAppGenerator(MessageBasedAppGenerator): @overload def generate( - self, app_model: App, + self, + app_model: App, user: Union[Account, EndUser], args: dict, invoke_from: InvokeFrom, stream: bool = False, ) -> dict | Generator[str, None, None]: ... - def generate(self, app_model: App, - user: Union[Account, EndUser], - args: Any, - invoke_from: InvokeFrom, - stream: bool = True) \ - -> Union[dict, Generator[str, None, None]]: + def generate( + self, app_model: App, user: Union[Account, EndUser], args: Any, invoke_from: InvokeFrom, stream: bool = True + ) -> Union[dict, Generator[str, None, None]]: """ Generate App response. diff --git a/api/core/app/apps/completion/generate_response_converter.py b/api/core/app/apps/completion/generate_response_converter.py index 77aa1e37a2..6f8d0894d5 100644 --- a/api/core/app/apps/completion/generate_response_converter.py +++ b/api/core/app/apps/completion/generate_response_converter.py @@ -49,8 +49,9 @@ class CompletionAppGenerateResponseConverter(AppGenerateResponseConverter): return response @classmethod - def convert_stream_full_response(cls, stream_response: Generator[CompletionAppStreamResponse, None, None]) \ - -> Generator[dict | str, None, None]: + def convert_stream_full_response( + cls, stream_response: Generator[CompletionAppStreamResponse, None, None] + ) -> Generator[dict | str, None, None]: """ Convert stream full response. :param stream_response: stream response @@ -78,8 +79,9 @@ class CompletionAppGenerateResponseConverter(AppGenerateResponseConverter): yield response_chunk @classmethod - def convert_stream_simple_response(cls, stream_response: Generator[CompletionAppStreamResponse, None, None]) \ - -> Generator[dict | str, None, None]: + def convert_stream_simple_response( + cls, stream_response: Generator[CompletionAppStreamResponse, None, None] + ) -> Generator[dict | str, None, None]: """ Convert stream simple response. :param stream_response: stream response diff --git a/api/core/app/apps/workflow/app_generator.py b/api/core/app/apps/workflow/app_generator.py index f11fedebc8..8edbeee3dd 100644 --- a/api/core/app/apps/workflow/app_generator.py +++ b/api/core/app/apps/workflow/app_generator.py @@ -42,7 +42,7 @@ class WorkflowAppGenerator(BaseAppGenerator): invoke_from: InvokeFrom, stream: Literal[True] = True, call_depth: int = 0, - workflow_thread_pool_id: Optional[str] = None + workflow_thread_pool_id: Optional[str] = None, ) -> Generator[dict | str, None, None]: ... @overload @@ -60,7 +60,8 @@ class WorkflowAppGenerator(BaseAppGenerator): @overload def generate( - self, app_model: App, + self, + app_model: App, workflow: Workflow, user: Union[Account, EndUser], args: dict, @@ -143,7 +144,7 @@ class WorkflowAppGenerator(BaseAppGenerator): application_generate_entity: WorkflowAppGenerateEntity, invoke_from: InvokeFrom, stream: bool = True, - workflow_thread_pool_id: Optional[str] = None + workflow_thread_pool_id: Optional[str] = None, ) -> Union[dict, Generator[str | dict, None, None]]: """ Generate App response. @@ -189,12 +190,9 @@ class WorkflowAppGenerator(BaseAppGenerator): return WorkflowAppGenerateResponseConverter.convert(response=response, invoke_from=invoke_from) - def single_iteration_generate(self, app_model: App, - workflow: Workflow, - node_id: str, - user: Account | EndUser, - args: dict, - stream: bool = True) -> dict[str, Any] | Generator[str | dict, Any, None]: + def single_iteration_generate( + self, app_model: App, workflow: Workflow, node_id: str, user: Account | EndUser, args: dict, stream: bool = True + ) -> dict[str, Any] | Generator[str | dict, Any, None]: """ Generate App response. diff --git a/api/core/app/apps/workflow/generate_response_converter.py b/api/core/app/apps/workflow/generate_response_converter.py index 989834ef3b..72357e5e0c 100644 --- a/api/core/app/apps/workflow/generate_response_converter.py +++ b/api/core/app/apps/workflow/generate_response_converter.py @@ -34,8 +34,9 @@ class WorkflowAppGenerateResponseConverter(AppGenerateResponseConverter): return cls.convert_blocking_full_response(blocking_response) @classmethod - def convert_stream_full_response(cls, stream_response: Generator[WorkflowAppStreamResponse, None, None]) \ - -> Generator[dict | str, None, None]: + def convert_stream_full_response( + cls, stream_response: Generator[WorkflowAppStreamResponse, None, None] + ) -> Generator[dict | str, None, None]: """ Convert stream full response. :param stream_response: stream response @@ -62,8 +63,9 @@ class WorkflowAppGenerateResponseConverter(AppGenerateResponseConverter): yield response_chunk @classmethod - def convert_stream_simple_response(cls, stream_response: Generator[WorkflowAppStreamResponse, None, None]) \ - -> Generator[dict | str, None, None]: + def convert_stream_simple_response( + cls, stream_response: Generator[WorkflowAppStreamResponse, None, None] + ) -> Generator[dict | str, None, None]: """ Convert stream simple response. :param stream_response: stream response diff --git a/api/core/callback_handler/plugin_tool_callback_handler.py b/api/core/callback_handler/plugin_tool_callback_handler.py index e9b9784014..033b8d423c 100644 --- a/api/core/callback_handler/plugin_tool_callback_handler.py +++ b/api/core/callback_handler/plugin_tool_callback_handler.py @@ -2,4 +2,4 @@ from core.callback_handler.agent_tool_callback_handler import DifyAgentCallbackH class DifyPluginCallbackHandler(DifyAgentCallbackHandler): - """Callback Handler that prints to std out.""" \ No newline at end of file + """Callback Handler that prints to std out.""" diff --git a/api/core/entities/parameter_entities.py b/api/core/entities/parameter_entities.py index cc402de773..0045fbf2b4 100644 --- a/api/core/entities/parameter_entities.py +++ b/api/core/entities/parameter_entities.py @@ -27,4 +27,4 @@ class ModelConfigScope(Enum): TTS = "tts" SPEECH2TEXT = "speech2text" MODERATION = "moderation" - VISION = "vision" \ No newline at end of file + VISION = "vision" diff --git a/api/core/entities/provider_entities.py b/api/core/entities/provider_entities.py index 88b16f13af..53d52b5866 100644 --- a/api/core/entities/provider_entities.py +++ b/api/core/entities/provider_entities.py @@ -116,6 +116,7 @@ class BasicProviderConfig(BaseModel): """ Base model class for common provider settings like credentials """ + class Type(Enum): SECRET_INPUT = CommonParameterType.SECRET_INPUT.value TEXT_INPUT = CommonParameterType.TEXT_INPUT.value @@ -135,7 +136,7 @@ class BasicProviderConfig(BaseModel): for mode in cls: if mode.value == value: return mode - raise ValueError(f'invalid mode value {value}') + raise ValueError(f"invalid mode value {value}") type: Type = Field(..., description="The type of the credentials") name: str = Field(..., description="The name of the credentials") @@ -145,6 +146,7 @@ class ProviderConfig(BasicProviderConfig): """ Model class for common provider settings like credentials """ + class Option(BaseModel): value: str = Field(..., description="The value of the option") label: I18nObject = Field(..., description="The label of the option") diff --git a/api/core/file/tool_file_parser.py b/api/core/file/tool_file_parser.py index 4d113a9cc2..a17b7be367 100644 --- a/api/core/file/tool_file_parser.py +++ b/api/core/file/tool_file_parser.py @@ -3,9 +3,7 @@ from typing import TYPE_CHECKING, Any if TYPE_CHECKING: from core.tools.tool_file_manager import ToolFileManager -tool_file_manager: dict[str, Any] = { - 'manager': None -} +tool_file_manager: dict[str, Any] = {"manager": None} class ToolFileParser: diff --git a/api/core/plugin/backwards_invocation/node.py b/api/core/plugin/backwards_invocation/node.py index 4c1d21437e..1bd5d84e4c 100644 --- a/api/core/plugin/backwards_invocation/node.py +++ b/api/core/plugin/backwards_invocation/node.py @@ -114,4 +114,4 @@ class PluginNodeBackwardsInvocation(BaseBackwardsInvocation): "inputs": execution.inputs_dict, "outputs": execution.outputs_dict, "process_data": execution.process_data_dict, - } \ No newline at end of file + } diff --git a/api/core/rag/retrieval/dataset_retrieval.py b/api/core/rag/retrieval/dataset_retrieval.py index bd5cf86628..ebcf5a2575 100644 --- a/api/core/rag/retrieval/dataset_retrieval.py +++ b/api/core/rag/retrieval/dataset_retrieval.py @@ -492,8 +492,9 @@ class DatasetRetrieval: score_threshold_enabled = retrieval_model_config.get("score_threshold_enabled") if score_threshold_enabled: score_threshold = retrieval_model_config.get("score_threshold") - + from core.tools.utils.dataset_retriever.dataset_retriever_tool import DatasetRetrieverTool + tool = DatasetRetrieverTool.from_dataset( dataset=dataset, top_k=top_k, @@ -506,6 +507,7 @@ class DatasetRetrieval: tools.append(tool) elif retrieve_config.retrieve_strategy == DatasetRetrieveConfigEntity.RetrieveStrategy.MULTIPLE: from core.tools.utils.dataset_retriever.dataset_multi_retriever_tool import DatasetMultiRetrieverTool + tool = DatasetMultiRetrieverTool.from_dataset( dataset_ids=[dataset.id for dataset in available_datasets], tenant_id=tenant_id, diff --git a/api/core/tools/entities/tool_entities.py b/api/core/tools/entities/tool_entities.py index 07ea2d2b11..0808ff721d 100644 --- a/api/core/tools/entities/tool_entities.py +++ b/api/core/tools/entities/tool_entities.py @@ -375,6 +375,3 @@ class ToolInvokeFrom(Enum): WORKFLOW = "workflow" AGENT = "agent" - - - diff --git a/api/core/tools/utils/workflow_configuration_sync.py b/api/core/tools/utils/workflow_configuration_sync.py index 7f20605024..df09609402 100644 --- a/api/core/tools/utils/workflow_configuration_sync.py +++ b/api/core/tools/utils/workflow_configuration_sync.py @@ -43,4 +43,4 @@ class WorkflowToolConfigurationUtils: for parameter in tool_configurations: if parameter.name not in variable_names: - raise ValueError('parameter configuration mismatch, please republish the tool to update') + raise ValueError("parameter configuration mismatch, please republish the tool to update") diff --git a/api/core/tools/workflow_as_tool/provider.py b/api/core/tools/workflow_as_tool/provider.py index 2d0d33ffd9..dec353ec93 100644 --- a/api/core/tools/workflow_as_tool/provider.py +++ b/api/core/tools/workflow_as_tool/provider.py @@ -65,7 +65,7 @@ class WorkflowToolProviderController(ToolProviderController): @property def provider_type(self) -> ToolProviderType: return ToolProviderType.WORKFLOW - + def _get_db_provider_tool(self, db_provider: WorkflowToolProvider, app: App) -> WorkflowTool: """ get db provider tool @@ -73,10 +73,11 @@ class WorkflowToolProviderController(ToolProviderController): :param app: the app :return: the tool """ - workflow: Workflow | None = db.session.query(Workflow).filter( - Workflow.app_id == db_provider.app_id, - Workflow.version == db_provider.version - ).first() + workflow: Workflow | None = ( + db.session.query(Workflow) + .filter(Workflow.app_id == db_provider.app_id, Workflow.version == db_provider.version) + .first() + ) if not workflow: raise ValueError("workflow not found") @@ -84,10 +85,7 @@ class WorkflowToolProviderController(ToolProviderController): # fetch start node graph: Mapping = workflow.graph_dict features_dict: Mapping = workflow.features_dict - features = WorkflowAppConfigManager.convert_features( - config_dict=features_dict, - app_mode=AppMode.WORKFLOW - ) + features = WorkflowAppConfigManager.convert_features(config_dict=features_dict, app_mode=AppMode.WORKFLOW) parameters = db_provider.parameter_configurations variables = WorkflowToolConfigurationUtils.get_workflow_graph_variables(graph) @@ -180,14 +178,18 @@ class WorkflowToolProviderController(ToolProviderController): if self.tools is not None: return self.tools - db_providers: WorkflowToolProvider | None = db.session.query(WorkflowToolProvider).filter( - WorkflowToolProvider.tenant_id == tenant_id, - WorkflowToolProvider.app_id == self.provider_id, - ).first() + db_providers: WorkflowToolProvider | None = ( + db.session.query(WorkflowToolProvider) + .filter( + WorkflowToolProvider.tenant_id == tenant_id, + WorkflowToolProvider.app_id == self.provider_id, + ) + .first() + ) if not db_providers: return [] - + app = db_providers.app if not app: raise ValueError("can not read app of workflow") diff --git a/api/models/base.py b/api/models/base.py index 1c2dcc40b9..fa2b68a5d2 100644 --- a/api/models/base.py +++ b/api/models/base.py @@ -2,4 +2,4 @@ from sqlalchemy.orm import DeclarativeBase class Base(DeclarativeBase): - pass \ No newline at end of file + pass diff --git a/api/services/tools/api_tools_manage_service.py b/api/services/tools/api_tools_manage_service.py index 58f0e7bbf5..82bfc8c8e5 100644 --- a/api/services/tools/api_tools_manage_service.py +++ b/api/services/tools/api_tools_manage_service.py @@ -161,7 +161,7 @@ class ApiToolManageService: tenant_id=tenant_id, config=provider_controller.get_credentials_schema(), provider_type=provider_controller.provider_type.value, - provider_identity=provider_controller.entity.identity.name + provider_identity=provider_controller.entity.identity.name, ) encrypted_credentials = tool_configuration.encrypt(credentials) @@ -293,7 +293,7 @@ class ApiToolManageService: tenant_id=tenant_id, config=provider_controller.get_credentials_schema(), provider_type=provider_controller.provider_type.value, - provider_identity=provider_controller.entity.identity.name + provider_identity=provider_controller.entity.identity.name, ) original_credentials = tool_configuration.decrypt(provider.credentials) @@ -412,7 +412,7 @@ class ApiToolManageService: tenant_id=tenant_id, config=provider_controller.get_credentials_schema(), provider_type=provider_controller.provider_type.value, - provider_identity=provider_controller.entity.identity.name + provider_identity=provider_controller.entity.identity.name, ) decrypted_credentials = tool_configuration.decrypt(credentials) # check if the credential has changed, save the original credential diff --git a/api/services/workflow_service.py b/api/services/workflow_service.py index a1e2f31057..eec3d26a7b 100644 --- a/api/services/workflow_service.py +++ b/api/services/workflow_service.py @@ -238,7 +238,7 @@ class WorkflowService: db.session.commit() return workflow_node_execution - + def run_free_workflow_node( self, node_data: dict, tenant_id: str, user_id: str, node_id: str, user_inputs: dict[str, Any] ) -> WorkflowNodeExecution: @@ -258,7 +258,7 @@ class WorkflowService: ), start_at=start_at, tenant_id=tenant_id, - node_id=node_id + node_id=node_id, ) return workflow_node_execution diff --git a/api/tests/integration_tests/plugin/tools/test_fetch_all_tools.py b/api/tests/integration_tests/plugin/tools/test_fetch_all_tools.py index d50bba4ecc..c6d836ed6d 100644 --- a/api/tests/integration_tests/plugin/tools/test_fetch_all_tools.py +++ b/api/tests/integration_tests/plugin/tools/test_fetch_all_tools.py @@ -6,4 +6,3 @@ def test_fetch_all_plugin_tools(setup_http_mock): manager = PluginToolManager() tools = manager.fetch_tool_providers(tenant_id="test-tenant") assert len(tools) >= 1 -