ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

OpenCode 提示 LSPs disabled 别慌:手动启用 LSP 的配置清单与验证步骤

OpenCode 提示 LSPs disabled 别慌:手动启用 LSP 的配置清单与验证步骤 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_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 地址是 https://taotoken.net/api 注意 API 这条不带 UTM 参数配置里填干净的地址就行。为什么先讲这个因为 LSP 和模型通道是两条独立的链路。LSP 管本地代码语义模型通道管对话和生成。你只开 LSP 不开模型补全可能回来但对话报 401只开模型不开 LSP对话正常但代码诊断缺失。两件事分开排查效率高很多。拿 Key 的路径很直接进控制台 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 在 API Keys 页面创建一个密钥复制出来。这个 Key 后面要填进 OpenCode 的配置里。如果你还没决定用哪个模型可以先去模型对话页 https://taotoken.net/model-chat?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_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 里显式启用 LSPOpenCode 读取的配置文件通常是项目根目录或用户目录下的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/apiKey 换成你在控制台创建的那串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/apiKey 是控制台里那串sk-开头的字符串Model ID 是你选的模型标识。这三个缺一个模型请求就会失败但注意——它们和 LSP 是否启用无关。LSP 只看lsp字段。如果你只是不想让 OpenCode 自动下载 LSP 服务器而不是想禁用功能本身可以设环境变量export OPENCODE_DISABLE_LSP_DOWNLOADtrue这样它不会自动补装缺失的二进制但你手动装好的 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-servernpm install -g typescript-language-server typescriptRust 项目需要 rust-analyzerrustup component add rust-analyzerGo 项目需要 goplsgo install golang.org/x/tools/goplslatest装完之后如果你之前设了OPENCODE_DISABLE_LSP_DOWNLOADtrue可以取消掉让它自动补装或者保持手动管理unset OPENCODE_DISABLE_LSP_DOWNLOAD然后再次重启会话。因为 broken 标记不跨会话重启后会重新尝试。实测下来大部分「配了还是 disabled」的情况都是因为某个服务器启动失败被抑制了而不是配置没写对。验证模型通道是否也通可以单独发一条请求测试。如果你在配置里填了 TaoToken 的 Base URL 和 KeyOpenCode 的对话功能应该能正常返回。这一步和 LSP 分开测避免两个问题混在一起。模型对话入口在 https://taotoken.net/model-chat?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 可以先用它确认 Key 有效再回到 OpenCode 里排查。5. 常见报错排查401、local proxy failed、reading choices、OAuth这一节按真实报错对照帮你快速定位。注意区分「LSP 问题」和「模型通道问题」两者的报错长得完全不一样。401 Unauthorized这是模型通道的错不是 LSP。说明你的 Key 无效、过期或者 Base URL 填错了。检查baseURL是不是https://taotoken.net/apiKey 是不是从控制台 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_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_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_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 Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。它更适合持续性的编码工作流和单次对话的用法不一样。配置方式仍然是 Base URL 加 Key 加 Model ID 三件套接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 里有详细说明。最后给一个实用习惯每次升级 OpenCode 后重新跑一次验证步骤。因为版本行为可能变化比如 1.14.20 前后对lsp字段的处理就不一样。升级后先打开一个测试文件确认诊断还在再投入正式工作。这样能把「LSPs disabled」这类问题挡在开工之前。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进