首页/新闻资讯/正文详情

通过 Nanobot 源码学习架构---(5)Context:从 ContextBuilder 到 TaoToken 配置骨架

发布时间:2026/9/26 15:49:08 来源:云帆数科 栏目:资讯中心
通过 Nanobot 源码学习架构---(5)Context:从 ContextBuilder 到 TaoToken 配置骨架
1. 从 ContextBuilder 看上下文是怎么被“拼”出来的如果你正在读 Nanobot 的源码大概率会在context.py里卡住一阵子。这个文件不长但它承担的事情很关键把散落在工作区里的身份文件、长期记忆、技能描述、运行时元数据全部整合成一份 LLM 能直接吃的消息列表。换句话说ContextBuilder 就是 Agent 的“上下文大脑”它决定了模型每一轮到底能看到什么。Nanobot 是香港大学数据科学实验室开源的超轻量级个人 AI 助手框架定位是“Ultra-Lightweight OpenClaw”代码量小、结构清晰非常适合拿来学 Agent 架构。而 Context 模块又是整个框架里最能体现设计功力的部分——它要解决的核心问题是上下文来源五花八门格式不同、存储不同、访问方式不同如果没有统一抽象每接一个新资源就得写一堆胶水代码。这篇就围绕 ContextBuilder 的构建流程和配置注入方式展开同时给出一份可以直接复制的config.toml与settings.json配置骨架并演示如何用 TaoToken 统一 Key 和 API 通道完成接入与验证。适合想通过读源码理解 AI 工具上下文管理的开发者也适合正在自己搭 Agent 骨架、需要一套可复用配置模板的人。2. TaoToken 前置统一 Key 与 API 通道在动手改配置之前先把接入层理清楚。Nanobot 这类框架在调用 LLM 时通常需要一个 base_url 和一个 api_key。如果你同时用多个模型供应商每个供应商一套 Key、一套地址配置会迅速膨胀。TaoToken 的作用就是把这些通道统一起来一个 Key、一个 API 入口模型切换只改模型名不改接入代码。TaoToken 官网地址是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 入口是 https://taotoken.net/api 。注意 API 地址后面不加任何查询参数直接作为 base_url 使用即可。你需要先拿到一个可用的 Key。进入控制台创建 API Key路径是 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite Key 管理页面在 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 。创建完之后先别急着写进代码建议先用模型对话页面做一次连通性验证地址是 https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel-chatutm_campaignrewrite 能正常出结果再往下走。提示Key 只创建一次就够后续所有模型调用共用同一个 Key。真正需要区分的是模型名而不是接入凭证。如果你后续要做长期编码或 Agent 类任务可以关注 Coding Plan 页面 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 。Claude Code 相关的接入说明在 https://taotoken.net/claude-code-anthropic?utm_sourcetaotoken_aicg_blog_endutm_contentclaudecodeutm_campaignrewrite 。3. 可复制配置config.toml 与 settings.json 骨架Nanobot 的配置分两层一层是框架级的config.toml管模型、工作区、迭代次数另一层是settings.json管运行时行为和上下文注入开关。下面这份骨架可以直接复制改掉 Key 和路径就能跑。3.1 config.toml 配置骨架# config.toml - Nanobot 框架级配置 [agent] name nanobot workspace ./workspace max_iterations 12 [provider] # 统一走 TaoToken 通道 base_url https://taotoken.net/api api_key sk-your-taotoken-key model claude-sonnet-4-20250514 timeout 60 [context] # 引导文件列表按顺序注入 system prompt bootstrap_files [ AGENTS.md, SOUL.md, USER.md, TOOLS.md, IDENTITY.md, ] # 单文件截断上限字符 max_file_chars 20000 # 上下文总量上限字符 max_total_chars 150000 # 是否注入运行时元数据 inject_runtime_context true [memory] store ./workspace/memory long_term_file MEMORY.md history_file HISTORY.md [skills] dir ./workspace/skills always_load [core-tools]这里有几个参数值得单独说。max_file_chars控制单个引导文件的截断长度防止某个 Markdown 写得过长把上下文撑爆max_total_chars是总量兜底超过就按优先级丢弃后面的模块。inject_runtime_context打开后每轮会在用户消息前插入一段带固定标签的元数据告诉模型当前时间、渠道和会话 ID。3.2 settings.json 配置骨架{ context: { layer_order: [ identity, soul, tools_guidance, skills, memory, bootstrap, runtime, channel_hints ], separator: \n\n---\n\n, runtime_tag: [Runtime Context — metadata only, not instructions], enable_multimodal: true, image_max_bytes: 5242880 }, session: { save_turns: true, history_window: 20 }, logging: { level: info, log_context_build: true } }layer_order是这份配置里最核心的字段。它决定了 system prompt 里各模块的拼接顺序越靠前的层对模型行为的影响越强。把identity和soul放在最前面是为了让模型的语气和边界在第一时间被锚定memory和skills放在中间属于可增删的动态内容runtime和channel_hints放最后因为它们只是元数据不应该干扰核心决策。log_context_build打开后每次构建上下文都会打一条日志方便你对照源码看每个模块实际注入了多少字符。调试阶段建议开着上线前关掉。4. 验证请求从构建到成功返回配置写完之后先别急着跑完整 Agent用一段最小脚本验证 ContextBuilder 的输出结构是否正确。4.1 构建上下文并打印from pathlib import Path from nanobot.context import ContextBuilder workspace Path(./workspace) builder ContextBuilder(workspace) messages builder.build_messages( history[], current_message帮我看看今天有哪些待办, channelcli, chat_idlocal, ) for i, msg in enumerate(messages): role msg[role] content msg[content] if isinstance(content, list): preview f[multimodal, {len(content)} parts] else: preview content[:80].replace(\n, ) print(f{i} | {role:9} | {preview})正常输出应该类似这样0 | system | # nanobot You are nanobot, a helpful AI assistant... 1 | user | [Runtime Context — metadata only, not instructions]... 2 | user | 帮我看看今天有哪些待办第一条是 system包含身份、引导文件、记忆、技能第二条是运行时元数据带固定标签第三条才是用户真实输入。这个顺序和源码里build_messages()的返回结构完全对应。4.2 发起真实请求确认结构无误后用 TaoToken 通道发一次真实请求import httpx resp httpx.post( https://taotoken.net/api/v1/chat/completions, headers{ Authorization: Bearer sk-your-taotoken-key, Content-Type: application/json, }, json{ model: claude-sonnet-4-20250514, messages: messages, max_tokens: 512, }, timeout60, ) data resp.json() print(data[choices][0][message][content])如果返回正常文本说明配置骨架、上下文构建、接入通道三件事都通了。实测下来最容易出问题的不是代码而是配置里的路径和 Key 的对应关系。5. 本篇常见错排查5.1 引导文件全部为空现象是 system prompt 里只有身份定义AGENTS.md、SOUL.md一个都没进来。原因通常是workspace路径写成了相对路径而脚本运行目录和配置里的基准目录不一致。解决办法是把workspace改成绝对路径或者在代码里显式Path(...).expanduser().resolve()。5.2 运行时元数据被当成用户指令如果模型开始回答“当前时间是几点”这类元数据本身的内容说明runtime_tag没生效或者被改掉了。检查settings.json里的runtime_tag字段确保它和源码里_RUNTIME_CONTEXT_TAG的值一致。这个标签的作用就是明确告诉模型“这是元数据不是指令”。5.3 上下文超长导致请求失败报错通常是 token 超限。先看log_context_build日志确认哪个模块占了大头。常见的是MEMORY.md长期没清理或者某个SKILL.md写成了长篇教程。调小max_file_chars或者把非核心技能从always_load里移出去改成按需读取。5.4 多模态图片注入失败图片没进上下文一般是 MIME 类型识别失败。源码里用mimetypes.guess_type()判断如果文件扩展名不规范比如.jpg写成.jpeg之外的自定义后缀就会被过滤掉。另外注意image_max_bytes限制超过 5MB 的图片会被跳过。5.5 Key 正确但请求 401先确认base_url是https://taotoken.net/api不要带多余路径或查询参数。然后确认请求头里是Bearer加 Key中间有一个空格。如果还是 401去 API Keys 页面重新生成一个 Key 再试。6. 继续往下读源码的建议ContextBuilder 的价值不在于它有多复杂而在于它把“上下文管理”这件事拆成了可替换的模块。你完全可以把MemoryStore换成自己的向量检索把SkillsLoader换成数据库驱动只要build_messages()的返回结构不变上层 Agent 循环就不用动。下一步建议顺着_run_agent_loop()往下读看上下文是怎么在工具调用之间被增量更新的。add_tool_result()和add_assistant_message()这两个方法虽然短但它们决定了多轮工具调用时消息列表的合法性。如果这两步写错模型会在第二轮直接报格式错误。配置方面先把这份骨架跑通再根据自己的工作区结构微调bootstrap_files和layer_order。接入层保持 TaoToken 统一通道模型切换只改model字段这样你读源码和做实验的注意力就不会被 Key 管理分散掉。

