☰
OpenCode 提示 LSPs disabled 别慌:手动启用 LSP 的配置清单与验证步骤
2026/10/10 14:42:53 网站建设 项目流程

1. 先别急着改配置:OpenCode 报 LSPs disabled 到底发生了什么

你第一次把 OpenCode 跑起来,终端里蹦出一行LSPs disabled,然后敲代码时补全没了、跳转没了、红色波浪线也没了。这个提示本身不吓人,它只是告诉你:当前会话里语言服务器协议(LSP)这一层没被拉起来。OpenCode 是一个把终端、编辑器能力和模型对话揉在一起的编码工具,LSP 负责的是「代码理解」那部分——补全、定义跳转、诊断、重命名。它关掉之后,模型照样能聊天,但你对代码的实时感知会明显变钝。

我先把结论放前面:OpenCode 的 LSP 默认就是关闭的。如果你在opencode.json里完全不写lsp字段,它不会自动帮你开,而是当成false处理。很多人以为是装坏了,其实只是没显式打开。这个设计有它的道理:LSP 服务器要下载二进制、要占端口、要读项目依赖,启动失败还会拖慢整个工作流,所以官方选择让用户自己决定要不要开。

适合读这篇的人有三类:刚装完 OpenCode 发现补全失灵的新手;从旧版本升上来、发现行为变了的开发者;以及配了 LSP 却还是看到 disabled、想搞清楚「失败抑制」机制的人。下面我会按「先确认状态 → 再写配置 → 然后验证 → 最后排错」的顺序走一遍,每一步都给可复制的片段和命令,你跟着做就能把补全和诊断找回来。

需要说明的是,OpenCode 的 V2 版本目前对 LSP 的处理还比较保守:它会加载并校验你的 LSP 配置,但在实际读写文件时还不一定会真正调用 LSP。所以即使你配置正确,某些场景下仍可能感觉「没生效」,这属于版本阶段的限制,不是你配错了。理解这一点,能帮你少走很多弯路。

2. 前置准备:TaoToken 接入与 OpenCode 的 LSP 配置关系

在动 LSP 之前,先把模型通道理顺,否则你开了 LSP 也只是本地代码理解恢复,模型那头还是断的。OpenCode 支持自定义 Base URL,把请求指向兼容 OpenAI 协议的服务即可。TaoToken 提供的就是这样一个入口,官网在 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 地址是 https://taotoken.net/api ,注意 API 这条不带 UTM 参数,配置里填干净的地址就行。

为什么先讲这个?因为 LSP 和模型通道是两条独立的链路。LSP 管本地代码语义,模型通道管对话和生成。你只开 LSP 不开模型,补全可能回来但对话报 401;只开模型不开 LSP,对话正常但代码诊断缺失。两件事分开排查,效率高很多。

拿 Key 的路径很直接:进控制台 https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,在 API Keys 页面创建一个密钥,复制出来。这个 Key 后面要填进 OpenCode 的配置里。如果你还没决定用哪个模型,可以先去模型对话页 https://taotoken.net/model-chat?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 试一下响应速度,再决定写进配置的 Model ID。

这里有个容易混的点:OpenCode 的配置里,模型相关字段和 LSP 字段是并列的,互不干扰。你完全可以在同一个opencode.json里既配模型又配 LSP。下面第三节我会给一份完整的可复制片段,把 Base URL、Key、Model ID 和 LSP 一次性写全,避免你来回改文件。

另外提醒一句,LSP 服务器本身是本地进程,和 TaoToken 没有直接关系。TaoToken 只负责模型请求。所以「LSPs disabled」这个提示,改 TaoToken 的配置是解决不了的,必须去 OpenCode 自己的配置文件里开 LSP。这一点先分清楚,后面排错才不会跑偏。

3. 可复制配置:在 opencode.json 里显式启用 LSP

OpenCode 读取的配置文件通常是项目根目录或用户目录下的opencode.json,也支持opencode.jsonc(带注释)。核心动作只有一个:把lsp字段显式写出来。最简形式是布尔值:

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

如果你既想保留内置的 LSP 服务器,又想之后加自定义服务器,用空对象形式更稳妥:

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

有用户实测,从 1.14.20 版本开始,配置里没有lsp字段时 LSP 会被完全禁用,手动补上"lsp": {}之后才恢复正常。所以哪怕你暂时不想细调,也建议至少写上空对象。

接下来把模型通道一起写进去,形成一份完整配置。注意 Base URL 填https://taotoken.net/api,Key 换成你在控制台创建的那串,Model ID 按你实际选的填:

{ "$schema": "https://opencode.ai/config.json", "lsp": {}, "provider": { "taotoken": { "type": "openai", "options": { "baseURL": "https://taotoken.net/api", "apiKey": "sk-你的Key" }, "models": { "your-model-id": {} } } } }

三件套对齐一下:Base URL 是https://taotoken.net/api,Key 是控制台里那串sk-开头的字符串,Model ID 是你选的模型标识。这三个缺一个,模型请求就会失败,但注意——它们和 LSP 是否启用无关。LSP 只看lsp字段。

如果你只是不想让 OpenCode 自动下载 LSP 服务器,而不是想禁用功能本身,可以设环境变量:

export OPENCODE_DISABLE_LSP_DOWNLOAD=true

这样它不会自动补装缺失的二进制,但你手动装好的 LSP 仍然能用。这个变量和lsp字段是两回事,别混淆:前者管「下不下载」,后者管「开不开功能」。

