Skip to content

错误码 ​

一次拒绝长这样:JSON-RPC error 对象,code 是数字,当 code 落在 ANP 自定义段 (1000+)时,error.data.anp_code 一定在,客户端靠它分支,不要靠 message 文案。

json
{ "jsonrpc": "2.0", "id": 1,
  "error": { "code": 1003, "message": "…",
             "data": { "anp_code": "anp.invalid_params_shape" } } }

两条规则:

  • 进入业务层之后,一律 HTTP 200,错误在信封里。非 2xx 是一个响应,不是一个异常。
  • 外层 HTTP 认证失败走真实状态码(401,带 WWW-Authenticate),因为那一层还没有 JSON-RPC 信封。数据面另一个例外,见 HTTP 端点。

标准 JSON-RPC 码 ​

这几个不带 anp_code,靠 message 区分。

码含义
-32700解析失败
-32600不是合法请求
-32601没有这个方法
-32602参数不合法
-32603服务端内部错误

码段总表 ​

段归属
1000–1021P1 公共错误
2000–2007P3 私聊(direct.*)
3000–3010P4 群组(无 3004)
4000–4012P5 私聊 E2EE
5000–5013P6 群组 E2EE
6000–6013P7 附件

1000 段:公共(P1) ​

码anp_code
1000anp.invalid_request_id
1001anp.unsupported_profile
1002anp.unsupported_security_profile
1003anp.invalid_params_shape
1004anp.batch_not_supported
1005anp.unauthorized
1006anp.forbidden
1007anp.target_not_found
1008anp.idempotency_conflict
1009anp.unsupported_content_type
1010anp.delivery_rejected
1011anp.rate_limited
1012anp.temporarily_unavailable
1013anp.invalid_security_binding
1014anp.invalid_target_binding
1015anp.device_binding_required
1016anp.device_binding_invalid
1017anp.device_not_eligible
1018anp.device_state_changed
1019anp.did_superseded
1020anp.did_transition_invalid
1021anp.did_transition_conflict

最常见的三个:

  • 1003:正文多一个字段、少一个字段,或 params 不是对象。群资料/策略的 merge patch 在应用之后才校验,结构性违规也是 1003 而不是 3003。
  • 1005:origin_proof 验不过,或 keyid 所属 DID 不等于这次调用的锚点。
  • 1014:meta.target 形状对不上方法的 targetMode(不是 1003)。

2000 段:私聊(P3) ​

码anp_code
2005direct.invalid_origin_proof
2006direct.origin_did_mismatch

这两条都在业务层 proof 的归属校验上:签名本身不对是 2005,签得对但签的 DID 不是这次调用 该有的锚点是 2006。跨域时外层认证失败不走这里,走 401。

3000 段:群组(P4) ​

码anp_code本服务是否发出
3000group.not_member是
3001group.already_member是
3002group.admission_not_allowed否(没有产生它的路径)
3003group.policy_violation是(权限不足、非 open-join 的 join、超 max_members)
3005group.member_conflict是(曾退出后被重新激活的冲突路径)
3006group.security_mode_required是(该走 P6 的操作走了 P4)
3008group.invalid_origin_proof是
3009group.origin_did_mismatch是

群通知的锚点是 body.group_did 而不是 meta.sender_did——所以 3009 与 2006 判的不是 同一件事。见 联邦与跨域。

4000 段:私聊 E2EE(P5) ​

码anp_code
4000anp.direct.e2ee.bundle_not_found
4001anp.direct.e2ee.bundle_invalid
4003anp.direct.e2ee.opk_unavailable
4012anp.direct.e2ee.invalid_security_binding

require_opk 而池空时是 4003;池空但没要求 OPK 就正常返回不带 OPK 的 Bundle。 密钥方法的限流用公共的 1011,因为 4000 段里没有对应项。

5000 段:群组 E2EE(P6) ​

码anp_code
5000anp.group.e2ee.key_package_not_found
5001anp.group.e2ee.invalid_key_package
5002anp.group.e2ee.did_binding_invalid
5003anp.group.e2ee.controller_required
5004anp.group.e2ee.state_not_ready
5005anp.group.e2ee.epoch_conflict
5006anp.group.e2ee.crypto_group_mismatch
5007anp.group.e2ee.private_message_invalid
5008anp.group.e2ee.commit_invalid
5009anp.group.e2ee.welcome_invalid
5010anp.group.e2ee.fork_suspected
5011anp.group.e2ee.notice_type_unsupported
5012anp.group.e2ee.key_package_consumed
5013anp.group.e2ee.leaf_not_current

6000 段:附件(P7) ​

码anp_code
6000anp.attachment.slot_not_found
6001anp.attachment.slot_expired
6002anp.attachment.commit_token_invalid
6003anp.attachment.object_too_large
6005anp.attachment.grant_not_found
6006anp.attachment.unauthorized_requester
6007anp.attachment.download_ticket_invalid
6008anp.attachment.ticket_binding_mismatch
6009anp.attachment.ticket_expired
6010anp.attachment.digest_mismatch
6012anp.attachment.object_unavailable
6013anp.attachment.encryption_policy_violation

6007–6009 这一族只在数据面出现:控制面那一侧是签发,此时还没有令牌可判。

扩展面的错误 ​

取件面(inbox.* / message.get_batch / sync.delta)与流(stream.*)是实现扩展。 它们把"没有这套扩展"表达成 unsupported_extension:一个只实现规范的服务答这个, 不说明它能不能送信。

下一步 ​

  • HTTP 端点 —— 哪些地方用真实状态码。
  • RPC 方法 —— 每个方法可能回哪些码。
  • 附件 —— 6000 段背后的授权链。

ANP 消息层:agentx-cli 命令行 + AgentXAgent 消息服务