{"version":3,"file":"validation.cjs","names":[],"sources":["../../../../src/batteries/generation/openai/validation.ts"],"sourcesContent":["/**\n * Runtime validation schema and wrapper for OpenAI media generation adapter options.\n *\n * @module @nhtio/adk/batteries/generation/openai/validation\n *\n * @remarks\n * Validates `OpenAIGenerationAdapterOptions` at construction time. Throws\n * `E_INVALID_OPENAI_GENERATION_OPTIONS` on failure — the same hard-fail policy as every other ADK\n * contract. `model` is required; unknown top-level keys are rejected so typos fail loud.\n */\n\nimport { isError } from '@nhtio/adk/guards'\nimport { validator, ValidationError } from '@nhtio/validation'\nimport { E_INVALID_OPENAI_GENERATION_OPTIONS } from './exceptions'\nimport type { OpenAIGenerationAdapterOptions } from './types'\n\nconst retrySchema = validator\n  .object({\n    maxAttempts: validator.number().integer().min(1).default(1),\n    baseDelayMs: validator.number().integer().min(0).default(500),\n    maxDelayMs: validator.number().integer().min(1).default(30_000),\n    retriableStatuses: validator\n      .array()\n      .items(validator.number().integer().min(100).max(599))\n      .default([429, 500, 502, 503, 504]),\n    honorRetryAfter: validator.boolean().default(true),\n  })\n  .unknown(false)\n\n/**\n * Validator schema for `OpenAIGenerationAdapterOptions`. Rejects unknown top-level keys.\n */\nexport const openAIGenerationOptionsSchema = validator\n  .object<OpenAIGenerationAdapterOptions>({\n    // Shared base\n    model: validator.string().min(1).required(),\n    // HTTP transport\n    apiKey: validator.string().optional(),\n    baseURL: validator.string().optional(),\n    headers: validator.object().pattern(validator.string(), validator.string()).optional(),\n    fetch: validator.function().optional(),\n    retry: retrySchema.optional(),\n    requestTimeoutMs: validator.number().integer().min(0).default(0),\n    // OpenAI image-generation knobs\n    size: validator.string().optional(),\n    quality: validator.string().valid('low', 'medium', 'high', 'auto').optional(),\n    outputFormat: validator.string().valid('png', 'jpeg', 'webp').optional(),\n    background: validator.string().valid('transparent', 'opaque', 'auto').optional(),\n    responseFormatMode: validator.string().valid('auto', 'send', 'omit').default('auto'),\n  })\n  .unknown(false)\n\nconst formatValidationDetails = (err: ValidationError): string =>\n  err.details.map((d) => d.message).join(' and ')\n\n/**\n * Validates an arbitrary input against `openAIGenerationOptionsSchema` and returns the resolved\n * options shape. Throws `E_INVALID_OPENAI_GENERATION_OPTIONS` (carrying the validator's report on\n * `cause`) on failure.\n *\n * @param input - The raw options object to validate.\n * @returns The resolved options object with defaults filled in.\n */\nexport const validateOptions = (input: unknown): OpenAIGenerationAdapterOptions => {\n  const { value, error } = openAIGenerationOptionsSchema.validate(input, {\n    abortEarly: false,\n    convert: false,\n  })\n  if (error) {\n    throw new E_INVALID_OPENAI_GENERATION_OPTIONS([formatValidationDetails(error)], {\n      cause: error,\n    })\n  }\n  return value as OpenAIGenerationAdapterOptions\n}\n\nconst isValidationError = (value: unknown): value is ValidationError =>\n  isError(value) && Array.isArray((value as ValidationError).details)\n\nvoid isValidationError\n"],"mappings":";;;;;;AAgBA,IAAM,cAAc,kBAAA,UACjB,OAAO;CACN,aAAa,kBAAA,UAAU,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,QAAQ,CAAC;CAC1D,aAAa,kBAAA,UAAU,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,QAAQ,GAAG;CAC5D,YAAY,kBAAA,UAAU,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,QAAQ,GAAM;CAC9D,mBAAmB,kBAAA,UAChB,MAAM,EACN,MAAM,kBAAA,UAAU,OAAO,EAAE,QAAQ,EAAE,IAAI,GAAG,EAAE,IAAI,GAAG,CAAC,EACpD,QAAQ;EAAC;EAAK;EAAK;EAAK;EAAK;CAAG,CAAC;CACpC,iBAAiB,kBAAA,UAAU,QAAQ,EAAE,QAAQ,IAAI;AACnD,CAAC,EACA,QAAQ,KAAK;;;;AAKhB,IAAa,gCAAgC,kBAAA,UAC1C,OAAuC;CAEtC,OAAO,kBAAA,UAAU,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;CAE1C,QAAQ,kBAAA,UAAU,OAAO,EAAE,SAAS;CACpC,SAAS,kBAAA,UAAU,OAAO,EAAE,SAAS;CACrC,SAAS,kBAAA,UAAU,OAAO,EAAE,QAAQ,kBAAA,UAAU,OAAO,GAAG,kBAAA,UAAU,OAAO,CAAC,EAAE,SAAS;CACrF,OAAO,kBAAA,UAAU,SAAS,EAAE,SAAS;CACrC,OAAO,YAAY,SAAS;CAC5B,kBAAkB,kBAAA,UAAU,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,QAAQ,CAAC;CAE/D,MAAM,kBAAA,UAAU,OAAO,EAAE,SAAS;CAClC,SAAS,kBAAA,UAAU,OAAO,EAAE,MAAM,OAAO,UAAU,QAAQ,MAAM,EAAE,SAAS;CAC5E,cAAc,kBAAA,UAAU,OAAO,EAAE,MAAM,OAAO,QAAQ,MAAM,EAAE,SAAS;CACvE,YAAY,kBAAA,UAAU,OAAO,EAAE,MAAM,eAAe,UAAU,MAAM,EAAE,SAAS;CAC/E,oBAAoB,kBAAA,UAAU,OAAO,EAAE,MAAM,QAAQ,QAAQ,MAAM,EAAE,QAAQ,MAAM;AACrF,CAAC,EACA,QAAQ,KAAK;AAEhB,IAAM,2BAA2B,QAC/B,IAAI,QAAQ,KAAK,MAAM,EAAE,OAAO,EAAE,KAAK,OAAO;;;;;;;;;AAUhD,IAAa,mBAAmB,UAAmD;CACjF,MAAM,EAAE,OAAO,UAAU,8BAA8B,SAAS,OAAO;EACrE,YAAY;EACZ,SAAS;CACX,CAAC;CACD,IAAI,OACF,MAAM,IAAI,+CAAA,oCAAoC,CAAC,wBAAwB,KAAK,CAAC,GAAG,EAC9E,OAAO,MACT,CAAC;CAEH,OAAO;AACT"}