xberg C API 实战:用 xberg_list_reranker_backends 枚举全部已注册的 Reranker 后端

发布时间:2026/9/25 8:37:55
xberg C API 实战:用 xberg_list_reranker_backends 枚举全部已注册的 Reranker 后端 后端AI 应用NLP【免费下载链接】xbergPolyglot document intelligence with a Rust core: extract text, metadata, images, tables, and structured data from 106 formats across 140 file extensions, plus code intelligence for 371 languages. Fifteen bindings, with CLI, REST API, and MCP server.项目地址https://gitcode.com/gh_mirrors/kr/xberg点击查看免费下载本文围绕 xberg 的 C FFI 接口xberg_list_reranker_backends展开讲解如何从 C 代码枚举当前进程内所有已注册的 reranker重排序后端、如何正确释放其返回的 JSON 字符串并沿着 FFI 层深入 Rust 核心的全局注册表与RerankerBackend插件契约说明该函数在整个 reranker 生命周期管理注册、枚举、注销、清空中的定位。读完本文你可以在任意 C/C 项目中安全地调用 xberg 的插件管理接口并理解其返回值的内存约定与错误处理机制。1. 接口调用与完整 C 示例xberg_list_reranker_backends的功能非常直接列出所有已注册的 reranker 后端名称。官方生成的 C 示例如下对应文档 list_reranker_backends该文件由 alef 工具自动生成可通过alef e2e generate重新生成、alef verify校验新鲜度#include assert.h #include stdint.h #include stdio.h #include stdlib.h #include string.h #include xberg.h int main(void) { char* result xberg_list_reranker_backends(); xberg_free_string(result); return EXIT_SUCCESS; }对应的测试契约在 list_reranker_backends.json 中定义类别为reranker_backend_management断言为not_error调用不报错即通过副作用标记为safe只读操作不修改注册表状态。两个关键调用细节返回值是库拥有的 C 字符串。xberg_list_reranker_backends返回char*内容为 JSON 序列化的名称列表即 Rust 侧VecString经serde_json::to_string的输出未注册任何后端时形如[]。指针必须用xberg_free_string释放且指针可能为null失败情形。配套长度函数。头文件 xberg.h 中同时声明了xberg_list_reranker_backends_len(void)它返回最近一次调用产生的 C 字符串字节长度。该注释明确说明其用途让 Zig、Java FFM Panama 等语言在构造字节切片时无需做 NUL 扫描。主调用失败或尚未产生字符串时返回 0。该函数在 xberg 中的定位头文件注释原文List the names of all registered reranker backends. Used byxberg-cli, the api/mcp endpoints, and generated language bindings.——它是 CLI、REST/MCP 端点以及各语言绑定共享的统一枚举入口。2. FFI 层实现JSON 字符串、panic 防护与错误上报从源码看xberg_list_reranker_backends在 xberg-ffi/src/lib.rs 中实现其结构是 alef 生成的标准 FFI 包装模式pub unsafe extern C fn xberg_list_reranker_backends() - *mut std::ffi::c_char { clear_last_error(); match std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| { set_last_return_len(xberg_list_reranker_backends, 0); let result xberg::list_reranker_backends(); match result { Ok(val) match serde_json::to_string(val) { Ok(__alef_return) match CString::new(__alef_return) { Ok(cs) { set_last_return_len(xberg_list_reranker_backends, cs.as_bytes().len()); cs.into_raw() } ...其中值得 C 调用方注意的三个机制Rust panic 不会跨越 FFI 边界传播。整个业务逻辑被std::panic::catch_unwind包裹panic 时返回null且只有当尚未记录更具体的错误时才写入通用的 panic 标记源码注释解释了这一点某些错误如转换失败会先通过set_last_error上报更具体的信息panic 处理不能覆盖它。错误通过线程局部状态上报。调用开始先clear_last_error()失败路径调用set_last_error(alef_ffi_error_code(e), e.to_string())。C 侧应检查返回指针是否为null必要时配合xberg_last_error_*系列函数获取错误码与上下文。成功路径的返回长度被记录。set_last_return_len写入字符串字节长度含 NUL这就是xberg_list_reranker_backends_len读取的值序列化失败结果中含内嵌 NUL 导致CString::new失败理论上不会发生同样返回null。Rust 核心侧的入口是xberg::list_reranker_backends它由 xberg/src/lib.rs 与同族的register_reranker_backend、unregister_reranker_backend、clear_reranker_backends一起重新导出构成完整的后端管理 API 面。3. Rust 核心全局注册表与 list 的实现真正的实现位于 xberg/src/plugins/reranker.rs/// List the names of all registered reranker backends. /// /// Used by xberg-cli, the api/mcp endpoints, and generated language /// bindings. /// pub fn list_reranker_backends() - ResultVecString { use crate::plugins::registry::get_reranker_backend_registry; let registry get_reranker_backend_registry(); let registry registry.read(); Ok(registry.list()) }实现只有四行但它依赖的注册表结构值得展开。全局注册表定义在 registry/mod.rspub static RERANKER_BACKEND_REGISTRY: LazyLockArcRwLockRerankerBackendRegistry LazyLock::new(|| Arc::new(RwLock::new(RerankerBackendRegistry::new())));可以推断出以下设计特征懒初始化 进程级单例。LazyLock保证注册表在首次访问时才创建Arc使get_reranker_backend_registry()可以把句柄安全地拷贝给任意线程读写锁保护。parking_lot::RwLock区分读list、get与写register、remove、shutdown_all操作list_reranker_backends走的是registry.read()读锁路径因此枚举不会阻塞注册/注销之外的其他读取者也不会产生副作用——这与契约文件中标注的side_effect: safe一致list()的返回值是名称集合。参照同族注册表如 embedding.rs 的list()实现为self.backends.keys().cloned().collect()reranker 注册表的list()返回后端在注册时以Plugin::name()为键存入的键列表。4. 注册表里装的是什么RerankerBackend 插件契约list_reranker_backends列出的每个名字都对应一个通过register_reranker_backend注册、实现了RerankerBackendtrait 的对象。该 trait 定义在 plugins/reranker.rs是理解这个枚举接口列出的是什么的关键pub trait RerankerBackend: Plugin { /// Score a list of documents against a query. /// /// Returns one raw logit per document in the same order as the input. /// The dispatcher applies sigmoid to convert to [0, 1] scores. async fn rerank(self, query: String, documents: VecString) - ResultVecf32; }trait 文档注释L47-L103明确了插件契约这些约束决定了list结果中每个后端在后续rerank调度中的行为契约项内容返回长度rerank必须返回恰好documents.len()个分数顺序与输入一致dispatcher 会校验不合规后端表现为XbergError::Validation而非 panic分数语义后端返回原始 logit任意值域dispatcher 负责对其施加 sigmoid 得到[0,1]分数、按分数降序排序、并截断到top_k线程安全后端必须Send Sync static以Arcdyn RerankerBackend存储并可能被并发调用模型本身非线程安全时须在后端内部加锁关停语义Plugin::shutdown()可能与在途的rerank()并发实现必须容忍这一点运行时要求同步rerank入口依赖多线程 tokio 运行时block_in_placecurrent_thread运行时中应改用rerank_async注册函数本身L117-L123的校验规则同样重要因为它们直接影响list_reranker_backends的输出名称为空或含空白 →XbergError::Validation名称已被占用 →XbergError::Plugin重复注册被拒绝且被拒绝的注册不会在列表中留下任何痕迹后端initialize()的错误会向上抛出。这些规则在模块内单元测试中被逐一验证L205-L267register_list_unregister_roundtrip验证注册后 list 含该名字 → 注销后 list 为空empty_name_rejected_via_global_api验证被拒绝的注册不残留duplicate_name_rejected_via_global_api验证重复注册被拒且原后端不受影响register_list_clear_list_roundtrip验证clear_reranker_backends后 list 为空。5. 完整生命周期管理list 在 API 族中的位置list_reranker_backends不是孤立接口而是与注册/注销/清空构成的管理四元组之一。从 plugins/reranker.rs 看四个函数均通过get_reranker_backend_registry()获取全局注册表C FFI 函数Rust 函数行为xberg_list_reranker_backendslist_reranker_backends读锁枚举全部后端名称返回 JSON 数组字符串xberg_register_reranker_backendregister_reranker_backend(Arcdyn RerankerBackend)以Plugin::name()为键注册调用initialize()xberg_unregister_reranker_backendunregister_reranker_backend(name)按名移除并调用shutdown()未注册时为空操作xberg_clear_reranker_backendsclear_reranker_backends对每个已注册后端调用shutdown()后清空注册表首个shutdown()错误会中止后续处理典型的使用场景是发现—使用模式先调用xberg_list_reranker_backends探测当前构建与运行时中有哪些插件后端可用再在RerankerModelType::Plugin配置中以同名引用见 reranker.rs 注册函数文档can be referenced fromRerankerModelType::Pluginby the same name。xberg 除插件变体外还提供Presetfast/balanced/quality/multilingual等内置 cross-encoder首次使用时从 HuggingFace 懒加载并缓存于~/.cache/xberg/rerankers/、CustomHuggingFace ONNX 仓库与Llmprovider 托管 reranker等模型类型插件变体是调用方复用自有模型的通道——详见 reranking 指南。6. 跨语言一致性与 E2E 验证list_reranker_backends的行为契约由多语言 E2E 套件共同守护。Rust 侧测试 reranker_backend_management_test.rs 直接调用核心 APIuse xberg::{clear_reranker_backends, list_reranker_backends}; #[test] fn test_list_reranker_backends() { // List all registered reranker backends let _ list_reranker_backends().expect(call failed); }同一 fixturelist_reranker_backends还生成了 Node、Python、PHP、Zig、Ruby、Elixir、WASM 等语言的对应测试如 e2e/node/tests/reranker_backend_management.test.ts、e2e/python/tests/test_reranker_backend_management.py各语言绑定中也暴露了同名 API如 Python 的list_reranker_backends位于 packages/python/xberg/api.py。这意味着本文描述的 C 行为JSON 字符串返回、失败置错是所有语言绑定的统一契约C 只是其中直接面对裸 ABI 的那一层。7. C 调用方实践要点综合上述实现C 侧调用xberg_list_reranker_backends的建议写法是char* result xberg_list_reranker_backends(); if (result NULL) { /* 失败通过 xberg_last_error_* 获取错误码/信息 */ return EXIT_FAILURE; } size_t len xberg_list_reranker_backends_len(); /* 可选避免 strlen 扫描 */ /* result 为 JSON 数组字符串如 [my-reranker] 或 [] */ xberg_free_string(result); /* 必须释放传 NULL 亦安全 */要点归纳先判空再使用失败时错误细节在线程局部状态中不会出现在返回值里必须配对xberg_free_string释放这是 xberg 所有返回char*接口的统一内存约定见 xberg.h 中xberg_free_string的 Safety 说明Pointer must have been returned by this library, or be null返回值语义是当前进程内已注册的插件后端而不是当前构建支持的所有模型类型——内置 Preset 后端不经过插件注册表不会出现在列表里由于list走读锁且无副作用可在热路径中反复调用如请求到来时动态探测不会干扰注册表状态。通过这一接口C 程序获得了与其他语言绑定完全对等的 reranker 后端可观测性枚举、按名引用、注销与清空全部围绕同一个 Rust 全局注册表运作。赞分享后端AI 应用NLP【免费下载链接】xbergPolyglot document intelligence with a Rust core: extract text, metadata, images, tables, and structured data from 106 formats across 140 file extensions, plus code intelligence for 371 languages. Fifteen bindings, with CLI, REST API, and MCP server.项目地址https://gitcode.com/gh_mirrors/kr/xberg点击查看免费下载相关推荐xberg C FFI 插件 API 实战xberg_list_embedding_backends 枚举已注册嵌入后端xberg C FFI 插件 API 实战xberg_list_embedding_backends 枚举已注册嵌入后端 本文以 xberg 的 C FFI后端AI 应用NLPxberg C FFI用 xberg_clear_reranker_backend 清空 reranker 后端注册表xberg C FFI用 xberg_clear_reranker_backend 清空 reranker 后端注册表 在 xberg一个以 Rust 为核后端AI 应用NLPxberg C 插件 API 实战用 xberg_clear_embedding_backend 清空全局嵌入后端注册表xberg C 插件 API 实战用 xberg_clear_embedding_backend 清空全局嵌入后端注册表 本文围绕 xberg 的 C FFI后端AI 应用NLP上一篇ComfyUI-WanVideoWrapper完整教程Block Swap技术如何让低显存显卡也能流畅生成高质量视频下一篇Causify development system移动端开发的实用工具创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考