mirror of
http://112.124.100.131/huang.ze/ebiz-dify-ai.git
synced 2025-12-11 20:06:54 +08:00
feat/enhance the multi-modal support (#8818)
This commit is contained in:
@@ -6,6 +6,8 @@ import httpx
|
||||
import pytest
|
||||
from _pytest.monkeypatch import MonkeyPatch
|
||||
|
||||
from core.helper import ssrf_proxy
|
||||
|
||||
MOCK = os.getenv("MOCK_SWITCH", "false") == "true"
|
||||
|
||||
|
||||
@@ -24,10 +26,16 @@ class MockedHttp:
|
||||
# get data, files
|
||||
data = kwargs.get("data")
|
||||
files = kwargs.get("files")
|
||||
json = kwargs.get("json")
|
||||
content = kwargs.get("content")
|
||||
if data is not None:
|
||||
resp = dumps(data).encode("utf-8")
|
||||
elif files is not None:
|
||||
resp = dumps(files).encode("utf-8")
|
||||
elif json is not None:
|
||||
resp = dumps(json).encode("utf-8")
|
||||
elif content is not None:
|
||||
resp = content
|
||||
else:
|
||||
resp = b"OK"
|
||||
|
||||
@@ -43,6 +51,6 @@ def setup_http_mock(request, monkeypatch: MonkeyPatch):
|
||||
yield
|
||||
return
|
||||
|
||||
monkeypatch.setattr(httpx, "request", MockedHttp.httpx_request)
|
||||
monkeypatch.setattr(ssrf_proxy, "make_request", MockedHttp.httpx_request)
|
||||
yield
|
||||
monkeypatch.undo()
|
||||
|
||||
@@ -6,7 +6,7 @@ from typing import cast
|
||||
import pytest
|
||||
|
||||
from core.app.entities.app_invoke_entities import InvokeFrom
|
||||
from core.workflow.entities.node_entities import NodeRunResult, UserFrom
|
||||
from core.workflow.entities.node_entities import NodeRunResult
|
||||
from core.workflow.entities.variable_pool import VariablePool
|
||||
from core.workflow.enums import SystemVariableKey
|
||||
from core.workflow.graph_engine.entities.graph import Graph
|
||||
@@ -14,6 +14,7 @@ from core.workflow.graph_engine.entities.graph_init_params import GraphInitParam
|
||||
from core.workflow.graph_engine.entities.graph_runtime_state import GraphRuntimeState
|
||||
from core.workflow.nodes.code.code_node import CodeNode
|
||||
from core.workflow.nodes.code.entities import CodeNodeData
|
||||
from models.enums import UserFrom
|
||||
from models.workflow import WorkflowNodeExecutionStatus, WorkflowType
|
||||
from tests.integration_tests.workflow.nodes.__mock.code_executor import setup_code_executor_mock
|
||||
|
||||
|
||||
@@ -5,13 +5,13 @@ from urllib.parse import urlencode
|
||||
import pytest
|
||||
|
||||
from core.app.entities.app_invoke_entities import InvokeFrom
|
||||
from core.workflow.entities.node_entities import UserFrom
|
||||
from core.workflow.entities.variable_pool import VariablePool
|
||||
from core.workflow.enums import SystemVariableKey
|
||||
from core.workflow.graph_engine.entities.graph import Graph
|
||||
from core.workflow.graph_engine.entities.graph_init_params import GraphInitParams
|
||||
from core.workflow.graph_engine.entities.graph_runtime_state import GraphRuntimeState
|
||||
from core.workflow.nodes.http_request.http_request_node import HttpRequestNode
|
||||
from core.workflow.nodes.http_request.node import HttpRequestNode
|
||||
from models.enums import UserFrom
|
||||
from models.workflow import WorkflowType
|
||||
from tests.integration_tests.workflow.nodes.__mock.http import setup_http_mock
|
||||
|
||||
@@ -211,7 +211,16 @@ def test_json(setup_http_mock):
|
||||
},
|
||||
"headers": "X-Header:123",
|
||||
"params": "A:b",
|
||||
"body": {"type": "json", "data": '{"a": "{{#a.b123.args1#}}"}'},
|
||||
"body": {
|
||||
"type": "json",
|
||||
"data": [
|
||||
{
|
||||
"key": "",
|
||||
"type": "text",
|
||||
"value": '{"a": "{{#a.b123.args1#}}"}',
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
}
|
||||
)
|
||||
@@ -243,7 +252,21 @@ def test_x_www_form_urlencoded(setup_http_mock):
|
||||
},
|
||||
"headers": "X-Header:123",
|
||||
"params": "A:b",
|
||||
"body": {"type": "x-www-form-urlencoded", "data": "a:{{#a.b123.args1#}}\nb:{{#a.b123.args2#}}"},
|
||||
"body": {
|
||||
"type": "x-www-form-urlencoded",
|
||||
"data": [
|
||||
{
|
||||
"key": "a",
|
||||
"type": "text",
|
||||
"value": "{{#a.b123.args1#}}",
|
||||
},
|
||||
{
|
||||
"key": "b",
|
||||
"type": "text",
|
||||
"value": "{{#a.b123.args2#}}",
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
}
|
||||
)
|
||||
@@ -275,7 +298,21 @@ def test_form_data(setup_http_mock):
|
||||
},
|
||||
"headers": "X-Header:123",
|
||||
"params": "A:b",
|
||||
"body": {"type": "form-data", "data": "a:{{#a.b123.args1#}}\nb:{{#a.b123.args2#}}"},
|
||||
"body": {
|
||||
"type": "form-data",
|
||||
"data": [
|
||||
{
|
||||
"key": "a",
|
||||
"type": "text",
|
||||
"value": "{{#a.b123.args1#}}",
|
||||
},
|
||||
{
|
||||
"key": "b",
|
||||
"type": "text",
|
||||
"value": "{{#a.b123.args2#}}",
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
}
|
||||
)
|
||||
@@ -310,7 +347,7 @@ def test_none_data(setup_http_mock):
|
||||
},
|
||||
"headers": "X-Header:123",
|
||||
"params": "A:b",
|
||||
"body": {"type": "none", "data": "123123123"},
|
||||
"body": {"type": "none", "data": []},
|
||||
},
|
||||
}
|
||||
)
|
||||
@@ -366,7 +403,21 @@ def test_multi_colons_parse(setup_http_mock):
|
||||
},
|
||||
"params": "Referer:http://example1.com\nRedirect:http://example2.com",
|
||||
"headers": "Referer:http://example3.com\nRedirect:http://example4.com",
|
||||
"body": {"type": "form-data", "data": "Referer:http://example5.com\nRedirect:http://example6.com"},
|
||||
"body": {
|
||||
"type": "form-data",
|
||||
"data": [
|
||||
{
|
||||
"key": "Referer",
|
||||
"type": "text",
|
||||
"value": "http://example5.com",
|
||||
},
|
||||
{
|
||||
"key": "Redirect",
|
||||
"type": "text",
|
||||
"value": "http://example6.com",
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
}
|
||||
)
|
||||
@@ -377,5 +428,5 @@ def test_multi_colons_parse(setup_http_mock):
|
||||
resp = result.outputs
|
||||
|
||||
assert urlencode({"Redirect": "http://example2.com"}) in result.process_data.get("request", "")
|
||||
assert 'form-data; name="Redirect"\n\nhttp://example6.com' in result.process_data.get("request", "")
|
||||
assert "http://example3.com" == resp.get("headers", {}).get("referer")
|
||||
assert 'form-data; name="Redirect"\r\n\r\nhttp://example6.com' in result.process_data.get("request", "")
|
||||
# assert "http://example3.com" == resp.get("headers", {}).get("referer")
|
||||
|
||||
@@ -13,15 +13,15 @@ from core.entities.provider_entities import CustomConfiguration, CustomProviderC
|
||||
from core.model_manager import ModelInstance
|
||||
from core.model_runtime.entities.model_entities import ModelType
|
||||
from core.model_runtime.model_providers import ModelProviderFactory
|
||||
from core.workflow.entities.node_entities import UserFrom
|
||||
from core.workflow.entities.variable_pool import VariablePool
|
||||
from core.workflow.enums import SystemVariableKey
|
||||
from core.workflow.graph_engine.entities.graph import Graph
|
||||
from core.workflow.graph_engine.entities.graph_init_params import GraphInitParams
|
||||
from core.workflow.graph_engine.entities.graph_runtime_state import GraphRuntimeState
|
||||
from core.workflow.nodes.event import RunCompletedEvent
|
||||
from core.workflow.nodes.llm.llm_node import LLMNode
|
||||
from core.workflow.nodes.llm.node import LLMNode
|
||||
from extensions.ext_database import db
|
||||
from models.enums import UserFrom
|
||||
from models.provider import ProviderType
|
||||
from models.workflow import WorkflowNodeExecutionStatus, WorkflowType
|
||||
|
||||
|
||||
@@ -12,7 +12,6 @@ from core.entities.provider_entities import CustomConfiguration, CustomProviderC
|
||||
from core.model_manager import ModelInstance
|
||||
from core.model_runtime.entities.model_entities import ModelType
|
||||
from core.model_runtime.model_providers.model_provider_factory import ModelProviderFactory
|
||||
from core.workflow.entities.node_entities import UserFrom
|
||||
from core.workflow.entities.variable_pool import VariablePool
|
||||
from core.workflow.enums import SystemVariableKey
|
||||
from core.workflow.graph_engine.entities.graph import Graph
|
||||
@@ -20,6 +19,7 @@ from core.workflow.graph_engine.entities.graph_init_params import GraphInitParam
|
||||
from core.workflow.graph_engine.entities.graph_runtime_state import GraphRuntimeState
|
||||
from core.workflow.nodes.parameter_extractor.parameter_extractor_node import ParameterExtractorNode
|
||||
from extensions.ext_database import db
|
||||
from models.enums import UserFrom
|
||||
from models.provider import ProviderType
|
||||
|
||||
"""FOR MOCK FIXTURES, DO NOT REMOVE"""
|
||||
|
||||
@@ -4,13 +4,13 @@ import uuid
|
||||
import pytest
|
||||
|
||||
from core.app.entities.app_invoke_entities import InvokeFrom
|
||||
from core.workflow.entities.node_entities import UserFrom
|
||||
from core.workflow.entities.variable_pool import VariablePool
|
||||
from core.workflow.enums import SystemVariableKey
|
||||
from core.workflow.graph_engine.entities.graph import Graph
|
||||
from core.workflow.graph_engine.entities.graph_init_params import GraphInitParams
|
||||
from core.workflow.graph_engine.entities.graph_runtime_state import GraphRuntimeState
|
||||
from core.workflow.nodes.template_transform.template_transform_node import TemplateTransformNode
|
||||
from models.enums import UserFrom
|
||||
from models.workflow import WorkflowNodeExecutionStatus, WorkflowType
|
||||
from tests.integration_tests.workflow.nodes.__mock.code_executor import setup_code_executor_mock
|
||||
|
||||
|
||||
@@ -2,13 +2,14 @@ import time
|
||||
import uuid
|
||||
|
||||
from core.app.entities.app_invoke_entities import InvokeFrom
|
||||
from core.workflow.entities.node_entities import NodeRunResult, UserFrom
|
||||
from core.workflow.entities.node_entities import NodeRunResult
|
||||
from core.workflow.entities.variable_pool import VariablePool
|
||||
from core.workflow.enums import SystemVariableKey
|
||||
from core.workflow.graph_engine.entities.graph import Graph
|
||||
from core.workflow.graph_engine.entities.graph_init_params import GraphInitParams
|
||||
from core.workflow.graph_engine.entities.graph_runtime_state import GraphRuntimeState
|
||||
from core.workflow.nodes.tool.tool_node import ToolNode
|
||||
from models.enums import UserFrom
|
||||
from models.workflow import WorkflowNodeExecutionStatus, WorkflowType
|
||||
|
||||
|
||||
|
||||
57
api/tests/integration_tests/workflow/test_sync_workflow.py
Normal file
57
api/tests/integration_tests/workflow/test_sync_workflow.py
Normal file
@@ -0,0 +1,57 @@
|
||||
"""
|
||||
This test file is used to verify the compatibility of Workflow before and after supporting multiple file types.
|
||||
"""
|
||||
|
||||
import json
|
||||
|
||||
from models import Workflow
|
||||
|
||||
OLD_VERSION_WORKFLOW_FEATURES = {
|
||||
"file_upload": {
|
||||
"image": {
|
||||
"enabled": True,
|
||||
"number_limits": 6,
|
||||
"transfer_methods": ["remote_url", "local_file"],
|
||||
}
|
||||
},
|
||||
"opening_statement": "",
|
||||
"retriever_resource": {"enabled": True},
|
||||
"sensitive_word_avoidance": {"enabled": False},
|
||||
"speech_to_text": {"enabled": False},
|
||||
"suggested_questions": [],
|
||||
"suggested_questions_after_answer": {"enabled": False},
|
||||
"text_to_speech": {"enabled": False, "language": "", "voice": ""},
|
||||
}
|
||||
|
||||
NEW_VERSION_WORKFLOW_FEATURES = {
|
||||
"file_upload": {
|
||||
"enabled": True,
|
||||
"allowed_file_types": ["image"],
|
||||
"allowed_extensions": [],
|
||||
"allowed_upload_methods": ["remote_url", "local_file"],
|
||||
"number_limits": 6,
|
||||
},
|
||||
"opening_statement": "",
|
||||
"retriever_resource": {"enabled": True},
|
||||
"sensitive_word_avoidance": {"enabled": False},
|
||||
"speech_to_text": {"enabled": False},
|
||||
"suggested_questions": [],
|
||||
"suggested_questions_after_answer": {"enabled": False},
|
||||
"text_to_speech": {"enabled": False, "language": "", "voice": ""},
|
||||
}
|
||||
|
||||
|
||||
def test_workflow_features():
|
||||
workflow = Workflow(
|
||||
tenant_id="",
|
||||
app_id="",
|
||||
type="",
|
||||
version="",
|
||||
graph="",
|
||||
features=json.dumps(OLD_VERSION_WORKFLOW_FEATURES),
|
||||
created_by="",
|
||||
environment_variables=[],
|
||||
conversation_variables=[],
|
||||
)
|
||||
|
||||
assert workflow.features_dict == NEW_VERSION_WORKFLOW_FEATURES
|
||||
Reference in New Issue
Block a user