mirror of
https://github.com/HKUDS/nanobot.git
synced 2026-05-19 16:12:30 +00:00
This commit implements a progressive refactoring of the tool system to support plugin discovery, scoped loading, and protocol-driven runtime context injection. Key changes: - Add Tool ABC metadata (tool_name, _scopes) and ToolContext dataclass for dependency injection. - Introduce ToolLoader with pkgutil-based builtin discovery and entry_points-based third-party plugin loading. - Add scope filtering (core/subagent/memory) so different contexts load appropriate tool sets. - Introduce ContextAware protocol and RequestContext dataclass to replace hardcoded per-tool context injection in AgentLoop. - Add RuntimeState / MutableRuntimeState protocols to decouple MyTool from AgentLoop. - Migrate all built-in tools to declare scopes and implement create()/enabled() hooks. - Migrate MessageTool, SpawnTool, CronTool, and MyTool to ContextAware. - Refactor AgentLoop to use ToolLoader and protocol-driven context injection. - Refactor SubagentManager to use ToolLoader(scope="subagent") with per-run FileStates isolation. - Register all built-in tools via pyproject.toml entry_points. - Add comprehensive tests for loader scopes, entry_points, ContextAware, subagent tools, and runtime state sync.
35 lines
965 B
Python
35 lines
965 B
Python
"""Runtime context for tool construction."""
|
|
from __future__ import annotations
|
|
|
|
from dataclasses import dataclass, field
|
|
from typing import Any, Callable, Protocol, runtime_checkable
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class RequestContext:
|
|
"""Per-request context injected into tools at message-processing time."""
|
|
channel: str
|
|
chat_id: str
|
|
message_id: str | None = None
|
|
session_key: str | None = None
|
|
metadata: dict[str, Any] = field(default_factory=dict)
|
|
|
|
|
|
@runtime_checkable
|
|
class ContextAware(Protocol):
|
|
def set_context(self, ctx: RequestContext) -> None:
|
|
...
|
|
|
|
|
|
@dataclass
|
|
class ToolContext:
|
|
config: Any
|
|
workspace: str
|
|
bus: Any | None = None
|
|
subagent_manager: Any | None = None
|
|
cron_service: Any | None = None
|
|
file_state_store: Any = field(default=None)
|
|
provider_snapshot_loader: Callable[[], Any] | None = None
|
|
image_generation_provider_configs: dict[str, Any] | None = None
|
|
timezone: str = "UTC"
|