在终端里写 Python,调试靠 print,重构靠手感——这套老办法还能用,但效率已经跟不上了。OpenCode 把 AI 能力直接搬进你的命令行:装好、连上模型,就能让它读代码、找 bug、提重构建议,全程不离开终端窗口。
下面一步步走完安装、配置和实际用法,顺手改一段真实 Python 代码试试。
安装与首次启动
OpenCode 是一个 Go 编写的 CLI 工具,单文件安装,没有依赖地狱:
# macOS / Linux(推荐用官方脚本)
curl -fsSL https://opencode.ai/install.sh | bash
# 或者如果你有 Go 环境,直接编译
go install github.com/opencode-ai/opencode@latest
# 验证安装
opencode --version
安装完成后,在任意项目目录下执行:
opencode
它会启动一个终端内的 TUI 界面——左侧是文件树,右侧是对话区,底部是输入框。第一次启动会提示你配置 AI provider。
连接 AI Provider
OpenCode 本身不带模型,它是一个"前端",需要你提供 API key 连到实际的 LLM 服务。支持的 provider 包括 OpenAI、Anthropic、Google Gemini、Ollama(本地模型)等。
配置文件放在项目根目录的 .opencode.json,或者全局 ~/.opencode.json。一个最小配置示例:
{
"provider": {
"openai": {
"apiKey": "sk-xxxxxxxxxxxxxxxxxxxxxxxx"
}
},
"model": "gpt-4o"
}
如果你更倾向用 Claude:
{
"provider": {
"anthropic": {
"apiKey": "sk-ant-xxxxxxxxxxxxxxxxxxxxxxxx"
}
},
"model": "claude-sonnet-4-20250514"
}
想跑本地模型省钱?用 Ollama:
{
"provider": {
"ollama": {}
},
"model": "ollama:qwen2.5-coder:7b"
}
Ollama provider 不需要 apiKey,前提是你本地已经
ollama serve在跑,并且拉了对应模型。
配置好之后重启 opencode,对话区就能正常响应了。
实战:让 AI 分析和重构一段 Python
假设你项目里有个处理日志的脚本 log_parser.py,写得比较粗糙:
# log_parser.py — 原始版本,问题不少
def parse_logs(filepath):
f = open(filepath)
lines = f.readlines()
f.close()
results = []
for line in lines:
if "ERROR" in line:
parts = line.split("|")
if len(parts) >= 4:
results.append({"time": parts[0], "level": parts[1], "msg": parts[3]})
return results
def count_errors(results):
return len(results)
肉眼可见的问题:文件没用 with 语句、硬编码 "ERROR"、缺少类型提示、没有错误处理。在 OpenCode 对话区里,你可以这样发指令:
分析 log_parser.py 的问题,然后给出重构后的完整代码。要求:
1. 用 with 语句安全打开文件
2. 加类型提示
3. 把 ERROR 等级别做成参数
4. 处理文件不存在和格式异常的情况
OpenCode 会读取项目中的 log_parser.py,理解上下文后返回分析和重构代码。你可以直接在对话区里让它"把改动写到文件",它会自动编辑源文件。
重构后大概率会得到类似这样的结果:
# log_parser.py — 重构版本
from pathlib import Path
from typing import List, Optional
LogLevel = str
def parse_logs(
filepath: Path,
level: LogLevel = "ERROR",
) -> List[dict]:
"""从日志文件中提取指定级别的条目。
Args:
filepath: 日志文件路径
level: 要过滤的日志级别,默认 "ERROR"
Returns:
解析后的字典列表,每项含 time、level、msg 字段
"""
if not filepath.exists():
raise FileNotFoundError(f"日志文件不存在: {filepath}")
results: List[dict] = []
with filepath.open(encoding="utf-8") as f:
for line in f:
if level not in line:
continue
parts = line.strip().split("|")
if len(parts) < 4:
continue # 跳过格式不完整的行
results.append({
"time": parts[0],
"level": parts[1],
"msg": parts[3],
})
return results
def count_errors(results: List[dict]) -> int:
return len(results)
if __name__ == "__main__":
import sys
path = Path(sys.argv[1]) if len(sys.argv) > 1 else Path("app.log")
errors = parse_logs(path, level="ERROR")
print(f"共 {count_errors(errors)} 条错误日志")
for e in errors[:5]:
print(f" [{e['time']}] {e['msg']}")
改动要点一目了然:with 管文件句柄、Path 替代裸字符串、level 参数化、异常有明确抛出、类型提示全覆盖。你可以直接复制这段代码替换原文件,也可以在 OpenCode 里让它自动写入。
几个实用对话技巧
在终端里和 AI 对话写代码,措辞越具体,输出越靠谱:
- 指明文件名:
看看 src/utils.py 的第 30-45 行,这段逻辑有没有并发问题?——比泛泛问"这段代码有没有 bug"效果好得多。 - 限定改动范围:
只改 parse_logs 函数,其他函数不动——防止 AI 过度重构把无关代码也改了。 - 要求解释后再改:
先列出你要改的三点,我确认后再写代码——给自己一个审查机会,避免盲目接受改动。 - 用
/命令:OpenCode TUI 里/help查看所有内置命令,/compact压缩对话历史省 token,/clear重置上下文。
上手前的检查清单
真正把 OpenCode 用起来之前,跑一遍这几项:
| 检查项 | 说明 |
|---|---|
| API key 已配置 | .opencode.json 里 provider 和 model 都填了,启动不报错 |
项目目录有 .git |
AI 会直接改文件,没有版本控制等于裸奔——先 git init 或确认在仓库里 |
| 试一次小改动 | 找个简单函数让 AI 改,确认输出格式和写入逻辑正常 |
| 看一眼 token 消耗 | 对话区底部会显示用量,长文件分析可能吃掉不少 token,心里有数 |
| 本地模型备选 | 量大或内网场景,配一个 Ollama provider 作为 fallback |
OpenCode 不是替代你思考的工具——它替代的是反复翻文档、手写样板代码、肉眼扫日志这些机械劳动。把具体指令给到位,它能在终端里干得又快又稳;指令模糊,它也会模糊地还你一堆似是而非的代码。区别就在你怎么提问。