AI_Agent-nanobot-源码阅读-模块扩展和进一步理解

nanobot 扩展方式

内部扩展+外部插件扩展
1. 主要是 provider --LLM 
2. 多渠道支持 --basechannel
3. 工具注册模式 tool
4. skill的方式

tools

 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 可以更新技能,但靠用户触发,不是自动的。自动触发呢
posted @ 2026-04-14 15:58  辰令  阅读(39)  评论(0)    收藏  举报