llm-strings 1.1.1 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +117 -45
- package/dist/ai-sdk.cjs +831 -0
- package/dist/ai-sdk.cjs.map +1 -0
- package/dist/ai-sdk.d.cts +27 -0
- package/dist/ai-sdk.d.ts +27 -0
- package/dist/ai-sdk.js +465 -0
- package/dist/ai-sdk.js.map +1 -0
- package/dist/{chunk-MPIHGH6L.js → chunk-2ARD4TFU.js} +5 -4
- package/dist/chunk-2ARD4TFU.js.map +1 -0
- package/dist/{chunk-FCEV23OT.js → chunk-BCOUH7LH.js} +9 -3
- package/dist/chunk-BCOUH7LH.js.map +1 -0
- package/dist/{chunk-UYMVUTLV.js → chunk-RPXK2A7O.js} +5 -9
- package/dist/chunk-RPXK2A7O.js.map +1 -0
- package/dist/{chunk-XID353H7.js → chunk-W4NIQY7M.js} +412 -52
- package/dist/chunk-W4NIQY7M.js.map +1 -0
- package/dist/index.cjs +1032 -12
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +9 -4
- package/dist/normalize.cjs +370 -4
- package/dist/normalize.cjs.map +1 -1
- package/dist/normalize.d.cts +1 -1
- package/dist/normalize.d.ts +1 -1
- package/dist/normalize.js +2 -2
- package/dist/parse.cjs +129 -5
- package/dist/parse.cjs.map +1 -1
- package/dist/parse.d.cts +5 -1
- package/dist/parse.d.ts +5 -1
- package/dist/parse.js +2 -1
- package/dist/{provider-core-DinpG40u.d.ts → provider-core-BiAl8MCV.d.cts} +20 -1
- package/dist/{provider-core-DinpG40u.d.cts → provider-core-BiAl8MCV.d.ts} +20 -1
- package/dist/providers.cjs +1145 -90
- package/dist/providers.cjs.map +1 -1
- package/dist/providers.d.cts +2 -2
- package/dist/providers.d.ts +2 -2
- package/dist/providers.js +379 -60
- package/dist/providers.js.map +1 -1
- package/dist/validate.cjs +1017 -6
- package/dist/validate.cjs.map +1 -1
- package/dist/validate.js +4 -4
- package/package.json +13 -2
- package/dist/chunk-FCEV23OT.js.map +0 -1
- package/dist/chunk-MGWGNZDJ.cjs +0 -116
- package/dist/chunk-MGWGNZDJ.cjs.map +0 -1
- package/dist/chunk-MPIHGH6L.js.map +0 -1
- package/dist/chunk-N6NVBE43.cjs +0 -37
- package/dist/chunk-N6NVBE43.cjs.map +0 -1
- package/dist/chunk-NSCBY4VD.cjs +0 -370
- package/dist/chunk-NSCBY4VD.cjs.map +0 -1
- package/dist/chunk-RSUXM42X.cjs +0 -180
- package/dist/chunk-RSUXM42X.cjs.map +0 -1
- package/dist/chunk-UYMVUTLV.js.map +0 -1
- package/dist/chunk-XID353H7.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/validate.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"],"mappings":"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","names":[]}
|
|
@@ -1,5 +1,78 @@
|
|
|
1
1
|
// src/provider-core.ts
|
|
2
|
+
function hasOwn(object, key) {
|
|
3
|
+
return Object.prototype.hasOwnProperty.call(object, key);
|
|
4
|
+
}
|
|
5
|
+
var HOST_ALIASES = {
|
|
6
|
+
openai: "api.openai.com",
|
|
7
|
+
anthropic: "api.anthropic.com",
|
|
8
|
+
google: "generativelanguage.googleapis.com",
|
|
9
|
+
aistudio: "generativelanguage.googleapis.com",
|
|
10
|
+
mistral: "api.mistral.ai",
|
|
11
|
+
cohere: "api.cohere.com",
|
|
12
|
+
bedrock: "bedrock-runtime.us-east-1.amazonaws.com",
|
|
13
|
+
openrouter: "openrouter.ai",
|
|
14
|
+
vercel: "gateway.ai.vercel.app",
|
|
15
|
+
alibaba: "dashscope-intl.aliyuncs.com",
|
|
16
|
+
alibabacloud: "dashscope-intl.aliyuncs.com",
|
|
17
|
+
dashscope: "dashscope-intl.aliyuncs.com",
|
|
18
|
+
fireworks: "api.fireworks.ai",
|
|
19
|
+
fireworksai: "api.fireworks.ai",
|
|
20
|
+
venice: "api.venice.ai",
|
|
21
|
+
parasail: "api.parasail.io",
|
|
22
|
+
deepinfra: "api.deepinfra.com",
|
|
23
|
+
atlascloud: "api.atlascloud.ai",
|
|
24
|
+
novita: "api.novita.ai",
|
|
25
|
+
novitaai: "api.novita.ai",
|
|
26
|
+
grok: "api.x.ai",
|
|
27
|
+
xai: "api.x.ai",
|
|
28
|
+
wandb: "api.inference.wandb.ai",
|
|
29
|
+
weightsandbiases: "api.inference.wandb.ai",
|
|
30
|
+
baidu: "qianfan.baidubce.com",
|
|
31
|
+
qianfan: "qianfan.baidubce.com",
|
|
32
|
+
vertex: "aiplatform.googleapis.com",
|
|
33
|
+
xiaomi: "api.xiaomimimo.com",
|
|
34
|
+
minimax: "api.minimax.io"
|
|
35
|
+
};
|
|
36
|
+
function readProcessEnv() {
|
|
37
|
+
return typeof process !== "undefined" && process.env ? process.env : {};
|
|
38
|
+
}
|
|
39
|
+
function normalizeHostValue(value) {
|
|
40
|
+
const trimmed = value.trim();
|
|
41
|
+
if (!trimmed) return trimmed;
|
|
42
|
+
try {
|
|
43
|
+
if (trimmed.includes("://")) {
|
|
44
|
+
return new URL(trimmed).host;
|
|
45
|
+
}
|
|
46
|
+
} catch {
|
|
47
|
+
}
|
|
48
|
+
return trimmed.replace(/^\/\//, "").split("/")[0] ?? trimmed;
|
|
49
|
+
}
|
|
50
|
+
function envHostOverride(alias, env) {
|
|
51
|
+
const upper = alias.toUpperCase();
|
|
52
|
+
const override = env[`LLM_STRINGS_${upper}_HOST`] ?? env[`LLM_STRINGS_HOST_${upper}`];
|
|
53
|
+
return override?.trim() ? override : void 0;
|
|
54
|
+
}
|
|
55
|
+
function resolveHostAlias(host, env = readProcessEnv()) {
|
|
56
|
+
const normalizedHost = host.toLowerCase();
|
|
57
|
+
if (!hasOwn(HOST_ALIASES, normalizedHost)) {
|
|
58
|
+
return { host };
|
|
59
|
+
}
|
|
60
|
+
const alias = normalizedHost;
|
|
61
|
+
const override = envHostOverride(alias, env);
|
|
62
|
+
return {
|
|
63
|
+
host: normalizeHostValue(override ?? HOST_ALIASES[alias]),
|
|
64
|
+
alias
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
function providerFromHostAlias(alias) {
|
|
68
|
+
const normalizedAlias = alias.toLowerCase();
|
|
69
|
+
if (hasOwn(PROVIDER_PARAMS, normalizedAlias)) {
|
|
70
|
+
return normalizedAlias;
|
|
71
|
+
}
|
|
72
|
+
return void 0;
|
|
73
|
+
}
|
|
2
74
|
function detectProvider(host) {
|
|
75
|
+
host = host.toLowerCase();
|
|
3
76
|
if (host.includes("openrouter")) return "openrouter";
|
|
4
77
|
if (host.includes("gateway.ai.vercel")) return "vercel";
|
|
5
78
|
if (host.includes("amazonaws") || host.includes("bedrock")) return "bedrock";
|
|
@@ -162,11 +235,40 @@ var PROVIDER_PARAMS = {
|
|
|
162
235
|
};
|
|
163
236
|
var PARAM_SPECS = {
|
|
164
237
|
openai: {
|
|
165
|
-
temperature: {
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
238
|
+
temperature: {
|
|
239
|
+
type: "number",
|
|
240
|
+
min: 0,
|
|
241
|
+
max: 2,
|
|
242
|
+
default: 0.7,
|
|
243
|
+
description: "Controls randomness"
|
|
244
|
+
},
|
|
245
|
+
max_tokens: {
|
|
246
|
+
type: "number",
|
|
247
|
+
min: 1,
|
|
248
|
+
default: 4096,
|
|
249
|
+
description: "Maximum output tokens"
|
|
250
|
+
},
|
|
251
|
+
top_p: {
|
|
252
|
+
type: "number",
|
|
253
|
+
min: 0,
|
|
254
|
+
max: 1,
|
|
255
|
+
default: 1,
|
|
256
|
+
description: "Nucleus sampling"
|
|
257
|
+
},
|
|
258
|
+
frequency_penalty: {
|
|
259
|
+
type: "number",
|
|
260
|
+
min: -2,
|
|
261
|
+
max: 2,
|
|
262
|
+
default: 0,
|
|
263
|
+
description: "Penalize frequent tokens"
|
|
264
|
+
},
|
|
265
|
+
presence_penalty: {
|
|
266
|
+
type: "number",
|
|
267
|
+
min: -2,
|
|
268
|
+
max: 2,
|
|
269
|
+
default: 0,
|
|
270
|
+
description: "Penalize repeated topics"
|
|
271
|
+
},
|
|
170
272
|
stop: { type: "string", description: "Stop sequences" },
|
|
171
273
|
n: { type: "number", min: 1, default: 1, description: "Completions count" },
|
|
172
274
|
seed: { type: "number", description: "Random seed" },
|
|
@@ -179,73 +281,288 @@ var PARAM_SPECS = {
|
|
|
179
281
|
}
|
|
180
282
|
},
|
|
181
283
|
anthropic: {
|
|
182
|
-
temperature: {
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
284
|
+
temperature: {
|
|
285
|
+
type: "number",
|
|
286
|
+
min: 0,
|
|
287
|
+
max: 1,
|
|
288
|
+
default: 0.7,
|
|
289
|
+
description: "Controls randomness"
|
|
290
|
+
},
|
|
291
|
+
max_tokens: {
|
|
292
|
+
type: "number",
|
|
293
|
+
min: 1,
|
|
294
|
+
default: 4096,
|
|
295
|
+
description: "Maximum output tokens"
|
|
296
|
+
},
|
|
297
|
+
top_p: {
|
|
298
|
+
type: "number",
|
|
299
|
+
min: 0,
|
|
300
|
+
max: 1,
|
|
301
|
+
default: 1,
|
|
302
|
+
description: "Nucleus sampling"
|
|
303
|
+
},
|
|
304
|
+
top_k: {
|
|
305
|
+
type: "number",
|
|
306
|
+
min: 0,
|
|
307
|
+
default: 40,
|
|
308
|
+
description: "Top-K sampling"
|
|
309
|
+
},
|
|
186
310
|
stop_sequences: { type: "string", description: "Stop sequences" },
|
|
187
311
|
stream: { type: "boolean", default: false, description: "Stream response" },
|
|
188
|
-
effort: {
|
|
189
|
-
|
|
190
|
-
|
|
312
|
+
effort: {
|
|
313
|
+
type: "string",
|
|
314
|
+
values: ["low", "medium", "high", "max"],
|
|
315
|
+
default: "medium",
|
|
316
|
+
description: "Thinking effort"
|
|
317
|
+
},
|
|
318
|
+
cache_control: {
|
|
319
|
+
type: "string",
|
|
320
|
+
values: ["ephemeral"],
|
|
321
|
+
default: "ephemeral",
|
|
322
|
+
description: "Cache control"
|
|
323
|
+
},
|
|
324
|
+
cache_ttl: {
|
|
325
|
+
type: "string",
|
|
326
|
+
values: ["5m", "1h"],
|
|
327
|
+
default: "5m",
|
|
328
|
+
description: "Cache TTL"
|
|
329
|
+
}
|
|
191
330
|
},
|
|
192
331
|
google: {
|
|
193
|
-
temperature: {
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
332
|
+
temperature: {
|
|
333
|
+
type: "number",
|
|
334
|
+
min: 0,
|
|
335
|
+
max: 2,
|
|
336
|
+
default: 0.7,
|
|
337
|
+
description: "Controls randomness"
|
|
338
|
+
},
|
|
339
|
+
maxOutputTokens: {
|
|
340
|
+
type: "number",
|
|
341
|
+
min: 1,
|
|
342
|
+
default: 4096,
|
|
343
|
+
description: "Maximum output tokens"
|
|
344
|
+
},
|
|
345
|
+
topP: {
|
|
346
|
+
type: "number",
|
|
347
|
+
min: 0,
|
|
348
|
+
max: 1,
|
|
349
|
+
default: 1,
|
|
350
|
+
description: "Nucleus sampling"
|
|
351
|
+
},
|
|
352
|
+
topK: {
|
|
353
|
+
type: "number",
|
|
354
|
+
min: 0,
|
|
355
|
+
default: 40,
|
|
356
|
+
description: "Top-K sampling"
|
|
357
|
+
},
|
|
358
|
+
frequencyPenalty: {
|
|
359
|
+
type: "number",
|
|
360
|
+
min: -2,
|
|
361
|
+
max: 2,
|
|
362
|
+
default: 0,
|
|
363
|
+
description: "Penalize frequent tokens"
|
|
364
|
+
},
|
|
365
|
+
presencePenalty: {
|
|
366
|
+
type: "number",
|
|
367
|
+
min: -2,
|
|
368
|
+
max: 2,
|
|
369
|
+
default: 0,
|
|
370
|
+
description: "Penalize repeated topics"
|
|
371
|
+
},
|
|
199
372
|
stopSequences: { type: "string", description: "Stop sequences" },
|
|
200
|
-
candidateCount: {
|
|
373
|
+
candidateCount: {
|
|
374
|
+
type: "number",
|
|
375
|
+
min: 1,
|
|
376
|
+
default: 1,
|
|
377
|
+
description: "Candidate count"
|
|
378
|
+
},
|
|
201
379
|
stream: { type: "boolean", default: false, description: "Stream response" },
|
|
202
380
|
seed: { type: "number", description: "Random seed" },
|
|
203
381
|
responseMimeType: { type: "string", description: "Response MIME type" },
|
|
204
382
|
responseSchema: { type: "string", description: "Response schema" }
|
|
205
383
|
},
|
|
206
384
|
mistral: {
|
|
207
|
-
temperature: {
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
385
|
+
temperature: {
|
|
386
|
+
type: "number",
|
|
387
|
+
min: 0,
|
|
388
|
+
max: 1,
|
|
389
|
+
default: 0.7,
|
|
390
|
+
description: "Controls randomness"
|
|
391
|
+
},
|
|
392
|
+
max_tokens: {
|
|
393
|
+
type: "number",
|
|
394
|
+
min: 1,
|
|
395
|
+
default: 4096,
|
|
396
|
+
description: "Maximum output tokens"
|
|
397
|
+
},
|
|
398
|
+
top_p: {
|
|
399
|
+
type: "number",
|
|
400
|
+
min: 0,
|
|
401
|
+
max: 1,
|
|
402
|
+
default: 1,
|
|
403
|
+
description: "Nucleus sampling"
|
|
404
|
+
},
|
|
405
|
+
frequency_penalty: {
|
|
406
|
+
type: "number",
|
|
407
|
+
min: -2,
|
|
408
|
+
max: 2,
|
|
409
|
+
default: 0,
|
|
410
|
+
description: "Penalize frequent tokens"
|
|
411
|
+
},
|
|
412
|
+
presence_penalty: {
|
|
413
|
+
type: "number",
|
|
414
|
+
min: -2,
|
|
415
|
+
max: 2,
|
|
416
|
+
default: 0,
|
|
417
|
+
description: "Penalize repeated topics"
|
|
418
|
+
},
|
|
212
419
|
stop: { type: "string", description: "Stop sequences" },
|
|
213
420
|
n: { type: "number", min: 1, default: 1, description: "Completions count" },
|
|
214
421
|
random_seed: { type: "number", description: "Random seed" },
|
|
215
422
|
stream: { type: "boolean", default: false, description: "Stream response" },
|
|
216
|
-
safe_prompt: {
|
|
217
|
-
|
|
423
|
+
safe_prompt: {
|
|
424
|
+
type: "boolean",
|
|
425
|
+
default: false,
|
|
426
|
+
description: "Enable safe prompt"
|
|
427
|
+
},
|
|
428
|
+
min_tokens: {
|
|
429
|
+
type: "number",
|
|
430
|
+
min: 0,
|
|
431
|
+
default: 0,
|
|
432
|
+
description: "Minimum tokens"
|
|
433
|
+
}
|
|
218
434
|
},
|
|
219
435
|
cohere: {
|
|
220
|
-
temperature: {
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
436
|
+
temperature: {
|
|
437
|
+
type: "number",
|
|
438
|
+
min: 0,
|
|
439
|
+
max: 1,
|
|
440
|
+
default: 0.7,
|
|
441
|
+
description: "Controls randomness"
|
|
442
|
+
},
|
|
443
|
+
max_tokens: {
|
|
444
|
+
type: "number",
|
|
445
|
+
min: 1,
|
|
446
|
+
default: 4096,
|
|
447
|
+
description: "Maximum output tokens"
|
|
448
|
+
},
|
|
449
|
+
p: {
|
|
450
|
+
type: "number",
|
|
451
|
+
min: 0,
|
|
452
|
+
max: 1,
|
|
453
|
+
default: 1,
|
|
454
|
+
description: "Nucleus sampling (p)"
|
|
455
|
+
},
|
|
456
|
+
k: {
|
|
457
|
+
type: "number",
|
|
458
|
+
min: 0,
|
|
459
|
+
max: 500,
|
|
460
|
+
default: 40,
|
|
461
|
+
description: "Top-K sampling (k)"
|
|
462
|
+
},
|
|
463
|
+
frequency_penalty: {
|
|
464
|
+
type: "number",
|
|
465
|
+
min: 0,
|
|
466
|
+
max: 1,
|
|
467
|
+
default: 0,
|
|
468
|
+
description: "Penalize frequent tokens"
|
|
469
|
+
},
|
|
470
|
+
presence_penalty: {
|
|
471
|
+
type: "number",
|
|
472
|
+
min: 0,
|
|
473
|
+
max: 1,
|
|
474
|
+
default: 0,
|
|
475
|
+
description: "Penalize repeated topics"
|
|
476
|
+
},
|
|
226
477
|
stop_sequences: { type: "string", description: "Stop sequences" },
|
|
227
478
|
stream: { type: "boolean", default: false, description: "Stream response" },
|
|
228
479
|
seed: { type: "number", description: "Random seed" }
|
|
229
480
|
},
|
|
230
481
|
bedrock: {
|
|
231
482
|
// Converse API inferenceConfig params
|
|
232
|
-
temperature: {
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
483
|
+
temperature: {
|
|
484
|
+
type: "number",
|
|
485
|
+
min: 0,
|
|
486
|
+
max: 1,
|
|
487
|
+
default: 0.7,
|
|
488
|
+
description: "Controls randomness"
|
|
489
|
+
},
|
|
490
|
+
maxTokens: {
|
|
491
|
+
type: "number",
|
|
492
|
+
min: 1,
|
|
493
|
+
default: 4096,
|
|
494
|
+
description: "Maximum output tokens"
|
|
495
|
+
},
|
|
496
|
+
topP: {
|
|
497
|
+
type: "number",
|
|
498
|
+
min: 0,
|
|
499
|
+
max: 1,
|
|
500
|
+
default: 1,
|
|
501
|
+
description: "Nucleus sampling"
|
|
502
|
+
},
|
|
503
|
+
topK: {
|
|
504
|
+
type: "number",
|
|
505
|
+
min: 0,
|
|
506
|
+
default: 40,
|
|
507
|
+
description: "Top-K sampling"
|
|
508
|
+
},
|
|
236
509
|
stopSequences: { type: "string", description: "Stop sequences" },
|
|
237
510
|
stream: { type: "boolean", default: false, description: "Stream response" },
|
|
238
|
-
cache_control: {
|
|
239
|
-
|
|
511
|
+
cache_control: {
|
|
512
|
+
type: "string",
|
|
513
|
+
values: ["ephemeral"],
|
|
514
|
+
default: "ephemeral",
|
|
515
|
+
description: "Cache control"
|
|
516
|
+
},
|
|
517
|
+
cache_ttl: {
|
|
518
|
+
type: "string",
|
|
519
|
+
values: ["5m", "1h"],
|
|
520
|
+
default: "5m",
|
|
521
|
+
description: "Cache TTL"
|
|
522
|
+
}
|
|
240
523
|
},
|
|
241
524
|
openrouter: {
|
|
242
525
|
// Loose validation — proxies to many providers with varying ranges
|
|
243
|
-
temperature: {
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
526
|
+
temperature: {
|
|
527
|
+
type: "number",
|
|
528
|
+
min: 0,
|
|
529
|
+
max: 2,
|
|
530
|
+
default: 0.7,
|
|
531
|
+
description: "Controls randomness"
|
|
532
|
+
},
|
|
533
|
+
max_tokens: {
|
|
534
|
+
type: "number",
|
|
535
|
+
min: 1,
|
|
536
|
+
default: 4096,
|
|
537
|
+
description: "Maximum output tokens"
|
|
538
|
+
},
|
|
539
|
+
top_p: {
|
|
540
|
+
type: "number",
|
|
541
|
+
min: 0,
|
|
542
|
+
max: 1,
|
|
543
|
+
default: 1,
|
|
544
|
+
description: "Nucleus sampling"
|
|
545
|
+
},
|
|
546
|
+
top_k: {
|
|
547
|
+
type: "number",
|
|
548
|
+
min: 0,
|
|
549
|
+
default: 40,
|
|
550
|
+
description: "Top-K sampling"
|
|
551
|
+
},
|
|
552
|
+
frequency_penalty: {
|
|
553
|
+
type: "number",
|
|
554
|
+
min: -2,
|
|
555
|
+
max: 2,
|
|
556
|
+
default: 0,
|
|
557
|
+
description: "Penalize frequent tokens"
|
|
558
|
+
},
|
|
559
|
+
presence_penalty: {
|
|
560
|
+
type: "number",
|
|
561
|
+
min: -2,
|
|
562
|
+
max: 2,
|
|
563
|
+
default: 0,
|
|
564
|
+
description: "Penalize repeated topics"
|
|
565
|
+
},
|
|
249
566
|
stop: { type: "string", description: "Stop sequences" },
|
|
250
567
|
n: { type: "number", min: 1, default: 1, description: "Completions count" },
|
|
251
568
|
seed: { type: "number", description: "Random seed" },
|
|
@@ -259,12 +576,46 @@ var PARAM_SPECS = {
|
|
|
259
576
|
},
|
|
260
577
|
vercel: {
|
|
261
578
|
// Loose validation — proxies to many providers with varying ranges
|
|
262
|
-
temperature: {
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
579
|
+
temperature: {
|
|
580
|
+
type: "number",
|
|
581
|
+
min: 0,
|
|
582
|
+
max: 2,
|
|
583
|
+
default: 0.7,
|
|
584
|
+
description: "Controls randomness"
|
|
585
|
+
},
|
|
586
|
+
max_tokens: {
|
|
587
|
+
type: "number",
|
|
588
|
+
min: 1,
|
|
589
|
+
default: 4096,
|
|
590
|
+
description: "Maximum output tokens"
|
|
591
|
+
},
|
|
592
|
+
top_p: {
|
|
593
|
+
type: "number",
|
|
594
|
+
min: 0,
|
|
595
|
+
max: 1,
|
|
596
|
+
default: 1,
|
|
597
|
+
description: "Nucleus sampling"
|
|
598
|
+
},
|
|
599
|
+
top_k: {
|
|
600
|
+
type: "number",
|
|
601
|
+
min: 0,
|
|
602
|
+
default: 40,
|
|
603
|
+
description: "Top-K sampling"
|
|
604
|
+
},
|
|
605
|
+
frequency_penalty: {
|
|
606
|
+
type: "number",
|
|
607
|
+
min: -2,
|
|
608
|
+
max: 2,
|
|
609
|
+
default: 0,
|
|
610
|
+
description: "Penalize frequent tokens"
|
|
611
|
+
},
|
|
612
|
+
presence_penalty: {
|
|
613
|
+
type: "number",
|
|
614
|
+
min: -2,
|
|
615
|
+
max: 2,
|
|
616
|
+
default: 0,
|
|
617
|
+
description: "Penalize repeated topics"
|
|
618
|
+
},
|
|
268
619
|
stop: { type: "string", description: "Stop sequences" },
|
|
269
620
|
n: { type: "number", min: 1, default: 1, description: "Completions count" },
|
|
270
621
|
seed: { type: "number", description: "Random seed" },
|
|
@@ -291,7 +642,13 @@ function detectGatewaySubProvider(model) {
|
|
|
291
642
|
const slash = model.indexOf("/");
|
|
292
643
|
if (slash < 1) return void 0;
|
|
293
644
|
const prefix = model.slice(0, slash);
|
|
294
|
-
const direct = [
|
|
645
|
+
const direct = [
|
|
646
|
+
"openai",
|
|
647
|
+
"anthropic",
|
|
648
|
+
"google",
|
|
649
|
+
"mistral",
|
|
650
|
+
"cohere"
|
|
651
|
+
];
|
|
295
652
|
return direct.find((p) => p === prefix);
|
|
296
653
|
}
|
|
297
654
|
var REASONING_MODEL_UNSUPPORTED = /* @__PURE__ */ new Set([
|
|
@@ -352,6 +709,9 @@ var CACHE_TTLS = {
|
|
|
352
709
|
var DURATION_RE = /^\d+[mh]$/;
|
|
353
710
|
|
|
354
711
|
export {
|
|
712
|
+
HOST_ALIASES,
|
|
713
|
+
resolveHostAlias,
|
|
714
|
+
providerFromHostAlias,
|
|
355
715
|
detectProvider,
|
|
356
716
|
ALIASES,
|
|
357
717
|
PROVIDER_PARAMS,
|
|
@@ -367,4 +727,4 @@ export {
|
|
|
367
727
|
CACHE_TTLS,
|
|
368
728
|
DURATION_RE
|
|
369
729
|
};
|
|
370
|
-
//# sourceMappingURL=chunk-
|
|
730
|
+
//# sourceMappingURL=chunk-W4NIQY7M.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/provider-core.ts"],"sourcesContent":["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"],"mappings":"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","names":[]}
|