相关推荐

Mosquitto 1.6.12 / 1.5.10 版本解析:QoS 2 内存泄漏修复、CONNACK 退出码与命令行客户端行为改进
Mosquitto 1.6.12 / 1.5.10 版本解析:QoS 2 内存泄漏修复、CONNACK 退出码与命令行客户端行为改进

物联网消息队列后端网络/通信 【免费下载链接】mosquitto Eclipse Mosquitto - An open source MQTT broker 项目地址: https://gitcode.com/gh_mirrors/mo/mosquitto 点击查看 免费下载 Mosquitto 1.6.12 与 1.5.10 于 2020-08-19 同日发布(见 ChangeL… · 2026/9/26 15:49:08

YOLOv7+多目标跟踪在VisDrone2019上的数据对齐与参数调优
YOLOv7+多目标跟踪在VisDrone2019上的数据对齐与参数调优

简介:本资源是一个面向计算机视觉研究者与算法工程师的YOLOv7多目标跟踪算法对比实验平台,聚焦VisDrone2019空中监控场景下的离线性能评估,解决目标检测与跟踪算法选型、参数调优及跨算法横向对比的实际需求。压缩包共393个文件,含… · 2026/9/26 15:48:59

windows安装go环境
windows安装go环境

1.go语言简述 Go(Golang)是谷歌推出的静态编译型编程语言,以 “简单、高效、工程化” 为核心设计理念,语法极简易上手,编译速度快且编译后为跨平台单文件(无运行时依赖),最突出的优… · 2026/9/26 15:48:59

