From 5a6ac9eb1957d937b9bd10b15dbac8afd7c755c7 Mon Sep 17 00:00:00 2001 From: nourzakhama2003 Date: Mon, 22 Dec 2025 05:42:42 +0100 Subject: [PATCH] fix(llm-generator): use last non-Persian candidate for translation fallback; avoid circular import by deferring ops import and adding fallback --- api/core/app/entities/app_invoke_entities.py | 7 ++++++- api/core/llm_generator/llm_generator.py | 12 ++++++++++-- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/api/core/app/entities/app_invoke_entities.py b/api/core/app/entities/app_invoke_entities.py index 0cb573cb86..8515b7c1a6 100644 --- a/api/core/app/entities/app_invoke_entities.py +++ b/api/core/app/entities/app_invoke_entities.py @@ -275,7 +275,12 @@ class RagPipelineGenerateEntity(WorkflowAppGenerateEntity): start_node_id: str | None = None -from core.ops.ops_trace_manager import TraceQueueManager +try: + from core.ops.ops_trace_manager import TraceQueueManager # type: ignore +except Exception: + class TraceQueueManager: # type: ignore + """Dummy placeholder for type checking during tests when ops_trace_manager isn't importable.""" + pass AppGenerateEntity.model_rebuild() EasyUIBasedAppGenerateEntity.model_rebuild() diff --git a/api/core/llm_generator/llm_generator.py b/api/core/llm_generator/llm_generator.py index c872ce7118..8ef42fcb68 100644 --- a/api/core/llm_generator/llm_generator.py +++ b/api/core/llm_generator/llm_generator.py @@ -26,7 +26,6 @@ from core.model_runtime.entities.message_entities import PromptMessage, SystemPr from core.model_runtime.entities.model_entities import ModelType from core.model_runtime.errors.invoke import InvokeAuthorizationError, InvokeError from core.ops.entities.trace_entity import TraceTaskName -from core.ops.ops_trace_manager import TraceQueueManager, TraceTask from core.ops.utils import measure_time from core.prompt.utils.prompt_template_parser import PromptTemplateParser from core.workflow.entities.workflow_node_execution import WorkflowNodeExecutionMetadataKey @@ -175,7 +174,14 @@ class LLMGenerator: generated_output = candidate.strip() break - name = generated_output or (query or "") + if generated_output: + name = generated_output + else: + # Use the last non-Persian candidate (if any) so that the translation fallback + # can translate the generated candidate into Persian. Otherwise fall back to + # the original query. + last_candidate = locals().get("candidate", None) + name = last_candidate.strip() if isinstance(last_candidate, str) and last_candidate else (query or "") if is_persian_input and not _contains_persian(name): # As a last resort, ask the model to translate the title into Persian directly @@ -204,6 +210,8 @@ class LLMGenerator: name = name[:75] + "..." # get tracing instance + from core.ops.ops_trace_manager import TraceQueueManager, TraceTask + trace_manager = TraceQueueManager(app_id=app_id) trace_manager.add_trace_task( TraceTask(