目录
1. 项目背景与参考 2. 基础模型调用流程 3. 单次调用的局限性与手动执行 4. Agentic Loop 核心概念 5. 工具调用 (Tool Use) 规范 6. 完整 Agent 循环实现 7. 测试与验证
1. 项目背景与参考 Content-[00:00]
视频开启了一个新系列,旨在从零开始构建类似 Claude Code 的编程助手。
- 市场现状:目前市面上有许多编程工具,如 OpenAI 的 Codex、Toppy 的 Cloud Code,以及国内的 Kimi、MiniMax 等。
- 差距分析:不同工具之间的体验差距主要源于两点:
- 基座模型的能力差异。
- 整个 Code 系统的设计架构。
- 参考项目:本教程代码设计主要参考了 GitHub 上的开源项目
learn-claude-code(由 shanshail Lab 开发)。- 该项目 Star 数已达 17K+。
- 核心依赖极少,仅依赖 Anthropic SDK。
- 代码简洁但系统设计经过深思熟虑。

2. 基础模型调用流程 Content-[00:55]
回顾最原始的模型调用方式,即“用户输入 Prompt -> 调用 Model API -> 返回文本结果”。
- 环境配置:需要配置三个关键参数:
BASE_URLAPI_KEYMODEL_NAME(例如qwen-coder-plus)
- 初始化客户端:使用
Base_URL和API_KEY初始化 Client。 - 调用接口:使用
client.messages.create方法。- 指定
model名称。 - 组织
messages列表(包含role和content)。 - 设置
max_tokens(例如 200)。
- 指定
- 响应结构解析:
role: 通常为assistant。stop_reason: 标识对话是否结束(如end_turn)。content: 一个列表,包含具体的返回内容块。type: 消息类型(如text)。text: 具体的文本内容。

测试案例 1:简单数学计算
- 输入:
1+1 等于几 - 输出:模型正确返回文本结果
1+1=2。
测试案例 2:文件操作尝试
- 输入:
统计 flow.md 这个文件有多少字符 - 输出:模型返回文本建议(如使用
wc命令),但无法直接读取本地文件或执行命令。因为它只能返回文本,没有后续动作能力。

3. 单次调用的局限性与手动执行 Content-[03:55]
为了解决模型无法执行命令的问题,初步尝试通过 Prompt 工程让模型只返回 Linux 命令。
- Prompt 优化:告诉模型“只给我返回 Linux 命令”。
- 效果:模型返回了
wc -c flow.md。 - 手动执行:用户在终端手动运行该命令,得到结果
1093。 - 自动化思路:
- 提取命令:从模型的
response.content中提取文本,去除 Markdown 格式(如 “`bash)。 - 执行命令:使用 Python 的
subprocess模块运行提取出的命令。 - 获取输出:捕获
stdout作为最终结果。
- 提取命令:从模型的

局限性:这种方法仅适用于单步任务。对于复杂任务(如“找到最大的 Python 文件,统计函数数量,并在文件头写入注释”),模型无法一次性给出所有步骤,因为每一步的输入依赖于上一步的输出。
4. Agentic Loop 核心概念 Content-[07:44]
为了解决多步任务问题,引入了 Agentic Loop (代理循环) 概念。
- 核心逻辑:模型在循环中不断地 观察 (Observe) -> 决策 (Decide) -> 执行 (Execute)。
- 流程图对比:
- 原始模式:Chat Prompt -> Model API -> 返回文本 -> 结束。
- Agent 模式:增加了工具调用和结果反馈的闭环。
- 消息管理 (History):
- 每次调用模型时,必须将之前所有的交互消息(包括用户指令、模型回复、工具执行结果)拼接进
messages列表。 - 这样模型才能“记住”上下文和上一步的执行结果。
- 每次调用模型时,必须将之前所有的交互消息(包括用户指令、模型回复、工具执行结果)拼接进
- 循环终止条件:
- 当模型返回
stop_reason为end_turn且没有工具调用时,表示任务完成。 - 或者达到最大迭代次数。
- 当模型返回

5. 工具调用 (Tool Use) 规范 Content-[09:46]
为了让模型知道可以调用工具,需要在 API 请求中定义 tools 参数。
- Tools 定义结构:这是一个列表,每个工具包含以下字段:
name: 工具名称(例如bash)。description: 工具描述(告诉模型什么时候用这个工具)。input_schema: 输入参数的 JSON Schema。type:objectproperties: 定义参数(如command类型为string)。required: 必填参数字段列表。
- System Prompt:
- 设定角色:
You are a CLI agent... - 设定规则:优先使用工具,如何解释执行结果等。
- 设定角色:

响应变化:
- 当模型决定调用工具时,
stop_reason变为tool_use。 content列表中会出现type: tool_use的块,包含id,name,input等信息。

6. 完整 Agent 循环实现 Content-[12:00]
基于上述概念,构建完整的 while True 循环逻辑。
- 初始化 History:将用户的初始 Prompt 放入
history列表。 - 进入循环:
- 调用 API:传入
history和tools定义。 - 保存回复:将模型的原始回复(Assistant Message)追加到
history。 - 判断结束:检查
stop_reason。如果是end_turn,则跳出循环,输出最终文本。 - 处理工具调用:
- 遍历
content块,寻找type == 'tool_use'。 - 提取工具名称(如
bash)和输入参数(如command)。 - 执行工具:使用
subprocess.run执行命令,捕获stdout和stderr。 - 构造结果:创建一个新的消息块,
role: user,content: tool_result,包含工具执行的结果。 - 更新 History:将工具执行结果追加到
history,供下一轮模型观察。
- 遍历
- 调用 API:传入
- 重复:直到任务完成。

代码关键点:
- 需要处理
tool_use和tool_result的配对(通过tool_use_id)。 - 确保
history中消息角色的正确性(User/Assistant)。

7. 测试与验证 Content-[19:25]
对构建好的 BashAgent 进行实际任务测试。
- 测试案例 1:统计文件字符数
- 指令:
统计 flow.md 有多少个字符 - 过程:
- 模型调用
bash工具,命令wc -c flow.md。 - 系统执行命令,返回
1093 flow.md。 - 模型根据结果生成最终回复:
flow.md 文件包含 1093 个字符。
- 模型调用
- 结果:成功。
- 指令:

- 测试案例 2:统计目录下 Python 文件数量
- 指令:
统计当前目录下有几个 python 文件 - 过程:
- 模型调用
bash工具,命令find . -name "*.py" | wc -l(或类似命令)。 - 系统执行返回
6。 - 模型总结:
当前目录有 6 个 python 文件。
- 模型调用
- 结果:成功。
- 指令:

后续计划:
- 当前工具仅支持
bash。 - 下一步将添加更多工具,如
read_file(读取文件),edit_file(编辑文件) 等,以增强 Agent 能力。
AI 总结
本视频详细演示了如何从零开始构建一个基于 QwenCoderPlus 模型的 BashAgent。内容涵盖了从最基础的 API 调用,到发现单次调用的局限性,再到引入 Agentic Loop 和 Tool Use 机制来实现自动化的命令执行与多步任务处理。
核心要点包括:
- 系统架构:参考
learn-claude-code项目,保持核心依赖最小化。 - 交互闭环:通过
History管理上下文,实现Prompt -> Model -> Tool -> Result -> Model的循环。 - 工具定义:利用 API 的
tools参数规范模型行为,使其能够结构化地输出命令。 - 执行安全:使用 Python
subprocess安全地执行模型生成的 Bash 命令并捕获输出。
这为开发更复杂的 Coding Agent 奠定了坚实的基础。