OpenCode LSP 集成:利用语言服务器提升 AI 代码质量

OpenCode 与 Language Server Protocol(LSP)集成,在 AI 操作文件时自动启动对应的 LSP 服务器,收集类型错误和 lint 警告等诊断信息并反馈给 LLM。内置支持 TypeScript、Go、Rust、Python 等 30+ 种语言,也支持自定义 LSP 服务器。

OpenCode 与 Language Server Protocol(LSP)集成,利用语言诊断信息帮助 LLM 更好地理解和修改你的代码。当 AI 写了类型错误的代码时,LSP 反馈的错误信息会直接让它知道需要修正。


内置 LSP 服务器

OpenCode 内置了 30+ 种 LSP 服务器,满足条件时自动启用:

LSP 服务器 适用扩展名 触发条件
typescript .ts, .tsx, .js, .jsx 等 项目中有 typescript 依赖
eslint .ts, .tsx, .js, .jsx 等 项目中有 eslint 依赖
gopls .go go 命令
rust .rs rust-analyzer 命令
pyright .py, .pyi pyright 依赖
clangd .c, .cpp, .h, .hpp 等 自动安装(C/C++ 项目)
jdtls .java 安装了 Java SDK 21+
kotlin-ls .kt, .kts 自动安装(Kotlin 项目)
dart .dart dart 命令
csharp .cs 安装了 .NET SDK
fsharp .fs, .fsi 等 安装了 .NET SDK
ruby-lsp .rb, .rake 等 rubygem 命令
php intelephense .php 自动安装(PHP 项目)
astro .astro 自动安装(Astro 项目)
svelte .svelte 自动安装(Svelte 项目)
vue .vue 自动安装(Vue 项目)
lua-ls .lua 自动安装(Lua 项目)
terraform .tf, .tfvars 自动安装(GitHub Releases)
deno .ts, .tsx, .js 等 deno 命令且有 deno.json
bash .sh, .bash, .zsh, .ksh 自动安装 bash-language-server
oxlint .ts, .tsx, .js 等 项目中有 oxlint 依赖
prisma .prisma prisma 命令
gleam .gleam gleam 命令
hls .hs, .lhs haskell-language-server-wrapper
julials .jl juliaLanguageServer.jl
sourcekit-lsp .swift, .objc, .objcpp swift(macOS 需要 Xcode)
tinymist .typ, .typc 自动安装(GitHub Releases)
yaml-ls .yaml, .yml 自动安装 Red Hat yaml-language-server
zls .zig, .zon zig 命令

当检测到对应文件扩展名且满足依赖条件时,LSP 服务器自动启用。

注意:通过设置 OPENCODE_DISABLE_LSP_DOWNLOAD=true 可禁用自动下载 LSP 服务器。


工作原理

当 OpenCode 打开一个文件时:

  1. 检测文件扩展名,匹配已启用的 LSP 服务器
  2. 如果对应 LSP 服务器还未运行,则自动启动
  3. LSP 服务器提供诊断信息(类型错误、lint 警告等)
  4. 诊断信息反馈给 LLM,帮助其写出更正确的代码

配置

通过 opencode.jsonlsp 字段自定义 LSP 服务器行为:

{
  "$schema": "https://opencode.ai/config.json",
  "lsp": {}
}

每个 LSP 服务器支持以下配置项:

属性 类型 说明
disabled boolean 设为 true 禁用此 LSP 服务器
command string[] 启动 LSP 服务器的命令
extensions string[] 此 LSP 服务器处理的文件扩展名
env object 启动服务器时的环境变量
initialization object 发送给 LSP 服务器的初始化选项

设置环境变量

{
  "$schema": "https://opencode.ai/config.json",
  "lsp": {
    "rust": {
      "env": {
        "RUST_LOG": "debug"
      }
    }
  }
}

设置初始化选项

初始化选项在 LSP initialize 请求时发送,各服务器的可用选项不同:

{
  "$schema": "https://opencode.ai/config.json",
  "lsp": {
    "typescript": {
      "initialization": {
        "preferences": {
          "importModuleSpecifierPreference": "relative"
        }
      }
    }
  }
}

禁用 LSP

禁用所有 LSP 服务器:

{
  "$schema": "https://opencode.ai/config.json",
  "lsp": false
}

禁用特定 LSP 服务器:

{
  "$schema": "https://opencode.ai/config.json",
  "lsp": {
    "typescript": {
      "disabled": true
    }
  }
}

添加自定义 LSP 服务器

{
  "$schema": "https://opencode.ai/config.json",
  "lsp": {
    "custom-lsp": {
      "command": ["custom-lsp-server", "--stdio"],
      "extensions": [".custom"]
    }
  }
}

PHP Intelephense 授权

PHP Intelephense 提供付费高级功能,可通过 License Key 激活。将 License Key 放入以下位置(文件只包含 Key,无其他内容):

  • macOS/Linux:$HOME/intelephense/license.txt
  • Windows:%USERPROFILE%/intelephense/license.txt

常见问题

Q: LSP 集成对 AI 生成代码有什么实质帮助?

A: 假设 AI 生成了一段有类型错误的 TypeScript 代码,TypeScript LSP 会立即报告错误,OpenCode 会把这个错误信息反馈给 LLM,让它修正——就像你在 IDE 里看到红色波浪线并手动修复一样,只不过是 AI 自动处理的。

Q: LSP 服务器会影响性能吗?

A: LSP 服务器在后台运行,通常影响较小。如果有性能问题,可以通过 disabled: true 禁用不需要的服务器。

Q: 我的语言不在列表里,能用 LSP 吗?

A: 只要你的语言有支持 stdio 模式的 LSP 服务器,就可以通过自定义配置接入。参考上面的"添加自定义 LSP 服务器"示例。