Back to Blog

OpenCode 30+ LSP 集成:让 AI 真正理解你的代码

2026-04-27T11:00:00+08:00
OpenCode LSP 语言服务器 TypeScript Python

OpenCode 30+ LSP 集成:让 AI 真正理解你的代码

你有没有遇到过这种情况:让 AI 帮你改代码,它改完之后类型报错、import 路径写错、还引入了一堆 lint warning?然后你手动修半天,比不改还累。

根本原因是 AI 不懂你的代码——它只是根据上下文猜,猜错了你还得兜底。

OpenCode 的 LSP 集成彻底解决了这个问题。它内置了 30+ 语言的 Language Server Protocol 支持,能像 VS Code 一样实时理解你的代码结构。AI 写完代码,LSP 立刻反馈诊断信息,Agent 据此自动修正,形成闭环。

今天我们来拆解 OpenCode 的 LSP 系统,看看它是怎么让 AI 从"盲写代码"变成"理解式编程"的。

本文提纲

  1. 什么是 LSP,为什么 AI Agent 需要它
  2. 35 个内置 LSP 服务器一览
  3. 自动安装与智能检测机制
  4. 诊断反馈如何驱动 Agent 决策
  5. LSP Tool:代码智能的瑞士军刀
  6. 自定义 LSP 配置实战
  7. Formatter 集成:写完就格式化
  8. 实战:AI 修 lint 错误的完整流程

什么是 LSP,为什么 AI Agent 需要它

LSP(Language Server Protocol)是微软搞出来的一个标准协议,让编辑器和语言分析工具解耦。简单说,每种语言的"代码理解能力"被打包成一个独立的 Language Server,任何编辑器只要实现了 LSP 协议,就能获得跳转定义、查找引用、类型检查、自动补全等能力。

VS Code 为什么好用?因为背后跑着一堆 Language Server。

对 AI Agent 来说,LSP 的价值更大。传统 AI 编程工具只靠文本匹配和 LLM 的"猜",而 OpenCode 通过 LSP 获得了真正的代码理解:

  • 类型错误:Python 的 pyright 告诉 AI "这个参数类型不对"
  • 未定义变量:TypeScript 的 tsserver 指出 "foo is not defined"
  • 引用关系:Go 的 gopls 能告诉 AI 这个函数被哪里调用了
  • 代码结构:Rust 的 rust-analyzer 提供 AST 级别的语义分析

AI 拿到这些信息后,修改代码的准确率会大幅提升。

35 个内置 LSP 服务器一览

OpenCode 内置了 35 个 LSP 服务器,覆盖主流编程语言。我按类型给大家理一理:

前端与 Web

LSP Server 文件类型 检测条件
typescript .ts .tsx .js .jsx .mjs 项目有 typescript 依赖
vue .vue 自动安装
svelte .svelte 自动安装
astro .astro 自动安装
deno .ts .tsx .js .jsx 检测到 deno 命令
eslint .ts .tsx .js .jsx .vue 项目有 eslint 依赖
oxlint .ts .tsx .js .jsx .svelte 项目有 oxlint 依赖

后端与系统语言

LSP Server 文件类型 检测条件
gopls .go go 命令可用
rust (rust-analyzer) .rs rust-analyzer 可用
clangd .c .cpp .h .hpp 自动安装
jdtls .java Java SDK 21+
kotlin-ls .kt .kts 自动安装
pyright .py .pyi pyright 已安装
ruby-lsp .rb .rake ruby 和 gem 可用
sourcekit-lsp .swift swift 已安装

函数式与其他语言

LSP Server 文件类型 检测条件
hls (Haskell) .hs haskell-language-server 可用
elixir-ls .ex .exs elixir 可用
clojure-lsp .clj .cljs clojure-lsp 可用
gleam .gleam gleam 可用
ocaml-lsp .ml .mli ocamllsp 可用
julials .jl Julia + LanguageServer.jl
fsharp .fs .fsi .NET SDK
dart .dart dart 可用

配置与基础设施

LSP Server 文件类型 检测条件
terraform .tf .tfvars 自动从 GitHub 安装
prisma .prisma prisma 可用
yaml-ls .yaml .yml 自动安装
nixd .nix nixd 可用

