
后端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/url/url_batch_mixed_inputs.md为核心讲解如何通过 Dart 绑定调用extract_batch在一次调用中混合提交远程 URL 输入与内存字节输入并让两者共享同一个ExtractionResult输出信封。读完本文你将掌握ExtractInput的两种输入载体uri/bytes、JSON 驱动的配置注入方式、url.mode document的语义以及底层 Rust 引擎的批处理调用链与 e2e 验证方式。背景什么是extract_batch在 Xberg 中extract负责从单个输入提取内容而extract_batch接收多个输入并返回一个统一的批量结果。它的核心特点是输入列表可以是异构的——每个元素独立声明自己是uri远程 URL / 本地路径 /file://还是bytes内存中的原始字节引擎会为每个输入分别走对应的摄取与解析路径最终汇总到同一个响应结构中。在 Rust 侧稳定入口定义于 crates/xberg/src/core/extract/mod.rs/// Extract content from multiple bytes or URI inputs. pub async fn extract_batch(inputs: VecExtractInput, config: ExtractionConfig) - ResultExtractionResult { DEFAULT_ENGINE.extract_batch(inputs, config).await }其中DEFAULT_ENGINE是一个进程级全局EngineLazyLockcrate::engine::Engine所有语言绑定包括 Dart最终都委托到这个核心实现。从源码结构可以推断批处理与单输入提取共享同一套引擎内核只是输入被并行/顺序消费后统一封装返回。混合输入示例URL bytes 一次搞定关联文档给出了一个可直接运行的 Dart 示例完整复刻如下import dart:convert; 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 inputs await Future.wait((jsonDecode(r[{kind:uri,uri:https://example.com},{bytes:[66,97,116,99,104,32,98,121,116,101,115,32,99,111,110,116,101,110,116],filename:inline.txt,kind:bytes,mime_type:text/plain}]) as Listdynamic).map((element) createExtractInputFromJson(json: jsonEncode(element)))); final config await createExtractionConfigFromJson(json: {url:{mode:document}}); final result await XbergBridge.extractBatch(inputs, config: config); stdout.writeln(result.results); stdout.writeln(result.results[0].content); stdout.writeln(result.results[1].content); } finally { RustLib.dispose(); } }示例流程分四步初始化原生运行时await RustLib.init()加载 flutter_rust_bridge 生成的原生库结束时在finally中RustLib.dispose()释放资源构造输入列表先用jsonDecode解析一段 JSON 数组再通过createExtractInputFromJson逐项转换成强类型的ExtractInput并用Future.wait并行完成转换构造配置createExtractionConfigFromJson把{url:{mode:document}}解析为ExtractionConfig指示 URL 输入按单个远程文档处理批量提取调用XbergBridge.extractBatch(inputs, config: config)随后打印整个results及两个输入各自提取出的纯文本content。字节数组在表达什么第二个输入中的bytes字段是一组十进制字节[66, 97, 116, 99, 104, 32, 98, 121, 116, 101, 115, 32, 99, 111, 110, 116, 101, 110, 116]按 ASCII 解码即字符串Batch bytes content——这正是后续断言中期望提取到的文本。配合filename:inline.txt与mime_type:text/plain引擎无需猜测即可把它当作一个纯文本文档处理。输入模型ExtractInput 与两种输入载体ExtractInput的 Dart 定义位于 packages/dart/lib/src/xberg_bridge_generated/lib.dart该文件由 flutter_rust_bridge 生成kind必填ExtractInputKind枚举取值bytes或uribytes当kind bytes时提供类型为Uint8List即内存中的原始字节uri当kind uri时提供可以是本地文件路径、file://URI 或 HTTP(S) URLmimeTypeMIME 类型提示用于引导格式识别filename文件名提示用于 MIME 探测与元数据填充config可选的FileExtractionConfig提供单输入级的提取覆盖项。ExtractInputKind枚举同文件 lib.dart明确了两类来源bytes表示内存中的原始字节uri表示文件系统路径、file://URI 或 HTTP(S) URL。对应 fixture fixtures/url/url_batch_mixed_inputs.json 中两个输入分别使用这两种载体正是对ExtractInputKind语义的实例化。配置注入url.mode 的语义示例配置{url:{mode:document}}落到 Dart 侧是UrlExtractionConfiglib.dart其mode字段类型为UrlExtractionMode枚举取值lib.dart取值语义auto抓取后自动分类 HTTP(S) 资源document把 URI 当作单个远程文档/页面处理示例所用crawl从种子 URI 开始爬取并提取发现的页面/文档在document模式下引擎会直接下载https://example.com对应的资源并解析其内容而不会扩展链接进行爬取。UrlExtractionConfig还包含crawlCrawlConfig用于 HTTP(S) 抓取的爬取配置、documentUrlPattern文档发现 URL 的正则过滤、maxDocumentUrlsPerResult与maxTotalUrlsURL 跟随上限以及allowLocalFileInputs/allowFileUris是否允许本地路径与file://输入等字段——后者在 REST API 场景中默认被收紧见下文安全提示。输出信封ExtractionResult 的结构extract_batch返回的ExtractionResult定义于 lib.dart字段如下resultsListExtractedDocument按输入提交顺序排列的每文档结果示例中results[0]对应 URL 输入results[1]对应 bytes 输入errorsListExtractionErrorItem逐输入的非致命错误——批处理不会因为某个输入失败而丢弃其余结果summaryExtractionSummary包含inputs提交数、results产出数、errors错误数等聚合统计crawlFinalUrls/crawlRedirectCount/crawlUniqueNormalizedUrlsURL 摄取过程中的重定向追踪与去重信息。每个ExtractedDocumentlib.dart至少携带content纯文本、mimeType、metadata、tables、counts页数/表格数/图片数的廉价结构统计与formulas、formFields按需启用chunks、images、pages、elements、document结构化文档树等可选字段。示例中stdout.writeln(result.results)打印整个信封随后分别打印两个文档的content验证一个信封装两种来源。源码级调用链从 Dart 到 Rust 引擎从源码结构可以梳理出这条完整调用链Dart 层XbergBridge.extractBatch(inputs, config)是顶层绑定函数lib.dart内部通过RustLib.instance.api.crateExtractBatch(...)经 flutter_rust_bridge 通道调用 RustRust 稳定 APIcrate::extract_batchcrates/xberg/src/core/extract/mod.rs把请求委托给进程级默认引擎引擎实现Engine::extract_batchcrates/xberg/src/engine/mod.rs负责并发消费输入并汇总结果REST API 复用同一路径HTTP 端的extract_unified_inputs把ApiExtractInput转为 core 输入后同样调用crate::extract_batchcrates/xberg/src/api/handlers.rs说明 Dart、CLI 与 REST 服务的批处理行为同源。另外注意 REST API 的默认安全策略handlers.rs服务端默认拒绝本地路径与file://URI 输入除非设置XBERG_API_ALLOW_LOCAL_URI_INPUTS1并会强制关闭allow_local_file_inputs/allow_file_uris。相比之下Dart 本地绑定的行为取决于UrlExtractionConfig中的显式配置示例仅使用远程 HTTPS URL不受该策略影响。e2e 测试验证fixture 与断言该示例对应的测试位于 e2e/dart/test/url_test.dart测试名与文档标题一致extract_batch: mixed bytes and URL inputs share one output envelope。测试通过替换$mock_url指向本地 mock 服务器响应体为Batch URL document content.\n随后断言result.results.length大于等于 2两个输入都成功产出result.results[0].content包含Batch URL document content来自 mock URLresult.results[1].content包含Batch bytes content来自字节输入。fixture fixtures/url/url_batch_mixed_inputs.json 中同样定义了这些断言并声明了 mock 响应的状态码 200、content-type: text/plain; charsetutf-8以及side_effects: server该测试需要 mock 服务器。这组断言同时验证了输入顺序的稳定性URL 在前、bytes 在后结果索引一一对应与两种来源各自的内容正确性。实战要点与扩展场景批量异构输入需要同时处理一批远程文档 一批本地内存片段时不必分两次调用——把它们合并进同一个inputs列表即可按结果索引即可对齐来源单输入覆盖每个ExtractInput可携带独立的config覆盖全局配置适合同一批任务里对不同文档采用不同参数错误隔离批处理中的部分失败会进入errors而非中断整批可配合summary做失败统计与重试从 document 到 crawl若把url.mode改为crawl并配置crawl.max_depth、max_pages、respect_robots_txt同一套extract/extract_batch输入模型即可扩展为整站爬取提取场景参见 e2e/dart/test/url_test.dart 中的 crawl 用例本地绑定与远程服务的行为差异Dart 绑定可直接配置本地路径输入而 HTTP 服务端有 URI 白名单策略跨环境迁移时需留意。结语url_batch_mixed_inputs这个示例虽短却完整演示了 Xberg 批量提取的核心设计异构输入统一建模ExtractInputKind、JSON 驱动配置url.mode、统一输出信封ExtractionResult、以及 Dart → flutter_rust_bridge → RustDEFAULT_ENGINE的完整调用链。无论是编写 Dart/Flutter 端的多文档摄取工具还是理解 REST 批处理接口的底层行为都可以以此示例为最小可运行范式继续扩展。赞分享后端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 实战在 extract_batch 中混用 Bytes 与 URL 输入并共享同一输出信封Xberg C FFI 实战在 extract_batch 中混用 Bytes 与 URL 输入并共享同一输出信封 本文基于 Xberg 仓库中由 alef后端AI 应用NLPXberg C 批量提取实战混合 bytes 与 URL 输入共享同一输出信封Xberg C 批量提取实战混合 bytes 与 URL 输入共享同一输出信封 本指南以 Xberg 官方 C 绑定中的 extract_batch 场景为核后端AI 应用NLP使用 xberg Dart 绑定批量提取字节输入extract_batch 契约测试与 Rust 引擎剖析使用 xberg Dart 绑定批量提取字节输入extract_batch 契约测试与 Rust 引擎剖析 本文围绕 xberg 仓库中的 Dart 契约测试后端AI 应用NLP创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考