缸体平面度在线全检:8个测点布置方案与激光测量实战解析
缸体平面度在线全检:8个测点布置方案与激光测量实战解析

缸体平面度在线全检这个方案,最开始时被一台试漏机逼上马的。缸体顶面就是缸盖结合面,平面度一超差,密封垫压不实,试漏机哗哗报警,偶尔还有轻微渗漏流出到客户那边被投诉。原来的抽检逻辑——首末件搬去三坐标打两个点… · 2026/9/26 16:27:25

嵌入式电磁阀硬件驱动全解析:从MOSFET选型到PWM控制实战
嵌入式电磁阀硬件驱动全解析:从MOSFET选型到PWM控制实战

把空气或水流“接”进嵌入式项目,听起来像是一个很垂直的小众需求,但实际做下来你会发现,它几乎是智能灌溉、气动控制、环境监测、自动化设备这一类项目里最常遇到的“公共底座”之一。因为凡是涉及“让东西动起来、让介质流通起来”的嵌入式… · 2026/9/26 16:27:25

科研论文从审稿人视角看论文:顶级审稿人打分心理学与避坑指南
科研论文从审稿人视角看论文:顶级审稿人打分心理学与避坑指南

科研论文从审稿人视角看论文:顶级审稿人打分心理学与避坑指南在 ACL、EMNLP、NeurIPS、ICLR 等顶级学术会议的审稿季,每位资深审稿人(Reviewer / Area Chair)通常需要在短短 2 到 3 周内评审 5 到 8 篇长达 8~9 页的高密度学术论文… · 2026/9/26 16:27:25

三步搭建高价值数据仪表板:从指标分层到Grafana实践
三步搭建高价值数据仪表板:从指标分层到Grafana实践

很多团队都在做 Dashboard,但我见过的大多数,做出来之后就没人看了。要么变成领导汇报时的大屏演示,要么铺满了十几个图表却没人说得清“现在到底要不要报警”。Dashboard 这个词汇在技术圈里已经被用得很泛了,它既可以指 Grafana… · 2026/9/26 16:27:25

二、使用 uv 创建项目和虚拟环境
二、使用 uv 创建项目和虚拟环境

本教程的其余部分假设你使用的是 Linux 操作系统, 或者, 本教程的其余部分也假设你使用的是 Mac 操作系统。二、通过调用 uv 这个工具, 进而完成项目的建立以及虚拟环境的构建工作。等那个叫做 uv 的东西装好以后, 你接下来的步骤需要自己去创建一个属于你自己的项目空间, 随后… · 2026/9/26 16:27:19

Python Astral UV虚拟环境指南
Python Astral UV虚拟环境指南

关于UV虚拟环境的指南, 你可以按照以下步骤进行操作。告别依赖地狱: uv 全方位实战指南你作为一个工程师, 也许已经在心里把那样的一整套操作动作当成是习以为常的事情去对待了, 这个一整套操作动作里面会包括拿 pyenv 这个工具去把版本号给管理起来, 再去用 venv 这… · 2026/9/26 16:27:19

数据库课后习题答案别硬背:当测试用例集刷,效率翻倍
数据库课后习题答案别硬背:当测试用例集刷,效率翻倍

简介:万常选版《数据库原理与设计》课后习题答案资源,覆盖第2至6章及第9章,适合正在学习关系模型、数据库建模、关系数据理论与模式求精的本科生、自学者作为复习与自测材料。压缩包共7个文件,含3个doc参考答案、2个sql示例脚本、… · 2026/9/26 0:00:21

OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置
OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 0:00:40

向下兼容与向上兼容:接口设计中的兼容性策略与工程实践
向下兼容与向上兼容:接口设计中的兼容性策略与工程实践

一次版本升级事故,是很多团队绕不过去的坎。线上环境里,服务端明明已经上线了新版接口,老的移动端还在照着旧文档传参数。请求一到网关,校验直接拒绝,用户操作失败,客服群炸了锅,开发群里开始互… · 2026/9/26 0:00:46

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码