Skip to content

错误处理

GodeX 将每种失败建模为类型化的、领域作用域的对象,使调用方、运维人员和日志聚合管道都使用同一种语言。系统没有在整个代码库中散布字符串消息,而是定义了一个抽象基类——GodeXError——以及四个与架构层一一对应的具体子类。每个错误携带机器可读的错误码、HTTP 状态码、结构化上下文包和毫秒级精度的时间戳,使从上游提供商超时到返回给客户端的 JSON 响应体的端到端故障追踪变得简单直接。

概览

方面详情
基类GodeXError -- 抽象类,继承自 Error
领域serverbridgeprovidersession
关键字段domaincodestatuscontexttimestamp
日志toLogEntry() 生成普通对象快照
HTTP 映射server/errors.ts 中的 godeXErrorToHttp / providerErrorToHttp
错误码集中定义在 src/error/codes.ts

错误类层次结构

抽象类 GodeXError 定义在 src/error/godex-error.ts:2-35。 每个子类声明一个固定的 domain 字符串并将构造函数参数转发给基类,由基类标准化 statuscontext 的默认值。

错误领域与错误码

错误码遵循 <domain>.<subdomain>.<specific> 的命名模式,作为字符串常量从 src/error/codes.ts:1-52 导出。

Server 领域

在请求解析和配置验证期间抛出。

错误码HTTP 状态触发时机
server.request.invalid_json400请求体不是有效的 JSON
server.request.missing_model400缺少必需的 model 字段
server.request.invalid_parameter400参数验证失败
server.provider.not_registered400引用的提供商未注册

来源:src/error/codes.ts:46-51

Bridge 领域

在 OpenAI Responses schema 与提供商原生格式之间进行转换时抛出。

错误码HTTP 状态触发时机
bridge.request.unsupported_parameter400参数在提供商端无对应项
bridge.request.tool_skipped400提供商不支持该工具
bridge.request.unsupported_input_item400输入项类型无法转换
bridge.request.unsupported_input_content400内容类型无法转换
bridge.request.unsupported_tool400工具定义无法转换
bridge.response.invalid_output_format400提供商输出无法映射回
bridge.stream.*400流状态机违规

来源:src/error/codes.ts:3-31

Provider 领域

在上游 HTTP 失败时抛出;除非上游状态码具有特定含义,否则始终映射为 502。

错误码上游状态映射的 HTTP 状态
provider.upstream.rate_limit429429
provider.upstream.timeout408408
provider.upstream.server_error>= 500502
provider.upstream.error其他422

来源:src/error/codes.ts:33-36来源:src/server/errors.ts:20-44

Session 领域

在管理对话链时抛出。

错误码HTTP 状态触发时机
session.chain.not_found404先前的响应 ID 不存在
session.chain.cycle_detected400检测到循环链引用
session.chain.depth_exceeded400链深度超过配置的最大值
session.chain.unavailable503会话存储暂时不可用
session.store.conflict409并发写入冲突

来源:src/error/codes.ts:39-43

错误传播流程

路由级错误处理器位于 src/server/routes/responses/error-handler.ts:12-50, 按优先级顺序分派错误:

  1. ProviderError -- 以 error 级别记录日志,通过 providerErrorToHttp 映射。
  2. 其他 GodeXError -- 以 info 级别记录日志,返回自身的 statuscode
  3. 意外错误 -- 以 error 级别记录日志,遮蔽为 500 server_error

子类构造

每个子类添加了一个类型化的上下文接口,用于捕获与其领域相关的信息。

子类默认状态上下文要点来源
ServerError400pathmethodsrc/error/server-error.ts:10-27
BridgeError400providermodelparametersrc/error/bridge-error.ts:11-28
ProviderError502providermodelupstreamStatusupstreamBodysrc/error/provider-error.ts:12-29
SessionError400responseIdpreviousResponseIdmaxDepthsrc/error/session-error.ts:11-27

HTTP 映射

jsonError 辅助函数位于 src/server/errors.ts:50-63, 生成标准 JSON 封装格式:

json
{
  "error": {
    "code": "server.request.missing_model",
    "message": "Missing required field: model"
  }
}

提供商特定的映射(providerErrorToHttp)将上游 HTTP 状态码转换为面向客户端的等价值,位于 src/server/errors.ts:20-44

通过 toLogEntry 进行结构化日志

每个 GodeXError 可以通过 toLogEntry() 生成可序列化的日志条目,位于 src/error/godex-error.ts:24-34。 独立的 toLogEntry(err) 重载位于 第 37 行, 可以优雅处理非 GodeXError 值,将其包装为普通对象。

交叉引用

参考文献