Zion模型调用超时抛出ZionTimeoutError异常,含layer、budget_ms、request_id三属性,需显式捕获并按layer区分处理:connect层查网络,first_token层优prompt或换模型,stream_read层可续传;不自动重试。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

在函子Zion中,模型调用超时不会返回空值、None或静默失败,而是明确抛出一个带状态标识的结构化异常对象,该对象携带可解析的错误类型、原始超时层级和请求上下文。
Zion模型调用超时的默认返回形态
调用发起后若未在配置的截止时间内收到完整响应,Zion运行时会中断当前协程,并向上抛出 【ZionTimeoutError】 实例。该异常继承自 Python 的 BaseException,但不是 KeyboardInterrupt 或 SystemExit 这类特殊中断信号,因此不会被通用 except Exception: 捕获——必须显式声明 except ZionTimeoutError: 才能正确处理。
异常对象包含三个关键属性:layer(标明超时发生在哪一层:connect / first_token / stream_read / total),budget_ms(本次请求分配的毫秒级预算),request_id(与日志 traceId 对齐的唯一标识)。
不同超时类型的响应差异
方法一:连接建立超时(connect timeout)
返回 ZionTimeoutError(layer="connect", budget_ms=3000),此时请求甚至未发出到网络层,无 HTTP 状态码,也无 response body。这种超时通常指向 DNS 故障、网关不可达或客户端代理阻塞。
方法二:首 Token 超时(first_token timeout)
返回 ZionTimeoutError(layer="first_token", budget_ms=8000),表示请求已送达服务端且被接受,但模型预填充阶段耗时过长。此时可能已产生 token 计费,但无任何生成内容返回。
方法三:流式读取超时(stream_read timeout)
返回 ZionTimeoutError(layer="stream_read", budget_ms=15000),说明已有部分 token 流入,但在某次 chunk 间隔中停滞。Zion 会自动截断已接收内容并附在异常的 partial_content 属性中,供上层决定是否缓存或重试续传。
如何在代码中可靠捕获并区分
第一步:导入专用异常类from zion.errors import ZionTimeoutError
第二步:按 layer 字段做分支判断
遇到 layer == "connect",应检查本地网络、代理配置或切换备用 endpoint;
遇到 layer == "first_token",需降低 prompt 长度或切换更轻量模型;
遇到 layer == "stream_read",可尝试增大该层预算,或启用断点续传协议(需服务端支持)。
注意:【Zion 不会自动重试超时请求】,所有重试逻辑必须由业务层显式控制。因为超时本身不保证远端已终止——尤其在 first_token 或 stream_read 阶段,模型可能仍在后台生成,重复发起新请求会导致输出重复或配额双扣。











