ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

使用 Dart 绑定查询 Xberg 已注册 Post-Processor:listPostProcessors 实战指南

使用 Dart 绑定查询 Xberg 已注册 Post-Processor:listPostProcessors 实战指南 后端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 仓库的 Dart 端示例文档docs-site/src/snippets-generated/dart/plugin_api/post_processors_list.md为核心讲解如何通过 Dart 绑定调用XbergBridge.listPostProcessors()列出所有已注册的后处理器Post-Processor。读完本文你将掌握后处理器注册机制在 Rust 内核中的实现方式、Dart 到 Rust 的桥接调用链以及如何在 Dart 应用中安全地初始化和释放 Rust 运行时。一、Post-Processor 是什么理解文档提取流水线的最后一环xberg 是一个以 Rust 为核心的 Polyglot 文档智能引擎可从 106 种格式、140 种文件扩展名中提取文本、元数据、图片、表格与结构化数据。在提取流水线中后处理器Post-Processor是在文档完成基础提取之后、最终输出之前执行的一类插件负责对已提取的ExtractedDocument做二次加工。从源码结构看xberg 将后处理器组织为独立的插件体系注册表模块位于 crates/xberg/src/plugins/processor/registry.rs核心 traitPostProcessor定义于 crates/xberg/src/plugins/processor/trait.rs。每个后处理器实现两个关键方法process(self, result: mut ExtractedDocument, config: ExtractionConfig)对提取结果做就地修改processing_stage(self) - ProcessingStage声明处理阶段如Early、Middle、Late用于控制多个处理器之间的执行顺序。内置处理器按 feature gate 编译声明于 crates/xberg/src/plugins/processor/builtin/mod.rs包括处理器功能对应 featurePageClassificationProcessor页面分类classificationChunkClassificationProcessor块级分类classificationSummarizationProcessor摘要生成summarizationTranslationProcessor翻译translationCaptioningProcessor图像字幕captioningQrCodeProcessorQR 码识别qr-codesNerProcessor命名实体识别nerRedactionProcessor内容脱敏redaction每个内置处理器都在自己的子模块中实现process与processing_stage例如 crates/xberg/src/plugins/processor/builtin/qr.rs、crates/xberg/src/plugins/processor/builtin/ner.rs 等。这种一个子模块 一个 feature gate的组织方式让非 OSS 目标如 no-ort、wasm、android可以在编译期干净地裁剪掉不支持的处理器。二、为什么需要列出已注册处理器注册表查询的三种场景后处理器注册表是全局共享的运行时状态。在以下场景中你往往需要先查询当前注册表里到底有哪些处理器调试与诊断配置了summarization或ner等处理阶段但输出里没有对应结果。此时先调用listPostProcessors()确认处理器是否真的注册成功——若 feature 未编译进二进制注册会静默跳过。插件编排通过 plugin_api 系列接口注册了自定义 Dart 后处理器后用列表接口核对注册结果是否如预期。运行时自省面向用户的工具如 CLI、MCP server需要向用户展示当前宿主支持哪些处理能力避免配置不可用的处理阶段。xberg 的 Rust 端在 crates/xberg/src/plugins/processor/registry.rs 提供了对应的原生实现pub fn list_post_processors() - crate::ResultVecString { use crate::plugins::registry::get_post_processor_registry; let registry get_post_processor_registry(); let registry registry.read(); Ok(registry.list()) }该函数获取全局注册表并加读锁随后返回全部已注册处理器的名称列表。值得注意的是文档注释明确说明了唯一的错误来源注册表锁被毒化poisoned时返回Err。这意味着listPostProcessors()本身是一个只读、无副作用的操作文档 front-matter 中标明side_effect: safe不会修改任何运行时状态。三、核心代码详解Dart 侧调用链逐行拆解关联文档 post_processors_list.md 给出的完整 Dart 示例如下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.listPostProcessors(); stdout.writeln(result); } finally { RustLib.dispose(); } }逐行拆解如下import dart:io引入stdout用于把查询结果打印到标准输出。如果你的应用是 Flutter UI 或 Web 环境可以去掉该导入改为把result渲染到界面或日志系统。import package:xberg/xberg.dart引入公开 API。XbergBridge的静态方法定义在 packages/dart/lib/src/xberg.dartstatic FutureListString listPostProcessors() async { return await rust_bridge.listPostProcessors(); }import package:xberg/src/xberg_bridge_generated/frb_generated.dart show RustLib引入 flutter_rust_bridge 生成的运行时RustLib这是 Dart 与 Rust 原生库之间的桥。await RustLib.init()初始化 Rust 侧运行时加载动态库、建立 FFI 通道。此步骤必不可少任何桥接调用之前都必须先初始化。XbergBridge.listPostProcessors()真正的查询调用返回FutureListString——即所有已注册后处理器的名称列表。stdout.writeln(result)输出结果。ListString的toString()输出形如[qr, ner, redaction, ...]。finally { RustLib.dispose() }无论成功与否都释放 Rust 运行时。try/finally结构保证了资源安全释放这在长生命周期进程中尤为重要重复init而不dispose会累积原生资源。3.1 返回值语义listPostProcessors()的返回类型在 Dart 侧为FutureListString对应 Rust 侧VecString。Dart 绑定层声明位于 packages/dart/lib/src/xberg_bridge_generated/lib.dartFutureListString listPostProcessors() ...;每个元素是后处理器的注册名称。内置处理器通过 builtin/mod.rs 中的BuiltinRegistration类型注册即(static str, fn() - crate::Result())——字符串为展示名函数指针为注册函数。例如register_qr注册QrCodeProcessor、register_ner注册NerProcessor。四、配套接口注册、注销与清空listPostProcessors()并非孤立接口它与注册表管理的其他操作配套使用。Dart 侧的全部相关 API 集中在 packages/dart/lib/src/xberg.dartDart API作用Rust 语义registerPostProcessor(PostProcessorDartImpl impl)注册一个 Dart 实现的后处理器插件register_post_processorunregisterPostProcessor(String name)按名称注销指定插件unregister_post_processorclearPostProcessors()清空注册表中的全部后处理器clear_post_processorslistPostProcessors()列出所有已注册名称list_post_processors配套的清空示例见 docs-site/src/snippets-generated/dart/plugin_api/post_processors_clear.md其结构与列表示例一致只是把调用换成XbergBridge.clearPostProcessors()。典型的管理闭环是注册 → 列表验证 → 可选注销 → 列表确认 → 可选清空。4.1 注册失败容错机制从 crates/xberg/src/plugins/processor/builtin/mod.rs 的register_all实现可以观察到注册阶段的容错设计每个(name, register)对按顺序尝试单个注册失败不会中断后续注册修复自 issue #271 的问题所有失败会被聚合为一个Err返回同时每条失败都会通过tracing::error!单独记录日志。因此列表接口对注册诊断至关重要某个处理器静默缺席往往正是注册失败的信号配合日志即可定位根因。五、端到端验证测试如何证明接口行为xberg 为 Dart 绑定提供了真实的端到端测试见 e2e/dart/test/post_processor_management_test.dart。测试的关键结构如下setUpAll(() async { _setEnv(CRAWLBERG_ALLOW_PRIVATE_NETWORK, true); _setEnv(RUST_MIN_STACK, 16777216); await RustLib.init(); ... }); test(Clear all post-processors and verify list is empty, () async { await expectLater(XbergBridge.clearPostProcessors(), completes); }); test(List all registered post-processors, () async { final result await XbergBridge.listPostProcessors(); expect(result, isNotNull); });从测试可以提取两条实用经验初始化前设置环境变量测试通过 FFI 调用setenv设置RUST_MIN_STACK16 MB避免深调用栈下 Rust 侧栈溢出CRAWLBERG_ALLOW_PRIVATE_NETWORK用于允许测试访问私有网络资源。在真实应用中若你的后处理器涉及网络调用如 LLM 摘要同样需要关注这些环境变量。断言策略列表接口的断言是isNotNull而非固定长度——因为注册表内容是构建配置feature gates决定的不同构建产物中处理器数量不同。这也印证了列表接口的价值在于运行时自省而非静态约定。六、进阶从列出到使用——把名称与处理阶段对应起来拿到处理器名称列表只是第一步。若你的 Dart 应用需要按名称判断某个处理器是否可用可结合 Rust 端的注册表语义做进一步查询。从 processor/registry.rs 的结构可以推断注册表内部以名称索引存储Arcdyn PostProcessor每个处理器还带有ProcessingStage信息trait.rs 中process与processing_stage成对定义。实用建议在配置界面中用listPostProcessors()的结果动态渲染可用后处理器复选框而不是硬编码处理器清单——这样当用户的自定义插件注册后界面无需改代码即可感知把listPostProcessors()结果与doctor诊断XbergBridge.doctor(config)见 packages/dart/lib/src/xberg.dart配合使用列表告诉你有哪些处理器doctor告诉你哪些后端在当前主机上真正可用模型未缓存或未编译的后端会报告Skip注意 Dart 侧注册的自定义处理器与内置处理器共用同一全局注册表因此列表结果会混合显示两者——这也是名称而非类型作为唯一标识的原因。七、完整可运行示例与常见问题7.1 打印结果并统计数量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 processors await XbergBridge.listPostProcessors(); processors.forEach((name) stdout.writeln(- $name)); stdout.writeln(Total: ${processors.length}); } finally { RustLib.dispose(); } }7.2 常见问题排查现象排查方向列表为空构建时未启用对应 feature见 builtin/mod.rs 的#[cfg(feature ...)]或注册失败被register_all聚合为错误调用抛异常检查是否遗漏RustLib.init()若注册表锁被毒化如此前某线程 panic会返回错误结果与预期不符确认是否调用过clearPostProcessors()或unregisterPostProcessor()改变了全局状态多绑定进程共享同一原生库时需注意并发修改八、小结XbergBridge.listPostProcessors()是 Dart 开发者接入 xberg 插件体系最轻量的入口之一一行查询即可自省全局后处理器注册表。其背后是 Rust 内核中加读锁遍历注册表的实现registry.rs配合register/unregister/clear三个配套接口构成了完整的后处理器生命周期管理闭环。端到端测试e2e/dart/test/post_processor_management_test.dart证明了该接口在真实 FFI 环境下的可用性也让这个简单接口成为诊断注册问题、编排插件流程的可靠起点。赞分享后端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 Dart 绑定使用 listEmbeddingBackends 查询已注册的 Embedding 插件后端xberg Dart 绑定使用 listEmbeddingBackends 查询已注册的 Embedding 插件后端 本文围绕 xberg 项目 Dart/后端AI 应用NLPxberg Dart 绑定列出已注册 Tokenizer 后端listTokenizerBackends 实战指南xberg Dart 绑定列出已注册 Tokenizer 后端listTokenizerBackends 实战指南 本指南以 xberg 仓库中的 Dar后端AI 应用NLPXberg C 绑定实战用 ListTokenizerBackends 查询已注册的 Tokenizer 后端Xberg C 绑定实战用 ListTokenizerBackends 查询已注册的 Tokenizer 后端 导读 本文围绕 Xberg 开源仓库中 C后端AI 应用NLP上一篇如何在3小时内掌握无线网络安全测试工具部署与实战下一篇终极Markdown转PPT教程5分钟掌握高效演示文稿制作创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表