|
@@ -1,9 +1,10 @@
|
|
|
import logging
|
|
|
import time
|
|
|
-from typing import Optional
|
|
|
+from typing import Optional, cast
|
|
|
|
|
|
+from core.app.app_config.entities import FileExtraConfig
|
|
|
from core.app.apps.base_app_queue_manager import GenerateTaskStoppedException
|
|
|
-from core.file.file_obj import FileVar
|
|
|
+from core.file.file_obj import FileTransferMethod, FileType, FileVar
|
|
|
from core.workflow.callbacks.base_workflow_callback import BaseWorkflowCallback
|
|
|
from core.workflow.entities.node_entities import NodeRunMetadataKey, NodeRunResult, NodeType
|
|
|
from core.workflow.entities.variable_pool import VariablePool, VariableValue
|
|
@@ -16,6 +17,7 @@ from core.workflow.nodes.end.end_node import EndNode
|
|
|
from core.workflow.nodes.http_request.http_request_node import HttpRequestNode
|
|
|
from core.workflow.nodes.if_else.if_else_node import IfElseNode
|
|
|
from core.workflow.nodes.knowledge_retrieval.knowledge_retrieval_node import KnowledgeRetrievalNode
|
|
|
+from core.workflow.nodes.llm.entities import LLMNodeData
|
|
|
from core.workflow.nodes.llm.llm_node import LLMNode
|
|
|
from core.workflow.nodes.question_classifier.question_classifier_node import QuestionClassifierNode
|
|
|
from core.workflow.nodes.start.start_node import StartNode
|
|
@@ -219,7 +221,8 @@ class WorkflowEngineManager:
|
|
|
raise ValueError('node id not found in workflow graph')
|
|
|
|
|
|
# Get node class
|
|
|
- node_cls = node_classes.get(NodeType.value_of(node_config.get('data', {}).get('type')))
|
|
|
+ node_type = NodeType.value_of(node_config.get('data', {}).get('type'))
|
|
|
+ node_cls = node_classes.get(node_type)
|
|
|
|
|
|
# init workflow run state
|
|
|
node_instance = node_cls(
|
|
@@ -252,11 +255,40 @@ class WorkflowEngineManager:
|
|
|
variable_node_id = variable_selector[0]
|
|
|
variable_key_list = variable_selector[1:]
|
|
|
|
|
|
+ # get value
|
|
|
+ value = user_inputs.get(variable_key)
|
|
|
+
|
|
|
+ # temp fix for image type
|
|
|
+ if node_type == NodeType.LLM:
|
|
|
+ new_value = []
|
|
|
+ if isinstance(value, list):
|
|
|
+ node_data = node_instance.node_data
|
|
|
+ node_data = cast(LLMNodeData, node_data)
|
|
|
+
|
|
|
+ detail = node_data.vision.configs.detail if node_data.vision.configs else None
|
|
|
+
|
|
|
+ for item in value:
|
|
|
+ if isinstance(item, dict) and 'type' in item and item['type'] == 'image':
|
|
|
+ transfer_method = FileTransferMethod.value_of(item.get('transfer_method'))
|
|
|
+ file = FileVar(
|
|
|
+ tenant_id=workflow.tenant_id,
|
|
|
+ type=FileType.IMAGE,
|
|
|
+ transfer_method=transfer_method,
|
|
|
+ url=item.get('url') if transfer_method == FileTransferMethod.REMOTE_URL else None,
|
|
|
+ related_id=item.get(
|
|
|
+ 'upload_file_id') if transfer_method == FileTransferMethod.LOCAL_FILE else None,
|
|
|
+ extra_config=FileExtraConfig(image_config={'detail': detail} if detail else None),
|
|
|
+ )
|
|
|
+ new_value.append(file)
|
|
|
+
|
|
|
+ if new_value:
|
|
|
+ value = new_value
|
|
|
+
|
|
|
# append variable and value to variable pool
|
|
|
variable_pool.append_variable(
|
|
|
node_id=variable_node_id,
|
|
|
variable_key_list=variable_key_list,
|
|
|
- value=user_inputs.get(variable_key)
|
|
|
+ value=value
|
|
|
)
|
|
|
# run node
|
|
|
node_run_result = node_instance.run(
|