用 OpenCode 在终端里让 AI 帮你写和改 Python

2026-05-06 22 预计阅读时间:1 分钟
来源:realpython.com AI 摘要 原文链接

免责声明:本文为 AI 摘要整理,建议结合原文阅读。摘要可能省略上下文、版本差异或边界条件,不作为官方说明。

预计阅读时间:8 分钟

在终端里写 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 不是替代你思考的工具——它替代的是反复翻文档、手写样板代码、肉眼扫日志这些机械劳动。把具体指令给到位,它能在终端里干得又快又稳;指令模糊,它也会模糊地还你一堆似是而非的代码。区别就在你怎么提问。


相关推荐