agentpool 2.1.9__py3-none-any.whl → 2.5.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- acp/__init__.py +13 -4
- acp/acp_requests.py +20 -77
- acp/agent/connection.py +8 -0
- acp/agent/implementations/debug_server/debug_server.py +6 -2
- acp/agent/protocol.py +6 -0
- acp/bridge/README.md +15 -2
- acp/bridge/__init__.py +3 -2
- acp/bridge/__main__.py +60 -19
- acp/bridge/ws_server.py +173 -0
- acp/bridge/ws_server_cli.py +89 -0
- acp/client/connection.py +38 -29
- acp/client/implementations/default_client.py +3 -2
- acp/client/implementations/headless_client.py +2 -2
- acp/connection.py +2 -2
- acp/notifications.py +20 -50
- acp/schema/__init__.py +2 -0
- acp/schema/agent_responses.py +21 -0
- acp/schema/client_requests.py +3 -3
- acp/schema/session_state.py +63 -29
- acp/stdio.py +39 -9
- acp/task/supervisor.py +2 -2
- acp/transports.py +362 -2
- acp/utils.py +17 -4
- agentpool/__init__.py +6 -1
- agentpool/agents/__init__.py +2 -0
- agentpool/agents/acp_agent/acp_agent.py +407 -277
- agentpool/agents/acp_agent/acp_converters.py +196 -38
- agentpool/agents/acp_agent/client_handler.py +191 -26
- agentpool/agents/acp_agent/session_state.py +17 -6
- agentpool/agents/agent.py +607 -572
- agentpool/agents/agui_agent/__init__.py +0 -2
- agentpool/agents/agui_agent/agui_agent.py +176 -110
- agentpool/agents/agui_agent/agui_converters.py +0 -131
- agentpool/agents/agui_agent/helpers.py +3 -4
- agentpool/agents/base_agent.py +632 -17
- agentpool/agents/claude_code_agent/FORKING.md +191 -0
- agentpool/agents/claude_code_agent/__init__.py +13 -1
- agentpool/agents/claude_code_agent/claude_code_agent.py +1058 -291
- agentpool/agents/claude_code_agent/converters.py +74 -143
- agentpool/agents/claude_code_agent/history.py +474 -0
- agentpool/agents/claude_code_agent/models.py +77 -0
- agentpool/agents/claude_code_agent/static_info.py +100 -0
- agentpool/agents/claude_code_agent/usage.py +242 -0
- agentpool/agents/context.py +40 -0
- agentpool/agents/events/__init__.py +24 -0
- agentpool/agents/events/builtin_handlers.py +67 -1
- agentpool/agents/events/event_emitter.py +32 -2
- agentpool/agents/events/events.py +104 -3
- agentpool/agents/events/infer_info.py +145 -0
- agentpool/agents/events/processors.py +254 -0
- agentpool/agents/interactions.py +41 -6
- agentpool/agents/modes.py +67 -0
- agentpool/agents/slashed_agent.py +5 -4
- agentpool/agents/tool_call_accumulator.py +213 -0
- agentpool/agents/tool_wrapping.py +18 -6
- agentpool/common_types.py +56 -21
- agentpool/config_resources/__init__.py +38 -1
- agentpool/config_resources/acp_assistant.yml +2 -2
- agentpool/config_resources/agents.yml +3 -0
- agentpool/config_resources/agents_template.yml +1 -0
- agentpool/config_resources/claude_code_agent.yml +10 -6
- agentpool/config_resources/external_acp_agents.yml +2 -1
- agentpool/delegation/base_team.py +4 -30
- agentpool/delegation/pool.py +136 -289
- agentpool/delegation/team.py +58 -57
- agentpool/delegation/teamrun.py +51 -55
- agentpool/diagnostics/__init__.py +53 -0
- agentpool/diagnostics/lsp_manager.py +1593 -0
- agentpool/diagnostics/lsp_proxy.py +41 -0
- agentpool/diagnostics/lsp_proxy_script.py +229 -0
- agentpool/diagnostics/models.py +398 -0
- agentpool/functional/run.py +10 -4
- agentpool/mcp_server/__init__.py +0 -2
- agentpool/mcp_server/client.py +76 -32
- agentpool/mcp_server/conversions.py +54 -13
- agentpool/mcp_server/manager.py +34 -54
- agentpool/mcp_server/registries/official_registry_client.py +35 -1
- agentpool/mcp_server/tool_bridge.py +186 -139
- agentpool/messaging/__init__.py +0 -2
- agentpool/messaging/compaction.py +72 -197
- agentpool/messaging/connection_manager.py +11 -10
- agentpool/messaging/event_manager.py +5 -5
- agentpool/messaging/message_container.py +6 -30
- agentpool/messaging/message_history.py +99 -8
- agentpool/messaging/messagenode.py +52 -14
- agentpool/messaging/messages.py +54 -35
- agentpool/messaging/processing.py +12 -22
- agentpool/models/__init__.py +1 -1
- agentpool/models/acp_agents/base.py +6 -24
- agentpool/models/acp_agents/mcp_capable.py +126 -157
- agentpool/models/acp_agents/non_mcp.py +129 -95
- agentpool/models/agents.py +98 -76
- agentpool/models/agui_agents.py +1 -1
- agentpool/models/claude_code_agents.py +144 -19
- agentpool/models/file_parsing.py +0 -1
- agentpool/models/manifest.py +113 -50
- agentpool/prompts/conversion_manager.py +1 -1
- agentpool/prompts/prompts.py +5 -2
- agentpool/repomap.py +1 -1
- agentpool/resource_providers/__init__.py +11 -1
- agentpool/resource_providers/aggregating.py +56 -5
- agentpool/resource_providers/base.py +70 -4
- agentpool/resource_providers/codemode/code_executor.py +72 -5
- agentpool/resource_providers/codemode/helpers.py +2 -2
- agentpool/resource_providers/codemode/provider.py +64 -12
- agentpool/resource_providers/codemode/remote_mcp_execution.py +2 -2
- agentpool/resource_providers/codemode/remote_provider.py +9 -12
- agentpool/resource_providers/filtering.py +3 -1
- agentpool/resource_providers/mcp_provider.py +89 -12
- agentpool/resource_providers/plan_provider.py +228 -46
- agentpool/resource_providers/pool.py +7 -3
- agentpool/resource_providers/resource_info.py +111 -0
- agentpool/resource_providers/static.py +4 -2
- agentpool/sessions/__init__.py +4 -1
- agentpool/sessions/manager.py +33 -5
- agentpool/sessions/models.py +59 -6
- agentpool/sessions/protocol.py +28 -0
- agentpool/sessions/session.py +11 -55
- agentpool/skills/registry.py +13 -8
- agentpool/storage/manager.py +572 -49
- agentpool/talk/registry.py +4 -4
- agentpool/talk/talk.py +9 -10
- agentpool/testing.py +538 -20
- agentpool/tool_impls/__init__.py +6 -0
- agentpool/tool_impls/agent_cli/__init__.py +42 -0
- agentpool/tool_impls/agent_cli/tool.py +95 -0
- agentpool/tool_impls/bash/__init__.py +64 -0
- agentpool/tool_impls/bash/helpers.py +35 -0
- agentpool/tool_impls/bash/tool.py +171 -0
- agentpool/tool_impls/delete_path/__init__.py +70 -0
- agentpool/tool_impls/delete_path/tool.py +142 -0
- agentpool/tool_impls/download_file/__init__.py +80 -0
- agentpool/tool_impls/download_file/tool.py +183 -0
- agentpool/tool_impls/execute_code/__init__.py +55 -0
- agentpool/tool_impls/execute_code/tool.py +163 -0
- agentpool/tool_impls/grep/__init__.py +80 -0
- agentpool/tool_impls/grep/tool.py +200 -0
- agentpool/tool_impls/list_directory/__init__.py +73 -0
- agentpool/tool_impls/list_directory/tool.py +197 -0
- agentpool/tool_impls/question/__init__.py +42 -0
- agentpool/tool_impls/question/tool.py +127 -0
- agentpool/tool_impls/read/__init__.py +104 -0
- agentpool/tool_impls/read/tool.py +305 -0
- agentpool/tools/__init__.py +2 -1
- agentpool/tools/base.py +114 -34
- agentpool/tools/manager.py +57 -1
- agentpool/ui/base.py +2 -2
- agentpool/ui/mock_provider.py +2 -2
- agentpool/ui/stdlib_provider.py +2 -2
- agentpool/utils/file_watcher.py +269 -0
- agentpool/utils/identifiers.py +121 -0
- agentpool/utils/pydantic_ai_helpers.py +46 -0
- agentpool/utils/streams.py +616 -2
- agentpool/utils/subprocess_utils.py +155 -0
- agentpool/utils/token_breakdown.py +461 -0
- agentpool/vfs_registry.py +7 -2
- {agentpool-2.1.9.dist-info → agentpool-2.5.0.dist-info}/METADATA +41 -27
- agentpool-2.5.0.dist-info/RECORD +579 -0
- {agentpool-2.1.9.dist-info → agentpool-2.5.0.dist-info}/WHEEL +1 -1
- agentpool_cli/__main__.py +24 -0
- agentpool_cli/create.py +1 -1
- agentpool_cli/serve_acp.py +100 -21
- agentpool_cli/serve_agui.py +87 -0
- agentpool_cli/serve_opencode.py +119 -0
- agentpool_cli/ui.py +557 -0
- agentpool_commands/__init__.py +42 -5
- agentpool_commands/agents.py +75 -2
- agentpool_commands/history.py +62 -0
- agentpool_commands/mcp.py +176 -0
- agentpool_commands/models.py +56 -3
- agentpool_commands/pool.py +260 -0
- agentpool_commands/session.py +1 -1
- agentpool_commands/text_sharing/__init__.py +119 -0
- agentpool_commands/text_sharing/base.py +123 -0
- agentpool_commands/text_sharing/github_gist.py +80 -0
- agentpool_commands/text_sharing/opencode.py +462 -0
- agentpool_commands/text_sharing/paste_rs.py +59 -0
- agentpool_commands/text_sharing/pastebin.py +116 -0
- agentpool_commands/text_sharing/shittycodingagent.py +112 -0
- agentpool_commands/tools.py +57 -0
- agentpool_commands/utils.py +80 -30
- agentpool_config/__init__.py +30 -2
- agentpool_config/agentpool_tools.py +498 -0
- agentpool_config/builtin_tools.py +77 -22
- agentpool_config/commands.py +24 -1
- agentpool_config/compaction.py +258 -0
- agentpool_config/converters.py +1 -1
- agentpool_config/event_handlers.py +42 -0
- agentpool_config/events.py +1 -1
- agentpool_config/forward_targets.py +1 -4
- agentpool_config/jinja.py +3 -3
- agentpool_config/mcp_server.py +132 -6
- agentpool_config/nodes.py +1 -1
- agentpool_config/observability.py +44 -0
- agentpool_config/session.py +0 -3
- agentpool_config/storage.py +82 -38
- agentpool_config/task.py +3 -3
- agentpool_config/tools.py +11 -22
- agentpool_config/toolsets.py +109 -233
- agentpool_server/a2a_server/agent_worker.py +307 -0
- agentpool_server/a2a_server/server.py +23 -18
- agentpool_server/acp_server/acp_agent.py +234 -181
- agentpool_server/acp_server/commands/acp_commands.py +151 -156
- agentpool_server/acp_server/commands/docs_commands/fetch_repo.py +18 -17
- agentpool_server/acp_server/event_converter.py +651 -0
- agentpool_server/acp_server/input_provider.py +53 -10
- agentpool_server/acp_server/server.py +24 -90
- agentpool_server/acp_server/session.py +173 -331
- agentpool_server/acp_server/session_manager.py +8 -34
- agentpool_server/agui_server/server.py +3 -1
- agentpool_server/mcp_server/server.py +5 -2
- agentpool_server/opencode_server/.rules +95 -0
- agentpool_server/opencode_server/ENDPOINTS.md +401 -0
- agentpool_server/opencode_server/OPENCODE_UI_TOOLS_COMPLETE.md +202 -0
- agentpool_server/opencode_server/__init__.py +19 -0
- agentpool_server/opencode_server/command_validation.py +172 -0
- agentpool_server/opencode_server/converters.py +975 -0
- agentpool_server/opencode_server/dependencies.py +24 -0
- agentpool_server/opencode_server/input_provider.py +421 -0
- agentpool_server/opencode_server/models/__init__.py +250 -0
- agentpool_server/opencode_server/models/agent.py +53 -0
- agentpool_server/opencode_server/models/app.py +72 -0
- agentpool_server/opencode_server/models/base.py +26 -0
- agentpool_server/opencode_server/models/common.py +23 -0
- agentpool_server/opencode_server/models/config.py +37 -0
- agentpool_server/opencode_server/models/events.py +821 -0
- agentpool_server/opencode_server/models/file.py +88 -0
- agentpool_server/opencode_server/models/mcp.py +44 -0
- agentpool_server/opencode_server/models/message.py +179 -0
- agentpool_server/opencode_server/models/parts.py +323 -0
- agentpool_server/opencode_server/models/provider.py +81 -0
- agentpool_server/opencode_server/models/pty.py +43 -0
- agentpool_server/opencode_server/models/question.py +56 -0
- agentpool_server/opencode_server/models/session.py +111 -0
- agentpool_server/opencode_server/routes/__init__.py +29 -0
- agentpool_server/opencode_server/routes/agent_routes.py +473 -0
- agentpool_server/opencode_server/routes/app_routes.py +202 -0
- agentpool_server/opencode_server/routes/config_routes.py +302 -0
- agentpool_server/opencode_server/routes/file_routes.py +571 -0
- agentpool_server/opencode_server/routes/global_routes.py +94 -0
- agentpool_server/opencode_server/routes/lsp_routes.py +319 -0
- agentpool_server/opencode_server/routes/message_routes.py +761 -0
- agentpool_server/opencode_server/routes/permission_routes.py +63 -0
- agentpool_server/opencode_server/routes/pty_routes.py +300 -0
- agentpool_server/opencode_server/routes/question_routes.py +128 -0
- agentpool_server/opencode_server/routes/session_routes.py +1276 -0
- agentpool_server/opencode_server/routes/tui_routes.py +139 -0
- agentpool_server/opencode_server/server.py +475 -0
- agentpool_server/opencode_server/state.py +151 -0
- agentpool_server/opencode_server/time_utils.py +8 -0
- agentpool_storage/__init__.py +12 -0
- agentpool_storage/base.py +184 -2
- agentpool_storage/claude_provider/ARCHITECTURE.md +433 -0
- agentpool_storage/claude_provider/__init__.py +42 -0
- agentpool_storage/claude_provider/provider.py +1089 -0
- agentpool_storage/file_provider.py +278 -15
- agentpool_storage/memory_provider.py +193 -12
- agentpool_storage/models.py +3 -0
- agentpool_storage/opencode_provider/ARCHITECTURE.md +386 -0
- agentpool_storage/opencode_provider/__init__.py +16 -0
- agentpool_storage/opencode_provider/helpers.py +414 -0
- agentpool_storage/opencode_provider/provider.py +895 -0
- agentpool_storage/project_store.py +325 -0
- agentpool_storage/session_store.py +26 -6
- agentpool_storage/sql_provider/__init__.py +4 -2
- agentpool_storage/sql_provider/models.py +48 -0
- agentpool_storage/sql_provider/sql_provider.py +269 -3
- agentpool_storage/sql_provider/utils.py +12 -13
- agentpool_storage/zed_provider/__init__.py +16 -0
- agentpool_storage/zed_provider/helpers.py +281 -0
- agentpool_storage/zed_provider/models.py +130 -0
- agentpool_storage/zed_provider/provider.py +442 -0
- agentpool_storage/zed_provider.py +803 -0
- agentpool_toolsets/__init__.py +0 -2
- agentpool_toolsets/builtin/__init__.py +2 -12
- agentpool_toolsets/builtin/code.py +96 -57
- agentpool_toolsets/builtin/debug.py +118 -48
- agentpool_toolsets/builtin/execution_environment.py +115 -230
- agentpool_toolsets/builtin/file_edit/file_edit.py +115 -7
- agentpool_toolsets/builtin/skills.py +9 -4
- agentpool_toolsets/builtin/subagent_tools.py +64 -51
- agentpool_toolsets/builtin/workers.py +4 -2
- agentpool_toolsets/composio_toolset.py +2 -2
- agentpool_toolsets/entry_points.py +3 -1
- agentpool_toolsets/fsspec_toolset/__init__.py +13 -1
- agentpool_toolsets/fsspec_toolset/diagnostics.py +860 -73
- agentpool_toolsets/fsspec_toolset/grep.py +99 -7
- agentpool_toolsets/fsspec_toolset/helpers.py +3 -2
- agentpool_toolsets/fsspec_toolset/image_utils.py +161 -0
- agentpool_toolsets/fsspec_toolset/toolset.py +500 -95
- agentpool_toolsets/mcp_discovery/__init__.py +5 -0
- agentpool_toolsets/mcp_discovery/data/mcp_servers.parquet +0 -0
- agentpool_toolsets/mcp_discovery/toolset.py +511 -0
- agentpool_toolsets/mcp_run_toolset.py +87 -12
- agentpool_toolsets/notifications.py +33 -33
- agentpool_toolsets/openapi.py +3 -1
- agentpool_toolsets/search_toolset.py +3 -1
- agentpool-2.1.9.dist-info/RECORD +0 -474
- agentpool_config/resources.py +0 -33
- agentpool_server/acp_server/acp_tools.py +0 -43
- agentpool_server/acp_server/commands/spawn.py +0 -210
- agentpool_storage/text_log_provider.py +0 -275
- agentpool_toolsets/builtin/agent_management.py +0 -239
- agentpool_toolsets/builtin/chain.py +0 -288
- agentpool_toolsets/builtin/history.py +0 -36
- agentpool_toolsets/builtin/integration.py +0 -85
- agentpool_toolsets/builtin/tool_management.py +0 -90
- agentpool_toolsets/builtin/user_interaction.py +0 -52
- agentpool_toolsets/semantic_memory_toolset.py +0 -536
- {agentpool-2.1.9.dist-info → agentpool-2.5.0.dist-info}/entry_points.txt +0 -0
- {agentpool-2.1.9.dist-info → agentpool-2.5.0.dist-info}/licenses/LICENSE +0 -0
agentpool/delegation/pool.py
CHANGED
|
@@ -7,11 +7,10 @@ from asyncio import Lock
|
|
|
7
7
|
from contextlib import AsyncExitStack, asynccontextmanager, suppress
|
|
8
8
|
import os
|
|
9
9
|
from pathlib import Path
|
|
10
|
-
from typing import TYPE_CHECKING, Any,
|
|
10
|
+
from typing import TYPE_CHECKING, Any, Self, Unpack, overload
|
|
11
11
|
|
|
12
12
|
from anyenv import ProcessManager
|
|
13
13
|
import anyio
|
|
14
|
-
from llmling_models.configs.model_configs import BaseModelConfig
|
|
15
14
|
from upathtools import UPath
|
|
16
15
|
|
|
17
16
|
from agentpool.agents import Agent
|
|
@@ -40,7 +39,6 @@ if TYPE_CHECKING:
|
|
|
40
39
|
from pydantic_ai import ModelSettings
|
|
41
40
|
from pydantic_ai.models import Model
|
|
42
41
|
from pydantic_ai.output import OutputSpec
|
|
43
|
-
from tokonomics.model_names import ModelId
|
|
44
42
|
from upathtools import JoinablePathLike
|
|
45
43
|
|
|
46
44
|
from agentpool.agents.acp_agent import ACPAgent
|
|
@@ -52,20 +50,14 @@ if TYPE_CHECKING:
|
|
|
52
50
|
AgentName,
|
|
53
51
|
BuiltinEventHandlerType,
|
|
54
52
|
IndividualEventHandler,
|
|
55
|
-
SessionIdType,
|
|
56
|
-
SupportsStructuredOutput,
|
|
57
53
|
)
|
|
58
54
|
from agentpool.delegation.base_team import BaseTeam
|
|
59
55
|
from agentpool.mcp_server.tool_bridge import ToolManagerBridge
|
|
60
|
-
from agentpool.
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
BaseACPAgentConfig,
|
|
64
|
-
ClaudeCodeAgentConfig,
|
|
65
|
-
)
|
|
56
|
+
from agentpool.messaging import ChatMessage
|
|
57
|
+
from agentpool.messaging.compaction import CompactionPipeline
|
|
58
|
+
from agentpool.models import AnyAgentConfig
|
|
66
59
|
from agentpool.models.manifest import AgentsManifest
|
|
67
60
|
from agentpool.ui.base import InputProvider
|
|
68
|
-
from agentpool_config.session import SessionQuery
|
|
69
61
|
from agentpool_config.task import Job
|
|
70
62
|
|
|
71
63
|
|
|
@@ -111,13 +103,16 @@ class AgentPool[TPoolDeps = None](BaseRegistry[NodeName, MessageNode[Any, Any]])
|
|
|
111
103
|
ValueError: If manifest contains invalid node configurations
|
|
112
104
|
RuntimeError: If node initialization fails
|
|
113
105
|
"""
|
|
114
|
-
super().__init__()
|
|
115
106
|
from agentpool.mcp_server.manager import MCPManager
|
|
116
107
|
from agentpool.models.manifest import AgentsManifest
|
|
117
108
|
from agentpool.observability import registry
|
|
118
109
|
from agentpool.sessions import SessionManager
|
|
119
110
|
from agentpool.skills.manager import SkillsManager
|
|
120
111
|
from agentpool.storage import StorageManager
|
|
112
|
+
from agentpool.utils.streams import FileOpsTracker, TodoTracker
|
|
113
|
+
from agentpool_toolsets.builtin.debug import install_memory_handler
|
|
114
|
+
|
|
115
|
+
super().__init__()
|
|
121
116
|
|
|
122
117
|
match manifest:
|
|
123
118
|
case None:
|
|
@@ -131,6 +126,7 @@ class AgentPool[TPoolDeps = None](BaseRegistry[NodeName, MessageNode[Any, Any]])
|
|
|
131
126
|
raise ValueError(msg)
|
|
132
127
|
|
|
133
128
|
registry.configure_observability(self.manifest.observability)
|
|
129
|
+
self._memory_log_handler = install_memory_handler()
|
|
134
130
|
self.shared_deps_type = shared_deps_type
|
|
135
131
|
self._input_provider = input_provider
|
|
136
132
|
self.exit_stack = AsyncExitStack()
|
|
@@ -149,22 +145,19 @@ class AgentPool[TPoolDeps = None](BaseRegistry[NodeName, MessageNode[Any, Any]])
|
|
|
149
145
|
for name, task in self.manifest.jobs.items():
|
|
150
146
|
self._tasks.register(name, task)
|
|
151
147
|
self.process_manager = ProcessManager()
|
|
152
|
-
self.
|
|
153
|
-
|
|
148
|
+
self.file_ops = FileOpsTracker()
|
|
149
|
+
# Todo/plan tracker for task management
|
|
150
|
+
self.todos = TodoTracker()
|
|
154
151
|
# Create all agents from unified manifest.agents dict
|
|
155
152
|
for name, config in self.manifest.agents.items():
|
|
156
|
-
agent = self._create_agent_from_config(
|
|
157
|
-
name,
|
|
158
|
-
config,
|
|
159
|
-
deps_type=shared_deps_type,
|
|
160
|
-
)
|
|
153
|
+
agent = self._create_agent_from_config(name, config, deps_type=shared_deps_type)
|
|
161
154
|
agent.agent_pool = self
|
|
162
155
|
self.register(name, agent)
|
|
163
156
|
|
|
164
157
|
self._create_teams()
|
|
165
158
|
if connect_nodes:
|
|
166
159
|
self._connect_nodes()
|
|
167
|
-
|
|
160
|
+
self.pool_talk = TeamTalk[Any].from_nodes(list(self.nodes.values()))
|
|
168
161
|
self._enter_lock = Lock() # Initialize async safety fields
|
|
169
162
|
self._running_count = 0
|
|
170
163
|
|
|
@@ -179,32 +172,23 @@ class AgentPool[TPoolDeps = None](BaseRegistry[NodeName, MessageNode[Any, Any]])
|
|
|
179
172
|
await self.exit_stack.enter_async_context(self.mcp)
|
|
180
173
|
await self.exit_stack.enter_async_context(self.skills)
|
|
181
174
|
aggregating_provider = self.mcp.get_aggregating_provider()
|
|
182
|
-
agents = list(self.
|
|
183
|
-
acp_agents = list(self.acp_agents.values())
|
|
184
|
-
agui_agents = list(self.agui_agents.values())
|
|
185
|
-
claude_code_agents = list(self.claude_code_agents.values())
|
|
175
|
+
agents = list(self.all_agents.values())
|
|
186
176
|
teams = list(self.teams.values())
|
|
187
177
|
for agent in agents:
|
|
188
178
|
agent.tools.add_provider(aggregating_provider)
|
|
189
179
|
# Collect remaining components to initialize (MCP already initialized)
|
|
190
|
-
|
|
180
|
+
comps: list[AbstractAsyncContextManager[Any]] = [
|
|
191
181
|
self.storage,
|
|
192
182
|
self.sessions,
|
|
193
183
|
*agents,
|
|
194
|
-
*acp_agents,
|
|
195
|
-
*agui_agents,
|
|
196
|
-
*claude_code_agents,
|
|
197
184
|
*teams,
|
|
198
185
|
]
|
|
199
|
-
|
|
200
|
-
# Initialize all components
|
|
186
|
+
node_inits = [self.exit_stack.enter_async_context(c) for c in comps]
|
|
201
187
|
if self.parallel_load:
|
|
202
|
-
await asyncio.gather(
|
|
203
|
-
*(self.exit_stack.enter_async_context(c) for c in components)
|
|
204
|
-
)
|
|
188
|
+
await asyncio.gather(*node_inits)
|
|
205
189
|
else:
|
|
206
|
-
for
|
|
207
|
-
await
|
|
190
|
+
for init in node_inits:
|
|
191
|
+
await init
|
|
208
192
|
|
|
209
193
|
except Exception as e:
|
|
210
194
|
await self.cleanup()
|
|
@@ -240,7 +224,6 @@ class AgentPool[TPoolDeps = None](BaseRegistry[NodeName, MessageNode[Any, Any]])
|
|
|
240
224
|
name: str = "pool_tools",
|
|
241
225
|
host: str = "127.0.0.1",
|
|
242
226
|
port: int = 0,
|
|
243
|
-
transport: Literal["sse", "streamable-http"] = "sse",
|
|
244
227
|
) -> ToolManagerBridge:
|
|
245
228
|
"""Create and start a tool bridge for exposing tools to external agents.
|
|
246
229
|
|
|
@@ -253,7 +236,6 @@ class AgentPool[TPoolDeps = None](BaseRegistry[NodeName, MessageNode[Any, Any]])
|
|
|
253
236
|
name: Unique name for this bridge
|
|
254
237
|
host: Host to bind the HTTP server to
|
|
255
238
|
port: Port to bind to (0 = auto-select)
|
|
256
|
-
transport: Transport protocol ('sse' or 'streamable-http')
|
|
257
239
|
|
|
258
240
|
Returns:
|
|
259
241
|
Started ToolManagerBridge instance
|
|
@@ -281,7 +263,6 @@ class AgentPool[TPoolDeps = None](BaseRegistry[NodeName, MessageNode[Any, Any]])
|
|
|
281
263
|
config = BridgeConfig(
|
|
282
264
|
host=host,
|
|
283
265
|
port=port,
|
|
284
|
-
transport=transport,
|
|
285
266
|
server_name=f"agentpool-{name}",
|
|
286
267
|
)
|
|
287
268
|
bridge = ToolManagerBridge(node=node, config=config)
|
|
@@ -327,9 +308,6 @@ class AgentPool[TPoolDeps = None](BaseRegistry[NodeName, MessageNode[Any, Any]])
|
|
|
327
308
|
name: str | None = None,
|
|
328
309
|
description: str | None = None,
|
|
329
310
|
shared_prompt: str | None = None,
|
|
330
|
-
picker: SupportsStructuredOutput | None = None,
|
|
331
|
-
num_picks: int | None = None,
|
|
332
|
-
pick_prompt: str | None = None,
|
|
333
311
|
) -> TeamRun[TPoolDeps, TResult]: ...
|
|
334
312
|
|
|
335
313
|
@overload
|
|
@@ -341,9 +319,6 @@ class AgentPool[TPoolDeps = None](BaseRegistry[NodeName, MessageNode[Any, Any]])
|
|
|
341
319
|
name: str | None = None,
|
|
342
320
|
description: str | None = None,
|
|
343
321
|
shared_prompt: str | None = None,
|
|
344
|
-
picker: SupportsStructuredOutput | None = None,
|
|
345
|
-
num_picks: int | None = None,
|
|
346
|
-
pick_prompt: str | None = None,
|
|
347
322
|
) -> TeamRun[TDeps, TResult]: ...
|
|
348
323
|
|
|
349
324
|
@overload
|
|
@@ -355,9 +330,6 @@ class AgentPool[TPoolDeps = None](BaseRegistry[NodeName, MessageNode[Any, Any]])
|
|
|
355
330
|
name: str | None = None,
|
|
356
331
|
description: str | None = None,
|
|
357
332
|
shared_prompt: str | None = None,
|
|
358
|
-
picker: SupportsStructuredOutput | None = None,
|
|
359
|
-
num_picks: int | None = None,
|
|
360
|
-
pick_prompt: str | None = None,
|
|
361
333
|
) -> TeamRun[Any, TResult]: ...
|
|
362
334
|
|
|
363
335
|
def create_team_run[TResult](
|
|
@@ -368,9 +340,6 @@ class AgentPool[TPoolDeps = None](BaseRegistry[NodeName, MessageNode[Any, Any]])
|
|
|
368
340
|
name: str | None = None,
|
|
369
341
|
description: str | None = None,
|
|
370
342
|
shared_prompt: str | None = None,
|
|
371
|
-
picker: SupportsStructuredOutput | None = None,
|
|
372
|
-
num_picks: int | None = None,
|
|
373
|
-
pick_prompt: str | None = None,
|
|
374
343
|
) -> TeamRun[Any, TResult]:
|
|
375
344
|
"""Create a a sequential TeamRun from a list of Agents.
|
|
376
345
|
|
|
@@ -380,9 +349,6 @@ class AgentPool[TPoolDeps = None](BaseRegistry[NodeName, MessageNode[Any, Any]])
|
|
|
380
349
|
name: Optional name for the team
|
|
381
350
|
description: Optional description for the team
|
|
382
351
|
shared_prompt: Optional prompt for all agents
|
|
383
|
-
picker: Agent to use for picking agents
|
|
384
|
-
num_picks: Number of agents to pick
|
|
385
|
-
pick_prompt: Prompt to use for picking agents
|
|
386
352
|
"""
|
|
387
353
|
from agentpool.delegation.teamrun import TeamRun
|
|
388
354
|
|
|
@@ -394,9 +360,6 @@ class AgentPool[TPoolDeps = None](BaseRegistry[NodeName, MessageNode[Any, Any]])
|
|
|
394
360
|
description=description,
|
|
395
361
|
validator=validator,
|
|
396
362
|
shared_prompt=shared_prompt,
|
|
397
|
-
picker=picker,
|
|
398
|
-
num_picks=num_picks,
|
|
399
|
-
pick_prompt=pick_prompt,
|
|
400
363
|
)
|
|
401
364
|
if name:
|
|
402
365
|
self[name] = team
|
|
@@ -413,9 +376,6 @@ class AgentPool[TPoolDeps = None](BaseRegistry[NodeName, MessageNode[Any, Any]])
|
|
|
413
376
|
name: str | None = None,
|
|
414
377
|
description: str | None = None,
|
|
415
378
|
shared_prompt: str | None = None,
|
|
416
|
-
picker: SupportsStructuredOutput | None = None,
|
|
417
|
-
num_picks: int | None = None,
|
|
418
|
-
pick_prompt: str | None = None,
|
|
419
379
|
) -> Team[TDeps]: ...
|
|
420
380
|
|
|
421
381
|
@overload
|
|
@@ -426,9 +386,6 @@ class AgentPool[TPoolDeps = None](BaseRegistry[NodeName, MessageNode[Any, Any]])
|
|
|
426
386
|
name: str | None = None,
|
|
427
387
|
description: str | None = None,
|
|
428
388
|
shared_prompt: str | None = None,
|
|
429
|
-
picker: SupportsStructuredOutput | None = None,
|
|
430
|
-
num_picks: int | None = None,
|
|
431
|
-
pick_prompt: str | None = None,
|
|
432
389
|
) -> Team[Any]: ...
|
|
433
390
|
|
|
434
391
|
def create_team(
|
|
@@ -438,9 +395,6 @@ class AgentPool[TPoolDeps = None](BaseRegistry[NodeName, MessageNode[Any, Any]])
|
|
|
438
395
|
name: str | None = None,
|
|
439
396
|
description: str | None = None,
|
|
440
397
|
shared_prompt: str | None = None,
|
|
441
|
-
picker: SupportsStructuredOutput | None = None,
|
|
442
|
-
num_picks: int | None = None,
|
|
443
|
-
pick_prompt: str | None = None,
|
|
444
398
|
) -> Team[Any]:
|
|
445
399
|
"""Create a group from agent names or instances.
|
|
446
400
|
|
|
@@ -449,9 +403,6 @@ class AgentPool[TPoolDeps = None](BaseRegistry[NodeName, MessageNode[Any, Any]])
|
|
|
449
403
|
name: Optional name for the team
|
|
450
404
|
description: Optional description for the team
|
|
451
405
|
shared_prompt: Optional prompt for all agents
|
|
452
|
-
picker: Agent to use for picking agents
|
|
453
|
-
num_picks: Number of agents to pick
|
|
454
|
-
pick_prompt: Prompt to use for picking agents
|
|
455
406
|
"""
|
|
456
407
|
from agentpool.delegation.team import Team
|
|
457
408
|
|
|
@@ -463,9 +414,6 @@ class AgentPool[TPoolDeps = None](BaseRegistry[NodeName, MessageNode[Any, Any]])
|
|
|
463
414
|
description=description,
|
|
464
415
|
agents=[self.get_agent(i) if isinstance(i, str) else i for i in agents],
|
|
465
416
|
shared_prompt=shared_prompt,
|
|
466
|
-
picker=picker,
|
|
467
|
-
num_picks=num_picks,
|
|
468
|
-
pick_prompt=pick_prompt,
|
|
469
417
|
)
|
|
470
418
|
if name:
|
|
471
419
|
self[name] = team
|
|
@@ -538,6 +486,15 @@ class AgentPool[TPoolDeps = None](BaseRegistry[NodeName, MessageNode[Any, Any]])
|
|
|
538
486
|
|
|
539
487
|
return {i.name: i for i in self._items.values() if isinstance(i, MessageNode)}
|
|
540
488
|
|
|
489
|
+
@property
|
|
490
|
+
def compaction_pipeline(self) -> CompactionPipeline | None:
|
|
491
|
+
"""Get the configured compaction pipeline for message history management.
|
|
492
|
+
|
|
493
|
+
Returns:
|
|
494
|
+
CompactionPipeline instance or None if not configured
|
|
495
|
+
"""
|
|
496
|
+
return self.manifest.get_compaction_pipeline()
|
|
497
|
+
|
|
541
498
|
def _validate_item(self, item: MessageNode[Any, Any] | Any) -> MessageNode[Any, Any]:
|
|
542
499
|
"""Validate and convert items before registration.
|
|
543
500
|
|
|
@@ -628,19 +585,14 @@ class AgentPool[TPoolDeps = None](BaseRegistry[NodeName, MessageNode[Any, Any]])
|
|
|
628
585
|
stop_condition=target.stop_condition.check if target.stop_condition else None,
|
|
629
586
|
exit_condition=target.exit_condition.check if target.exit_condition else None,
|
|
630
587
|
)
|
|
631
|
-
source.connections.set_wait_state(
|
|
632
|
-
target_node,
|
|
633
|
-
wait=target.wait_for_completion,
|
|
634
|
-
)
|
|
588
|
+
source.connections.set_wait_state(target_node, wait=target.wait_for_completion)
|
|
635
589
|
|
|
636
590
|
@overload
|
|
637
591
|
def get_agent[TResult = str](
|
|
638
592
|
self,
|
|
639
593
|
agent: AgentName | Agent[Any, str],
|
|
640
594
|
*,
|
|
641
|
-
|
|
642
|
-
model_override: ModelId | str | None = None,
|
|
643
|
-
session: SessionIdType | SessionQuery = None,
|
|
595
|
+
output_type: type[TResult] = str, # type: ignore
|
|
644
596
|
) -> Agent[TPoolDeps, TResult]: ...
|
|
645
597
|
|
|
646
598
|
@overload
|
|
@@ -649,9 +601,7 @@ class AgentPool[TPoolDeps = None](BaseRegistry[NodeName, MessageNode[Any, Any]])
|
|
|
649
601
|
agent: AgentName | Agent[Any, str],
|
|
650
602
|
*,
|
|
651
603
|
deps_type: type[TCustomDeps],
|
|
652
|
-
|
|
653
|
-
model_override: ModelId | str | None = None,
|
|
654
|
-
session: SessionIdType | SessionQuery = None,
|
|
604
|
+
output_type: type[TResult] = str, # type: ignore
|
|
655
605
|
) -> Agent[TCustomDeps, TResult]: ...
|
|
656
606
|
|
|
657
607
|
def get_agent(
|
|
@@ -659,9 +609,7 @@ class AgentPool[TPoolDeps = None](BaseRegistry[NodeName, MessageNode[Any, Any]])
|
|
|
659
609
|
agent: AgentName | Agent[Any, str],
|
|
660
610
|
*,
|
|
661
611
|
deps_type: Any | None = None,
|
|
662
|
-
|
|
663
|
-
model_override: ModelId | str | None = None,
|
|
664
|
-
session: SessionIdType | SessionQuery = None,
|
|
612
|
+
output_type: Any = str,
|
|
665
613
|
) -> Agent[Any, Any]:
|
|
666
614
|
"""Get or configure an agent from the pool.
|
|
667
615
|
|
|
@@ -672,9 +620,7 @@ class AgentPool[TPoolDeps = None](BaseRegistry[NodeName, MessageNode[Any, Any]])
|
|
|
672
620
|
Args:
|
|
673
621
|
agent: Either agent name or instance
|
|
674
622
|
deps_type: Optional custom dependencies type (overrides shared deps)
|
|
675
|
-
|
|
676
|
-
model_override: Optional model override
|
|
677
|
-
session: Optional session ID or query to recover conversation
|
|
623
|
+
output_type: Optional type for structured responses
|
|
678
624
|
|
|
679
625
|
Returns:
|
|
680
626
|
Either:
|
|
@@ -684,6 +630,10 @@ class AgentPool[TPoolDeps = None](BaseRegistry[NodeName, MessageNode[Any, Any]])
|
|
|
684
630
|
Raises:
|
|
685
631
|
KeyError: If agent name not found
|
|
686
632
|
ValueError: If configuration is invalid
|
|
633
|
+
|
|
634
|
+
Note:
|
|
635
|
+
To change the model, call `await agent.set_model(model_id)` after
|
|
636
|
+
getting the agent.
|
|
687
637
|
"""
|
|
688
638
|
from agentpool.agents import Agent
|
|
689
639
|
|
|
@@ -692,13 +642,8 @@ class AgentPool[TPoolDeps = None](BaseRegistry[NodeName, MessageNode[Any, Any]])
|
|
|
692
642
|
# base.context.data = deps if deps is not None else self.shared_deps
|
|
693
643
|
base.deps_type = deps_type
|
|
694
644
|
base.agent_pool = self
|
|
695
|
-
if
|
|
696
|
-
base.
|
|
697
|
-
if session:
|
|
698
|
-
base.conversation.load_history_from_database(session=session)
|
|
699
|
-
if return_type not in {str, None}:
|
|
700
|
-
base.to_structured(return_type)
|
|
701
|
-
|
|
645
|
+
if output_type not in {str, None}:
|
|
646
|
+
base.to_structured(output_type)
|
|
702
647
|
return base
|
|
703
648
|
|
|
704
649
|
def get_job(self, name: str) -> Job[Any, Any]:
|
|
@@ -777,6 +722,55 @@ class AgentPool[TPoolDeps = None](BaseRegistry[NodeName, MessageNode[Any, Any]])
|
|
|
777
722
|
|
|
778
723
|
return "\n".join(lines)
|
|
779
724
|
|
|
725
|
+
def get_message_chain(self, message: ChatMessage[Any]) -> list[str]:
|
|
726
|
+
"""Get the chain of agent names that processed a message.
|
|
727
|
+
|
|
728
|
+
Reconstructs the forwarding chain by walking parent_id references
|
|
729
|
+
across all agents' conversations in the pool.
|
|
730
|
+
|
|
731
|
+
Args:
|
|
732
|
+
message: The message to trace back
|
|
733
|
+
|
|
734
|
+
Returns:
|
|
735
|
+
List of agent names in order from origin to current message's agent.
|
|
736
|
+
Empty list if message has no parent or parent not found.
|
|
737
|
+
"""
|
|
738
|
+
# Build index of all messages by ID across all agents
|
|
739
|
+
message_index: dict[str, tuple[ChatMessage[Any], str]] = {}
|
|
740
|
+
for agent in self.agents.values():
|
|
741
|
+
for msg in agent.conversation.chat_messages:
|
|
742
|
+
message_index[msg.message_id] = (msg, agent.name)
|
|
743
|
+
|
|
744
|
+
# Walk back through parent_id chain
|
|
745
|
+
chain: list[str] = []
|
|
746
|
+
current_id = message.parent_id
|
|
747
|
+
|
|
748
|
+
while current_id and current_id in message_index:
|
|
749
|
+
parent_msg, agent_name = message_index[current_id]
|
|
750
|
+
# Only add agent name if it's different from previous (avoid duplicates)
|
|
751
|
+
if not chain or chain[-1] != agent_name:
|
|
752
|
+
chain.append(agent_name)
|
|
753
|
+
current_id = parent_msg.parent_id
|
|
754
|
+
|
|
755
|
+
# Reverse to get origin -> current order
|
|
756
|
+
chain.reverse()
|
|
757
|
+
return chain
|
|
758
|
+
|
|
759
|
+
def find_message_by_id(self, message_id: str) -> ChatMessage[Any] | None:
|
|
760
|
+
"""Find a message by ID across all agents in the pool.
|
|
761
|
+
|
|
762
|
+
Args:
|
|
763
|
+
message_id: The message ID to search for
|
|
764
|
+
|
|
765
|
+
Returns:
|
|
766
|
+
The ChatMessage if found, None otherwise
|
|
767
|
+
"""
|
|
768
|
+
for agent in self.agents.values():
|
|
769
|
+
for msg in agent.conversation.chat_messages:
|
|
770
|
+
if msg.message_id == message_id:
|
|
771
|
+
return msg
|
|
772
|
+
return None
|
|
773
|
+
|
|
780
774
|
def _create_agent_from_config[TAgentDeps](
|
|
781
775
|
self,
|
|
782
776
|
name: str,
|
|
@@ -804,99 +798,56 @@ class AgentPool[TPoolDeps = None](BaseRegistry[NodeName, MessageNode[Any, Any]])
|
|
|
804
798
|
|
|
805
799
|
match config:
|
|
806
800
|
case NativeAgentConfig():
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
801
|
+
from agentpool import Agent
|
|
802
|
+
|
|
803
|
+
return Agent.from_config(
|
|
804
|
+
config,
|
|
805
|
+
name=name, # Pass dict key for manifest lookups
|
|
806
|
+
manifest=self.manifest,
|
|
812
807
|
event_handlers=self.event_handlers,
|
|
808
|
+
input_provider=self._input_provider,
|
|
809
|
+
agent_pool=self,
|
|
810
|
+
deps_type=deps_type,
|
|
813
811
|
)
|
|
814
812
|
case AGUIAgentConfig():
|
|
815
|
-
|
|
813
|
+
from agentpool.agents.agui_agent import AGUIAgent
|
|
814
|
+
|
|
815
|
+
return AGUIAgent.from_config(
|
|
816
|
+
config,
|
|
817
|
+
event_handlers=self.event_handlers,
|
|
818
|
+
agent_pool=self,
|
|
819
|
+
)
|
|
816
820
|
case ClaudeCodeAgentConfig():
|
|
817
|
-
|
|
821
|
+
from agentpool.agents.claude_code_agent import ClaudeCodeAgent
|
|
822
|
+
from agentpool.utils.result_utils import to_type
|
|
823
|
+
|
|
824
|
+
output_type: type | None = None
|
|
825
|
+
if config.output_type:
|
|
826
|
+
output_type = to_type(config.output_type, self.manifest.responses)
|
|
827
|
+
return ClaudeCodeAgent.from_config(
|
|
828
|
+
config,
|
|
829
|
+
event_handlers=self.event_handlers,
|
|
830
|
+
input_provider=self._input_provider,
|
|
831
|
+
agent_pool=self,
|
|
832
|
+
output_type=output_type,
|
|
833
|
+
)
|
|
818
834
|
case BaseACPAgentConfig():
|
|
819
|
-
|
|
835
|
+
from agentpool.agents.acp_agent import ACPAgent
|
|
836
|
+
|
|
837
|
+
return ACPAgent.from_config(
|
|
838
|
+
config,
|
|
839
|
+
event_handlers=self.event_handlers,
|
|
840
|
+
agent_pool=self,
|
|
841
|
+
)
|
|
820
842
|
case _:
|
|
821
843
|
msg = f"Unknown agent config type: {type(config)}"
|
|
822
844
|
raise TypeError(msg)
|
|
823
845
|
|
|
824
|
-
def _create_acp_agent_from_config[TDeps](
|
|
825
|
-
self,
|
|
826
|
-
config: BaseACPAgentConfig,
|
|
827
|
-
deps_type: type[TDeps] | None = None,
|
|
828
|
-
) -> ACPAgent[TDeps]:
|
|
829
|
-
"""Create an ACPAgent from config object."""
|
|
830
|
-
from agentpool.agents.acp_agent import ACPAgent
|
|
831
|
-
|
|
832
|
-
config_handlers = config.get_event_handlers()
|
|
833
|
-
merged_handlers: list[IndividualEventHandler | BuiltinEventHandlerType] = [
|
|
834
|
-
*config_handlers,
|
|
835
|
-
*self.event_handlers,
|
|
836
|
-
]
|
|
837
|
-
return ACPAgent(config=config, event_handlers=merged_handlers or None)
|
|
838
|
-
|
|
839
|
-
def _create_agui_agent_from_config[TDeps](
|
|
840
|
-
self,
|
|
841
|
-
config: AGUIAgentConfig,
|
|
842
|
-
deps_type: type[TDeps] | None = None,
|
|
843
|
-
) -> AGUIAgent[TDeps]:
|
|
844
|
-
"""Create an AGUIAgent from config object."""
|
|
845
|
-
from agentpool.agents.agui_agent import AGUIAgent
|
|
846
|
-
|
|
847
|
-
config_handlers = config.get_event_handlers()
|
|
848
|
-
merged_handlers: list[IndividualEventHandler | BuiltinEventHandlerType] = [
|
|
849
|
-
*config_handlers,
|
|
850
|
-
*self.event_handlers,
|
|
851
|
-
]
|
|
852
|
-
return AGUIAgent(
|
|
853
|
-
endpoint=config.endpoint,
|
|
854
|
-
name=config.name or "agui-agent",
|
|
855
|
-
description=config.description,
|
|
856
|
-
display_name=config.display_name,
|
|
857
|
-
event_handlers=merged_handlers or None,
|
|
858
|
-
timeout=config.timeout,
|
|
859
|
-
headers=config.headers,
|
|
860
|
-
startup_command=config.startup_command,
|
|
861
|
-
startup_delay=config.startup_delay,
|
|
862
|
-
tools=[tool_config.get_tool() for tool_config in config.tools],
|
|
863
|
-
mcp_servers=config.mcp_servers,
|
|
864
|
-
tool_confirmation_mode=config.requires_tool_confirmation,
|
|
865
|
-
)
|
|
866
|
-
|
|
867
|
-
def _create_claude_code_agent_from_config[TDeps, TResult](
|
|
868
|
-
self,
|
|
869
|
-
config: ClaudeCodeAgentConfig,
|
|
870
|
-
deps_type: type[TDeps] | None = None,
|
|
871
|
-
) -> ClaudeCodeAgent[TDeps, TResult]:
|
|
872
|
-
"""Create a ClaudeCodeAgent from config object."""
|
|
873
|
-
from agentpool.agents.claude_code_agent import ClaudeCodeAgent
|
|
874
|
-
from agentpool.utils.result_utils import to_type
|
|
875
|
-
|
|
876
|
-
config_handlers = config.get_event_handlers()
|
|
877
|
-
merged_handlers: list[IndividualEventHandler | BuiltinEventHandlerType] = [
|
|
878
|
-
*config_handlers,
|
|
879
|
-
*self.event_handlers,
|
|
880
|
-
]
|
|
881
|
-
# Resolve output type if configured
|
|
882
|
-
output_type: type | None = None
|
|
883
|
-
if config.output_type:
|
|
884
|
-
output_type = to_type(config.output_type, self.manifest.responses)
|
|
885
|
-
return ClaudeCodeAgent(
|
|
886
|
-
config=config,
|
|
887
|
-
event_handlers=merged_handlers or None,
|
|
888
|
-
input_provider=self._input_provider,
|
|
889
|
-
tool_confirmation_mode=config.requires_tool_confirmation,
|
|
890
|
-
output_type=output_type,
|
|
891
|
-
agent_pool=self,
|
|
892
|
-
)
|
|
893
|
-
|
|
894
846
|
def create_agent[TAgentDeps]( # noqa: PLR0915
|
|
895
847
|
self,
|
|
896
848
|
name: str,
|
|
897
849
|
deps_type: type[TAgentDeps] | None = None,
|
|
898
850
|
input_provider: InputProvider | None = None,
|
|
899
|
-
pool: AgentPool[Any] | None = None,
|
|
900
851
|
event_handlers: list[IndividualEventHandler | BuiltinEventHandlerType] | None = None,
|
|
901
852
|
) -> Agent[TAgentDeps, Any]:
|
|
902
853
|
from agentpool import Agent
|
|
@@ -977,16 +928,13 @@ class AgentPool[TPoolDeps = None](BaseRegistry[NodeName, MessageNode[Any, Any]])
|
|
|
977
928
|
*config_handlers,
|
|
978
929
|
*(event_handlers or []),
|
|
979
930
|
]
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
case _:
|
|
988
|
-
model = None
|
|
989
|
-
model_settings = None
|
|
931
|
+
# Resolve model (handles variants and wraps strings)
|
|
932
|
+
resolved_model = self.manifest.resolve_model(config.model)
|
|
933
|
+
model: Model | str = resolved_model.get_model()
|
|
934
|
+
model_settings: ModelSettings | None = resolved_model.get_model_settings()
|
|
935
|
+
# Extract pydantic-ai builtin tools from config
|
|
936
|
+
builtin_tools = config.get_builtin_tools()
|
|
937
|
+
|
|
990
938
|
return Agent(
|
|
991
939
|
# context=context,
|
|
992
940
|
model=model,
|
|
@@ -1005,116 +953,15 @@ class AgentPool[TPoolDeps = None](BaseRegistry[NodeName, MessageNode[Any, Any]])
|
|
|
1005
953
|
input_provider=input_provider,
|
|
1006
954
|
output_type=resolved_output_type,
|
|
1007
955
|
event_handlers=merged_handlers or None,
|
|
1008
|
-
agent_pool=
|
|
956
|
+
agent_pool=self,
|
|
1009
957
|
tool_mode=config.tool_mode,
|
|
1010
958
|
knowledge=config.knowledge,
|
|
1011
959
|
toolsets=toolsets_list,
|
|
1012
|
-
auto_cache=config.auto_cache,
|
|
1013
960
|
hooks=config.hooks.get_agent_hooks() if config.hooks else None,
|
|
1014
961
|
tool_confirmation_mode=config.requires_tool_confirmation,
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
self,
|
|
1019
|
-
name: str,
|
|
1020
|
-
deps_type: type[TDeps] | None = None,
|
|
1021
|
-
) -> ACPAgent[TDeps]:
|
|
1022
|
-
"""Create an ACPAgent from configuration.
|
|
1023
|
-
|
|
1024
|
-
Args:
|
|
1025
|
-
name: Name of the ACP agent in the manifest
|
|
1026
|
-
deps_type: Optional dependency type (not used by ACP agents currently)
|
|
1027
|
-
|
|
1028
|
-
Returns:
|
|
1029
|
-
Configured ACPAgent instance
|
|
1030
|
-
"""
|
|
1031
|
-
from agentpool.agents.acp_agent import ACPAgent
|
|
1032
|
-
|
|
1033
|
-
config = self.manifest.acp_agents[name]
|
|
1034
|
-
# Ensure name is set on config
|
|
1035
|
-
if config.name is None:
|
|
1036
|
-
config = config.model_copy(update={"name": name})
|
|
1037
|
-
# Merge pool-level handlers with config-level handlers
|
|
1038
|
-
config_handlers = config.get_event_handlers()
|
|
1039
|
-
merged_handlers: list[IndividualEventHandler | BuiltinEventHandlerType] = [
|
|
1040
|
-
*config_handlers,
|
|
1041
|
-
*self.event_handlers,
|
|
1042
|
-
]
|
|
1043
|
-
return ACPAgent(config=config, event_handlers=merged_handlers or None)
|
|
1044
|
-
|
|
1045
|
-
def create_agui_agent[TDeps](
|
|
1046
|
-
self,
|
|
1047
|
-
name: str,
|
|
1048
|
-
deps_type: type[TDeps] | None = None,
|
|
1049
|
-
) -> AGUIAgent[TDeps]:
|
|
1050
|
-
"""Create an AGUIAgent from configuration.
|
|
1051
|
-
|
|
1052
|
-
Args:
|
|
1053
|
-
name: Name of the AG-UI agent in the manifest
|
|
1054
|
-
deps_type: Optional dependency type (not used by AG-UI agents currently)
|
|
1055
|
-
|
|
1056
|
-
Returns:
|
|
1057
|
-
Configured AGUIAgent instance
|
|
1058
|
-
"""
|
|
1059
|
-
from agentpool.agents.agui_agent import AGUIAgent
|
|
1060
|
-
|
|
1061
|
-
config = self.manifest.agui_agents[name]
|
|
1062
|
-
# Ensure name is set on config
|
|
1063
|
-
if config.name is None:
|
|
1064
|
-
config = config.model_copy(update={"name": name})
|
|
1065
|
-
# Merge pool-level handlers with config-level handlers
|
|
1066
|
-
config_handlers = config.get_event_handlers()
|
|
1067
|
-
merged_handlers: list[IndividualEventHandler | BuiltinEventHandlerType] = [
|
|
1068
|
-
*config_handlers,
|
|
1069
|
-
*self.event_handlers,
|
|
1070
|
-
]
|
|
1071
|
-
return AGUIAgent(
|
|
1072
|
-
endpoint=config.endpoint,
|
|
1073
|
-
name=config.name or "agui-agent",
|
|
1074
|
-
description=config.description,
|
|
1075
|
-
display_name=config.display_name,
|
|
1076
|
-
event_handlers=merged_handlers or None,
|
|
1077
|
-
timeout=config.timeout,
|
|
1078
|
-
headers=config.headers,
|
|
1079
|
-
startup_command=config.startup_command,
|
|
1080
|
-
startup_delay=config.startup_delay,
|
|
1081
|
-
tools=[tool_config.get_tool() for tool_config in config.tools],
|
|
1082
|
-
mcp_servers=config.mcp_servers,
|
|
1083
|
-
tool_confirmation_mode=config.requires_tool_confirmation,
|
|
1084
|
-
)
|
|
1085
|
-
|
|
1086
|
-
def create_claude_code_agent[TDeps](
|
|
1087
|
-
self,
|
|
1088
|
-
name: str,
|
|
1089
|
-
deps_type: type[TDeps] | None = None,
|
|
1090
|
-
) -> ClaudeCodeAgent[TDeps, str]:
|
|
1091
|
-
"""Create a ClaudeCodeAgent from configuration.
|
|
1092
|
-
|
|
1093
|
-
Args:
|
|
1094
|
-
name: Name of the Claude Code agent in the manifest
|
|
1095
|
-
deps_type: Optional dependency type (not used by Claude Code agents currently)
|
|
1096
|
-
|
|
1097
|
-
Returns:
|
|
1098
|
-
Configured ClaudeCodeAgent instance
|
|
1099
|
-
"""
|
|
1100
|
-
from agentpool.agents.claude_code_agent import ClaudeCodeAgent
|
|
1101
|
-
|
|
1102
|
-
config = self.manifest.claude_code_agents[name]
|
|
1103
|
-
# Ensure name is set on config
|
|
1104
|
-
if config.name is None:
|
|
1105
|
-
config = config.model_copy(update={"name": name})
|
|
1106
|
-
# Merge pool-level handlers with config-level handlers
|
|
1107
|
-
config_handlers = config.get_event_handlers()
|
|
1108
|
-
merged_handlers: list[IndividualEventHandler | BuiltinEventHandlerType] = [
|
|
1109
|
-
*config_handlers,
|
|
1110
|
-
*self.event_handlers,
|
|
1111
|
-
]
|
|
1112
|
-
return ClaudeCodeAgent(
|
|
1113
|
-
config=config,
|
|
1114
|
-
event_handlers=merged_handlers or None,
|
|
1115
|
-
input_provider=self._input_provider,
|
|
1116
|
-
tool_confirmation_mode=config.requires_tool_confirmation,
|
|
1117
|
-
agent_pool=self,
|
|
962
|
+
builtin_tools=builtin_tools or None,
|
|
963
|
+
usage_limits=config.usage_limits,
|
|
964
|
+
providers=config.model_providers,
|
|
1118
965
|
)
|
|
1119
966
|
|
|
1120
967
|
|