搓了个给 Agent 用的 LSP 增强层,弥补 Claude Code 目前的代码理解短板 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
observerw
V2EX    分享创造

搓了个给 Agent 用的 LSP 增强层,弥补 Claude Code 目前的代码理解短板

  •  1
    &nbs;
  •   observerw 10 天前 1313 次点击

    最近高强度用各种 AI Coding Agent 写代码,发现一个挺无语的现象。现在的 Agent (包括最近很火的 Claude Code )查代码主要还是靠 grep/ripgrep 暴力搜索。小项目还好,代码一多,或者遇到复杂的跨模块引用,正则匹配根本搞不定。这就导致 Agent 想重构代码的时候唯唯诺诺,生怕改了一个文件把隔壁模块搞挂了。

    虽然 Claude Code 官方也在推进 LSP 支持,但目前体验确实还差点意思。之前试过社区里的一些方案(像 Serena ,cclsp ),大多只是简单粗暴地把 LSP 原始 JSON 扔给 LLM 。这种做法最大的问题是费 Token 且慢,Agent 往往需要往返交互十几次才能搞懂一个函数的上下文。

    实在受不了这个效率,就自己动手造了个轮子叫 lsp-skill

    跟市面上其他简单的 LSP 包装器不同,lsp-skill 应该是目前唯一一个把“写操作”作为核心能力的方案。绝大多数竞品都停留在“只读”阶段(查查定义、找找引用),但 lsp-skill 支持完整的重构预览。这意味着 Agent 不再是瞎改,而是能像人一样,在重命名变量前先生成跨文件的 Diff 预览,确认无误了再下手。这点在维护大型遗留代码时非常关键。

    另外一个比较独特的设计是它的扩展机制。通常 LSP 工具只懂语法不懂框架,但我们引入了基于 Markdown 的 Best Practices 系统。你不需要懂底层代码,只要写个 Markdown 文档,就能教 Agent 怎么处理 Django 的 View 或者 React 的 Hooks 。这种让社区通过文档来定义“代码导航策略”的做法,目前还没在其他工具里见到过。

    这些特性加上它是完全为 LLM 优化的(输出 Markdown 而不是 JSON ),算是在“Agent Native”这个方向上走得比较远的一次尝试。

    架构上为了稳,拆成了 lsp-client 处理底层脏活( Server 生命周期、多 Workspace 管理),中间层做协议转换,最上层通过 MCP 对接 Claude Code 或者 Cursor 。目前 Python, TS, Go, Rust, Deno 这些主流语言都已经支持了。

    有兴趣的朋友可以玩玩看,如果是做 Agent 开发或者对 MCP 感兴趣的,也可以看看我们的 Protocol 设计,说不定能有点启发。

    GitHub: https://github.com/lsp-client/lsp-skill 文档: https://lsp-client.github.io/

    第 1 条附言    10 天前

    哦对了忘了说了,我觉得最值得说道的是我设计的协议层 LSAP。

    我将Agent与LSP的这套交互模式标准化为了 **LSAP (Language Server Agent Protocol)**,它将 LSP 面向编辑器的“原子操作”封装为面向 Agent 的“认知指令”,让 Agent 可以直接获取聚合好的 Markdown 代码报告,而无需通过多次往返交互来拼凑上下文,从而显著降低 Token 消耗并提升准确率。

    以查找引用举例:

    • LSAP 指令: mode: "references" (配合 locate 或 find 参数)
    • 底层编排 LSP 操作:
      • textDocument/hover: 确认符号定义信息。
      • textDocument/references: 获取所有引用位置列表。
      • textDocument/documentSymbol: 识别引用点所属的函数或类(上下文感知)。
      • 文件读取: 读取引用点周围的代码片段。
    • 返回结果: 结构化 Markdown 报告
      • 不仅仅是简单的“文件名:行号”,而是按文件分组,明确指出引用所在的上下文(例如:In LoginHandler.authenticate)。直接包含代码片段,Agent 无需额外读取文件即可理解用法。

    Agent 看到的信息将会是这样的:

    # References Found Total references: 12 | Showing: 2 ### src/auth/login.py:45 In `LoginHandler.authenticate` (`method`) ```python 44 | def authenticate(credentials): 45 | if not User.validate(credentials): 46 | raise AuthError() ``` -- Authenticate the login data. ### src/api/register.py:28 In `register_user` (`function`) ```python 27 | def register_user(new_user_data): 28 | User.validate(new_user_data) 29 | db.save(new_user_data) ``` 
    10 条回复    2026-01-09 16:54:39 +08:00
    fusi
        1
    fusi  
       10 天前 via Android
    牛逼!下午就试一试
    Oilybear
        2
    Oilybear  
       10 天前
    来支持了
    shunia
        3
    shunia  
       10 天前
    1. 安装 skill ( codex 手动拷贝)
    2. codex 用 gpt-5.2 + high ,项目是一个 Javascript 的项目,给了 Agent 权限(可读写)
    3. 输入 "用 lsp_skill 帮我读一下这个项目的代码,准备回答我的问题"
    4. 中间一大堆“使用 lsp-cli 对渲染核心模块生成符号大纲需要语言服务器与本地 socket 通信,需提升权限运行。”,需要手动确认
    5. 烧了 30%的 context ,似乎能用了
    6. 持续提示 “使用 lsp-cli 对渲染核心模块生成符号大纲需要语言服务器与本地 socket 通信,需提升权限运行。”


    我个人感觉似乎不太好用?
    observerw
        4
    observerw  
    OP
       10 天前
    @shunia 可以把具体过程在 https://github.com/lsp-client/lsp-skill 中提一个 Issue 吗,非常感谢
    lsk569937453
        5
    lsk569937453  
       10 天前
    看来你没看过这个观点。Claude Code 核心工程师:「 Bash 即一切」,https://www.zhihu.com/question/1992208967498236682/answer/1992396321282357047
    aminobody
        6
    aminobody  
       10 天前
    我很好奇为什么现在主流的 vibe code 工具都没用 lsp 呢?
    observerw
        7
    observerw  
    OP
       10 天前
    @lsk569937453 Anthropic 他们向来都是说一套做一套的 MCP 是他们先提出的,bash 即一切也是他们提出的,有点左右脑互博了

    此外,bash 即一切这个思想是好的,基于 Unix 哲学当然没什么问题;但这也是有前提的,那就是在 bash 中有好用的命令行工具。比如让 Agent 操作 GitHub 一般来说会使用 `gh` 命令行工具,而不是 “你必须通过 curl 请求 GitHub 的 API 端点“。

    我这个项目就是基于这种思想来设计的。我提供给 Agent 的不是若干 LSP 工具,而是一个名为 `lsp` 的命令行工具( https://github.com/lsp-client/lsp-cli )。Agent 可以在 bash 中调用这个工具来探索代码仓库。我感觉这种设计还是比较符合 Bash 即一切的思想的,有兴趣欢迎来看看~
    observerw
        8
    observerw  
    OP
       10 天前
    @aminobody 我老早就在想这个问题了 Claude Code 早些时候非得嘴硬说 "grep 加上 LLM 的理解能力就已经足够强大了,不需要额外工具“,结果现在还不是在做 LSP 支持(而且做的还不是很好)
    vonfry
        9
    vonfry  
       10 天前
    observerw
        10
    observerw  
    OP
       10 天前
    @vonfry 谢邀,我还是做了竞品调研的 Serena 提供的 LSP 能力局限于搜索引用定义之类的,比较有局限性;相较而言我这个项目能做的事情就更多,而且能够轻易的持续扩展,可以说比 Serena 要强大的多,具体请看 https://github.com/lsp-client/LSAP 中的设计理念部分
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3268 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 22ms UTC 00:39 PVG 08:39 LAX 16:39 JFK 19:39
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86