mirror of
https://github.com/langgenius/dify.git
synced 2026-04-25 13:16:16 +08:00
add get default node config
This commit is contained in:
12
api/core/workflow/nodes/base_node.py
Normal file
12
api/core/workflow/nodes/base_node.py
Normal file
@ -0,0 +1,12 @@
|
||||
from typing import Optional
|
||||
|
||||
|
||||
class BaseNode:
|
||||
@classmethod
|
||||
def get_default_config(cls, filters: Optional[dict] = None) -> dict:
|
||||
"""
|
||||
Get default config of node.
|
||||
:param filters: filter by node config parameters.
|
||||
:return:
|
||||
"""
|
||||
return {}
|
||||
0
api/core/workflow/nodes/code/__init__.py
Normal file
0
api/core/workflow/nodes/code/__init__.py
Normal file
64
api/core/workflow/nodes/code/code_node.py
Normal file
64
api/core/workflow/nodes/code/code_node.py
Normal file
@ -0,0 +1,64 @@
|
||||
from typing import Optional
|
||||
|
||||
from core.workflow.nodes.base_node import BaseNode
|
||||
|
||||
|
||||
class CodeNode(BaseNode):
|
||||
@classmethod
|
||||
def get_default_config(cls, filters: Optional[dict] = None) -> dict:
|
||||
"""
|
||||
Get default config of node.
|
||||
:param filters: filter by node config parameters.
|
||||
:return:
|
||||
"""
|
||||
if filters and filters.get("code_language") == "javascript":
|
||||
return {
|
||||
"type": "code",
|
||||
"config": {
|
||||
"variables": [
|
||||
{
|
||||
"variable": "arg1",
|
||||
"value_selector": []
|
||||
},
|
||||
{
|
||||
"variable": "arg2",
|
||||
"value_selector": []
|
||||
}
|
||||
],
|
||||
"code_language": "javascript",
|
||||
"code": "async function main(arg1, arg2) {\n return new Promise((resolve, reject) => {"
|
||||
"\n if (true) {\n resolve({\n \"result\": arg1 + arg2"
|
||||
"\n });\n } else {\n reject(\"e\");\n }\n });\n}",
|
||||
"outputs": [
|
||||
{
|
||||
"variable": "result",
|
||||
"variable_type": "number"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
"type": "code",
|
||||
"config": {
|
||||
"variables": [
|
||||
{
|
||||
"variable": "arg1",
|
||||
"value_selector": []
|
||||
},
|
||||
{
|
||||
"variable": "arg2",
|
||||
"value_selector": []
|
||||
}
|
||||
],
|
||||
"code_language": "python3",
|
||||
"code": "def main(\n arg1: int,\n arg2: int,\n) -> int:\n return {\n \"result\": arg1 "
|
||||
"+ arg2\n }",
|
||||
"outputs": [
|
||||
{
|
||||
"variable": "result",
|
||||
"variable_type": "number"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
0
api/core/workflow/nodes/direct_answer/__init__.py
Normal file
0
api/core/workflow/nodes/direct_answer/__init__.py
Normal file
@ -0,0 +1,5 @@
|
||||
from core.workflow.nodes.base_node import BaseNode
|
||||
|
||||
|
||||
class DirectAnswerNode(BaseNode):
|
||||
pass
|
||||
@ -0,0 +1,5 @@
|
||||
from core.workflow.nodes.base_node import BaseNode
|
||||
|
||||
|
||||
class EndNode(BaseNode):
|
||||
pass
|
||||
|
||||
0
api/core/workflow/nodes/http_request/__init__.py
Normal file
0
api/core/workflow/nodes/http_request/__init__.py
Normal file
@ -0,0 +1,5 @@
|
||||
from core.workflow.nodes.base_node import BaseNode
|
||||
|
||||
|
||||
class HttpRequestNode(BaseNode):
|
||||
pass
|
||||
0
api/core/workflow/nodes/if_else/__init__.py
Normal file
0
api/core/workflow/nodes/if_else/__init__.py
Normal file
5
api/core/workflow/nodes/if_else/if_else_node.py
Normal file
5
api/core/workflow/nodes/if_else/if_else_node.py
Normal file
@ -0,0 +1,5 @@
|
||||
from core.workflow.nodes.base_node import BaseNode
|
||||
|
||||
|
||||
class IfElseNode(BaseNode):
|
||||
pass
|
||||
@ -0,0 +1,5 @@
|
||||
from core.workflow.nodes.base_node import BaseNode
|
||||
|
||||
|
||||
class KnowledgeRetrievalNode(BaseNode):
|
||||
pass
|
||||
0
api/core/workflow/nodes/llm/__init__.py
Normal file
0
api/core/workflow/nodes/llm/__init__.py
Normal file
40
api/core/workflow/nodes/llm/llm_node.py
Normal file
40
api/core/workflow/nodes/llm/llm_node.py
Normal file
@ -0,0 +1,40 @@
|
||||
from typing import Optional
|
||||
|
||||
from core.workflow.nodes.base_node import BaseNode
|
||||
|
||||
|
||||
class LLMNode(BaseNode):
|
||||
@classmethod
|
||||
def get_default_config(cls, filters: Optional[dict] = None) -> dict:
|
||||
"""
|
||||
Get default config of node.
|
||||
:param filters: filter by node config parameters.
|
||||
:return:
|
||||
"""
|
||||
return {
|
||||
"type": "llm",
|
||||
"config": {
|
||||
"prompt_templates": {
|
||||
"chat_model": {
|
||||
"prompts": [
|
||||
{
|
||||
"role": "system",
|
||||
"text": "You are a helpful AI assistant."
|
||||
}
|
||||
]
|
||||
},
|
||||
"completion_model": {
|
||||
"conversation_histories_role": {
|
||||
"user_prefix": "Human",
|
||||
"assistant_prefix": "Assistant"
|
||||
},
|
||||
"prompt": {
|
||||
"text": "Here is the chat histories between human and assistant, inside "
|
||||
"<histories></histories> XML tags.\n\n<histories>\n{{"
|
||||
"#histories#}}\n</histories>\n\n\nHuman: {{#query#}}\n\nAssistant:"
|
||||
},
|
||||
"stop": ["Human:"]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,19 @@
|
||||
from typing import Optional
|
||||
|
||||
from core.workflow.nodes.base_node import BaseNode
|
||||
|
||||
|
||||
class QuestionClassifierNode(BaseNode):
|
||||
@classmethod
|
||||
def get_default_config(cls, filters: Optional[dict] = None) -> dict:
|
||||
"""
|
||||
Get default config of node.
|
||||
:param filters: filter by node config parameters.
|
||||
:return:
|
||||
"""
|
||||
return {
|
||||
"type": "question-classifier",
|
||||
"config": {
|
||||
"instructions": "" # TODO
|
||||
}
|
||||
}
|
||||
0
api/core/workflow/nodes/start/__init__.py
Normal file
0
api/core/workflow/nodes/start/__init__.py
Normal file
5
api/core/workflow/nodes/start/start_node.py
Normal file
5
api/core/workflow/nodes/start/start_node.py
Normal file
@ -0,0 +1,5 @@
|
||||
from core.workflow.nodes.base_node import BaseNode
|
||||
|
||||
|
||||
class StartNode(BaseNode):
|
||||
pass
|
||||
@ -0,0 +1,25 @@
|
||||
from typing import Optional
|
||||
|
||||
from core.workflow.nodes.base_node import BaseNode
|
||||
|
||||
|
||||
class TemplateTransformNode(BaseNode):
|
||||
@classmethod
|
||||
def get_default_config(cls, filters: Optional[dict] = None) -> dict:
|
||||
"""
|
||||
Get default config of node.
|
||||
:param filters: filter by node config parameters.
|
||||
:return:
|
||||
"""
|
||||
return {
|
||||
"type": "template-transform",
|
||||
"config": {
|
||||
"variables": [
|
||||
{
|
||||
"variable": "arg1",
|
||||
"value_selector": []
|
||||
}
|
||||
],
|
||||
"template": "{{ arg1 }}"
|
||||
}
|
||||
}
|
||||
0
api/core/workflow/nodes/tool/__init__.py
Normal file
0
api/core/workflow/nodes/tool/__init__.py
Normal file
5
api/core/workflow/nodes/tool/tool_node.py
Normal file
5
api/core/workflow/nodes/tool/tool_node.py
Normal file
@ -0,0 +1,5 @@
|
||||
from core.workflow.nodes.base_node import BaseNode
|
||||
|
||||
|
||||
class ToolNode(BaseNode):
|
||||
pass
|
||||
@ -0,0 +1,5 @@
|
||||
from core.workflow.nodes.base_node import BaseNode
|
||||
|
||||
|
||||
class VariableAssignerNode(BaseNode):
|
||||
pass
|
||||
@ -1,9 +1,37 @@
|
||||
from typing import Optional
|
||||
|
||||
from core.workflow.entities.node_entities import NodeType
|
||||
from core.workflow.nodes.code.code_node import CodeNode
|
||||
from core.workflow.nodes.direct_answer.direct_answer_node import DirectAnswerNode
|
||||
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.llm_node import LLMNode
|
||||
from core.workflow.nodes.question_classifier.question_classifier_node import QuestionClassifierNode
|
||||
from core.workflow.nodes.start.start_node import StartNode
|
||||
from core.workflow.nodes.template_transform.template_transform_node import TemplateTransformNode
|
||||
from core.workflow.nodes.tool.tool_node import ToolNode
|
||||
from core.workflow.nodes.variable_assigner.variable_assigner_node import VariableAssignerNode
|
||||
from extensions.ext_database import db
|
||||
from models.model import App
|
||||
from models.workflow import Workflow
|
||||
|
||||
node_classes = {
|
||||
NodeType.START: StartNode,
|
||||
NodeType.END: EndNode,
|
||||
NodeType.DIRECT_ANSWER: DirectAnswerNode,
|
||||
NodeType.LLM: LLMNode,
|
||||
NodeType.KNOWLEDGE_RETRIEVAL: KnowledgeRetrievalNode,
|
||||
NodeType.IF_ELSE: IfElseNode,
|
||||
NodeType.CODE: CodeNode,
|
||||
NodeType.TEMPLATE_TRANSFORM: TemplateTransformNode,
|
||||
NodeType.QUESTION_CLASSIFIER: QuestionClassifierNode,
|
||||
NodeType.HTTP_REQUEST: HttpRequestNode,
|
||||
NodeType.TOOL: ToolNode,
|
||||
NodeType.VARIABLE_ASSIGNER: VariableAssignerNode,
|
||||
}
|
||||
|
||||
|
||||
class WorkflowEngineManager:
|
||||
def get_draft_workflow(self, app_model: App) -> Optional[Workflow]:
|
||||
@ -36,3 +64,35 @@ class WorkflowEngineManager:
|
||||
|
||||
# return published workflow
|
||||
return workflow
|
||||
|
||||
def get_default_configs(self) -> list[dict]:
|
||||
"""
|
||||
Get default block configs
|
||||
"""
|
||||
default_block_configs = []
|
||||
for node_type, node_class in node_classes.items():
|
||||
default_config = node_class.get_default_config()
|
||||
if default_config:
|
||||
default_block_configs.append({
|
||||
'type': node_type.value,
|
||||
'config': default_config
|
||||
})
|
||||
|
||||
return default_block_configs
|
||||
|
||||
def get_default_config(self, node_type: NodeType, filters: Optional[dict] = None) -> Optional[dict]:
|
||||
"""
|
||||
Get default config of node.
|
||||
:param node_type: node type
|
||||
:param filters: filter by node config parameters.
|
||||
:return:
|
||||
"""
|
||||
node_class = node_classes.get(node_type)
|
||||
if not node_class:
|
||||
return None
|
||||
|
||||
default_config = node_class.get_default_config(filters=filters)
|
||||
if not default_config:
|
||||
return None
|
||||
|
||||
return default_config
|
||||
|
||||
Reference in New Issue
Block a user