# 灵隙协议实现规范:数字分段错误码系统 > 版本:1.0.0 | 层级:实现层 --- ## 1. 错误码分段总览 灵隙协议将错误码按照功能领域划分为 9 个分段,每个分段占用 1000 个编码空间(即一个十进制千位段),便于程序化路由、国际化映射和监控告警分类。 | 分段范围 | 类别 | 常量标识 | 说明 | |---------|------|---------|------| | 1000-1999 | SYSTEM_ERROR | 系统错误 | 服务端基础设施类错误,包括内部错误、维护状态等 | | 2000-2999 | TASK_ERROR | 任务错误 | 任务生命周期相关错误,包括查找、取消、超时等 | | 3000-3999 | INFO_ERROR | 信息错误 | 请求信息/数据类错误,包括字段缺失、格式错误等 | | 4000-4999 | CAPABILITY_ERROR | 能力错误 | Agent 能力相关错误,包括不支持的任务类型、资源繁忙等 | | 5000-5999 | SECURITY_ERROR | 安全错误 | 认证与授权类错误,包括签名验证、权限不足等 | | 6000-6999 | COMMUNICATION_ERROR | 通信错误 | 网络通信类错误,包括端点不可达、回调失败等 | | 7000-7999 | GROUP_ERROR | 群组错误 | 群组协作类错误,包括成员管理、共识失败等 | | 8000-8999 | HIL_ERROR | HiL 错误 | 人工介入(Human-in-the-Loop)相关错误 | | 9000-9999 | VALIDATION_ERROR | 验证错误 | 通用参数验证错误 | 分类映射逻辑由 `SynapseErrorCode.Category()` 方法实现,通过错误码范围自动推导所属类别。 --- ## 2. 系统错误(1000-1999) 系统错误表示服务端基础设施层面的异常,通常需要运维人员介入处理。 | 错误码 | 常量名称 | 说明 | |-------|---------|------| | 1000 | ErrSystemError | 通用系统错误,无法归类的系统级异常 | | 1001 | ErrInternalError | 内部错误,服务端内部处理逻辑异常 | | 1002 | ErrMaintenance | 系统维护中,服务暂不可用 | **适用场景**: - 数据库连接失败、磁盘写入异常等基础设施故障 - 未捕获的运行时异常 - 计划内维护窗口或突发性服务不可用 --- ## 3. 任务错误(2000-2999) 任务错误表示与任务生命周期管理相关的异常,涵盖任务的创建、执行、完成和取消等阶段。 | 错误码 | 常量名称 | 说明 | |-------|---------|------| | 2001 | ErrTaskNotFound | 任务不存在,指定的任务 ID 无效或已过期 | | 2002 | ErrTaskAlreadyCompleted | 任务已完成,无法对已完成的任务执行变更操作 | | 2003 | ErrTaskCancelled | 任务已取消,任务已被发起方或系统取消 | | 2004 | ErrTaskTimeout | 任务超时,执行时长超过最大允许时间 | | 2005 | ErrTaskInvalidParams | 任务参数无效,提交任务时提供的参数不符合要求 | **适用场景**: - 查询不存在的任务状态 - 对已结束的任务发起取消或修改 - 任务执行超过最大持续时间阈值 - 提交任务时缺少必要参数或参数格式错误 --- ## 4. 信息错误(3000-3999) 信息错误表示请求中携带的信息不完整或不符合规范,通常由调用方修正后重试。 | 错误码 | 常量名称 | 说明 | |-------|---------|------| | 3001 | ErrRequiredFieldMissing | 必填字段缺失,请求中缺少协议要求的必需字段 | | 3002 | ErrInvalidFieldFormat | 字段格式无效,字段值不符合预期的格式规范 | | 3003 | ErrInfoNotProvided | 信息未提供,需要的信息未被提供 | **适用场景**: - 消息中缺少 `sender`、`receiver` 等必填字段 - 邮箱、URL、时间戳等字段格式校验失败 - 上下文信息不足以完成任务处理 --- ## 5. 能力错误(4000-4999) 能力错误表示接收方 Agent 无法处理请求所要求的能力或资源不可用。 | 错误码 | 常量名称 | 说明 | |-------|---------|------| | 4001 | ErrUnsupportedTaskType | 不支持的任务类型,Agent 未声明支持该类型的任务 | | 4002 | ErrCapabilityLacking | 能力不足,Agent 不具备执行请求所需的某项能力 | | 4003 | ErrResourceBusy | 资源繁忙,Agent 当前正在处理其他任务,无法接受新请求 | | 4004 | ErrQuotaExceeded | 配额超限,请求超出 Agent 设定的资源配额限制 | **适用场景**: - 向只支持文本生成的 Agent 提交图像生成任务 - 调用未在 `AgentCapabilities` 中声明的能力 - Agent 已达到 `MaxConcurrentTasks` 上限 - 文件大小超过 `MaxFileSize` 或任务时长超过 `MaxTaskDuration` --- ## 6. 安全错误(5000-5999) 安全错误表示认证、授权或安全策略相关的异常,涉及身份验证和访问控制。 | 错误码 | 常量名称 | 说明 | |-------|---------|------| | 5001 | ErrAuthFailed | 认证失败,身份凭证验证未通过 | | 5002 | ErrSignatureInvalid | 签名无效,消息签名验证失败,内容可能被篡改 | | 5003 | ErrPermissionDenied | 权限不足,当前身份不具备执行操作所需的权限 | | 5004 | ErrPolicyViolation | 策略违规,请求违反系统安全策略或合规要求 | **适用场景**: - 令牌过期、密钥错误等认证失败 - HMAC 签名不匹配或签名算法不一致 - 角色(Role)不具备操作所需的权限(Permission) - 违反数据访问策略、IP 白名单限制等安全规则 --- ## 7. 通信错误(6000-6999) 通信错误表示网络传输层面的异常,通常涉及 Agent 之间的消息投递和回调机制。 | 错误码 | 常量名称 | 说明 | |-------|---------|------| | 6001 | ErrEndpointUnreachable | 端点不可达,目标 Agent 的回调端点无法连接 | | 6002 | ErrCallbackFailed | 回调失败,回调请求发送成功但返回错误响应 | | 6003 | ErrMessageFormatInvalid | 消息格式无效,接收到的消息不符合协议格式要求 | | 6004 | ErrTTLExpired | TTL 过期,消息的存活时间已过期,已被丢弃 | **适用场景**: - 目标 Agent 离线或网络不可达 - 回调端点返回非 2xx 状态码 - 消息结构解析失败、JSON 格式错误 - 消息在灵泊(Harbor)队列中停留超过 TTL --- ## 8. 群组错误(7000-7999) 群组错误表示群组协作场景中的异常,涵盖群组生命周期管理和成员操作。 | 错误码 | 常量名称 | 说明 | |-------|---------|------| | 7001 | ErrGroupNotFound | 群组不存在,指定的群组 ID 无效或已解散 | | 7002 | ErrGroupNotActive | 群组未激活,群组当前处于非活跃状态 | | 7003 | ErrMemberNotFound | 成员不存在,指定的成员不在群组中 | | 7004 | ErrNotGroupMember | 不是群组成员,当前 Agent 不属于该群组 | | 7005 | ErrConsensusNotReached | 未达成共识,群组投票未达到共识阈值 | | 7006 | ErrRoleNotFound | 角色不存在,指定的角色在群组中未定义 | | 7007 | ErrAlreadyMember | 已是成员,Agent 已经加入该群组 | | 7008 | ErrGroupFull | 群组已满,群组成员数量已达上限 | **适用场景**: - 查询或操作不存在的群组 - 向未激活的群组发送消息 - 查询群组中不存在的成员信息 - 非群组成员尝试执行仅成员可用的操作 - 投票结果未达到 `ConsensusMajority` 或 `ConsensusSupermajority` 阈值 - 重复加入同一群组 - 群组人数超过 `MaxMembers` 限制 --- ## 9. HiL 错误(8000-8999) HiL(Human-in-the-Loop)错误表示人工介入流程中的异常情况,涵盖人工决策超时、拒绝和升级级别错误。 | 错误码 | 常量名称 | 说明 | |-------|---------|------| | 8001 | ErrHumanTimeout | 人工决策超时,在规定时间内未收到人工响应 | | 8002 | ErrHumanDeclined | 人工拒绝,人工决策者明确拒绝了请求 | | 8003 | ErrEscalationLevel | 升级级别错误,指定的升级级别无效或不适用 | **适用场景**: - Level 1/2/3 超时未响应(超时时间依据级别分别为 24h/12h/72h) - 人工批复结果为 `rejected` - 升级级别超出定义范围(1-3)或与升级原因不匹配 **级别超时默认值**: | 级别 | 默认超时 | 紧急超时 | |-----|---------|---------| | Level 1 | 24 小时 | — | | Level 2 | 12 小时 | 2 小时 | | Level 3 | 72 小时 | — | --- ## 10. 验证错误(9000-9999) 验证错误表示通用参数验证未通过,适用于多个层级的输入校验。 | 错误码 | 常量名称 | 说明 | |-------|---------|------| | 9001 | ErrInvalidParams | 参数无效,通用参数校验失败 | **适用场景**: - 请求参数类型不匹配 - 枚举值超出允许范围 - 数值超出允许的上下界 - 字符串长度超出限制 --- ## 11. 错误响应结构 灵隙协议定义了两层错误响应结构:`SynapseError` 承载单一错误的完整信息,`ErrorResponse` 作为统一的 API 响应信封。 ### 11.1 SynapseError `SynapseError` 是协议中所有错误的标准载体,包含错误码、类别、人类可读消息以及扩展信息。 ```go type SynapseError struct { Code SynapseErrorCode `json:"code"` // 数字错误码,如 1000、2001 Category string `json:"category"` // 错误类别,如 "SYSTEM_ERROR"、"TASK_ERROR" Message string `json:"message"` // 错误描述,人类可读的英文消息 Details any `json:"details,omitempty"` // 错误详情,可选,可包含结构化补充信息 RetryAfter *int `json:"retry_after,omitempty"` // 建议重试等待时间(秒),可选 Timestamp Timestamp `json:"timestamp"` // 错误发生时间戳 } ``` **字段说明**: | 字段 | 类型 | 必填 | 说明 | |-----|------|-----|------| | `code` | SynapseErrorCode | 是 | 数字错误码,属于预定义的 9 个分段之一 | | `category` | string | 是 | 由 `SynapseErrorCode.Category()` 自动推导的类别常量 | | `message` | string | 是 | 面向开发者的英文错误描述,便于日志和调试 | | `details` | any | 否 | 可选的扩展信息,可包含字段级别的验证错误等结构化数据 | | `retry_after` | *int | 否 | 对可重试错误,建议调用方等待的秒数(如资源繁忙时) | | `timestamp` | Timestamp | 是 | 错误生成的时间戳,用于追踪和时序分析 | ### 11.2 ErrorResponse `ErrorResponse` 是所有 API 响应的统一错误信封,通过 `success` 字段标识请求处理状态。 ```go type ErrorResponse struct { Success bool `json:"success"` // 固定为 false Error *SynapseError `json:"error"` // 错误详情 } ``` **JSON 序列化示例**: ```json { "success": false, "error": { "code": 4003, "category": "CAPABILITY_ERROR", "message": "Agent is currently busy processing other tasks", "details": { "current_tasks": 5, "max_concurrent": 5 }, "retry_after": 30, "timestamp": "2026-06-28T10:30:00Z" } } ``` ### 11.3 ToMap() 方法 `SynapseError` 提供 `ToMap() map[string]any` 方法,将错误结构转换为扁平化的 map 结构,便于在不同上下文中进行 JSON 序列化或格式转换。 **转换规则**: | 源字段 | map 中的 key | 条件 | |-------|-------------|------| | `Code` | `"code"` | 始终包含 | | `Category` | `"category"` | 始终包含 | | `Message` | `"message"` | 始终包含 | | `Timestamp` | `"timestamp"` | 始终包含 | | `Details` | `"details"` | 仅当 `Details != nil` 时包含 | | `RetryAfter` | `"retry_after"` | 仅当 `RetryAfter != nil` 时包含 | **方法签名**: ```go func (e *SynapseError) ToMap() map[string]any ``` **Go 实现**: ```go func (e *SynapseError) ToMap() map[string]any { m := map[string]any{ "code": e.Code, "category": e.Category, "message": e.Message, "timestamp": e.Timestamp, } if e.Details != nil { m["details"] = e.Details } if e.RetryAfter != nil { m["retry_after"] = *e.RetryAfter } return m } ``` ### 11.4 工厂函数 协议提供两个工厂函数用于构造 `SynapseError`: | 函数 | 说明 | |-----|------| | `NewSynapseError(code, message, details)` | 创建标准错误,自动填充 `Category` 和 `Timestamp` | | `NewSynapseErrorWithRetry(code, message, details, retryAfter)` | 创建带重试提示的错误 | ### 11.5 预定义错误实例 `types/errors.go` 中定义了一系列预构建的错误实例,供实现直接引用: | 变量名 | 对应错误码 | 默认消息 | |-------|-----------|---------| | `ErrTaskNotFoundError` | 2001 | "Task not found" | | `ErrTaskAlreadyCompletedError` | 2002 | "Task has already been completed" | | `ErrTaskCancelledError` | 2003 | "Task has been cancelled" | | `ErrTaskTimeoutError` | 2004 | "Task execution timed out" | | `ErrRequiredFieldMissingError` | 3001 | "Required field is missing" | | `ErrUnsupportedTaskTypeError` | 4001 | "Task type is not supported by this agent" | | `ErrCapabilityLackingError` | 4002 | "Agent lacks the required capability" | | `ErrResourceBusyError` | 4003 | "Agent is currently busy processing other tasks" | | `ErrAuthFailedError` | 5001 | "Authentication failed" | | `ErrSignatureInvalidError` | 5002 | "Message signature verification failed" | | `ErrPermissionDeniedError` | 5003 | "Permission denied" | | `ErrEndpointUnreachableError` | 6001 | "Callback endpoint is unreachable" | | `ErrMessageFormatInvalidError` | 6003 | "Message format is invalid" | | `ErrGroupNotFoundError` | 7001 | "Group not found" | | `ErrNotGroupMemberError` | 7004 | "Agent is not a member of this group" | | `ErrGroupNotActiveError` | 7002 | "Group is not active" | | `ErrAlreadyMemberError` | 7007 | "Agent is already a member of this group" | | `ErrGroupFullError` | 7008 | "Group has reached maximum capacity" | | `ErrMemberNotFoundError` | 7003 | "Member not found in group" | | `ErrInvalidParamsError` | 9001 | "Invalid parameters" | | `ErrHumanTimeoutError` | 8001 | "Human decision timed out" | --- ## 附录:错误码常量定义 ```go type SynapseErrorCode int // 系统错误 const ErrSystemError SynapseErrorCode = 1000 const ErrInternalError SynapseErrorCode = 1001 const ErrMaintenance SynapseErrorCode = 1002 // 任务错误 const ErrTaskNotFound SynapseErrorCode = 2001 const ErrTaskAlreadyCompleted SynapseErrorCode = 2002 const ErrTaskCancelled SynapseErrorCode = 2003 const ErrTaskTimeout SynapseErrorCode = 2004 const ErrTaskInvalidParams SynapseErrorCode = 2005 // 信息错误 const ErrRequiredFieldMissing SynapseErrorCode = 3001 const ErrInvalidFieldFormat SynapseErrorCode = 3002 const ErrInfoNotProvided SynapseErrorCode = 3003 // 能力错误 const ErrUnsupportedTaskType SynapseErrorCode = 4001 const ErrCapabilityLacking SynapseErrorCode = 4002 const ErrResourceBusy SynapseErrorCode = 4003 const ErrQuotaExceeded SynapseErrorCode = 4004 // 安全错误 const ErrAuthFailed SynapseErrorCode = 5001 const ErrSignatureInvalid SynapseErrorCode = 5002 const ErrPermissionDenied SynapseErrorCode = 5003 const ErrPolicyViolation SynapseErrorCode = 5004 // 通信错误 const ErrEndpointUnreachable SynapseErrorCode = 6001 const ErrCallbackFailed SynapseErrorCode = 6002 const ErrMessageFormatInvalid SynapseErrorCode = 6003 const ErrTTLExpired SynapseErrorCode = 6004 // 群组错误 const ErrGroupNotFound SynapseErrorCode = 7001 const ErrGroupNotActive SynapseErrorCode = 7002 const ErrMemberNotFound SynapseErrorCode = 7003 const ErrNotGroupMember SynapseErrorCode = 7004 const ErrConsensusNotReached SynapseErrorCode = 7005 const ErrRoleNotFound SynapseErrorCode = 7006 const ErrAlreadyMember SynapseErrorCode = 7007 const ErrGroupFull SynapseErrorCode = 7008 // HiL 错误 const ErrHumanTimeout SynapseErrorCode = 8001 const ErrHumanDeclined SynapseErrorCode = 8002 const ErrEscalationLevel SynapseErrorCode = 8003 // 验证错误 const ErrInvalidParams SynapseErrorCode = 9001 ``` --- > 本文档对应源码:[types/errors.go](file:///e:/code/go/synapse/types/errors.go) > > 参考文档:[06-implementation-details.md](file:///e:/code/go/synapse/docs/v0/06-implementation-details.md) 第 6 章