@ai-ml.api/aimlapi-vercel-ai
Version:
AI SDK provider for AI/ML API: 300+ models via OpenAI-compatible API.
1 lines • 13.3 kB
Source Map (JSON)
{"version":3,"sources":["../src/aimlapi-provider.ts","../src/aimlapi-error.ts","../src/aimlapi-image-model.ts"],"sourcesContent":["import {\r\n OpenAICompatibleChatLanguageModel,\r\n OpenAICompatibleCompletionLanguageModel,\r\n OpenAICompatibleEmbeddingModel,\r\n type ProviderErrorStructure,\r\n} from '@ai-sdk/openai-compatible';\r\nimport {\r\n type EmbeddingModelV2,\r\n type ImageModelV2,\r\n type LanguageModelV2,\r\n type ProviderV2,\r\n} from '@ai-sdk/provider';\r\nimport {\r\n type FetchFunction,\r\n loadApiKey,\r\n withoutTrailingSlash,\r\n type Resolvable,\r\n} from '@ai-sdk/provider-utils';\r\nimport { aimlapiErrorSchema } from './aimlapi-error';\r\nimport {\r\n type AIMLAPIImageModelId,\r\n type AimlapiImageSettings,\r\n} from './aimlapi-image-settings';\r\nimport { AimlapiImageModel } from './aimlapi-image-model';\r\nimport { z } from 'zod';\r\n\r\nexport interface AIMLAPIProviderSettings {\r\n apiKey?: string;\r\n baseURL?: string;\r\n headers?: Resolvable<Record<string, string | undefined>>;\r\n fetch?: FetchFunction;\r\n}\r\n\r\nexport interface AIMLAPIProvider extends ProviderV2 {\r\n (modelId: string): LanguageModelV2;\r\n\r\n chat(modelId: string): LanguageModelV2;\r\n completion(modelId: string): LanguageModelV2;\r\n languageModel(modelId: string): LanguageModelV2;\r\n textEmbeddingModel(modelId: string): EmbeddingModelV2<string>;\r\n imageModel(\r\n modelId: string,\r\n settings?: AimlapiImageSettings,\r\n ): ImageModelV2;\r\n}\r\n\r\nconst defaultBaseURL = 'https://api.aimlapi.com/v1';\r\n\r\n// ❗ Используем тип, ВЫВЕДЕННЫЙ ИЗ СХЕМЫ:\r\ntype AimErr = z.infer<typeof aimlapiErrorSchema>;\r\n\r\nconst aimlapiErrorStructure: ProviderErrorStructure<AimErr> = {\r\n errorSchema: aimlapiErrorSchema,\r\n errorToMessage: (data) => data.error.message,\r\n // isRetryable: (res) => res.status === 429 || res.status >= 500,\r\n};\r\n\r\nexport function createAIMLAPI(\r\n options: AIMLAPIProviderSettings = {},\r\n): AIMLAPIProvider {\r\n const rawBaseURL = options.baseURL ?? defaultBaseURL;\r\n const strictBaseURL = withoutTrailingSlash(rawBaseURL) ?? defaultBaseURL;\r\n\r\n const getHeadersLoose = (): Record<string, string | undefined> => ({\r\n Authorization: `Bearer ${loadApiKey({\r\n apiKey: options.apiKey,\r\n environmentVariableName: 'AIMLAPI_API_KEY',\r\n description: 'AIMLAPI API key',\r\n })}`,\r\n 'X-Title': 'vercel',\r\n ...(typeof options.headers === 'function'\r\n ? (options.headers as any)()\r\n : options.headers),\r\n });\r\n\r\n const getHeadersStrict = (): Record<string, string> =>\r\n Object.fromEntries(\r\n Object.entries(getHeadersLoose()).filter(\r\n ([, v]) => v !== undefined,\r\n ) as Array<[string, string]>,\r\n );\r\n\r\n interface CommonModelConfig {\r\n provider: string;\r\n url: ({ path }: { path: string }) => string;\r\n headers: () => Record<string, string>;\r\n fetch?: FetchFunction;\r\n errorStructure?: ProviderErrorStructure<AimErr>;\r\n }\r\n\r\n const getCommonModelConfig = (modelType: string): CommonModelConfig => ({\r\n provider: `aimlapi.${modelType}`,\r\n url: ({ path }) => `${strictBaseURL}${path}`,\r\n headers: getHeadersStrict,\r\n fetch: options.fetch,\r\n errorStructure: aimlapiErrorStructure,\r\n });\r\n\r\n const createChat = (modelId: string) =>\r\n new OpenAICompatibleChatLanguageModel(modelId, getCommonModelConfig('chat'));\r\n\r\n const createCompletion = (modelId: string) =>\r\n new OpenAICompatibleCompletionLanguageModel(\r\n modelId,\r\n getCommonModelConfig('completion'),\r\n );\r\n\r\n const createEmbedding = (modelId: string) =>\r\n new OpenAICompatibleEmbeddingModel(\r\n modelId,\r\n getCommonModelConfig('embedding'),\r\n );\r\n\r\n const createImage = (\r\n modelId: AIMLAPIImageModelId,\r\n settings: AimlapiImageSettings = {},\r\n ) =>\r\n new AimlapiImageModel(modelId, settings, {\r\n provider: 'aimlapi.image',\r\n baseURL: strictBaseURL,\r\n headers: getHeadersStrict,\r\n fetch: options.fetch,\r\n });\r\n\r\n const providerFunc = (modelId: string) => createChat(modelId);\r\n (providerFunc as any).chat = createChat;\r\n (providerFunc as any).completion = createCompletion;\r\n (providerFunc as any).languageModel = createChat;\r\n (providerFunc as any).textEmbeddingModel = createEmbedding;\r\n (providerFunc as any).imageModel = createImage;\r\n\r\n return providerFunc as unknown as AIMLAPIProvider;\r\n}\r\n\r\nexport const aimlapi = createAIMLAPI();\r\n","import { z } from 'zod';\r\n\r\n/**\r\n * Unified AIMLAPI error schema.\r\n * Minimum required fields compatible with createJsonErrorResponseHandler<T>.\r\n */\r\nexport const aimlapiErrorSchema = z.object({\r\n error: z.object({\r\n message: z.string(),\r\n code: z.string().optional(),\r\n type: z.string().optional(),\r\n }),\r\n});\r\n\r\nexport type AIMLAPIErrorData = z.infer<typeof aimlapiErrorSchema>;\r\n","import type { ImageModelV2, ImageModelV2CallWarning } from '@ai-sdk/provider';\r\nimport type { Resolvable } from '@ai-sdk/provider-utils';\r\nimport {\r\n FetchFunction,\r\n combineHeaders,\r\n createJsonErrorResponseHandler,\r\n createJsonResponseHandler,\r\n postJsonToApi,\r\n resolve,\r\n} from '@ai-sdk/provider-utils';\r\nimport { z } from 'zod';\r\nimport type { AIMLAPIImageModelId, AimlapiImageSettings } from './aimlapi-image-settings';\r\nimport { aimlapiErrorSchema } from './aimlapi-error';\r\ntype AimErr = z.infer<typeof aimlapiErrorSchema>;\r\n\r\ninterface AIMLAPIImageModelConfig {\r\n provider: string;\r\n baseURL: string;\r\n headers?: Resolvable<Record<string, string | undefined>>;\r\n fetch?: FetchFunction;\r\n _internal?: {\r\n currentDate?: () => Date;\r\n };\r\n}\r\n\r\nexport class AimlapiImageModel implements ImageModelV2 {\r\n readonly specificationVersion = 'v2';\r\n readonly maxImagesPerCall = 1;\r\n\r\n get provider(): string {\r\n return this.config.provider;\r\n }\r\n\r\n constructor(\r\n readonly modelId: AIMLAPIImageModelId,\r\n readonly settings: AimlapiImageSettings = {},\r\n private readonly config: AIMLAPIImageModelConfig,\r\n ) {}\r\n\r\n async doGenerate({ prompt, n, aspectRatio, size, seed, providerOptions, headers, abortSignal }: Parameters<ImageModelV2['doGenerate']>[0]) {\r\n const warnings: ImageModelV2CallWarning[] = [];\r\n\r\n const modelSupportsAspectRatio = true;\r\n if (!modelSupportsAspectRatio && aspectRatio != null) {\r\n warnings.push({\r\n type: 'unsupported-setting',\r\n setting: 'aspectRatio',\r\n details: 'This model does not support `aspectRatio`. Use `size` instead.',\r\n });\r\n }\r\n\r\n if (size != null && aspectRatio != null) {\r\n warnings.push({\r\n type: 'other',\r\n message: 'Both `size` and `aspectRatio` were provided. The API will prioritize `size`.',\r\n });\r\n }\r\n\r\n const currentDate = this.config._internal?.currentDate?.() ?? new Date();\r\n const splitSize = size?.split('x');\r\n\r\n const resolvedProviderHeaders =\r\n (await resolve(this.config.headers)) as Record<string, string | undefined> | undefined;\r\n\r\n const { value: response, responseHeaders } = await postJsonToApi({\r\n url: `${this.config.baseURL}/images/generations`,\r\n headers: combineHeaders(resolvedProviderHeaders, headers),\r\n body: {\r\n model: this.modelId,\r\n prompt,\r\n seed,\r\n n,\r\n ...(splitSize && {\r\n width: parseInt(splitSize[0]!, 10),\r\n height: parseInt(splitSize[1]!, 10),\r\n }),\r\n ...(aspectRatio && { aspect_ratio: aspectRatio }),\r\n // Don't force base64: some models will return the url anyway\r\n ...(providerOptions?.aimlapi ?? {}),\r\n },\r\n successfulResponseHandler: createJsonResponseHandler(aimlapiImageResponseSchema),\r\n failedResponseHandler: createJsonErrorResponseHandler<AimErr>({\r\n errorSchema: aimlapiErrorSchema,\r\n errorToMessage: (e) => e.error.message,\r\n isRetryable: (res, e) => {\r\n if (res.status === 429) return true;\r\n if (res.status >= 500) return true;\r\n if (e?.error?.code === 'overloaded' || e?.error?.code === 'timeout') return true;\r\n return false;\r\n },\r\n }),\r\n abortSignal,\r\n fetch: this.config.fetch,\r\n });\r\n\r\n // response.normalized: string[] (b64 or url)\r\n return {\r\n images: response.normalized,\r\n warnings,\r\n response: {\r\n timestamp: currentDate,\r\n modelId: this.modelId,\r\n headers: responseHeaders,\r\n },\r\n };\r\n }\r\n}\r\n\r\n// We accept both possible formats and normalize\r\nconst aimlapiImageResponseSchema = z.union([\r\n // Option A: OpenAI-compatible base64\r\n z.object({\r\n data: z.array(z.object({ b64_json: z.string() })),\r\n }).transform((v) => ({ normalized: v.data.map((d) => d.b64_json) })),\r\n\r\n // Option B: AIMLAPI format with images (url or b64_json)\r\n z.object({\r\n images: z.array(\r\n z.object({\r\n b64_json: z.string().optional(),\r\n url: z.string().url().optional(),\r\n }),\r\n ),\r\n }).transform((v) => ({\r\n normalized: v.images\r\n .map((i) => i.b64_json ?? i.url ?? '')\r\n .filter((x) => x.length > 0),\r\n })),\r\n]);\r\n"],"mappings":"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","names":["z","z"]}