{"version":3,"sources":["../src/pollinations-provider.ts","../src/image/pollinations-image-model.ts","../src/pollinations-error-handler.ts","../src/pollinations-utils.ts","../src/image/pollinations-image-options.ts","../src/language/pollinations-language-model.ts","../src/language/pollinations-language-utils.ts","../src/language/pollinations-message-converter.ts","../src/language/pollinations-stream-transformer.ts","../src/pollinations-constants.ts","../src/speech/pollinations-speech-model.ts"],"sourcesContent":["import { ImageModelV3, ProviderV3, SpeechModelV3 } from '@ai-sdk/provider';\nimport {\n  FetchFunction,\n  generateId,\n  withoutTrailingSlash,\n} from '@ai-sdk/provider-utils';\nimport { PollinationsImageModel, PollinationsImageModelId } from './image';\nimport {\n  PollinationsLanguageModel,\n  PollinationsLanguageModelId,\n} from './language';\nimport {\n  API_ENDPOINTS,\n  API_KEY_PARAMS,\n  DEFAULT_CONFIG,\n  EXTERNAL_URLS,\n  LEGACY_API_ENDPOINTS,\n} from './pollinations-constants';\nimport type {\n  PollinationsImageModelSettings,\n  PollinationsLanguageModelSettings,\n} from './pollinations-types';\nimport { PollinationsSpeechModel, PollinationsSpeechModelId } from './speech';\n\nexport interface PollinationsProvider extends ProviderV3 {\n  (modelId: string): PollinationsLanguageModel;\n\n  /**\n   * Creates a Pollinations model for text generation.\n   */\n  languageModel(\n    modelId: PollinationsLanguageModelId,\n    settings?: PollinationsLanguageModelSettings,\n  ): PollinationsLanguageModel;\n\n  /**\n   * Creates a Pollinations model for text generation.\n   */\n  chat(\n    modelId: PollinationsLanguageModelId,\n    settings?: PollinationsLanguageModelSettings,\n  ): PollinationsLanguageModel;\n\n  /**\n   * Creates a Pollinations model for image generation.\n   */\n  imageModel(\n    modelId: PollinationsImageModelId,\n    settings?: PollinationsImageModelSettings,\n  ): ImageModelV3;\n\n  /**\n   * Creates a Pollinations model for image generation.\n   */\n  image(\n    modelId: PollinationsImageModelId,\n    settings?: PollinationsImageModelSettings,\n  ): ImageModelV3;\n\n  /**\n   * Creates a Pollinations model for speech/audio generation.\n   */\n  speechModel(modelId: PollinationsSpeechModelId): SpeechModelV3;\n\n  /**\n   * Creates a Pollinations model for speech/audio generation.\n   */\n  audio(modelId: PollinationsSpeechModelId): SpeechModelV3;\n}\n\nexport interface PollinationsProviderSettings {\n  /**\n   * API key for authenticating requests (optional).\n   * Get one at: {@link EXTERNAL_URLS.AUTH}\n   */\n  apiKey?: string;\n\n  /**\n   * Base URL for API calls.\n   * @default See {@link LEGACY_API_ENDPOINTS.LANGUAGE} for legacy, {@link API_ENDPOINTS.LANGUAGE} for new\n   */\n  baseURL?: string;\n\n  /**\n   * Base URL for image generation API calls.\n   * @default See {@link LEGACY_API_ENDPOINTS.IMAGE_BASE} for legacy, {@link API_ENDPOINTS.IMAGE} for new\n   */\n  imageURL?: string;\n\n  /**\n   * Referrer identifier for analytics (optional).\n   */\n  referrer?: string;\n\n  /**\n   * Custom headers to include in the requests.\n   */\n  headers?: Record<string, string>;\n\n  /**\n   * Provider name. Overrides the `pollinations` default name.\n   */\n  name?: string;\n\n  /**\n   * Custom fetch implementation.\n   *\n   * You can use this to:\n   * - Add custom request/response interceptors\n   * - Use a different fetch implementation (e.g., node-fetch, undici)\n   * - Add retries or custom error handling\n   * - Mock fetch for testing\n   *\n   * @default globalThis.fetch\n   */\n  fetch?: FetchFunction;\n\n  /**\n   * Whether to use legacy Pollinations API URLs.\n   *\n   * When `false` (default), uses the new unified API endpoints:\n   * - Language models: {@link API_ENDPOINTS.LANGUAGE}\n   * - Image models: {@link API_ENDPOINTS.IMAGE}\n   * - API key parameter: {@link API_KEY_PARAMS.NEW} (in query string)\n   *\n   * When `true`, uses legacy API endpoints:\n   * - Language models: {@link LEGACY_API_ENDPOINTS.LANGUAGE}\n   * - Image models: {@link LEGACY_API_ENDPOINTS.IMAGE}\n   * - API key parameter: {@link API_KEY_PARAMS.LEGACY} (in query string)\n   *\n   * **When to use legacy URLs:**\n   * - Existing integrations that depend on legacy endpoints\n   * - Backward compatibility with older API versions\n   * - Testing or migration scenarios\n   *\n   * **Recommendation:** Use the default (`false`) for new projects as the new\n   * unified API provides better consistency and future-proofing.\n   *\n   * @default false\n   */\n  useLegacyUrls?: boolean;\n}\n\n// Internal config for the language model\nexport interface PollinationsConfig {\n  provider: string;\n  baseURL: string;\n  headers: () => Record<string, string>;\n  queryParams: () => Record<string, string>;\n  generateId: () => string;\n  fetch?: FetchFunction;\n  referrer?: string;\n}\n\n/**\n * Create a Pollinations provider instance.\n */\nexport function createPollinations(\n  options: PollinationsProviderSettings = {},\n): PollinationsProvider {\n  const apiKey = options.apiKey ?? process.env[DEFAULT_CONFIG.API_KEY_ENV_VAR];\n  const providerName = options.name ?? DEFAULT_CONFIG.PROVIDER_NAME;\n\n  const getHeaders = () => {\n    const headers: Record<string, string> = {\n      'Content-Type': DEFAULT_CONFIG.CONTENT_TYPE,\n      ...options.headers,\n    };\n    if (apiKey) {\n      headers['Authorization'] = `Bearer ${apiKey}`;\n    }\n    if (options.referrer) {\n      headers['Referer'] = options.referrer;\n    }\n    return headers;\n  };\n\n  const getQueryParams = () => {\n    const params: Record<string, string> = {};\n    if (apiKey) {\n      if (options.useLegacyUrls) {\n        params[API_KEY_PARAMS.LEGACY] = apiKey;\n      } else {\n        params[API_KEY_PARAMS.NEW] = apiKey;\n      }\n    }\n    return params;\n  };\n\n  const languageModelBaseUrl =\n    withoutTrailingSlash(options.baseURL) ??\n    (options.useLegacyUrls\n      ? LEGACY_API_ENDPOINTS.LANGUAGE\n      : API_ENDPOINTS.LANGUAGE);\n\n  const createLanguageModel = (\n    modelId: string,\n    settings: PollinationsLanguageModelSettings = {},\n  ) =>\n    new PollinationsLanguageModel(modelId, settings, {\n      provider: providerName,\n      baseURL: languageModelBaseUrl,\n      headers: getHeaders,\n      queryParams: getQueryParams,\n      generateId: generateId,\n      fetch: options.fetch,\n      referrer: options.referrer,\n    });\n\n  const imageBaseURL =\n    withoutTrailingSlash(options.imageURL) ??\n    (options.useLegacyUrls ? LEGACY_API_ENDPOINTS.IMAGE : API_ENDPOINTS.IMAGE);\n\n  const createImageModel = (\n    modelId: PollinationsImageModelId,\n    settings: PollinationsImageModelSettings = {},\n  ) =>\n    new PollinationsImageModel(modelId, settings, {\n      provider: `${providerName}.image`,\n      baseURL: imageBaseURL,\n      headers: getHeaders,\n      queryParams: getQueryParams,\n      generateId: generateId,\n      fetch: options.fetch,\n      referrer: options.referrer,\n    });\n\n  const createSpeechModel = (modelId: PollinationsSpeechModelId) =>\n    new PollinationsSpeechModel(modelId, {\n      provider: `${providerName}.speech`,\n      baseURL: languageModelBaseUrl,\n      headers: getHeaders,\n      queryParams: getQueryParams,\n      generateId: generateId,\n      fetch: options.fetch,\n      referrer: options.referrer,\n    });\n\n  const provider = function (modelId: string) {\n    if (new.target) {\n      throw new Error(\n        'The Pollinations model function cannot be called with the new keyword.',\n      );\n    }\n\n    return createLanguageModel(modelId);\n  };\n\n  // Set provider properties\n  provider.specificationVersion = 'v3' as const;\n  provider.languageModel = createLanguageModel;\n  provider.chat = createLanguageModel;\n  provider.imageModel = createImageModel;\n  provider.image = createImageModel;\n  provider.speechModel = createSpeechModel;\n  provider.speech = createSpeechModel;\n\n  return provider as any as PollinationsProvider;\n}\n","import {\n  ImageModelV3,\n  ImageModelV3CallOptions,\n  ImageModelV3ProviderMetadata,\n  ImageModelV3Usage,\n  InvalidResponseDataError,\n  SharedV3Warning,\n} from '@ai-sdk/provider';\nimport { handlePollinationsError } from '../pollinations-error-handler';\nimport { PollinationsConfig } from '../pollinations-provider';\nimport type { PollinationsImageModelSettings } from '../pollinations-types';\nimport { resolveSeed, toBase64 } from '../pollinations-utils';\nimport {\n  isGptImageModel,\n  isVideoModel,\n  modelMaxImagesPerCall,\n  PollinationsImageModelId,\n} from './pollinations-image-options';\n\n// Headers to omit from fetch requests. 'user-agent' is omitted because it causes issues\n// with fetch requests on mobile devices (at least iOS).\nconst HEADERS_TO_OMIT = ['user-agent'];\n\nexport class PollinationsImageModel implements ImageModelV3 {\n  readonly specificationVersion = 'v3';\n\n  get maxImagesPerCall(): number {\n    if (this.modelId in modelMaxImagesPerCall) {\n      return (\n        modelMaxImagesPerCall[\n          this.modelId as keyof typeof modelMaxImagesPerCall\n        ] ?? 1\n      );\n    }\n    return 1;\n  }\n\n  get provider(): string {\n    return this.config.provider;\n  }\n\n  constructor(\n    readonly modelId: PollinationsImageModelId,\n    private readonly settings: PollinationsImageModelSettings,\n    private readonly config: PollinationsConfig,\n  ) {}\n\n  async doGenerate({\n    prompt,\n    n = 1,\n    size,\n    aspectRatio,\n    seed,\n    files,\n    mask,\n    abortSignal,\n    providerOptions,\n    headers,\n  }: ImageModelV3CallOptions): Promise<\n    Awaited<ReturnType<ImageModelV3['doGenerate']>>\n  > {\n    const warnings: SharedV3Warning[] = [];\n\n    // Handle aspectRatio: supported for video models, warn for image models\n    if (aspectRatio != null) {\n      if (isVideoModel(this.modelId)) {\n        // aspectRatio is supported for video models - will be added to params later\n      } else {\n        warnings.push({\n          type: 'unsupported',\n          feature: 'aspectRatio',\n          details:\n            'aspectRatio is only supported for video models (veo, seedance, seedance-pro). Use `size` for image models.',\n        });\n      }\n    }\n\n    // Warn about unsupported mask parameter\n    if (mask !== undefined) {\n      warnings.push({\n        type: 'unsupported',\n        feature: 'mask',\n        details:\n          'Pollinations API does not support mask parameter. This parameter will be ignored.',\n      });\n    }\n\n    // Map size to width/height\n    // Pollinations API uses width and height parameters\n    // Only set width/height if size is provided, otherwise let API use defaults\n    let width: number | undefined;\n    let height: number | undefined;\n\n    if (size) {\n      // Parse size format like \"1024x1024\" or use defaults\n      const sizeMatch = size.match(/^(\\d+)x(\\d+)$/);\n      if (sizeMatch) {\n        width = parseInt(sizeMatch[1], 10);\n        height = parseInt(sizeMatch[2], 10);\n      } else {\n        // Common size presets\n        switch (size) {\n          case '256x256':\n            width = 256;\n            height = 256;\n            break;\n          case '512x512':\n            width = 512;\n            height = 512;\n            break;\n          case '1024x1024':\n            width = 1024;\n            height = 1024;\n            break;\n          case '1792x1024':\n            width = 1792;\n            height = 1024;\n            break;\n          case '1024x1792':\n            width = 1024;\n            height = 1792;\n            break;\n          case '2048x2048':\n            width = 2048;\n            height = 2048;\n            break;\n          case '2048x1024':\n            width = 2048;\n            height = 1024;\n            break;\n          case '1024x2048':\n            width = 1024;\n            height = 2048;\n            break;\n          default:\n            // If size doesn't match known patterns, don't set width/height (let API default)\n            break;\n        }\n      }\n    }\n\n    // Warn if n > 1 (Pollinations typically supports 1 image per call)\n    if (n > 1) {\n      warnings.push({\n        type: 'unsupported',\n        feature: 'n',\n        details: `Pollinations API supports generating 1 image per call. Requested ${n} images, will generate 1.`,\n      });\n    }\n\n    // Build URL with parameters\n    // Pollinations uses GET endpoint: https://image.pollinations.ai/prompt/{prompt}?{params}\n    const params = new URLSearchParams(this.config.queryParams());\n    params.append('model', this.modelId);\n\n    // Generate seed: uses provided seed from call options, or -1 for true randomness\n    const finalSeed = resolveSeed(seed);\n    params.append('seed', finalSeed.toString());\n\n    // Only include width/height if explicitly provided via size parameter\n    // API defaults to 1024x1024 if not provided\n    if (width !== undefined) {\n      params.append('width', width.toString());\n    }\n    if (height !== undefined) {\n      params.append('height', height.toString());\n    }\n\n    // Add Pollinations-specific options from settings or providerOptions\n    //  take precedence over settings\n    const pollinationsOptions = providerOptions?.pollinations as\n      | {\n          nologo?: boolean;\n          enhance?: boolean;\n          private?: boolean;\n          negative_prompt?: string;\n          safe?: boolean;\n          quality?: 'low' | 'medium' | 'high' | 'hd';\n          transparent?: boolean;\n          duration?: number;\n          aspectRatio?: string;\n          audio?: boolean;\n          image?: string;\n        }\n      | undefined;\n\n    // Settings-based options (providerOptions take precedence)\n    const nologo = pollinationsOptions?.nologo ?? this.settings.nologo ?? false;\n    const enhance =\n      pollinationsOptions?.enhance ?? this.settings.enhance ?? false;\n    const isPrivate =\n      pollinationsOptions?.private ?? this.settings.private ?? false;\n\n    if (nologo) {\n      params.append('nologo', 'true');\n    }\n    if (enhance) {\n      params.append('enhance', 'true');\n    }\n    if (isPrivate) {\n      params.append('private', 'true');\n    }\n\n    // High Priority: Common image parameters\n    if (pollinationsOptions?.negative_prompt !== undefined) {\n      params.append('negative_prompt', pollinationsOptions.negative_prompt);\n    }\n    if (pollinationsOptions?.safe !== undefined) {\n      params.append('safe', pollinationsOptions.safe ? 'true' : 'false');\n    }\n\n    // Medium Priority: Model-specific parameters with validation\n    if (pollinationsOptions?.quality !== undefined) {\n      if (isGptImageModel(this.modelId)) {\n        params.append('quality', pollinationsOptions.quality);\n      } else {\n        warnings.push({\n          type: 'unsupported',\n          feature: 'quality',\n          details:\n            'quality parameter is only supported for gptimage models. This parameter will be ignored.',\n        });\n      }\n    }\n\n    if (pollinationsOptions?.transparent !== undefined) {\n      if (isGptImageModel(this.modelId)) {\n        params.append(\n          'transparent',\n          pollinationsOptions.transparent ? 'true' : 'false',\n        );\n      } else {\n        warnings.push({\n          type: 'unsupported',\n          feature: 'transparent',\n          details:\n            'transparent parameter is only supported for gptimage models. This parameter will be ignored.',\n        });\n      }\n    }\n\n    // Low Priority: Video model parameters with validation\n    if (isVideoModel(this.modelId)) {\n      // aspectRatio - supported for video models\n      if (aspectRatio !== undefined) {\n        params.append('aspectRatio', aspectRatio);\n      } else if (pollinationsOptions?.aspectRatio !== undefined) {\n        params.append('aspectRatio', pollinationsOptions.aspectRatio);\n      }\n\n      // duration - validate per model\n      if (pollinationsOptions?.duration !== undefined) {\n        const modelDurationLimits: Record<string, number[]> = {\n          veo: [4, 6, 8],\n          seedance: [2, 3, 4, 5, 6, 7, 8, 9, 10],\n          'seedance-pro': [2, 3, 4, 5, 6, 7, 8, 9, 10],\n        };\n        const allowedDurations = modelDurationLimits[this.modelId] || [];\n        if (\n          allowedDurations.length > 0 &&\n          !allowedDurations.includes(pollinationsOptions.duration)\n        ) {\n          warnings.push({\n            type: 'unsupported',\n            feature: 'duration',\n            details: `duration must be one of ${allowedDurations.join(', ')} for ${this.modelId} model. Got ${pollinationsOptions.duration}.`,\n          });\n        } else {\n          params.append('duration', pollinationsOptions.duration.toString());\n        }\n      }\n\n      // audio - only for veo\n      if (pollinationsOptions?.audio !== undefined) {\n        if (this.modelId === 'veo') {\n          params.append('audio', pollinationsOptions.audio ? 'true' : 'false');\n        } else {\n          warnings.push({\n            type: 'unsupported',\n            feature: 'audio',\n            details:\n              'audio parameter is only supported for veo model. This parameter will be ignored.',\n          });\n        }\n      }\n    } else {\n      // Warn if video-specific parameters are used with image models\n      if (pollinationsOptions?.duration !== undefined) {\n        warnings.push({\n          type: 'unsupported',\n          feature: 'duration',\n          details:\n            'duration parameter is only supported for video models (veo, seedance, seedance-pro). This parameter will be ignored.',\n        });\n      }\n      if (pollinationsOptions?.audio !== undefined) {\n        warnings.push({\n          type: 'unsupported',\n          feature: 'audio',\n          details:\n            'audio parameter is only supported for video models (veo). This parameter will be ignored.',\n        });\n      }\n    }\n\n    // Reference images (files parameter handling - basic implementation)\n    if (pollinationsOptions?.image !== undefined) {\n      params.append('image', pollinationsOptions.image);\n    } else if (files && files.length > 0) {\n      // Convert files to URLs/comma-separated format\n      // For now, we'll handle URL-based files\n      // TODO: Handle file uploads properly (may require different endpoint)\n      const imageUrls = files\n        .map((file) => {\n          if (file instanceof URL) return file.toString();\n          // For other file types, we'd need to upload them first\n          // For now, skip non-URL files\n          return null;\n        })\n        .filter((url): url is string => url !== null);\n\n      if (imageUrls.length > 0) {\n        params.append('image', imageUrls.join(','));\n      }\n    }\n\n    if (this.config.referrer) {\n      params.append('referrer', this.config.referrer);\n    }\n\n    const encodedPrompt = encodeURIComponent(prompt || '');\n    const url = `${this.config.baseURL}/${encodedPrompt}?${params.toString()}`;\n\n    // Add authentication if available\n    const configHeaders = this.config.headers();\n    // Filter out undefined values from headers\n    const cleanConfigHeaders: Record<string, string> = {};\n    for (const [key, value] of Object.entries(configHeaders)) {\n      if (value !== undefined) {\n        cleanConfigHeaders[key] = value;\n      }\n    }\n    const cleanHeaders: Record<string, string> = {};\n    if (headers) {\n      for (const [key, value] of Object.entries(headers)) {\n        if (\n          value !== undefined &&\n          !HEADERS_TO_OMIT.includes(key.toLowerCase())\n        ) {\n          cleanHeaders[key] = value;\n        }\n      }\n    }\n\n    // Use custom fetch if provided, otherwise use global fetch\n    const fetchFn = this.config.fetch ?? fetch;\n\n    // Always fetch the image and return as base64 (required for AI SDK compatibility)\n    // The URL is also included in metadata for reference\n    const response = await fetchFn(url, {\n      method: 'GET',\n      headers: {\n        ...cleanConfigHeaders,\n        ...cleanHeaders,\n      },\n      signal: abortSignal,\n    });\n\n    if (!response.ok) {\n      await handlePollinationsError(response, this.config.baseURL);\n    }\n\n    if (!response.body) {\n      throw new InvalidResponseDataError({\n        data: response,\n        message: 'Response body is null',\n      });\n    }\n\n    // Convert Blob to base64 string (as per V3 spec, images should be base64 strings or Uint8Array)\n    const blob = await response.blob();\n    const arrayBuffer = await blob.arrayBuffer();\n    const base64 = toBase64(arrayBuffer);\n\n    // Extract response headers\n    const responseHeaders: Record<string, string> = {};\n    response.headers.forEach((value: string, key: string) => {\n      responseHeaders[key] = value;\n    });\n\n    const currentDate = new Date();\n\n    // Determine media type: prefer blob.type, then response Content-Type header, finally default\n    const mediaType =\n      response.headers.get('content-type') || blob.type || 'image/png';\n\n    // Build metadata with URL always included for reference\n    const metadata = {\n      pollinations: {\n        images: [\n          {\n            mediaType: mediaType,\n            url: url, // Always include URL in metadata for reference\n          },\n        ],\n      },\n    } as ImageModelV3ProviderMetadata & {\n      pollinations: {\n        images: Array<{ mediaType: string; url?: string }>;\n      };\n    };\n\n    let usage: ImageModelV3Usage | undefined;\n    if (\n      response.headers.has('x-usage-total-tokens') ||\n      response.headers.has('x-usage-completion-image-tokens')\n    ) {\n      usage = {\n        inputTokens: 0,\n        outputTokens: parseInt(\n          response.headers.get('x-usage-completion-image-tokens')!,\n        ),\n        totalTokens: parseInt(response.headers.get('x-usage-total-tokens')!),\n      };\n    }\n\n    // Return in AI SDK V3 format with base64\n    // Images array always contains base64, URL is available in metadata\n    return {\n      images: [base64], // Always return base64 for AI SDK compatibility\n      warnings,\n      response: {\n        timestamp: currentDate,\n        modelId: this.modelId,\n        headers: responseHeaders,\n      },\n      providerMetadata: metadata,\n      usage: usage,\n    };\n  }\n}\n","import { APICallError, InvalidResponseDataError } from '@ai-sdk/provider';\n\n/**\n * Error response types for Pollinations API\n */\n\nexport interface PollinationsErrorObject {\n  message: string;\n  type?: string;\n  param?: string;\n  code?: string;\n}\n\nexport interface PollinationsErrorDetails {\n  error?: PollinationsErrorObject;\n  provider?: string;\n}\n\nexport interface PollinationsErrorResponse {\n  error?: string | PollinationsErrorObject;\n  message?: string;\n  status?: number;\n  details?: PollinationsErrorDetails;\n}\n\n/**\n * Type guard to check if an unknown value is a Pollinations error response\n */\nfunction isPollinationsErrorResponse(\n  obj: unknown,\n): obj is PollinationsErrorResponse {\n  return typeof obj === 'object' && obj !== null;\n}\n\n/**\n * Type guard to check if error is an error object (not a string)\n */\nfunction isPollinationsErrorObject(\n  error: string | PollinationsErrorObject | undefined,\n): error is PollinationsErrorObject {\n  if (typeof error !== 'object' || error === null) {\n    return false;\n  }\n  return 'message' in error && typeof error.message === 'string';\n}\n\n/**\n * Extract error message from Pollinations API error response\n */\nasync function extractErrorMessage(error: Response): Promise<string> {\n  const status = error.status;\n  const statusText = error.statusText;\n  let errorMessage = `API call failed with status ${status}: ${statusText}`;\n\n  try {\n    const errorText = await error.clone().text();\n    if (errorText) {\n      try {\n        const errorBody: unknown = JSON.parse(errorText);\n\n        // Handle Pollinations API error format:\n        // { error: \"...\", status: 400, details: { error: { message: \"...\", type: \"...\", param: \"...\", code: \"...\" }, provider: \"...\" } }\n        if (isPollinationsErrorResponse(errorBody)) {\n          // Check for nested error in details.error.message (Pollinations format)\n          if (errorBody.details?.error?.message) {\n            errorMessage = errorBody.details.error.message;\n          }\n          // Check for direct error.message\n          else if (isPollinationsErrorObject(errorBody.error)) {\n            errorMessage = errorBody.error.message;\n          }\n          // Check for error as string\n          else if (errorBody.error) {\n            errorMessage = errorBody.error;\n          }\n          // Check for direct message\n          else if (errorBody.message) {\n            errorMessage = errorBody.message;\n          } else {\n            errorMessage = `${errorMessage} - ${errorText}`;\n          }\n        } else {\n          errorMessage = `${errorMessage} - ${errorText}`;\n        }\n      } catch {\n        // If JSON parsing fails, use the raw text\n        errorMessage = `${errorMessage} - ${errorText}`;\n      }\n    }\n  } catch {\n    // If reading body fails, use default message\n  }\n\n  return errorMessage;\n}\n\n/**\n * Handle errors from Pollinations API calls\n */\nexport async function handlePollinationsError(\n  error: unknown,\n  baseURL: string,\n): Promise<never> {\n  if (error instanceof Response) {\n    const status = error.status;\n    const errorMessage = await extractErrorMessage(error);\n\n    throw new APICallError({\n      message: errorMessage,\n      url: error.url || baseURL,\n      requestBodyValues: {},\n      statusCode: status,\n      isRetryable: (status >= 500 && status < 600) || status === 429,\n      cause: error,\n    });\n  }\n\n  if (\n    error instanceof APICallError ||\n    error instanceof InvalidResponseDataError\n  ) {\n    throw error;\n  }\n\n  if (error instanceof Error) {\n    throw new APICallError({\n      message: error.message,\n      url: baseURL,\n      requestBodyValues: {},\n      cause: error,\n    });\n  }\n\n  throw new APICallError({\n    message: `Unknown error: ${String(error)}`,\n    url: baseURL,\n    requestBodyValues: {},\n    cause: error,\n  });\n}\n","import { InvalidPromptError, LanguageModelV3FilePart, LanguageModelV3Prompt, } from '@ai-sdk/provider';\n\n/**\n * Generate a seed value for reproducible generation.\n * Uses the provided seed, or falls back to -1 for true randomness.\n * According to Pollinations API: seed=-1 gives true random results (no caching).\n *\n * @param providedSeed - Seed from call options (e.g., from generateText, generateImage)\n * @returns A seed value, or -1 for true randomness if no seed provided\n */\nexport function resolveSeed(providedSeed?: number): number {\n  if (providedSeed !== undefined && providedSeed !== null) {\n    return providedSeed;\n  }\n  const maxInt32 = Math.pow(2, 31) - 1;\n  return Date.now() % maxInt32;\n}\n\n/**\n * Check if a string is valid base64\n * @param str - The string to validate\n * @returns True if the string is valid base64\n */\nfunction isBase64(str: string): boolean {\n  if (!str || str.length === 0) {\n    return false;\n  }\n  // Base64 should only contain A-Z, a-z, 0-9, +, /, and = for padding\n  // Length should be a multiple of 4\n  return /^[A-Za-z0-9+/]+=*$/.test(str) && str.length % 4 === 0;\n}\n\n/**\n * Convert data to base64 string (browser-compatible)\n * Works in both Node.js and browser environments\n *\n * @param data - The data to convert (string, Uint8Array, or ArrayBuffer)\n * @returns Base64 encoded string\n */\nexport function toBase64(data: string | Uint8Array | ArrayBuffer): string {\n  // Handle string input\n  if (typeof data === 'string') {\n    // Check if it's already a valid base64 string\n    if (isBase64(data)) {\n      return data; // Already base64, return as-is\n    }\n\n    // Not base64, convert string to base64\n    const globalBuffer = (globalThis as any).Buffer;\n    if (typeof globalBuffer !== 'undefined' && globalBuffer.from) {\n      // Node.js: use Buffer\n      return globalBuffer.from(data, 'utf-8').toString('base64');\n    }\n\n    // Browser: convert UTF-8 string to base64\n    // Use TextEncoder if available (modern browsers)\n    if (typeof TextEncoder !== 'undefined') {\n      const encoder = new TextEncoder();\n      const uint8Array = encoder.encode(data);\n      const binary = String.fromCharCode(...uint8Array);\n      return btoa(binary);\n    }\n\n    // Fallback: use encodeURIComponent for UTF-8 encoding\n    const utf8Bytes: number[] = [];\n    for (let i = 0; i < data.length; i++) {\n      const code = data.charCodeAt(i);\n      if (code < 0x80) {\n        utf8Bytes.push(code);\n      } else if (code < 0x800) {\n        utf8Bytes.push(0xc0 | (code >> 6), 0x80 | (code & 0x3f));\n      } else if (code < 0x10000) {\n        utf8Bytes.push(\n          0xe0 | (code >> 12),\n          0x80 | ((code >> 6) & 0x3f),\n          0x80 | (code & 0x3f),\n        );\n      }\n    }\n    return btoa(String.fromCharCode(...utf8Bytes));\n  }\n\n  // Handle ArrayBuffer or Uint8Array\n  const uint8Array = data instanceof ArrayBuffer ? new Uint8Array(data) : data;\n\n  // Check if Buffer is available (Node.js environment)\n  const globalBuffer = (globalThis as any).Buffer;\n  if (typeof globalBuffer !== 'undefined' && globalBuffer.from) {\n    return globalBuffer.from(uint8Array).toString('base64');\n  }\n\n  // Browser-compatible conversion using Uint8Array and btoa\n  // Process in chunks to avoid call stack overflow for large arrays\n  const chunkSize = 8192;\n  const chunks: string[] = [];\n\n  for (let i = 0; i < uint8Array.length; i += chunkSize) {\n    const chunk = uint8Array.slice(i, i + chunkSize);\n    // Use apply to avoid spreading large arrays\n    const binary = String.fromCharCode.apply(\n      null,\n      Array.from(chunk) as unknown as number[],\n    );\n    chunks.push(binary);\n  }\n\n  return btoa(chunks.join(''));\n}\n\n/**\n * Fetch PDF/audio `file` parts that use a `URL` so downstream APIs receive bytes\n * (PDF as `data:application/pdf;base64,...` in `file.file_data`; audio as raw base64 in `input_audio.data`).\n */\nexport async function resolvePromptFileContent(\n  prompt: LanguageModelV3Prompt,\n  fetchImpl: typeof fetch,\n  abortSignal?: AbortSignal,\n): Promise<LanguageModelV3Prompt> {\n  const result: LanguageModelV3Prompt = [];\n\n  for (const message of prompt) {\n    if (message.role !== 'user') {\n      result.push(message);\n      continue;\n    }\n\n    const { content } = message;\n    if (!Array.isArray(content)) {\n      result.push(message);\n      continue;\n    }\n\n    const nextContent = await Promise.all(\n      content.map(async (part) => {\n        if (part.type !== 'file' || !(part.data instanceof URL)) {\n          return part;\n        }\n\n        const needsFetch =\n          part.mediaType === 'application/pdf' ||\n          part.mediaType.startsWith('audio/');\n\n        if (!needsFetch) {\n          return part;\n        }\n\n        const res = await fetchImpl(part.data.toString(), {\n          signal: abortSignal,\n        });\n\n        if (!res.ok) {\n          throw new InvalidPromptError({\n            prompt,\n            message: `Failed to fetch file from URL (${res.status}): ${part.data.toString()}`,\n          });\n        }\n\n        const buf = await res.arrayBuffer();\n        return {\n          ...part,\n          data: new Uint8Array(buf),\n        } as LanguageModelV3FilePart;\n      }),\n    );\n\n    result.push({ ...message, content: nextContent });\n  }\n\n  return result;\n}\n","/**\n * Available Pollinations image model IDs\n * Based on: https://gen.pollinations.ai/image/models\n */\nexport type PollinationsImageModelId =\n  | 'kontext'\n  | 'turbo'\n  | 'nanobanana'\n  | 'nanobanana-pro'\n  | 'seedream'\n  | 'seedream-pro'\n  | 'gptimage'\n  | 'gptimage-large'\n  | 'flux'\n  | 'zimage'\n  | 'veo'\n  | 'seedance'\n  | 'seedance-pro'\n  | string;\n\n// Video model IDs (support aspectRatio, duration, audio)\nexport const VIDEO_MODELS: readonly PollinationsImageModelId[] = [\n  'veo',\n  'seedance',\n  'seedance-pro',\n] as const;\n\n// GPT image models (support quality, transparent)\nexport const GPTIMAGE_MODELS: readonly PollinationsImageModelId[] = [\n  'gptimage',\n  'gptimage-large',\n] as const;\n\n/**\n * Check if a model ID is a video model\n */\nexport function isVideoModel(modelId: PollinationsImageModelId): boolean {\n  return VIDEO_MODELS.includes(modelId);\n}\n\n/**\n * Check if a model ID is a GPT image model\n */\nexport function isGptImageModel(modelId: PollinationsImageModelId): boolean {\n  return GPTIMAGE_MODELS.includes(modelId);\n}\n\n// Maximum number of images per call for Pollinations models\n// Most models support generating 1 image at a time\nexport const modelMaxImagesPerCall: Record<\n  Exclude<PollinationsImageModelId, string>,\n  number\n> = {\n  kontext: 1,\n  turbo: 1,\n  nanobanana: 1,\n  'nanobanana-pro': 1,\n  seedream: 1,\n  'seedream-pro': 1,\n  gptimage: 1,\n  'gptimage-large': 1,\n  flux: 1,\n  zimage: 1,\n  veo: 1,\n  seedance: 1,\n  'seedance-pro': 1,\n};\n","import type {\n  LanguageModelV3,\n  LanguageModelV3CallOptions,\n  LanguageModelV3Content,\n  LanguageModelV3GenerateResult,\n  LanguageModelV3StreamResult,\n  SharedV3Warning,\n} from '@ai-sdk/provider';\nimport { InvalidResponseDataError } from '@ai-sdk/provider';\nimport { handlePollinationsError } from '../pollinations-error-handler';\nimport { PollinationsConfig } from '../pollinations-provider';\nimport type {\n  PollinationsLanguageModelSettings,\n  PollinationsResponse,\n} from '../pollinations-types';\nimport { resolvePromptFileContent, resolveSeed } from '../pollinations-utils';\nimport { extractGroundingSourcesFromMetadata } from './pollinations-language-utils';\nimport {\n  convertToProviderMessages,\n  mapFinishReason,\n  mapToolChoice,\n  prepareTools,\n} from './pollinations-message-converter';\nimport {\n  createPollinationsParser,\n  createPollinationsTransformer,\n} from './pollinations-stream-transformer';\n\nexport class PollinationsLanguageModel implements LanguageModelV3 {\n  readonly specificationVersion = 'v3';\n  readonly provider: string;\n  readonly modelId: string;\n\n  private readonly settings: PollinationsLanguageModelSettings;\n  private readonly config: PollinationsConfig;\n\n  constructor(\n    modelId: string,\n    settings: PollinationsLanguageModelSettings,\n    config: PollinationsConfig,\n  ) {\n    this.provider = config.provider;\n    this.modelId = modelId;\n    this.settings = settings;\n    this.config = config;\n  }\n\n  // Supported URL patterns for native file handling (OpenAI-compatible multimodal parts)\n  readonly supportedUrls = {\n    'image/*': [/^https?:\\/\\/.*$/],\n    'application/pdf': [/^https?:\\/\\/.*$/],\n    'audio/wav': [/^https?:\\/\\/.*$/],\n    'audio/x-wav': [/^https?:\\/\\/.*$/],\n    'audio/mpeg': [/^https?:\\/\\/.*$/],\n    'audio/mp3': [/^https?:\\/\\/.*$/],\n  };\n\n  // Convert AI SDK prompt to provider format\n  private getArgs(options: LanguageModelV3CallOptions): {\n    args: Record<string, unknown>;\n    warnings: SharedV3Warning[];\n  } {\n    const warnings: SharedV3Warning[] = [];\n\n    // Map messages to provider format\n    let messages = convertToProviderMessages(options.prompt, warnings);\n\n    // Handle response format (proper implementation)\n    let responseFormat: Record<string, unknown> | undefined;\n    if (options.responseFormat) {\n      if (options.responseFormat.type === 'json') {\n        // JSON mode - determine if json_object or json_schema\n        if (options.responseFormat.schema) {\n          // Use json_schema format\n          responseFormat = {\n            type: 'json_schema',\n            json_schema: {\n              schema: options.responseFormat.schema,\n              ...(options.responseFormat.name && {\n                name: options.responseFormat.name,\n              }),\n              ...(options.responseFormat.description && {\n                description: options.responseFormat.description,\n              }),\n            },\n          };\n        } else {\n          // Simple JSON object mode\n          responseFormat = {\n            type: 'json_object',\n          };\n        }\n      } else {\n        // Text mode (explicit)\n        responseFormat = {\n          type: 'text',\n        };\n      }\n    }\n\n    // Warn about unsupported parameters\n    if (options.topK !== undefined) {\n      warnings.push({\n        type: 'unsupported',\n        feature: 'topK',\n        details:\n          'Pollinations API does not support topK parameter. Use temperature or topP instead.',\n      });\n    }\n\n    if (options.includeRawChunks) {\n      warnings.push({\n        type: 'unsupported',\n        feature: 'includeRawChunks',\n        details:\n          'Pollinations API does not support includeRawChunks parameter. This setting will be ignored.',\n      });\n    }\n\n    // Generate seed: uses provided seed from call options, or -1 for true randomness\n    const seed = resolveSeed(options.seed);\n\n    // Build request body\n    const body: Record<string, unknown> = {\n      model: this.modelId,\n      messages,\n      seed,\n    };\n\n    // Only include parameters if explicitly provided\n    if (options.temperature !== undefined) {\n      body.temperature = options.temperature;\n    }\n    if (options.maxOutputTokens !== undefined) {\n      body.max_tokens = options.maxOutputTokens;\n    }\n    if (options.topP !== undefined) {\n      body.top_p = options.topP;\n    }\n\n    // Add stop sequences if provided\n    if (options.stopSequences && options.stopSequences.length > 0) {\n      body.stop = options.stopSequences;\n    }\n\n    // Add frequency and presence penalties (from V3 call options)\n    if (options.frequencyPenalty !== undefined) {\n      body.frequency_penalty = options.frequencyPenalty;\n    }\n    if (options.presencePenalty !== undefined) {\n      body.presence_penalty = options.presencePenalty;\n    }\n\n    // Add response format if specified\n    if (responseFormat) {\n      body.response_format = responseFormat;\n    }\n\n    // Handle tools if provided\n    if (options.tools && options.tools.length > 0) {\n      const { tools: pollinationsTools, warnings: toolWarnings } = prepareTools(\n        options.tools,\n      );\n      warnings.push(...toolWarnings);\n      if (pollinationsTools.length > 0) {\n        body.tools = pollinationsTools;\n        if (options.toolChoice) {\n          body.tool_choice = mapToolChoice(options.toolChoice);\n        }\n      }\n    }\n\n    // Handle additional parameters via providerOptions.pollinations\n    // Merge settings with providerOptions (providerOptions take precedence)\n    // All options are passed through to the API to support future API updates\n    const pollinationsOptions = options.providerOptions?.pollinations as\n      | Record<string, unknown>\n      | undefined;\n\n    // Start with settings, then override with providerOptions\n    const mergedOptions: Record<string, unknown> = { ...this.settings };\n\n    if (pollinationsOptions) {\n      // Override with providerOptions (takes precedence)\n      for (const [key, value] of Object.entries(pollinationsOptions)) {\n        if (value !== undefined) {\n          mergedOptions[key] = value;\n        }\n      }\n    }\n\n    // Pass all merged options to the API\n    for (const [key, value] of Object.entries(mergedOptions)) {\n      if (value !== undefined) {\n        body[key] = value;\n      }\n    }\n\n    return { args: body, warnings };\n  }\n\n  async doGenerate(\n    options: LanguageModelV3CallOptions,\n  ): Promise<LanguageModelV3GenerateResult> {\n    const fetchFn = this.config.fetch ?? fetch;\n    const prompt = await resolvePromptFileContent(\n      options.prompt,\n      fetchFn,\n      options.abortSignal,\n    );\n    const { args, warnings } = this.getArgs({ ...options, prompt });\n\n    let response: PollinationsResponse;\n    let responseHeaders: Record<string, string> = {};\n\n    try {\n      const fetchResponse = await fetchFn(this.config.baseURL, {\n        method: 'POST',\n        headers: this.config.headers(),\n        body: JSON.stringify(args),\n        signal: options.abortSignal,\n      });\n\n      // Extract response headers\n      fetchResponse.headers.forEach((value: string, key: string) => {\n        responseHeaders[key] = value;\n      });\n\n      if (!fetchResponse.ok) {\n        await handlePollinationsError(fetchResponse, this.config.baseURL);\n      }\n\n      response = await fetchResponse.json();\n    } catch (error) {\n      await handlePollinationsError(error, this.config.baseURL); // This throws, so response is definitely assigned below\n    }\n\n    // Convert provider response to AI SDK format\n    const content: LanguageModelV3Content[] = [];\n\n    const choice = response!.choices?.[0];\n    if (!choice) {\n      throw new InvalidResponseDataError({\n        data: response!,\n        message: 'No choices in response',\n      });\n    }\n\n    // Extract reasoning content (before text)\n    const reasoning = choice.message?.reasoning_content;\n    if (reasoning != null && reasoning.length > 0) {\n      content.push({\n        type: 'reasoning',\n        text: reasoning,\n      });\n    }\n\n    // Extract text content\n    if (choice.message?.content) {\n      content.push({\n        type: 'text',\n        text: choice.message.content,\n      });\n    }\n\n    // Extract citations as source parts (e.g. Perplexity-style responses)\n    if (Array.isArray(response!.citations)) {\n      for (const url of response!.citations) {\n        if (!url) continue;\n        content.push({\n          type: 'source',\n          sourceType: 'url',\n          id: this.config.generateId(),\n          url,\n        });\n      }\n    }\n\n    // Extract grounded sources from groundingMetadata (e.g. Vertex-style responses)\n    const groundingSources = extractGroundingSourcesFromMetadata(\n      // Grounding metadata is attached per choice in the Pollinations response\n      choice.groundingMetadata,\n      this.config.generateId,\n    );\n\n    if (groundingSources) {\n      content.push(...groundingSources);\n    }\n\n    // Extract OpenAI-style annotations as URL sources (e.g. gpt-4/5 via Pollinations)\n    const annotations = choice.message?.annotations;\n\n    if (Array.isArray(annotations)) {\n      for (const annotation of annotations) {\n        const url = annotation.url_citation?.url;\n        if (!url) continue;\n        content.push({\n          type: 'source',\n          sourceType: 'url',\n          id: this.config.generateId(),\n          url,\n          title: annotation.url_citation?.title ?? undefined,\n        });\n      }\n    }\n\n    // Extract tool calls\n    if (choice.message?.tool_calls) {\n      for (const toolCall of choice.message.tool_calls) {\n        if (!toolCall.id || !toolCall.function?.name) {\n          warnings.push({\n            type: 'other',\n            message:\n              'Invalid tool call in response: missing id or function name',\n          });\n          continue;\n        }\n\n        content.push({\n          type: 'tool-call',\n          toolCallId: toolCall.id,\n          toolName: toolCall.function.name,\n          input: toolCall.function.arguments || '{}',\n        });\n      }\n    }\n\n    return {\n      content,\n      finishReason: {\n        unified: mapFinishReason(\n          choice.finish_reason,\n          content.some(\n            (part) => part.type === 'tool-call' && !part.providerExecuted,\n          ),\n        ),\n        raw: choice.finish_reason ?? undefined,\n      },\n      usage: {\n        inputTokens: {\n          total: response!.usage?.prompt_tokens ?? 0,\n          noCache: 0,\n          cacheRead: response!.usage?.prompt_tokens_details?.cached_tokens ?? 0,\n          cacheWrite: 0,\n        },\n        outputTokens: {\n          total: response!.usage?.completion_tokens ?? 0,\n          text: 0,\n          reasoning:\n            response!.usage?.completion_tokens_details?.reasoning_tokens ?? 0,\n        },\n      },\n      request: { body: args },\n      warnings,\n    };\n  }\n\n  async doStream(\n    options: LanguageModelV3CallOptions,\n  ): Promise<LanguageModelV3StreamResult> {\n    const fetchFn = this.config.fetch ?? fetch;\n    const prompt = await resolvePromptFileContent(\n      options.prompt,\n      fetchFn,\n      options.abortSignal,\n    );\n    const { args, warnings } = this.getArgs({ ...options, prompt });\n\n    // Add stream: true parameter for streaming responses\n    const streamArgs: Record<string, unknown> = { ...args, stream: true };\n\n    // Handle stream_options if provided via providerOptions\n    const pollinationsOptions = options.providerOptions?.pollinations as\n      | Record<string, unknown>\n      | undefined;\n\n    if (pollinationsOptions?.stream_options) {\n      streamArgs.stream_options = pollinationsOptions.stream_options;\n    }\n\n    let response: Response;\n    try {\n      // According to Pollinations API docs: https://raw.githubusercontent.com/pollinations/pollinations/refs/heads/main/APIDOCS.md\n      // The stream parameter enables real-time chunked responses\n      response = await fetchFn(this.config.baseURL, {\n        method: 'POST',\n        headers: {\n          ...this.config.headers(),\n          'Content-Type': 'application/json',\n        },\n        body: JSON.stringify(streamArgs),\n        signal: options.abortSignal,\n      });\n\n      if (!response.ok) {\n        await handlePollinationsError(response, this.config.baseURL);\n      }\n\n      if (!response.body) {\n        throw new InvalidResponseDataError({\n          data: response,\n          message: 'Response body is null',\n        });\n      }\n    } catch (error) {\n      await handlePollinationsError(error, this.config.baseURL);\n    }\n\n    // Transform stream to AI SDK format\n    const stream = response!\n      .body!.pipeThrough(new TextDecoderStream())\n      .pipeThrough(createPollinationsParser())\n      .pipeThrough(createPollinationsTransformer(warnings));\n\n    return { stream };\n  }\n}\n","import type { LanguageModelV3Content } from '@ai-sdk/provider';\nimport { PollinationsResponse } from '../pollinations-types';\n\n/**\n * Shared helper to extract grounded sources from grounding metadata, following\n * the pattern used by the Google Generative AI provider:\n * https://raw.githubusercontent.com/vercel/ai/refs/heads/main/packages/google/src/google-generative-ai-language-model.ts\n */\nexport function extractGroundingSourcesFromMetadata(\n  groundingMetadata: PollinationsResponse['choices'][number]['groundingMetadata'],\n  generateId: () => string,\n): LanguageModelV3Content[] | undefined {\n  const groundingChunks = groundingMetadata?.groundingChunks;\n  if (!Array.isArray(groundingChunks) || groundingChunks.length === 0) {\n    return undefined;\n  }\n\n  const sources: LanguageModelV3Content[] = [];\n\n  for (const chunk of groundingChunks) {\n    // Web chunks → URL sources\n    if (chunk.web?.uri) {\n      sources.push({\n        type: 'source',\n        sourceType: 'url',\n        id: generateId(),\n        url: chunk.web.uri,\n        title: chunk.web.title ?? undefined,\n      });\n      continue;\n    }\n\n    // Retrieved context chunks (RAG-style)\n    if (chunk.retrievedContext) {\n      const uri = chunk.retrievedContext.uri as string | null | undefined;\n      const fileSearchStore = chunk.retrievedContext.fileSearchStore as\n        | string\n        | null\n        | undefined;\n\n      if (uri && (uri.startsWith('http://') || uri.startsWith('https://'))) {\n        // HTTP/HTTPS URL\n        sources.push({\n          type: 'source',\n          sourceType: 'url',\n          id: generateId(),\n          url: uri,\n          title: chunk.retrievedContext.title ?? undefined,\n        });\n      } else if (uri) {\n        // Document path (gs://, etc.) → document source\n        const title = chunk.retrievedContext.title ?? 'Unknown Document';\n        let mediaType = 'application/octet-stream';\n        let filename: string | undefined = uri.split('/').pop();\n\n        if (uri.endsWith('.pdf')) {\n          mediaType = 'application/pdf';\n        } else if (uri.endsWith('.txt')) {\n          mediaType = 'text/plain';\n        } else if (uri.endsWith('.docx')) {\n          mediaType =\n            'application/vnd.openxmlformats-officedocument.wordprocessingml.document';\n        } else if (uri.endsWith('.doc')) {\n          mediaType = 'application/msword';\n        } else if (uri.match(/\\.(md|markdown)$/)) {\n          mediaType = 'text/markdown';\n        }\n\n        sources.push({\n          type: 'source',\n          sourceType: 'document',\n          id: generateId(),\n          mediaType,\n          title,\n          filename,\n        });\n      } else if (fileSearchStore) {\n        // File Search with fileSearchStore (no uri)\n        const title = chunk.retrievedContext.title ?? 'Unknown Document';\n        const filename = fileSearchStore.split('/').pop();\n\n        sources.push({\n          type: 'source',\n          sourceType: 'document',\n          id: generateId(),\n          mediaType: 'application/octet-stream',\n          title,\n          filename,\n        });\n      }\n      continue;\n    }\n\n    // Maps chunks → URL sources\n    if (chunk.maps?.uri) {\n      sources.push({\n        type: 'source',\n        sourceType: 'url',\n        id: generateId(),\n        url: chunk.maps.uri,\n        title: chunk.maps.title ?? undefined,\n      });\n    }\n  }\n\n  return sources.length > 0 ? sources : undefined;\n}\n","import {\n  type LanguageModelV3CallOptions,\n  type LanguageModelV3Prompt,\n  type SharedV3Warning,\n  UnsupportedFunctionalityError,\n} from '@ai-sdk/provider';\nimport { convertToBase64 } from '@ai-sdk/provider-utils';\n\n/** User message content items for the Pollinations OpenAI-compatible chat API */\nexport type PollinationsUserContentPart =\n  | { type: 'text'; text: string }\n  | { type: 'image_url'; image_url: { url: string } }\n  | {\n      type: 'input_audio';\n      input_audio: { data: string; format: 'wav' | 'mp3' };\n    }\n  | {\n      type: 'file';\n      file: { file_id: string } | { filename: string; file_data: string };\n    };\n\nexport interface PollinationsMessage {\n  role: 'system' | 'user' | 'assistant' | 'tool';\n  content: string | PollinationsUserContentPart[];\n  tool_calls?: Array<{\n    id: string;\n    type: 'function';\n    function: {\n      name: string;\n      arguments: string;\n    };\n  }>;\n  tool_call_id?: string;\n  name?: string;\n}\n\n/**\n * Convert AI SDK prompt to Pollinations API message format\n */\nexport function convertToProviderMessages(\n  prompt: LanguageModelV3Prompt,\n  warnings: SharedV3Warning[],\n): PollinationsMessage[] {\n  const messages: PollinationsMessage[] = [];\n\n  for (const { role, content } of prompt) {\n    switch (role) {\n      case 'system': {\n        messages.push({ role: 'system', content: content });\n        break;\n      }\n\n      case 'user': {\n        // Handle simple text-only content\n        if (content.length === 1 && content[0].type === 'text') {\n          messages.push({\n            role: 'user',\n            content: content[0].text,\n          });\n          break;\n        }\n\n        // Handle multipart content\n        messages.push({\n          role: 'user',\n          content: content.map((part, index) => {\n            switch (part.type) {\n              case 'text': {\n                return { type: 'text', text: part.text };\n              }\n              case 'file': {\n                if (part.mediaType.startsWith('image/')) {\n                  const mediaType =\n                    part.mediaType === 'image/*'\n                      ? 'image/jpeg'\n                      : part.mediaType;\n                  return {\n                    type: 'image_url',\n                    image_url: {\n                      url:\n                        part.data instanceof URL\n                          ? part.data.toString()\n                          : `data:${mediaType};base64,${convertToBase64(part.data)}`,\n                    },\n                  };\n                } else if (part.mediaType.startsWith('audio/')) {\n                  if (part.data instanceof URL) {\n                    throw new UnsupportedFunctionalityError({\n                      functionality: 'audio file parts with URLs',\n                    });\n                  }\n\n                  switch (part.mediaType) {\n                    case 'audio/wav': {\n                      return {\n                        type: 'input_audio',\n                        input_audio: {\n                          data: convertToBase64(part.data),\n                          format: 'wav',\n                        },\n                      };\n                    }\n                    case 'audio/mp3':\n                    case 'audio/mpeg': {\n                      return {\n                        type: 'input_audio',\n                        input_audio: {\n                          data: convertToBase64(part.data),\n                          format: 'mp3',\n                        },\n                      };\n                    }\n\n                    default: {\n                      throw new UnsupportedFunctionalityError({\n                        functionality: `audio content parts with media type ${part.mediaType}`,\n                      });\n                    }\n                  }\n                } else if (part.mediaType === 'application/pdf') {\n                  if (part.data instanceof URL) {\n                    throw new UnsupportedFunctionalityError({\n                      functionality: 'PDF file parts with URLs',\n                    });\n                  }\n                  return {\n                    type: 'file',\n                    file:\n                      typeof part.data === 'string' &&\n                      part.data.startsWith('file-')\n                        ? { file_id: part.data }\n                        : {\n                            filename: part.filename ?? `part-${index}.pdf`,\n                            file_data: `data:application/pdf;base64,${convertToBase64(part.data)}`,\n                          },\n                  };\n                } else {\n                  throw new UnsupportedFunctionalityError({\n                    functionality: `${part.mediaType} media type is not supported`,\n                  });\n                }\n              }\n              default: {\n                throw new UnsupportedFunctionalityError({\n                  functionality: `User content part ${part} is not supported`,\n                });\n              }\n            }\n          }),\n        });\n\n        break;\n      }\n\n      case 'assistant': {\n        let assistantText = '';\n        const toolCalls: Array<{\n          id: string;\n          type: 'function';\n          function: { name: string; arguments: string };\n        }> = [];\n\n        for (const part of content) {\n          switch (part.type) {\n            case 'text': {\n              assistantText += part.text;\n              break;\n            }\n            case 'tool-call': {\n              toolCalls.push({\n                id: part.toolCallId,\n                type: 'function',\n                function: {\n                  name: part.toolName,\n                  arguments: JSON.stringify(part.input),\n                },\n              });\n              break;\n            }\n            case 'reasoning': {\n              // Reasoning is not supported by Pollinations API, include as text\n              warnings.push({\n                type: 'other',\n                message:\n                  'Reasoning content is not supported by Pollinations API; including as text',\n              });\n              assistantText += part.text;\n              break;\n            }\n            default: {\n              warnings.push({\n                type: 'other',\n                message: `Assistant content part type ${(part as any).type} is not supported`,\n              });\n            }\n          }\n        }\n\n        const assistantMessage: PollinationsMessage = {\n          role: 'assistant',\n          content: assistantText,\n        };\n\n        if (toolCalls.length > 0) {\n          assistantMessage.tool_calls = toolCalls;\n        }\n\n        messages.push(assistantMessage);\n        break;\n      }\n\n      case 'tool': {\n        if (content.length === 0) {\n          warnings.push({\n            type: 'other',\n            message: 'Tool message has no tool results',\n          });\n          messages.push({\n            role: 'tool',\n            tool_call_id: '',\n            name: '',\n            content: JSON.stringify(content),\n          });\n          break;\n        }\n        // Pollinations API expects one tool result per message\n        for (const toolResponse of content) {\n          if (toolResponse.type === 'tool-result') {\n            let contentValue: string;\n            const output = toolResponse.output;\n\n            switch (output.type) {\n              case 'text':\n              case 'error-text': {\n                contentValue = output.value;\n                break;\n              }\n              case 'json':\n              case 'error-json': {\n                contentValue = JSON.stringify(output.value);\n                break;\n              }\n              case 'content': {\n                // Handle content type (array of text/media)\n                contentValue = output.value\n                  .map((item) => (item.type === 'text' ? item.text : ''))\n                  .join('\\n');\n                break;\n              }\n              default: {\n                contentValue = JSON.stringify(output);\n              }\n            }\n\n            messages.push({\n              role: 'tool',\n              tool_call_id: toolResponse.toolCallId,\n              name: toolResponse.toolName,\n              content: contentValue,\n            });\n          }\n        }\n        break;\n      }\n\n      default: {\n        throw new Error(`Unsupported message role: ${role}`);\n      }\n    }\n  }\n\n  return messages;\n}\n\n/**\n * Prepare tools for Pollinations API format\n * Returns tools and any warnings about unsupported tool configurations\n */\nexport function prepareTools(tools: LanguageModelV3CallOptions['tools']): {\n  tools: Array<{\n    type: 'function';\n    function: {\n      name: string;\n      description?: string;\n      parameters: Record<string, unknown>;\n    };\n  }>;\n  warnings: SharedV3Warning[];\n} {\n  const warnings: SharedV3Warning[] = [];\n\n  if (!tools) {\n    return { tools: [], warnings };\n  }\n\n  const pollinationsTools = tools\n    .filter((tool) => {\n      if (tool.type !== 'function') {\n        warnings.push({\n          type: 'unsupported',\n          feature: 'tool',\n          details: `Tool type ${tool.type} is not supported`,\n        });\n        return false;\n      }\n      return true;\n    })\n    .map((tool) => {\n      // Type guard: ensure it's a function tool\n      if (tool.type !== 'function') {\n        throw new Error('Expected function tool');\n      }\n\n      // Get the input schema - should be a JSON Schema object\n      // Following OpenAI pattern: parameters: tool.inputSchema\n      const inputSchema = tool.inputSchema as Record<string, unknown>;\n\n      // Ensure the schema is valid and has type: \"object\" at root level\n      let parameters: Record<string, unknown>;\n\n      if (\n        !inputSchema ||\n        typeof inputSchema !== 'object' ||\n        Array.isArray(inputSchema)\n      ) {\n        // Invalid schema - create a default empty object schema\n        parameters = {\n          type: 'object',\n          properties: {},\n        };\n        warnings.push({\n          type: 'other',\n          message: `Invalid schema for tool '${tool.name}': schema must be a JSON Schema object`,\n        });\n      } else {\n        // Always ensure type: \"object\" is present at root level\n        // Create a new object with type: \"object\" first, then spread the rest\n        // This ensures type is always set correctly, even if missing from inputSchema\n        parameters = {\n          type: 'object',\n          ...inputSchema,\n        };\n        // Explicitly set type to \"object\" to override any existing type\n        parameters.type = 'object';\n\n        // Warn if the original schema had a different type\n        if (\n          inputSchema.type !== undefined &&\n          inputSchema.type !== null &&\n          inputSchema.type !== 'object'\n        ) {\n          warnings.push({\n            type: 'other',\n            message: `Schema for tool '${tool.name}' must have type: \"object\" at root level, got type: \"${inputSchema.type}\"`,\n          });\n        }\n      }\n\n      return {\n        type: 'function' as const,\n        function: {\n          name: tool.name,\n          description: tool.description,\n          parameters,\n        },\n      };\n    });\n\n  return { tools: pollinationsTools, warnings };\n}\n\n/**\n * Map AI SDK tool choice to Pollinations API format\n */\nexport function mapToolChoice(\n  toolChoice?: LanguageModelV3CallOptions['toolChoice'],\n): 'none' | 'auto' | 'required' {\n  if (!toolChoice || toolChoice.type === 'tool') {\n    return 'auto';\n  }\n  return toolChoice.type;\n}\n\n/**\n * Normalize finish reason string by converting to lowercase and\n * standardizing separators (both underscores and hyphens become hyphens)\n */\nfunction normalizeFinishReason(reason: string): string {\n  return reason.toLowerCase().replace(/[-_]/g, '-');\n}\n\n/**\n * Map Pollinations API finish reason to AI SDK format\n * Handles various case formats and both underscore/hyphen variants\n * (normalization handles underscore/hyphen conversion, map uses normalized keys)\n */\nconst FINISH_REASON_MAP: Record<\n  string,\n  'stop' | 'length' | 'content-filter' | 'tool-calls' | 'error'\n> = {\n  // Normal stop reasons\n  stop: 'stop',\n  // Length/max tokens reasons\n  length: 'length',\n  'max-tokens': 'length',\n  'max-token': 'length',\n  // Tool calls reasons (normalization handles tool_calls -> tool-calls)\n  'tool-calls': 'tool-calls',\n  toolcalls: 'tool-calls',\n  // Content filter/safety reasons (normalization handles content_filter -> content-filter)\n  'content-filter': 'content-filter',\n  contentfilter: 'content-filter',\n  safety: 'content-filter',\n  'image-safety': 'content-filter',\n  recitation: 'content-filter',\n  blocklist: 'content-filter',\n  'prohibited-content': 'content-filter',\n  spii: 'content-filter',\n  // Error reasons (normalization handles malformed_function_call -> malformed-function-call)\n  error: 'error',\n  'malformed-function-call': 'error',\n  'function-call-error': 'error',\n} as const;\n\nexport function mapFinishReason(\n  finishReason: string | null | undefined,\n  hasToolCalls?: boolean,\n): 'stop' | 'length' | 'tool-calls' | 'content-filter' | 'error' | 'other' {\n  if (!finishReason) {\n    return 'stop';\n  }\n\n  const normalized = normalizeFinishReason(finishReason);\n  const mapped = FINISH_REASON_MAP[normalized] ?? 'other';\n\n  // If finish reason is 'stop' and there are tool calls, return 'tool-calls' instead\n  if (mapped === 'stop' && hasToolCalls) {\n    return 'tool-calls';\n  }\n\n  return mapped;\n}\n","import type {\n  LanguageModelV3StreamPart,\n  SharedV3Warning,\n} from '@ai-sdk/provider';\nimport { generateId } from '@ai-sdk/provider-utils';\nimport type { PollinationsStreamChunk } from '../pollinations-types';\nimport { extractGroundingSourcesFromMetadata } from './pollinations-language-utils';\nimport { mapFinishReason } from './pollinations-message-converter';\n\n/**\n * Check if a string is valid JSON\n */\nfunction isParsableJson(str: string): boolean {\n  try {\n    JSON.parse(str);\n    return true;\n  } catch {\n    return false;\n  }\n}\n\n/**\n * Create a parser for Pollinations SSE stream\n */\nexport function createPollinationsParser(): TransformStream<\n  string,\n  PollinationsStreamChunk\n> {\n  let buffer = '';\n\n  return new TransformStream({\n    transform(chunk, controller) {\n      buffer += chunk;\n      const lines = buffer.split('\\n');\n      buffer = lines.pop() || '';\n\n      for (const line of lines) {\n        const trimmed = line.trim();\n        if (!trimmed || !trimmed.startsWith('data: ')) continue;\n        if (trimmed === 'data: [DONE]') {\n          controller.terminate();\n          return;\n        }\n\n        try {\n          const data = JSON.parse(trimmed.slice(6));\n          controller.enqueue(data);\n        } catch (error) {\n          // Skip invalid JSON\n        }\n      }\n    },\n    flush(controller) {\n      if (buffer.trim()) {\n        const trimmed = buffer.trim();\n        if (trimmed.startsWith('data: ') && trimmed !== 'data: [DONE]') {\n          try {\n            const data = JSON.parse(trimmed.slice(6));\n            controller.enqueue(data);\n          } catch (error) {\n            // Skip invalid JSON\n          }\n        }\n      }\n    },\n  });\n}\n\n/**\n * Finish any pending tool calls that haven't been completed yet.\n * This is used both when the stream finishes normally and during flush cleanup.\n */\nfunction finishPendingToolCalls(\n  toolCalls: Map<\n    number,\n    {\n      id?: string;\n      name?: string;\n      args: string;\n      hasFinished: boolean;\n    }\n  >,\n  controller: TransformStreamDefaultController<LanguageModelV3StreamPart>,\n): void {\n  for (const toolCall of toolCalls.values()) {\n    if (!toolCall.hasFinished && toolCall.id && toolCall.name) {\n      // Even if args aren't valid JSON, emit the tool call\n      if (toolCall.args.length > 0) {\n        controller.enqueue({\n          type: 'tool-input-end',\n          id: toolCall.id,\n        });\n      }\n\n      controller.enqueue({\n        type: 'tool-call',\n        toolCallId: toolCall.id,\n        toolName: toolCall.name,\n        input: toolCall.args || '{}',\n      });\n    }\n  }\n}\n\n/**\n * Create a transformer for Pollinations stream chunks to AI SDK format\n */\nexport function createPollinationsTransformer(\n  warnings: SharedV3Warning[],\n): TransformStream<PollinationsStreamChunk, LanguageModelV3StreamPart> {\n  let isFirstChunk = true;\n  let isActiveReasoning = false;\n  let isActiveText = false;\n  let hasEmittedGroundingSources = false;\n  const reasoningId = 'reasoning-0';\n  const textId = '0';\n  const toolCalls = new Map<\n    number,\n    {\n      id?: string;\n      name?: string;\n      args: string;\n      hasFinished: boolean;\n    }\n  >();\n\n  return new TransformStream({\n    transform(chunk, controller) {\n      // Send warnings with first chunk\n      if (isFirstChunk) {\n        controller.enqueue({ type: 'stream-start', warnings });\n\n        // Handle response metadata\n        if (chunk.model) {\n          controller.enqueue({\n            type: 'response-metadata',\n            modelId: chunk.model,\n          });\n        }\n\n        // Emit citations as sources (e.g. Perplexity-style responses)\n        if (Array.isArray(chunk.citations)) {\n          for (const url of chunk.citations) {\n            if (!url) continue;\n            controller.enqueue({\n              type: 'source',\n              sourceType: 'url',\n              id: generateId(),\n              url,\n            });\n          }\n        }\n\n        isFirstChunk = false;\n      }\n\n      const choice = chunk.choices?.[0];\n      if (!choice) return;\n\n      const delta = choice.delta;\n\n      // Emit grounded sources once per stream if grounding metadata is present\n      if (choice.groundingMetadata && !hasEmittedGroundingSources) {\n        const groundingSources = extractGroundingSourcesFromMetadata(\n          choice.groundingMetadata,\n          generateId,\n        );\n        if (groundingSources) {\n          for (const source of groundingSources) {\n            controller.enqueue(source as LanguageModelV3StreamPart);\n          }\n          hasEmittedGroundingSources = true;\n        }\n      }\n\n      // Emit OpenAI-style annotations as streaming URL sources (e.g. gpt-4/5 via Pollinations)\n      const annotations = (delta as any).annotations as\n        | Array<{\n            url_citation?: { url?: string; title?: string | null };\n          }>\n        | undefined;\n\n      if (Array.isArray(annotations)) {\n        for (const annotation of annotations) {\n          const url = annotation.url_citation?.url;\n          if (!url) continue;\n          controller.enqueue({\n            type: 'source',\n            sourceType: 'url',\n            id: generateId(),\n            url,\n            title: annotation.url_citation?.title ?? undefined,\n          });\n        }\n      }\n\n      // Handle reasoning content (before text) - following DeepSeek pattern\n      const reasoningContent = delta.reasoning_content;\n      if (reasoningContent) {\n        if (!isActiveReasoning) {\n          controller.enqueue({\n            type: 'reasoning-start',\n            id: reasoningId,\n          });\n          isActiveReasoning = true;\n        }\n\n        controller.enqueue({\n          type: 'reasoning-delta',\n          id: reasoningId,\n          delta: reasoningContent,\n        });\n      }\n\n      // Handle text content - following OpenAI pattern with text-start/text-delta/text-end\n      if (delta.content) {\n        // End reasoning when text starts\n        if (isActiveReasoning) {\n          controller.enqueue({\n            type: 'reasoning-end',\n            id: reasoningId,\n          });\n          isActiveReasoning = false;\n        }\n\n        if (!isActiveText) {\n          controller.enqueue({ type: 'text-start', id: textId });\n          isActiveText = true;\n        }\n        controller.enqueue({\n          type: 'text-delta',\n          id: textId,\n          delta: delta.content,\n        });\n      }\n\n      // Handle tool calls - following OpenAI pattern with tool-input-start/tool-input-delta/tool-input-end\n      if (delta.tool_calls) {\n        // End reasoning when tool calls start\n        if (isActiveReasoning) {\n          controller.enqueue({\n            type: 'reasoning-end',\n            id: reasoningId,\n          });\n          isActiveReasoning = false;\n        }\n\n        for (const toolCallDelta of delta.tool_calls) {\n          const index = toolCallDelta.index;\n          if (index === undefined) continue;\n\n          // Tool call start - OpenAI returns all information except arguments in first chunk\n          if (toolCalls.get(index) == null) {\n            if (toolCallDelta.type && toolCallDelta.type !== 'function') {\n              // Skip non-function tool calls\n              continue;\n            }\n\n            if (!toolCallDelta.id || !toolCallDelta.function?.name) {\n              // Wait for complete tool call info\n              continue;\n            }\n\n            controller.enqueue({\n              type: 'tool-input-start',\n              id: toolCallDelta.id,\n              toolName: toolCallDelta.function.name,\n            });\n\n            const toolCall = {\n              id: toolCallDelta.id,\n              name: toolCallDelta.function.name,\n              args: toolCallDelta.function.arguments ?? '',\n              hasFinished: false,\n            };\n\n            toolCalls.set(index, toolCall);\n\n            // If arguments are already present and valid JSON, complete immediately\n            if (\n              toolCall.args.length > 0 &&\n              isParsableJson(toolCall.args) &&\n              toolCall.name\n            ) {\n              controller.enqueue({\n                type: 'tool-input-delta',\n                id: toolCall.id,\n                delta: toolCall.args,\n              });\n\n              controller.enqueue({\n                type: 'tool-input-end',\n                id: toolCall.id,\n              });\n\n              controller.enqueue({\n                type: 'tool-call',\n                toolCallId: toolCall.id ?? generateId(),\n                toolName: toolCall.name,\n                input: toolCall.args,\n              });\n\n              toolCall.hasFinished = true;\n            } else if (toolCall.args.length > 0) {\n              // Send initial delta if arguments have started\n              controller.enqueue({\n                type: 'tool-input-delta',\n                id: toolCall.id,\n                delta: toolCall.args,\n              });\n            }\n\n            continue;\n          }\n\n          // Existing tool call - accumulate arguments\n          const toolCall = toolCalls.get(index);\n          if (!toolCall || toolCall.hasFinished) {\n            continue;\n          }\n\n          if (toolCallDelta.function?.arguments) {\n            toolCall.args += toolCallDelta.function.arguments;\n\n            // Send delta\n            if (toolCall.id) {\n              controller.enqueue({\n                type: 'tool-input-delta',\n                id: toolCall.id,\n                delta: toolCallDelta.function.arguments,\n              });\n            }\n\n            // Check if tool call is complete (valid JSON)\n            if (toolCall.name && toolCall.id && isParsableJson(toolCall.args)) {\n              controller.enqueue({\n                type: 'tool-input-end',\n                id: toolCall.id,\n              });\n\n              controller.enqueue({\n                type: 'tool-call',\n                toolCallId: toolCall.id ?? generateId(),\n                toolName: toolCall.name,\n                input: toolCall.args,\n              });\n\n              toolCall.hasFinished = true;\n            }\n          }\n        }\n      }\n\n      // Handle finish reason\n      if (choice.finish_reason) {\n        // Finish any active reasoning\n        if (isActiveReasoning) {\n          controller.enqueue({ type: 'reasoning-end', id: reasoningId });\n          isActiveReasoning = false;\n        }\n\n        // Finish any active text\n        if (isActiveText) {\n          controller.enqueue({ type: 'text-end', id: textId });\n          isActiveText = false;\n        }\n\n        // Finish any pending tool calls\n        finishPendingToolCalls(toolCalls, controller);\n        toolCalls.clear();\n\n        controller.enqueue({\n          type: 'finish',\n          finishReason: {\n            unified: mapFinishReason(choice.finish_reason),\n            raw: choice.finish_reason ?? undefined,\n          },\n          usage: {\n            inputTokens: {\n              total: chunk.usage?.prompt_tokens,\n              noCache: 0,\n              cacheRead:\n                chunk?.usage?.prompt_tokens_details?.cached_tokens ?? 0,\n              cacheWrite: 0,\n            },\n            outputTokens: {\n              total: chunk.usage?.completion_tokens,\n              text: 0,\n              reasoning:\n                chunk?.usage?.completion_tokens_details?.reasoning_tokens ?? 0,\n            },\n          },\n        });\n      }\n    },\n    flush(controller) {\n      // Finish any active reasoning\n      if (isActiveReasoning) {\n        controller.enqueue({ type: 'reasoning-end', id: reasoningId });\n      }\n\n      // Finish any active text\n      if (isActiveText) {\n        controller.enqueue({ type: 'text-end', id: textId });\n      }\n\n      // Finish any pending tool calls\n      finishPendingToolCalls(toolCalls, controller);\n    },\n  });\n}\n","/**\n * Constants for Pollinations API configuration\n */\n\n/**\n * Legacy API endpoints (deprecated, use new endpoints for new projects)\n */\nexport const LEGACY_API_ENDPOINTS = {\n  /** Legacy language model endpoint */\n  LANGUAGE: 'https://text.pollinations.ai/openai',\n  /** Legacy image model endpoint */\n  IMAGE: 'https://image.pollinations.ai/prompt',\n  /** Legacy default image base URL */\n  IMAGE_BASE: 'https://image.pollinations.ai',\n} as const;\n\n/**\n * New unified API endpoints (recommended)\n */\nexport const API_ENDPOINTS = {\n  /** New language model endpoint */\n  LANGUAGE: 'https://gen.pollinations.ai/v1/chat/completions',\n  /** New image model endpoint */\n  IMAGE: 'https://gen.pollinations.ai/image',\n} as const;\n\n/**\n * API key parameter names\n */\nexport const API_KEY_PARAMS = {\n  /** Legacy API key parameter name (for query string) */\n  LEGACY: 'token',\n  /** New API key parameter name (for query string) */\n  NEW: 'key',\n} as const;\n\n/**\n * Default configuration values\n */\nexport const DEFAULT_CONFIG = {\n  /** Default provider name */\n  PROVIDER_NAME: 'pollinations',\n  /** Default content type for requests */\n  CONTENT_TYPE: 'application/json',\n  /** Environment variable name for API key */\n  API_KEY_ENV_VAR: 'POLLINATIONS_API_KEY',\n} as const;\n\n/**\n * External URLs\n */\nexport const EXTERNAL_URLS = {\n  /** URL to get an API key */\n  AUTH: 'https://enter.pollinations.ai',\n} as const;\n","import { SharedV3Warning, SpeechModelV3 } from '@ai-sdk/provider';\nimport { combineHeaders } from '@ai-sdk/provider-utils';\nimport { handlePollinationsError } from '../pollinations-error-handler';\nimport { PollinationsConfig } from '../pollinations-provider';\nimport {\n  PollinationsAudioFormat,\n  PollinationsSpeechModelId,\n  PollinationsVoice,\n} from './pollinations-speech-options';\n\ninterface PollinationsSpeechModelConfig extends PollinationsConfig {\n  _internal?: {\n    currentDate?: () => Date;\n  };\n}\n\nexport class PollinationsSpeechModel implements SpeechModelV3 {\n  readonly specificationVersion = 'v3';\n  readonly provider: string;\n  readonly modelId: PollinationsSpeechModelId;\n\n  constructor(\n    modelId: PollinationsSpeechModelId,\n    private readonly config: PollinationsSpeechModelConfig,\n  ) {\n    this.provider = config.provider;\n    this.modelId = modelId;\n  }\n\n  private async getArgs({\n    text,\n    voice = 'alloy',\n    outputFormat = 'mp3',\n    speed,\n    instructions,\n  }: Parameters<SpeechModelV3['doGenerate']>[0]) {\n    const warnings: SharedV3Warning[] = [];\n\n    // Build messages array - add system message if instructions are provided\n    const messages: Array<{ role: string; content: string }> = [];\n    if (instructions !== undefined) {\n      messages.push({\n        role: 'system',\n        content: instructions,\n      });\n    }\n    messages.push({\n      role: 'user',\n      content: text,\n    });\n\n    const requestBody: {\n      model: string;\n      messages: Array<{ role: string; content: string }>;\n      modalities: string[];\n      audio: { voice: string; format: string };\n    } = {\n      model: this.modelId,\n      messages,\n      modalities: ['text', 'audio'],\n      audio: {\n        voice,\n        format: outputFormat,\n      },\n    };\n\n    // Warn about unsupported parameters\n    if (speed !== undefined) {\n      warnings.push({\n        type: 'unsupported',\n        feature: 'speed',\n        details:\n          'Pollinations API does not support speed parameter for audio generation. This parameter will be ignored.',\n      });\n    }\n\n    // Validate output format\n    const supportedFormats: PollinationsAudioFormat[] = [\n      'mp3',\n      'opus',\n      'flac',\n      'wav',\n      'pcm16',\n    ];\n    if (\n      outputFormat &&\n      !supportedFormats.includes(outputFormat as PollinationsAudioFormat)\n    ) {\n      warnings.push({\n        type: 'unsupported',\n        feature: 'outputFormat',\n        details: `Unsupported output format: ${outputFormat}. Using mp3 instead.`,\n      });\n      requestBody.audio.format = 'mp3';\n    }\n\n    // Validate voice\n    const supportedVoices: PollinationsVoice[] = [\n      'alloy',\n      'echo',\n      'fable',\n      'onyx',\n      'shimmer',\n      'coral',\n      'verse',\n      'ballad',\n      'ash',\n      'sage',\n      'amuch',\n      'dan',\n    ];\n    if (!supportedVoices.includes(voice as PollinationsVoice)) {\n      warnings.push({\n        type: 'unsupported',\n        feature: 'voice',\n        details: `Unsupported voice: ${voice}. Using 'alloy' instead.`,\n      });\n      requestBody.audio.voice = 'alloy';\n    }\n\n    return {\n      requestBody,\n      warnings,\n    };\n  }\n\n  async doGenerate(\n    options: Parameters<SpeechModelV3['doGenerate']>[0],\n  ): Promise<Awaited<ReturnType<SpeechModelV3['doGenerate']>>> {\n    const currentDate = this.config._internal?.currentDate?.() ?? new Date();\n    const { requestBody, warnings } = await this.getArgs(options);\n\n    // Use custom fetch if provided, otherwise use global fetch\n    const fetchFn = this.config.fetch ?? fetch;\n\n    let responseHeaders: Record<string, string> = {};\n    let responseData: {\n      choices?: Array<{\n        message?: {\n          audio?: {\n            data?: string;\n            transcript?: string;\n            id?: string;\n            expires_at?: number;\n          };\n        };\n      }>;\n    };\n\n    try {\n      const combinedHeaders = combineHeaders(\n        this.config.headers(),\n        options.headers,\n      );\n      // Filter out undefined values\n      const headers: Record<string, string> = {};\n      for (const [key, value] of Object.entries(combinedHeaders)) {\n        if (value !== undefined) {\n          headers[key] = value;\n        }\n      }\n\n      const fetchResponse = await fetchFn(this.config.baseURL, {\n        method: 'POST',\n        headers,\n        body: JSON.stringify(requestBody),\n        signal: options.abortSignal,\n      });\n\n      // Extract response headers\n      fetchResponse.headers.forEach((value: string, key: string | number) => {\n        responseHeaders[key] = value;\n      });\n\n      if (!fetchResponse.ok) {\n        await handlePollinationsError(fetchResponse, this.config.baseURL);\n      }\n\n      responseData = await fetchResponse.json();\n    } catch (error) {\n      await handlePollinationsError(error, this.config.baseURL);\n      throw error; // handlePollinationsError throws, but TypeScript needs this\n    }\n\n    // Extract audio data from response\n    // Pollinations returns: { choices: [{ message: { audio: { data: string, transcript: string, ... } } }] }\n    const choice = responseData.choices?.[0];\n    const audioData = choice?.message?.audio?.data;\n\n    if (!audioData) {\n      throw new Error(\n        'Invalid response: missing audio data in Pollinations API response',\n      );\n    }\n\n    // Convert base64 string to Uint8Array\n    // The audio data is base64-encoded\n    const binaryString = atob(audioData);\n    const bytes = new Uint8Array(binaryString.length);\n    for (let i = 0; i < binaryString.length; i++) {\n      bytes[i] = binaryString.charCodeAt(i);\n    }\n\n    return {\n      audio: bytes,\n      warnings,\n      request: {\n        body: JSON.stringify(requestBody),\n      },\n      response: {\n        timestamp: currentDate,\n        modelId: this.modelId,\n        headers: responseHeaders,\n        body: JSON.stringify(responseData),\n      },\n    };\n  }\n}\n"],"mappings":"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","names":["generateId","InvalidResponseDataError","globalBuffer","uint8Array","url","InvalidResponseDataError","InvalidResponseDataError","generateId","toolCall","InvalidResponseDataError","generateId"]}