324 lines
9.2 KiB
Python
324 lines
9.2 KiB
Python
|
|
"""
|
|||
|
|
工作流模板服务
|
|||
|
|
提供预设的工作流模板,支持快速创建
|
|||
|
|
"""
|
|||
|
|
from typing import Dict, Any, List
|
|||
|
|
import logging
|
|||
|
|
|
|||
|
|
logger = logging.getLogger(__name__)
|
|||
|
|
|
|||
|
|
|
|||
|
|
# 预设工作流模板
|
|||
|
|
WORKFLOW_TEMPLATES = {
|
|||
|
|
"simple_llm": {
|
|||
|
|
"name": "简单LLM工作流",
|
|||
|
|
"description": "一个简单的LLM调用工作流,包含开始、LLM和结束节点",
|
|||
|
|
"nodes": [
|
|||
|
|
{
|
|||
|
|
"id": "start-1",
|
|||
|
|
"type": "start",
|
|||
|
|
"position": {"x": 100, "y": 100},
|
|||
|
|
"data": {"label": "开始"}
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"id": "llm-1",
|
|||
|
|
"type": "llm",
|
|||
|
|
"position": {"x": 100, "y": 250},
|
|||
|
|
"data": {
|
|||
|
|
"label": "LLM处理",
|
|||
|
|
"prompt": "请处理以下输入:\n{input}",
|
|||
|
|
"provider": "openai",
|
|||
|
|
"model": "gpt-3.5-turbo",
|
|||
|
|
"temperature": 0.7
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"id": "end-1",
|
|||
|
|
"type": "end",
|
|||
|
|
"position": {"x": 100, "y": 400},
|
|||
|
|
"data": {"label": "结束"}
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"edges": [
|
|||
|
|
{
|
|||
|
|
"id": "e1",
|
|||
|
|
"source": "start-1",
|
|||
|
|
"target": "llm-1",
|
|||
|
|
"sourceHandle": "bottom",
|
|||
|
|
"targetHandle": "top"
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"id": "e2",
|
|||
|
|
"source": "llm-1",
|
|||
|
|
"target": "end-1",
|
|||
|
|
"sourceHandle": "bottom",
|
|||
|
|
"targetHandle": "top"
|
|||
|
|
}
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
"conditional_llm": {
|
|||
|
|
"name": "条件判断LLM工作流",
|
|||
|
|
"description": "根据条件判断调用不同的LLM处理",
|
|||
|
|
"nodes": [
|
|||
|
|
{
|
|||
|
|
"id": "start-1",
|
|||
|
|
"type": "start",
|
|||
|
|
"position": {"x": 100, "y": 100},
|
|||
|
|
"data": {"label": "开始"}
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"id": "condition-1",
|
|||
|
|
"type": "condition",
|
|||
|
|
"position": {"x": 100, "y": 200},
|
|||
|
|
"data": {
|
|||
|
|
"label": "条件判断",
|
|||
|
|
"condition": "{value} > 10"
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"id": "llm-true",
|
|||
|
|
"type": "llm",
|
|||
|
|
"position": {"x": -100, "y": 350},
|
|||
|
|
"data": {
|
|||
|
|
"label": "True分支LLM",
|
|||
|
|
"prompt": "值大于10,请分析:{input}",
|
|||
|
|
"provider": "openai",
|
|||
|
|
"model": "gpt-3.5-turbo"
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"id": "llm-false",
|
|||
|
|
"type": "llm",
|
|||
|
|
"position": {"x": 300, "y": 350},
|
|||
|
|
"data": {
|
|||
|
|
"label": "False分支LLM",
|
|||
|
|
"prompt": "值小于等于10,请分析:{input}",
|
|||
|
|
"provider": "openai",
|
|||
|
|
"model": "gpt-3.5-turbo"
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"id": "end-1",
|
|||
|
|
"type": "end",
|
|||
|
|
"position": {"x": 100, "y": 500},
|
|||
|
|
"data": {"label": "结束"}
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"edges": [
|
|||
|
|
{
|
|||
|
|
"id": "e1",
|
|||
|
|
"source": "start-1",
|
|||
|
|
"target": "condition-1"
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"id": "e2",
|
|||
|
|
"source": "condition-1",
|
|||
|
|
"target": "llm-true",
|
|||
|
|
"sourceHandle": "true"
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"id": "e3",
|
|||
|
|
"source": "condition-1",
|
|||
|
|
"target": "llm-false",
|
|||
|
|
"sourceHandle": "false"
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"id": "e4",
|
|||
|
|
"source": "llm-true",
|
|||
|
|
"target": "end-1"
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"id": "e5",
|
|||
|
|
"source": "llm-false",
|
|||
|
|
"target": "end-1"
|
|||
|
|
}
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
"data_transform_llm": {
|
|||
|
|
"name": "数据转换+LLM工作流",
|
|||
|
|
"description": "先进行数据转换,再调用LLM处理",
|
|||
|
|
"nodes": [
|
|||
|
|
{
|
|||
|
|
"id": "start-1",
|
|||
|
|
"type": "start",
|
|||
|
|
"position": {"x": 100, "y": 100},
|
|||
|
|
"data": {"label": "开始"}
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"id": "transform-1",
|
|||
|
|
"type": "transform",
|
|||
|
|
"position": {"x": 100, "y": 200},
|
|||
|
|
"data": {
|
|||
|
|
"label": "数据转换",
|
|||
|
|
"mode": "mapping",
|
|||
|
|
"mapping": {
|
|||
|
|
"input_text": "raw_input",
|
|||
|
|
"user_id": "id"
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"id": "llm-1",
|
|||
|
|
"type": "llm",
|
|||
|
|
"position": {"x": 100, "y": 300},
|
|||
|
|
"data": {
|
|||
|
|
"label": "LLM处理",
|
|||
|
|
"prompt": "处理转换后的数据:{input_text}",
|
|||
|
|
"provider": "openai",
|
|||
|
|
"model": "gpt-3.5-turbo"
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"id": "end-1",
|
|||
|
|
"type": "end",
|
|||
|
|
"position": {"x": 100, "y": 400},
|
|||
|
|
"data": {"label": "结束"}
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"edges": [
|
|||
|
|
{
|
|||
|
|
"id": "e1",
|
|||
|
|
"source": "start-1",
|
|||
|
|
"target": "transform-1"
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"id": "e2",
|
|||
|
|
"source": "transform-1",
|
|||
|
|
"target": "llm-1"
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"id": "e3",
|
|||
|
|
"source": "llm-1",
|
|||
|
|
"target": "end-1"
|
|||
|
|
}
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
"multi_llm_chain": {
|
|||
|
|
"name": "多LLM链式工作流",
|
|||
|
|
"description": "多个LLM节点链式调用,实现复杂处理流程",
|
|||
|
|
"nodes": [
|
|||
|
|
{
|
|||
|
|
"id": "start-1",
|
|||
|
|
"type": "start",
|
|||
|
|
"position": {"x": 100, "y": 100},
|
|||
|
|
"data": {"label": "开始"}
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"id": "llm-1",
|
|||
|
|
"type": "llm",
|
|||
|
|
"position": {"x": 100, "y": 200},
|
|||
|
|
"data": {
|
|||
|
|
"label": "第一步分析",
|
|||
|
|
"prompt": "第一步:分析输入数据:{input}",
|
|||
|
|
"provider": "openai",
|
|||
|
|
"model": "gpt-3.5-turbo"
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"id": "llm-2",
|
|||
|
|
"type": "llm",
|
|||
|
|
"position": {"x": 100, "y": 300},
|
|||
|
|
"data": {
|
|||
|
|
"label": "第二步处理",
|
|||
|
|
"prompt": "第二步:基于第一步的结果进行处理:{input}",
|
|||
|
|
"provider": "openai",
|
|||
|
|
"model": "gpt-3.5-turbo"
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"id": "llm-3",
|
|||
|
|
"type": "llm",
|
|||
|
|
"position": {"x": 100, "y": 400},
|
|||
|
|
"data": {
|
|||
|
|
"label": "第三步总结",
|
|||
|
|
"prompt": "第三步:总结最终结果:{input}",
|
|||
|
|
"provider": "openai",
|
|||
|
|
"model": "gpt-3.5-turbo"
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"id": "end-1",
|
|||
|
|
"type": "end",
|
|||
|
|
"position": {"x": 100, "y": 500},
|
|||
|
|
"data": {"label": "结束"}
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"edges": [
|
|||
|
|
{
|
|||
|
|
"id": "e1",
|
|||
|
|
"source": "start-1",
|
|||
|
|
"target": "llm-1"
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"id": "e2",
|
|||
|
|
"source": "llm-1",
|
|||
|
|
"target": "llm-2"
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"id": "e3",
|
|||
|
|
"source": "llm-2",
|
|||
|
|
"target": "llm-3"
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"id": "e4",
|
|||
|
|
"source": "llm-3",
|
|||
|
|
"target": "end-1"
|
|||
|
|
}
|
|||
|
|
]
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
def get_template(template_id: str) -> Dict[str, Any]:
|
|||
|
|
"""
|
|||
|
|
获取工作流模板
|
|||
|
|
|
|||
|
|
Args:
|
|||
|
|
template_id: 模板ID
|
|||
|
|
|
|||
|
|
Returns:
|
|||
|
|
模板数据
|
|||
|
|
"""
|
|||
|
|
return WORKFLOW_TEMPLATES.get(template_id)
|
|||
|
|
|
|||
|
|
|
|||
|
|
def list_templates() -> List[Dict[str, Any]]:
|
|||
|
|
"""
|
|||
|
|
获取所有模板列表
|
|||
|
|
|
|||
|
|
Returns:
|
|||
|
|
模板列表,每个模板包含id、name、description
|
|||
|
|
"""
|
|||
|
|
return [
|
|||
|
|
{
|
|||
|
|
"id": template_id,
|
|||
|
|
"name": template["name"],
|
|||
|
|
"description": template["description"]
|
|||
|
|
}
|
|||
|
|
for template_id, template in WORKFLOW_TEMPLATES.items()
|
|||
|
|
]
|
|||
|
|
|
|||
|
|
|
|||
|
|
def create_from_template(template_id: str, name: str = None, description: str = None) -> Dict[str, Any]:
|
|||
|
|
"""
|
|||
|
|
从模板创建工作流数据
|
|||
|
|
|
|||
|
|
Args:
|
|||
|
|
template_id: 模板ID
|
|||
|
|
name: 工作流名称(可选,默认使用模板名称)
|
|||
|
|
description: 工作流描述(可选,默认使用模板描述)
|
|||
|
|
|
|||
|
|
Returns:
|
|||
|
|
工作流数据
|
|||
|
|
"""
|
|||
|
|
template = get_template(template_id)
|
|||
|
|
if not template:
|
|||
|
|
raise ValueError(f"模板不存在: {template_id}")
|
|||
|
|
|
|||
|
|
return {
|
|||
|
|
"name": name or template["name"],
|
|||
|
|
"description": description or template["description"],
|
|||
|
|
"nodes": template["nodes"],
|
|||
|
|
"edges": template["edges"]
|
|||
|
|
}
|