改完配置后,保存文件,然后重启 OpenCode 会话。因为「失败抑制」标记只在当前会话有效,重启会重新尝试启动 LSP 服务器。这一步别省,很多人改完不重启,看到的还是旧状态。

4. 验证请求:确认 LSP 真的起来了

配置写完,怎么知道 LSP 生效了?分两步验证:先看启动日志,再用实际编辑行为确认。

第一步,重启 OpenCode 后观察终端输出。如果之前那行LSPs disabled消失了,说明配置被读到了。如果还在,往下看第五节。你也可以主动触发一次诊断:打开一个 TypeScript 文件,故意写一个类型错误,比如把const a: number = "x"写进去。如果 LSP 正常,编辑器区域会出现红色波浪线或诊断提示;如果没有任何反应,说明 LSP 没真正跑起来。

第二步,检查具体服务器状态。OpenCode 在启动 LSP 服务器时,如果某个服务器启动失败(二进制不存在、端口冲突、环境不满足等),会把它标记为broken,并在同一会话里不再重试。你可以在日志里搜broken或对应服务器的名字。比如 rust-analyzer 没装,日志里会有找不到可执行文件的记录。

手动补装缺失的服务器是常见操作。TypeScript 项目需要 tsserver 或 typescript-language-server:

npm install -g typescript-language-server typescript

Rust 项目需要 rust-analyzer:

rustup component add rust-analyzer

Go 项目需要 gopls:

go install golang.org/x/tools/gopls@latest

装完之后,如果你之前设了OPENCODE_DISABLE_LSP_DOWNLOAD=true,可以取消掉让它自动补装,或者保持手动管理:

unset OPENCODE_DISABLE_LSP_DOWNLOAD

然后再次重启会话。因为 broken 标记不跨会话,重启后会重新尝试。实测下来,大部分「配了还是 disabled」的情况,都是因为某个服务器启动失败被抑制了,而不是配置没写对。

验证模型通道是否也通,可以单独发一条请求测试。如果你在配置里填了 TaoToken 的 Base URL 和 Key,OpenCode 的对话功能应该能正常返回。这一步和 LSP 分开测,避免两个问题混在一起。模型对话入口在 https://taotoken.net/model-chat?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,可以先用它确认 Key 有效,再回到 OpenCode 里排查。

5. 常见报错排查:401、local proxy failed、reading choices、OAuth

这一节按真实报错对照,帮你快速定位。注意区分「LSP 问题」和「模型通道问题」,两者的报错长得完全不一样。

401 Unauthorized:这是模型通道的错,不是 LSP。说明你的 Key 无效、过期,或者 Base URL 填错了。检查baseURL是不是https://taotoken.net/api,Key 是不是从控制台 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 复制的那串。注意别把 Key 里的空格带进去。三件套里 Base URL、Key、Model ID 任何一个不对,都可能报 401 或 404。

local proxy failed:通常出现在你本地配了转发或代理层的情况下。OpenCode 尝试连接你配置的地址失败。先确认https://taotoken.net/api能直连,再检查配置文件里有没有多余的代理字段。这个错和 LSP 无关,别去改lsp字段。

reading choices 相关报错:一般是响应体格式不符合预期,常见于 Base URL 指向了非兼容端点,或者 Model ID 写错导致返回了错误结构。确认你填的 Model ID 在 TaoToken 侧是有效的,并且 Base URL 用的是/api这个根路径。

OAuth 相关报错:如果你用的是需要 OAuth 的客户端(比如某些 Claude Code 场景),配置方式不一样。Claude Code 的接入文档在 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,里面有 Base URL、Key、Model ID 的完整填法。OAuth 报错通常意味着认证流程没走完,或者把 API Key 模式误用成了 OAuth 模式。

回到 LSP 本身,如果你看到的是LSPs disabled而不是上面这些,那基本就是两种情况:一是lsp字段没写或写成false;二是某个服务器启动失败被标记 broken。前者改配置,后者看日志补装二进制。V2 版本还有个额外限制:它目前仅加载和验证 LSP 配置,实际读写文件时还不会调用 LSP。所以如果你配置全对、日志也没报错,但补全还是没反应,先确认一下你的 OpenCode 版本是不是 V2,这属于版本阶段行为,不是配置问题。

排查顺序建议固定下来:先看lsp字段 → 再看日志有没有 broken → 再确认二进制是否安装 → 最后确认版本限制。按这个顺序走,基本不会漏。

6. 长期编码与 Agent 场景:把配置固化下来

LSP 配好只是第一步。如果你打算长期用 OpenCode 做编码和 Agent 任务,建议把配置固化到项目里,而不是每次手动改。把opencode.json提交到仓库,团队成员拉下来就能用同一套 LSP 和模型设置。注意 Key 不要硬编码进仓库,用环境变量注入更安全。

对于需要长时间跑编码任务、多轮 Agent 调用的场景,可以了解 Coding Plan:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。它更适合持续性的编码工作流,和单次对话的用法不一样。配置方式仍然是 Base URL 加 Key 加 Model ID 三件套,接入文档在 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 里有详细说明。

最后给一个实用习惯:每次升级 OpenCode 后,重新跑一次验证步骤。因为版本行为可能变化,比如 1.14.20 前后对lsp字段的处理就不一样。升级后先打开一个测试文件,确认诊断还在,再投入正式工作。这样能把「LSPs disabled」这类问题挡在开工之前。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询