
后端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 Elixir 绑定中extract_batch的一个典型边界场景批量输入中所有 URI 均无法访问时API 如何以成功返回、逐项报错的方式隔离失败并通过summary.results与summary.errors两个计数器精确反映批次结果。读完你将掌握extract_batch的输入结构、ExtractionSummary各字段含义以及如何借助官方 fixture 契约与 e2e 测试验证这套语义从而在自己的批量文档处理任务中写出健壮的容错代码。场景定位extract_batch 的 URI 输入与全部缺失问题Xberg 的批量提取入口extract_batch以及对应的异步版本extract_batch_async允许一次提交多个文档输入由 Rust 核心并行处理。每个输入通过%{kind ..., ...}这样的 map 描述其中kind取值为uri或bytes。当多个输入全部是kind: uri且这些 URI 在下载阶段全部无法命中时就构成URI 输入全部缺失all missing场景。关联文档 docs-site/src/snippets-generated/elixir/batch/extract_batch_uri_all_missing.md 给出了最直接的用法示例result Xberg.extract_batch_async([%{kind uri, uri /nonexistent/a.pdf}, %{kind uri, uri /nonexistent/b.txt}]) IO.inspect(result.summary.results) IO.inspect(result.summary.errors)这段代码透露出两个关键信息一是批量输入采用原始 map 列表而不是%Xberg.ExtractInput{}结构体列表二是调用方通过result.summary上的results/errors两个字段来观察批次结果而不是直接遍历逐条结果。这正是全缺失场景与传统单文档extract的最大区别——批次调用本身不抛错失败被折叠进 summary 统计。输入格式map 列表与 ExtractInput 结构体的对应关系从 packages/elixir/lib/xberg/extract_input.ex 的源码可以看到Xberg 内部为所有公开提取入口定义了统一的输入类型defmodule Xberg.ExtractInput do type t :: %__MODULE__{ kind: Xberg.ExtractInputKind.t(), bytes: binary() | nil, uri: String.t() | nil, mime_type: String.t() | nil, filename: String.t() | nil, config: Xberg.FileExtractionConfig.t() | nil } defstruct kind: :uri, bytes: nil, uri: nil, mime_type: nil, filename: nil, config: nil end也就是说extract_batch接收的 map 列表本质上是该结构体 JSON 序列化后的形态kind对应kind字段uri对应uri字段。URI 输入的最小描述只需要两个键%{kind uri, uri /nonexistent/a.pdf}当kind: :uri时核心引擎会先对 URI 执行下载/解析再进入格式检测与内容提取流水线。全部输入都是不可访问的 URI 时批次将没有任何一个输入进入内容提取阶段最终全部落入错误计数。读懂 summaryExtractionSummary 的六个计数器关联文档中result.summary.results与result.summary.errors的来源在 packages/elixir/lib/xberg/extraction_summary.ex 中定义得非常清楚defmodule Xberg.ExtractionSummary do type t :: %__MODULE__{ inputs: non_neg_integer(), results: non_neg_integer(), errors: non_neg_integer(), remote_urls: non_neg_integer(), pages_crawled: non_neg_integer(), documents_downloaded: non_neg_integer() } defstruct inputs: 0, results: 0, errors: 0, remote_urls: 0, pages_crawled: 0, documents_downloaded: 0 end各字段语义如下字段含义全部缺失场景下的取值inputs提交的输入总数2results成功完成提取的输入数0errors提取失败含下载失败、解析失败等的输入数2remote_urls涉及远程 URL 处理的输入计数视 URI 形态而定pages_crawled网页爬取产生的页面数0documents_downloaded成功下载到的文档数0其中results errors应当等于inputs在非空批次下。当全部 URI 缺失时摘要呈现inputs 2, results 0, errors 2的零成功、全失败形态且documents_downloaded 0因为没有任何一次下载成功。与相邻场景的语义对比全部缺失 ≠ 部分失败 ≠ 空批次要准确理解全部缺失的语义必须把它放到 Xberg 批量 URI 处理的错误谱系中看。仓库内同目录下的相关片段提供了完整的对照单缺失not found——extract_batch_uri_not_found.mdresult Xberg.extract_batch_async([%{kind uri, uri /nonexistent/a.pdf}]) IO.inspect(result.summary.results) IO.inspect(result.summary.errors)对应 fixtures/batch/extract_batch_uri_not_found.json 的断言results 0, errors 1。部分失败partial failure——extract_batch_uri_partial_failure.mdresult Xberg.extract_batch_async([%{kind uri, uri https://example.com/text/plain.txt}, %{kind uri, uri https://example.com/pdf/corrupt_truncated.pdf}]) IO.inspect(result.summary.results) IO.inspect(result.summary.errors)一个 URI 可解析、另一个下载后是损坏文档此时结果为results 1, errors 1——批次依旧整体成功返回只有失败的那一项进入错误计数。空批次empty inputs——extract_batch_empty_inputs.mdresult Xberg.extract_batch_async([]) IO.inspect(result.results)空列表属于合法输入results为 0 且不会触发错误。四者合起来构成完整语义矩阵场景inputsresultserrors调用是否抛错空批次000否单 URI 缺失101否全部 URI 缺失202否部分失败1 成功 1 失败211否核心结论只要批次调用本身被接受非空且输入结构合法返回值就是{:ok, result}任何单输入级别的失败都不会升级为整个批次失败——这也就是失败隔离failure isolation的体现。契约与验证fixture 断言和 e2e 测试如何锁定该语义全部缺失行为并非运行时的偶然结果而是被仓库中的契约 fixture 与 e2e 测试双重锁定的。fixtures/batch/extract_batch_uri_all_missing.json 定义了该场景的输入与断言{ id: extract_batch_uri_all_missing, category: batch, call: extract_batch, input: { inputs: [ { kind: uri, uri: /nonexistent/a.pdf }, { kind: uri, uri: /nonexistent/b.txt } ] }, assertions: [ { type: not_error }, { type: equals, field: summary.results, value: 0 }, { type: equals, field: summary.errors, value: 2 } ] }其中not_error断言明确要求即使所有 URI 都不可访问整个extract_batch调用仍必须返回成功结果{:ok, _}而不是顶层错误。summary.results 0、summary.errors 2则把零成功、全失败钉死为合约。对应的 e2e 测试位于 e2e/elixir/test/batch_test.exs用 ExUnit 逐项验证了同一行为describe extract_batch_uri_all_missing do test extract_batch_uri_all_missing do {:ok, result} Xberg.extract_batch(inputs: [%{kind uri, uri /nonexistent/a.pdf}, %{kind uri, uri /nonexistent/b.txt}]) assert result.summary.results 0 assert result.summary.errors 2 end end同一测试文件中还包含extract_batch_uri_not_foundresults 0, errors 1与extract_batch_uri_partial_failureresults 1, errors 1的对照测试。阅读该文件是理解整套批量错误语义最快的方式。实战建议利用 summary 构建容错式批量处理基于上述语义在 Elixir 项目中接入 Xberg 批量 URI 提取时推荐采用批次成功 summary 判读的模式inputs [ %{kind uri, uri /nonexistent/a.pdf}, %{kind uri, uri /nonexistent/b.txt} ] case Xberg.extract_batch(inputs: inputs) do {:ok, output} - # 批次级调用本身不会失败成败全部体现在 summary 中 if output.summary.errors 0 do IO.puts(批次完成但 #{output.summary.errors}/#{output.summary.inputs} 个输入失败) else Enum.each(output.results, IO.puts(1.content)) end {:error, reason} - # 仅在输入结构非法等批次级错误时进入此分支 IO.puts(:stderr, 批次调用失败: #{inspect(reason)}) end需要注意的关键点不要用case的{:error, _}分支判断单个 URI 是否缺失——缺失只会体现在summary.errors计数里优先用summary.results/summary.errors做任务级监控如日志、告警、重试队列而不是遍历results判断是否齐全若需要对失败项做重试建议在提交前记录inputs与最终summary的对应关系因为默认返回结构中单输入级别的错误明细需要结合提取结果对象extraction_error_item等类型进一步读取。小结extract_batch的URI 全部缺失场景展示了 Xberg 批量 API 的设计哲学批次整体是容错的失败以计数形式沉淀在ExtractionSummary中而单输入的错误既不中断批次也不污染成功结果。从关联文档的一行IO.inspect(result.summary.errors)出发你可以顺着 fixtures/batch 目录下的契约定义、e2e/elixir/test/batch_test.exs 的对照测试以及 packages/elixir/lib/xberg/extraction_summary.ex 的字段定义完整掌握这套错误语义并写出生产级的批量文档处理代码。赞分享后端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 API 批量提取实战extract_batch 的 URI 部分失败语义与容错设计xberg C API 批量提取实战extract_batch 的 URI 部分失败语义与容错设计 本篇技术指南以 xberg 官方 C API 测试夹具 e后端AI 应用NLPXberg C 绑定批量提取容错指南用 extract_batch 处理全部 URI 缺失的场景Xberg C 绑定批量提取容错指南用 extract_batch 处理全部 URI 缺失的场景 批量文档提取 extract_batch 是 Xberg后端AI 应用NLPxberg C FFI 批量 URI 提取错误处理实战extract_batch 对不存在 URI 的容错语义xberg C FFI 批量 URI 提取错误处理实战extract_batch 对不存在 URI 的容错语义 本篇技术指南聚焦 xberg 的 C FFI后端AI 应用NLP上一篇Valent媒体控制功能远程控制音乐播放和系统音量下一篇gh_mirrors/bl/blockchain项目测试指南从单元测试到集成测试全流程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考