ARTICLE DETAIL

资讯详情

深耕商务建站与企业官网运营的一线实战洞察。

用 Dart 枚举 Xberg 注册表中的 Embedding Backends:从 API 调用到 Rust 注册表实现解析

用 Dart 枚举 Xberg 注册表中的 Embedding Backends:从 API 调用到 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点击查看免费下载这篇指南围绕 XbergRust 内核、多语言绑定的文档智能引擎的 Dart 绑定讲解如何通过XbergBridge.listEmbeddingBackends()一次性列出进程内所有已注册的 embedding backend 插件。读完你将掌握 Dart 侧完整的调用范式RustLib.init()→ 调用 →RustLib.dispose()、返回值的语义边界以及从 Dart 到 flutter_rust_bridge 再到 Rust 全局注册表的整条调用链并了解它如何与注册、反注册、清空等配套 API 协同工作。什么是 Embedding Backend 注册表在 Xberg 中embedding文本向量化并不只有内置的 ONNX 模型下载这一条路径。仓库在 crates/xberg/src/plugins/embedding.rs 中定义了一套进程内插件机制调用方可以把自己加载好的嵌入模型例如sentence-transformers、自训练的 ONNX 模型等包装成EmbeddingBackendtrait 实现通过register_embedding_backend注册进一个全局注册表之后在配置中按名字引用即可Xberg 本身不持有模型所有权。这个全局注册表就是EmbeddingBackendRegistry实现在 crates/xberg/src/plugins/registry/embedding.rs与 OCR 注册表不同embedding 注册表默认不注册任何后端——所有 embedding backend 都由宿主语言在运行时提供每个条目是一个RegisteredBackend内部缓存了该后端在注册时上报的dimensions()向量维度后续分派与形状校验都用这个缓存值不再重复调用后端的 live 方法注册表用AHashMapString, RegisteredBackend以插件名Plugin::name()为键存储。list_embedding_backends就是这个注册表的枚举入口底层实现极简获取全局注册表的读锁后调用registry.list()把键集合克隆成VecString返回见 crates/xberg/src/plugins/embedding.rs。完整示例列出所有已注册的 Embedding Backends下面是仓库中由 alef 自动生成的 Dart 代码片段原始文档位于 docs-site/src/snippets-generated/dart/registry/list_embedding_backends.md它是 Dart 侧枚举 embedding backends 的标准写法可以直接复制运行import dart:io; import package:xberg/xberg.dart; import package:xberg/src/xberg_bridge_generated/frb_generated.dart show RustLib; Futurevoid main() async { await RustLib.init(); try { final result await XbergBridge.listEmbeddingBackends(); stdout.writeln(result); } finally { RustLib.dispose(); } }代码结构可以拆成三个关键环节初始化桥接层await RustLib.init()负责加载本地原生动态库并建立 Dart ↔ Rust 的 flutter_rust_bridge 通道。注意这里是从生成的frb_generated.dart中按名导入RustLib而不是从主包导入发起调用XbergBridge.listEmbeddingBackends()是一个static FutureListString方法返回ListString后端名字列表失败时抛出XbergError释放资源用finally保证RustLib.dispose()一定会执行避免 native 资源泄漏。运行前提与依赖环境要让上面的代码跑起来需要满足几个前提安装 Dart 包执行dart pub add xbergFlutter 项目用flutter pub add xberg。包信息见 packages/dart/pubspec.yaml包名为xberg依赖flutter_rust_bridge: 2.13.0SDK 约束为3.11.0 4.0.0native 库该绑定通过 flutter_rust_bridge 与 Rust 内核通信需要本地原生动态库可用包内download_libsexecutable 负责下载带 SHA-256 校验的原生库发布产物线程栈仓库的端到端测试在初始化前会设置RUST_MIN_STACK1677721616 MiB以适配 Rust 侧的深调用栈需求见 e2e/dart/test/embedding_backend_management_test.dart生产环境如果遇到栈溢出问题可参考该设置。此外与 embedding 相关的还有一个环境变量值得留意XBERG_EMBEDDING_PLUGIN_NAME可指定进程内已注册 embedding backend 的名字让配置直接引用它见 crates/xberg/src/core/config/extraction/env.rs。调用链源码级解析Dart → FRB → Rust整个调用链在仓库中有明确的源码证据可以一步步追踪第 1 步Dart 门面类XbergBridge.listEmbeddingBackends()定义在 packages/dart/lib/src/xberg.dart注释明确指出它被xberg-cli、api/mcp 端点以及生成的语言绑定使用签名如下/// List the names of all registered embedding backends. /// /// Used by xberg-cli, the api/mcp endpoints, and generated language /// bindings. /// throws XbergError on failure static FutureListString listEmbeddingBackends() async { return await rust_bridge.listEmbeddingBackends(); }第 2 步FRB 生成的桥接方法门面方法委托给生成代码rust_bridge.listEmbeddingBackends()其真实转发实现在 packages/dart/lib/src/xberg_bridge_generated/lib.dartFutureListString listEmbeddingBackends() RustLib.instance.api.crateListEmbeddingBackends();第 3 步Dart 侧 Rust 桥nativecrateListEmbeddingBackends的实现在 packages/dart/lib/src/xberg_bridge_generated/frb_generated.dart 附近它通过 FFI 将调用发送到 Rust 侧对应的wire函数wire__crate__list_embedding_backends_impl见 packages/dart/rust/src/frb_generated.rs。第 4 步Rust 侧导出在 Dart 包的 Rust 桥接层中pub fn list_embedding_backends()直接透传给 xberg 主 cratepub fn list_embedding_backends() - ResultVecString, String { xberg::list_embedding_backends() }见 packages/dart/rust/src/lib.rs。第 5 步xberg 内核最终落到 crates/xberg/src/plugins/embedding.rspub fn list_embedding_backends() - ResultVecString { use crate::plugins::registry::get_embedding_backend_registry; let registry get_embedding_backend_registry(); let registry registry.read(); Ok(registry.list()) }registry.list()的实现见 crates/xberg/src/plugins/registry/embedding.rsself.backends.keys().cloned().collect()。返回值语义与典型使用场景理解返回值需要把握几个要点返回的是名字不是对象listEmbeddingBackends()返回ListString是当前注册的所有 embedding backend 的插件名Plugin::name()的返回值。要真正调用某个后端做向量化需要用这个名字在配置中通过EmbeddingModelType::Plugin引用它见 crates/xberg/src/plugins/embedding.rs空列表是合法状态由于 embedding 注册表默认没有内置后端一个刚初始化、尚未注册任何插件的进程调用本方法会得到一个空列表。这本身就是当前进程没有任何进程内嵌入后端可用的明确信号调用方可以据此决定走 HTTP LLM 嵌入路径EmbeddingModelType::Llm或提示用户注册插件名字即身份注册表按名字区分后端重复注册同名后端会报XbergError::Plugin名字为空、含空白或dimensions()为 0 都会在注册时被XbergError::Validation拒绝见 crates/xberg/src/plugins/registry/embedding.rs。一个典型的工程场景是宿主应用启动时注册若干自研嵌入后端随后在 UI 或运维面板上用listEmbeddingBackends()枚举可用项供用户选择xberg-cli与 MCP 端点也正是复用这一枚举能力来呈现当前可用嵌入后端清单。与注册/反注册/清空 API 的配套关系listEmbeddingBackends不是孤立方法它属于 xberg 插件体系里 embedding 这一族的只读成员。Dart 门面类在 packages/dart/lib/src/xberg.dart 中还提供了配套方法Dart 方法对应 Rust 函数行为registerEmbeddingBackendregister_embedding_backend注册一个 Dart 实现的EmbeddingBackend插件到全局注册表unregisterEmbeddingBackend(name)unregister_embedding_backend按名字移除后端并调用其shutdown()clearEmbeddingBackends()clear_embedding_backends对所有已注册后端调用shutdown()后清空注册表listEmbeddingBackends()list_embedding_backends枚举所有已注册后端的名字Rust 侧的register/unregister/clear/list四个函数集中在 crates/xberg/src/plugins/embedding.rs它们都通过get_embedding_backend_registry()获取同一个全局单例见 crates/xberg/src/plugins/registry 目录因此对注册表的所有读写操作共享同一把读写锁——枚举得到的快照与并发注册之间不会互相撕裂。值得注意的设计细节EmbeddingBackendtrait 是异步的async fn embed(self, texts: VecString) - ResultVecVecf32且后端必须是Send Sync static因为在 chunking 流水线中它会被并发调用见 crates/xberg/src/plugins/embedding.rs。Dart/Flutter 侧通过spawn_blocking或等价机制把宿主同步调用包装进该异步签名。测试验证从单元测试到端到端仓库为这条调用链提供了多层验证可以作为读者复现行为的参考Rust 单元测试crates/xberg/src/plugins/embedding.rs覆盖了三个关键契约register_list_unregister_roundtrip注册一个 mock 后端后list_embedding_backends()能枚举到它反注册后列表回到空empty_name_rejected_via_global_api与zero_dimensions_rejected_via_global_api非法注册空名、零维度被拒绝后列表必须保持为空失败的注册不能留下任何残留register_list_clear_list_roundtrip清空后列表为空。Dart 端到端测试e2e/dart/test/embedding_backend_management_test.dart先调用clearEmbeddingBackends()再断言listEmbeddingBackends()返回非空isNotNull验证了在真实 native 库加载、真实 FRB 桥接下该方法可正常返回e2e/dart/test/registry_test.dart 也在 registry 分类下做了同样验证。此外alef 为该场景维护了一个契约 fixturefixtures/registry/list_embedding_backends.json 定义call: list_embedding_backends、input: {}无输入参数、断言not_error这也解释了为什么该方法无参数、且文档标注意side_effect: safe——它是一条只读、无副作用的安全调用。小结XbergBridge.listEmbeddingBackends()是 Dart 侧进入 Xberg 嵌入插件体系最直接的入口一次异步调用即可拿到进程内全部已注册 embedding backend 的名字。理解它需要三层视角——使用上记住RustLib.init()/RustLib.dispose()的生命周期管理语义上记住返回名字、空列表合法、无副作用原理上记住它最终穿透 FRB 桥接落到 Rust 全局EmbeddingBackendRegistry的一次只读keys()枚举。配合registerEmbeddingBackend/unregisterEmbeddingBackend/clearEmbeddingBackends三个配套方法你可以在 Dart 与 Flutter 应用中完整地管理自定义嵌入后端的生命周期并与xberg-cli、API/MCP 端点共享同一份当前可用后端视图。赞分享后端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点击查看免费下载相关推荐Dart 调用 listOcrBackends 枚举 OCR 后端xberg 插件注册表实战指南Dart 调用 listOcrBackends 枚举 OCR 后端xberg 插件注册表实战指南 本篇指南聚焦 xberg 项目中 Dart 语言绑定提供的后端AI 应用NLP网盘直链下载助手终极指南一键获取九大网盘真实链接告别下载限速烦恼网盘直链下载助手终极指南一键获取九大网盘真实链接告别下载限速烦恼 还在为网盘下载速度慢如蜗牛而烦恼吗网盘直链下载助手为您提供了一站式解决方案这款基于Ja后端AI 应用NLPxberg C FFI 实战调用 xberg_list_renderers 枚举全局渲染器注册表xberg C FFI 实战调用 xberg_list_renderers 枚举全局渲染器注册表 本文以 xberg 仓库中自动生成的 C 语言片段 list后端AI 应用NLP上一篇3分钟搞定抖音TikTok数据采集DouK-Downloader批量下载实战下一篇JODConverter深度解析基于LibreOffice的企业级文档转换架构设计创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表
PREV
查看更多资讯
NEXT
返回资讯列表