llm-strings 1.0.0 → 1.1.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.
Files changed (54) hide show
  1. package/README.md +87 -12
  2. package/dist/chunk-6P5GSSNW.js +176 -0
  3. package/dist/chunk-6P5GSSNW.js.map +1 -0
  4. package/dist/chunk-FCEV23OT.js +37 -0
  5. package/dist/chunk-FCEV23OT.js.map +1 -0
  6. package/dist/chunk-MGWGNZDJ.cjs +116 -0
  7. package/dist/chunk-MGWGNZDJ.cjs.map +1 -0
  8. package/dist/chunk-MPIHGH6L.js +116 -0
  9. package/dist/chunk-MPIHGH6L.js.map +1 -0
  10. package/dist/chunk-N6NVBE43.cjs +37 -0
  11. package/dist/chunk-N6NVBE43.cjs.map +1 -0
  12. package/dist/chunk-NSCBY4VD.cjs +370 -0
  13. package/dist/chunk-NSCBY4VD.cjs.map +1 -0
  14. package/dist/chunk-RR3VXIW2.cjs +176 -0
  15. package/dist/chunk-RR3VXIW2.cjs.map +1 -0
  16. package/dist/chunk-RSUXM42X.cjs +180 -0
  17. package/dist/chunk-RSUXM42X.cjs.map +1 -0
  18. package/dist/chunk-UYMVUTLV.js +180 -0
  19. package/dist/chunk-UYMVUTLV.js.map +1 -0
  20. package/dist/chunk-XID353H7.js +370 -0
  21. package/dist/chunk-XID353H7.js.map +1 -0
  22. package/dist/index.cjs +46 -811
  23. package/dist/index.cjs.map +1 -1
  24. package/dist/index.d.cts +5 -140
  25. package/dist/index.d.ts +5 -140
  26. package/dist/index.js +29 -753
  27. package/dist/index.js.map +1 -1
  28. package/dist/normalize.cjs +8 -0
  29. package/dist/normalize.cjs.map +1 -0
  30. package/dist/normalize.d.cts +33 -0
  31. package/dist/normalize.d.ts +33 -0
  32. package/dist/normalize.js +8 -0
  33. package/dist/normalize.js.map +1 -0
  34. package/dist/parse.cjs +9 -0
  35. package/dist/parse.cjs.map +1 -0
  36. package/dist/parse.d.cts +32 -0
  37. package/dist/parse.d.ts +32 -0
  38. package/dist/parse.js +9 -0
  39. package/dist/parse.js.map +1 -0
  40. package/dist/provider-core-BUaKKLpd.d.cts +53 -0
  41. package/dist/provider-core-BUaKKLpd.d.ts +53 -0
  42. package/dist/providers.cjs +41 -0
  43. package/dist/providers.cjs.map +1 -0
  44. package/dist/providers.d.cts +34 -0
  45. package/dist/providers.d.ts +34 -0
  46. package/dist/providers.js +41 -0
  47. package/dist/providers.js.map +1 -0
  48. package/dist/validate.cjs +10 -0
  49. package/dist/validate.cjs.map +1 -0
  50. package/dist/validate.d.cts +21 -0
  51. package/dist/validate.d.ts +21 -0
  52. package/dist/validate.js +10 -0
  53. package/dist/validate.js.map +1 -0
  54. package/package.json +33 -1
