2026-03-11 23:40:39 +08:00
|
|
|
"""
|
|
|
|
|
工作流管理器模块
|
|
|
|
|
|
|
|
|
|
支持动态注册和管理工作流类型
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
from typing import Any, Callable, Dict, List, Optional, Type, Union
|
2026-02-17 02:31:39 +08:00
|
|
|
from enum import Enum
|
2026-03-11 23:40:39 +08:00
|
|
|
from datetime import datetime, timedelta
|
|
|
|
|
import logging
|
|
|
|
|
|
2026-02-26 13:43:44 +08:00
|
|
|
from agent.conversation import ConversationAgent
|
|
|
|
|
from agent.tool import ToolAgent
|
2026-03-11 23:40:39 +08:00
|
|
|
from core.registry import WorkflowRegistry, WorkflowMetadata
|
|
|
|
|
|
|
|
|
|
logger = logging.getLogger(__name__)
|
2026-02-17 02:31:39 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
class WorkflowType(Enum):
|
2026-02-26 13:43:44 +08:00
|
|
|
"""可用的工作流类型"""
|
2026-02-17 02:31:39 +08:00
|
|
|
CONVERSATION = "conversation"
|
|
|
|
|
TOOL_USING = "tool_using"
|
2026-03-11 23:40:39 +08:00
|
|
|
|
2026-02-17 02:31:39 +08:00
|
|
|
|
|
|
|
|
class WorkflowManager:
|
2026-03-11 23:40:39 +08:00
|
|
|
"""
|
|
|
|
|
管理不同工作流类型及其执行
|
|
|
|
|
|
|
|
|
|
支持特性:
|
|
|
|
|
- 动态注册工作流
|
|
|
|
|
- 会话管理
|
|
|
|
|
- 工作流元数据
|
|
|
|
|
"""
|
2026-02-17 02:31:39 +08:00
|
|
|
|
2026-02-26 13:43:44 +08:00
|
|
|
def __init__(self, default_model_section: Optional[str] = None):
|
2026-03-11 23:40:39 +08:00
|
|
|
self._default_model_section = default_model_section
|
|
|
|
|
self._workflows: Dict[str, Any] = {}
|
|
|
|
|
self._workflow_metadata: Dict[str, WorkflowMetadata] = {}
|
2026-02-17 02:31:39 +08:00
|
|
|
self.active_sessions: Dict[str, Any] = {}
|
2026-03-11 23:40:39 +08:00
|
|
|
|
|
|
|
|
self._register_default_workflows()
|
2026-02-17 02:31:39 +08:00
|
|
|
|
2026-03-11 23:40:39 +08:00
|
|
|
def _register_default_workflows(self) -> None:
|
|
|
|
|
"""注册默认工作流"""
|
|
|
|
|
self.register_workflow(
|
|
|
|
|
name=WorkflowType.CONVERSATION.value,
|
|
|
|
|
agent=ConversationAgent(model_section=self._default_model_section),
|
|
|
|
|
description="多轮对话工作流",
|
|
|
|
|
version="1.0.0",
|
|
|
|
|
)
|
|
|
|
|
self.register_workflow(
|
|
|
|
|
name=WorkflowType.TOOL_USING.value,
|
|
|
|
|
agent=ToolAgent(model_section=self._default_model_section),
|
|
|
|
|
description="工具调用工作流",
|
|
|
|
|
version="1.0.0",
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
def register_workflow(
|
|
|
|
|
self,
|
|
|
|
|
name: str,
|
|
|
|
|
agent: Any,
|
|
|
|
|
description: str = "",
|
|
|
|
|
version: str = "1.0.0",
|
|
|
|
|
default_model: Optional[str] = None,
|
|
|
|
|
supported_features: Optional[List[str]] = None,
|
|
|
|
|
) -> None:
|
|
|
|
|
"""
|
|
|
|
|
注册工作流
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
name: 工作流名称
|
|
|
|
|
agent: Agent 实例
|
|
|
|
|
description: 描述
|
|
|
|
|
version: 版本
|
|
|
|
|
default_model: 默认模型
|
|
|
|
|
supported_features: 支持的特性列表
|
|
|
|
|
"""
|
|
|
|
|
metadata = WorkflowMetadata(
|
|
|
|
|
name=name,
|
|
|
|
|
description=description,
|
|
|
|
|
version=version,
|
|
|
|
|
default_model=default_model,
|
|
|
|
|
supported_features=supported_features or [],
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
self._workflows[name] = agent
|
|
|
|
|
self._workflow_metadata[name] = metadata
|
|
|
|
|
|
|
|
|
|
WorkflowRegistry._entries[name] = type(
|
|
|
|
|
"RegistryEntry",
|
|
|
|
|
(),
|
|
|
|
|
{"instance": agent, "metadata": {"workflow_metadata": metadata}}
|
|
|
|
|
)()
|
|
|
|
|
|
|
|
|
|
logger.info(f"Registered workflow: {name} (v{version})")
|
2026-02-17 02:31:39 +08:00
|
|
|
|
2026-03-11 23:40:39 +08:00
|
|
|
def unregister_workflow(self, name: str) -> bool:
|
|
|
|
|
"""
|
|
|
|
|
注销工作流
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
name: 工作流名称
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
是否成功注销
|
|
|
|
|
"""
|
|
|
|
|
if name in self._workflows:
|
|
|
|
|
del self._workflows[name]
|
|
|
|
|
del self._workflow_metadata[name]
|
|
|
|
|
WorkflowRegistry.unregister(name)
|
|
|
|
|
logger.info(f"Unregistered workflow: {name}")
|
|
|
|
|
return True
|
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
def get_workflow(self, workflow_type: Union[WorkflowType, str]) -> Optional[Any]:
|
|
|
|
|
"""
|
|
|
|
|
获取工作流实例
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
workflow_type: 工作流类型(枚举或字符串)
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
Agent 实例
|
|
|
|
|
"""
|
|
|
|
|
name = workflow_type.value if isinstance(workflow_type, WorkflowType) else workflow_type
|
|
|
|
|
return self._workflows.get(name)
|
|
|
|
|
|
|
|
|
|
def get_workflow_metadata(self, name: str) -> Optional[WorkflowMetadata]:
|
|
|
|
|
"""获取工作流元数据"""
|
|
|
|
|
return self._workflow_metadata.get(name)
|
|
|
|
|
|
|
|
|
|
def execute_workflow(
|
|
|
|
|
self,
|
|
|
|
|
workflow_type: Union[WorkflowType, str],
|
|
|
|
|
user_input: str,
|
|
|
|
|
session_id: Optional[str] = None,
|
|
|
|
|
**kwargs
|
|
|
|
|
) -> Dict[str, Any]:
|
|
|
|
|
"""
|
|
|
|
|
执行指定工作流
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
workflow_type: 工作流类型
|
|
|
|
|
user_input: 用户输入
|
|
|
|
|
session_id: 会话ID
|
|
|
|
|
**kwargs: 额外参数
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
执行结果
|
|
|
|
|
"""
|
|
|
|
|
name = workflow_type.value if isinstance(workflow_type, WorkflowType) else workflow_type
|
|
|
|
|
workflow = self.get_workflow(name)
|
2026-02-17 02:31:39 +08:00
|
|
|
|
|
|
|
|
if not workflow:
|
2026-03-11 23:40:39 +08:00
|
|
|
return {"error": f"Workflow {name} not found"}
|
2026-02-17 02:31:39 +08:00
|
|
|
|
|
|
|
|
if not session_id:
|
|
|
|
|
session_id = f"session_{len(self.active_sessions) + 1}"
|
|
|
|
|
|
|
|
|
|
result = workflow.run(user_input, **kwargs)
|
|
|
|
|
|
|
|
|
|
self.active_sessions[session_id] = {
|
2026-03-11 23:40:39 +08:00
|
|
|
"workflow_type": name,
|
2026-02-17 02:31:39 +08:00
|
|
|
"last_result": result,
|
|
|
|
|
"timestamp": self._get_timestamp()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
"session_id": session_id,
|
2026-03-11 23:40:39 +08:00
|
|
|
"workflow_type": name,
|
2026-02-17 02:31:39 +08:00
|
|
|
"result": result
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
def get_available_workflows(self) -> List[str]:
|
2026-02-26 13:43:44 +08:00
|
|
|
"""获取可用工作流列表"""
|
2026-03-11 23:40:39 +08:00
|
|
|
return list(self._workflows.keys())
|
|
|
|
|
|
|
|
|
|
def get_workflow_info(self, name: str) -> Optional[Dict[str, Any]]:
|
|
|
|
|
"""获取工作流详细信息"""
|
|
|
|
|
if name not in self._workflows:
|
|
|
|
|
return None
|
|
|
|
|
|
|
|
|
|
metadata = self._workflow_metadata.get(name)
|
|
|
|
|
return {
|
|
|
|
|
"name": name,
|
|
|
|
|
"description": metadata.description if metadata else "",
|
|
|
|
|
"version": metadata.version if metadata else "unknown",
|
|
|
|
|
"supported_features": metadata.supported_features if metadata else [],
|
|
|
|
|
}
|
2026-02-17 02:31:39 +08:00
|
|
|
|
|
|
|
|
def _get_timestamp(self) -> str:
|
2026-02-26 13:43:44 +08:00
|
|
|
"""获取当前时间戳"""
|
2026-02-17 02:31:39 +08:00
|
|
|
return datetime.now().isoformat()
|
|
|
|
|
|
|
|
|
|
def get_session_info(self, session_id: str) -> Optional[Dict[str, Any]]:
|
2026-02-26 13:43:44 +08:00
|
|
|
"""获取会话信息"""
|
2026-02-17 02:31:39 +08:00
|
|
|
return self.active_sessions.get(session_id)
|
|
|
|
|
|
2026-03-11 23:40:39 +08:00
|
|
|
def cleanup_sessions(self, older_than_hours: int = 24) -> int:
|
|
|
|
|
"""
|
|
|
|
|
清理过期会话
|
2026-02-17 02:31:39 +08:00
|
|
|
|
2026-03-11 23:40:39 +08:00
|
|
|
Args:
|
|
|
|
|
older_than_hours: 超过多少小时的会话将被清理
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
清理的会话数量
|
|
|
|
|
"""
|
2026-02-17 02:31:39 +08:00
|
|
|
cutoff_time = datetime.now() - timedelta(hours=older_than_hours)
|
|
|
|
|
|
|
|
|
|
sessions_to_remove = []
|
|
|
|
|
for session_id, session_data in self.active_sessions.items():
|
|
|
|
|
session_time = datetime.fromisoformat(session_data["timestamp"])
|
|
|
|
|
if session_time < cutoff_time:
|
|
|
|
|
sessions_to_remove.append(session_id)
|
|
|
|
|
|
|
|
|
|
for session_id in sessions_to_remove:
|
|
|
|
|
del self.active_sessions[session_id]
|
|
|
|
|
|
2026-03-11 23:40:39 +08:00
|
|
|
if sessions_to_remove:
|
|
|
|
|
logger.info(f"Cleaned up {len(sessions_to_remove)} expired sessions")
|
|
|
|
|
|
|
|
|
|
return len(sessions_to_remove)
|
|
|
|
|
|
|
|
|
|
def create_agent_instance(
|
|
|
|
|
self,
|
|
|
|
|
workflow_name: str,
|
|
|
|
|
agent_class: Type,
|
|
|
|
|
model_section: Optional[str] = None,
|
|
|
|
|
**kwargs
|
|
|
|
|
) -> Any:
|
|
|
|
|
"""
|
|
|
|
|
创建并注册新的 Agent 实例
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
workflow_name: 工作流名称
|
|
|
|
|
agent_class: Agent 类
|
|
|
|
|
model_section: 模型配置段
|
|
|
|
|
**kwargs: Agent 构造参数
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
Agent 实例
|
|
|
|
|
"""
|
|
|
|
|
model = model_section or self._default_model_section
|
|
|
|
|
agent = agent_class(model_section=model, **kwargs)
|
|
|
|
|
self.register_workflow(name=workflow_name, agent=agent)
|
|
|
|
|
return agent
|