mirror of
https://github.com/arc53/DocsGPT.git
synced 2026-02-22 20:32:11 +00:00
* feat: implement WorkflowAgent and GraphExecutor for workflow management and execution * refactor: workflow schemas and introduce WorkflowEngine - Updated schemas in `schemas.py` to include new agent types and configurations. - Created `WorkflowEngine` class in `workflow_engine.py` to manage workflow execution. - Enhanced `StreamProcessor` to handle workflow-related data. - Added new routes and utilities for managing workflows in the user API. - Implemented validation and serialization functions for workflows. - Established MongoDB collections and indexes for workflows and related entities. * refactor: improve WorkflowAgent documentation and update type hints in WorkflowEngine * feat: workflow builder and managing in frontend - Added new endpoints for workflows in `endpoints.ts`. - Implemented `getWorkflow`, `createWorkflow`, and `updateWorkflow` methods in `userService.ts`. - Introduced new UI components for alerts, buttons, commands, dialogs, multi-select, popovers, and selects. - Enhanced styling in `index.css` with new theme variables and animations. - Refactored modal components for better layout and styling. - Configured TypeScript paths and Vite aliases for cleaner imports. * feat: add workflow preview component and related state management - Implemented WorkflowPreview component for displaying workflow execution. - Created WorkflowPreviewSlice for managing workflow preview state, including queries and execution steps. - Added WorkflowMiniMap for visual representation of workflow nodes and their statuses. - Integrated conversation handling with the ability to fetch answers and manage query states. - Introduced reusable Sheet component for UI overlays. - Updated Redux store to include workflowPreview reducer. * feat: enhance workflow execution details and state management in WorkflowEngine and WorkflowPreview * feat: enhance workflow components with improved UI and functionality - Updated WorkflowPreview to allow text truncation for better display of long names. - Enhanced BaseNode with connectable handles and improved styling for better visibility. - Added MobileBlocker component to inform users about desktop requirements for the Workflow Builder. - Introduced PromptTextArea component for improved variable insertion and search functionality, including upstream variable extraction and context addition. * feat(workflow): add owner validation and graph version support * fix: ruff lint --------- Co-authored-by: Alex <a@tushynski.me>
110 lines
3.0 KiB
Python
110 lines
3.0 KiB
Python
"""Workflow Node Agents - defines specialized agents for workflow nodes."""
|
|
|
|
from typing import Any, Dict, List, Optional, Type
|
|
|
|
from application.agents.base import BaseAgent
|
|
from application.agents.classic_agent import ClassicAgent
|
|
from application.agents.react_agent import ReActAgent
|
|
from application.agents.workflows.schemas import AgentType
|
|
|
|
|
|
class ToolFilterMixin:
|
|
"""Mixin that filters fetched tools to only those specified in tool_ids."""
|
|
|
|
_allowed_tool_ids: List[str]
|
|
|
|
def _get_user_tools(self, user: str = "local") -> Dict[str, Dict[str, Any]]:
|
|
all_tools = super()._get_user_tools(user)
|
|
if not self._allowed_tool_ids:
|
|
return {}
|
|
filtered_tools = {
|
|
tool_id: tool
|
|
for tool_id, tool in all_tools.items()
|
|
if str(tool.get("_id", "")) in self._allowed_tool_ids
|
|
}
|
|
return filtered_tools
|
|
|
|
def _get_tools(self, api_key: str = None) -> Dict[str, Dict[str, Any]]:
|
|
all_tools = super()._get_tools(api_key)
|
|
if not self._allowed_tool_ids:
|
|
return {}
|
|
filtered_tools = {
|
|
tool_id: tool
|
|
for tool_id, tool in all_tools.items()
|
|
if str(tool.get("_id", "")) in self._allowed_tool_ids
|
|
}
|
|
return filtered_tools
|
|
|
|
|
|
class WorkflowNodeClassicAgent(ToolFilterMixin, ClassicAgent):
|
|
|
|
def __init__(
|
|
self,
|
|
endpoint: str,
|
|
llm_name: str,
|
|
model_id: str,
|
|
api_key: str,
|
|
tool_ids: Optional[List[str]] = None,
|
|
**kwargs,
|
|
):
|
|
super().__init__(
|
|
endpoint=endpoint,
|
|
llm_name=llm_name,
|
|
model_id=model_id,
|
|
api_key=api_key,
|
|
**kwargs,
|
|
)
|
|
self._allowed_tool_ids = tool_ids or []
|
|
|
|
|
|
class WorkflowNodeReActAgent(ToolFilterMixin, ReActAgent):
|
|
|
|
def __init__(
|
|
self,
|
|
endpoint: str,
|
|
llm_name: str,
|
|
model_id: str,
|
|
api_key: str,
|
|
tool_ids: Optional[List[str]] = None,
|
|
**kwargs,
|
|
):
|
|
super().__init__(
|
|
endpoint=endpoint,
|
|
llm_name=llm_name,
|
|
model_id=model_id,
|
|
api_key=api_key,
|
|
**kwargs,
|
|
)
|
|
self._allowed_tool_ids = tool_ids or []
|
|
|
|
|
|
class WorkflowNodeAgentFactory:
|
|
|
|
_agents: Dict[AgentType, Type[BaseAgent]] = {
|
|
AgentType.CLASSIC: WorkflowNodeClassicAgent,
|
|
AgentType.REACT: WorkflowNodeReActAgent,
|
|
}
|
|
|
|
@classmethod
|
|
def create(
|
|
cls,
|
|
agent_type: AgentType,
|
|
endpoint: str,
|
|
llm_name: str,
|
|
model_id: str,
|
|
api_key: str,
|
|
tool_ids: Optional[List[str]] = None,
|
|
**kwargs,
|
|
) -> BaseAgent:
|
|
agent_class = cls._agents.get(agent_type)
|
|
if not agent_class:
|
|
raise ValueError(f"Unsupported agent type: {agent_type}")
|
|
return agent_class(
|
|
endpoint=endpoint,
|
|
llm_name=llm_name,
|
|
model_id=model_id,
|
|
api_key=api_key,
|
|
tool_ids=tool_ids,
|
|
**kwargs,
|
|
)
|