你可以在 clice 中实现一个 server plugin 来扩展 clice 的功能。
当你使用 clice 作为 LLM 代理的 LSP 后端时,比如 claude code,你可以添加插件来提供一些额外功能。
当一个插件被服务器加载时,它会调用 clice_get_server_plugin_info 来获取关于这个插件的信息以及如何注册它的定制点。
这个函数需要由插件实现,请参考下面的示例:
extern "C" ::clice::PluginInfo LLVM_ATTRIBUTE_WEAK
clice_get_server_plugin_info() {
return {
CLICE_PLUGIN_API_VERSION, "MyPlugin", "v0.1", CLICE_PLUGIN_DEF_HASH,
[](ServerPluginBuilder builder) { ... }
};
}请参考 PluginDef.h 了解更多细节。
插件必须使用与 clice 一致的依赖和编译器选项来编译,否则会导致 undefined behavior。config/llvm-manifest.json 中定义了 clice 使用的构建信息。
为了安全考虑,clice 不允许通过配置文件来加载插件,而必须通过命令行选项来指定插件的路径。
在 clice 启动时,它会加载所有在命令行中指定的插件。你可以通过 --plugin-path 选项来指定插件的路径。
$ clice --plugin-path /path/to/my-plugin.so在 clice_get_server_plugin_info 函数中需要返回两个值。
CLICE_PLUGIN_API_VERSION用于确保插件和服务器之间的clice_get_server_plugin_info函数的一致性。CLICE_PLUGIN_DEF_HASH用于确保插件和服务器之间的 C++ 声明的一致性。
要调试 CLICE_PLUGIN_DEF_HASH 的内容,你可以运行以下命令:
$ git clone https://github.com/clice-io/clice.git
$ cd clice
$ git checkout `clice --version --git-describe`
$ python scripts/plugin-def.py content > /tmp/plugin-proto.h你将会得到一个 C 源码格式的文件,内容大致如下:
#if 0
// begin of config/llvm-manifest.json
[
{
"version": "21.1.4+r1",
"filename": "arm64-macos-clang-debug-asan.tar.xz",
"sha256": "7da4b7d63edefecaf11773e7e701c575140d1a07329bbbb038673b6ee4516ff5",
"lto": false,
"asan": true,
"platform": "macosx",
"build_type": "Debug"
},
...
]
...
#endif