{"version":3,"file":"validation.cjs","names":[],"sources":["../../../../src/batteries/llm/anthropic_messages/validation.ts"],"sourcesContent":["/**\n * Runtime validation schema and wrapper for Anthropic Messages adapter options.\n *\n * @module @nhtio/adk/batteries/llm/anthropic_messages/validation\n *\n * @remarks\n * Schema and call-site wrapper for validating `AnthropicMessagesAdapterOptions`. Used at\n * construction time and at the start of every iteration against the merged options shape. Throws\n * `E_INVALID_ANTHROPIC_MESSAGES_OPTIONS` on failure, matching the hard-fail policy of the sibling\n * HTTP batteries.\n *\n * Note the deliberate `.unknown(...)` asymmetry: the top level is `.unknown(false)` so option typos\n * fail loud, but provider-owned passthrough blocks are `.unknown(true)` so SDK-supported additions\n * can pass through without a library bump.\n */\n\nimport { validator, ValidationError } from '@nhtio/validation'\nimport { byteStoreSchema, TokenEncoding } from '@nhtio/adk/common'\nimport { E_INVALID_ANTHROPIC_MESSAGES_OPTIONS } from './exceptions'\nimport type { AnthropicMessagesAdapterOptions } from './types'\n\n// ─── Sub-schemas ──────────────────────────────────────────────────────────────\n\nconst providerObjectSchema = validator.object().unknown(true)\n\nconst bucketLabelSchema = validator\n  .string()\n  .valid('standingInstructions', 'memories', 'retrievables', 'timeline')\n\nconst bucketOrderSchema = validator\n  .array()\n  .items(bucketLabelSchema)\n  .unique()\n  .default(['standingInstructions', 'memories', 'retrievables', 'timeline'])\n\nconst tokenEncodingSchema = validator\n  .alternatives(\n    // Known values are suggestions from the canonical list, not a whitelist: consumers may provide\n    // a custom or newer tokenizer name. The field accepts any non-empty string, explicit null, or\n    // absent (undefined = \"no token counting\"). `.optional()` preserves the null/undefined\n    // disposition required by adk/require-validator-any-required.\n    validator\n      .string()\n      .min(1)\n      .description(`Known encodings: ${TokenEncoding.join(', ')}`),\n    validator.any().valid(null).optional()\n  )\n  .default(null)\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, 502, 503, 504, 529]),\n    honorRetryAfter: validator.boolean().default(true),\n  })\n  .unknown(false)\n\nconst localToolCallParserSchema = validator\n  .alternatives(\n    validator\n      .string()\n      .valid(\n        'auto',\n        'hermes',\n        'gemma',\n        'gpt_oss',\n        'pythonic',\n        'bare_pythonic',\n        'loose_keyed',\n        'llama3_json',\n        'mistral',\n        'qwen3_coder',\n        'phi',\n        'none'\n      ),\n    validator.function()\n  )\n  .optional()\n\nconst helperSchema = validator.function()\n\nconst helpersSchema = validator\n  .object({\n    descriptionToChatCompletionsJsonSchema: helperSchema.optional(),\n    renderUntrustedContent: helperSchema.optional(),\n    renderTrustedContent: helperSchema.optional(),\n    renderStandingInstructions: helperSchema.optional(),\n    renderMemories: helperSchema.optional(),\n    renderRetrievables: helperSchema.optional(),\n    renderRetrievableHandleBody: helperSchema.optional(),\n    renderRetrievableSafetyDirective: helperSchema.optional(),\n    renderFirstPartyRetrievables: helperSchema.optional(),\n    renderThirdPartyPublicRetrievables: helperSchema.optional(),\n    renderThirdPartyPrivateRetrievables: helperSchema.optional(),\n    renderThought: helperSchema.optional(),\n    filterThoughts: helperSchema.optional(),\n    toolsToChatCompletionsTools: helperSchema.optional(),\n    renderChatCompletionsSystemPrompt: helperSchema.optional(),\n    anthropicToolsFromTools: helperSchema.optional(),\n    renderAnthropicTimelineMessage: helperSchema.optional(),\n    renderAnthropicMediaBlocks: helperSchema.optional(),\n    renderAnthropicToolCallResult: helperSchema.optional(),\n    renderAnthropicSegmentedSystemPrompt: helperSchema.optional(),\n    renderAnthropicThinkingBlocks: helperSchema.optional(),\n    buildAnthropicMessagesHistory: helperSchema.optional(),\n  })\n  .unknown(false)\n\nconst unsupportedMediaPolicySchema = validator\n  .alternatives(\n    validator.string().valid('throw', 'fallback-stash', 'synthetic-description'),\n    validator\n      .object({\n        mode: validator.string().valid('fallback-stash').required(),\n        stashKeys: validator.array().items(validator.string().min(1)).required(),\n      })\n      .unknown(false)\n  )\n  .default('throw')\n\nconst thinkingSchema = validator\n  .alternatives(\n    validator\n      .object({\n        type: validator.string().valid('enabled').required(),\n        // The wire requires at least 1024 (SDK: \"Must be 1024 or more and less than max_tokens\").\n        // Rejecting a smaller value here is not request repair — it is refusing to send a request the\n        // API is guaranteed to reject, with a validation error the caller can act on instead of a 400.\n        budget_tokens: validator.number().integer().min(1024).required(),\n        display: validator.string().valid('summarized', 'omitted').allow(null).optional(),\n      })\n      .unknown(true),\n    validator\n      .object({\n        type: validator.string().valid('disabled').required(),\n      })\n      .unknown(true),\n    validator\n      .object({\n        type: validator.string().valid('adaptive').required(),\n        display: validator.string().valid('summarized', 'omitted').allow(null).optional(),\n      })\n      .unknown(true)\n  )\n  .optional()\n\nconst toolChoiceSchema = validator\n  .alternatives(\n    validator\n      .object({\n        type: validator.string().valid('auto').required(),\n        disable_parallel_tool_use: validator.boolean().optional(),\n      })\n      .unknown(true),\n    validator\n      .object({\n        type: validator.string().valid('any').required(),\n        disable_parallel_tool_use: validator.boolean().optional(),\n      })\n      .unknown(true),\n    validator\n      .object({\n        type: validator.string().valid('tool').required(),\n        name: validator.string().min(1).required(),\n        disable_parallel_tool_use: validator.boolean().optional(),\n      })\n      .unknown(true),\n    validator\n      .object({\n        type: validator.string().valid('none').required(),\n      })\n      .unknown(true)\n  )\n  .optional()\n\nconst outputConfigSchema = validator\n  .object({\n    effort: validator\n      .string()\n      .valid('low', 'medium', 'high', 'xhigh', 'max')\n      .allow(null)\n      .optional(),\n    format: providerObjectSchema.allow(null).optional(),\n  })\n  .unknown(true)\n\nconst headersSchema = validator.object().pattern(validator.string(), validator.string())\n\n// ─── Top-level schema ─────────────────────────────────────────────────────────\n\n/**\n * Validator schema for `AnthropicMessagesAdapterOptions`. Used by `validateOptions` at construction\n * time and again at the start of every iteration after options have been merged. Rejects unknown\n * top-level keys so typos fail loud.\n */\nexport const anthropicMessagesOptionsSchema = validator\n  .object<AnthropicMessagesAdapterOptions>({\n    // ADK control and HTTP transport\n    apiKey: validator.string().optional(),\n    baseURL: validator.string().optional(),\n    headers: headersSchema.optional(),\n    fetch: validator.function().optional(),\n    stream: validator.boolean().default(true),\n    streamIdleTimeoutMs: validator.number().integer().min(0).default(0),\n    requestTimeoutMs: validator.number().integer().min(0).default(0),\n    retry: retrySchema.default({}),\n    // Consumer hook; validated as a function only. Its RETURN value is range-checked at call time\n    // in error_translation.ts, because a schema cannot police what a function does at runtime.\n    resolveErrorStatus: validator.function().optional(),\n    bucketOrder: bucketOrderSchema,\n    contextWindow: validator.number().integer().min(1).optional(),\n    selfIdentity: validator.string().min(1).default('assistant'),\n    thoughtSurfacing: validator\n      .string()\n      .valid('all-self', 'latest-self', 'all')\n      .default('all-self'),\n    tokenEncoding: tokenEncodingSchema,\n    replayCompatibility: validator.array().items(validator.string().min(1)).default([]),\n    helpers: helpersSchema.optional(),\n    spoolStore: byteStoreSchema.optional(),\n    autoAck: validator.boolean().default(false),\n    unsupportedMediaPolicy: unsupportedMediaPolicySchema,\n\n    // Anthropic Messages request surface\n    model: validator.string().required(),\n    maxTokens: validator.number().integer().min(0).required(),\n    stopSequences: validator.array().items(validator.string()).optional(),\n    thinking: thinkingSchema,\n    outputConfig: outputConfigSchema.optional(),\n    toolChoice: toolChoiceSchema,\n    dangerouslyAllowBrowser: validator.boolean().default(false),\n    cacheBreakpoints: validator.string().valid('auto', 'system-only', 'off').default('auto'),\n    cacheTtl: validator.string().valid('5m', '1h').optional(),\n    metadata: providerObjectSchema.optional(),\n    serviceTier: validator.string().valid('auto', 'standard_only').optional(),\n    container: validator\n      .alternatives(validator.string(), validator.any().valid(null).optional())\n      .optional(),\n    inferenceGeo: validator\n      .alternatives(validator.string(), validator.any().valid(null).optional())\n      .optional(),\n    userProfileId: validator.string().optional(),\n    // Deprecated sampling parameters are intentionally optional and never defaulted.\n    temperature: validator.number().optional(),\n    topP: validator.number().optional(),\n    topK: validator.number().optional(),\n    onRawGeneration: validator.function().optional(),\n    onPromptAssembled: validator.function().optional(),\n    localToolCallParser: localToolCallParserSchema,\n    toolCallIdFilter: validator.function().optional(),\n  })\n  .unknown(false)\n\nconst formatValidationDetails = (err: ValidationError): string =>\n  err.details.map((d) => d.message).join(' and ')\n\n/**\n * Validates arbitrary input against `anthropicMessagesOptionsSchema` and returns resolved options.\n * Throws `E_INVALID_ANTHROPIC_MESSAGES_OPTIONS` with validator details 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): AnthropicMessagesAdapterOptions => {\n  const { value, error } = anthropicMessagesOptionsSchema.validate(input, {\n    abortEarly: false,\n    convert: false,\n  })\n  if (error) {\n    throw new E_INVALID_ANTHROPIC_MESSAGES_OPTIONS([formatValidationDetails(error)], {\n      cause: error,\n    })\n  }\n  return value as AnthropicMessagesAdapterOptions\n}\n"],"mappings":"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"}