75 lines
2.3 KiB
Markdown
75 lines
2.3 KiB
Markdown
你可以在 clice 中实现一个 server plugin 来扩展 clice 的功能。
|
||
|
||
## 用例
|
||
|
||
当你使用 `clice` 作为 LLM 代理的 LSP 后端时,比如 claude code,你可以添加插件来提供一些额外功能。
|
||
|
||
## 编写插件
|
||
|
||
当一个插件被服务器加载时,它会调用 `clice_get_server_plugin_info` 来获取关于这个插件的信息以及如何注册它的定制点。
|
||
|
||
这个函数需要由插件实现,请参考下面的示例:
|
||
|
||
```cpp
|
||
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](/include/Server/PluginDef.h) 了解更多细节。
|
||
|
||
## 编译插件
|
||
|
||
插件必须使用与 clice 一致的依赖和编译器选项来编译,否则会导致 undefined behavior。[config/llvm-manifest.json](/config/llvm-manifest.json) 中定义了 clice 使用的构建信息。
|
||
|
||
## 加载插件
|
||
|
||
为了安全考虑,clice 不允许通过配置文件来加载插件,而必须通过命令行选项来指定插件的路径。
|
||
|
||
在 `clice` 启动时,它会加载所有在命令行中指定的插件。你可以通过 `--plugin-path` 选项来指定插件的路径。
|
||
|
||
```shell
|
||
$ clice --plugin-path /path/to/my-plugin.so
|
||
```
|
||
|
||
## 获取 `CLICE_PLUGIN_DEF_HASH` 的内容
|
||
|
||
在 `clice_get_server_plugin_info` 函数中需要返回两个值。
|
||
|
||
- `CLICE_PLUGIN_API_VERSION` 用于确保插件和服务器之间的 `clice_get_server_plugin_info` 函数的一致性。
|
||
- `CLICE_PLUGIN_DEF_HASH` 用于确保插件和服务器之间的 C++ 声明的一致性。
|
||
|
||
要调试 `CLICE_PLUGIN_DEF_HASH` 的内容,你可以运行以下命令:
|
||
|
||
```shell
|
||
$ 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 源码格式的文件,内容大致如下:
|
||
|
||
```cpp
|
||
#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
|
||
```
|