玩转 AI Coding(二):基于opencode 的AI编程初体验
AI 工具概览
工欲善其事,必须先有器!要跑AI Coding,得先有个套AI 编程的工具。
市面上AI coding 的工具已经有很多,像 Cursor,Claude,Codex,Gemini等,想必已是耳熟能详。粗略地,可以将AI Coding 工具分为以下几类:
- 补全 / 协助型
典型是GitHub Copilot。它最早给人的直觉,就是“一个写在编辑器里的代码搭子”。现在官方能力已经不只是补全了,还延伸到了 chat、代码解释、PR、coding agent 等 GitHub 工作流场景,但它的根仍然长在 IDE 和 GitHub 生态里。 - IDE 一体化 AI 编辑器
典型是Cursor,还有更偏 AI-first IDE 路线的TRAE。这类工具的优势是“开箱即有感”。你打开编辑器,它就已经在那儿了,解释代码、改文件、聊天、批量编辑,交互体验会比传统 IDE 插件更顺。TRAE还会更强调 agent、builder、workspace 这类“工作区式协作”感。 - 终端里的 agent 型工具
典型是Claude Code、Codex、OpenCode。这类工具不只是陪你在编辑器里改几行代码,而是更像一个终端里的工程搭子:能读仓库、看文件、跑命令、给计划、改代码、做验证。差别在于它们各自的生态、云端策略、模型接入方式和权限边界设计不一样。这类工具是面向用户的的前侧agent,通常通过配置大模型接入地址和API_KEY实现大模型访问。 - 云端代理 / 异步委托型
这个方向Codex和GitHub Copilot coding agent都比较典型。它们会把一部分编码任务放到云端或托管环境里异步跑,再把结果回给你。好处是能并行干活,坏处也很现实:企业里会立刻多出一堆需要审查的问题,比如环境隔离、代码边界、审计、网络路径、数据驻留。
让AI绘了张插图,大概长这样(随便看看,不要计较是非对错,不要计较图文无关):

公司为何推opencode
上图中,其他工具都是商业工具,仅opencode 是开源工具。
那么,是因为开源免费么?
呃,不全是...
商用工具不是原罪,核心的是安全边界
AI还处于飞速发展阶段,各大模型厂商 明里暗里 的收集用户数据用户模型训练。这在行业内是公认的。
但对于商业公司,软件代码资产是最核心资产之一,绝不可以随意共享、分发。so,商业化项目中使用AI模型 和AI工具,需要严把安全关(因AI泄露产品代码、功能、设计的例子早有先例)。
opencode是一个专注于AI Coding的本地工具,不涉及定制化大模型(广泛适配市面主流的大模型),没有后台调度;加之是开源工具,可以进行代码安全审计,整体风险是可控的!
天翼云有自己的大模型(息壤),就差一个前端应用工具......
这不,一拍即合!
在后续的教学和演示中,我们主要基于 opencode + 息壤GLM-5.x; 实际应用中,也是这一套。
opencode 安装
opencode 是一个终端 TUI工具,linux 和macos支持得好, PowerShell 不建议,体验不好; Windows上 在WSL中玩吧...
首先,你得先安装 node.js, 且要求版本大于 20.19.
然后,用npm安装即可:
npm install -g opencode-ai
opencode --version
接入息壤 GLM-5.x
opencode 采用json配置文件,在 ~/.config/opencode/opencode.json 或 ~/.config/opencode/opencode.jsonc
配置文件模板大概长这样:
{
"share": "disabled",
"provider": {
"xirang": {
"npm": "@ai-sdk/openai-compatible",
"name": "Xirang",
"options": {
"baseURL": "https://YOUR-GATEWAY-URL/v1",
"apiKey": "{env:XIRANG_API_KEY}"
},
"models": {
"glm-5.1": {
"name": "GLM-5.1"
}
}
}
}
}
其中,provider配置段提供了大模型的供应商信息, baseURL是模型接入地址, apiKey是模型访问授权的key。models配置支持的模型名称和参数(一般用默认参数即可)。
公司已全面开放 息壤 GLM-5.x给内部同事使用,请咨询各自部门接口人,申请获取到key。
我会在文末贴上息壤对接的配置文件,大家复制、粘贴后,填入自己的key即可使用。
注意:
我给出的通用配置中,没有字options中直接配置apiKey, 你可以在配置文件中填入,这样就可以直接使用。另一种更推荐的方式,是启动 opencode 后,通过 /connect 命令进行配置,避免静态配置文件存在的密钥泄露。
opencode
进入 TUI终端交互界面,然后输入 /models 命令进行模型选择; 找到息壤模型组选择 GLM-5.0 或 GLM-5.1。
上手体验
尝试让它写一个经典网页小游戏:推箱子。
先建一个项目目录,并启动 TUI
mkdir game
cd game
opencode
如输入需求:开发一个推箱子网页游戏

接下来是AI表演时间(摸鱼时间).....
AI一顿操作,然后提示: 已完成,打开sokoban.html 即可游戏

Show time:

