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

发布时间:2026/9/25 8:37:54

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),仅供参考
延伸阅读

更多相关文章

2026/9/25 8:37:54

华为Atlas 300V推理卡部署YOLO模型实战指南

拿到这个标题的时候,我第一反应是:这又是一个坑。因为“atlas”这个词太宽了,数据库有个Atlas,机器人有Atlas,地图有Atlas,AI加速卡也有Atlas。但结合“atlas部署yolo”和“atlas 300v 24g 是运算加速卡吗”…

2026/9/25 8:37:54

昇腾Atlas 300V 24G部署YOLO实战:从选型到性能调优

第一次拿到 Atlas 300V 24G 这块卡的时候,说实话我的第一反应是“这玩意真能跑得动 YOLO 吗”。外观看起来就是一张普普通通的 PCIe 加速卡,没有风扇,没有视频输出接口,尺寸也不大,放在服务器里几乎没啥存在感。结果等…

2026/9/25 8:37:54

Atlas 300V 24G推理加速卡部署YOLO完整指南

搞推理加速卡这些年,我手上过过不少板卡,唯独Atlas 300V 24G这块卡,第一次拿到的时候真有点拿不准它到底算什么定位。你说它是运算加速卡吧,它确实能做推理;你说它不是吧,它和大众认知里那种标准GPU加速卡又…

2026/9/25 9:22:57

Atlas 300V实战:从零部署YOLO推理全流程

拿到Atlas 300V 24G这块卡的时候,我第一反应其实是有点懵的。群里有人问"这是不是运算加速卡",还有人问能不能拿来跑YOLO,但官方手册写得云里雾里,社区里的帖子又零散得很。我花了差不多两周时间,从刷固件、…

2026/9/25 9:22:57

Atlas 300V Pro部署YOLOv8全流程实战:从环境配置到推理调优

最近后台和私信里被问得最多的一件事,就是Atlas 300V Pro 24G这块卡到底怎么样,网上炒得火热,有人说是运算加速卡,有人说是智商税,还有人问能不能拿来跑YOLO。说实话,这块卡我前后折腾了小一个月&#xff0…

2026/9/25 9:17:57

AX接口不可靠时,AI如何用视觉+坐标操作macOS

1. 当 AX 接口开始"装死",AI 操作 macOS 的 Plan B 该怎么走做过 macOS 自动化的人大概都经历过这种时刻:脚本昨天还跑得好好的,今天突然就卡在某个按钮上死活点不动。你打开日志一看,AX(Accessibility&…

2026/9/24 20:24:47

GAMP 5 基于风险的计算机化系统验证:软件分类与审计追踪实践

简介:《A Risk-Based Approach to Compliant GxP Computerized Systems》即业内熟知的GAMP 5指南,面向制药企业质量与IT合规人员、验证工程师及计算机化系统管理者,用于解决GxP法规环境下系统合规性难以科学落地的问题。文档以风险管理为主线…

2026/9/23 12:06:55

安全托管MSSP实战:从静态防御到人机协同的攻防运营与应急响应

简介:这份PPT围绕互联网业务安全托管服务展开,面向企业安全负责人、IT运维人员及关注MSSP/MSS选型的读者,重点回应传统安全过度依赖人工、碎片化静态防御难以对抗产业化攻击等痛点。资源共1个pptx文件,包体约30.63MB,以…

2026/9/25 0:02:35

AI元人文:从工具使用到思维重构的深度探索

最近半年我一直在琢磨一件事:AI元人文到底是什么?说白了,就是“用元视角重新审视人与AI的关系”,也在“探索AI如何反向逼着我们发现自己的思考边界”。标题里的“元探索”,在我看就是一层套一层的追问——当你用AI解决…

2026/9/25 0:02:35

Python+CNN车牌识别实战:从数据预处理到模型训练与部署

简介:基于Python与卷积神经网络的车牌识别项目,面向计算机视觉初学者及智能交通开发者,目标是帮助用户掌握从数据预处理、模型构建到实际部署的完整流程。压缩包共25个文件,包含jpg/png图像样本、py训练脚本、md说明文档、dat数据…

2026/9/25 0:02:35

Vim基础操作全攻略:保存退出、模式切换与高频命令实战

1. 项目概述1.1 核心需求解析今天聊聊Vim。写这个题目的原因是:几乎每个后端开发者、运维人员、数据工程师某天都会遇到一个场景——深夜加班,服务器登录界面只有黑底白字,编辑器只有vi/vim,你必须在五分钟内完成一次配置修改并保…

2026/9/22 16:34:32

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/22 20:01:30

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/22 13:25:41

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