{"version":3,"sources":["../src/ai-sdk.ts","../src/provider-core.ts","../src/normalize.ts"],"sourcesContent":["import { normalize } from \"./normalize.js\";\nimport type { NormalizeOptions, NormalizeResult } from \"./normalize.js\";\nimport type { LlmConnectionConfig } from \"./parse.js\";\nimport type { Provider } from \"./provider-core.js\";\n\nexport type AiSdkProviderOptions = Record<string, Record<string, unknown>>;\n\nexport interface AiSdkProviderOptionsResult {\n  provider: Provider | undefined;\n  subProvider: Provider | undefined;\n  providerOptions: AiSdkProviderOptions;\n}\n\nexport interface AiSdkProviderOptionsOptions extends NormalizeOptions {\n  /**\n   * Include Vercel AI Gateway routing options under `providerOptions.gateway`.\n   * Defaults to true for `vercel` hosts.\n   */\n  includeGatewayOptions?: boolean;\n}\n\ntype ProviderOptionsKey = Provider | \"gateway\";\n\nconst PROVIDER_OPTION_KEYS: Record<Provider, ProviderOptionsKey> = {\n  openai: \"openai\",\n  anthropic: \"anthropic\",\n  google: \"google\",\n  mistral: \"mistral\",\n  cohere: \"cohere\",\n  bedrock: \"bedrock\",\n  openrouter: \"openrouter\",\n  vercel: \"gateway\",\n};\n\nconst TRUE_VALUES = new Set([\"true\", \"1\", \"yes\", \"on\"]);\nconst FALSE_VALUES = new Set([\"false\", \"0\", \"no\", \"off\"]);\n\nfunction providerOptionsKey(provider: Provider): ProviderOptionsKey {\n  return PROVIDER_OPTION_KEYS[provider];\n}\n\nfunction setProviderOption(\n  options: AiSdkProviderOptions,\n  provider: ProviderOptionsKey,\n  key: string,\n  value: unknown,\n): void {\n  options[provider] ??= {};\n  options[provider][key] = value;\n}\n\nfunction parseBoolean(value: string): boolean | undefined {\n  const normalized = value.trim().toLowerCase();\n  if (TRUE_VALUES.has(normalized)) return true;\n  if (FALSE_VALUES.has(normalized)) return false;\n  return undefined;\n}\n\nfunction parseNumber(value: string): number | undefined {\n  if (!value.trim()) return undefined;\n  const parsed = Number(value);\n  return Number.isFinite(parsed) ? parsed : undefined;\n}\n\nfunction parseJson(value: string): unknown {\n  try {\n    return JSON.parse(value) as unknown;\n  } catch {\n    return undefined;\n  }\n}\n\nfunction parseStringList(value: string): string[] {\n  const json = parseJson(value);\n  if (Array.isArray(json)) {\n    return json.filter((item): item is string => typeof item === \"string\");\n  }\n  return value\n    .split(\",\")\n    .map((item) => item.trim())\n    .filter(Boolean);\n}\n\nfunction typedValue(value: string): unknown {\n  const booleanValue = parseBoolean(value);\n  if (booleanValue !== undefined) return booleanValue;\n\n  const numberValue = parseNumber(value);\n  if (numberValue !== undefined) return numberValue;\n\n  const jsonValue = parseJson(value);\n  if (jsonValue !== undefined) return jsonValue;\n\n  return value;\n}\n\nfunction mergeObjectOption(\n  options: AiSdkProviderOptions,\n  provider: ProviderOptionsKey,\n  key: string,\n  value: string,\n): void {\n  const parsed = parseJson(value);\n  if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n    setProviderOption(options, provider, key, parsed);\n  }\n}\n\nfunction addOpenAiOption(\n  options: AiSdkProviderOptions,\n  key: string,\n  value: string,\n): void {\n  const target: ProviderOptionsKey = \"openai\";\n  const mappings: Record<string, string> = {\n    reasoning_effort: \"reasoningEffort\",\n    max_completion_tokens: \"maxCompletionTokens\",\n    parallel_tool_calls: \"parallelToolCalls\",\n    service_tier: \"serviceTier\",\n    strict_json_schema: \"strictJsonSchema\",\n    text_verbosity: \"textVerbosity\",\n    prompt_cache_key: \"promptCacheKey\",\n    prompt_cache_retention: \"promptCacheRetention\",\n    safety_identifier: \"safetyIdentifier\",\n    system_message_mode: \"systemMessageMode\",\n    force_reasoning: \"forceReasoning\",\n    reasoning_summary: \"reasoningSummary\",\n    previous_response_id: \"previousResponseId\",\n    max_tool_calls: \"maxToolCalls\",\n    allowed_tools: \"allowedTools\",\n  };\n  const directKeys = new Set([\n    \"conversation\",\n    \"instructions\",\n    \"logprobs\",\n    \"metadata\",\n    \"prediction\",\n    \"store\",\n    \"truncation\",\n    \"user\",\n  ]);\n  if (!mappings[key] && !directKeys.has(key) && key !== \"include\") return;\n  const optionKey = mappings[key] ?? key;\n\n  if (key === \"include\") {\n    setProviderOption(options, target, optionKey, parseStringList(value));\n    return;\n  }\n\n  if (key === \"metadata\" || key === \"prediction\" || key === \"allowed_tools\") {\n    mergeObjectOption(options, target, optionKey, value);\n    return;\n  }\n\n  setProviderOption(options, target, optionKey, typedValue(value));\n}\n\nfunction addAnthropicOption(\n  options: AiSdkProviderOptions,\n  key: string,\n  value: string,\n): void {\n  const target: ProviderOptionsKey = \"anthropic\";\n\n  if (key === \"cache_control\" || key === \"cacheControl\") {\n    const ttl = options[target]?.cacheControl;\n    const ttlValue =\n      ttl && typeof ttl === \"object\" && \"ttl\" in ttl ? ttl.ttl : undefined;\n    setProviderOption(options, target, \"cacheControl\", {\n      type: value === \"ephemeral\" ? \"ephemeral\" : value,\n      ...(ttlValue ? { ttl: ttlValue } : {}),\n    });\n    return;\n  }\n\n  if (key === \"cache_ttl\") {\n    const current = options[target]?.cacheControl;\n    setProviderOption(options, target, \"cacheControl\", {\n      ...(current && typeof current === \"object\" ? current : {}),\n      type: \"ephemeral\",\n      ttl: value,\n    });\n    return;\n  }\n\n  if (key === \"thinking\") {\n    mergeObjectOption(options, target, \"thinking\", value);\n    return;\n  }\n\n  if (key === \"thinking_budget\" || key === \"budget_tokens\") {\n    const budgetTokens = parseNumber(value);\n    if (budgetTokens !== undefined) {\n      setProviderOption(options, target, \"thinking\", {\n        type: \"enabled\",\n        budgetTokens,\n      });\n    }\n    return;\n  }\n\n  const mappings: Record<string, string> = {\n    send_reasoning: \"sendReasoning\",\n    structured_output_mode: \"structuredOutputMode\",\n    disable_parallel_tool_use: \"disableParallelToolUse\",\n    tool_streaming: \"toolStreaming\",\n    inference_geo: \"inferenceGeo\",\n    anthropic_beta: \"anthropicBeta\",\n    mcp_servers: \"mcpServers\",\n    task_budget: \"taskBudget\",\n    context_management: \"contextManagement\",\n  };\n  const directKeys = new Set([\n    \"effort\",\n    \"speed\",\n    \"sendReasoning\",\n    \"structuredOutputMode\",\n    \"disableParallelToolUse\",\n    \"toolStreaming\",\n    \"inferenceGeo\",\n    \"anthropicBeta\",\n    \"metadata\",\n    \"mcpServers\",\n    \"container\",\n    \"taskBudget\",\n    \"contextManagement\",\n  ]);\n  if (!mappings[key] && !directKeys.has(key)) return;\n  const optionKey = mappings[key] ?? key;\n\n  if (key === \"anthropic_beta\") {\n    setProviderOption(options, target, optionKey, parseStringList(value));\n    return;\n  }\n\n  if (\n    key === \"metadata\" ||\n    key === \"mcp_servers\" ||\n    key === \"container\" ||\n    key === \"task_budget\" ||\n    key === \"context_management\"\n  ) {\n    mergeObjectOption(options, target, optionKey, value);\n    return;\n  }\n\n  setProviderOption(options, target, optionKey, typedValue(value));\n}\n\nfunction addGoogleOption(\n  options: AiSdkProviderOptions,\n  key: string,\n  value: string,\n): void {\n  const target: ProviderOptionsKey = \"google\";\n\n  if (\n    key === \"thinking_budget\" ||\n    key === \"thinking_level\" ||\n    key === \"include_thoughts\"\n  ) {\n    const current = options[target]?.thinkingConfig;\n    const thinkingConfig: Record<string, unknown> =\n      current && typeof current === \"object\" && !Array.isArray(current)\n        ? { ...current }\n        : {};\n    if (key === \"thinking_budget\") {\n      const parsed = parseNumber(value);\n      if (parsed !== undefined) thinkingConfig.thinkingBudget = parsed;\n    }\n    if (key === \"thinking_level\") thinkingConfig.thinkingLevel = value;\n    if (key === \"include_thoughts\") {\n      const parsed = parseBoolean(value);\n      if (parsed !== undefined) thinkingConfig.includeThoughts = parsed;\n    }\n    setProviderOption(options, target, \"thinkingConfig\", thinkingConfig);\n    return;\n  }\n\n  const mappings: Record<string, string> = {\n    cached_content: \"cachedContent\",\n    structured_outputs: \"structuredOutputs\",\n    safety_settings: \"safetySettings\",\n    response_modalities: \"responseModalities\",\n    audio_timestamp: \"audioTimestamp\",\n    media_resolution: \"mediaResolution\",\n    image_config: \"imageConfig\",\n    retrieval_config: \"retrievalConfig\",\n    stream_function_call_arguments: \"streamFunctionCallArguments\",\n    service_tier: \"serviceTier\",\n  };\n  const directKeys = new Set([\n    \"cachedContent\",\n    \"structuredOutputs\",\n    \"safetySettings\",\n    \"threshold\",\n    \"audioTimestamp\",\n    \"labels\",\n    \"mediaResolution\",\n    \"imageConfig\",\n    \"retrievalConfig\",\n    \"responseModalities\",\n    \"streamFunctionCallArguments\",\n    \"serviceTier\",\n  ]);\n  if (!mappings[key] && !directKeys.has(key)) return;\n  const optionKey = mappings[key] ?? key;\n\n  if (key === \"response_modalities\") {\n    setProviderOption(options, target, optionKey, parseStringList(value));\n    return;\n  }\n\n  if (\n    key === \"safety_settings\" ||\n    key === \"labels\" ||\n    key === \"image_config\" ||\n    key === \"retrieval_config\"\n  ) {\n    mergeObjectOption(options, target, optionKey, value);\n    return;\n  }\n\n  setProviderOption(options, target, optionKey, typedValue(value));\n}\n\nfunction addMistralOption(\n  options: AiSdkProviderOptions,\n  key: string,\n  value: string,\n): void {\n  const target: ProviderOptionsKey = \"mistral\";\n  const mappings: Record<string, string> = {\n    safe_prompt: \"safePrompt\",\n    document_image_limit: \"documentImageLimit\",\n    document_page_limit: \"documentPageLimit\",\n    structured_outputs: \"structuredOutputs\",\n    strict_json_schema: \"strictJsonSchema\",\n    parallel_tool_calls: \"parallelToolCalls\",\n    reasoning_effort: \"reasoningEffort\",\n  };\n  const directKeys = new Set([\n    \"safePrompt\",\n    \"documentImageLimit\",\n    \"documentPageLimit\",\n    \"structuredOutputs\",\n    \"strictJsonSchema\",\n    \"parallelToolCalls\",\n    \"reasoningEffort\",\n  ]);\n  if (!mappings[key] && !directKeys.has(key)) return;\n  const optionKey = mappings[key] ?? key;\n  setProviderOption(options, target, optionKey, typedValue(value));\n}\n\nfunction addCohereOption(\n  options: AiSdkProviderOptions,\n  key: string,\n  value: string,\n): void {\n  const target: ProviderOptionsKey = \"cohere\";\n\n  if (key === \"thinking\") {\n    mergeObjectOption(options, target, \"thinking\", value);\n    return;\n  }\n\n  if (key === \"thinking_token_budget\" || key === \"token_budget\") {\n    const tokenBudget = parseNumber(value);\n    if (tokenBudget !== undefined) {\n      setProviderOption(options, target, \"thinking\", {\n        type: \"enabled\",\n        tokenBudget,\n      });\n    }\n    return;\n  }\n\n  if (key === \"thinking_type\") {\n    const current = options[target]?.thinking;\n    setProviderOption(options, target, \"thinking\", {\n      ...(current && typeof current === \"object\" ? current : {}),\n      type: value,\n    });\n  }\n}\n\nfunction addBedrockOption(\n  options: AiSdkProviderOptions,\n  key: string,\n  value: string,\n): void {\n  const target: ProviderOptionsKey = \"bedrock\";\n\n  if (key === \"cache_control\") {\n    setProviderOption(options, target, \"cachePoint\", {\n      type: value === \"ephemeral\" ? \"default\" : value,\n    });\n    return;\n  }\n\n  if (key === \"cache_ttl\") {\n    const current = options[target]?.cachePoint;\n    setProviderOption(options, target, \"cachePoint\", {\n      ...(current && typeof current === \"object\" ? current : {}),\n      type: \"default\",\n      ttl: value,\n    });\n    return;\n  }\n\n  if (key === \"reasoning_config\") {\n    mergeObjectOption(options, target, \"reasoningConfig\", value);\n    return;\n  }\n\n  if (key === \"budget_tokens\" || key === \"reasoning_effort\") {\n    const current = options[target]?.reasoningConfig;\n    const reasoningConfig: Record<string, unknown> =\n      current && typeof current === \"object\" && !Array.isArray(current)\n        ? { ...current }\n        : {};\n    reasoningConfig.type = \"enabled\";\n    if (key === \"budget_tokens\") {\n      const budgetTokens = parseNumber(value);\n      if (budgetTokens !== undefined)\n        reasoningConfig.budgetTokens = budgetTokens;\n    }\n    if (key === \"reasoning_effort\") reasoningConfig.maxReasoningEffort = value;\n    setProviderOption(options, target, \"reasoningConfig\", reasoningConfig);\n    return;\n  }\n\n  const mappings: Record<string, string> = {\n    additional_model_request_fields: \"additionalModelRequestFields\",\n    anthropic_beta: \"anthropicBeta\",\n    service_tier: \"serviceTier\",\n  };\n  const directKeys = new Set([\n    \"additionalModelRequestFields\",\n    \"anthropicBeta\",\n    \"serviceTier\",\n  ]);\n  if (!mappings[key] && !directKeys.has(key)) return;\n  const optionKey = mappings[key] ?? key;\n\n  if (key === \"additional_model_request_fields\") {\n    mergeObjectOption(options, target, optionKey, value);\n    return;\n  }\n\n  if (key === \"anthropic_beta\") {\n    setProviderOption(options, target, optionKey, parseStringList(value));\n    return;\n  }\n\n  setProviderOption(options, target, optionKey, typedValue(value));\n}\n\nfunction addGatewayOption(\n  options: AiSdkProviderOptions,\n  key: string,\n  value: string,\n): void {\n  const target: ProviderOptionsKey = \"gateway\";\n  const listKeys = new Set([\"only\", \"order\", \"tags\", \"models\"]);\n  const objectKeys = new Set([\"byok\", \"provider_timeouts\"]);\n  const mappings: Record<string, string> = {\n    zero_data_retention: \"zeroDataRetention\",\n    disallow_prompt_training: \"disallowPromptTraining\",\n    hipaa_compliant: \"hipaaCompliant\",\n    quota_entity_id: \"quotaEntityId\",\n    provider_timeouts: \"providerTimeouts\",\n  };\n  const directKeys = new Set([\n    \"sort\",\n    \"user\",\n    \"zeroDataRetention\",\n    \"disallowPromptTraining\",\n    \"hipaaCompliant\",\n    \"quotaEntityId\",\n    \"providerTimeouts\",\n  ]);\n  if (\n    !mappings[key] &&\n    !directKeys.has(key) &&\n    !listKeys.has(key) &&\n    !objectKeys.has(key)\n  ) {\n    return;\n  }\n  const optionKey = mappings[key] ?? key;\n\n  if (listKeys.has(key)) {\n    setProviderOption(options, target, optionKey, parseStringList(value));\n    return;\n  }\n\n  if (objectKeys.has(key)) {\n    mergeObjectOption(options, target, optionKey, value);\n    return;\n  }\n\n  setProviderOption(options, target, optionKey, typedValue(value));\n}\n\nfunction addOpenRouterOption(\n  options: AiSdkProviderOptions,\n  key: string,\n  value: string,\n): void {\n  const target: ProviderOptionsKey = \"openrouter\";\n\n  if (key === \"models\") {\n    setProviderOption(options, target, \"models\", parseStringList(value));\n    return;\n  }\n\n  if (key === \"reasoning\") {\n    mergeObjectOption(options, target, \"reasoning\", value);\n    return;\n  }\n\n  if (key === \"reasoning_effort\") {\n    const current = options[target]?.reasoning;\n    setProviderOption(options, target, \"reasoning\", {\n      ...(current && typeof current === \"object\" ? current : {}),\n      effort: value,\n    });\n    return;\n  }\n\n  if (key === \"reasoning_max_tokens\" || key === \"max_reasoning_tokens\") {\n    const current = options[target]?.reasoning;\n    const maxTokens = parseNumber(value);\n    if (maxTokens !== undefined) {\n      setProviderOption(options, target, \"reasoning\", {\n        ...(current && typeof current === \"object\" ? current : {}),\n        max_tokens: maxTokens,\n      });\n    }\n    return;\n  }\n\n  if (key === \"reasoning_enabled\" || key === \"reasoning_exclude\") {\n    const current = options[target]?.reasoning;\n    const parsed = parseBoolean(value);\n    if (parsed !== undefined) {\n      setProviderOption(options, target, \"reasoning\", {\n        ...(current && typeof current === \"object\" ? current : {}),\n        [key === \"reasoning_enabled\" ? \"enabled\" : \"exclude\"]: parsed,\n      });\n    }\n    return;\n  }\n\n  if (key === \"user\") {\n    setProviderOption(options, target, \"user\", value);\n  }\n}\n\nfunction addProviderSpecificOption(\n  options: AiSdkProviderOptions,\n  provider: Provider,\n  key: string,\n  value: string,\n  includeGatewayOptions: boolean,\n): void {\n  if (provider === \"vercel\") {\n    if (includeGatewayOptions) addGatewayOption(options, key, value);\n    return;\n  }\n\n  if (provider === \"openai\") addOpenAiOption(options, key, value);\n  if (provider === \"anthropic\") addAnthropicOption(options, key, value);\n  if (provider === \"google\") addGoogleOption(options, key, value);\n  if (provider === \"mistral\") addMistralOption(options, key, value);\n  if (provider === \"cohere\") addCohereOption(options, key, value);\n  if (provider === \"bedrock\") addBedrockOption(options, key, value);\n  if (provider === \"openrouter\") addOpenRouterOption(options, key, value);\n}\n\n/**\n * Build AI SDK `providerOptions` from an LLM connection config.\n *\n * Common model call settings such as `temperature`, `topP`, and\n * `maxOutputTokens` are intentionally not emitted here. This helper only emits\n * provider-specific AI SDK options under the correct provider key.\n */\nexport function createAiSdkProviderOptions(\n  configOrResult: LlmConnectionConfig | NormalizeResult,\n  options: AiSdkProviderOptionsOptions = {},\n): AiSdkProviderOptionsResult {\n  const normalized =\n    \"changes\" in configOrResult && \"subProvider\" in configOrResult\n      ? configOrResult\n      : normalize(configOrResult, options);\n  const providerOptions: AiSdkProviderOptions = {};\n\n  if (!normalized.provider) {\n    return {\n      provider: normalized.provider,\n      subProvider: normalized.subProvider,\n      providerOptions,\n    };\n  }\n\n  const includeGatewayOptions =\n    options.includeGatewayOptions ?? normalized.provider === \"vercel\";\n\n  for (const [key, value] of Object.entries(normalized.config.params)) {\n    addProviderSpecificOption(\n      providerOptions,\n      normalized.provider,\n      key,\n      value,\n      includeGatewayOptions,\n    );\n  }\n\n  if (\n    normalized.provider !== \"vercel\" &&\n    !providerOptions[providerOptionsKey(normalized.provider)]\n  ) {\n    return {\n      provider: normalized.provider,\n      subProvider: normalized.subProvider,\n      providerOptions: {},\n    };\n  }\n\n  return {\n    provider: normalized.provider,\n    subProvider: normalized.subProvider,\n    providerOptions,\n  };\n}\n","export type Provider =\n  | \"openai\"\n  | \"anthropic\"\n  | \"google\"\n  | \"mistral\"\n  | \"cohere\"\n  | \"bedrock\"\n  | \"openrouter\"\n  | \"vercel\";\n\nexport type HostAlias =\n  | Provider\n  | \"aistudio\"\n  | \"alibaba\"\n  | \"alibabacloud\"\n  | \"atlascloud\"\n  | \"baidu\"\n  | \"dashscope\"\n  | \"deepinfra\"\n  | \"fireworks\"\n  | \"fireworksai\"\n  | \"grok\"\n  | \"minimax\"\n  | \"novita\"\n  | \"novitaai\"\n  | \"parasail\"\n  | \"qianfan\"\n  | \"vertex\"\n  | \"venice\"\n  | \"wandb\"\n  | \"weightsandbiases\"\n  | \"xai\"\n  | \"xiaomi\";\n\ntype Env = Record<string, string | undefined>;\n\ndeclare const process:\n  | {\n      env?: Env;\n    }\n  | undefined;\n\nfunction hasOwn<T extends object>(object: T, key: PropertyKey): key is keyof T {\n  return Object.prototype.hasOwnProperty.call(object, key);\n}\n\nexport const HOST_ALIASES: Record<HostAlias, string> = {\n  openai: \"api.openai.com\",\n  anthropic: \"api.anthropic.com\",\n  google: \"generativelanguage.googleapis.com\",\n  aistudio: \"generativelanguage.googleapis.com\",\n  mistral: \"api.mistral.ai\",\n  cohere: \"api.cohere.com\",\n  bedrock: \"bedrock-runtime.us-east-1.amazonaws.com\",\n  openrouter: \"openrouter.ai\",\n  vercel: \"gateway.ai.vercel.app\",\n  alibaba: \"dashscope-intl.aliyuncs.com\",\n  alibabacloud: \"dashscope-intl.aliyuncs.com\",\n  dashscope: \"dashscope-intl.aliyuncs.com\",\n  fireworks: \"api.fireworks.ai\",\n  fireworksai: \"api.fireworks.ai\",\n  venice: \"api.venice.ai\",\n  parasail: \"api.parasail.io\",\n  deepinfra: \"api.deepinfra.com\",\n  atlascloud: \"api.atlascloud.ai\",\n  novita: \"api.novita.ai\",\n  novitaai: \"api.novita.ai\",\n  grok: \"api.x.ai\",\n  xai: \"api.x.ai\",\n  wandb: \"api.inference.wandb.ai\",\n  weightsandbiases: \"api.inference.wandb.ai\",\n  baidu: \"qianfan.baidubce.com\",\n  qianfan: \"qianfan.baidubce.com\",\n  vertex: \"aiplatform.googleapis.com\",\n  xiaomi: \"api.xiaomimimo.com\",\n  minimax: \"api.minimax.io\",\n};\n\nexport interface HostResolution {\n  /** The hostname/host to use for requests. */\n  host: string;\n  /** The provider alias that was expanded, if any. */\n  alias?: HostAlias;\n}\n\nfunction readProcessEnv(): Env {\n  return typeof process !== \"undefined\" && process.env ? process.env : {};\n}\n\nfunction normalizeHostValue(value: string): string {\n  const trimmed = value.trim();\n  if (!trimmed) return trimmed;\n\n  try {\n    if (trimmed.includes(\"://\")) {\n      return new URL(trimmed).host;\n    }\n  } catch {\n    // Fall through and treat it as a host-ish string.\n  }\n\n  return trimmed.replace(/^\\/\\//, \"\").split(\"/\")[0] ?? trimmed;\n}\n\nfunction envHostOverride(alias: HostAlias, env: Env): string | undefined {\n  const upper = alias.toUpperCase();\n  const override =\n    env[`LLM_STRINGS_${upper}_HOST`] ?? env[`LLM_STRINGS_HOST_${upper}`];\n  return override?.trim() ? override : undefined;\n}\n\n/**\n * Resolve short provider host aliases (`openai`, `anthropic`, etc.) to their\n * canonical hostnames. Per-provider environment overrides can redirect aliases\n * to regional or private endpoints:\n *\n * - `LLM_STRINGS_OPENAI_HOST`\n * - `LLM_STRINGS_HOST_OPENAI`\n */\nexport function resolveHostAlias(\n  host: string,\n  env: Env = readProcessEnv(),\n): HostResolution {\n  const normalizedHost = host.toLowerCase();\n  if (!hasOwn(HOST_ALIASES, normalizedHost)) {\n    return { host };\n  }\n\n  const alias = normalizedHost as HostAlias;\n  const override = envHostOverride(alias, env);\n  return {\n    host: normalizeHostValue(override ?? HOST_ALIASES[alias]),\n    alias,\n  };\n}\n\nexport function providerFromHostAlias(alias: string): Provider | undefined {\n  const normalizedAlias = alias.toLowerCase();\n  if (hasOwn(PROVIDER_PARAMS, normalizedAlias)) {\n    return normalizedAlias as Provider;\n  }\n  return undefined;\n}\n\nexport function detectProvider(host: string): Provider | undefined {\n  host = host.toLowerCase();\n\n  // Gateways and aggregators first — they proxy to other providers\n  if (host.includes(\"openrouter\")) return \"openrouter\";\n  if (host.includes(\"gateway.ai.vercel\")) return \"vercel\";\n  // Bedrock before native providers since it hosts models from multiple vendors\n  if (host.includes(\"amazonaws\") || host.includes(\"bedrock\")) return \"bedrock\";\n  if (host.includes(\"openai\")) return \"openai\";\n  if (host.includes(\"anthropic\") || host.includes(\"claude\")) return \"anthropic\";\n  if (host.includes(\"googleapis\") || host.includes(\"google\")) return \"google\";\n  if (host.includes(\"mistral\")) return \"mistral\";\n  if (host.includes(\"cohere\")) return \"cohere\";\n  return undefined;\n}\n\n/**\n * Shorthand aliases → canonical param name.\n * Canonical names use snake_case and follow OpenAI conventions where possible.\n */\nexport const ALIASES: Record<string, string> = {\n  // temperature\n  temp: \"temperature\",\n\n  // max_tokens\n  max: \"max_tokens\",\n  max_out: \"max_tokens\",\n  max_output: \"max_tokens\",\n  max_output_tokens: \"max_tokens\",\n  max_completion_tokens: \"max_tokens\",\n  maxOutputTokens: \"max_tokens\",\n  maxTokens: \"max_tokens\",\n\n  // top_p\n  topp: \"top_p\",\n  topP: \"top_p\",\n  nucleus: \"top_p\",\n\n  // top_k\n  topk: \"top_k\",\n  topK: \"top_k\",\n\n  // frequency_penalty\n  freq: \"frequency_penalty\",\n  freq_penalty: \"frequency_penalty\",\n  frequencyPenalty: \"frequency_penalty\",\n  repetition_penalty: \"frequency_penalty\",\n\n  // presence_penalty\n  pres: \"presence_penalty\",\n  pres_penalty: \"presence_penalty\",\n  presencePenalty: \"presence_penalty\",\n\n  // stop\n  stop_sequences: \"stop\",\n  stopSequences: \"stop\",\n  stop_sequence: \"stop\",\n\n  // seed\n  random_seed: \"seed\",\n  randomSeed: \"seed\",\n\n  // n (completions count)\n  candidateCount: \"n\",\n  candidate_count: \"n\",\n  num_completions: \"n\",\n\n  // effort / reasoning\n  reasoning_effort: \"effort\",\n  reasoning: \"effort\",\n\n  // cache\n  cache_control: \"cache\",\n  cacheControl: \"cache\",\n  cachePoint: \"cache\",\n  cache_point: \"cache\",\n};\n\n/**\n * Canonical param name → provider-specific API param name.\n * Only includes params the provider actually supports.\n */\nexport const PROVIDER_PARAMS: Record<Provider, Record<string, string>> = {\n  openai: {\n    temperature: \"temperature\",\n    max_tokens: \"max_tokens\",\n    top_p: \"top_p\",\n    frequency_penalty: \"frequency_penalty\",\n    presence_penalty: \"presence_penalty\",\n    stop: \"stop\",\n    n: \"n\",\n    seed: \"seed\",\n    stream: \"stream\",\n    effort: \"reasoning_effort\",\n  },\n  anthropic: {\n    temperature: \"temperature\",\n    max_tokens: \"max_tokens\",\n    top_p: \"top_p\",\n    top_k: \"top_k\",\n    stop: \"stop_sequences\",\n    stream: \"stream\",\n    effort: \"effort\",\n    cache: \"cache_control\",\n    cache_ttl: \"cache_ttl\",\n  },\n  google: {\n    temperature: \"temperature\",\n    max_tokens: \"maxOutputTokens\",\n    top_p: \"topP\",\n    top_k: \"topK\",\n    frequency_penalty: \"frequencyPenalty\",\n    presence_penalty: \"presencePenalty\",\n    stop: \"stopSequences\",\n    n: \"candidateCount\",\n    stream: \"stream\",\n    seed: \"seed\",\n    responseMimeType: \"responseMimeType\",\n    responseSchema: \"responseSchema\",\n  },\n  mistral: {\n    temperature: \"temperature\",\n    max_tokens: \"max_tokens\",\n    top_p: \"top_p\",\n    frequency_penalty: \"frequency_penalty\",\n    presence_penalty: \"presence_penalty\",\n    stop: \"stop\",\n    n: \"n\",\n    seed: \"random_seed\",\n    stream: \"stream\",\n    safe_prompt: \"safe_prompt\",\n    min_tokens: \"min_tokens\",\n  },\n  cohere: {\n    temperature: \"temperature\",\n    max_tokens: \"max_tokens\",\n    top_p: \"p\",\n    top_k: \"k\",\n    frequency_penalty: \"frequency_penalty\",\n    presence_penalty: \"presence_penalty\",\n    stop: \"stop_sequences\",\n    stream: \"stream\",\n    seed: \"seed\",\n  },\n  bedrock: {\n    // Bedrock Converse API uses camelCase\n    temperature: \"temperature\",\n    max_tokens: \"maxTokens\",\n    top_p: \"topP\",\n    top_k: \"topK\", // Claude models via additionalModelRequestFields\n    stop: \"stopSequences\",\n    stream: \"stream\",\n    cache: \"cache_control\",\n    cache_ttl: \"cache_ttl\",\n  },\n  openrouter: {\n    // OpenAI-compatible API with extra routing params\n    temperature: \"temperature\",\n    max_tokens: \"max_tokens\",\n    top_p: \"top_p\",\n    top_k: \"top_k\",\n    frequency_penalty: \"frequency_penalty\",\n    presence_penalty: \"presence_penalty\",\n    stop: \"stop\",\n    n: \"n\",\n    seed: \"seed\",\n    stream: \"stream\",\n    effort: \"reasoning_effort\",\n  },\n  vercel: {\n    // OpenAI-compatible gateway\n    temperature: \"temperature\",\n    max_tokens: \"max_tokens\",\n    top_p: \"top_p\",\n    top_k: \"top_k\",\n    frequency_penalty: \"frequency_penalty\",\n    presence_penalty: \"presence_penalty\",\n    stop: \"stop\",\n    n: \"n\",\n    seed: \"seed\",\n    stream: \"stream\",\n    effort: \"reasoning_effort\",\n  },\n};\n\n/**\n * Validation specs per provider, keyed by provider-specific param name.\n */\nexport interface ParamSpec {\n  type: \"number\" | \"string\" | \"boolean\";\n  min?: number;\n  max?: number;\n  values?: string[];\n  default?: string | number | boolean;\n  description?: string;\n}\n\nexport const PARAM_SPECS: Record<Provider, Record<string, ParamSpec>> = {\n  openai: {\n    temperature: {\n      type: \"number\",\n      min: 0,\n      max: 2,\n      default: 0.7,\n      description: \"Controls randomness\",\n    },\n    max_tokens: {\n      type: \"number\",\n      min: 1,\n      default: 4096,\n      description: \"Maximum output tokens\",\n    },\n    top_p: {\n      type: \"number\",\n      min: 0,\n      max: 1,\n      default: 1,\n      description: \"Nucleus sampling\",\n    },\n    frequency_penalty: {\n      type: \"number\",\n      min: -2,\n      max: 2,\n      default: 0,\n      description: \"Penalize frequent tokens\",\n    },\n    presence_penalty: {\n      type: \"number\",\n      min: -2,\n      max: 2,\n      default: 0,\n      description: \"Penalize repeated topics\",\n    },\n    stop: { type: \"string\", description: \"Stop sequences\" },\n    n: { type: \"number\", min: 1, default: 1, description: \"Completions count\" },\n    seed: { type: \"number\", description: \"Random seed\" },\n    stream: { type: \"boolean\", default: false, description: \"Stream response\" },\n    reasoning_effort: {\n      type: \"string\",\n      values: [\"none\", \"minimal\", \"low\", \"medium\", \"high\", \"xhigh\"],\n      default: \"medium\",\n      description: \"Reasoning effort\",\n    },\n  },\n  anthropic: {\n    temperature: {\n      type: \"number\",\n      min: 0,\n      max: 1,\n      default: 0.7,\n      description: \"Controls randomness\",\n    },\n    max_tokens: {\n      type: \"number\",\n      min: 1,\n      default: 4096,\n      description: \"Maximum output tokens\",\n    },\n    top_p: {\n      type: \"number\",\n      min: 0,\n      max: 1,\n      default: 1,\n      description: \"Nucleus sampling\",\n    },\n    top_k: {\n      type: \"number\",\n      min: 0,\n      default: 40,\n      description: \"Top-K sampling\",\n    },\n    stop_sequences: { type: \"string\", description: \"Stop sequences\" },\n    stream: { type: \"boolean\", default: false, description: \"Stream response\" },\n    effort: {\n      type: \"string\",\n      values: [\"low\", \"medium\", \"high\", \"max\"],\n      default: \"medium\",\n      description: \"Thinking effort\",\n    },\n    cache_control: {\n      type: \"string\",\n      values: [\"ephemeral\"],\n      default: \"ephemeral\",\n      description: \"Cache control\",\n    },\n    cache_ttl: {\n      type: \"string\",\n      values: [\"5m\", \"1h\"],\n      default: \"5m\",\n      description: \"Cache TTL\",\n    },\n  },\n  google: {\n    temperature: {\n      type: \"number\",\n      min: 0,\n      max: 2,\n      default: 0.7,\n      description: \"Controls randomness\",\n    },\n    maxOutputTokens: {\n      type: \"number\",\n      min: 1,\n      default: 4096,\n      description: \"Maximum output tokens\",\n    },\n    topP: {\n      type: \"number\",\n      min: 0,\n      max: 1,\n      default: 1,\n      description: \"Nucleus sampling\",\n    },\n    topK: {\n      type: \"number\",\n      min: 0,\n      default: 40,\n      description: \"Top-K sampling\",\n    },\n    frequencyPenalty: {\n      type: \"number\",\n      min: -2,\n      max: 2,\n      default: 0,\n      description: \"Penalize frequent tokens\",\n    },\n    presencePenalty: {\n      type: \"number\",\n      min: -2,\n      max: 2,\n      default: 0,\n      description: \"Penalize repeated topics\",\n    },\n    stopSequences: { type: \"string\", description: \"Stop sequences\" },\n    candidateCount: {\n      type: \"number\",\n      min: 1,\n      default: 1,\n      description: \"Candidate count\",\n    },\n    stream: { type: \"boolean\", default: false, description: \"Stream response\" },\n    seed: { type: \"number\", description: \"Random seed\" },\n    responseMimeType: { type: \"string\", description: \"Response MIME type\" },\n    responseSchema: { type: \"string\", description: \"Response schema\" },\n  },\n  mistral: {\n    temperature: {\n      type: \"number\",\n      min: 0,\n      max: 1,\n      default: 0.7,\n      description: \"Controls randomness\",\n    },\n    max_tokens: {\n      type: \"number\",\n      min: 1,\n      default: 4096,\n      description: \"Maximum output tokens\",\n    },\n    top_p: {\n      type: \"number\",\n      min: 0,\n      max: 1,\n      default: 1,\n      description: \"Nucleus sampling\",\n    },\n    frequency_penalty: {\n      type: \"number\",\n      min: -2,\n      max: 2,\n      default: 0,\n      description: \"Penalize frequent tokens\",\n    },\n    presence_penalty: {\n      type: \"number\",\n      min: -2,\n      max: 2,\n      default: 0,\n      description: \"Penalize repeated topics\",\n    },\n    stop: { type: \"string\", description: \"Stop sequences\" },\n    n: { type: \"number\", min: 1, default: 1, description: \"Completions count\" },\n    random_seed: { type: \"number\", description: \"Random seed\" },\n    stream: { type: \"boolean\", default: false, description: \"Stream response\" },\n    safe_prompt: {\n      type: \"boolean\",\n      default: false,\n      description: \"Enable safe prompt\",\n    },\n    min_tokens: {\n      type: \"number\",\n      min: 0,\n      default: 0,\n      description: \"Minimum tokens\",\n    },\n  },\n  cohere: {\n    temperature: {\n      type: \"number\",\n      min: 0,\n      max: 1,\n      default: 0.7,\n      description: \"Controls randomness\",\n    },\n    max_tokens: {\n      type: \"number\",\n      min: 1,\n      default: 4096,\n      description: \"Maximum output tokens\",\n    },\n    p: {\n      type: \"number\",\n      min: 0,\n      max: 1,\n      default: 1,\n      description: \"Nucleus sampling (p)\",\n    },\n    k: {\n      type: \"number\",\n      min: 0,\n      max: 500,\n      default: 40,\n      description: \"Top-K sampling (k)\",\n    },\n    frequency_penalty: {\n      type: \"number\",\n      min: 0,\n      max: 1,\n      default: 0,\n      description: \"Penalize frequent tokens\",\n    },\n    presence_penalty: {\n      type: \"number\",\n      min: 0,\n      max: 1,\n      default: 0,\n      description: \"Penalize repeated topics\",\n    },\n    stop_sequences: { type: \"string\", description: \"Stop sequences\" },\n    stream: { type: \"boolean\", default: false, description: \"Stream response\" },\n    seed: { type: \"number\", description: \"Random seed\" },\n  },\n  bedrock: {\n    // Converse API inferenceConfig params\n    temperature: {\n      type: \"number\",\n      min: 0,\n      max: 1,\n      default: 0.7,\n      description: \"Controls randomness\",\n    },\n    maxTokens: {\n      type: \"number\",\n      min: 1,\n      default: 4096,\n      description: \"Maximum output tokens\",\n    },\n    topP: {\n      type: \"number\",\n      min: 0,\n      max: 1,\n      default: 1,\n      description: \"Nucleus sampling\",\n    },\n    topK: {\n      type: \"number\",\n      min: 0,\n      default: 40,\n      description: \"Top-K sampling\",\n    },\n    stopSequences: { type: \"string\", description: \"Stop sequences\" },\n    stream: { type: \"boolean\", default: false, description: \"Stream response\" },\n    cache_control: {\n      type: \"string\",\n      values: [\"ephemeral\"],\n      default: \"ephemeral\",\n      description: \"Cache control\",\n    },\n    cache_ttl: {\n      type: \"string\",\n      values: [\"5m\", \"1h\"],\n      default: \"5m\",\n      description: \"Cache TTL\",\n    },\n  },\n  openrouter: {\n    // Loose validation — proxies to many providers with varying ranges\n    temperature: {\n      type: \"number\",\n      min: 0,\n      max: 2,\n      default: 0.7,\n      description: \"Controls randomness\",\n    },\n    max_tokens: {\n      type: \"number\",\n      min: 1,\n      default: 4096,\n      description: \"Maximum output tokens\",\n    },\n    top_p: {\n      type: \"number\",\n      min: 0,\n      max: 1,\n      default: 1,\n      description: \"Nucleus sampling\",\n    },\n    top_k: {\n      type: \"number\",\n      min: 0,\n      default: 40,\n      description: \"Top-K sampling\",\n    },\n    frequency_penalty: {\n      type: \"number\",\n      min: -2,\n      max: 2,\n      default: 0,\n      description: \"Penalize frequent tokens\",\n    },\n    presence_penalty: {\n      type: \"number\",\n      min: -2,\n      max: 2,\n      default: 0,\n      description: \"Penalize repeated topics\",\n    },\n    stop: { type: \"string\", description: \"Stop sequences\" },\n    n: { type: \"number\", min: 1, default: 1, description: \"Completions count\" },\n    seed: { type: \"number\", description: \"Random seed\" },\n    stream: { type: \"boolean\", default: false, description: \"Stream response\" },\n    reasoning_effort: {\n      type: \"string\",\n      values: [\"none\", \"minimal\", \"low\", \"medium\", \"high\", \"xhigh\"],\n      default: \"medium\",\n      description: \"Reasoning effort\",\n    },\n  },\n  vercel: {\n    // Loose validation — proxies to many providers with varying ranges\n    temperature: {\n      type: \"number\",\n      min: 0,\n      max: 2,\n      default: 0.7,\n      description: \"Controls randomness\",\n    },\n    max_tokens: {\n      type: \"number\",\n      min: 1,\n      default: 4096,\n      description: \"Maximum output tokens\",\n    },\n    top_p: {\n      type: \"number\",\n      min: 0,\n      max: 1,\n      default: 1,\n      description: \"Nucleus sampling\",\n    },\n    top_k: {\n      type: \"number\",\n      min: 0,\n      default: 40,\n      description: \"Top-K sampling\",\n    },\n    frequency_penalty: {\n      type: \"number\",\n      min: -2,\n      max: 2,\n      default: 0,\n      description: \"Penalize frequent tokens\",\n    },\n    presence_penalty: {\n      type: \"number\",\n      min: -2,\n      max: 2,\n      default: 0,\n      description: \"Penalize repeated topics\",\n    },\n    stop: { type: \"string\", description: \"Stop sequences\" },\n    n: { type: \"number\", min: 1, default: 1, description: \"Completions count\" },\n    seed: { type: \"number\", description: \"Random seed\" },\n    stream: { type: \"boolean\", default: false, description: \"Stream response\" },\n    reasoning_effort: {\n      type: \"string\",\n      values: [\"none\", \"minimal\", \"low\", \"medium\", \"high\", \"xhigh\"],\n      default: \"medium\",\n      description: \"Reasoning effort\",\n    },\n  },\n};\n\n/** OpenAI reasoning models don't support standard sampling params. */\nexport function isReasoningModel(model: string): boolean {\n  // Strip gateway prefix: \"openai/o3\" → \"o3\"\n  const name = model.includes(\"/\") ? model.split(\"/\").pop()! : model;\n  return /^o[134]/.test(name);\n}\n\n/** Providers that can route to OpenAI models (and need reasoning-model checks). */\nexport function canHostOpenAIModels(provider: Provider): boolean {\n  return (\n    provider === \"openai\" || provider === \"openrouter\" || provider === \"vercel\"\n  );\n}\n\n/** Whether this provider is a gateway/router that proxies to other providers. */\nexport function isGatewayProvider(provider: Provider): boolean {\n  return provider === \"openrouter\" || provider === \"vercel\";\n}\n\n/**\n * Extract the underlying provider from a gateway model string.\n * e.g. \"anthropic/claude-sonnet-4-5\" → \"anthropic\"\n * Returns undefined for unknown prefixes (qwen, deepseek, etc.) or models without \"/\".\n */\nexport function detectGatewaySubProvider(model: string): Provider | undefined {\n  const slash = model.indexOf(\"/\");\n  if (slash < 1) return undefined;\n  const prefix = model.slice(0, slash);\n  const direct: Provider[] = [\n    \"openai\",\n    \"anthropic\",\n    \"google\",\n    \"mistral\",\n    \"cohere\",\n  ];\n  return direct.find((p) => p === prefix);\n}\n\nexport const REASONING_MODEL_UNSUPPORTED = new Set([\n  \"temperature\",\n  \"top_p\",\n  \"frequency_penalty\",\n  \"presence_penalty\",\n  \"n\",\n]);\n\n/**\n * Bedrock model IDs are prefixed with the vendor name.\n * e.g. \"anthropic.claude-sonnet-4-5-20250929-v1:0\"\n */\nexport type BedrockModelFamily =\n  | \"anthropic\"\n  | \"meta\"\n  | \"amazon\"\n  | \"mistral\"\n  | \"cohere\"\n  | \"ai21\";\n\nexport function detectBedrockModelFamily(\n  model: string,\n): BedrockModelFamily | undefined {\n  // Handle cross-region inference profiles (e.g. \"us.anthropic.claude-sonnet-4-5...\")\n  // and global inference profiles (e.g. \"global.anthropic.claude-sonnet-4-5...\")\n  const parts = model.split(\".\");\n\n  // If first part is a region prefix (us, eu, apac) or global, skip it\n  let prefix = parts[0];\n  if ([\"us\", \"eu\", \"apac\", \"global\"].includes(prefix) && parts.length > 1) {\n    prefix = parts[1];\n  }\n\n  const families: BedrockModelFamily[] = [\n    \"anthropic\",\n    \"meta\",\n    \"amazon\",\n    \"mistral\",\n    \"cohere\",\n    \"ai21\",\n  ];\n  return families.find((f) => prefix === f);\n}\n\n/** Whether a Bedrock model supports prompt caching (Claude and Nova only). */\nexport function bedrockSupportsCaching(model: string): boolean {\n  const family = detectBedrockModelFamily(model);\n  if (family === \"anthropic\") return true;\n  if (family === \"amazon\" && model.includes(\"nova\")) return true;\n  return false;\n}\n\n/** Cache value normalization per provider. */\nexport const CACHE_VALUES: Record<Provider, string | undefined> = {\n  openai: undefined, // OpenAI auto-caches; no explicit param\n  anthropic: \"ephemeral\",\n  google: undefined, // Google uses explicit caching API, not a param\n  mistral: undefined,\n  cohere: undefined,\n  bedrock: \"ephemeral\", // Supported for Claude models on Bedrock\n  openrouter: undefined, // Depends on underlying provider\n  vercel: undefined, // Depends on underlying provider\n};\n\n/** Valid cache TTL values per provider. */\nexport const CACHE_TTLS: Record<Provider, string[] | undefined> = {\n  openai: undefined,\n  anthropic: [\"5m\", \"1h\"],\n  google: undefined,\n  mistral: undefined,\n  cohere: undefined,\n  bedrock: [\"5m\", \"1h\"], // Claude on Bedrock uses same TTLs as direct Anthropic\n  openrouter: undefined,\n  vercel: undefined,\n};\n\n/** Match a duration expression like \"5m\", \"1h\", \"30m\". */\nexport const DURATION_RE = /^\\d+[mh]$/;\n","import type { LlmConnectionConfig } from \"./parse.js\";\nimport {\n  ALIASES,\n  CACHE_TTLS,\n  CACHE_VALUES,\n  DURATION_RE,\n  PROVIDER_PARAMS,\n  bedrockSupportsCaching,\n  canHostOpenAIModels,\n  detectGatewaySubProvider,\n  detectProvider,\n  isGatewayProvider,\n  isReasoningModel,\n  providerFromHostAlias,\n  type Provider,\n} from \"./provider-core.js\";\n\nexport interface NormalizeChange {\n  from: string;\n  to: string;\n  value: string;\n  reason: string;\n}\n\nexport interface NormalizeResult {\n  config: LlmConnectionConfig;\n  provider: Provider | undefined;\n  /** Underlying provider extracted from gateway model prefix (e.g. \"anthropic\" from \"anthropic/claude-sonnet-4-5\"). */\n  subProvider: Provider | undefined;\n  changes: NormalizeChange[];\n}\n\nexport interface NormalizeOptions {\n  /** Include detailed change log in the result. */\n  verbose?: boolean;\n}\n\n/**\n * Normalize an LLM connection config's params for its target provider.\n *\n * 1. Expands shorthand aliases (e.g. `temp` → `temperature`)\n * 2. Maps canonical param names to provider-specific names\n *    (e.g. `max_tokens` → `maxOutputTokens` for Google)\n * 3. Normalizes special values (e.g. `cache=true` → `cache_control=ephemeral` for Anthropic)\n * 4. For OpenAI reasoning models, remaps `max_tokens` → `max_completion_tokens`\n *    and warns about unsupported sampling params\n */\nexport function normalize(\n  config: LlmConnectionConfig,\n  options: NormalizeOptions = {},\n): NormalizeResult {\n  const provider =\n    (config.hostAlias ? providerFromHostAlias(config.hostAlias) : undefined) ??\n    detectProvider(config.host);\n  const subProvider =\n    provider && isGatewayProvider(provider)\n      ? detectGatewaySubProvider(config.model)\n      : undefined;\n  const changes: NormalizeChange[] = [];\n  const params: Record<string, string> = {};\n\n  for (const [rawKey, value] of Object.entries(config.params)) {\n    let key = rawKey;\n\n    // Step 1: Expand aliases to canonical name\n    if (ALIASES[key]) {\n      const canonical = ALIASES[key];\n      if (options.verbose) {\n        changes.push({\n          from: key,\n          to: canonical,\n          value,\n          reason: `alias: \"${key}\" → \"${canonical}\"`,\n        });\n      }\n      key = canonical;\n    }\n\n    // Step 2: Handle special \"cache\" param\n    if (key === \"cache\" && provider) {\n      let cacheValue = CACHE_VALUES[provider];\n\n      // Bedrock supports cache for Anthropic Claude and Amazon Nova models\n      if (provider === \"bedrock\" && !bedrockSupportsCaching(config.model)) {\n        cacheValue = undefined;\n      }\n\n      // Provider/model doesn't support cache — drop it\n      if (!cacheValue) {\n        if (options.verbose) {\n          changes.push({\n            from: \"cache\",\n            to: \"(dropped)\",\n            value,\n            reason: `${provider} does not use a cache param for this model (caching is automatic or unsupported)`,\n          });\n        }\n        continue;\n      }\n\n      const isBool = value === \"true\" || value === \"1\" || value === \"yes\";\n      const isDuration = DURATION_RE.test(value);\n\n      if (isBool || isDuration) {\n        const providerKey = PROVIDER_PARAMS[provider]?.[\"cache\"] ?? \"cache\";\n        if (options.verbose) {\n          changes.push({\n            from: \"cache\",\n            to: providerKey,\n            value: cacheValue,\n            reason: `cache=${value} → ${providerKey}=${cacheValue} for ${provider}`,\n          });\n        }\n        params[providerKey] = cacheValue;\n\n        // Emit cache_ttl when a duration is specified\n        if (isDuration && CACHE_TTLS[provider]) {\n          if (options.verbose) {\n            changes.push({\n              from: \"cache\",\n              to: \"cache_ttl\",\n              value,\n              reason: `cache=${value} → cache_ttl=${value} for ${provider}`,\n            });\n          }\n          params[\"cache_ttl\"] = value;\n        }\n        continue;\n      }\n    }\n\n    // Step 3: Map canonical → provider-specific param name\n    if (provider && PROVIDER_PARAMS[provider]) {\n      const providerKey = PROVIDER_PARAMS[provider][key];\n      if (providerKey && providerKey !== key) {\n        if (options.verbose) {\n          changes.push({\n            from: key,\n            to: providerKey,\n            value,\n            reason: `${provider} uses \"${providerKey}\" instead of \"${key}\"`,\n          });\n        }\n        key = providerKey;\n      }\n    }\n\n    // Step 4: OpenAI reasoning model adjustments (direct or via gateway)\n    if (\n      provider &&\n      canHostOpenAIModels(provider) &&\n      isReasoningModel(config.model) &&\n      key === \"max_tokens\"\n    ) {\n      if (options.verbose) {\n        changes.push({\n          from: \"max_tokens\",\n          to: \"max_completion_tokens\",\n          value,\n          reason:\n            \"OpenAI reasoning models use max_completion_tokens instead of max_tokens\",\n        });\n      }\n      key = \"max_completion_tokens\";\n    }\n\n    params[key] = value;\n  }\n\n  return {\n    config: { ...config, params },\n    provider,\n    subProvider,\n    changes,\n  };\n}\n"],"mappings":"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","names":[]}