ErrorTable.java

// Generated by tools/gen-errors.mjs from spec/errors.json version 2026-10-08. Do not edit.
package com.shengzhiai.yugu.errors;

import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.Map;

/** Error, warning and local code tables. */
public final class ErrorTable {
    /** One table row. */
    public static final class Entry {
        public final int code;
        public final String name;
        public final String category;
        public final boolean retryable;
        public final int http;
        public final String message;

        Entry(int code, String name, String category, boolean retryable, int http, String message) {
            this.code = code;
            this.name = name;
            this.category = category;
            this.retryable = retryable;
            this.http = http;
            this.message = message;
        }
    }

    public static final Map<Integer, Entry> ERRORS;
    public static final Map<Integer, Entry> WARNINGS;
    public static final Map<Integer, Entry> LOCAL;
    public static final Map<Integer, String> HTTP_FALLBACK;
    public static final int[] RETRYABLE_HTTP = {408, 425, 429, 500, 502, 503, 504};

    private static Map<Integer, Entry> errors;
    private static Map<Integer, Entry> warnings;
    private static Map<Integer, Entry> local;

    private static void put(int kind, int code, String name, String category, boolean retryable, int http, String message) {
        Map<Integer, Entry> m = kind == 0 ? errors : kind == 1 ? warnings : local;
        m.put(code, new Entry(code, name, category, retryable, http, message));
    }

