/** * 结构化审核错误(§3 契约)。装配自检失败、`llmGuardPort` 协议违约等场景抛它, * 绝不静默吞错。 * * 字段语义: * - `code`:失败原因的稳定枚举字符串(见 `ModerationErrorCode`),调用方据此分流, * 不依赖底层厂商内部码。 * - `retryable`:是否值得重试。装配错误 / 入参非法 = false;Port 临时不可用 / 网络抖动 * = true。调用方据此决定退避重试还是直接放弃。 * - `cause`:底层原始错误(如 `llmGuardPort.classify` 抛出的错误),保留链路。 */ /** * 失败原因枚举(稳定字符串)。 * @readonly */ export const ModerationErrorCode = Object.freeze({ MISSING_RULES: 'missing_rules', BAD_RULES: 'bad_rules', BAD_REQUEST: 'bad_request', GUARD_PORT_FAILED: 'guard_port_failed', GUARD_PORT_BAD_SHAPE: 'guard_port_bad_shape', UNKNOWN: 'unknown', }) export class ModerationError extends Error { /** * @param {object} info * @param {string} info.code * @param {boolean} [info.retryable] * @param {unknown} [info.cause] * @param {string} [info.message] */ constructor({ code, retryable, cause, message }) { super(message || `[moderation] ${code}`) this.name = 'ModerationError' this.code = code this.retryable = Boolean(retryable) if (cause !== undefined) this.cause = cause } }