@llmgateway/models 0.0.1

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 (112) hide show
  1. package/dist/get-cheapest-from-available-providers.d.ts +30 -0
  2. package/dist/get-cheapest-from-available-providers.js +183 -0
  3. package/dist/get-cheapest-from-available-providers.js.map +1 -0
  4. package/dist/get-cheapest-model-for-provider.d.ts +2 -0
  5. package/dist/get-cheapest-model-for-provider.js +49 -0
  6. package/dist/get-cheapest-model-for-provider.js.map +1 -0
  7. package/dist/get-provider-endpoint.d.ts +3 -0
  8. package/dist/get-provider-endpoint.js +243 -0
  9. package/dist/get-provider-endpoint.js.map +1 -0
  10. package/dist/get-provider-headers.d.ts +5 -0
  11. package/dist/get-provider-headers.js +45 -0
  12. package/dist/get-provider-headers.js.map +1 -0
  13. package/dist/helpers.d.ts +1 -0
  14. package/dist/helpers.js +27 -0
  15. package/dist/helpers.js.map +1 -0
  16. package/dist/index.d.ts +16 -0
  17. package/dist/index.js +17 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/models/alibaba.d.ts +686 -0
  20. package/dist/models/alibaba.js +789 -0
  21. package/dist/models/alibaba.js.map +1 -0
  22. package/dist/models/anthropic.d.ts +572 -0
  23. package/dist/models/anthropic.js +638 -0
  24. package/dist/models/anthropic.js.map +1 -0
  25. package/dist/models/aws-bedrock.d.ts +1 -0
  26. package/dist/models/aws-bedrock.js +2 -0
  27. package/dist/models/aws-bedrock.js.map +1 -0
  28. package/dist/models/bytedance.d.ts +131 -0
  29. package/dist/models/bytedance.js +151 -0
  30. package/dist/models/bytedance.js.map +1 -0
  31. package/dist/models/deepseek.d.ts +175 -0
  32. package/dist/models/deepseek.js +197 -0
  33. package/dist/models/deepseek.js.map +1 -0
  34. package/dist/models/google.d.ts +1065 -0
  35. package/dist/models/google.js +1201 -0
  36. package/dist/models/google.js.map +1 -0
  37. package/dist/models/llmgateway.d.ts +39 -0
  38. package/dist/models/llmgateway.js +59 -0
  39. package/dist/models/llmgateway.js.map +1 -0
  40. package/dist/models/meta.d.ts +263 -0
  41. package/dist/models/meta.js +300 -0
  42. package/dist/models/meta.js.map +1 -0
  43. package/dist/models/microsoft.d.ts +1 -0
  44. package/dist/models/microsoft.js +2 -0
  45. package/dist/models/microsoft.js.map +1 -0
  46. package/dist/models/minimax.d.ts +59 -0
  47. package/dist/models/minimax.js +68 -0
  48. package/dist/models/minimax.js.map +1 -0
  49. package/dist/models/mistral.d.ts +78 -0
  50. package/dist/models/mistral.js +92 -0
  51. package/dist/models/mistral.js.map +1 -0
  52. package/dist/models/moonshot.d.ts +165 -0
  53. package/dist/models/moonshot.js +184 -0
  54. package/dist/models/moonshot.js.map +1 -0
  55. package/dist/models/nousresearch.d.ts +21 -0
  56. package/dist/models/nousresearch.js +26 -0
  57. package/dist/models/nousresearch.js.map +1 -0
  58. package/dist/models/openai.d.ts +1018 -0
  59. package/dist/models/openai.js +1213 -0
  60. package/dist/models/openai.js.map +1 -0
  61. package/dist/models/perplexity.d.ts +67 -0
  62. package/dist/models/perplexity.js +78 -0
  63. package/dist/models/perplexity.js.map +1 -0
  64. package/dist/models/routeway.d.ts +161 -0
  65. package/dist/models/routeway.js +187 -0
  66. package/dist/models/routeway.js.map +1 -0
  67. package/dist/models/xai.d.ts +270 -0
  68. package/dist/models/xai.js +311 -0
  69. package/dist/models/xai.js.map +1 -0
  70. package/dist/models/zai.d.ts +492 -0
  71. package/dist/models/zai.js +551 -0
  72. package/dist/models/zai.js.map +1 -0
  73. package/dist/models.d.ts +5304 -0
  74. package/dist/models.js +37 -0
  75. package/dist/models.js.map +1 -0
  76. package/dist/models.spec.d.ts +1 -0
  77. package/dist/models.spec.js +263 -0
  78. package/dist/models.spec.js.map +1 -0
  79. package/dist/prepare-request-body.d.ts +10 -0
  80. package/dist/prepare-request-body.js +1081 -0
  81. package/dist/prepare-request-body.js.map +1 -0
  82. package/dist/prepare-request-body.spec.d.ts +1 -0
  83. package/dist/prepare-request-body.spec.js +231 -0
  84. package/dist/prepare-request-body.spec.js.map +1 -0
  85. package/dist/process-image-url.d.ts +4 -0
  86. package/dist/process-image-url.js +121 -0
  87. package/dist/process-image-url.js.map +1 -0
  88. package/dist/provider.d.ts +9 -0
  89. package/dist/provider.js +64 -0
  90. package/dist/provider.js.map +1 -0
  91. package/dist/providers.d.ts +405 -0
  92. package/dist/providers.js +413 -0
  93. package/dist/providers.js.map +1 -0
  94. package/dist/testing.d.ts +7 -0
  95. package/dist/testing.js +19 -0
  96. package/dist/testing.js.map +1 -0
  97. package/dist/transform-anthropic-messages.d.ts +2 -0
  98. package/dist/transform-anthropic-messages.js +185 -0
  99. package/dist/transform-anthropic-messages.js.map +1 -0
  100. package/dist/transform-google-messages.d.ts +25 -0
  101. package/dist/transform-google-messages.js +122 -0
  102. package/dist/transform-google-messages.js.map +1 -0
  103. package/dist/type-guards.d.ts +20 -0
  104. package/dist/type-guards.js +35 -0
  105. package/dist/type-guards.js.map +1 -0
  106. package/dist/types.d.ts +291 -0
  107. package/dist/types.js +28 -0
  108. package/dist/types.js.map +1 -0
  109. package/dist/validate-provider-key.d.ts +4 -0
  110. package/dist/validate-provider-key.js +113 -0
  111. package/dist/validate-provider-key.js.map +1 -0
  112. package/package.json +29 -0