@@ -0,0 +1,176 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});// src/provider-meta.ts
2
+ var PROVIDER_META = [
3
+ { id: "openai", name: "OpenAI", host: "api.openai.com", color: "#10a37f" },
4
+ { id: "anthropic", name: "Anthropic", host: "api.anthropic.com", color: "#e8956a" },
5
+ { id: "google", name: "Google", host: "generativelanguage.googleapis.com", color: "#4285f4" },
6
+ { id: "mistral", name: "Mistral", host: "api.mistral.ai", color: "#ff7000" },
7
+ { id: "cohere", name: "Cohere", host: "api.cohere.com", color: "#39594d" },
8
+ { id: "bedrock", name: "Bedrock", host: "bedrock-runtime.us-east-1.amazonaws.com", color: "#ff9900" },
9
+ { id: "openrouter", name: "OpenRouter", host: "openrouter.ai", color: "#818cf8" },
10
+ { id: "vercel", name: "Vercel", host: "gateway.ai.vercel.app", color: "#ededed" }
11
+ ];
12
+ var MODELS = {
13
+ openai: [
14
+ "gpt-5.2",
15
+ "gpt-5.2-pro",
16
+ "gpt-4.1",
17
+ "gpt-4.1-mini",
18
+ "gpt-4.1-nano",
19
+ "o3",
20
+ "o3-mini",
21
+ "o4-mini",
22
+ "o1-pro"
23
+ ],
24
+ anthropic: [
25
+ "claude-opus-4-6",
26
+ "claude-sonnet-4-6",
27
+ "claude-sonnet-4-5",
28
+ "claude-haiku-4-5"
29
+ ],
30
+ google: [
31
+ "gemini-3-pro-preview",
32
+ "gemini-3-flash-preview",
33
+ "gemini-2.5-pro",
34
+ "gemini-2.5-flash"
35
+ ],
36
+ mistral: [
37
+ "mistral-large-latest",
38
+ "mistral-medium-latest",
39
+ "mistral-small-latest",
40
+ "codestral-latest",
41
+ "magistral-medium-latest"
42
+ ],
43
+ cohere: [
44
+ "command-a-03-2025",
45
+ "command-r-plus-08-2024",
46
+ "command-r-08-2024",
47
+ "command-r7b-12-2024"
48
+ ],
49
+ bedrock: [
50
+ "anthropic.claude-opus-4-6-v1",
51
+ "anthropic.claude-sonnet-4-6-v1",
52
+ "anthropic.claude-haiku-4-5-v1",
53
+ "amazon.nova-pro-v1",
54
+ "amazon.nova-lite-v1",
55
+ "meta.llama3-70b-instruct-v1:0"
56
+ ],
57
+ openrouter: [
58
+ "openai/gpt-5.2",
59
+ "anthropic/claude-opus-4-6",
60
+ "google/gemini-2.5-pro",
61
+ "mistral/mistral-large-latest"
62
+ ],
63
+ vercel: [
64
+ "openai/gpt-5.2",
65
+ "anthropic/claude-opus-4-6",
66
+ "google/gemini-2.5-pro",
67
+ "google/gemini-3-pro-preview",
68
+ "google/gemini-3-flash-preview",
69
+ "mistral/mistral-large-latest",
70
+ "qwen/qwen2.5-pro"
71
+ ]
72
+ };
73
+ var CANONICAL_PARAM_SPECS = {
74
+ openai: {
75
+ temperature: { type: "number", min: 0, max: 2, default: 0.7, description: "Controls randomness" },
76
+ max_tokens: { type: "number", min: 1, default: 4096, description: "Maximum output tokens" },
77
+ top_p: { type: "number", min: 0, max: 1, default: 1, description: "Nucleus sampling" },
78
+ frequency_penalty: { type: "number", min: -2, max: 2, default: 0, description: "Penalize frequent tokens" },
79
+ presence_penalty: { type: "number", min: -2, max: 2, default: 0, description: "Penalize repeated topics" },
80
+ stop: { type: "string", default: "", description: "Stop sequences" },
81
+ n: { type: "number", min: 1, default: 1, description: "Completions count" },
82
+ seed: { type: "number", default: "", description: "Random seed" },
83
+ stream: { type: "boolean", default: false, description: "Stream response" },
84
+ effort: { type: "enum", values: ["none", "minimal", "low", "medium", "high", "xhigh"], default: "medium", description: "Reasoning effort" }
85
+ },
86
+ anthropic: {
87
+ temperature: { type: "number", min: 0, max: 1, default: 0.7, description: "Controls randomness" },
88
+ max_tokens: { type: "number", min: 1, default: 4096, description: "Maximum output tokens" },
89
+ top_p: { type: "number", min: 0, max: 1, default: 1, description: "Nucleus sampling" },
90
+ top_k: { type: "number", min: 0, default: 40, description: "Top-K sampling" },
91
+ stop: { type: "string", default: "", description: "Stop sequences" },
92
+ stream: { type: "boolean", default: false, description: "Stream response" },
93
+ effort: { type: "enum", values: ["low", "medium", "high", "max"], default: "medium", description: "Thinking effort" },
94
+ cache: { type: "enum", values: ["ephemeral"], default: "ephemeral", description: "Cache control" },
95
+ cache_ttl: { type: "enum", values: ["5m", "1h"], default: "5m", description: "Cache TTL" }
96
+ },
97
+ google: {
98
+ temperature: { type: "number", min: 0, max: 2, default: 0.7, description: "Controls randomness" },
99
+ max_tokens: { type: "number", min: 1, default: 4096, description: "Maximum output tokens" },
100
+ top_p: { type: "number", min: 0, max: 1, default: 1, description: "Nucleus sampling" },
101
+ top_k: { type: "number", min: 0, default: 40, description: "Top-K sampling" },
102
+ frequency_penalty: { type: "number", min: -2, max: 2, default: 0, description: "Penalize frequent tokens" },
103
+ presence_penalty: { type: "number", min: -2, max: 2, default: 0, description: "Penalize repeated topics" },
104
+ stop: { type: "string", default: "", description: "Stop sequences" },
105
+ n: { type: "number", min: 1, default: 1, description: "Candidate count" },
106
+ stream: { type: "boolean", default: false, description: "Stream response" },
107
+ seed: { type: "number", default: "", description: "Random seed" }
108
+ },
109
+ mistral: {
110
+ temperature: { type: "number", min: 0, max: 1, default: 0.7, description: "Controls randomness" },
111
+ max_tokens: { type: "number", min: 1, default: 4096, description: "Maximum output tokens" },
112
+ top_p: { type: "number", min: 0, max: 1, default: 1, description: "Nucleus sampling" },
113
+ frequency_penalty: { type: "number", min: -2, max: 2, default: 0, description: "Penalize frequent tokens" },
114
+ presence_penalty: { type: "number", min: -2, max: 2, default: 0, description: "Penalize repeated topics" },
115
+ stop: { type: "string", default: "", description: "Stop sequences" },
116
+ n: { type: "number", min: 1, default: 1, description: "Completions count" },
117
+ seed: { type: "number", default: "", description: "Random seed" },
118
+ stream: { type: "boolean", default: false, description: "Stream response" },
119
+ safe_prompt: { type: "boolean", default: false, description: "Enable safe prompt" },
120
+ min_tokens: { type: "number", min: 0, default: 0, description: "Minimum tokens" }
121
+ },
122
+ cohere: {
123
+ temperature: { type: "number", min: 0, max: 1, default: 0.7, description: "Controls randomness" },
124
+ max_tokens: { type: "number", min: 1, default: 4096, description: "Maximum output tokens" },
125
+ top_p: { type: "number", min: 0, max: 1, default: 1, description: "Nucleus sampling (p)" },
126
+ top_k: { type: "number", min: 0, max: 500, default: 40, description: "Top-K sampling (k)" },
127
+ frequency_penalty: { type: "number", min: 0, max: 1, default: 0, description: "Penalize frequent tokens" },
128
+ presence_penalty: { type: "number", min: 0, max: 1, default: 0, description: "Penalize repeated topics" },
129
+ stop: { type: "string", default: "", description: "Stop sequences" },
130
+ stream: { type: "boolean", default: false, description: "Stream response" },
131
+ seed: { type: "number", default: "", description: "Random seed" }
132
+ },
133
+ bedrock: {
134
+ temperature: { type: "number", min: 0, max: 1, default: 0.7, description: "Controls randomness" },
135
+ max_tokens: { type: "number", min: 1, default: 4096, description: "Maximum output tokens" },
136
+ top_p: { type: "number", min: 0, max: 1, default: 1, description: "Nucleus sampling" },
137
+ top_k: { type: "number", min: 0, default: 40, description: "Top-K sampling" },
138
+ stop: { type: "string", default: "", description: "Stop sequences" },
139
+ stream: { type: "boolean", default: false, description: "Stream response" },
140
+ cache: { type: "enum", values: ["ephemeral"], default: "ephemeral", description: "Cache control" },
141
+ cache_ttl: { type: "enum", values: ["5m", "1h"], default: "5m", description: "Cache TTL" }
142
+ },
143
+ openrouter: {
144
+ temperature: { type: "number", min: 0, max: 2, default: 0.7, description: "Controls randomness" },
145
+ max_tokens: { type: "number", min: 1, default: 4096, description: "Maximum output tokens" },
146
+ top_p: { type: "number", min: 0, max: 1, default: 1, description: "Nucleus sampling" },
147
+ top_k: { type: "number", min: 0, default: 40, description: "Top-K sampling" },
148
+ frequency_penalty: { type: "number", min: -2, max: 2, default: 0, description: "Penalize frequent tokens" },
149
+ presence_penalty: { type: "number", min: -2, max: 2, default: 0, description: "Penalize repeated topics" },
150
+ stop: { type: "string", default: "", description: "Stop sequences" },
151
+ n: { type: "number", min: 1, default: 1, description: "Completions count" },
152
+ seed: { type: "number", default: "", description: "Random seed" },
153
+ stream: { type: "boolean", default: false, description: "Stream response" },
154
+ effort: { type: "enum", values: ["none", "minimal", "low", "medium", "high", "xhigh"], default: "medium", description: "Reasoning effort" }
155
+ },
156
+ vercel: {
157
+ temperature: { type: "number", min: 0, max: 2, default: 0.7, description: "Controls randomness" },
158
+ max_tokens: { type: "number", min: 1, default: 4096, description: "Maximum output tokens" },
159
+ top_p: { type: "number", min: 0, max: 1, default: 1, description: "Nucleus sampling" },
160
+ top_k: { type: "number", min: 0, default: 40, description: "Top-K sampling" },
161
+ frequency_penalty: { type: "number", min: -2, max: 2, default: 0, description: "Penalize frequent tokens" },
162
+ presence_penalty: { type: "number", min: -2, max: 2, default: 0, description: "Penalize repeated topics" },
163
+ stop: { type: "string", default: "", description: "Stop sequences" },
164
+ n: { type: "number", min: 1, default: 1, description: "Completions count" },
165
+ seed: { type: "number", default: "", description: "Random seed" },
166
+ stream: { type: "boolean", default: false, description: "Stream response" },
167
+ effort: { type: "enum", values: ["none", "minimal", "low", "medium", "high", "xhigh"], default: "medium", description: "Reasoning effort" }
168
+ }
169
+ };
170
+
171
+
172
+
173
+
174
+
175
+ exports.PROVIDER_META = PROVIDER_META; exports.MODELS = MODELS; exports.CANONICAL_PARAM_SPECS = CANONICAL_PARAM_SPECS;
176
+ //# sourceMappingURL=chunk-RR3VXIW2.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/dan/code/oss/llm-strings/dist/chunk-RR3VXIW2.cjs","../src/provider-meta.ts"],"names":[],"mappings":"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","file":"/Users/dan/code/oss/llm-strings/dist/chunk-RR3VXIW2.cjs","sourcesContent":[null,"import type { Provider } from \"./provider-core.js\";\n\n/* ------------------------------------------------------------------ */\n/* UI-consumable metadata for 3rd-party integrations */\n/* ------------------------------------------------------------------ */\n\nexport interface ProviderMeta {\n /** Provider identifier — matches the Provider union type. */\n id: Provider;\n /** Human-readable display name. */\n name: string;\n /** Default / canonical API hostname. */\n host: string;\n /** Brand color as a CSS hex value. */\n color: string;\n}\n\nexport const PROVIDER_META: ProviderMeta[] = [\n { id: \"openai\", name: \"OpenAI\", host: \"api.openai.com\", color: \"#10a37f\" },\n { id: \"anthropic\", name: \"Anthropic\", host: \"api.anthropic.com\", color: \"#e8956a\" },\n { id: \"google\", name: \"Google\", host: \"generativelanguage.googleapis.com\", color: \"#4285f4\" },\n { id: \"mistral\", name: \"Mistral\", host: \"api.mistral.ai\", color: \"#ff7000\" },\n { id: \"cohere\", name: \"Cohere\", host: \"api.cohere.com\", color: \"#39594d\" },\n { id: \"bedrock\", name: \"Bedrock\", host: \"bedrock-runtime.us-east-1.amazonaws.com\", color: \"#ff9900\" },\n { id: \"openrouter\", name: \"OpenRouter\", host: \"openrouter.ai\", color: \"#818cf8\" },\n { id: \"vercel\", name: \"Vercel\", host: \"gateway.ai.vercel.app\", color: \"#ededed\" },\n];\n\n/**\n * Suggested / common model IDs per provider, ordered by recency.\n * Not exhaustive — providers add models frequently.\n */\nexport const MODELS: Record<Provider, string[]> = {\n openai: [\n \"gpt-5.2\", \"gpt-5.2-pro\",\n \"gpt-4.1\", \"gpt-4.1-mini\", \"gpt-4.1-nano\",\n \"o3\", \"o3-mini\", \"o4-mini\", \"o1-pro\",\n ],\n anthropic: [\n \"claude-opus-4-6\", \"claude-sonnet-4-6\",\n \"claude-sonnet-4-5\", \"claude-haiku-4-5\",\n ],\n google: [\n \"gemini-3-pro-preview\", \"gemini-3-flash-preview\",\n \"gemini-2.5-pro\", \"gemini-2.5-flash\",\n ],\n mistral: [\n \"mistral-large-latest\", \"mistral-medium-latest\",\n \"mistral-small-latest\", \"codestral-latest\",\n \"magistral-medium-latest\",\n ],\n cohere: [\n \"command-a-03-2025\",\n \"command-r-plus-08-2024\", \"command-r-08-2024\",\n \"command-r7b-12-2024\",\n ],\n bedrock: [\n \"anthropic.claude-opus-4-6-v1\", \"anthropic.claude-sonnet-4-6-v1\",\n \"anthropic.claude-haiku-4-5-v1\",\n \"amazon.nova-pro-v1\", \"amazon.nova-lite-v1\",\n \"meta.llama3-70b-instruct-v1:0\",\n ],\n openrouter: [\n \"openai/gpt-5.2\", \"anthropic/claude-opus-4-6\",\n \"google/gemini-2.5-pro\", \"mistral/mistral-large-latest\",\n ],\n vercel: [\n \"openai/gpt-5.2\", \"anthropic/claude-opus-4-6\",\n \"google/gemini-2.5-pro\", \"google/gemini-3-pro-preview\",\n \"google/gemini-3-flash-preview\", \"mistral/mistral-large-latest\",\n \"qwen/qwen2.5-pro\",\n ],\n};\n\n/**\n * Canonical parameter spec — keyed by canonical (snake_case) param names\n * with defaults and descriptions for UI consumption.\n */\nexport interface CanonicalParamSpec {\n type: \"number\" | \"string\" | \"boolean\" | \"enum\";\n min?: number;\n max?: number;\n values?: string[];\n default?: string | number | boolean;\n description?: string;\n}\n\nexport const CANONICAL_PARAM_SPECS: Record<Provider, Record<string, CanonicalParamSpec>> = {\n openai: {\n temperature: { type: \"number\", min: 0, max: 2, default: 0.7, description: \"Controls randomness\" },\n max_tokens: { type: \"number\", min: 1, default: 4096, description: \"Maximum output tokens\" },\n top_p: { type: \"number\", min: 0, max: 1, default: 1, description: \"Nucleus sampling\" },\n frequency_penalty: { type: \"number\", min: -2, max: 2, default: 0, description: \"Penalize frequent tokens\" },\n presence_penalty: { type: \"number\", min: -2, max: 2, default: 0, description: \"Penalize repeated topics\" },\n stop: { type: \"string\", default: \"\", description: \"Stop sequences\" },\n n: { type: \"number\", min: 1, default: 1, description: \"Completions count\" },\n seed: { type: \"number\", default: \"\", description: \"Random seed\" },\n stream: { type: \"boolean\", default: false, description: \"Stream response\" },\n effort: { type: \"enum\", values: [\"none\", \"minimal\", \"low\", \"medium\", \"high\", \"xhigh\"], default: \"medium\", description: \"Reasoning effort\" },\n },\n anthropic: {\n temperature: { type: \"number\", min: 0, max: 1, default: 0.7, description: \"Controls randomness\" },\n max_tokens: { type: \"number\", min: 1, default: 4096, description: \"Maximum output tokens\" },\n top_p: { type: \"number\", min: 0, max: 1, default: 1, description: \"Nucleus sampling\" },\n top_k: { type: \"number\", min: 0, default: 40, description: \"Top-K sampling\" },\n stop: { type: \"string\", default: \"\", description: \"Stop sequences\" },\n stream: { type: \"boolean\", default: false, description: \"Stream response\" },\n effort: { type: \"enum\", values: [\"low\", \"medium\", \"high\", \"max\"], default: \"medium\", description: \"Thinking effort\" },\n cache: { type: \"enum\", values: [\"ephemeral\"], default: \"ephemeral\", description: \"Cache control\" },\n cache_ttl: { type: \"enum\", values: [\"5m\", \"1h\"], default: \"5m\", description: \"Cache TTL\" },\n },\n google: {\n temperature: { type: \"number\", min: 0, max: 2, default: 0.7, description: \"Controls randomness\" },\n max_tokens: { type: \"number\", min: 1, default: 4096, description: \"Maximum output tokens\" },\n top_p: { type: \"number\", min: 0, max: 1, default: 1, description: \"Nucleus sampling\" },\n top_k: { type: \"number\", min: 0, default: 40, description: \"Top-K sampling\" },\n frequency_penalty: { type: \"number\", min: -2, max: 2, default: 0, description: \"Penalize frequent tokens\" },\n presence_penalty: { type: \"number\", min: -2, max: 2, default: 0, description: \"Penalize repeated topics\" },\n stop: { type: \"string\", default: \"\", description: \"Stop sequences\" },\n n: { type: \"number\", min: 1, default: 1, description: \"Candidate count\" },\n stream: { type: \"boolean\", default: false, description: \"Stream response\" },\n seed: { type: \"number\", default: \"\", description: \"Random seed\" },\n },\n mistral: {\n temperature: { type: \"number\", min: 0, max: 1, default: 0.7, description: \"Controls randomness\" },\n max_tokens: { type: \"number\", min: 1, default: 4096, description: \"Maximum output tokens\" },\n top_p: { type: \"number\", min: 0, max: 1, default: 1, description: \"Nucleus sampling\" },\n frequency_penalty: { type: \"number\", min: -2, max: 2, default: 0, description: \"Penalize frequent tokens\" },\n presence_penalty: { type: \"number\", min: -2, max: 2, default: 0, description: \"Penalize repeated topics\" },\n stop: { type: \"string\", default: \"\", description: \"Stop sequences\" },\n n: { type: \"number\", min: 1, default: 1, description: \"Completions count\" },\n seed: { type: \"number\", default: \"\", description: \"Random seed\" },\n stream: { type: \"boolean\", default: false, description: \"Stream response\" },\n safe_prompt: { type: \"boolean\", default: false, description: \"Enable safe prompt\" },\n min_tokens: { type: \"number\", min: 0, default: 0, description: \"Minimum tokens\" },\n },\n cohere: {\n temperature: { type: \"number\", min: 0, max: 1, default: 0.7, description: \"Controls randomness\" },\n max_tokens: { type: \"number\", min: 1, default: 4096, description: \"Maximum output tokens\" },\n top_p: { type: \"number\", min: 0, max: 1, default: 1, description: \"Nucleus sampling (p)\" },\n top_k: { type: \"number\", min: 0, max: 500, default: 40, description: \"Top-K sampling (k)\" },\n frequency_penalty: { type: \"number\", min: 0, max: 1, default: 0, description: \"Penalize frequent tokens\" },\n presence_penalty: { type: \"number\", min: 0, max: 1, default: 0, description: \"Penalize repeated topics\" },\n stop: { type: \"string\", default: \"\", description: \"Stop sequences\" },\n stream: { type: \"boolean\", default: false, description: \"Stream response\" },\n seed: { type: \"number\", default: \"\", description: \"Random seed\" },\n },\n bedrock: {\n temperature: { type: \"number\", min: 0, max: 1, default: 0.7, description: \"Controls randomness\" },\n max_tokens: { type: \"number\", min: 1, default: 4096, description: \"Maximum output tokens\" },\n top_p: { type: \"number\", min: 0, max: 1, default: 1, description: \"Nucleus sampling\" },\n top_k: { type: \"number\", min: 0, default: 40, description: \"Top-K sampling\" },\n stop: { type: \"string\", default: \"\", description: \"Stop sequences\" },\n stream: { type: \"boolean\", default: false, description: \"Stream response\" },\n cache: { type: \"enum\", values: [\"ephemeral\"], default: \"ephemeral\", description: \"Cache control\" },\n cache_ttl: { type: \"enum\", values: [\"5m\", \"1h\"], default: \"5m\", description: \"Cache TTL\" },\n },\n openrouter: {\n temperature: { type: \"number\", min: 0, max: 2, default: 0.7, description: \"Controls randomness\" },\n max_tokens: { type: \"number\", min: 1, default: 4096, description: \"Maximum output tokens\" },\n top_p: { type: \"number\", min: 0, max: 1, default: 1, description: \"Nucleus sampling\" },\n top_k: { type: \"number\", min: 0, default: 40, description: \"Top-K sampling\" },\n frequency_penalty: { type: \"number\", min: -2, max: 2, default: 0, description: \"Penalize frequent tokens\" },\n presence_penalty: { type: \"number\", min: -2, max: 2, default: 0, description: \"Penalize repeated topics\" },\n stop: { type: \"string\", default: \"\", description: \"Stop sequences\" },\n n: { type: \"number\", min: 1, default: 1, description: \"Completions count\" },\n seed: { type: \"number\", default: \"\", description: \"Random seed\" },\n stream: { type: \"boolean\", default: false, description: \"Stream response\" },\n effort: { type: \"enum\", values: [\"none\", \"minimal\", \"low\", \"medium\", \"high\", \"xhigh\"], default: \"medium\", description: \"Reasoning effort\" },\n },\n vercel: {\n temperature: { type: \"number\", min: 0, max: 2, default: 0.7, description: \"Controls randomness\" },\n max_tokens: { type: \"number\", min: 1, default: 4096, description: \"Maximum output tokens\" },\n top_p: { type: \"number\", min: 0, max: 1, default: 1, description: \"Nucleus sampling\" },\n top_k: { type: \"number\", min: 0, default: 40, description: \"Top-K sampling\" },\n frequency_penalty: { type: \"number\", min: -2, max: 2, default: 0, description: \"Penalize frequent tokens\" },\n presence_penalty: { type: \"number\", min: -2, max: 2, default: 0, description: \"Penalize repeated topics\" },\n stop: { type: \"string\", default: \"\", description: \"Stop sequences\" },\n n: { type: \"number\", min: 1, default: 1, description: \"Completions count\" },\n seed: { type: \"number\", default: \"\", description: \"Random seed\" },\n stream: { type: \"boolean\", default: false, description: \"Stream response\" },\n effort: { type: \"enum\", values: [\"none\", \"minimal\", \"low\", \"medium\", \"high\", \"xhigh\"], default: \"medium\", description: \"Reasoning effort\" },\n },\n};\n"]}
@@ -0,0 +1,180 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
2
+
3
+ var _chunkMGWGNZDJcjs = require('./chunk-MGWGNZDJ.cjs');
4
+
5
+
6
+ var _chunkN6NVBE43cjs = require('./chunk-N6NVBE43.cjs');
7
+
8
+
9
+
10
+
11
+
12
+
13
+
14
+
15
+ var _chunkNSCBY4VDcjs = require('./chunk-NSCBY4VD.cjs');
16
+
17
+ // src/validate.ts
18
+ function buildReverseParamMap(provider) {
19
+ const map = {};
20
+ for (const [canonical, specific] of Object.entries(
21
+ _chunkNSCBY4VDcjs.PROVIDER_PARAMS[provider]
22
+ )) {
23
+ map[specific] = canonical;
24
+ }
25
+ return map;
26
+ }
27
+ function lookupSubProviderSpec(gatewayParamName, gatewayReverseMap, subProvider) {
28
+ const canonical = _nullishCoalesce(gatewayReverseMap[gatewayParamName], () => ( gatewayParamName));
29
+ const subProviderKey = _optionalChain([_chunkNSCBY4VDcjs.PROVIDER_PARAMS, 'access', _ => _[subProvider], 'optionalAccess', _2 => _2[canonical]]);
30
+ if (!subProviderKey) return { spec: void 0, canonical };
31
+ return { spec: _optionalChain([_chunkNSCBY4VDcjs.PARAM_SPECS, 'access', _3 => _3[subProvider], 'optionalAccess', _4 => _4[subProviderKey]]), canonical };
32
+ }
33
+ function buildSubProviderKnownParams(gateway, subProvider) {
34
+ const known = /* @__PURE__ */ new Set();
35
+ const subProviderCanonicals = new Set(
36
+ Object.keys(_chunkNSCBY4VDcjs.PROVIDER_PARAMS[subProvider])
37
+ );
38
+ for (const [canonical, gatewaySpecific] of Object.entries(
39
+ _chunkNSCBY4VDcjs.PROVIDER_PARAMS[gateway]
40
+ )) {
41
+ if (subProviderCanonicals.has(canonical)) {
42
+ known.add(gatewaySpecific);
43
+ }
44
+ }
45
+ return known;
46
+ }
47
+ function validate(connectionString, options = {}) {
48
+ const parsed = _chunkN6NVBE43cjs.parse.call(void 0, connectionString);
49
+ const { config, provider, subProvider } = _chunkMGWGNZDJcjs.normalize.call(void 0, parsed);
50
+ const issues = [];
51
+ if (!provider) {
52
+ issues.push({
53
+ param: "host",
54
+ value: config.host,
55
+ message: `Unknown provider for host "${config.host}". Validation skipped.`,
56
+ severity: options.strict ? "error" : "warning"
57
+ });
58
+ return issues;
59
+ }
60
+ const effectiveProvider = _nullishCoalesce(subProvider, () => ( provider));
61
+ const specs = _chunkNSCBY4VDcjs.PARAM_SPECS[effectiveProvider];
62
+ const gatewayReverseMap = subProvider ? buildReverseParamMap(provider) : void 0;
63
+ const knownParams = subProvider ? buildSubProviderKnownParams(provider, subProvider) : new Set(Object.values(_chunkNSCBY4VDcjs.PROVIDER_PARAMS[provider]));
64
+ for (const [key, value] of Object.entries(config.params)) {
65
+ if (_chunkNSCBY4VDcjs.canHostOpenAIModels.call(void 0, provider) && _chunkNSCBY4VDcjs.isReasoningModel.call(void 0, config.model) && _chunkNSCBY4VDcjs.REASONING_MODEL_UNSUPPORTED.has(key)) {
66
+ issues.push({
67
+ param: key,
68
+ value,
69
+ message: `"${key}" is not supported by OpenAI reasoning model "${config.model}". Use "reasoning_effort" instead of temperature for controlling output.`,
70
+ severity: "error"
71
+ });
72
+ continue;
73
+ }
74
+ if (provider === "bedrock") {
75
+ const family = _chunkNSCBY4VDcjs.detectBedrockModelFamily.call(void 0, config.model);
76
+ if (key === "topK" && family && family !== "anthropic" && family !== "cohere" && family !== "mistral") {
77
+ issues.push({
78
+ param: key,
79
+ value,
80
+ message: `"topK" is not supported by ${family} models on Bedrock.`,
81
+ severity: "error"
82
+ });
83
+ continue;
84
+ }
85
+ if (key === "cache_control" && !_chunkNSCBY4VDcjs.bedrockSupportsCaching.call(void 0, config.model)) {
86
+ issues.push({
87
+ param: key,
88
+ value,
89
+ message: `Prompt caching is only supported for Anthropic Claude and Amazon Nova models on Bedrock, not ${_nullishCoalesce(family, () => ( "unknown"))} models.`,
90
+ severity: "error"
91
+ });
92
+ continue;
93
+ }
94
+ }
95
+ if (!knownParams.has(key) && !specs[key]) {
96
+ issues.push({
97
+ param: key,
98
+ value,
99
+ message: `Unknown param "${key}" for ${effectiveProvider}.`,
100
+ severity: options.strict ? "error" : "warning"
101
+ });
102
+ continue;
103
+ }
104
+ let spec = specs[key];
105
+ if (subProvider && gatewayReverseMap && !spec) {
106
+ const result = lookupSubProviderSpec(
107
+ key,
108
+ gatewayReverseMap,
109
+ subProvider
110
+ );
111
+ spec = result.spec;
112
+ }
113
+ if (!spec) continue;
114
+ if ((effectiveProvider === "anthropic" || provider === "bedrock" && _chunkNSCBY4VDcjs.detectBedrockModelFamily.call(void 0, config.model) === "anthropic") && (key === "temperature" || key === "top_p" || key === "topP")) {
115
+ const otherKey = key === "temperature" ? provider === "bedrock" ? "topP" : "top_p" : "temperature";
116
+ if (key === "temperature" && config.params[otherKey] !== void 0) {
117
+ issues.push({
118
+ param: key,
119
+ value,
120
+ message: `Cannot specify both "temperature" and "${otherKey}" for Anthropic models.`,
121
+ severity: "error"
122
+ });
123
+ }
124
+ }
125
+ if (spec.type === "number") {
126
+ const num = Number(value);
127
+ if (isNaN(num)) {
128
+ issues.push({
129
+ param: key,
130
+ value,
131
+ message: `"${key}" should be a number, got "${value}".`,
132
+ severity: "error"
133
+ });
134
+ continue;
135
+ }
136
+ if (spec.min !== void 0 && num < spec.min) {
137
+ issues.push({
138
+ param: key,
139
+ value,
140
+ message: `"${key}" must be >= ${spec.min}, got ${num}.`,
141
+ severity: "error"
142
+ });
143
+ }
144
+ if (spec.max !== void 0 && num > spec.max) {
145
+ issues.push({
146
+ param: key,
147
+ value,
148
+ message: `"${key}" must be <= ${spec.max}, got ${num}.`,
149
+ severity: "error"
150
+ });
151
+ }
152
+ }
153
+ if (spec.type === "boolean") {
154
+ if (!["true", "false", "0", "1"].includes(value)) {
155
+ issues.push({
156
+ param: key,
157
+ value,
158
+ message: `"${key}" should be a boolean (true/false), got "${value}".`,
159
+ severity: "error"
160
+ });
161
+ }
162
+ }
163
+ if (spec.type === "string" && spec.values) {
164
+ if (!spec.values.includes(value)) {
165
+ issues.push({
166
+ param: key,
167
+ value,
168
+ message: `"${key}" must be one of [${spec.values.join(", ")}], got "${value}".`,
169
+ severity: "error"
170
+ });
171
+ }
172
+ }
173
+ }
174
+ return issues;
175
+ }
176
+
177
+
178
+
179
+ exports.validate = validate;
180
+ //# sourceMappingURL=chunk-RSUXM42X.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/dan/code/oss/llm-strings/dist/chunk-RSUXM42X.cjs","../src/validate.ts"],"names":[],"mappings":"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","file":"/Users/dan/code/oss/llm-strings/dist/chunk-RSUXM42X.cjs","sourcesContent":[null,"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(\n provider: Provider,\n): 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(\n key,\n gatewayReverseMap,\n subProvider,\n );\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"]}
@@ -0,0 +1,180 @@
1
+ import {
2
+ normalize
3
+ } from "./chunk-MPIHGH6L.js";
4
+ import {
5
+ parse
6
+ } from "./chunk-FCEV23OT.js";
7
+ import {
8
+ PARAM_SPECS,
9
+ PROVIDER_PARAMS,
10
+ REASONING_MODEL_UNSUPPORTED,
11
+ bedrockSupportsCaching,
12
+ canHostOpenAIModels,
13
+ detectBedrockModelFamily,
14
+ isReasoningModel
15
+ } from "./chunk-XID353H7.js";
16
+
17
+ // src/validate.ts
18
+ function buildReverseParamMap(provider) {
19
+ const map = {};
20
+ for (const [canonical, specific] of Object.entries(
21
+ PROVIDER_PARAMS[provider]
22
+ )) {
23
+ map[specific] = canonical;
24
+ }
25
+ return map;
26
+ }
27
+ function lookupSubProviderSpec(gatewayParamName, gatewayReverseMap, subProvider) {
28
+ const canonical = gatewayReverseMap[gatewayParamName] ?? gatewayParamName;
29
+ const subProviderKey = PROVIDER_PARAMS[subProvider]?.[canonical];
30
+ if (!subProviderKey) return { spec: void 0, canonical };
31
+ return { spec: PARAM_SPECS[subProvider]?.[subProviderKey], canonical };
32
+ }
33
+ function buildSubProviderKnownParams(gateway, subProvider) {
34
+ const known = /* @__PURE__ */ new Set();
35
+ const subProviderCanonicals = new Set(
36
+ Object.keys(PROVIDER_PARAMS[subProvider])
37
+ );
38
+ for (const [canonical, gatewaySpecific] of Object.entries(
39
+ PROVIDER_PARAMS[gateway]
40
+ )) {
41
+ if (subProviderCanonicals.has(canonical)) {
42
+ known.add(gatewaySpecific);
43
+ }
44
+ }
45
+ return known;
46
+ }
47
+ function validate(connectionString, options = {}) {
48
+ const parsed = parse(connectionString);
49
+ const { config, provider, subProvider } = normalize(parsed);
50
+ const issues = [];
51
+ if (!provider) {
52
+ issues.push({
53
+ param: "host",
54
+ value: config.host,
55
+ message: `Unknown provider for host "${config.host}". Validation skipped.`,
56
+ severity: options.strict ? "error" : "warning"
57
+ });
58
+ return issues;
59
+ }
60
+ const effectiveProvider = subProvider ?? provider;
61
+ const specs = PARAM_SPECS[effectiveProvider];
62
+ const gatewayReverseMap = subProvider ? buildReverseParamMap(provider) : void 0;
63
+ const knownParams = subProvider ? buildSubProviderKnownParams(provider, subProvider) : new Set(Object.values(PROVIDER_PARAMS[provider]));
64
+ for (const [key, value] of Object.entries(config.params)) {
65
+ if (canHostOpenAIModels(provider) && isReasoningModel(config.model) && REASONING_MODEL_UNSUPPORTED.has(key)) {
66
+ issues.push({
67
+ param: key,
68
+ value,
69
+ message: `"${key}" is not supported by OpenAI reasoning model "${config.model}". Use "reasoning_effort" instead of temperature for controlling output.`,
70
+ severity: "error"
71
+ });
72
+ continue;
73
+ }
74
+ if (provider === "bedrock") {
75
+ const family = detectBedrockModelFamily(config.model);
76
+ if (key === "topK" && family && family !== "anthropic" && family !== "cohere" && family !== "mistral") {
77
+ issues.push({
78
+ param: key,
79
+ value,
80
+ message: `"topK" is not supported by ${family} models on Bedrock.`,
81
+ severity: "error"
82
+ });
83
+ continue;
84
+ }
85
+ if (key === "cache_control" && !bedrockSupportsCaching(config.model)) {
86
+ issues.push({
87
+ param: key,
88
+ value,
89
+ message: `Prompt caching is only supported for Anthropic Claude and Amazon Nova models on Bedrock, not ${family ?? "unknown"} models.`,
90
+ severity: "error"
91
+ });
92
+ continue;
93
+ }
94
+ }
95
+ if (!knownParams.has(key) && !specs[key]) {
96
+ issues.push({
97
+ param: key,
98
+ value,
99
+ message: `Unknown param "${key}" for ${effectiveProvider}.`,
100
+ severity: options.strict ? "error" : "warning"
101
+ });
102
+ continue;
103
+ }
104
+ let spec = specs[key];
105
+ if (subProvider && gatewayReverseMap && !spec) {
106
+ const result = lookupSubProviderSpec(
107
+ key,
108
+ gatewayReverseMap,
109
+ subProvider
110
+ );
111
+ spec = result.spec;
112
+ }
113
+ if (!spec) continue;
114
+ if ((effectiveProvider === "anthropic" || provider === "bedrock" && detectBedrockModelFamily(config.model) === "anthropic") && (key === "temperature" || key === "top_p" || key === "topP")) {
115
+ const otherKey = key === "temperature" ? provider === "bedrock" ? "topP" : "top_p" : "temperature";
116
+ if (key === "temperature" && config.params[otherKey] !== void 0) {
117
+ issues.push({
118
+ param: key,
119
+ value,
120
+ message: `Cannot specify both "temperature" and "${otherKey}" for Anthropic models.`,
121
+ severity: "error"
122
+ });
123
+ }
124
+ }
125
+ if (spec.type === "number") {
126
+ const num = Number(value);
127
+ if (isNaN(num)) {
128
+ issues.push({
129
+ param: key,
130
+ value,
131
+ message: `"${key}" should be a number, got "${value}".`,
132
+ severity: "error"
133
+ });
134
+ continue;
135
+ }
136
+ if (spec.min !== void 0 && num < spec.min) {
137
+ issues.push({
138
+ param: key,
139
+ value,
140
+ message: `"${key}" must be >= ${spec.min}, got ${num}.`,
141
+ severity: "error"
142
+ });
143
+ }
144
+ if (spec.max !== void 0 && num > spec.max) {
145
+ issues.push({
146
+ param: key,
147
+ value,
148
+ message: `"${key}" must be <= ${spec.max}, got ${num}.`,
149
+ severity: "error"
150
+ });
151
+ }
152
+ }
153
+ if (spec.type === "boolean") {
154
+ if (!["true", "false", "0", "1"].includes(value)) {
155
+ issues.push({
156
+ param: key,
157
+ value,
158
+ message: `"${key}" should be a boolean (true/false), got "${value}".`,
159
+ severity: "error"
160
+ });
161
+ }
162
+ }
163
+ if (spec.type === "string" && spec.values) {
164
+ if (!spec.values.includes(value)) {
165
+ issues.push({
166
+ param: key,
167
+ value,
168
+ message: `"${key}" must be one of [${spec.values.join(", ")}], got "${value}".`,
169
+ severity: "error"
170
+ });
171
+ }
172
+ }
173
+ }
174
+ return issues;
175
+ }
176
+
177
+ export {
178
+ validate
179
+ };
180
+ //# sourceMappingURL=chunk-UYMVUTLV.js.map