Files
hack/tools/scripts/llm-key-hunter/results/_cache/content/bcefghj_learn-nanobot.json
T

1 line
49 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{"repo": "bcefghj/learn-nanobot", "files": {"docs/06-install-and-hands-on/README.md": {"740d041a52e1d50499aabc70ec5bd6ae592737d0": {"t": 1785746516.4572914, "n": 15197, "h": "30d96d61f238da06", "c": "# 06 - 安装与上手\n\n> **阅读时间**:约 2 小时 \n> **前置知识**:[05 - MCP 协议详解](../05-mcp-protocol/README.md) \n> **学习目标**:完成 Nanobot 的安装配置,运行你的第一个 AI Agent,理解全部配置项\n\n---\n\n## 目录\n\n- [6.1 为什么需要动手实践](#61-为什么需要动手实践)\n- [6.2 环境准备](#62-环境准备)\n- [6.3 安装 Nanobot](#63-安装-nanobot)\n- [6.4 配置向导 nanobot onboard](#64-配置向导-nanobot-onboard)\n- [6.5 config.json 配置详解](#65-configjson-配置详解)\n- [6.6 第一次运行:交互模式](#66-第一次运行交互模式)\n- [6.7 自定义 AGENTS.md:定义 Agent 身份](#67-自定义-agentsmd定义-agent-身份)\n- [6.8 引导文件体系](#68-引导文件体系)\n- [6.9 常见问题排错](#69-常见问题排错)\n- [6.10 实战练习](#610-实战练习)\n- [6.11 面试话术](#611-面试话术)\n- [6.12 本章小结](#612-本章小结)\n\n---\n\n## 6.1 为什么需要动手实践\n\n学习 AI Agent 框架,**纸上得来终觉浅**。在面试中,面试官最看重的不是你能背多少概念,而是:\n\n1. **你有没有真正用过?** —— 安装、配置、调试的全流程经验\n2. **你能不能描述细节?** —— 配置文件的字段含义、启动参数的作用\n3. **你遇到过什么问题?** —— 排错经历本身就是加分项\n\n> 💡 **面试真相**:一个能说出 \"我在配置 Nanobot 的 context_window_tokens 时发现设置过大会导致记忆压缩不触发\" 的候选人,比只能背概念的候选人强 10 倍。\n\n---\n\n## 6.2 环境准备\n\n### 6.2.1 系统要求\n\n| 项目 | 最低要求 | 推荐配置 |\n|------|---------|---------|\n| 操作系统 | macOS / Linux / Windows (WSL) | macOS / Ubuntu 22.04+ |\n| Python | 3.10+ | 3.11 或 3.12 |\n| 内存 | 4 GB | 8 GB+ |\n| 磁盘空间 | 500 MB | 2 GB+ |\n| 网络 | 可访问 LLM API | 稳定的国际网络 |\n\n### 6.2.2 Python 环境配置\n\n**方式一:使用系统 Python(简单)**\n\n```bash\n# 检查 Python 版本\npython3 --version\n# 输出应为 Python 3.10.x 或更高\n\n# 如果版本过低,使用 pyenv 安装\ncurl https://pyenv.run | bash\npyenv install 3.12.0\npyenv global 3.12.0\n```\n\n**方式二:使用 Conda(推荐隔离环境)**\n\n```bash\n# 创建独立环境\nconda create -n nanobot python=3.12 -y\nconda activate nanobot\n\n# 验证\npython --version\n# Python 3.12.x\n```\n\n**方式三:使用 uv(最快,推荐)**\n\n```bash\n# 安装 uv(Rust 编写的超快 Python 包管理器)\ncurl -LsSf https://astral.sh/uv/install.sh | sh\n\n# 验证\nuv --version\n```\n\n> 💡 **面试加分**:uv 是 Astral 公司用 Rust 编写的 Python 包管理工具,安装速度比 pip 快 10-100 倍。Nanobot 官方推荐使用 uv。\n\n### 6.2.3 LLM API Key 准备\n\nNanobot 需要连接大语言模型 API,支持多种 Provider:\n\n| Provider | 获取方式 | 推荐度 |\n|----------|---------|--------|\n| OpenAI | [platform.openai.com](https://platform.openai.com) | 首选 |\n| Anthropic (Claude) | [console.anthropic.com](https://console.anthropic.com) | 推荐 |\n| DeepSeek | [platform.deepseek.com](https://platform.deepseek.com) | 国内友好 |\n| OpenRouter | [openrouter.ai](https://openrouter.ai) | 聚合多模型 |\n| 本地模型 (Ollama) | [ollama.com](https://ollama.com) | 免费、离线 |\n\n```bash\n# 准备好你的 API Key\nexport OPENAI_API_KEY=\"sk-xxxxxxxxxxxxxxxxxxxxxxxx\"\n\n# 或者使用 DeepSeek(国内推荐)\nexport DEEPSEEK_API_KEY=\"sk-xxxxxxxxxxxxxxxxxxxxxxxx\"\n```\n\n---\n\n## 6.3 安装 Nanobot\n\n### 6.3.1 方式一:pip 安装(通用)\n\n```bash\n# 安装最新版\npip install nanobot-ai\n\n# 验证安装\nnanobot --version\n\n# 查看帮助\nnanobot --help\n```\n\n### 6.3.2 方式二:uv 工具安装(推荐)\n\n```bash\n# 使用 uv 安装为全局工具\nuv tool install nanobot-ai\n\n# 验证\nnanobot --version\n```\n\n> **uv tool install vs pip install 的区别**:\n> - `uv tool install` 会创建独立的虚拟环境,不污染全局 Python 环境\n> - `pip install` 直接安装到当前 Python 环境\n> - 推荐使用 uv,尤其是需要在多个项目中使用不同版本时\n\n### 6.3.3 方式三:从源码安装(开发者)\n\n```bash\n# 克隆源码\ngit clone https://github.com/HKUDS/nanobot.git\ncd nanobot\n\n# 使用 uv 安装开发依赖\nuv sync --dev\n\n# 或使用 pip\npip install -e \".[dev]\"\n```\n\n### 6.3.4 安装后验证\n\n```bash\n# 验证命令是否可用\nwhich nanobot\n\n# 查看版本\nnanobot --version\n\n# 查看所有子命令\nnanobot --help\n```\n\n预期输出类似:\n\n```\nUsage: nanobot [OPTIONS] COMMAND [ARGS]...\n\nOptions:\n --version Show version and exit.\n --help Show this message and exit.\n\nCommands:\n onboard Interactive setup wizard\n ...\n```\n\n---\n\n## 6.4 配置向导 nanobot onboard\n\n### 6.4.1 运行配置向导\n\nNanobot 提供了一个交互式配置向导,帮助你快速完成初始配置:\n\n```bash\n# 在你想要作为 workspace 的目录下运行\nmkdir my-agent && cd my-agent\nnanobot onboard\n```\n\n### 6.4.2 向导流程详解\n\n配置向导会依次引导你完成以下步骤:\n\n```\nStep 1: 选择 LLM Provider\n → OpenAI / Anthropic / DeepSeek / OpenRouter / Custom\n\nStep 2: 输入 API Key\n → 输入你的 API Key(会被安全存储)\n\nStep 3: 选择默认模型\n → gpt-4o / claude-sonnet-4-20250514 / deepseek-chat / ...\n\nStep 4: 配置 Workspace\n → 当前目录 / 自定义目录\n\nStep 5: 生成配置文件\n → 自动创建 config.json\n```\n\n### 6.4.3 向导生成的文件\n\n运行完 `nanobot onboard` 后,你会得到:\n\n```\nmy-agent/\n├── config.json # 主配置文件\n├── AGENTS.md # Agent 身份定义(可能自动生成)\n└── memory/ # 记忆存储目录\n └── MEMORY.md # 长期记忆文件\n```\n\n---\n\n## 6.5 config.json 配置详解\n\n这是 Nanobot 最核心的配置文件,理解每个字段对面试至关重要。\n\n### 6.5.1 完整配置示例\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"workspace\": \".\",\n \"model\": \"gpt-4o\",\n \"provider\": \"openai\",\n \"max_tokens\": 16384,\n \"context_window_tokens\": 128000,\n \"temperature\": 0.7,\n \"max_tool_iterations\": 40\n }\n },\n \"providers\": {\n \"openai\": {\n \"api_key\": \"sk-xxxxxxxxxxxxxxxxxxxxxxxx\",\n \"api_base\": \"https://api.openai.com/v1\"\n },\n \"deepseek\": {\n \"api_key\": \"sk-xxxxxxxxxxxxxxxxxxxxxxxx\",\n \"api_base\": \"https://api.deepseek.com\"\n },\n \"ollama\": {\n \"api_key\": \"ollama\",\n \"api_base\": \"http://localhost:11434/v1\"\n }\n },\n \"channels\": {\n \"telegram\": {\n \"bot_token\": \"123456:ABC-DEF...\"\n }\n },\n \"tools\": {\n \"web_search\": {\n \"provider\": \"brave\",\n \"api_key\": \"BSA...\"\n }\n }\n}\n```\n\n### 6.5.2 agents.defaults 字段详解\n\n| 字段 | 类型 | 默认值 | 说明 |\n|------|------|--------|------|\n| `workspace` | string | `\".\"` | Agent 的工作目录,所有文件操作基于此路径 |\n| `model` | string | `\"gpt-4o\"` | 使用的 LLM 模型标识 |\n| `provider` | string | `\"openai\"` | LLM 服务提供商,对应 providers 中的 key |\n| `max_tokens` | int | `16384` | 单次 LLM 回复的最大 token 数 |\n| `context_window_tokens` | int | `128000` | 上下文窗口大小,直接影响记忆压缩触发时机 |\n| `temperature` | float | `0.7` | 生成随机性,0=确定性,1=高随机性 |\n| `max_tool_iterations` | int | `40` | 单次对话中工具调用的最大迭代次数 |\n\n**关键理解**:\n\n```\ncontext_window_tokens 的作用:\n┌──────────────────────────────────────────────────┐\n│ context_window_tokens = 128000 │\n│ ┌──────────┐ ┌──────────┐ ┌─────────────────┐ │\n│ │ System │ │ Memory │ │ Conversation │ │\n│ │ Prompt │ │ MEMORY.md│ │ History │ │\n│ │ ~2000 │ │ ~1000 │ │ 不断增长... │ │\n│ └──────────┘ └──────────┘ └─────────────────┘ │\n│ │\n│ 当总 token 数接近 128000 时 → 触发记忆压缩 │\n└──────────────────────────────────────────────────┘\n```\n\n> 💡 **面试要点**:`context_window_tokens` 不是越大越好。设置过大会导致:\n> 1. 记忆压缩不触发,旧对话堆积导致 API 费用暴增\n> 2. 模型注意力分散,回答质量下降\n> 3. 超过模型实际支持的窗口会直接报错\n\n### 6.5.3 providers 配置\n\nproviders 定义了 LLM 服务的连接信息:\n\n```json\n{\n \"providers\": {\n \"openai\": {\n \"api_key\": \"sk-xxx\", // API 密钥\n \"api_base\": \"https://api.openai.com/v1\" // API 端点\n }\n }\n}\n```\n\n**多 Provider 场景**:\n\n```json\n{\n \"providers\": {\n \"openai\": {\n \"api_key\": \"sk-xxx\",\n \"api_base\": \"https://api.openai.com/v1\"\n },\n \"deepseek\": {\n \"api_key\": \"sk-yyy\",\n \"api_base\": \"https://api.deepseek.com\"\n },\n \"local\": {\n \"api_key\": \"not-needed\",\n \"api_base\": \"http://localhost:11434/v1\"\n }\n }\n}\n```\n\n**使用国内代理**:\n\n```json\n{\n \"providers\": {\n \"openai-proxy\": {\n \"api_key\": \"sk-xxx\",\n \"api_base\": \"https://your-proxy.com/v1\"\n }\n }\n}\n```\n\n### 6.5.4 channels 配置\n\nchannels 定义了消息通道(平台接入),详见 [09 - 多平台接入](../09-multi-platform/README.md):\n\n```json\n{\n \"channels\": {\n \"telegram\": {\n \"bot_token\": \"123456:ABC...\"\n },\n \"discord\": {\n \"bot_token\": \"MTIz...\"\n },\n \"feishu\": {\n \"app_id\": \"cli_xxx\",\n \"app_secret\": \"xxx\"\n }\n }\n}\n```\n\n### 6.5.5 tools 配置\n\ntools 部分配置工具相关的参数:\n\n```json\n{\n \"tools\": {\n \"web_search\": {\n \"provider\": \"brave\",\n \"api_key\": \"BSAxxxxxxxx\"\n },\n \"exec\": {\n \"allowed\": true\n }\n }\n}\n```\n\n### 6.5.6 配置文件查找顺序\n\nNanobot 按以下优先级查找配置:\n\n```\n1. 命令行参数指定 (最高优先级)\n2. 当前目录 config.json\n3. ~/.config/nanobot/config.json\n4. 环境变量\n5. 内置默认值 (最低优先级)\n```\n\n---\n\n## 6.6 第一次运行:交互模式\n\n### 6.6.1 启动 Agent\n\n```bash\n# 在配置好的 workspace 目录下\ncd my-agent\n\n# 直接运行(进入交互模式)\nnanobot\n```\n\n### 6.6.2 交互界面\n\n启动后你会看到一个交互式命令行界面:\n\n```\n🤖 Nanobot v0.x.x\n📂 Workspace: /Users/you/my-agent\n🧠 Model: gpt-4o (openai)\n\nYou: 你好,请介绍一下你自己\n\nAgent: 你好!我是一个 AI 助手,运行在 Nanobot 框架上...\n\nYou: 帮我创建一个 hello.py 文件\n\nAgent: 好的,我来帮你创建文件。\n[调用工具: write_file]\n[文件已创建: hello.py]\n\nYou: /quit\n```\n\n### 6.6.3 常用交互命令\n\n| 命令 | 说明 |\n|------|------|\n| 直接输入 | 与 Agent 对话 |\n| `/quit` 或 `Ctrl+C` | 退出交互模式 |\n| 多行输入 | 部分终端支持 Shift+Enter |\n\n### 6.6.4 观察 Agent 的行为\n\n运行后,注意观察以下几点(这些都是面试可以聊的素材):\n\n1. **System Prompt 加载**:Agent 启动时读取 AGENTS.md、MEMORY.md 等文件构建系统提示词\n2. **工具调用**:当你让 Agent 操作文件时,可以看到它调用了哪些工具\n3. **记忆保存**:退出时观察 memory/ 目录的变化\n4. **会话历史**:sessions/ 目录下会生成 JSONL 格式的会话记录\n\n```bash\n# 运行后查看生成的文件\ntree my-agent/\n# my-agent/\n# ├── config.json\n# ├── AGENTS.md\n# ├── memory/\n# │ ├── MEMORY.md\n# │ └── HISTORY.md\n# └── sessions/\n# └── cli:default.jsonl\n```\n\n---\n\n## 6.7 自定义 AGENTS.md:定义 Agent 身份\n\n### 6.7.1 AGENTS.md 的作用\n\n`AGENTS.md` 是 Nanobot 中定义 Agent 身份和行为的核心文件。它的内容会被注入到 System Prompt 中,决定了 Agent \"是谁\"、\"能做什么\"、\"怎么做\"。\n\n### 6.7.2 基础格式\n\n```markdown\n# My Assistant\n\n你是一个专业的编程助手,擅长 Python 和 JavaScript 开发。\n\n## 行为准则\n\n- 回答问题时要准确、简洁\n- 编写代码时注重可读性和可维护性\n- 遇到不确定的问题要诚实说明\n\n## 专业领域\n\n- Python 后端开发\n- React 前端开发\n- 数据库设计与优化\n```\n\n### 6.7.3 高级 AGENTS.md 示例\n\n```markdown\n# 技术面试教练\n\n你是一位经验丰富的技术面试教练,专门帮助候选人准备 AI Agent 方向的面试。\n\n## 核心职责\n\n1. **知识讲解**:深入浅出地解释 AI Agent 相关概念\n2. **模拟面试**:模拟真实面试场景进行提问\n3. **答案优化**:帮助候选人优化回答的结构和表达\n4. **查漏补缺**:发现知识盲区并提供学习建议\n\n## 回答风格\n\n- 先给结论,再展开解释\n- 使用\"总-分-总\"的结构\n- 适当使用类比帮助理解\n- 每个回答控制在 3 分钟以内\n\n## 工具使用\n\n- 使用 `read_file` 查阅参考资料\n- 使用 `web_search` 搜索最新面试题\n- 使用 `write_file` 生成面试笔记\n```\n\n### 6.7.4 AGENTS.md 与 System Prompt 的关系\n\n```\nSystem Prompt 构建过程:\n┌──────────────────────────────────┐\n│ 1. 内置基础指令(Nanobot 框架) │\n│ 2. SOUL.md(全局人格指引) │\n│ 3. AGENTS.md(Agent 身份定义) │\n│ 4. USER.md(用户信息) │\n│ 5. TOOLS.md(工具使用指引) │\n│ 6. MEMORY.md(长期记忆) │\n│ 7. 技能摘要(Skills 目录) │\n│ = 最终 System Prompt │\n└──────────────────────────────────┘\n```\n\n---\n\n## 6.8 引导文件体系\n\nNanobot 通过一组 Markdown 文件来引导 Agent 的行为,这是其\"Markdown 即配置\"理念的体现。\n\n### 6.8.1 SOUL.md —— 全局人格\n\n```markdown\n# SOUL.md 示例\n\n你是一个友好、专业、有耐心的 AI 助手。\n\n## 价值观\n- 诚实:不确定时承认不知道\n- 安全:不执行可能造成损害的操作\n- 隐私:尊重用户的隐私数据\n\n## 沟通风格\n- 使用简体中文\n- 语气专业但不刻板\n- 适当使用例子帮助理解\n```\n\n**SOUL.md 的特点**:\n- 存放位置:workspace 根目录\n- 注入时机:始终注入 System Prompt\n- 作用范围:影响 Agent 的整体人格和价值观\n- 优先级:高于 AGENTS.md\n\n### 6.8.2 USER.md —— 用户画像\n\n```markdown\n# USER.md 示例\n\n## 用户信息\n- 名称:小明\n- 角色:初级后端开发工程师\n- 技术栈:Python, FastAPI, PostgreSQL\n- 目标:准备 AI Agent 方向的面试\n\n## 偏好\n- 喜欢看代码示例\n- 偏好简体中文\n- 需要详细解释概念\n```\n\n**USER.md 的作用**:\n- 帮助 Agent 了解用户背景,提供个性化回答\n- 用户可以随时修改,Agent 会感知变化\n- 减少每次对话中重复描述自己的需求\n\n### 6.8.3 TOOLS.md —— 工具使用指引\n\n```markdown\n# TOOLS.md 示例\n\n## 文件操作规范\n- 创建文件前先用 list_dir 检查目录结构\n- 修改文件时优先使用 edit_file 而非 write_file\n- 重要文件修改前先备份\n\n## Shell 命令规范\n- 避免使用 rm -rf\n- 长时间运行的命令使用后台模式\n- 安装包时使用 --yes 避免交互确认\n\n## 搜索规范\n- 优先使用 web_search 获取最新信息\n- 搜索结果需要验证可靠性\n```\n\n### 6.8.4 文件优先级与覆盖关系\n\n```\n优先级从高到低:\nSOUL.md > AGENTS.md > USER.md > TOOLS.md\n │ │ │ │\n └── 人格 └── 身份 └── 用户 └── 工具\n```\n\n---\n\n## 6.9 常见问题排错\n\n### 6.9.1 安装问题\n\n**问题 1:`nanobot: command not found`**\n\n```bash\n# 原因:安装路径不在 PATH 中\n# 解决方案 1:检查 pip 安装路径\npip show nanobot-ai | grep Location\n\n# 解决方案 2:使用 python -m\npython -m nanobot\n\n# 解决方案 3:使用 uv 重新安装\nuv tool install nanobot-ai\n```\n\n**问题 2:Python 版本不兼容**\n\n```bash\n# 报错:requires Python >= 3.10\n# 解决:升级 Python\npyenv install 3.12.0\npyenv global 3.12.0\n\n# 或使用 conda\nconda create -n nanobot python=3.12 -y\n```\n\n**问题 3:依赖冲突**\n\n```bash\n# 使用虚拟环境隔离\npython -m venv nanobot-env\nsource nanobot-env/bin/activate\npip install nanobot-ai\n```\n\n### 6.9.2 配置问题\n\n**问题 4:API Key 无效**\n\n```bash\n# 报错:Authentication failed / Invalid API key\n# 排查步骤:\n# 1. 确认 key 是否正确复制(无多余空格)\n# 2. 确认 provider 与 key 匹配\n# 3. 测试 key 是否有效\ncurl https://api.openai.com/v1/models \\\n -H \"Authorization: Bearer sk-xxx\"\n```\n\n**问题 5:模型不存在**\n\n```bash\n# 报错:Model not found\n# 原因:model 字段与 provider 不匹配\n# 例如:provider 设置为 deepseek,但 model 设置为 gpt-4o\n\n# 正确配置:\n# provider: \"deepseek\" → model: \"deepseek-chat\"\n# provider: \"openai\" → model: \"gpt-4o\"\n```\n\n**问题 6:连接超时**\n\n```bash\n# 国内用户常见问题\n# 解决方案 1:使用代理\nexport https_proxy=http://127.0.0.1:7890\n\n# 解决方案 2:使用国内 Provider\n# 配置 DeepSeek 或其他国内模型服务\n\n# 解决方案 3:使用 api_base 指向代理地址\n{\n \"providers\": {\n \"openai\": {\n \"api_key\": \"sk-xxx\",\n \"api_base\": \"https://your-proxy.example.com/v1\"\n }\n }\n}\n```\n\n### 6.9.3 运行时问题\n\n**问题 7:记忆文件找不到**\n\n```bash\n# 确认 workspace 配置是否正确\ncat config.json | python -m json.tool | grep workspace\n\n# 手动创建记忆目录\nmkdir -p memory\n```\n\n**问题 8:工具调用失败**\n\n```bash\n# 常见原因:\n# 1. restrict_to_workspace 限制了文件访问范围\n# 2. exec 工具被禁用\n# 3. web_search 没有配置 API Key\n\n# 检查工具配置\ncat config.json | python -m json.tool | grep -A 5 tools\n```\n\n---\n\n## 6.10 实战练习\n\n### 练习 1:创建一个翻译助手\n\n```bash\n# 1. 创建项目目录\nmkdir translator-agent && cd translator-agent\n\n# 2. 初始化配置\nnanobot onboard\n\n# 3. 创建 AGENTS.md\ncat > AGENTS.md << 'EOF'\n# 翻译助手\n\n你是一个专业的中英互译助手。\n\n## 规则\n- 中文输入 → 翻译为英文\n- 英文输入 → 翻译为中文\n- 保持原文的语气和风格\n- 专业术语提供注释\nEOF\n\n# 4. 运行\nnanobot\n```\n\n### 练习 2:创建一个代码审查助手\n\n```bash\nmkdir code-reviewer && cd code-reviewer\nnanobot onboard\n```\n\n编写 AGENTS.md:\n\n```markdown\n# 代码审查助手\n\n你是一位资深的代码审查专家。\n\n## 职责\n1. 审查用户提供的代码\n2. 指出潜在的 Bug 和安全隐患\n3. 提供优化建议\n4. 检查代码风格一致性\n\n## 审查流程\n1. 先用 `read_file` 读取代码文件\n2. 分析代码结构和逻辑\n3. 逐一列出发现的问题\n4. 给出改进后的代码示例\n\n## 输出格式\n- 🔴 严重问题(必须修复)\n- 🟡 警告(建议修复)\n- 🟢 建议(可选优化)\n```\n\n### 练习 3:观察记忆系统\n\n```bash\n# 1. 启动 Agent,进行几轮对话\nnanobot\n\n# 2. 对话内容示例:\n# You: 我叫张三,是一名后端开发工程师\n# You: 我最近在学习 Kubernetes\n# You: 请记住我喜欢用 Python\n\n# 3. 退出后检查记忆文件\ncat memory/MEMORY.md\ncat memory/HISTORY.md\n\n# 4. 重新启动,验证 Agent 是否记住了你的信息\nnanobot\n# You: 我叫什么名字?\n# Agent 应该能回答:你叫张三\n```\n\n---\n\n## 6.11 面试话术\n\n### 话术 1:描述你如何搭建 Nanobot 环境\n\n> **面试官**:你有使用过 AI Agent 框架吗?能描述一下搭建过程吗?\n>\n> **参考回答**:\n>\n> \"有的,我深入学习并使用过 HKUDS/nanobot 框架。搭建过程主要分几步:\n>\n> 首先是环境准备,Nanobot 要求 Python 3.10 以上,我用的是 uv 来安装,因为它比 pip 快很多。安装命令是 `uv tool install nanobot-ai`,这样会创建独立的虚拟环境,不污染全局。\n>\n> 然后运行 `nanobot onboard` 进行交互式配置,主要是选择 LLM Provider、填入 API Key、选择默认模型。它会生成一个 config.json 文件。\n>\n> 配置文件里有几个关键参数我特别关注:`context_window_tokens` 控制上下文窗口大小,直接影响记忆压缩的触发时机;`max_tool_iterations` 限制了单次对话中工具调用次数,防止 Agent 陷入死循环。\n>\n> 最后通过 AGENTS.md 定义 Agent 的身份和行为规范,就可以运行 `nanobot` 启动交互模式了。整个过程大概 10 分钟就能跑起来一个可用的 Agent。\"\n\n### 话术 2:配置文件的设计理念\n\n> **面试官**:你觉得 Nanobot 的配置设计有什么特点?\n>\n> **参考回答**:\n>\n> \"Nanobot 的配置设计体现了 **Markdown 即配置** 的理念,这是它区别于其他框架的一大特色。\n>\n> 具体来说,它用 JSON 文件管理技术配置(API Key、模型参数等),用 Markdown 文件管理行为配置(Agent 身份、用户画像、使用规范等)。这种分离很优雅:JSON 给机器读,Markdown 给人和 AI 读。\n>\n> 特别值得一提的是它的引导文件体系——SOUL.md 定义人格、AGENTS.md 定义身份、USER.md 定义用户画像、TOOLS.md 定义工具规范——这四个文件共同构建了一个层次清晰的 System Prompt。这种设计让非技术人员也能通过修改 Markdown 来定制 Agent 行为,大大降低了使用门槛。\"\n\n### 话术 3:遇到的问题和解决方案\n\n> **面试官**:搭建过程中遇到过什么问题吗?\n>\n> **参考回答**:\n>\n> \"遇到过几个典型问题。一个是 API 连接超时,因为在国内直连 OpenAI API 不稳定,我的解决方案是在 config.json 的 providers 里把 api_base 改为代理地址,也可以直接换用 DeepSeek 这样的国内 Provider。\n>\n> 另一个是 context_window_tokens 的设置问题。一开始我设得比较大,结果发现记忆压缩一直不触发,对话越来越长导致 API 费用很高。后来理解了这个参数的作用——当 `estimate_prompt_tokens_chain` 超过这个值时才会触发 MemoryConsolidator——就把它调到了一个合理的范围。\n>\n> 还有一个工具调用权限的问题,默认的 `restrict_to_workspace` 配置会限制 Agent 只能操作 workspace 内的文件,一开始没理解,尝试让 Agent 操作外部文件时总是失败。理解了这个安全机制后,我反而觉得这是一个很好的设计。\"\n\n---\n\n## 6.12 本章小结\n\n### 核心知识点回顾\n\n| 知识点 | 要点 |\n|--------|------|\n| 安装方式 | pip install / uv tool install / 源码安装 |\n| 配置向导 | `nanobot onboard` 交互式生成 config.json |\n| 核心配置 | agents.defaults / providers / channels / tools |\n| 关键参数 | context_window_tokens, max_tool_iterations |\n| 引导文件 | SOUL.md → AGENTS.md → USER.md → TOOLS.md |\n| 运行模式 | `nanobot` 直接进入交互模式 |\n\n### 面试核心要点\n\n1. **安装方式**:推荐 uv,解释 uv 的优势\n2. **配置设计**:JSON + Markdown 双配置体系\n3. **关键参数**:context_window_tokens 与记忆压缩的关系\n4. **引导文件**:四层引导体系的设计理念\n5. **实际经验**:能描述具体问题和解决方案\n\n---\n\n> **下一章**:[07 - 记忆系统实战](../07-memory-system/README.md) —— 深入理解 Nanobot 的双层记忆架构"}, "bc2575b10d4d6b0264e05cfceb0591a92c6fbd68": {"t": 1785765185.23757, "n": 15197, "h": "30d96d61f238da06", "c": "# 06 - 安装与上手\n\n> **阅读时间**:约 2 小时 \n> **前置知识**:[05 - MCP 协议详解](../05-mcp-protocol/README.md) \n> **学习目标**:完成 Nanobot 的安装配置,运行你的第一个 AI Agent,理解全部配置项\n\n---\n\n## 目录\n\n- [6.1 为什么需要动手实践](#61-为什么需要动手实践)\n- [6.2 环境准备](#62-环境准备)\n- [6.3 安装 Nanobot](#63-安装-nanobot)\n- [6.4 配置向导 nanobot onboard](#64-配置向导-nanobot-onboard)\n- [6.5 config.json 配置详解](#65-configjson-配置详解)\n- [6.6 第一次运行:交互模式](#66-第一次运行交互模式)\n- [6.7 自定义 AGENTS.md:定义 Agent 身份](#67-自定义-agentsmd定义-agent-身份)\n- [6.8 引导文件体系](#68-引导文件体系)\n- [6.9 常见问题排错](#69-常见问题排错)\n- [6.10 实战练习](#610-实战练习)\n- [6.11 面试话术](#611-面试话术)\n- [6.12 本章小结](#612-本章小结)\n\n---\n\n## 6.1 为什么需要动手实践\n\n学习 AI Agent 框架,**纸上得来终觉浅**。在面试中,面试官最看重的不是你能背多少概念,而是:\n\n1. **你有没有真正用过?** —— 安装、配置、调试的全流程经验\n2. **你能不能描述细节?** —— 配置文件的字段含义、启动参数的作用\n3. **你遇到过什么问题?** —— 排错经历本身就是加分项\n\n> 💡 **面试真相**:一个能说出 \"我在配置 Nanobot 的 context_window_tokens 时发现设置过大会导致记忆压缩不触发\" 的候选人,比只能背概念的候选人强 10 倍。\n\n---\n\n## 6.2 环境准备\n\n### 6.2.1 系统要求\n\n| 项目 | 最低要求 | 推荐配置 |\n|------|---------|---------|\n| 操作系统 | macOS / Linux / Windows (WSL) | macOS / Ubuntu 22.04+ |\n| Python | 3.10+ | 3.11 或 3.12 |\n| 内存 | 4 GB | 8 GB+ |\n| 磁盘空间 | 500 MB | 2 GB+ |\n| 网络 | 可访问 LLM API | 稳定的国际网络 |\n\n### 6.2.2 Python 环境配置\n\n**方式一:使用系统 Python(简单)**\n\n```bash\n# 检查 Python 版本\npython3 --version\n# 输出应为 Python 3.10.x 或更高\n\n# 如果版本过低,使用 pyenv 安装\ncurl https://pyenv.run | bash\npyenv install 3.12.0\npyenv global 3.12.0\n```\n\n**方式二:使用 Conda(推荐隔离环境)**\n\n```bash\n# 创建独立环境\nconda create -n nanobot python=3.12 -y\nconda activate nanobot\n\n# 验证\npython --version\n# Python 3.12.x\n```\n\n**方式三:使用 uv(最快,推荐)**\n\n```bash\n# 安装 uv(Rust 编写的超快 Python 包管理器)\ncurl -LsSf https://astral.sh/uv/install.sh | sh\n\n# 验证\nuv --version\n```\n\n> 💡 **面试加分**:uv 是 Astral 公司用 Rust 编写的 Python 包管理工具,安装速度比 pip 快 10-100 倍。Nanobot 官方推荐使用 uv。\n\n### 6.2.3 LLM API Key 准备\n\nNanobot 需要连接大语言模型 API,支持多种 Provider:\n\n| Provider | 获取方式 | 推荐度 |\n|----------|---------|--------|\n| OpenAI | [platform.openai.com](https://platform.openai.com) | 首选 |\n| Anthropic (Claude) | [console.anthropic.com](https://console.anthropic.com) | 推荐 |\n| DeepSeek | [platform.deepseek.com](https://platform.deepseek.com) | 国内友好 |\n| OpenRouter | [openrouter.ai](https://openrouter.ai) | 聚合多模型 |\n| 本地模型 (Ollama) | [ollama.com](https://ollama.com) | 免费、离线 |\n\n```bash\n# 准备好你的 API Key\nexport OPENAI_API_KEY=\"sk-xxxxxxxxxxxxxxxxxxxxxxxx\"\n\n# 或者使用 DeepSeek(国内推荐)\nexport DEEPSEEK_API_KEY=\"sk-xxxxxxxxxxxxxxxxxxxxxxxx\"\n```\n\n---\n\n## 6.3 安装 Nanobot\n\n### 6.3.1 方式一:pip 安装(通用)\n\n```bash\n# 安装最新版\npip install nanobot-ai\n\n# 验证安装\nnanobot --version\n\n# 查看帮助\nnanobot --help\n```\n\n### 6.3.2 方式二:uv 工具安装(推荐)\n\n```bash\n# 使用 uv 安装为全局工具\nuv tool install nanobot-ai\n\n# 验证\nnanobot --version\n```\n\n> **uv tool install vs pip install 的区别**:\n> - `uv tool install` 会创建独立的虚拟环境,不污染全局 Python 环境\n> - `pip install` 直接安装到当前 Python 环境\n> - 推荐使用 uv,尤其是需要在多个项目中使用不同版本时\n\n### 6.3.3 方式三:从源码安装(开发者)\n\n```bash\n# 克隆源码\ngit clone https://github.com/HKUDS/nanobot.git\ncd nanobot\n\n# 使用 uv 安装开发依赖\nuv sync --dev\n\n# 或使用 pip\npip install -e \".[dev]\"\n```\n\n### 6.3.4 安装后验证\n\n```bash\n# 验证命令是否可用\nwhich nanobot\n\n# 查看版本\nnanobot --version\n\n# 查看所有子命令\nnanobot --help\n```\n\n预期输出类似:\n\n```\nUsage: nanobot [OPTIONS] COMMAND [ARGS]...\n\nOptions:\n --version Show version and exit.\n --help Show this message and exit.\n\nCommands:\n onboard Interactive setup wizard\n ...\n```\n\n---\n\n## 6.4 配置向导 nanobot onboard\n\n### 6.4.1 运行配置向导\n\nNanobot 提供了一个交互式配置向导,帮助你快速完成初始配置:\n\n```bash\n# 在你想要作为 workspace 的目录下运行\nmkdir my-agent && cd my-agent\nnanobot onboard\n```\n\n### 6.4.2 向导流程详解\n\n配置向导会依次引导你完成以下步骤:\n\n```\nStep 1: 选择 LLM Provider\n → OpenAI / Anthropic / DeepSeek / OpenRouter / Custom\n\nStep 2: 输入 API Key\n → 输入你的 API Key(会被安全存储)\n\nStep 3: 选择默认模型\n → gpt-4o / claude-sonnet-4-20250514 / deepseek-chat / ...\n\nStep 4: 配置 Workspace\n → 当前目录 / 自定义目录\n\nStep 5: 生成配置文件\n → 自动创建 config.json\n```\n\n### 6.4.3 向导生成的文件\n\n运行完 `nanobot onboard` 后,你会得到:\n\n```\nmy-agent/\n├── config.json # 主配置文件\n├── AGENTS.md # Agent 身份定义(可能自动生成)\n└── memory/ # 记忆存储目录\n └── MEMORY.md # 长期记忆文件\n```\n\n---\n\n## 6.5 config.json 配置详解\n\n这是 Nanobot 最核心的配置文件,理解每个字段对面试至关重要。\n\n### 6.5.1 完整配置示例\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"workspace\": \".\",\n \"model\": \"gpt-4o\",\n \"provider\": \"openai\",\n \"max_tokens\": 16384,\n \"context_window_tokens\": 128000,\n \"temperature\": 0.7,\n \"max_tool_iterations\": 40\n }\n },\n \"providers\": {\n \"openai\": {\n \"api_key\": \"sk-xxxxxxxxxxxxxxxxxxxxxxxx\",\n \"api_base\": \"https://api.openai.com/v1\"\n },\n \"deepseek\": {\n \"api_key\": \"sk-xxxxxxxxxxxxxxxxxxxxxxxx\",\n \"api_base\": \"https://api.deepseek.com\"\n },\n \"ollama\": {\n \"api_key\": \"ollama\",\n \"api_base\": \"http://localhost:11434/v1\"\n }\n },\n \"channels\": {\n \"telegram\": {\n \"bot_token\": \"123456:ABC-DEF...\"\n }\n },\n \"tools\": {\n \"web_search\": {\n \"provider\": \"brave\",\n \"api_key\": \"BSA...\"\n }\n }\n}\n```\n\n### 6.5.2 agents.defaults 字段详解\n\n| 字段 | 类型 | 默认值 | 说明 |\n|------|------|--------|------|\n| `workspace` | string | `\".\"` | Agent 的工作目录,所有文件操作基于此路径 |\n| `model` | string | `\"gpt-4o\"` | 使用的 LLM 模型标识 |\n| `provider` | string | `\"openai\"` | LLM 服务提供商,对应 providers 中的 key |\n| `max_tokens` | int | `16384` | 单次 LLM 回复的最大 token 数 |\n| `context_window_tokens` | int | `128000` | 上下文窗口大小,直接影响记忆压缩触发时机 |\n| `temperature` | float | `0.7` | 生成随机性,0=确定性,1=高随机性 |\n| `max_tool_iterations` | int | `40` | 单次对话中工具调用的最大迭代次数 |\n\n**关键理解**:\n\n```\ncontext_window_tokens 的作用:\n┌──────────────────────────────────────────────────┐\n│ context_window_tokens = 128000 │\n│ ┌──────────┐ ┌──────────┐ ┌─────────────────┐ │\n│ │ System │ │ Memory │ │ Conversation │ │\n│ │ Prompt │ │ MEMORY.md│ │ History │ │\n│ │ ~2000 │ │ ~1000 │ │ 不断增长... │ │\n│ └──────────┘ └──────────┘ └─────────────────┘ │\n│ │\n│ 当总 token 数接近 128000 时 → 触发记忆压缩 │\n└──────────────────────────────────────────────────┘\n```\n\n> 💡 **面试要点**:`context_window_tokens` 不是越大越好。设置过大会导致:\n> 1. 记忆压缩不触发,旧对话堆积导致 API 费用暴增\n> 2. 模型注意力分散,回答质量下降\n> 3. 超过模型实际支持的窗口会直接报错\n\n### 6.5.3 providers 配置\n\nproviders 定义了 LLM 服务的连接信息:\n\n```json\n{\n \"providers\": {\n \"openai\": {\n \"api_key\": \"sk-xxx\", // API 密钥\n \"api_base\": \"https://api.openai.com/v1\" // API 端点\n }\n }\n}\n```\n\n**多 Provider 场景**:\n\n```json\n{\n \"providers\": {\n \"openai\": {\n \"api_key\": \"sk-xxx\",\n \"api_base\": \"https://api.openai.com/v1\"\n },\n \"deepseek\": {\n \"api_key\": \"sk-yyy\",\n \"api_base\": \"https://api.deepseek.com\"\n },\n \"local\": {\n \"api_key\": \"not-needed\",\n \"api_base\": \"http://localhost:11434/v1\"\n }\n }\n}\n```\n\n**使用国内代理**:\n\n```json\n{\n \"providers\": {\n \"openai-proxy\": {\n \"api_key\": \"sk-xxx\",\n \"api_base\": \"https://your-proxy.com/v1\"\n }\n }\n}\n```\n\n### 6.5.4 channels 配置\n\nchannels 定义了消息通道(平台接入),详见 [09 - 多平台接入](../09-multi-platform/README.md):\n\n```json\n{\n \"channels\": {\n \"telegram\": {\n \"bot_token\": \"123456:ABC...\"\n },\n \"discord\": {\n \"bot_token\": \"MTIz...\"\n },\n \"feishu\": {\n \"app_id\": \"cli_xxx\",\n \"app_secret\": \"xxx\"\n }\n }\n}\n```\n\n### 6.5.5 tools 配置\n\ntools 部分配置工具相关的参数:\n\n```json\n{\n \"tools\": {\n \"web_search\": {\n \"provider\": \"brave\",\n \"api_key\": \"BSAxxxxxxxx\"\n },\n \"exec\": {\n \"allowed\": true\n }\n }\n}\n```\n\n### 6.5.6 配置文件查找顺序\n\nNanobot 按以下优先级查找配置:\n\n```\n1. 命令行参数指定 (最高优先级)\n2. 当前目录 config.json\n3. ~/.config/nanobot/config.json\n4. 环境变量\n5. 内置默认值 (最低优先级)\n```\n\n---\n\n## 6.6 第一次运行:交互模式\n\n### 6.6.1 启动 Agent\n\n```bash\n# 在配置好的 workspace 目录下\ncd my-agent\n\n# 直接运行(进入交互模式)\nnanobot\n```\n\n### 6.6.2 交互界面\n\n启动后你会看到一个交互式命令行界面:\n\n```\n🤖 Nanobot v0.x.x\n📂 Workspace: /Users/you/my-agent\n🧠 Model: gpt-4o (openai)\n\nYou: 你好,请介绍一下你自己\n\nAgent: 你好!我是一个 AI 助手,运行在 Nanobot 框架上...\n\nYou: 帮我创建一个 hello.py 文件\n\nAgent: 好的,我来帮你创建文件。\n[调用工具: write_file]\n[文件已创建: hello.py]\n\nYou: /quit\n```\n\n### 6.6.3 常用交互命令\n\n| 命令 | 说明 |\n|------|------|\n| 直接输入 | 与 Agent 对话 |\n| `/quit` 或 `Ctrl+C` | 退出交互模式 |\n| 多行输入 | 部分终端支持 Shift+Enter |\n\n### 6.6.4 观察 Agent 的行为\n\n运行后,注意观察以下几点(这些都是面试可以聊的素材):\n\n1. **System Prompt 加载**:Agent 启动时读取 AGENTS.md、MEMORY.md 等文件构建系统提示词\n2. **工具调用**:当你让 Agent 操作文件时,可以看到它调用了哪些工具\n3. **记忆保存**:退出时观察 memory/ 目录的变化\n4. **会话历史**:sessions/ 目录下会生成 JSONL 格式的会话记录\n\n```bash\n# 运行后查看生成的文件\ntree my-agent/\n# my-agent/\n# ├── config.json\n# ├── AGENTS.md\n# ├── memory/\n# │ ├── MEMORY.md\n# │ └── HISTORY.md\n# └── sessions/\n# └── cli:default.jsonl\n```\n\n---\n\n## 6.7 自定义 AGENTS.md:定义 Agent 身份\n\n### 6.7.1 AGENTS.md 的作用\n\n`AGENTS.md` 是 Nanobot 中定义 Agent 身份和行为的核心文件。它的内容会被注入到 System Prompt 中,决定了 Agent \"是谁\"、\"能做什么\"、\"怎么做\"。\n\n### 6.7.2 基础格式\n\n```markdown\n# My Assistant\n\n你是一个专业的编程助手,擅长 Python 和 JavaScript 开发。\n\n## 行为准则\n\n- 回答问题时要准确、简洁\n- 编写代码时注重可读性和可维护性\n- 遇到不确定的问题要诚实说明\n\n## 专业领域\n\n- Python 后端开发\n- React 前端开发\n- 数据库设计与优化\n```\n\n### 6.7.3 高级 AGENTS.md 示例\n\n```markdown\n# 技术面试教练\n\n你是一位经验丰富的技术面试教练,专门帮助候选人准备 AI Agent 方向的面试。\n\n## 核心职责\n\n1. **知识讲解**:深入浅出地解释 AI Agent 相关概念\n2. **模拟面试**:模拟真实面试场景进行提问\n3. **答案优化**:帮助候选人优化回答的结构和表达\n4. **查漏补缺**:发现知识盲区并提供学习建议\n\n## 回答风格\n\n- 先给结论,再展开解释\n- 使用\"总-分-总\"的结构\n- 适当使用类比帮助理解\n- 每个回答控制在 3 分钟以内\n\n## 工具使用\n\n- 使用 `read_file` 查阅参考资料\n- 使用 `web_search` 搜索最新面试题\n- 使用 `write_file` 生成面试笔记\n```\n\n### 6.7.4 AGENTS.md 与 System Prompt 的关系\n\n```\nSystem Prompt 构建过程:\n┌──────────────────────────────────┐\n│ 1. 内置基础指令(Nanobot 框架) │\n│ 2. SOUL.md(全局人格指引) │\n│ 3. AGENTS.md(Agent 身份定义) │\n│ 4. USER.md(用户信息) │\n│ 5. TOOLS.md(工具使用指引) │\n│ 6. MEMORY.md(长期记忆) │\n│ 7. 技能摘要(Skills 目录) │\n│ = 最终 System Prompt │\n└──────────────────────────────────┘\n```\n\n---\n\n## 6.8 引导文件体系\n\nNanobot 通过一组 Markdown 文件来引导 Agent 的行为,这是其\"Markdown 即配置\"理念的体现。\n\n### 6.8.1 SOUL.md —— 全局人格\n\n```markdown\n# SOUL.md 示例\n\n你是一个友好、专业、有耐心的 AI 助手。\n\n## 价值观\n- 诚实:不确定时承认不知道\n- 安全:不执行可能造成损害的操作\n- 隐私:尊重用户的隐私数据\n\n## 沟通风格\n- 使用简体中文\n- 语气专业但不刻板\n- 适当使用例子帮助理解\n```\n\n**SOUL.md 的特点**:\n- 存放位置:workspace 根目录\n- 注入时机:始终注入 System Prompt\n- 作用范围:影响 Agent 的整体人格和价值观\n- 优先级:高于 AGENTS.md\n\n### 6.8.2 USER.md —— 用户画像\n\n```markdown\n# USER.md 示例\n\n## 用户信息\n- 名称:小明\n- 角色:初级后端开发工程师\n- 技术栈:Python, FastAPI, PostgreSQL\n- 目标:准备 AI Agent 方向的面试\n\n## 偏好\n- 喜欢看代码示例\n- 偏好简体中文\n- 需要详细解释概念\n```\n\n**USER.md 的作用**:\n- 帮助 Agent 了解用户背景,提供个性化回答\n- 用户可以随时修改,Agent 会感知变化\n- 减少每次对话中重复描述自己的需求\n\n### 6.8.3 TOOLS.md —— 工具使用指引\n\n```markdown\n# TOOLS.md 示例\n\n## 文件操作规范\n- 创建文件前先用 list_dir 检查目录结构\n- 修改文件时优先使用 edit_file 而非 write_file\n- 重要文件修改前先备份\n\n## Shell 命令规范\n- 避免使用 rm -rf\n- 长时间运行的命令使用后台模式\n- 安装包时使用 --yes 避免交互确认\n\n## 搜索规范\n- 优先使用 web_search 获取最新信息\n- 搜索结果需要验证可靠性\n```\n\n### 6.8.4 文件优先级与覆盖关系\n\n```\n优先级从高到低:\nSOUL.md > AGENTS.md > USER.md > TOOLS.md\n │ │ │ │\n └── 人格 └── 身份 └── 用户 └── 工具\n```\n\n---\n\n## 6.9 常见问题排错\n\n### 6.9.1 安装问题\n\n**问题 1:`nanobot: command not found`**\n\n```bash\n# 原因:安装路径不在 PATH 中\n# 解决方案 1:检查 pip 安装路径\npip show nanobot-ai | grep Location\n\n# 解决方案 2:使用 python -m\npython -m nanobot\n\n# 解决方案 3:使用 uv 重新安装\nuv tool install nanobot-ai\n```\n\n**问题 2:Python 版本不兼容**\n\n```bash\n# 报错:requires Python >= 3.10\n# 解决:升级 Python\npyenv install 3.12.0\npyenv global 3.12.0\n\n# 或使用 conda\nconda create -n nanobot python=3.12 -y\n```\n\n**问题 3:依赖冲突**\n\n```bash\n# 使用虚拟环境隔离\npython -m venv nanobot-env\nsource nanobot-env/bin/activate\npip install nanobot-ai\n```\n\n### 6.9.2 配置问题\n\n**问题 4:API Key 无效**\n\n```bash\n# 报错:Authentication failed / Invalid API key\n# 排查步骤:\n# 1. 确认 key 是否正确复制(无多余空格)\n# 2. 确认 provider 与 key 匹配\n# 3. 测试 key 是否有效\ncurl https://api.openai.com/v1/models \\\n -H \"Authorization: Bearer sk-xxx\"\n```\n\n**问题 5:模型不存在**\n\n```bash\n# 报错:Model not found\n# 原因:model 字段与 provider 不匹配\n# 例如:provider 设置为 deepseek,但 model 设置为 gpt-4o\n\n# 正确配置:\n# provider: \"deepseek\" → model: \"deepseek-chat\"\n# provider: \"openai\" → model: \"gpt-4o\"\n```\n\n**问题 6:连接超时**\n\n```bash\n# 国内用户常见问题\n# 解决方案 1:使用代理\nexport https_proxy=http://127.0.0.1:7890\n\n# 解决方案 2:使用国内 Provider\n# 配置 DeepSeek 或其他国内模型服务\n\n# 解决方案 3:使用 api_base 指向代理地址\n{\n \"providers\": {\n \"openai\": {\n \"api_key\": \"sk-xxx\",\n \"api_base\": \"https://your-proxy.example.com/v1\"\n }\n }\n}\n```\n\n### 6.9.3 运行时问题\n\n**问题 7:记忆文件找不到**\n\n```bash\n# 确认 workspace 配置是否正确\ncat config.json | python -m json.tool | grep workspace\n\n# 手动创建记忆目录\nmkdir -p memory\n```\n\n**问题 8:工具调用失败**\n\n```bash\n# 常见原因:\n# 1. restrict_to_workspace 限制了文件访问范围\n# 2. exec 工具被禁用\n# 3. web_search 没有配置 API Key\n\n# 检查工具配置\ncat config.json | python -m json.tool | grep -A 5 tools\n```\n\n---\n\n## 6.10 实战练习\n\n### 练习 1:创建一个翻译助手\n\n```bash\n# 1. 创建项目目录\nmkdir translator-agent && cd translator-agent\n\n# 2. 初始化配置\nnanobot onboard\n\n# 3. 创建 AGENTS.md\ncat > AGENTS.md << 'EOF'\n# 翻译助手\n\n你是一个专业的中英互译助手。\n\n## 规则\n- 中文输入 → 翻译为英文\n- 英文输入 → 翻译为中文\n- 保持原文的语气和风格\n- 专业术语提供注释\nEOF\n\n# 4. 运行\nnanobot\n```\n\n### 练习 2:创建一个代码审查助手\n\n```bash\nmkdir code-reviewer && cd code-reviewer\nnanobot onboard\n```\n\n编写 AGENTS.md:\n\n```markdown\n# 代码审查助手\n\n你是一位资深的代码审查专家。\n\n## 职责\n1. 审查用户提供的代码\n2. 指出潜在的 Bug 和安全隐患\n3. 提供优化建议\n4. 检查代码风格一致性\n\n## 审查流程\n1. 先用 `read_file` 读取代码文件\n2. 分析代码结构和逻辑\n3. 逐一列出发现的问题\n4. 给出改进后的代码示例\n\n## 输出格式\n- 🔴 严重问题(必须修复)\n- 🟡 警告(建议修复)\n- 🟢 建议(可选优化)\n```\n\n### 练习 3:观察记忆系统\n\n```bash\n# 1. 启动 Agent,进行几轮对话\nnanobot\n\n# 2. 对话内容示例:\n# You: 我叫张三,是一名后端开发工程师\n# You: 我最近在学习 Kubernetes\n# You: 请记住我喜欢用 Python\n\n# 3. 退出后检查记忆文件\ncat memory/MEMORY.md\ncat memory/HISTORY.md\n\n# 4. 重新启动,验证 Agent 是否记住了你的信息\nnanobot\n# You: 我叫什么名字?\n# Agent 应该能回答:你叫张三\n```\n\n---\n\n## 6.11 面试话术\n\n### 话术 1:描述你如何搭建 Nanobot 环境\n\n> **面试官**:你有使用过 AI Agent 框架吗?能描述一下搭建过程吗?\n>\n> **参考回答**:\n>\n> \"有的,我深入学习并使用过 HKUDS/nanobot 框架。搭建过程主要分几步:\n>\n> 首先是环境准备,Nanobot 要求 Python 3.10 以上,我用的是 uv 来安装,因为它比 pip 快很多。安装命令是 `uv tool install nanobot-ai`,这样会创建独立的虚拟环境,不污染全局。\n>\n> 然后运行 `nanobot onboard` 进行交互式配置,主要是选择 LLM Provider、填入 API Key、选择默认模型。它会生成一个 config.json 文件。\n>\n> 配置文件里有几个关键参数我特别关注:`context_window_tokens` 控制上下文窗口大小,直接影响记忆压缩的触发时机;`max_tool_iterations` 限制了单次对话中工具调用次数,防止 Agent 陷入死循环。\n>\n> 最后通过 AGENTS.md 定义 Agent 的身份和行为规范,就可以运行 `nanobot` 启动交互模式了。整个过程大概 10 分钟就能跑起来一个可用的 Agent。\"\n\n### 话术 2:配置文件的设计理念\n\n> **面试官**:你觉得 Nanobot 的配置设计有什么特点?\n>\n> **参考回答**:\n>\n> \"Nanobot 的配置设计体现了 **Markdown 即配置** 的理念,这是它区别于其他框架的一大特色。\n>\n> 具体来说,它用 JSON 文件管理技术配置(API Key、模型参数等),用 Markdown 文件管理行为配置(Agent 身份、用户画像、使用规范等)。这种分离很优雅:JSON 给机器读,Markdown 给人和 AI 读。\n>\n> 特别值得一提的是它的引导文件体系——SOUL.md 定义人格、AGENTS.md 定义身份、USER.md 定义用户画像、TOOLS.md 定义工具规范——这四个文件共同构建了一个层次清晰的 System Prompt。这种设计让非技术人员也能通过修改 Markdown 来定制 Agent 行为,大大降低了使用门槛。\"\n\n### 话术 3:遇到的问题和解决方案\n\n> **面试官**:搭建过程中遇到过什么问题吗?\n>\n> **参考回答**:\n>\n> \"遇到过几个典型问题。一个是 API 连接超时,因为在国内直连 OpenAI API 不稳定,我的解决方案是在 config.json 的 providers 里把 api_base 改为代理地址,也可以直接换用 DeepSeek 这样的国内 Provider。\n>\n> 另一个是 context_window_tokens 的设置问题。一开始我设得比较大,结果发现记忆压缩一直不触发,对话越来越长导致 API 费用很高。后来理解了这个参数的作用——当 `estimate_prompt_tokens_chain` 超过这个值时才会触发 MemoryConsolidator——就把它调到了一个合理的范围。\n>\n> 还有一个工具调用权限的问题,默认的 `restrict_to_workspace` 配置会限制 Agent 只能操作 workspace 内的文件,一开始没理解,尝试让 Agent 操作外部文件时总是失败。理解了这个安全机制后,我反而觉得这是一个很好的设计。\"\n\n---\n\n## 6.12 本章小结\n\n### 核心知识点回顾\n\n| 知识点 | 要点 |\n|--------|------|\n| 安装方式 | pip install / uv tool install / 源码安装 |\n| 配置向导 | `nanobot onboard` 交互式生成 config.json |\n| 核心配置 | agents.defaults / providers / channels / tools |\n| 关键参数 | context_window_tokens, max_tool_iterations |\n| 引导文件 | SOUL.md → AGENTS.md → USER.md → TOOLS.md |\n| 运行模式 | `nanobot` 直接进入交互模式 |\n\n### 面试核心要点\n\n1. **安装方式**:推荐 uv,解释 uv 的优势\n2. **配置设计**:JSON + Markdown 双配置体系\n3. **关键参数**:context_window_tokens 与记忆压缩的关系\n4. **引导文件**:四层引导体系的设计理念\n5. **实际经验**:能描述具体问题和解决方案\n\n---\n\n> **下一章**:[07 - 记忆系统实战](../07-memory-system/README.md) —— 深入理解 Nanobot 的双层记忆架构"}}}}