opencode-ai/opencode

GitHub: opencode-ai/opencode

一款基于 Go 的终端 AI 编程助手,通过 TUI 界面集成多家 AI 供应商帮助开发者在命令行中完成编码、调试等工作。

Stars: 13226 | Forks: 1521

# 已归档:项目已迁移 此仓库不再维护,出于留存目的已归档。 该项目现以 [Crush][crush] 之名继续开发,由原作者及 Charm 团队负责。 # ⌬ OpenCode

一款面向开发者的强大终端 AI 助手,直接在您的终端中提供智能编码辅助。 ## 概述 OpenCode 是一个基于 Go 的 CLI 应用程序,将 AI 辅助引入您的终端。它提供了一个 TUI(终端用户界面),用于与各种 AI 模型进行交互,以帮助处理编码任务、调试等工作。

For a quick video overview, check out OpenCode + Gemini 2.5 Pro: BYE Claude Code! I'm SWITCHING To the FASTEST AI Coder!

## 功能 - **交互式 TUI**:基于 [Bubble Tea](https://github.com/charmbracelet/bubbletea) 构建,提供流畅的终端体验 - **多 AI 供应商**:支持 OpenAI、Anthropic Claude、Google Gemini、AWS Bedrock、Groq、Azure OpenAI 和 OpenRouter - **会话管理**:保存并管理多个对话会话 - **工具集成**:AI 可以执行命令、搜索文件和修改代码 - **类 Vim 编辑器**:具备文本输入功能的集成编辑器 - **持久化存储**:使用 SQLite 数据库存储对话和会话 - **LSP 集成**:支持 Language Server Protocol 以实现代码智能 - **文件更改跟踪**:跟踪并可视化会话期间的文件更改 - **外部编辑器支持**:打开您首选的编辑器来撰写消息 - **自定义命令的命名参数**:使用多个命名占位符创建强大的自定义命令 ## 安装说明 ### 使用安装脚本 ``` # 安装最新版本 curl -fsSL https://raw.githubusercontent.com/opencode-ai/opencode/refs/heads/main/install | bash # 安装特定版本 curl -fsSL https://raw.githubusercontent.com/opencode-ai/opencode/refs/heads/main/install | VERSION=0.1.0 bash ``` ### 使用 Homebrew (macOS 和 Linux) ``` brew install opencode-ai/tap/opencode ``` ### 使用 AUR (Arch Linux) ``` # 使用 yay yay -S opencode-ai-bin # 使用 paru paru -S opencode-ai-bin ``` ### 使用 Go ``` go install github.com/opencode-ai/opencode@latest ``` ## 配置 OpenCode 会在以下位置查找配置文件: - `$HOME/.opencode.json` - `$XDG_CONFIG_HOME/opencode/.opencode.json` - `./.opencode.json`(本地目录) ### 自动压缩功能 OpenCode 包含一项自动压缩功能,当对话接近模型的上下文窗口限制时,它会自动总结您的对话。启用后(默认设置),此功能将: - 监控对话期间的 token 使用情况 - 当使用量达到模型上下文窗口的 95% 时自动触发总结 - 使用总结创建一个新会话,让您可以在不丢失上下文的情况下继续工作 - 帮助防止长对话中可能出现的“上下文超限”错误 您可以在配置文件中启用或禁用此功能: ``` { "autoCompact": true // default is true } ``` ### 环境变量 您可以使用环境变量来配置 OpenCode: | 环境变量 | 用途 | | -------------------------- | -------------------------------------------------------------------------------- | | `ANTHROPIC_API_KEY` | 用于 Claude 模型 | | `OPENAI_API_KEY` | 用于 OpenAI 模型 | | `GEMINI_API_KEY` | 用于 Google Gemini 模型 | | `GITHUB_TOKEN` | 用于 Github Copilot 模型(参见 [使用 Github Copilot](#using-github-copilot)) | | `VERTEXAI_PROJECT` | 用于 Google Cloud VertexAI (Gemini) | | `VERTEXAI_LOCATION` | 用于 Google Cloud VertexAI (Gemini) | | `GROQ_API_KEY` | 用于 Groq 模型 | | `AWS_ACCESS_KEY_ID` | 用于 AWS Bedrock (Claude) | | `AWS_SECRET_ACCESS_KEY` | 用于 AWS Bedrock (Claude) | | `AWS_REGION` | 用于 AWS Bedrock (Claude) | | `AZURE_OPENAI_ENDPOINT` | 用于 Azure OpenAI 模型 | | `AZURE_OPENAI_API_KEY` | 用于 Azure OpenAI 模型(使用 Entra ID 时可选) | | `AZURE_OPENAI_API_VERSION` | 用于 Azure OpenAI 模型 | | `LOCAL_ENDPOINT` | 用于自托管模型 | | `SHELL` | 默认使用的 shell(如果未在配置中指定) | ### Shell 配置 OpenCode 允许您配置 bash 工具使用的 shell。默认情况下,它使用 `SHELL` 环境变量中指定的 shell,如果未设置,则回退到 `/bin/bash`。 您可以在配置文件中覆盖此设置: ``` { "shell": { "path": "/bin/zsh", "args": ["-l"] } } ``` 如果您想使用与系统默认 shell 不同的 shell,或者需要向 shell 传递特定参数,这会非常有用。 ### 配置文件结构 ``` { "data": { "directory": ".opencode" }, "providers": { "openai": { "apiKey": "your-api-key", "disabled": false }, "anthropic": { "apiKey": "your-api-key", "disabled": false }, "copilot": { "disabled": false }, "groq": { "apiKey": "your-api-key", "disabled": false }, "openrouter": { "apiKey": "your-api-key", "disabled": false } }, "agents": { "coder": { "model": "claude-3.7-sonnet", "maxTokens": 5000 }, "task": { "model": "claude-3.7-sonnet", "maxTokens": 5000 }, "title": { "model": "claude-3.7-sonnet", "maxTokens": 80 } }, "shell": { "path": "/bin/bash", "args": ["-l"] }, "mcpServers": { "example": { "type": "stdio", "command": "path/to/mcp-server", "env": [], "args": [] } }, "lsp": { "go": { "disabled": false, "command": "gopls" } }, "debug": false, "debugLSP": false, "autoCompact": true } ``` ## 支持的 AI 模型 OpenCode 支持来自不同供应商的各种 AI 模型: ### OpenAI - GPT-4.1 系列 (gpt-4.1, gpt-4.1-mini, gpt-4.1-nano) - GPT-4.5 Preview - GPT-4o 系列 (gpt-4o, gpt-4o-mini) - O1 系列 (o1, o1-pro, o1-mini) - O3 系列 (o3, o3-mini) - O4 Mini ### Anthropic - Claude 4 Sonnet - Claude 4 Opus - Claude 3.5 Sonnet - Claude 3.5 Haiku - Claude 3.7 Sonnet - Claude 3 Haiku - Claude 3 Opus ### GitHub Copilot - GPT-3.5 Turbo - GPT-4 - GPT-4o - GPT-4o Mini - GPT-4.1 - Claude 3.5 Sonnet - Claude 3.7 Sonnet - Claude 3.7 Sonnet Thinking - Claude Sonnet 4 - O1 - O3 Mini - O4 Mini - Gemini 2.0 Flash - Gemini 2.5 Pro ### Google - Gemini 2.5 - Gemini 2.5 Flash - Gemini 2.0 Flash - Gemini 2.0 Flash Lite ### AWS Bedrock - Claude 3.7 Sonnet ### Groq - Llama 4 Maverick (17b-128e-instruct) - Llama 4 Scout (17b-16e-instruct) - QWEN QWQ-32b - Deepseek R1 distill Llama 70b - Llama 3.3 70b Versatile ### Azure OpenAI - GPT-4.1 系列 (gpt-4.1, gpt-4.1-mini, gpt-4.1-nano) - GPT-4.5 Preview - GPT-4o 系列 (gpt-4o, gpt-4o-mini) - O1 系列 (o1, o1-mini) - O3 系列 (o3, o3-mini) - O4 Mini ### Google Cloud VertexAI - Gemini 2.5 - Gemini 2.5 Flash ## 用法 ``` # 启动 OpenCode opencode # 以 debug 日志记录启动 opencode -d # 以特定工作目录启动 opencode -c /path/to/project ``` ## 非交互式 Prompt 模式 您可以通过将 prompt 直接作为命令行参数传递,以非交互式模式运行 OpenCode。这适用于脚本编写、自动化,或者当您想在不启动完整 TUI 的情况下快速获得答案时。 ``` # 运行单个 prompt 并将 AI 的响应打印到终端 opencode -p "Explain the use of context in Go" # 以 JSON 格式获取响应 opencode -p "Explain the use of context in Go" -f json # 运行时不显示 spinner(适用于 scripts) opencode -p "Explain the use of context in Go" -q ``` 在此模式下,OpenCode 将处理您的 prompt,将结果打印到标准输出,然后退出。该会话的所有权限都会被自动批准。 默认情况下,在模型处理您的查询时会显示加载动画。您可以使用 `-q` 或 `--quiet` 标志禁用此动画,这在通过脚本或自动化工作流运行 OpenCode 时特别有用。 ### 输出格式 OpenCode 在非交互式模式下支持以下输出格式: | 格式 | 描述 | | ------ | ------------------------------ | | `text` | 纯文本输出(默认) | | `json` | 封装在 JSON 对象中的输出 | 输出格式在代码库中作为强类型的 `OutputFormat` 实现,确保在处理输出时的类型安全和验证。 ## 命令行标志 | 标志 | 简写 | 描述 | | ----------------- | ---- | -------------------------------------------- | | `--help` | `-h` | 显示帮助信息 | | `--debug` | `-d` | 启用 debug 模式 | | `--cwd` | `-c` | 设置当前工作目录 | | `--prompt` | `-p` | 在非交互式模式下运行单个 prompt | | `--output-format` | `-f` | 非交互式模式的输出格式 | | `--quiet` | `-q` | 在非交互式模式下隐藏加载动画 | ## 键盘快捷键 ### 全局快捷键 | 快捷键 | 操作 | | -------- | ----------------------------------------- | | `Ctrl+C` | 退出应用程序 | | `Ctrl+?` | 切换帮助对话框 | | `?` | 切换帮助对话框(非编辑模式下) | | `Ctrl+L` | 查看日志 | | `Ctrl+A` | 切换会话 | | `Ctrl+K` | 命令对话框 | | `Ctrl+O` | 切换模型选择对话框 | | `Esc` | 关闭当前覆盖层/对话框或返回上一个模式 | ### 聊天页面快捷键 | 快捷键 | 操作 | | -------- | ----------------------------- | | `Ctrl+N` | 创建新会话 | | `Ctrl+X` | 取消当前操作/生成 | | `i` | 聚焦编辑器(非写入模式下) | | `Esc` | 退出写入模式并聚焦消息 | ### 编辑器快捷键 | 快捷键 | 操作 | | -------------------- | ----------------------------- | | `Ctrl+S` | 发送消息(编辑器聚焦时) | | `Enter` 或 `Ctrl+S` | 发送消息(编辑器未聚焦时) | | `Ctrl+E` | 打开外部编辑器 | | `Esc` | 取消聚焦编辑器并聚焦消息 | ### 会话对话框快捷键 | 快捷键 | 操作 | | ---------- | ------------ | | `↑` 或 `k` | 上一个会话 | | `↓` 或 `j` | 下一个会话 | | `Enter` | 选择会话 | | `Esc` | 关闭对话框 | ### 模型对话框快捷键 | 快捷键 | 操作 | | ---------- | ------------- | | `↑` 或 `k` | 向上移动 | | `↓` 或 `j` | 向下移动 | | `←` 或 `h` | 上一个供应商 | | `→` 或 `l` | 下一个供应商 | | `Esc` | 关闭对话框 | ### 权限对话框快捷键 | 快捷键 | 操作 | | ----------------------- | -------------------- | | `←` 或 `left` | 向左切换选项 | | `→` 或 `right` 或 `tab` | 向右切换选项 | | `Enter` 或 `space` | 确认选择 | | `a` | 允许权限 | | `A` | 本次会话允许权限 | | `d` | 拒绝权限 | ### 日志页面快捷键 | 快捷键 | 操作 | | -------------------- | -------------- | | `Backspace` 或 `q` | 返回聊天页面 | ## AI 助手工具 OpenCode 的 AI 助手可以访问各种工具来帮助处理编码任务: ### 文件和代码工具 | 工具 | 描述 | 参数 | | ------------- | --------------------- | ---------------------------------------------------------------------------------------- | | `glob` | 按模式查找文件 | `pattern`(必填),`path`(可选) | | `grep` | 搜索文件内容 | `pattern`(必填),`path`(可选),`include`(可选),`literal_text`(可选) | | `ls` | 列出目录内容 | `path`(可选),`ignore`(可选的模式数组) | | `view` | 查看文件内容 | `file_path`(必填),`offset`(可选),`limit`(可选) | | `write` | 写入文件 | `file_path`(必填),`content`(必填) | | `edit` | 编辑文件 | 用于文件编辑的各种参数 | | `patch` | 对文件应用补丁 | `file_path`(必填),`diff`(必填) | | `diagnostics` | 获取诊断信息 | `file_path`(可选) | ### 其他工具 | 工具 | 描述 | 参数 | | ------------- | ------------------------------ | ----------------------------------------------------------------------------------------- | | `bash` | 执行 shell 命令 | `command`(必填),`timeout`(可选) | | `fetch` | 从 URL 获取数据 | `url`(必填),`format`(必填),`timeout`(可选) | | `sourcegraph` | 跨公共仓库搜索代码 | `query`(必填),`count`(可选),`context_window`(可选),`timeout`(可选) | | `agent` | 使用 AI agent 运行子任务 | `prompt`(必填) | ## 架构 OpenCode 采用模块化架构构建: - **cmd**:使用 Cobra 的命令行界面 - **internal/app**:核心应用服务 - **internal/config**:配置管理 - **internal/db**:数据库操作和迁移 - **internal/llm**:LLM 供应商和工具集成 - **internal/tui**:终端 UI 组件和布局 - **internal/logging**:日志基础设施 - **internal/message**:消息处理 - **internal/session**:会话管理 - **internal/lsp**:Language Server Protocol 集成 ## 自定义命令 OpenCode 支持用户创建自定义命令,以便向 AI 助手快速发送预定义的 prompt。 ### 创建自定义命令 自定义命令是作为 Markdown 文件存储在以下三个位置之一的预定义 prompt: 1. **用户命令**(以 `user:` 为前缀): $XDG_CONFIG_HOME/opencode/commands/ (在 Linux/macOS 上通常为 `~/.config/opencode/commands/`) 或 $HOME/.opencode/commands/ 2. **项目命令**(以 `project:` 为前缀): /.opencode/commands/ 这些目录中的每个 `.md` 文件都会成为一个自定义命令。文件名(不带扩展名)将成为命令 ID。 例如,在 `~/.config/opencode/commands/prime-context.md` 创建一个包含以下内容的文件: ``` RUN git ls-files READ README.md ``` 这将创建一个名为 `user:prime-context` 的命令。 ### 命令参数 OpenCode 支持在自定义命令中使用 `$NAME` 格式的占位符来定义命名参数(其中 NAME 由大写字母、数字和下划线组成,且必须以字母开头)。 例如: ``` # 为 Issue $ISSUE_NUMBER 获取 Context RUN gh issue view $ISSUE_NUMBER --json title,body,comments RUN git grep --author="$AUTHOR_NAME" -n . RUN grep -R "$SEARCH_PATTERN" $DIRECTORY ``` 当您运行带有参数的命令时,OpenCode 会提示您为每个唯一的占位符输入值。命名参数提供了几个好处: - 清楚地标识每个参数代表的内容 - 能够多次使用同一个参数 - 更好地组织具有多个输入的命令 ### 组织命令 您可以在子目录中组织命令: ``` ~/.config/opencode/commands/git/commit.md ``` 这将创建一个 ID 为 `user:git:commit` 的命令。 ### 使用自定义命令 1. 按 `Ctrl+K` 打开命令对话框 2. 选择您的自定义命令(以 `user:` 或 `project:` 为前缀) 3. 按 Enter 执行命令 命令文件的内容将作为消息发送给 AI 助手。 ### 内置命令 OpenCode 包含几个内置命令: | 命令 | 描述 | | ------------------ | -------------------------------------------------------------------------------------------- | | Initialize Project | 创建或更新带有项目特定信息的 OpenCode.md 记忆文件 | | Compact Session | 手动触发当前会话的总结,并使用该摘要创建一个新会话 | ## MCP (Model Context Protocol) OpenCode 实现了 Model Context Protocol (MCP),通过外部工具扩展其功能。MCP 为 AI 助手提供了一种与外部服务和工具交互的标准化方法。 ### MCP 功能 - **外部工具集成**:通过标准化协议连接到外部工具和服务 - **工具发现**:自动从 MCP 服务器发现可用工具 - **多种连接类型**: - **Stdio**:通过标准输入/输出与工具通信 - **SSE**:通过 Server-Sent Events 与工具通信 - **安全性**:用于控制对 MCP 工具访问的权限系统 ### 配置 MCP 服务器 MCP 服务器在配置文件的 `mcpServers` 部分中定义: ``` { "mcpServers": { "example": { "type": "stdio", "command": "path/to/mcp-server", "env": [], "args": [] }, "web-example": { "type": "sse", "url": "https://example.com/mcp", "headers": { "Authorization": "Bearer token" } } } } ``` ### MCP 工具使用 配置完成后,MCP 工具将和内置工具一样,自动供 AI 助手使用。它们遵循与其他工具相同的权限模型,在执行前需要用户批准。 ## LSP (Language Server Protocol) OpenCode 集成了 Language Server Protocol,以提供跨多种编程语言的代码智能功能。 ### LSP 功能 - **多语言支持**:连接不同编程语言的 language server - **诊断**:接收错误检查和代码检查信息 - **文件监视**:自动通知 language server 文件的更改 ### 配置 LSP Language server 在配置文件的 `lsp` 部分进行配置: ``` { "lsp": { "go": { "disabled": false, "command": "gopls" }, "typescript": { "disabled": false, "command": "typescript-language-server", "args": ["--stdio"] } } } ``` ### LSP 与 AI 集成 AI 助手可以通过 `diagnostics` 工具访问 LSP 功能,使其能够: - 检查代码中的错误 - 根据诊断建议修复方案 虽然 LSP 客户端实现支持完整的 LSP 协议(包括补全、悬停、定义等),但目前仅向 AI 助手公开了诊断信息。 ## 使用 Github Copilot _Copilot 支持目前处于实验阶段。_ ### 要求 - 在 GitHub 设置中启用了 [IDE 中的 Copilot chat](https://github.com/settings/copilot) - 以下之一: - VSCode Github Copilot chat 扩展 - Github `gh` CLI - Neovim Github Copilot 插件(`copilot.vim` 或 `copilot.lua`) - 具有 copilot 权限的 Github token 如果使用上述插件或 CLI 工具之一,请确保使用您的 Github 账户对工具进行身份验证。这应该在以下位置之一创建一个 github token: - ~/.config/github-copilot/[hosts,apps].json - $XDG_CONFIG_HOME/github-copilot/[hosts,apps].json 如果使用显式的 github token,您可以设置 $GITHUB_TOKEN 环境变量,或者将其添加到 opencode.json 配置文件中的 `providers.copilot.apiKey`。 ## 使用自托管模型供应商 OpenCode 还可以加载和使用来自自托管(类 OpenAI)供应商的模型。 这对于希望尝试自定义模型的开发者非常有用。 ### 配置自托管供应商 您可以通过设置 `LOCAL_ENDPOINT` 环境变量来使用自托管模型。 这将使 OpenCode 从指定的 endpoint 加载并使用模型。 ``` LOCAL_ENDPOINT=http://localhost:1235/v1 ``` ### 配置自托管模型 您还可以在配置文件的 `agents` 部分配置自托管模型: ``` { "agents": { "coder": { "model": "local.granite-3.3-2b-instruct@q8_0", "reasoningEffort": "high" } } } ``` ## 开发 ### 前置条件 - Go 1.24.0 或更高版本 ### 从源码构建 ``` # 克隆 repository git clone https://github.com/opencode-ai/opencode.git cd opencode # Build go build -o opencode # Run ./opencode ``` ## 致谢 OpenCode 衷心感谢以下关键个人的贡献与支持: - [@isaacphi](https://github.com/isaacphi) - 感谢其 [mcp-language-server](https://github.com/isaacphi/mcp-language-server) 项目,为我们 LSP 客户端的实现奠定了基础 - [@adamdottv](https://github.com/adamdottv) - 感谢其设计方向和 UI/UX 架构 特别感谢更广泛的开源社区,正是他们的工具和库使本项目成为可能。 ## 许可证 OpenCode 采用 MIT 许可证授权。详情请参阅 [LICENSE](LICENSE) 文件。 ## 贡献 欢迎您的贡献!您可以通过以下方式做出贡献: 1. Fork 本仓库 2. 创建一个功能分支 (`git checkout -b feature/amazing-feature`) 3. 提交您的更改 (`git commit -m 'Add some amazing feature'`) 4. 推送到该分支 (`git push origin feature/amazing-feature`) 5. 发起一个 Pull Request 请确保适当更新测试,并遵循现有的代码风格。

标签:EVTX分析, Go, LSP集成, Ruby工具, 人工智能, 代码生成, 开发辅助工具, 日志审计, 渗透测试工具, 用户模式Hook绕过