其他

LSP Server 文件类型 检测条件
bash .sh .bash .zsh 自动安装
lua-ls .lua 自动安装
php intelephense .php 自动安装
tinymist (Typst) .typ 自动安装
zls (Zig) .zig .zon zig 可用
csharp .cs .NET SDK
razor .razor .NET SDK + VS Code 扩展

一共 35 个,从 TypeScript 到 Zig,从 Python 到 Terraform,基本上你日常用的语言都覆盖了。

自动安装与智能检测机制

OpenCode 的 LSP 不是让你手动一个个装。它有一套智能检测机制:

  1. 文件扩展名匹配:当你打开一个 .py 文件,OpenCode 自动检查是否有 pyright LSP 可用
  2. 环境检测:检查你的系统里是否安装了对应的工具链(比如 go 命令、rust-analyzer 命令)
  3. 项目依赖检测:像 TypeScript、ESLint 这些,会检查 package.json 里有没有对应依赖
  4. 自动下载:很多 LSP Server(bash、clangd、terraform、lua-ls 等)会自动从网上下载安装

整个过程零配置。你打开项目,OpenCode 自动搞定一切。

如果你不想让它自动下载,可以设置环境变量:

OPENCODE_DISABLE_LSP_DOWNLOAD=true opencode

诊断反馈如何驱动 Agent 决策

这是 OpenCode LSP 集成的核心——诊断反馈闭环。

Agent 写代码 → LSP 分析 → 诊断输出 → Agent 读取诊断 → 自动修正

具体流程是这样的:

第一步:Agent 修改文件

假设 Agent 在你的 Python 项目里写了一个函数:

def calculate_total(items: list[str]) -> int:
    total = sum(item["price"] for item in items)
    return total

第二步:LSP 立刻分析

Pyright 马上返回诊断信息:

Diagnostic: Expression of type "str" cannot be used as index
  on parameter "item" with type "str"
  File: src/calculator.py, Line 2, Column 19
  Severity: Error

第三步:Agent 自动修正

OpenCode 把诊断信息反馈给 Agent,Agent 意识到类型搞错了,自动修正:

def calculate_total(items: list[dict[str, int]]) -> int:
    total = sum(item["price"] for item in items)
    return total

Pyright 再检查一遍,没有错误了。整个过程 Agent 自己完成,你甚至不需要在场。

这种"写代码 → 即时反馈 → 自动修正"的循环,把 AI 编程的准确率提升了一个量级。以前 AI 写完代码你得逐行检查,现在 LSP 帮你做了第一轮审查。

LSP Tool:代码智能的瑞士军刀

除了自动诊断,OpenCode 还提供了一个实验性的 LSP Tool,让 Agent 主动调用 LSP 的代码智能功能。

启用方式:

OPENCODE_EXPERIMENTAL_LSP_TOOL=true opencode

这个 Tool 支持以下操作:

操作 说明 用途
goToDefinition 跳转到定义 找到函数/变量的源码位置
findReferences 查找引用 看看谁在用这个函数
hover 悬停信息 获取类型签名和文档
documentSymbol 文档符号 列出文件里的所有函数/类
workspaceSymbol 工作区符号 全局搜索符号
goToImplementation 跳转到实现 接口→具体实现类
prepareCallHierarchy 调用层级 谁调了这个函数
incomingCalls 入调用 上游调用链
outgoingCalls 出调用 下游调用链

实际使用场景——假设你对 Agent 说:"帮我重构 UserServiceauthenticate 方法"。

Agent 会这么做:

  1. goToDefinition 找到 authenticate 的定义位置
  2. findReferences 找到所有调用了这个方法的地方
  3. hover 获取方法的类型签名
  4. 修改方法实现
  5. findReferences 逐一修复调用点
  6. 等待 LSP 诊断确认无错误

这个流程跟一个有经验的程序员做的完全一样——先理解上下文,再动手改。

自定义 LSP 配置实战

OpenCode 的 LSP 系统完全可配置。在 opencode.json 里你可以微调一切。

环境变量

给 LSP Server 传递环境变量:

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

初始化选项

给 LSP Server 传初始化参数:

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

