{"version":3,"sources":["../src/validate.ts","../src/provider-core.ts","../src/parse.ts","../src/normalize.ts"],"sourcesContent":["import { parse } from \"./parse.js\";\nimport { normalize } from \"./normalize.js\";\nimport {\n  PARAM_SPECS,\n  PROVIDER_PARAMS,\n  REASONING_MODEL_UNSUPPORTED,\n  bedrockSupportsCaching,\n  canHostOpenAIModels,\n  detectBedrockModelFamily,\n  isReasoningModel,\n  type ParamSpec,\n  type Provider,\n} from \"./provider-core.js\";\n\nexport interface ValidationIssue {\n  param: string;\n  value: string;\n  message: string;\n  severity: \"error\" | \"warning\";\n}\n\nexport interface ValidateOptions {\n  /** Promote warnings (unknown provider, unknown params) to errors. */\n  strict?: boolean;\n}\n\n/**\n * Build a reverse map from provider-specific param names back to canonical names.\n */\nfunction buildReverseParamMap(provider: Provider): Record<string, string> {\n  const map: Record<string, string> = {};\n  for (const [canonical, specific] of Object.entries(\n    PROVIDER_PARAMS[provider],\n  )) {\n    map[specific] = canonical;\n  }\n  return map;\n}\n\n/**\n * Look up a sub-provider's ParamSpec for a gateway-normalized param name.\n * Maps: gateway param → canonical → sub-provider-specific → spec.\n */\nfunction lookupSubProviderSpec(\n  gatewayParamName: string,\n  gatewayReverseMap: Record<string, string>,\n  subProvider: Provider,\n) {\n  const canonical = gatewayReverseMap[gatewayParamName] ?? gatewayParamName;\n  const subProviderKey = PROVIDER_PARAMS[subProvider]?.[canonical];\n  if (!subProviderKey) return { spec: undefined, canonical };\n  return { spec: PARAM_SPECS[subProvider]?.[subProviderKey], canonical };\n}\n\n/**\n * Build the set of gateway param names that correspond to params the sub-provider supports.\n */\nfunction buildSubProviderKnownParams(\n  gateway: Provider,\n  subProvider: Provider,\n): Set<string> {\n  const known = new Set<string>();\n  const subProviderCanonicals = new Set(\n    Object.keys(PROVIDER_PARAMS[subProvider]),\n  );\n  for (const [canonical, gatewaySpecific] of Object.entries(\n    PROVIDER_PARAMS[gateway],\n  )) {\n    if (subProviderCanonicals.has(canonical)) {\n      known.add(gatewaySpecific);\n    }\n  }\n  return known;\n}\n\n/**\n * Validate an LLM connection string.\n *\n * Parses and normalizes the string, then checks params against provider specs.\n * For gateway providers (OpenRouter, Vercel), detects the sub-provider from the\n * model prefix and validates against the sub-provider's rules when known.\n * Returns a list of issues found. An empty array means all params look valid.\n */\nexport function validate(\n  connectionString: string,\n  options: ValidateOptions = {},\n): ValidationIssue[] {\n  const parsed = parse(connectionString);\n  const { config, provider, subProvider } = normalize(parsed);\n  const issues: ValidationIssue[] = [];\n\n  if (!provider) {\n    issues.push({\n      param: \"host\",\n      value: config.host,\n      message: `Unknown provider for host \"${config.host}\". Validation skipped.`,\n      severity: options.strict ? \"error\" : \"warning\",\n    });\n    return issues;\n  }\n\n  // When routing through a gateway to a known sub-provider, validate against\n  // the sub-provider's specs. Fall back to the gateway's loose specs otherwise.\n  const effectiveProvider = subProvider ?? provider;\n  const specs = PARAM_SPECS[effectiveProvider];\n\n  const gatewayReverseMap = subProvider\n    ? buildReverseParamMap(provider)\n    : undefined;\n\n  const knownParams = subProvider\n    ? buildSubProviderKnownParams(provider, subProvider)\n    : new Set(Object.values(PROVIDER_PARAMS[provider]));\n\n  for (const [key, value] of Object.entries(config.params)) {\n    // Check for OpenAI reasoning model restrictions (direct or via gateway)\n    if (\n      canHostOpenAIModels(provider) &&\n      isReasoningModel(config.model) &&\n      REASONING_MODEL_UNSUPPORTED.has(key)\n    ) {\n      issues.push({\n        param: key,\n        value,\n        message: `\"${key}\" is not supported by OpenAI reasoning model \"${config.model}\". Use \"reasoning_effort\" instead of temperature for controlling output.`,\n        severity: \"error\",\n      });\n      continue;\n    }\n\n    // Bedrock model-family-specific checks\n    if (provider === \"bedrock\") {\n      const family = detectBedrockModelFamily(config.model);\n\n      // topK is only supported by Claude, Cohere, and Mistral on Bedrock\n      if (\n        key === \"topK\" &&\n        family &&\n        family !== \"anthropic\" &&\n        family !== \"cohere\" &&\n        family !== \"mistral\"\n      ) {\n        issues.push({\n          param: key,\n          value,\n          message: `\"topK\" is not supported by ${family} models on Bedrock.`,\n          severity: \"error\",\n        });\n        continue;\n      }\n\n      // cache_control is only supported by Claude and Nova on Bedrock\n      if (key === \"cache_control\" && !bedrockSupportsCaching(config.model)) {\n        issues.push({\n          param: key,\n          value,\n          message: `Prompt caching is only supported for Anthropic Claude and Amazon Nova models on Bedrock, not ${family ?? \"unknown\"} models.`,\n          severity: \"error\",\n        });\n        continue;\n      }\n    }\n\n    // Check if param is known for this provider (or sub-provider)\n    if (!knownParams.has(key) && !specs[key]) {\n      issues.push({\n        param: key,\n        value,\n        message: `Unknown param \"${key}\" for ${effectiveProvider}.`,\n        severity: options.strict ? \"error\" : \"warning\",\n      });\n      continue;\n    }\n\n    // Look up the spec — for gateways with a sub-provider, map through\n    // canonical names to find the sub-provider's spec\n    let spec: ParamSpec | undefined = specs[key];\n    if (subProvider && gatewayReverseMap && !spec) {\n      const result = lookupSubProviderSpec(key, gatewayReverseMap, subProvider);\n      spec = result.spec;\n    }\n    if (!spec) continue;\n\n    // Anthropic (and Bedrock Claude, and Anthropic via gateway) mutual exclusion for temperature/top_p\n    if (\n      (effectiveProvider === \"anthropic\" ||\n        (provider === \"bedrock\" &&\n          detectBedrockModelFamily(config.model) === \"anthropic\")) &&\n      (key === \"temperature\" || key === \"top_p\" || key === \"topP\")\n    ) {\n      const otherKey =\n        key === \"temperature\"\n          ? provider === \"bedrock\"\n            ? \"topP\"\n            : \"top_p\"\n          : \"temperature\";\n      // Only report error once (on the temperature param) to avoid duplicate errors\n      if (key === \"temperature\" && config.params[otherKey] !== undefined) {\n        issues.push({\n          param: key,\n          value,\n          message: `Cannot specify both \"temperature\" and \"${otherKey}\" for Anthropic models.`,\n          severity: \"error\",\n        });\n      }\n    }\n\n    if (spec.type === \"number\") {\n      const num = Number(value);\n      if (isNaN(num)) {\n        issues.push({\n          param: key,\n          value,\n          message: `\"${key}\" should be a number, got \"${value}\".`,\n          severity: \"error\",\n        });\n        continue;\n      }\n      if (spec.min !== undefined && num < spec.min) {\n        issues.push({\n          param: key,\n          value,\n          message: `\"${key}\" must be >= ${spec.min}, got ${num}.`,\n          severity: \"error\",\n        });\n      }\n      if (spec.max !== undefined && num > spec.max) {\n        issues.push({\n          param: key,\n          value,\n          message: `\"${key}\" must be <= ${spec.max}, got ${num}.`,\n          severity: \"error\",\n        });\n      }\n    }\n\n    if (spec.type === \"boolean\") {\n      if (![\"true\", \"false\", \"0\", \"1\"].includes(value)) {\n        issues.push({\n          param: key,\n          value,\n          message: `\"${key}\" should be a boolean (true/false), got \"${value}\".`,\n          severity: \"error\",\n        });\n      }\n    }\n\n    if (spec.type === \"string\" && spec.values) {\n      if (!spec.values.includes(value)) {\n        issues.push({\n          param: key,\n          value,\n          message: `\"${key}\" must be one of [${spec.values.join(\", \")}], got \"${value}\".`,\n          severity: \"error\",\n        });\n      }\n    }\n  }\n\n  return issues;\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 { resolveHostAlias } from \"./provider-core.js\";\nimport type { HostAlias } from \"./provider-core.js\";\n\nexport interface LlmConnectionConfig {\n  /** The original connection string */\n  raw: string;\n  /** Provider's API host (e.g. \"api.openai.com\") */\n  host: string;\n  /** Short provider alias that was expanded to host, if any. */\n  hostAlias?: HostAlias;\n  /** Model name (e.g. \"gpt-5.2\") */\n  model: string;\n  /** Optional label or app name */\n  label?: string;\n  /** Optional API key or password */\n  apiKey?: string;\n  /** Additional config parameters (temp, max_tokens, etc.) */\n  params: Record<string, string>;\n}\n\n/**\n * Parse an LLM connection string into its component parts.\n *\n * Format: `llm://[label[:apiKey]@]host/model[?key=value&...]`\n *\n * @example\n * ```ts\n * parse(\"llm://api.openai.com/gpt-5.2?temp=0.7&max_tokens=1500\")\n * parse(\"llm://app-name:sk-proj-123456@api.openai.com/gpt-5.2?temp=0.7\")\n * ```\n */\nexport function parse(connectionString: string): LlmConnectionConfig {\n  const url = new URL(connectionString);\n\n  if (url.protocol !== \"llm:\") {\n    throw new Error(\n      `Invalid scheme: expected \"llm://\", got \"${url.protocol}//\"`,\n    );\n  }\n\n  const { host, alias: hostAlias } = resolveHostAlias(url.host);\n  const model = url.pathname.replace(/^\\//, \"\");\n  const label = url.username || undefined;\n  const apiKey = url.password || undefined;\n\n  const params: Record<string, string> = {};\n  for (const [key, value] of url.searchParams) {\n    params[key] = value;\n  }\n\n  return {\n    raw: connectionString,\n    host,\n    hostAlias,\n    model,\n    label,\n    apiKey,\n    params,\n  };\n}\n\n/**\n * Build an LLM connection string from a config object.\n */\nexport function build(config: Omit<LlmConnectionConfig, \"raw\">): string {\n  const { host } = resolveHostAlias(config.host);\n  const auth =\n    config.label || config.apiKey\n      ? `${config.label ?? \"\"}${config.apiKey ? `:${config.apiKey}` : \"\"}@`\n      : \"\";\n\n  const query = new URLSearchParams(config.params).toString();\n  const qs = query ? `?${query}` : \"\";\n\n  return `llm://${auth}${host}/${config.model}${qs}`;\n}\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":[]}