惊不惊喜?? 意不意外??
抛开效果不谈(怎么忍心抛开),你就说快不快吧?
就这?
不要慌,后续教程会一起探索如何做出产品级的效果
opencode 命令速览
不用背,大体了解有些啥东西,用到的时候再 help 看。
TUI 交互命令
在 TUI 界面内以 / 开头输入(括号内为快捷键,默认 leader 键为 ctrl+x)。
模型与 Provider:
| 名称 | 描述 |
|---|---|
/connect |
选择并连接模型 provider,录入 API 凭证 |
/models(ctrl+x m) |
查看并切换当前可用模型 |
/variants |
切换模型变体(如推理强度等) |
/mcps |
开关 MCP 服务器 |
会话管理:
| 名称 | 描述 |
|---|---|
/new(ctrl+x n) |
开新会话,防止上下文越聊越胖(别名/clear) |
/compact(ctrl+x c) |
压缩当前会话上下文(别名/summarize) |
/sessions(ctrl+x l) |
查看并切换历史会话(别名/resume、/continue) |
/fork |
从指定消息分叉创建新会话 |
/rename |
重命名当前会话 |
/timeline(ctrl+x g) |
跳转到会话中的指定消息 |
会话操作:
| 名称 | 描述 |
|---|---|
/undo(ctrl+x u) |
撤销上次对话及关联的文件变更(项目需在 Git 仓库中) |
/redo(ctrl+x r) |
重做被/undo撤销的操作 |
/share(ctrl+x s) |
分享当前会话,生成可分享链接 |
/unshare |
取消当前会话的分享 |
/export(ctrl+x x) |
导出当前对话为 Markdown,用默认编辑器打开 |
/copy(ctrl+x y) |
复制完整会话记录到剪贴板 |
/timestamps |
开关消息时间戳显示 |
项目与设置:
| 名称 | 描述 |
|---|---|
/init(ctrl+x i) |
为项目创建或更新AGENTS.md,引导工具理解项目 |
/agents(ctrl+x a) |
查看并切换当前使用的 agent(Build / Plan 等) |
/editor(ctrl+x e) |
打开外部编辑器编写消息(需设置EDITOR环境变量) |
/themes(ctrl+x t) |
查看并切换 TUI 主题 |
/thinking |
切换模型思考/推理过程的显示 |
/details(ctrl+x d) |
切换工具执行详情的显示 |
/skills |
查看当前项目可用的 skill 列表 |
/status |
查看系统状态(LSP、MCP 连接等) |
/help(ctrl+x h) |
显示帮助对话框 |
/exit(ctrl+x q) |
退出 opencode(别名/quit、/q) |
此外,在 TUI 内以 ! 开头可直接执行 Bash 命令,输出会作为工具结果加入对话:
!git status
!npm test
!python3 -m http.server 8080
CLI 命令
在终端直接执行的 opencode 命令:
| 名称 | 描述 |
|---|---|
opencode |
启动 TUI 交互界面 |
opencode [项目路径] |
对指定项目目录启动 TUI |
opencode -c/opencode --continue |
继续上次未完成的会话 |
opencode run "问题" |
非交互式模式,适合快速问答和脚本化任务 |
opencode models [provider] |
列出所有可用模型,可按 provider 过滤 |
opencode auth login |
配置模型 provider 的 API 凭证 |
opencode session list |
查看历史会话列表 |
opencode stats |
查看 token 用量和费用统计 |
opencode export [sessionID] |
导出指定会话为 JSON |
opencode import <文件/链接> |
从 JSON 文件或分享链接导入会话 |
opencode agent create |
创建自定义 agent,配置 prompt 和权限 |
opencode mcp add |
添加 MCP 服务器到配置 |
opencode serve |
启动无头服务端,提供 HTTP API 访问 |
opencode web |
启动带 Web 界面的服务端 |
opencode upgrade |
升级 opencode 到最新版本 |
附录 - opencode 对接息壤配置模板
{
"provider": {
"ctyun": {
"name": "天翼云息壤",
"npm": "@ai-sdk/openai-compatible",
"models": {
"5fea387da7f54ba38eab3d4a4fb4e9d8":{
"name": "GLM-5.1",
"limit": {
"context": 204800,
"output": 131072
},
"cost": {
"input": 4,
"output": 16
},
"options": {
"max_tokens": 131072
}
},
"GLM-5": {
"name": "GLM-5",
"limit": {
"context": 204800,
"output": 131072
},
"cost": {
"input": 4,
"output": 16
},
"options": {
"max_tokens": 131072
}
},
"GLM-5-Pro": {
"name": "GLM-5-Pro",
"limit": {
"context": 204800,
"output": 131072
},
"cost": {
"input": 4,
"output": 18
},
"options": {
"max_tokens": 131072
}
},
"Qwen3-Coder-480B-A35B-Instruct": {
"name": "Qwen3-Coder-480B-A35B-Instruct",
"limit": {
"context": 65536,
"output": 32768
},
"cost": {
"input": 8,
"output": 16
}
},
"Qwen3.5-397B-A17B-Pro": {
"name": "Qwen3.5-397B-A17B-Pro",
"limit": {
"context": 65536,
"output": 16384
},
"cost": {
"input": 1.2,
"output": 7.2
}
},
"DeepSeek-V3.2-Standard": {
"name": "DeepSeek-V3.2-Standard",
"limit": {
"context": 131072,
"output": 16384
},
"cost": {
"input": 2,
"output": 3
}
}
},
"options": {
"baseURL": "https://wishub-x6.ctyun.cn/v1/"
}
}
}
}