errors.js 1.36 KB
/**
 * 结构化审核错误(§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
  }
}