[{"data":1,"prerenderedAt":547},["ShallowReactive",2],{"article:llm-fallback-design":3},{"meta":4,"raw":18,"references":19,"prev":42,"next":51,"body":60,"toc":536},{"slug":5,"title":6,"date":7,"updated":8,"tags":9,"summary":14,"draft":15,"lang":16,"minutes":17},"llm-fallback-design","把失败当默认前提：LLM 服务的重试、降级与兜底设计","2025-11-18","2026-10-11",[10,11,12,13],"LLM","可靠性","架构","SLA","按错误语义决定重试，用总截止时间控制等待；分清模型重复调用与业务幂等，处理流式中断、缓存串用和降级质量，并用 SLO 验证兜底。",false,"zh-CN",5,"LLM 失败不只有接口报错：还可能答错，或输出半段后断流。可靠性设计需要分别回答：**能否安全重试，用户还能等多久，替代路径能否保留正确性与权限边界。** 以下以交互式 Agent 为例，参数需按实测调整。\n\n## 按失败语义分类\n\n| 失败 | 处理方向 | 常见误区 |\n| --- | --- | --- |\n| 临时限流、可恢复的 5xx | 根据响应头和截止时间退避 | 所有实例立即重试 |\n| 余额不足、鉴权失败、参数错误 | 修配置或请求，停止无效调用 | 所有 429\u002F4xx 都当瞬时故障 |\n| 网络超时、断开 | 结果可能未知，查任务状态 | 假定上游没执行 |\n| 内容安全拒绝 | 解释边界，提供允许的帮助 | 改措辞绕过同一限制 |\n| 答案无据、参数语义错误 | 补证据、质量检查或拒答 | HTTP 200 就算成功 |\n\n错误体比状态码更能说明问题。额度耗尽不会因等一秒恢复，具体分类以 [Claude 错误文档](https:\u002F\u002Fplatform.claude.com\u002Fdocs\u002Fen\u002Fapi\u002Ferrors)和 [OpenAI 限流文档](https:\u002F\u002Fdevelopers.openai.com\u002Fapi\u002Fdocs\u002Fguides\u002Frate-limits)为准。\n\n## 限流与超时：共享一份预算\n\n网关按上游配额限制请求和 token，按用户、任务分配公平份额。多实例共享额度要统一协调；并发与队列也设上限，排队过久应尽早告知。\n\n每个任务设一个**总截止时间**，调用、退避、重试和降级共享剩余时间。SDK、网关与业务统一重试策略，否则每层三次会叠成九次甚至更多。\n\nFull jitter 可写成：\n\n```text\ndelay = random(0, min(cap, base × 2^attempt))\n```\n\n它与“固定退避上下浮动 50%”不同。`Retry-After` 超过剩余预算时进入替代路径，不能截短等待后提前冲击上游。分别记录连接超时、首内容超时、流空闲超时和总超时。\n\n## 幂等：业务效果一次，不等于模型只收费一次\n\n业务任务 ID 防重复提交，attempt ID 记录每次模型尝试。自定义幂等头**不代表供应商支持去重**；重试生成仍可能执行和计费，必须按端点确认。\n\n有副作用的工具需要自己实现幂等：\n\n1. 键绑定用户、操作类型和内容摘要。\n2. 原子创建任务；同键同内容返回已有状态，同键异内容拒绝。\n3. 写入与完成状态在事务内提交，或用 outbox 衔接外部系统。\n4. 外部操作结果未知时查询或对账，不盲目重做。\n\n先查“键不存在”再写数据会在并发下重复执行。去重记录保留期要覆盖业务重放窗口；离线设备很久后重发，不能照抄 24 小时。[Stripe 幂等文档](https:\u002F\u002Fdocs.stripe.com\u002Fapi\u002Fidempotent_requests)是具体实现范例，其他 API 不自动继承这些保证。\n\n## 流式失败：已经展示的内容怎么办\n\n首字前切换模型可以重新生成；首字后要处理已展示文本。备用输出接在半句话后面，可能重复、矛盾，甚至重复动作。\n\n客户端事件携带 `task_id`、`attempt_id` 和序号，终止时明确 `completed`、`interrupted` 或 `failed`。断流后保留草稿并提示未完成；重新生成时显式替换整段，或者使用可验证的续传协议。执行工具前确认完整参数，不能执行半截 JSON。\n\n![失败决策树：错误分类、截止时间、重试、模型切换与确定性兜底](\u002Fdiagrams\u002Ffallback-design.svg)\n\n*图 1 · 降级有触发条件和质量门槛，安全拒绝不进入绕过式重试。*\n\n## 降级路径也要先评测\n\n可选备用模型、精确答案缓存、原文检索和固定提示，顺序按业务决定。合法精确缓存可先查；权益或高风险答案可能必须停止自动处理。\n\n备用模型要验证工具、结构化输出、中文质量、上下文容量和安全规则。小模型不保证更快，也不保证有独立限流池；共享故障域时切换可能无效。\n\n**语义相似不等于答案可复用。** 配置问题改一个数字，向量仍很接近。优先对象 ID、规范化请求和参数的精确键；允许近似的任务使用语义缓存时，评测误命中，并限定租户、权限、内容、知识库版本与有效期。相似度阈值不能跨模型照搬。\n\n熔断器按故障域维护关闭、打开、半开三态：失败摘除、冷却后少量探测、恢复才放量。正常安全拒绝和用户参数错误不应熔断整个上游。\n\n## 一个请求场景\n\n假设总预算 8 秒，主模型在第 2 秒返回临时限流，要求等 1 秒。等待后剩 5 秒：备用路径历史 p95 为 2 秒且质量达标，可尝试；若时间不足则展示检索原文和稍后重试入口。\n\n每次转换记录原因、耗时、费用和结果。这个算例说明“用剩余预算决策”，不是统一推荐 8 秒或固定重试次数。\n\n## SLO 与故障演练\n\nSLI 是测量，SLO 是目标，SLA 是对外承诺。分开看传输成功率、任务完成率、抽样正确率、首字延迟和降级率。引用存在不能代替正确率。\n\n任务完成率目标 99.5%，100 万个纳入统计的任务允许 5,000 次未完成；分母和用户取消规则事先固定。错误预算持续消耗时优先修可靠性。\n\n演练覆盖主模型故障、余额耗尽、首字后断流、缓存故障、工具结果未知与双上游失败。验收包括无重复业务效果、无跨用户缓存、费用有记录、用户知道任务是否完成。\n\n## 落地检查\n\n1. 错误体与语义一起分类，永久错误和拒绝不盲目重试。\n2. 重试与降级共用截止时间，检查 SDK 自动重试。\n3. 业务键与 attempt 分离，用事务、唯一约束或对账保护副作用。\n4. 断流显式标记，备用文本不直接续接原输出。\n5. 缓存与备用模型通过权限、质量回归后再启用。\n6. 用 [评测闭环](\u002Farticles\u002Fllm-eval-loop)验证替代路径。\n\n## 参考资料\n\n- [Claude — API errors](https:\u002F\u002Fplatform.claude.com\u002Fdocs\u002Fen\u002Fapi\u002Ferrors)\n- [OpenAI — Rate limits](https:\u002F\u002Fdevelopers.openai.com\u002Fapi\u002Fdocs\u002Fguides\u002Frate-limits)\n- [Stripe — Idempotent requests](https:\u002F\u002Fdocs.stripe.com\u002Fapi\u002Fidempotent_requests)\n- [AWS — Timeouts, retries and backoff with jitter](https:\u002F\u002Faws.amazon.com\u002Fbuilders-library\u002Ftimeouts-retries-and-backoff-with-jitter\u002F)\n- [Google SRE — Implementing SLOs](https:\u002F\u002Fsre.google\u002Fworkbook\u002Fimplementing-slos\u002F)",[20,25,29,33,38],{"title":21,"url":22,"type":23,"note":24,"checked":8},"Claude — API errors","https:\u002F\u002Fplatform.claude.com\u002Fdocs\u002Fen\u002Fapi\u002Ferrors","官方文档","Claude API 错误类别与请求追踪信息；重试仍需截止时间和副作用判断。",{"title":26,"url":27,"type":23,"note":28,"checked":8},"OpenAI — Rate limits","https:\u002F\u002Fdevelopers.openai.com\u002Fapi\u002Fdocs\u002Fguides\u002Frate-limits","OpenAI 限流及请求\u002F用量约束；限流、配额与业务重试需要区分。",{"title":30,"url":31,"type":23,"note":32,"checked":8},"Stripe — Idempotent requests","https:\u002F\u002Fdocs.stripe.com\u002Fapi\u002Fidempotent_requests","Stripe 幂等键的具体契约；不能假设所有外部服务具有相同行为。",{"title":34,"url":35,"type":36,"note":37,"checked":8},"AWS — Timeouts, retries and backoff with jitter","https:\u002F\u002Faws.amazon.com\u002Fbuilders-library\u002Ftimeouts-retries-and-backoff-with-jitter\u002F","技术文章","超时、重试、退避与抖动的分布式系统经验；参数要按负载和依赖验证。",{"title":39,"url":40,"type":23,"note":41,"checked":8},"Google SRE — Implementing SLOs","https:\u002F\u002Fsre.google\u002Fworkbook\u002Fimplementing-slos\u002F","SLI、SLO 与错误预算的制定方法；本文目标数值仅为示例。",{"slug":43,"title":44,"date":45,"updated":8,"tags":46,"summary":50,"draft":15,"lang":16,"minutes":17},"rag-01-chunking","RAG 全链路（一）：文档切分——让检索结果保留完整语境","2025-12-16",[47,48,49,10],"RAG","检索","Embedding","从解析和元数据开始，比较固定窗口、结构化切分、父子块与上下文补注；用一份故障手册实例解释检索粒度、供给粒度和版本追踪。",{"slug":52,"title":53,"date":54,"updated":8,"tags":55,"summary":59,"draft":15,"lang":16,"minutes":17},"ttft-first-token-latency","首 token 为什么这么慢：TTFT 的构成与优化清单","2025-10-21",[10,56,57,58],"推理","延迟优化","流式","分清首事件、首 token 与首字上屏，拆解检索、排队、prefill 和渲染的延迟；用分阶段埋点、缓存对照与峰值压测找到真正瓶颈。",{"type":61,"children":62},"root",[63,79,85,208,231,237,242,254,259,272,285,291,303,308,333,346,352,357,401,410,419,424,429,434,444,449,454,459,464,470,475,480,485,490,531],{"type":64,"tag":65,"props":66,"children":67},"element","p",{},[68,71,77],{"type":69,"value":70},"text","LLM 失败不只有接口报错：还可能答错，或输出半段后断流。可靠性设计需要分别回答：",{"type":64,"tag":72,"props":73,"children":74},"strong",{},[75],{"type":69,"value":76},"能否安全重试，用户还能等多久，替代路径能否保留正确性与权限边界。",{"type":69,"value":78}," 以下以交互式 Agent 为例，参数需按实测调整。",{"type":64,"tag":80,"props":81,"children":83},"h2",{"id":82},"按失败语义分类",[84],{"type":69,"value":82},{"type":64,"tag":86,"props":87,"children":88},"table",{},[89,113],{"type":64,"tag":90,"props":91,"children":92},"thead",{},[93],{"type":64,"tag":94,"props":95,"children":96},"tr",{},[97,103,108],{"type":64,"tag":98,"props":99,"children":100},"th",{},[101],{"type":69,"value":102},"失败",{"type":64,"tag":98,"props":104,"children":105},{},[106],{"type":69,"value":107},"处理方向",{"type":64,"tag":98,"props":109,"children":110},{},[111],{"type":69,"value":112},"常见误区",{"type":64,"tag":114,"props":115,"children":116},"tbody",{},[117,136,154,172,190],{"type":64,"tag":94,"props":118,"children":119},{},[120,126,131],{"type":64,"tag":121,"props":122,"children":123},"td",{},[124],{"type":69,"value":125},"临时限流、可恢复的 5xx",{"type":64,"tag":121,"props":127,"children":128},{},[129],{"type":69,"value":130},"根据响应头和截止时间退避",{"type":64,"tag":121,"props":132,"children":133},{},[134],{"type":69,"value":135},"所有实例立即重试",{"type":64,"tag":94,"props":137,"children":138},{},[139,144,149],{"type":64,"tag":121,"props":140,"children":141},{},[142],{"type":69,"value":143},"余额不足、鉴权失败、参数错误",{"type":64,"tag":121,"props":145,"children":146},{},[147],{"type":69,"value":148},"修配置或请求，停止无效调用",{"type":64,"tag":121,"props":150,"children":151},{},[152],{"type":69,"value":153},"所有 429\u002F4xx 都当瞬时故障",{"type":64,"tag":94,"props":155,"children":156},{},[157,162,167],{"type":64,"tag":121,"props":158,"children":159},{},[160],{"type":69,"value":161},"网络超时、断开",{"type":64,"tag":121,"props":163,"children":164},{},[165],{"type":69,"value":166},"结果可能未知，查任务状态",{"type":64,"tag":121,"props":168,"children":169},{},[170],{"type":69,"value":171},"假定上游没执行",{"type":64,"tag":94,"props":173,"children":174},{},[175,180,185],{"type":64,"tag":121,"props":176,"children":177},{},[178],{"type":69,"value":179},"内容安全拒绝",{"type":64,"tag":121,"props":181,"children":182},{},[183],{"type":69,"value":184},"解释边界，提供允许的帮助",{"type":64,"tag":121,"props":186,"children":187},{},[188],{"type":69,"value":189},"改措辞绕过同一限制",{"type":64,"tag":94,"props":191,"children":192},{},[193,198,203],{"type":64,"tag":121,"props":194,"children":195},{},[196],{"type":69,"value":197},"答案无据、参数语义错误",{"type":64,"tag":121,"props":199,"children":200},{},[201],{"type":69,"value":202},"补证据、质量检查或拒答",{"type":64,"tag":121,"props":204,"children":205},{},[206],{"type":69,"value":207},"HTTP 200 就算成功",{"type":64,"tag":65,"props":209,"children":210},{},[211,213,221,223,229],{"type":69,"value":212},"错误体比状态码更能说明问题。额度耗尽不会因等一秒恢复，具体分类以 ",{"type":64,"tag":214,"props":215,"children":218},"a",{"href":22,"rel":216},[217],"nofollow",[219],{"type":69,"value":220},"Claude 错误文档",{"type":69,"value":222},"和 ",{"type":64,"tag":214,"props":224,"children":226},{"href":27,"rel":225},[217],[227],{"type":69,"value":228},"OpenAI 限流文档",{"type":69,"value":230},"为准。",{"type":64,"tag":80,"props":232,"children":234},{"id":233},"限流与超时共享一份预算",[235],{"type":69,"value":236},"限流与超时：共享一份预算",{"type":64,"tag":65,"props":238,"children":239},{},[240],{"type":69,"value":241},"网关按上游配额限制请求和 token，按用户、任务分配公平份额。多实例共享额度要统一协调；并发与队列也设上限，排队过久应尽早告知。",{"type":64,"tag":65,"props":243,"children":244},{},[245,247,252],{"type":69,"value":246},"每个任务设一个",{"type":64,"tag":72,"props":248,"children":249},{},[250],{"type":69,"value":251},"总截止时间",{"type":69,"value":253},"，调用、退避、重试和降级共享剩余时间。SDK、网关与业务统一重试策略，否则每层三次会叠成九次甚至更多。",{"type":64,"tag":65,"props":255,"children":256},{},[257],{"type":69,"value":258},"Full jitter 可写成：",{"type":64,"tag":260,"props":261,"children":266},"pre",{"className":262,"code":264,"language":69,"meta":265},[263],"language-text","delay = random(0, min(cap, base × 2^attempt))\n","",[267],{"type":64,"tag":268,"props":269,"children":270},"code",{"__ignoreMap":265},[271],{"type":69,"value":264},{"type":64,"tag":65,"props":273,"children":274},{},[275,277,283],{"type":69,"value":276},"它与“固定退避上下浮动 50%”不同。",{"type":64,"tag":268,"props":278,"children":280},{"className":279},[],[281],{"type":69,"value":282},"Retry-After",{"type":69,"value":284}," 超过剩余预算时进入替代路径，不能截短等待后提前冲击上游。分别记录连接超时、首内容超时、流空闲超时和总超时。",{"type":64,"tag":80,"props":286,"children":288},{"id":287},"幂等业务效果一次不等于模型只收费一次",[289],{"type":69,"value":290},"幂等：业务效果一次，不等于模型只收费一次",{"type":64,"tag":65,"props":292,"children":293},{},[294,296,301],{"type":69,"value":295},"业务任务 ID 防重复提交，attempt ID 记录每次模型尝试。自定义幂等头",{"type":64,"tag":72,"props":297,"children":298},{},[299],{"type":69,"value":300},"不代表供应商支持去重",{"type":69,"value":302},"；重试生成仍可能执行和计费，必须按端点确认。",{"type":64,"tag":65,"props":304,"children":305},{},[306],{"type":69,"value":307},"有副作用的工具需要自己实现幂等：",{"type":64,"tag":309,"props":310,"children":311},"ol",{},[312,318,323,328],{"type":64,"tag":313,"props":314,"children":315},"li",{},[316],{"type":69,"value":317},"键绑定用户、操作类型和内容摘要。",{"type":64,"tag":313,"props":319,"children":320},{},[321],{"type":69,"value":322},"原子创建任务；同键同内容返回已有状态，同键异内容拒绝。",{"type":64,"tag":313,"props":324,"children":325},{},[326],{"type":69,"value":327},"写入与完成状态在事务内提交，或用 outbox 衔接外部系统。",{"type":64,"tag":313,"props":329,"children":330},{},[331],{"type":69,"value":332},"外部操作结果未知时查询或对账，不盲目重做。",{"type":64,"tag":65,"props":334,"children":335},{},[336,338,344],{"type":69,"value":337},"先查“键不存在”再写数据会在并发下重复执行。去重记录保留期要覆盖业务重放窗口；离线设备很久后重发，不能照抄 24 小时。",{"type":64,"tag":214,"props":339,"children":341},{"href":31,"rel":340},[217],[342],{"type":69,"value":343},"Stripe 幂等文档",{"type":69,"value":345},"是具体实现范例，其他 API 不自动继承这些保证。",{"type":64,"tag":80,"props":347,"children":349},{"id":348},"流式失败已经展示的内容怎么办",[350],{"type":69,"value":351},"流式失败：已经展示的内容怎么办",{"type":64,"tag":65,"props":353,"children":354},{},[355],{"type":69,"value":356},"首字前切换模型可以重新生成；首字后要处理已展示文本。备用输出接在半句话后面，可能重复、矛盾，甚至重复动作。",{"type":64,"tag":65,"props":358,"children":359},{},[360,362,368,370,376,378,384,385,391,393,399],{"type":69,"value":361},"客户端事件携带 ",{"type":64,"tag":268,"props":363,"children":365},{"className":364},[],[366],{"type":69,"value":367},"task_id",{"type":69,"value":369},"、",{"type":64,"tag":268,"props":371,"children":373},{"className":372},[],[374],{"type":69,"value":375},"attempt_id",{"type":69,"value":377}," 和序号，终止时明确 ",{"type":64,"tag":268,"props":379,"children":381},{"className":380},[],[382],{"type":69,"value":383},"completed",{"type":69,"value":369},{"type":64,"tag":268,"props":386,"children":388},{"className":387},[],[389],{"type":69,"value":390},"interrupted",{"type":69,"value":392}," 或 ",{"type":64,"tag":268,"props":394,"children":396},{"className":395},[],[397],{"type":69,"value":398},"failed",{"type":69,"value":400},"。断流后保留草稿并提示未完成；重新生成时显式替换整段，或者使用可验证的续传协议。执行工具前确认完整参数，不能执行半截 JSON。",{"type":64,"tag":65,"props":402,"children":403},{},[404],{"type":64,"tag":405,"props":406,"children":409},"img",{"alt":407,"src":408},"失败决策树：错误分类、截止时间、重试、模型切换与确定性兜底","\u002Fdiagrams\u002Ffallback-design.svg",[],{"type":64,"tag":65,"props":411,"children":412},{},[413],{"type":64,"tag":414,"props":415,"children":416},"em",{},[417],{"type":69,"value":418},"图 1 · 降级有触发条件和质量门槛，安全拒绝不进入绕过式重试。",{"type":64,"tag":80,"props":420,"children":422},{"id":421},"降级路径也要先评测",[423],{"type":69,"value":421},{"type":64,"tag":65,"props":425,"children":426},{},[427],{"type":69,"value":428},"可选备用模型、精确答案缓存、原文检索和固定提示，顺序按业务决定。合法精确缓存可先查；权益或高风险答案可能必须停止自动处理。",{"type":64,"tag":65,"props":430,"children":431},{},[432],{"type":69,"value":433},"备用模型要验证工具、结构化输出、中文质量、上下文容量和安全规则。小模型不保证更快，也不保证有独立限流池；共享故障域时切换可能无效。",{"type":64,"tag":65,"props":435,"children":436},{},[437,442],{"type":64,"tag":72,"props":438,"children":439},{},[440],{"type":69,"value":441},"语义相似不等于答案可复用。",{"type":69,"value":443}," 配置问题改一个数字，向量仍很接近。优先对象 ID、规范化请求和参数的精确键；允许近似的任务使用语义缓存时，评测误命中，并限定租户、权限、内容、知识库版本与有效期。相似度阈值不能跨模型照搬。",{"type":64,"tag":65,"props":445,"children":446},{},[447],{"type":69,"value":448},"熔断器按故障域维护关闭、打开、半开三态：失败摘除、冷却后少量探测、恢复才放量。正常安全拒绝和用户参数错误不应熔断整个上游。",{"type":64,"tag":80,"props":450,"children":452},{"id":451},"一个请求场景",[453],{"type":69,"value":451},{"type":64,"tag":65,"props":455,"children":456},{},[457],{"type":69,"value":458},"假设总预算 8 秒，主模型在第 2 秒返回临时限流，要求等 1 秒。等待后剩 5 秒：备用路径历史 p95 为 2 秒且质量达标，可尝试；若时间不足则展示检索原文和稍后重试入口。",{"type":64,"tag":65,"props":460,"children":461},{},[462],{"type":69,"value":463},"每次转换记录原因、耗时、费用和结果。这个算例说明“用剩余预算决策”，不是统一推荐 8 秒或固定重试次数。",{"type":64,"tag":80,"props":465,"children":467},{"id":466},"slo-与故障演练",[468],{"type":69,"value":469},"SLO 与故障演练",{"type":64,"tag":65,"props":471,"children":472},{},[473],{"type":69,"value":474},"SLI 是测量，SLO 是目标，SLA 是对外承诺。分开看传输成功率、任务完成率、抽样正确率、首字延迟和降级率。引用存在不能代替正确率。",{"type":64,"tag":65,"props":476,"children":477},{},[478],{"type":69,"value":479},"任务完成率目标 99.5%，100 万个纳入统计的任务允许 5,000 次未完成；分母和用户取消规则事先固定。错误预算持续消耗时优先修可靠性。",{"type":64,"tag":65,"props":481,"children":482},{},[483],{"type":69,"value":484},"演练覆盖主模型故障、余额耗尽、首字后断流、缓存故障、工具结果未知与双上游失败。验收包括无重复业务效果、无跨用户缓存、费用有记录、用户知道任务是否完成。",{"type":64,"tag":80,"props":486,"children":488},{"id":487},"落地检查",[489],{"type":69,"value":487},{"type":64,"tag":309,"props":491,"children":492},{},[493,498,503,508,513,518],{"type":64,"tag":313,"props":494,"children":495},{},[496],{"type":69,"value":497},"错误体与语义一起分类，永久错误和拒绝不盲目重试。",{"type":64,"tag":313,"props":499,"children":500},{},[501],{"type":69,"value":502},"重试与降级共用截止时间，检查 SDK 自动重试。",{"type":64,"tag":313,"props":504,"children":505},{},[506],{"type":69,"value":507},"业务键与 attempt 分离，用事务、唯一约束或对账保护副作用。",{"type":64,"tag":313,"props":509,"children":510},{},[511],{"type":69,"value":512},"断流显式标记，备用文本不直接续接原输出。",{"type":64,"tag":313,"props":514,"children":515},{},[516],{"type":69,"value":517},"缓存与备用模型通过权限、质量回归后再启用。",{"type":64,"tag":313,"props":519,"children":520},{},[521,523,529],{"type":69,"value":522},"用 ",{"type":64,"tag":214,"props":524,"children":526},{"href":525},"\u002Farticles\u002Fllm-eval-loop",[527],{"type":69,"value":528},"评测闭环",{"type":69,"value":530},"验证替代路径。",{"type":64,"tag":80,"props":532,"children":534},{"id":533},"参考资料",[535],{"type":69,"value":533},[537,539,540,541,542,543,544,545,546],{"id":82,"depth":538,"text":82},2,{"id":233,"depth":538,"text":236},{"id":287,"depth":538,"text":290},{"id":348,"depth":538,"text":351},{"id":421,"depth":538,"text":421},{"id":451,"depth":538,"text":451},{"id":466,"depth":538,"text":469},{"id":487,"depth":538,"text":487},{"id":533,"depth":538,"text":533},1792400815607]