17.1 实验一:实现一个简单的 LLM CLI 对话工具

模型: claude-opus-4-6 (anthropic/claude-opus-4-6) 生成日期: 2026-02-18


本章将通过五个递进式实验,带领读者从零开始构建一个 AI 编程助手的关键组件。每个实验都与前面章节分析的 OpenCode 源码直接对应——实验一对应第 4 章的 Session/LLM 模块,实验二对应第 5 章的 Tool 系统,实验三对应第 8 章的 MCP,实验四对应第 13 章的 Plugin 系统,实验五对应第 15 章的 oh-my-opencode 多 Agent 架构。

17.1.1 目标

搭建一个基于 Vercel AI SDK 的终端对话程序。完成后,你将拥有一个可以与 LLM 进行多轮流式对话的命令行工具——这正是 OpenCode 最底层的核心能力。

在 OpenCode 源码中,session/llm.ts 就是使用 Vercel AI SDK 的 streamText 函数与 LLM 通信的核心模块。我们的实验将还原这个核心逻辑。

衍生解释——Vercel AI SDK

Vercel AI SDK(npm 包名为 ai)是目前 JavaScript/TypeScript 生态中最流行的 AI 应用开发框架之一。它提供了统一的接口来调用不同的 LLM 提供商(OpenAI、Anthropic、Google 等),核心功能包括:

  • streamText():流式文本生成

  • generateText():一次性文本生成

  • tool():工具/函数定义

  • 统一的消息格式(CoreMessage

OpenCode 选择 Vercel AI SDK 而非直接调用各家 API,正是看中了它的提供商抽象层——相同的代码可以无缝切换不同的 LLM。

17.1.2 实现步骤

步骤一:初始化项目

ai 是 Vercel AI SDK 的核心包,@ai-sdk/openai 是 OpenAI 兼容的提供商适配器(也支持调用其他兼容 OpenAI API 格式的服务)。

步骤二:实现基础对话

创建 index.ts

步骤三:运行

此时你应该能看到类似这样的交互:

注意第二轮对话——LLM 能够回忆上一轮的内容,这证明 messages 数组正确地维护了对话历史。

步骤四:添加 System Prompt

OpenCode 使用精心设计的 System Prompt 来定义 Agent 的行为。让我们给 CLI 工具也添加一个:

system 参数对应 OpenCode 中 session/system.tsagent/prompt/*.txt 的功能——通过 System Prompt 定义 Agent 的角色、能力边界和行为规范。

17.1.3 知识点总结

LLM API 调用

与 LLM 的交互本质上是一次 HTTP POST 请求。Vercel AI SDK 封装了这个过程,但底层发生的是:

LLM 是无状态的——每次请求都需要发送完整的消息历史。模型本身不记住之前的对话,"记忆"完全依赖客户端维护的 messages 数组。这就是 OpenCode 的 Session 模块要解决的核心问题。

流式处理(Streaming)

streamText() 返回的是一个异步可迭代对象(AsyncIterable),LLM 的回复以小块(chunk)的形式逐步到达。流式处理有两个关键优势:

  1. 低延迟感知:用户可以在模型生成的同时看到输出,而不是等待完整回复

  2. 内存效率:不需要一次性加载完整响应到内存

在 OpenCode 中,session/llm.tsstream() 函数返回的也是 StreamTextResult,TUI 组件通过监听事件来实时更新界面。

消息历史

messages 数组是多轮对话的核心。每条消息包含 role(角色)和 content(内容):

role
含义
来源

system

系统指令

开发者定义

user

用户输入

用户

assistant

AI 回复

LLM 生成

在 OpenCode 中,消息历史被持久化到本地存储(~/.opencode/sessions/),这样用户关闭终端后重新打开可以恢复之前的对话。我们的实验目前只保存在内存中——持久化将在后续实验中逐步实现。

与 OpenCode 源码的对应

实验组件
OpenCode 对应

messages 数组

session/message-v2.ts 消息系统

streamText() 调用

session/llm.tsstream() 函数

System Prompt

session/system.ts + agent/prompt/*.txt

模型选择

provider/provider.ts 的 Provider 系统

readline 交互

cli/cmd/tui/ 的 TUI 系统

下一个实验中,我们将为这个 CLI 工具添加最关键的能力——Tool Use(工具调用),让 AI 能够读写文件和执行系统命令。

Last updated