    static {
        errors = new LinkedHashMap<>();
        warnings = new LinkedHashMap<>();
        local = new LinkedHashMap<>();
        put(0, 40001, "VALIDATION_ERROR", "INVALID_PARAM", false, 400, "请求参数校验失败");
        put(0, 40100, "UNAUTHORIZED", "AUTH", false, 401, "未认证,缺少或无效的凭据");
        put(0, 40300, "FORBIDDEN", "PERMISSION", false, 403, "无权限,例如 API Key 未授权该 coreType");
        put(0, 40400, "NOT_FOUND", "NOT_FOUND", false, 404, "资源不存在");
        put(0, 40900, "CONFLICT", "CONFLICT", false, 409, "资源冲突");
        put(0, 40901, "IDEMPOTENCY_IN_PROGRESS", "CONFLICT", true, 409, "同一幂等键的请求仍在处理中,稍后用同一个键重试");
        put(0, 40902, "QUOTA_INSUFFICIENT", "QUOTA", false, 409, "套餐额度和账户余额均不足");
        put(0, 40903, "IDEMPOTENCY_KEY_REUSED", "CONFLICT", false, 409, "幂等键已用于另一个不同的请求");
        put(0, 42900, "TOO_MANY_REQUESTS", "RATE_LIMIT", true, 429, "请求过多或评测排队超时,按 Retry-After 稍后重试");
        put(0, 42901, "CONCURRENCY_LIMIT", "RATE_LIMIT", true, 429, "并发评测数超出套餐层级限制");
        put(0, 42902, "TRIAL_REPORT_DAILY_LIMIT", "QUOTA", false, 429, "试用层 AI 报告达到每日上限");
        put(0, 42903, "SANDBOX_DAILY_LIMIT", "QUOTA", false, 429, "沙箱密钥当日调用次数达到上限");
        put(0, 50000, "INTERNAL_ERROR", "SERVER", true, 500, "服务器内部错误");
        put(0, 50010, "FEATURE_NOT_IMPLEMENTED", "SERVER", false, 500, "功能未实现");
        put(0, 50200, "UPSTREAM_SERVICE_ERROR", "UPSTREAM", true, 502, "上游评测服务暂不可用");
        put(0, 2001, "TOKEN_EXPIRED", "AUTH", false, 401, "token 已过期,兼容层早期引擎接口也用此码表示缺少鉴权三元组或签名不匹配");
        put(0, 2002, "TOKEN_INVALID", "AUTH", false, 401, "token 无效,兼容层早期引擎接口也用此码表示时间戳超窗");
        put(0, 2003, "SIGNATURE_VERIFICATION_FAILED", "AUTH", false, 401, "签名验证失败,兼容层早期引擎接口也用此码表示 appKey 不存在");
        put(0, 2004, "SESSION_EXPIRED", "AUTH", false, 401, "会话已过期");
        put(0, 2005, "TOKEN_BLACKLISTED", "AUTH", false, 401, "token 已被列入黑名单");
        put(0, 2006, "API_KEY_INVALID", "AUTH", false, 401, "API Key 无效");
        put(0, 2007, "API_KEY_EXPIRED", "AUTH", false, 401, "API Key 已过期");
        put(0, 2008, "TOKEN_METADATA_NOT_FOUND", "AUTH", false, 401, "token 元数据丢失");
        put(0, 2009, "TOKEN_REFRESH_FAILED", "AUTH", false, 401, "token 刷新失败");
        put(0, 2010, "API_KEY_NOT_FOUND", "AUTH", false, 401, "API Key 不存在");
        put(0, 2011, "API_KEY_DISABLED", "AUTH", false, 401, "API Key 已禁用");
        put(0, 2012, "API_KEY_QUOTA_EXCEEDED", "QUOTA", false, 400, "API Key 配额已超限");
        put(0, 3001, "RATE_LIMIT_EXCEEDED_IP", "RATE_LIMIT", true, 429, "请求过于频繁,按来源地址限流");
        put(0, 3002, "RATE_LIMIT_EXCEEDED_USER", "RATE_LIMIT", true, 429, "请求过于频繁,按用户限流");
        put(0, 3003, "RATE_LIMIT_EXCEEDED_API_KEY", "RATE_LIMIT", true, 429, "请求过于频繁,按 API Key 限流");
        put(0, 1004, "USER_DISABLED", "PERMISSION", false, 400, "用户已禁用");
        put(0, 1005, "USER_LOCKED", "PERMISSION", false, 400, "用户已锁定");
        put(0, 1012, "ACCOUNT_DISABLED", "PERMISSION", false, 400, "账户已禁用");
        put(0, 1013, "ACCOUNT_FROZEN", "PERMISSION", false, 400, "账户已冻结");
        put(0, 1310, "ACCOUNT_BALANCE_INSUFFICIENT", "QUOTA", false, 400, "账户余额不足");
        put(0, 1311, "ACCOUNT_LEDGER_CONFLICT", "CONFLICT", true, 400, "账目并发冲突,重试即可");
        put(1, 1001, "NO_VALID_AUDIO", "AUDIO", false, 0, "No valid audio detected!");
        put(1, 1002, "VOLUME_TOO_LOW", "AUDIO", false, 0, "Audio volume too low!");
        put(1, 1003, "VOLUME_TOO_HIGH", "AUDIO", false, 0, "Audio volume too high!");
        put(1, 1004, "AUDIO_NOISY", "AUDIO", false, 0, "Audio noisy!");
        put(1, 1005, "AUDIO_INCOMPLETE", "AUDIO", false, 0, "Audio not complete!");
        put(1, 1009, "SCORER_DEGRADED", "AUDIO", true, 0, "scorer degraded");
        put(2, 90001, "NETWORK_ERROR", "NETWORK", true, 0, "网络错误,连接失败或被重置");
        put(2, 90002, "TIMEOUT", "TIMEOUT", true, 0, "连接或读取超时");
        put(2, 90003, "CANCELLED", "CANCELLED", false, 0, "调用方取消了请求");
        put(2, 90004, "CLIENT_CLOSED", "STATE", false, 0, "客户端已关闭");
        put(2, 90005, "PROTOCOL_ERROR", "PROTOCOL", false, 0, "响应或帧无法解析");
        put(2, 90006, "RECONNECT_EXHAUSTED", "NETWORK", false, 0, "实时连接重连次数用尽");
        put(2, 90007, "RESULT_TIMEOUT", "TIMEOUT", true, 0, "结束后等待终评结果超时");
        put(2, 90008, "REPLAY_BUFFER_OVERFLOW", "STATE", false, 0, "重连重放缓冲超过上限");
        put(2, 90009, "INVALID_STATE", "STATE", false, 0, "当前会话状态不允许该操作");
        put(2, 90010, "INVALID_ARGUMENT", "INVALID_PARAM", false, 0, "调用参数不合法");
        put(2, 90011, "TLS_ERROR", "NETWORK", false, 0, "证书校验失败");
        put(2, 90101, "AUDIO_TOO_SHORT", "AUDIO", false, 0, "音频短于 1 秒");
        put(2, 90102, "AUDIO_TOO_LONG", "AUDIO", false, 0, "音频长于 300 秒,整段上传大于 50 MB,或实时评测一轮大于 10 MB");
        put(2, 90103, "AUDIO_SILENT", "AUDIO", false, 0, "音频全程静音");
        put(2, 90104, "AUDIO_LOW_VOLUME", "AUDIO", false, 0, "音量过低");
        put(2, 90105, "AUDIO_FORMAT_UNSUPPORTED", "AUDIO", false, 0, "不是 16 位 PCM 或采样率低于 16000");
        put(2, 90201, "RECORDER_PERMISSION_DENIED", "PERMISSION", false, 0, "没有麦克风权限");
        put(2, 90202, "RECORDER_UNAVAILABLE", "STATE", false, 0, "麦克风被占用或不可用");
        put(2, 90203, "RECORDER_ERROR", "STATE", false, 0, "录音过程出错");
        Map<Integer, String> hf = new LinkedHashMap<>();
        hf.put(400, "INVALID_PARAM");
        hf.put(401, "AUTH");
        hf.put(403, "PERMISSION");
        hf.put(404, "NOT_FOUND");
        hf.put(405, "INVALID_PARAM");
        hf.put(408, "TIMEOUT");
        hf.put(409, "CONFLICT");
        hf.put(413, "INVALID_PARAM");
        hf.put(415, "INVALID_PARAM");
        hf.put(422, "INVALID_PARAM");
        hf.put(425, "RATE_LIMIT");
        hf.put(429, "RATE_LIMIT");
        hf.put(500, "SERVER");
        hf.put(501, "SERVER");
        hf.put(502, "UPSTREAM");
        hf.put(503, "UPSTREAM");
        hf.put(504, "UPSTREAM");
        ERRORS = Collections.unmodifiableMap(errors);
        WARNINGS = Collections.unmodifiableMap(warnings);
        LOCAL = Collections.unmodifiableMap(local);
        HTTP_FALLBACK = Collections.unmodifiableMap(hf);
    }

