mirror of
https://github.com/tiennm99/DocsGPT.git
synced 2026-10-04 14:12:58 +00:00
The agent and workflow reads now return resource_states to people who may edit them: every attached tool, source and prompt (and workflow node tool and source) with active or stopped and the reason: deleted, owner_lost_access, the sponsor reasons, connection_needs_reconnect, connection_removed or connector_disabled. Each entry names the sponsor, someone other than the reader who can fix it, the service for a connection reason, and whether the reader may take it over or reconnect it. When something can be taken over, sponsor_audience says who it would reach. The state comes from the checks the run itself uses (ref_access, resolve_holder_tool and the tool's connection as the run resolves it), so the page and the run can't disagree. A run that leaves a resource out logs resource_stopped with the holder, type, id and reason. The workflow read gives sponsor details, run state and node resource names only to people who may edit it, and names only resources the workflow runs, someone sponsored, or the reader can see. Owner saves and new workflows now refuse node tools and sources the owner can't use, like editor saves.
91 lines
2.9 KiB
Python
91 lines
2.9 KiB
Python
"""Workflow Node Agents - defines specialized agents for workflow nodes."""
|
|
|
|
from typing import Dict, List, Optional, Type
|
|
|
|
from docsgpt.agents.agentic_agent import AgenticAgent
|
|
from docsgpt.agents.base import BaseAgent
|
|
from docsgpt.agents.classic_agent import ClassicAgent
|
|
from docsgpt.agents.research_agent import ResearchAgent
|
|
from docsgpt.agents.workflows.schemas import AgentType
|
|
|
|
|
|
class _WorkflowNodeMixin:
|
|
"""Common __init__ for all workflow node agents."""
|
|
|
|
def __init__(
|
|
self,
|
|
endpoint: str,
|
|
llm_name: str,
|
|
model_id: str,
|
|
api_key: str,
|
|
tool_ids: Optional[List[str]] = None,
|
|
tool_principals: Optional[Dict[str, str]] = None,
|
|
tool_owner: Optional[str] = None,
|
|
tool_holder: Optional[dict] = None,
|
|
**kwargs,
|
|
):
|
|
super().__init__(
|
|
endpoint=endpoint,
|
|
llm_name=llm_name,
|
|
model_id=model_id,
|
|
api_key=api_key,
|
|
**kwargs,
|
|
)
|
|
# Scope the executor to exactly the node's configured tools. Agents
|
|
# fetch their toolset via ``tool_executor.get_tools()``, so the scope
|
|
# must live on the executor — it resolves builtin synthetic ids
|
|
# (Artifact / Code Executor / Read Document) and ``user_tools`` rows
|
|
# alike, and an empty list means the node's LLM gets no tools.
|
|
self.tool_executor.allowed_tool_ids = [str(t) for t in (tool_ids or [])]
|
|
# The node's tools are the workflow owner's whoever runs it; tools the
|
|
# owner can't use resolve as the editor who attached them.
|
|
self.tool_executor.tool_owner = tool_owner
|
|
self.tool_executor.tool_principals = dict(tool_principals or {})
|
|
# The workflow row, so a dropped tool is logged with why.
|
|
self.tool_executor.tool_holder = tool_holder
|
|
|
|
|
|
class WorkflowNodeClassicAgent(_WorkflowNodeMixin, ClassicAgent):
|
|
pass
|
|
|
|
|
|
class WorkflowNodeAgenticAgent(_WorkflowNodeMixin, AgenticAgent):
|
|
pass
|
|
|
|
|
|
class WorkflowNodeResearchAgent(_WorkflowNodeMixin, ResearchAgent):
|
|
pass
|
|
|
|
|
|
class WorkflowNodeAgentFactory:
|
|
|
|
_agents: Dict[AgentType, Type[BaseAgent]] = {
|
|
AgentType.CLASSIC: WorkflowNodeClassicAgent,
|
|
AgentType.REACT: WorkflowNodeClassicAgent, # backwards compat
|
|
AgentType.AGENTIC: WorkflowNodeAgenticAgent,
|
|
AgentType.RESEARCH: WorkflowNodeResearchAgent,
|
|
}
|
|
|
|
@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,
|
|
)
|