这个配置让 TypeScript LSP 生成的 import 路径使用相对路径,而不是模块路径。

禁用特定 LSP

如果你项目里 TypeScript LSP 太慢了,可以禁用:

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

或者全部禁用:

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

添加自定义 LSP Server

如果你用的语言不在内置列表里,可以手动添加:

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

只要符合 LSP 协议标准,任何 Language Server 都能接入。

Formatter 集成:写完就格式化

LSP 负责诊断,Formatter 负责风格。OpenCode 内置了 30+ Formatter,跟 LSP 配合使用。

Agent 写完代码后,OpenCode 自动执行两步:

  1. LSP 诊断:检查语法、类型、语义错误
  2. Formatter 格式化:按项目风格自动调整代码格式

内置 Formatter 包括:

类别 Formatter
JS/TS prettier, biome, oxfmt
Python ruff, uv
Go gofmt
Rust rustfmt, cargofmt
Java/C++ clang-format
Ruby rubocop, standardrb
PHP pint
其他 shfmt, zig, gleam, dart, nixfmt 等

关键点:Formatter 是自动检测的。你项目里有 prettier 依赖?OpenCode 自动用 prettier。有 biome.json?自动用 biome。有 .clang-format?自动用 clang-format。零配置。

你也可以自定义 Formatter:

{
  "$schema": "https://opencode.ai/config.json",
  "formatter": {
    "custom-markdown-formatter": {
      "command": ["deno", "fmt", "$FILE"],
      "extensions": [".md"]
    }
  }
}

$FILE 占位符会被替换成实际文件路径。

实战:AI 修 lint 错误的完整流程

光说不练假把式。我们来看一个完整的实战流程:让 OpenCode 帮你修 TypeScript 项目的 lint 错误。

假设你有一个 Next.js 项目,src/utils/format.ts 里有一段代码:

export function formatDate(input: any): string {
  const d = new Date(input)
  const year = d.getFullYear()
  const month = d.getMonth() + 1
  const day = d.getDate()
  return year + "-" + month + "-" + day
}

这段代码有几个问题:

  1. any 类型——ESLint 的 @typescript-eslint/no-explicit-any 规则会报错
  2. 字符串拼接应该用模板字符串——Prettier 可能也会调整格式
  3. getMonth()getDate() 返回的数字没有补零

你告诉 OpenCode:

修复 src/utils/format.ts 里的所有 lint 错误,同时让日期格式正确(补零)

OpenCode 的 Agent 开始工作:

Step 1:读取文件

Agent 用 read 工具读取文件内容。

Step 2:LSP 诊断

TypeScript LSP 和 ESLint LSP 同时分析,返回诊断结果:

ESLint Error: Unexpected any. Specify a different type
  (@typescript-eslint/no-explicit-any)
  Line 1, Column 33

ESLint Warning: Unexpected string concatenation
  (@typescript-eslint/restrict-plus-operands)
  Line 5, Column 9

Step 3:Agent 修正代码

Agent 根据诊断结果修改代码:

export function formatDate(input: string | number | Date): string {
  const d = new Date(input)
  const year = d.getFullYear()
  const month = String(d.getMonth() + 1).padStart(2, "0")
  const day = String(d.getDate()).padStart(2, "0")
  return `${year}-${month}-${day}`
}

Step 4:Formatter 自动格式化

Prettier 自动检查格式,这段代码已经符合要求,不需要额外调整。

Step 5:LSP 二次诊断

TypeScript LSP 和 ESLint 再次检查,没有新的错误。Agent 确认修复完成。

整个流程 5 秒钟,你只说了一句话。如果手动来,你得先跑 eslint,看报错,逐个修,再跑一遍确认——至少 5 分钟。

更厉害的是,如果 Agent 修改后引入了新错误,LSP 会立刻捕获,Agent 会自动进入"修正→检查→再修正"的循环,直到所有诊断清零。这就是 LSP 给 AI 带来的质变。


作者: itech001 来源: 公众号:AI人工智能时代 主页: https://www.theaiera.cn(每日分享最前沿的AI新闻和技术)

本文首发于 AI人工智能时代,转载请注明出处。

Enjoyed this article? Share it with others!