    public static final int VALIDATION_ERROR = 40001;
    public static final int UNAUTHORIZED = 40100;
    public static final int FORBIDDEN = 40300;
    public static final int NOT_FOUND = 40400;
    public static final int CONFLICT = 40900;
    public static final int IDEMPOTENCY_IN_PROGRESS = 40901;
    public static final int QUOTA_INSUFFICIENT = 40902;
    public static final int IDEMPOTENCY_KEY_REUSED = 40903;
    public static final int TOO_MANY_REQUESTS = 42900;
    public static final int CONCURRENCY_LIMIT = 42901;
    public static final int TRIAL_REPORT_DAILY_LIMIT = 42902;
    public static final int SANDBOX_DAILY_LIMIT = 42903;
    public static final int INTERNAL_ERROR = 50000;
    public static final int FEATURE_NOT_IMPLEMENTED = 50010;
    public static final int UPSTREAM_SERVICE_ERROR = 50200;
    public static final int TOKEN_EXPIRED = 2001;
    public static final int TOKEN_INVALID = 2002;
    public static final int SIGNATURE_VERIFICATION_FAILED = 2003;
    public static final int SESSION_EXPIRED = 2004;
    public static final int TOKEN_BLACKLISTED = 2005;
    public static final int API_KEY_INVALID = 2006;
    public static final int API_KEY_EXPIRED = 2007;
    public static final int TOKEN_METADATA_NOT_FOUND = 2008;
    public static final int TOKEN_REFRESH_FAILED = 2009;
    public static final int API_KEY_NOT_FOUND = 2010;
    public static final int API_KEY_DISABLED = 2011;
    public static final int API_KEY_QUOTA_EXCEEDED = 2012;
    public static final int RATE_LIMIT_EXCEEDED_IP = 3001;
    public static final int RATE_LIMIT_EXCEEDED_USER = 3002;
    public static final int RATE_LIMIT_EXCEEDED_API_KEY = 3003;
    public static final int USER_DISABLED = 1004;
    public static final int USER_LOCKED = 1005;
    public static final int ACCOUNT_DISABLED = 1012;
    public static final int ACCOUNT_FROZEN = 1013;
    public static final int ACCOUNT_BALANCE_INSUFFICIENT = 1310;
    public static final int ACCOUNT_LEDGER_CONFLICT = 1311;
    public static final int W_NO_VALID_AUDIO = 1001;
    public static final int W_VOLUME_TOO_LOW = 1002;
    public static final int W_VOLUME_TOO_HIGH = 1003;
    public static final int W_AUDIO_NOISY = 1004;
    public static final int W_AUDIO_INCOMPLETE = 1005;
    public static final int W_SCORER_DEGRADED = 1009;
    public static final int NETWORK_ERROR = 90001;
    public static final int TIMEOUT = 90002;
    public static final int CANCELLED = 90003;
    public static final int CLIENT_CLOSED = 90004;
    public static final int PROTOCOL_ERROR = 90005;
    public static final int RECONNECT_EXHAUSTED = 90006;
    public static final int RESULT_TIMEOUT = 90007;
    public static final int REPLAY_BUFFER_OVERFLOW = 90008;
    public static final int INVALID_STATE = 90009;
    public static final int INVALID_ARGUMENT = 90010;
    public static final int TLS_ERROR = 90011;
    public static final int AUDIO_TOO_SHORT = 90101;
    public static final int AUDIO_TOO_LONG = 90102;
    public static final int AUDIO_SILENT = 90103;
    public static final int AUDIO_LOW_VOLUME = 90104;
    public static final int AUDIO_FORMAT_UNSUPPORTED = 90105;
    public static final int RECORDER_PERMISSION_DENIED = 90201;
    public static final int RECORDER_UNAVAILABLE = 90202;
    public static final int RECORDER_ERROR = 90203;

    private ErrorTable() {
    }
}