【免费下载链接】ade-pythonPython library for Agentic Document Extraction (ADE).项目地址https://gitcode.com/gh_mirrors/ade/ade-python点击查看免费下载ade-python 是 LandingAI Agentic Document ExtractionADE平台的官方 Python SDK能把 PDF、图片解析为结构化 Markdown再按 JSON Schema 或 Pydantic 模型抽取类型化字段。当处理大文档必须走异步 Job 轮询模式时SDK 用了一个精心设计的wait()指数退避轮询器和一套统一 Job 归一化层。本文带你读懂这两个核心机制的设计原理。为什么需要 wait()同步与异步 Job 的边界ade-python 的 V2 接口把文档处理分成两条路径场景接口行为小文档client.v2.parse/client.v2.extract同步返回结果超时返回 HTTP 504 并抛V2SyncTimeoutError大文档parse_jobs/extract_jobs等 Job 资源先create拿到job_id再轮询直到任务结束同步路径遇到长文档会被服务端取消所以大文件必须走 Job 资源。而轮询一个远程任务直到它结束是个经典难题轮询太密会打爆服务端太稀又会白白拖慢响应。ade-python 的解法藏在 src/landingai_ade/resources/v2/_base.py 里。wait()指数退避轮询器四个常量与一个核心函数四个默认参数定义了轮询节奏在 _base.py 顶部四个常量完整刻画了退避策略常量默认值含义DEFAULT_POLL_INITIAL1.0 秒首次轮询前的等待时间DEFAULT_POLL_FACTOR1.5每轮等待时长乘以 1.5DEFAULT_POLL_MAX10.0 秒等待时长上限封顶DEFAULT_WAIT_TIMEOUT600 秒wait()总超时超时抛JobWaitTimeoutError也就是说等待序列是 1s → 1.5s → 2.25s → 3.38s → … → 10s封顶。任务刚提交时状态变化最快高频轮询能尽早拿到结果时间拉长后逐渐放手把压力降到最低。用户也可以传入poll_interval直接锁定固定间隔退避随即失效——两种策略都保留给了调用方。核心轮询循环先查状态再看时间真正的轮询逻辑在 poll_until_terminal同步版和 apoll_until_terminal异步版中循环语义非常直白调get_job()拉取最新状态若job.is_terminal为真completed/failed/cancelled立即返回若已过 deadline抛JobWaitTimeoutError否则睡眠min(delay, 距 deadline 剩余时间)后进入下一轮。第 4 步的min()是个容易被忽略的细节最后一次睡眠绝不会跨过 deadline避免了明明超时了还白睡满一整段的浪费。两个失败分支由 lib/v2_errors.py 区分得很干净JobWaitTimeoutError等待超时任务在服务端仍在运行稍后可以用get(job_id)继续查JobFailedError任务以failed/cancelled终态结束且调用方传了raise_on_failureTrue。默认不抛方便调用方自行判断终态。可注入的时钟测试不睡真时间poll_until_terminal不直接读time而是把monotonic和sleep作为参数注入——生产环境传time.monotonic/time.sleep测试则注入假时钟。tests/test_v2_waiter.py 里的FakeClock正是利用这个测试缝隙零真实耗时即可断言退避序列恰好是[1.0, 1.5]、超时必抛、失败分支行为正确。对轮询器这类时序敏感的代码这是非常值得学习的可测试性设计。异步版只是把阻塞睡眠换成anyio.sleep状态机完全一致因此同步/异步客户端的wait()行为严格对齐见 parse.py 与 L503-L519 的镜像实现。parse_jobs、extract_jobs、build_schema_jobs三组 Job 资源复用同一套轮询器wait()的参数与异常语义处处相同。统一Job归一化两种上游信封一个 Job 形状上游信封并不统一翻 docs/design/stainless-exit-and-v2.md 的 API 契约一节会发现parse 和 extract 两条 Job 链路的响应信封天生不同字段parse jobs 信封extract jobs 信封结果载荷data旧或result新result失败信息failure_reasonerror: {code, message}时间字段started_at/received_atcreated_at/completed_at如果 SDK 原样透传用户就得为每个端点写不同的取值代码。ade-python 选择在 resources/v2/_normalize.py 做归一化normalize_parse_job、normalize_extract_job、normalize_build_schema_job三个函数把任意信封统一压进同一个 Job 模型。Job 模型类型化字段 raw 兜底types/v2/job.py 中的Job是面向用户的唯一任务形状job_id/status/progress任务身份与进度status是JobStatus枚举pending、processing、completed、failed、cancelledresult完成后才填充类型随端点变化parse 任务是V2ParseResponseextract 任务是V2ExtractResulterror归一化后的JobError(code, message)raw原始信封原样保留任何没被上浮到类型字段的字段都能从raw里取到is_terminal属性方法直接回答能否结束轮询。类型化字段管常用路径raw管长尾需求——既不丢信息也不让模型变成上帝对象。宽容归一化上游漂移不该让用户代码崩溃_normalize.py 里有几处刻意的宽容处理体现了 SDK 作为上游 API 缓冲层的定位未知状态不崩网关返回未收录/已改名的 status 时降级为PENDING继续轮询原值仍可从raw拿到新旧载荷兼容parse 任务的结果可能挂在result也可能挂在旧版data下两个键都认失败字段双语error对象和旧版failure_reason字符串都能归一成JobError时间戳双格式_ts()同时接受 ISO 字符串和 epoch 整数解析失败返回None而非抛错。一句话总结宁可字段为None也不让一次上游漂移炸掉整条流水线。list端点则由 JobList 收编它是Job列表的子类额外携带has_more、org_id、page、page_size分页信封且对类型不符的值比如字符串false一律拒绝强转防止脏数据污染布尔字段。从 create 到 wait三步用上全部设计理解了上面的机制实际使用非常简单完整示例见 README.md 与 examples/v2_smoke_test.pyjob client.v2.parse_jobs.create(documentPath(large_file.pdf)) done client.v2.parse_jobs.wait(job.job_id, timeout600, raise_on_failureTrue) print(done.status, done.result.markdown[:200])指数退避、deadline 保护、异常分流、信封归一化全部在这一行wait()背后自动完成。想手动控制节奏也可以改用client.v2.parse_jobs.get(job_id)自轮询——返回的同样是归一化后的Job。小结两层抽象一个稳定 APIade-python 的这两个设计给轮询型异步 API打了个很好的样板轮询器只有一份poll_until_terminal被三组 Job 资源、同步/异步两套客户端共享退避参数集中可调测试用注入时钟做到零耗时验证归一化层吸收差异上游信封不一致、新旧字段漂移全部在_normalize.py内部消化用户只面对Job一个形状失败语义明确超时与业务失败是两种异常任务还在跑和任务坏了从此不再混淆。对新手来说最值得带走的是这两条通用经验时序逻辑把时钟/睡眠当依赖注入测试就快且稳对外模型提供类型化字段 原始数据兜底API 漂移才不会传导到你的代码里。赞分享【免费下载链接】ade-pythonPython library for Agentic Document Extraction (ADE).项目地址https://gitcode.com/gh_mirrors/ade/ade-python点击查看免费下载相关推荐ade-python完整指南如何用异步Jobs和wait()轮询器轻松搞定大文档处理ade python完整指南如何用异步Jobs和wait 轮询器轻松搞定大文档处理 ade python 是 LandingAI ADEAgentic DoXXL-JOB 执行器设计与实现XXL JOB 执行器设计与实现 XXL JOB 的执行器是其分布式任务调度框架中的关键组件负责接收调度中心的请求并执行具体的任务逻辑。执行器的设计充分考虑了任务调度后端Composer Low Precision GroupNorm 低精度归一化算法原理、用法与源码剖析Composer Low Precision GroupNorm 低精度归一化算法原理、用法与源码剖析 导读 本文围绕 Composer 训练框架中的 Low深度学习分布式训练模型优化创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
阅读完成 · 觉得有帮助?