@@ -0,0 +1,25 @@
1
+ import { type BaseMessage } from "./types.js";
2
+ interface GooglePart {
3
+ text?: string;
4
+ thoughtSignature?: string;
5
+ inline_data?: {
6
+ mime_type: string;
7
+ data: string;
8
+ };
9
+ functionCall?: {
10
+ name: string;
11
+ args: Record<string, unknown>;
12
+ };
13
+ functionResponse?: {
14
+ name: string;
15
+ response: {
16
+ result: unknown;
17
+ };
18
+ };
19
+ }
20
+ interface GoogleMessageExtended {
21
+ role: "user" | "model";
22
+ parts: GooglePart[];
23
+ }
24
+ export declare function transformGoogleMessages(messages: BaseMessage[], isProd?: boolean, maxImageSizeMB?: number, userPlan?: "free" | "pro" | null, thoughtSignatureCache?: Map<string, string>): Promise<GoogleMessageExtended[]>;
25
+ export {};
@@ -0,0 +1,122 @@
1
+ import { processImageUrl } from "./process-image-url.js";
2
+ import { isImageUrlContent, isTextContent } from "./types.js";
3
+ export async function transformGoogleMessages(messages, isProd = false, maxImageSizeMB = 20, userPlan = null, thoughtSignatureCache) {
4
+ const result = [];
5
+ for (const m of messages) {
6
+ if (m.role === "tool") {
7
+ const lastMsg = result[result.length - 1];
8
+ const functionResponsePart = {
9
+ functionResponse: {
10
+ name: m.name || "unknown_function",
11
+ response: {
12
+ result: m.content,
13
+ },
14
+ },
15
+ };
16
+ if (lastMsg && lastMsg.role === "user") {
17
+ lastMsg.parts.push(functionResponsePart);
18
+ }
19
+ else {
20
+ result.push({
21
+ role: "user",
22
+ parts: [functionResponsePart],
23
+ });
24
+ }
25
+ continue;
26
+ }
27
+ if (m.role === "assistant" && m.tool_calls && m.tool_calls.length > 0) {
28
+ const parts = [];
29
+ if (m.content) {
30
+ if (Array.isArray(m.content)) {
31
+ for (const content of m.content) {
32
+ if (isTextContent(content)) {
33
+ const textPart = { text: content.text };
34
+ const extraContent = content.extra_content;
35
+ if (extraContent?.google?.thought_signature) {
36
+ textPart.thoughtSignature =
37
+ extraContent.google.thought_signature;
38
+ }
39
+ parts.push(textPart);
40
+ }
41
+ }
42
+ }
43
+ else if (typeof m.content === "string" && m.content) {
44
+ parts.push({ text: m.content });
45
+ }
46
+ }
47
+ for (const toolCall of m.tool_calls) {
48
+ if (toolCall.type === "function") {
49
+ let args = {};
50
+ try {
51
+ args = JSON.parse(toolCall.function.arguments || "{}");
52
+ }
53
+ catch {
54
+ args = {};
55
+ }
56
+ const functionCallPart = {
57
+ functionCall: {
58
+ name: toolCall.function.name,
59
+ args,
60
+ },
61
+ };
62
+ const extraContent = toolCall.extra_content;
63
+ if (extraContent?.google?.thought_signature) {
64
+ functionCallPart.thoughtSignature =
65
+ extraContent.google.thought_signature;
66
+ }
67
+ else if (thoughtSignatureCache && toolCall.id) {
68
+ const cachedSignature = thoughtSignatureCache.get(toolCall.id);
69
+ if (cachedSignature) {
70
+ functionCallPart.thoughtSignature = cachedSignature;
71
+ }
72
+ }
73
+ parts.push(functionCallPart);
74
+ }
75
+ }
76
+ result.push({
77
+ role: "model",
78
+ parts,
79
+ });
80
+ continue;
81
+ }
82
+ const role = m.role === "assistant" ? "model" : "user";
83
+ const parts = [];
84
+ if (Array.isArray(m.content)) {
85
+ for (const content of m.content) {
86
+ if (isTextContent(content)) {
87
+ const textPart = { text: content.text };
88
+ const extraContent = content.extra_content;
89
+ if (extraContent?.google?.thought_signature) {
90
+ textPart.thoughtSignature = extraContent.google.thought_signature;
91
+ }
92
+ parts.push(textPart);
93
+ }
94
+ else if (isImageUrlContent(content)) {
95
+ const imageUrl = content.image_url.url;
96
+ try {
97
+ const { data, mimeType } = await processImageUrl(imageUrl, isProd, maxImageSizeMB, userPlan);
98
+ parts.push({
99
+ inline_data: {
100
+ mime_type: mimeType,
101
+ data: data,
102
+ },
103
+ });
104
+ }
105
+ catch (error) {
106
+ const errorMsg = error instanceof Error ? error.message : "Unknown error";
107
+ throw new Error(`Failed to process image: ${errorMsg}`);
108
+ }
109
+ }
110
+ else {
111
+ throw new Error(`Not supported content type yet: ${content.type}`);
112
+ }
113
+ }
114
+ }
115
+ else {
116
+ parts.push({ text: m.content });
117
+ }
118
+ result.push({ role, parts });
119
+ }
120
+ return result;
121
+ }
122
+ //# sourceMappingURL=transform-google-messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transform-google-messages.js","sourceRoot":"","sources":["../src/transform-google-messages.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { ProviderModelMapping } from "./models.js";
2
+ export declare function isProviderModelMapping(obj: unknown): obj is ProviderModelMapping;
3
+ export declare function isReasoningProvider(provider: ProviderModelMapping): provider is ProviderModelMapping & {
4
+ reasoning: true;
5
+ };
6
+ export declare function hasErrorCode(error: unknown): error is {
7
+ code: string;
8
+ };
9
+ export declare function hasMessageProperty(obj: unknown): obj is {
10
+ message: string;
11
+ };
12
+ export declare function isReactElementWithProps(obj: unknown): obj is {
13
+ props: {
14
+ children?: string;
15
+ className?: string;
16
+ };
17
+ };
18
+ export declare function hasToolResults(metadata: unknown): metadata is {
19
+ toolResults: any;
20
+ };
@@ -0,0 +1,35 @@
1
+ export function isProviderModelMapping(obj) {
2
+ return (typeof obj === "object" &&
3
+ obj !== null &&
4
+ "providerId" in obj &&
5
+ "modelName" in obj &&
6
+ typeof obj.providerId === "string" &&
7
+ typeof obj.modelName === "string");
8
+ }
9
+ export function isReasoningProvider(provider) {
10
+ return provider.reasoning === true;
11
+ }
12
+ export function hasErrorCode(error) {
13
+ return (error !== null &&
14
+ typeof error === "object" &&
15
+ "code" in error &&
16
+ typeof error.code === "string");
17
+ }
18
+ export function hasMessageProperty(obj) {
19
+ return (typeof obj === "object" &&
20
+ obj !== null &&
21
+ "message" in obj &&
22
+ typeof obj.message === "string");
23
+ }
24
+ export function isReactElementWithProps(obj) {
25
+ return (typeof obj === "object" &&
26
+ obj !== null &&
27
+ "props" in obj &&
28
+ typeof obj.props === "object");
29
+ }
30
+ export function hasToolResults(metadata) {
31
+ return (typeof metadata === "object" &&
32
+ metadata !== null &&
33
+ "toolResults" in metadata);
34
+ }
35
+ //# sourceMappingURL=type-guards.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"type-guards.js","sourceRoot":"","sources":["../src/type-guards.ts"],"names":[],"mappings":"AAUA,MAAM,UAAU,sBAAsB,CACrC,GAAY;IAEZ,OAAO,CACN,OAAO,GAAG,KAAK,QAAQ;QACvB,GAAG,KAAK,IAAI;QACZ,YAAY,IAAI,GAAG;QACnB,WAAW,IAAI,GAAG;QAClB,OAAQ,GAAW,CAAC,UAAU,KAAK,QAAQ;QAC3C,OAAQ,GAAW,CAAC,SAAS,KAAK,QAAQ,CAC1C,CAAC;AACH,CAAC;AAKD,MAAM,UAAU,mBAAmB,CAClC,QAA8B;IAE9B,OAAO,QAAQ,CAAC,SAAS,KAAK,IAAI,CAAC;AACpC,CAAC;AAKD,MAAM,UAAU,YAAY,CAAC,KAAc;IAC1C,OAAO,CACN,KAAK,KAAK,IAAI;QACd,OAAO,KAAK,KAAK,QAAQ;QACzB,MAAM,IAAI,KAAK;QACf,OAAQ,KAAa,CAAC,IAAI,KAAK,QAAQ,CACvC,CAAC;AACH,CAAC;AAKD,MAAM,UAAU,kBAAkB,CAAC,GAAY;IAC9C,OAAO,CACN,OAAO,GAAG,KAAK,QAAQ;QACvB,GAAG,KAAK,IAAI;QACZ,SAAS,IAAI,GAAG;QAChB,OAAQ,GAAW,CAAC,OAAO,KAAK,QAAQ,CACxC,CAAC;AACH,CAAC;AAKD,MAAM,UAAU,uBAAuB,CACtC,GAAY;IAEZ,OAAO,CACN,OAAO,GAAG,KAAK,QAAQ;QACvB,GAAG,KAAK,IAAI;QACZ,OAAO,IAAI,GAAG;QACd,OAAQ,GAAW,CAAC,KAAK,KAAK,QAAQ,CACtC,CAAC;AACH,CAAC;AAKD,MAAM,UAAU,cAAc,CAC7B,QAAiB;IAEjB,OAAO,CACN,OAAO,QAAQ,KAAK,QAAQ;QAC5B,QAAQ,KAAK,IAAI;QACjB,aAAa,IAAI,QAAQ,CACzB,CAAC;AACH,CAAC"}
@@ -0,0 +1,291 @@
1
+ import type { ProviderId } from "./providers.js";
2
+ export interface TextContent {
3
+ type: "text";
4
+ text: string;
5
+ cache_control?: {
6
+ type: "ephemeral";
7
+ };
8
+ }
9
+ export interface ImageUrlContent {
10
+ type: "image_url";
11
+ image_url: {
12
+ url: string;
13
+ detail?: "low" | "high" | "auto";
14
+ };
15
+ }
16
+ export interface ImageContent {
17
+ type: "image";
18
+ source: {
19
+ type: "base64";
20
+ media_type: string;
21
+ data: string;
22
+ };
23
+ }
24
+ export interface ToolUseContent {
25
+ type: "tool_use";
26
+ id: string;
27
+ name: string;
28
+ input: Record<string, unknown>;
29
+ }
30
+ export interface ToolResultContent {
31
+ type: "tool_result";
32
+ tool_use_id: string;
33
+ content: string;
34
+ }
35
+ export type MessageContent = TextContent | ImageUrlContent | ImageContent | ToolUseContent | ToolResultContent;
36
+ export interface ToolCall {
37
+ id: string;
38
+ type: "function";
39
+ function: {
40
+ name: string;
41
+ arguments: string;
42
+ };
43
+ }
44
+ export interface BaseMessage {
45
+ role: "system" | "user" | "assistant" | "tool";
46
+ content: string | MessageContent[];
47
+ name?: string;
48
+ tool_calls?: ToolCall[];
49
+ tool_call_id?: string;
50
+ }
51
+ export interface OpenAIMessage extends BaseMessage {
52
+ role: "system" | "user" | "assistant" | "tool";
53
+ }
54
+ export interface AnthropicMessage {
55
+ role: "user" | "assistant";
56
+ content: MessageContent[];
57
+ }
58
+ export interface GoogleMessage {
59
+ role: "user" | "model";
60
+ parts: Array<{
61
+ text?: string;
62
+ inline_data?: {
63
+ mime_type: string;
64
+ data: string;
65
+ };
66
+ }>;
67
+ }
68
+ export interface FunctionParameter {
69
+ type: string;
70
+ description?: string;
71
+ enum?: string[];
72
+ items?: FunctionParameter;
73
+ properties?: Record<string, FunctionParameter>;
74
+ required?: string[];
75
+ }
76
+ export interface FunctionDefinition {
77
+ name: string;
78
+ description?: string;
79
+ parameters: FunctionParameter;
80
+ }
81
+ export interface OpenAITool {
82
+ type: "function";
83
+ function: FunctionDefinition;
84
+ }
85
+ export interface OpenAIFunctionToolInput {
86
+ type: "function";
87
+ function: {
88
+ name: string;
89
+ description?: string;
90
+ parameters?: FunctionParameter | Record<string, any>;
91
+ };
92
+ }
93
+ export interface OpenAIWebSearchToolInput {
94
+ type: "web_search";
95
+ user_location?: {
96
+ city?: string;
97
+ region?: string;
98
+ country?: string;
99
+ timezone?: string;
100
+ };
101
+ search_context_size?: "low" | "medium" | "high";
102
+ max_uses?: number;
103
+ }
104
+ export type OpenAIToolInput = OpenAIFunctionToolInput | OpenAIWebSearchToolInput;
105
+ export interface AnthropicTool {
106
+ name: string;
107
+ description?: string;
108
+ input_schema: FunctionParameter;
109
+ }
110
+ export interface GoogleTool {
111
+ functionDeclarations: Array<{
112
+ name: string;
113
+ description?: string;
114
+ parameters: FunctionParameter;
115
+ }>;
116
+ }
117
+ export type ToolChoiceType = "auto" | "none" | "required" | {
118
+ type: "function";
119
+ function: {
120
+ name: string;
121
+ };
122
+ };
123
+ export type AnthropicToolChoice = "auto" | "any" | "none" | {
124
+ type: "tool";
125
+ name: string;
126
+ };
127
+ export interface BaseRequestBody {
128
+ model: string;
129
+ temperature?: number;
130
+ max_tokens?: number;
131
+ top_p?: number;
132
+ frequency_penalty?: number;
133
+ presence_penalty?: number;
134
+ stream?: boolean;
135
+ }
136
+ export interface OpenAIRequestBody extends BaseRequestBody {
137
+ messages: OpenAIMessage[];
138
+ tools?: OpenAITool[];
139
+ tool_choice?: ToolChoiceType;
140
+ response_format?: {
141
+ type: "text" | "json_object" | "json_schema";
142
+ json_schema?: {
143
+ name: string;
144
+ description?: string;
145
+ schema: Record<string, unknown>;
146
+ strict?: boolean;
147
+ };
148
+ };
149
+ stream_options?: {
150
+ include_usage: boolean;
151
+ };
152
+ reasoning_effort?: "minimal" | "low" | "medium" | "high";
153
+ }
154
+ export interface OpenAIResponsesRequestBody {
155
+ model: string;
156
+ input: OpenAIMessage[];
157
+ reasoning: {
158
+ effort: "minimal" | "low" | "medium" | "high";
159
+ summary: "detailed";
160
+ };
161
+ tools?: Array<{
162
+ type: "function";
163
+ name: string;
164
+ description?: string;
165
+ parameters: FunctionParameter;
166
+ }>;
167
+ tool_choice?: ToolChoiceType;
168
+ stream?: boolean;
169
+ temperature?: number;
170
+ max_output_tokens?: number;
171
+ text?: {
172
+ format: {
173
+ type: "text";
174
+ } | {
175
+ type: "json_object";
176
+ } | {
177
+ type: "json_schema";
178
+ name: string;
179
+ schema: Record<string, unknown>;
180
+ strict?: boolean;
181
+ };
182
+ };
183
+ }
184
+ export interface AnthropicSystemContent {
185
+ type: "text";
186
+ text: string;
187
+ cache_control?: {
188
+ type: "ephemeral";
189
+ };
190
+ }
191
+ export interface AnthropicRequestBody extends BaseRequestBody {
192
+ messages: AnthropicMessage[];
193
+ system?: string | AnthropicSystemContent[];
194
+ tools?: AnthropicTool[];
195
+ tool_choice?: AnthropicToolChoice;
196
+ thinking?: {
197
+ type: "enabled";
198
+ budget_tokens: number;
199
+ };
200
+ output_config?: {
201
+ effort?: "low" | "medium" | "high";
202
+ };
203
+ }
204
+ export interface GoogleRequestBody {
205
+ contents: GoogleMessage[];
206
+ tools?: GoogleTool[];
207
+ generationConfig?: {
208
+ temperature?: number;
209
+ maxOutputTokens?: number;
210
+ topP?: number;
211
+ thinkingConfig?: {
212
+ includeThoughts: boolean;
213
+ };
214
+ responseModalities?: string[];
215
+ imageConfig?: {
216
+ aspectRatio?: string;
217
+ imageSize?: string;
218
+ };
219
+ };
220
+ }
221
+ export type ProviderRequestBody = OpenAIRequestBody | OpenAIResponsesRequestBody | AnthropicRequestBody | GoogleRequestBody;
222
+ export interface ProcessedImage {
223
+ data: string;
224
+ mimeType: string;
225
+ }
226
+ export interface ProviderValidationResult {
227
+ valid: boolean;
228
+ error?: string;
229
+ statusCode?: number;
230
+ model?: string;
231
+ }
232
+ export interface ModelWithPricing {
233
+ providers: Array<{
234
+ providerId: string;
235
+ inputPrice?: number;
236
+ outputPrice?: number;
237
+ supportedParameters?: string[];
238
+ modelName: string;
239
+ discount?: number;
240
+ }>;
241
+ }
242
+ export interface AvailableModelProvider {
243
+ providerId: string;
244
+ modelName: string;
245
+ }
246
+ export type MessageTransformer<T> = (messages: BaseMessage[], isProd?: boolean) => Promise<T[]>;
247
+ export type ToolTransformer<_T, U> = (tools: OpenAITool[]) => U;
248
+ export type RequestBodyPreparer = (usedProvider: ProviderId, usedModel: string, messages: BaseMessage[], stream: boolean, temperature?: number, max_tokens?: number, top_p?: number, frequency_penalty?: number, presence_penalty?: number, response_format?: OpenAIRequestBody["response_format"], tools?: OpenAITool[], tool_choice?: ToolChoiceType, reasoning_effort?: "minimal" | "low" | "medium" | "high", supportsReasoning?: boolean, isProd?: boolean, maxImageSizeMB?: number, userPlan?: "free" | "pro" | null, sensitive_word_check?: {
249
+ status: "DISABLE" | "ENABLE";
250
+ }, image_config?: {
251
+ aspect_ratio?: string;
252
+ image_size?: string;
253
+ }) => Promise<ProviderRequestBody>;
254
+ export declare function isTextContent(content: MessageContent): content is TextContent;
255
+ export declare function isImageUrlContent(content: MessageContent): content is ImageUrlContent;
256
+ export declare function isImageContent(content: MessageContent): content is ImageContent;
257
+ export declare function isToolUseContent(content: MessageContent): content is ToolUseContent;
258
+ export declare function isToolResultContent(content: MessageContent): content is ToolResultContent;
259
+ export declare function isOpenAITool(tool: OpenAITool | AnthropicTool | GoogleTool): tool is OpenAITool;
260
+ export declare function isAnthropicTool(tool: OpenAITool | AnthropicTool | GoogleTool): tool is AnthropicTool;
261
+ export declare function isGoogleTool(tool: OpenAITool | AnthropicTool | GoogleTool): tool is GoogleTool;
262
+ export declare function hasMaxTokens(requestBody: ProviderRequestBody): requestBody is OpenAIRequestBody | AnthropicRequestBody;
263
+ export interface WebSearchTool {
264
+ type: "web_search";
265
+ user_location?: {
266
+ type: "approximate";
267
+ city?: string;
268
+ region?: string;
269
+ country?: string;
270
+ };
271
+ search_context_size?: "low" | "medium" | "high";
272
+ max_uses?: number;
273
+ }
274
+ export interface WebSearchCitation {
275
+ url: string;
276
+ title?: string;
277
+ snippet?: string;
278
+ start_index?: number;
279
+ end_index?: number;
280
+ }
281
+ export interface OpenAIWebSearchOptions {
282
+ user_location?: {
283
+ type: "approximate";
284
+ approximate?: {
285
+ city?: string;
286
+ region?: string;
287
+ country?: string;
288
+ };
289
+ };
290
+ search_context_size?: "low" | "medium" | "high";
291
+ }
package/dist/types.js ADDED
@@ -0,0 +1,28 @@
1
+ export function isTextContent(content) {
2
+ return content.type === "text";
3
+ }
4
+ export function isImageUrlContent(content) {
5
+ return content.type === "image_url";
6
+ }
7
+ export function isImageContent(content) {
8
+ return content.type === "image";
9
+ }
10
+ export function isToolUseContent(content) {
11
+ return content.type === "tool_use";
12
+ }
13
+ export function isToolResultContent(content) {
14
+ return content.type === "tool_result";
15
+ }
16
+ export function isOpenAITool(tool) {
17
+ return "type" in tool && tool.type === "function";
18
+ }
19
+ export function isAnthropicTool(tool) {
20
+ return "name" in tool && "input_schema" in tool;
21
+ }
22
+ export function isGoogleTool(tool) {
23
+ return "functionDeclarations" in tool;
24
+ }
25
+ export function hasMaxTokens(requestBody) {
26
+ return "max_tokens" in requestBody;
27
+ }
28
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAwVA,MAAM,UAAU,aAAa,CAAC,OAAuB;IACpD,OAAO,OAAO,CAAC,IAAI,KAAK,MAAM,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,iBAAiB,CAChC,OAAuB;IAEvB,OAAO,OAAO,CAAC,IAAI,KAAK,WAAW,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,cAAc,CAC7B,OAAuB;IAEvB,OAAO,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC/B,OAAuB;IAEvB,OAAO,OAAO,CAAC,IAAI,KAAK,UAAU,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,mBAAmB,CAClC,OAAuB;IAEvB,OAAO,OAAO,CAAC,IAAI,KAAK,aAAa,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,YAAY,CAC3B,IAA6C;IAE7C,OAAO,MAAM,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,eAAe,CAC9B,IAA6C;IAE7C,OAAO,MAAM,IAAI,IAAI,IAAI,cAAc,IAAI,IAAI,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,YAAY,CAC3B,IAA6C;IAE7C,OAAO,sBAAsB,IAAI,IAAI,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,YAAY,CAC3B,WAAgC;IAEhC,OAAO,YAAY,IAAI,WAAW,CAAC;AACpC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { ProviderId } from "./providers.js";
2
+ import type { ProviderValidationResult } from "./types.js";
3
+ import type { ProviderKeyOptions } from "@llmgateway/db";
4
+ export declare function validateProviderKey(provider: ProviderId, token: string, baseUrl?: string, skipValidation?: boolean, providerKeyOptions?: ProviderKeyOptions): Promise<ProviderValidationResult>;
@@ -0,0 +1,113 @@
1
+ import { logger } from "@llmgateway/logger";
2
+ import { getCheapestModelForProvider } from "./get-cheapest-model-for-provider.js";
3
+ import { getProviderEndpoint } from "./get-provider-endpoint.js";
4
+ import { getProviderHeaders } from "./get-provider-headers.js";
5
+ import { models } from "./models.js";
6
+ import { prepareRequestBody } from "./prepare-request-body.js";
7
+ export async function validateProviderKey(provider, token, baseUrl, skipValidation = false, providerKeyOptions) {
8
+ if (skipValidation) {
9
+ return { valid: true };
10
+ }
11
+ if (provider === "custom") {
12
+ return { valid: true };
13
+ }
14
+ try {
15
+ let validationModel;
16
+ if (provider === "azure" && providerKeyOptions?.azure_validation_model) {
17
+ validationModel = providerKeyOptions.azure_validation_model;
18
+ logger.debug("Using Azure validation model from options", {
19
+ provider,
20
+ validationModel,
21
+ });
22
+ }
23
+ else if (provider === "openai") {
24
+ validationModel = "gpt-4o-mini";
25
+ logger.debug("Using fixed OpenAI validation model", {
26
+ provider,
27
+ validationModel,
28
+ });
29
+ }
30
+ else {
31
+ const cheapestModel = getCheapestModelForProvider(provider);
32
+ logger.debug("Using cheapest validation model", {
33
+ provider,
34
+ validationModel: cheapestModel || undefined,
35
+ });
36
+ if (!cheapestModel) {
37
+ throw new Error(`No model with pricing information found for provider ${provider}`);
38
+ }
39
+ validationModel = cheapestModel;
40
+ }
41
+ const modelDef = models.find((m) => m.providers.some((p) => p.providerId === provider && p.modelName === validationModel));
42
+ const modelId = modelDef?.id;
43
+ const effectiveModelId = provider === "azure" && providerKeyOptions?.azure_validation_model
44
+ ? providerKeyOptions.azure_validation_model
45
+ : modelId;
46
+ logger.debug("Validation endpoint configuration", {
47
+ provider,
48
+ validationModel,
49
+ modelId,
50
+ effectiveModelId,
51
+ providerKeyOptions,
52
+ });
53
+ const endpoint = getProviderEndpoint(provider, baseUrl, effectiveModelId, provider === "google-ai-studio" || provider === "google-vertex"
54
+ ? token
55
+ : undefined, false, false, false, providerKeyOptions);
56
+ const systemMessage = {
57
+ role: "system",
58
+ content: "You are a helpful assistant.",
59
+ };
60
+ const minimalMessage = {
61
+ role: "user",
62
+ content: "Hello",
63
+ };
64
+ const messages = [systemMessage, minimalMessage];
65
+ const providerMapping = modelDef?.providers.find((p) => p.providerId === provider && p.modelName === validationModel);
66
+ const supportedParameters = providerMapping?.supportedParameters;
67
+ const supportsMaxTokens = supportedParameters?.includes("max_tokens") &&
68
+ providerMapping?.providerId !== "azure";
69
+ const payload = await prepareRequestBody(provider, validationModel, messages, false, undefined, supportsMaxTokens ? 10 : undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, false, false, 20, null, undefined, undefined, undefined);
70
+ const headers = getProviderHeaders(provider, token);
71
+ headers["Content-Type"] = "application/json";
72
+ const response = await fetch(endpoint, {
73
+ method: "POST",
74
+ headers,
75
+ body: JSON.stringify(payload),
76
+ });
77
+ if (!response.ok) {
78
+ const errorText = await response.text();
79
+ let errorMessage = `Error from provider: ${response.status} ${response.statusText}`;
80
+ try {
81
+ const errorJson = JSON.parse(errorText);
82
+ if (errorJson.error?.message) {
83
+ errorMessage = errorJson.error.message;
84
+ }
85
+ else if (errorJson.message) {
86
+ errorMessage = errorJson.message;
87
+ }
88
+ }
89
+ catch { }
90
+ if (response.status === 401) {
91
+ return {
92
+ valid: false,
93
+ statusCode: response.status,
94
+ model: validationModel,
95
+ };
96
+ }
97
+ return {
98
+ valid: false,
99
+ error: errorMessage,
100
+ statusCode: response.status,
101
+ model: validationModel,
102
+ };
103
+ }
104
+ return { valid: true, model: validationModel };
105
+ }
106
+ catch (error) {
107
+ return {
108
+ valid: false,
109
+ error: error instanceof Error ? error.message : "Unknown error occurred",
110
+ };
111
+ }
112
+ }
113
+ //# sourceMappingURL=validate-provider-key.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-provider-key.js","sourceRoot":"","sources":["../src/validate-provider-key.ts"],"names":[],"mappings":"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"}