From d014f0b91a6ab0ec7de628f133d77ac8b6825616 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yanli=20=E7=9B=90=E7=B2=92?= Date: Wed, 18 Mar 2026 19:16:48 +0800 Subject: [PATCH] fix(api): address typing review feedback --- .../app/apps/advanced_chat/app_generator.py | 20 +++++++++++-------- .../generate_response_converter.py | 4 ++-- api/dify_graph/nodes/loop/entities.py | 2 +- 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/api/core/app/apps/advanced_chat/app_generator.py b/api/core/app/apps/advanced_chat/app_generator.py index 44cd1ec3c6..19d03345a5 100644 --- a/api/core/app/apps/advanced_chat/app_generator.py +++ b/api/core/app/apps/advanced_chat/app_generator.py @@ -520,9 +520,9 @@ class AdvancedChatAppGenerator(MessageBasedAppGenerator): worker_thread.start() # release database connection, because the following new thread operations may take a long time - with Session(bind=db.engine, expire_on_commit=False) as session: - workflow = _refresh_model(session, workflow) - message = _refresh_model(session, message) + with Session(bind=db.engine, expire_on_commit=False): + workflow = _refresh_model(workflow) + message = _refresh_model(message) assert message is not None # workflow_ = session.get(Workflow, workflow.id) # assert workflow_ is not None @@ -691,16 +691,20 @@ class AdvancedChatAppGenerator(MessageBasedAppGenerator): @overload -def _refresh_model(session: Session, model: Workflow) -> Workflow: ... +def _refresh_model(model: Workflow, session: Session | None = None) -> Workflow: ... @overload -def _refresh_model(session: Session, model: Message) -> Message: ... +def _refresh_model(model: Message, session: Session | None = None) -> Message: ... -def _refresh_model(session: Session, model: Any) -> Any: - del session - with Session(bind=db.engine, expire_on_commit=False) as refresh_session: +def _refresh_model(model: Any, session: Session | None = None) -> Any: + if session is not None and hasattr(session, "get"): + refresh_session = session + else: + refresh_session = Session(bind=db.engine, expire_on_commit=False) + + with refresh_session: if isinstance(model, Workflow): detached_workflow = refresh_session.get(Workflow, model.id) assert detached_workflow is not None diff --git a/api/core/app/apps/advanced_chat/generate_response_converter.py b/api/core/app/apps/advanced_chat/generate_response_converter.py index 43b9fabfbf..352608e166 100644 --- a/api/core/app/apps/advanced_chat/generate_response_converter.py +++ b/api/core/app/apps/advanced_chat/generate_response_converter.py @@ -57,7 +57,7 @@ class AdvancedChatAppGenerateResponseConverter(AppGenerateResponseConverter): @classmethod def convert_stream_full_response( cls, stream_response: Iterator[AppStreamResponse] - ) -> Generator[dict | str, Any, None]: + ) -> Generator[dict | str, None, None]: """ Convert stream full response. :param stream_response: stream response @@ -88,7 +88,7 @@ class AdvancedChatAppGenerateResponseConverter(AppGenerateResponseConverter): @classmethod def convert_stream_simple_response( cls, stream_response: Iterator[AppStreamResponse] - ) -> Generator[dict | str, Any, None]: + ) -> Generator[dict | str, None, None]: """ Convert stream simple response. :param stream_response: stream response diff --git a/api/dify_graph/nodes/loop/entities.py b/api/dify_graph/nodes/loop/entities.py index 2d24a30d3d..a1e89b6bce 100644 --- a/api/dify_graph/nodes/loop/entities.py +++ b/api/dify_graph/nodes/loop/entities.py @@ -84,7 +84,7 @@ class LoopVariableData(BaseModel): value_type = validation_info.data.get("value_type") if value_type == "variable": if value is None: - return None + raise ValueError("Variable loop inputs require a selector") return _VARIABLE_SELECTOR_ADAPTER.validate_python(value) if value_type == "constant": return _validate_loop_value(value)