nanobot 扩展方式
内部扩展+外部插件扩展
1. 主要是 provider --LLM
2. 多渠道支持 --basechannel
3. 工具注册模式 tool
4. skill的方式
1.tools插件的方式 : 基类抽象+注册表(ABC 抽象类+ ToolRegistry / channelRegistry)-tools/channels
01. 接口定义 nanobot/agent/tools/base.py : name description parameters execute class Tool(ABC)
其他实现类
tool_parameters 装饰器
02. 注册中心 nanobot/agent/tools/registry.py
from nanobot.agent.tools.base import Tool
class ToolRegistry:
self._tools: dict[str, Tool] = {}
功能 register unregister get get_definitions prepare_call async def execute
包 公开的API nanobot/agent/tools/__init__.py
from nanobot.agent.tools.base import Schema, Tool, tool_parameters
from nanobot.agent.tools.registry import ToolRegistry
03.注册使用
nanobot/agent/loop.py
self.tools = ToolRegistry()
def _register_default_tools(self) -> None:
001. 注册默认的工具集合 """Register the default set of tools."""
allowed_dir = (
self.workspace if (self.restrict_to_workspace or self.exec_config.sandbox) else None
)
extra_read = [BUILTIN_SKILLS_DIR] if allowed_dir else None
self.tools.register(
ReadFileTool(
workspace=self.workspace, allowed_dir=allowed_dir, extra_allowed_dirs=extra_read
)
)
002. self._mcp_stacks = await connect_mcp_servers(self._mcp_servers, self.tools)
04. 调用 nanobot/agent/runner.py
from nanobot.agent.tools.registry import ToolRegistry
tools=spec.tools.get_definitions(),
await spec.tools.execute(tool_call.name, params)
2. Channel 系统
01. nanobot/channels/base.py
class BaseChannel(ABC) login start stop
send _handle_message
default_config is_allowed
其他实现类
02. nanobot/channels/registry.py
双通道注册,内部通过pkgutil外部通过entry_points
内部模块和插件系统 built-in channel modules and external plugins
_INTERNAL = frozenset({"base", "manager", "registry"})
01.通过 pkgutil.iter_modules 扫描包路径零导入
02.discover_plugins()
from importlib.metadata import entry_points
通过 entry_points 发现外部插件
03. 合并内外插件
"""Return all channels: built-in (pkgutil) merged with external (entry_points).
插件的开发 配置中心启用
pyproject.toml
03. nanobot/channels/manager.py
_init_channels(self)-discover_all()
读取config文件 channels.start_all)_
04. nanobot/cli/commands.py
channels = ChannelManager(config,bus)
AgentLoop -接受-处理-相应
3. skill
Markdown 格式的技能扩展系统==文件系统加载的方式
内置skills 文件位置nanobot/skills
用户自定义的skills
skillsLoader 核心逻辑
01.nanobot/agent/skills.py
SkillsLoader 扫描workspace/sklls/ 扫描builtin_skills/ 检查requires 返回可用技能列表
Metadata==name+description
Body= SKILL.md 指令,技能触发后加载
scripts 按照需要执行或加载
02. nanobot/skills/skill-creator/scripts/init_skill.py
技能辅助创建--初始化技能模板+打包技能为skill文件
03. ContextBulider 使用skillsLoader
AgentLoop 初始化时传入skillLoader
4.provider
4. provider 扩展采用 ProviderSpec注册表+工厂模式
01.nanobot/providers/base.py 抽象基类
02.nanobot/providers/registry.py
ProviderSpec(
name="custom",
keywords=(),
env_key="",
display_name="Custom",
backend="openai_compat",
is_direct=True,
),
03.nanobot/config/schema.py
class ProvidersConfig(Base):
04.nanobot/nanobot.py
工厂函数
from_config(
model=defaults.model,
def _make_provider(config: Any) -> Any:
"""Create the LLM provider from config (extracted from CLI)."""
5. Hook生命周期钩子
hook系统允许在agent运行过程中注入自定义行为
核心接口
1. nanobot/agent/hook.py
AgentHookContext
AgentHook
CompositeHook
2.nanobot/agent/loop.py
from nanobot.agent.hook import AgentHook, AgentHookContext, CompositeHook
class _LoopHook(AgentHook):
处理liushichao输出-进度回调-日志等
3. run
hook.efore_iteration() hook.befor_execute_tool
hook.on_stream() hook.on_stream_end
hook.after_iteration()
上下文
session memory compact Dream
AGENTS.md:agent 是谁、能做什么、有哪些行为约束
Context
memory/MEMORY.md 长期记忆
memory/history.jsonl 归档的历史记录
SOUL.md USER.md 身份和用户信息
记忆设计
nanobot/agent/memory.py
class MemoryStore:
"""Pure file I/O for memory files: MEMORY.md, history.jsonl, SOUL.md, USER.md."""
.dream_cursor"
Dream 两阶段记忆机制,Drift 草稿 → Dream 蒸馏
# Dream — heavyweight cron-scheduled memory consolidation
"""Two-phase memory processor: analyze history.jsonl, then edit files via AgentRunner.
Phase 1 produces an analysis summary (plain LLM call).
Phase 2 delegates to AgentRunner with read_file / edit_file tools so the
LLM can make targeted, incremental edits instead of replacing entire files.
autocompact VS Consolidator
Autocompact(全量压缩)
Consolidator(实时压缩) # Consolidator — lightweight token-budget triggered consolidation
nanobot 记忆系统把”实时压缩”和”定时整合”分开做,各自用不同的触发时机
Consolidator 是空间压力触发,Dream 是按计划触发
##两阶段执行phase 1 纯LLM,phase2 工具执行
第一阶段 LLM 分析这批历史摘要,产出整合分析。
第二阶段另起一个 agent,只配读文件和写文件两个工具,把分析结果落地到 MEMORY.md、SOUL.md、USER.md。
Dream 完成后推进游标,有改动时自动做 git commit。
Dream --定时执行-默认每2小时执行一次,每次处理20条历史记录,phase_2最多10次工具调用
nanobot/config/schema.py
class DreamConfig(Base):
def build_schedule(self, timezone: str) -> CronSchedule:
nanobot/cli/commands.py
await agent.dream.run()
cron.register_system_job(CronJob(
id="dream",
name="dream",
schedule=dream_cfg.build_schedule(config.agents.defaults.timezone),
payload=CronPayload(kind="system_event"),
))
主要内容
核心是 Agent Loop
agent loop 怎么转、上下文装了什么、记忆怎么读写、技能怎么加载,以及这样设计的理由
loop 异步事件循环,接消息、组装上下文、调 LLM、执行工具
上下文内容和记忆机制
上下文管理
其他: tools skill channel
nanobot 的 skill-creator 可以更新技能,但靠用户触发,不是自动的。自动触发呢