{"version":3,"sources":["../src/aihubmix-provider.ts","../src/aihubmix-tools.ts"],"sourcesContent":["import {\n  OpenAIChatLanguageModel,\n  OpenAICompletionLanguageModel,\n  OpenAIEmbeddingModel,\n  OpenAIImageModel,\n  OpenAIResponsesLanguageModel,\n  OpenAITranscriptionModel,\n  OpenAISpeechModel,\n} from '@ai-sdk/openai/internal';\nimport { AnthropicMessagesLanguageModel } from '@ai-sdk/anthropic/internal';\nimport { GoogleGenerativeAILanguageModel } from '@ai-sdk/google/internal';\nimport {\n  EmbeddingModelV2,\n  LanguageModelV2,\n  ProviderV2,\n  ImageModelV2,\n  TranscriptionModelV2,\n  SpeechModelV2,\n  TranscriptionModelV2CallOptions,\n} from '@ai-sdk/provider';\nimport { FetchFunction, loadApiKey } from '@ai-sdk/provider-utils';\nimport { aihubmixTools } from './aihubmix-tools';\n\n// 导入设置类型\nimport type { OpenAIProviderSettings } from '@ai-sdk/openai';\n\n\nexport interface AihubmixProvider extends ProviderV2 {\n  (deploymentId: string, settings?: OpenAIProviderSettings): LanguageModelV2;\n\n  languageModel(\n    deploymentId: string,\n    settings?: OpenAIProviderSettings,\n  ): LanguageModelV2;\n\n  chat(\n    deploymentId: string,\n    settings?: OpenAIProviderSettings,\n  ): LanguageModelV2;\n\n  responses(deploymentId: string): LanguageModelV2;\n\n  completion(\n    deploymentId: string,\n    settings?: OpenAIProviderSettings,\n  ): LanguageModelV2;\n\n  embedding(\n    deploymentId: string,\n    settings?: OpenAIProviderSettings,\n  ): EmbeddingModelV2<string>;\n\n  image(deploymentId: string, settings?: OpenAIProviderSettings): ImageModelV2;\n\n  imageModel(\n    deploymentId: string,\n    settings?: OpenAIProviderSettings,\n  ): ImageModelV2;\n\n  textEmbedding(\n    deploymentId: string,\n    settings?: OpenAIProviderSettings,\n  ): EmbeddingModelV2<string>;\n\n  textEmbeddingModel(\n    deploymentId: string,\n    settings?: OpenAIProviderSettings,\n  ): EmbeddingModelV2<string>;\n\n  transcription(deploymentId: string): TranscriptionModelV2;\n\n  speech(deploymentId: string): SpeechModelV2;\n\n  speechModel(deploymentId: string): SpeechModelV2;\n\n  tools: typeof aihubmixTools;\n}\n\nexport interface AihubmixProviderSettings {\n  apiKey?: string;\n  fetch?: FetchFunction;\n  compatibility?: 'strict' | 'compatible';\n}\n\nclass AihubmixTranscriptionModel extends OpenAITranscriptionModel {\n  async doGenerate(options: TranscriptionModelV2CallOptions) {\n    // 根据MIME类型设置正确的文件扩展名\n    if (options.mediaType) {\n      const mimeTypeMap: Record<string, string> = {\n        'audio/mpeg': 'mp3',\n        'audio/mp3': 'mp3',\n        'audio/wav': 'wav',\n        'audio/flac': 'flac',\n        'audio/m4a': 'm4a',\n        'audio/mp4': 'mp4',\n        'audio/ogg': 'ogg',\n        'audio/webm': 'webm',\n        'audio/oga': 'oga',\n        'audio/mpga': 'mpga',\n      };\n      \n      const extension = mimeTypeMap[options.mediaType];\n      if (extension) {\n        // 重写getArgs方法来设置正确的文件名\n        const originalGetArgs = (this as any).getArgs;\n        (this as any).getArgs = async function(args: any) {\n          const result = await originalGetArgs.call(this, args);\n          if (result.formData) {\n            // 找到file字段并修改文件名\n            const fileEntry = result.formData.get('file');\n            if (fileEntry && typeof fileEntry === 'object' && 'name' in fileEntry) {\n              // 创建新的 File 对象，设置正确的文件名\n              try {\n                const newFile = new File([fileEntry], `audio.${extension}`, { \n                  type: options.mediaType \n                });\n                result.formData.set('file', newFile);\n              } catch (error) {\n                console.log('Failed to create new File object:', error);\n                // 如果创建新 File 对象失败，尝试其他方法\n                // 在 Node.js 环境中，可能需要使用 Buffer 或其他方式\n                if (fileEntry && typeof fileEntry === 'object' && 'arrayBuffer' in fileEntry) {\n                  try {\n                    const arrayBuffer = await (fileEntry as any).arrayBuffer();\n                    const newFile = new File([arrayBuffer], `audio.${extension}`, { \n                      type: options.mediaType \n                    });\n                    result.formData.set('file', newFile);\n                    console.log('Created new file from arrayBuffer with name:', `audio.${extension}`);\n                  } catch (bufferError) {\n                    console.log('Failed to create file from arrayBuffer:', bufferError);\n                  }\n                }\n              }\n            }\n          }\n          return result;\n        };\n      }\n    }\n    \n    return super.doGenerate(options);\n  }\n}\n\nexport function createAihubmix(\n  options: AihubmixProviderSettings = {},\n): AihubmixProvider {\n  const getHeaders = () => ({\n    Authorization: `Bearer ${loadApiKey({\n      apiKey: options.apiKey,\n      environmentVariableName: 'AIHUBMIX_API_KEY',\n      description: 'Aihubmix',\n    })}`,\n    'APP-Code': 'WHVL9885',\n    'Content-Type': 'application/json',\n  });\n\n  const getTranscriptionHeaders = () => ({\n    Authorization: `Bearer ${loadApiKey({\n      apiKey: options.apiKey,\n      environmentVariableName: 'AIHUBMIX_API_KEY',\n      description: 'Aihubmix',\n    })}`,\n    'APP-Code': 'WHVL9885',\n  });\n\n  const url = ({ path, modelId }: { path: string; modelId: string }) => {\n    const baseURL = 'https://aihubmix.com/v1';\n    return `${baseURL}${path}`;\n  };\n\n  const createChatModel = (\n    deploymentName: string,\n    settings: OpenAIProviderSettings = {},\n  ) => {\n    const headers = getHeaders();\n    if (deploymentName.startsWith('claude-')) {\n      return new AnthropicMessagesLanguageModel(deploymentName, {\n        provider: 'aihubmix.chat',\n        baseURL: url({ path: '', modelId: deploymentName }),\n        headers: {\n          ...headers,\n          'x-api-key': headers['Authorization'].split(' ')[1],\n        },\n        supportedUrls: () => ({\n          'image/*': [/^https?:\\/\\/.*$/],\n        }),\n      });\n    }\n    if (\n      (deploymentName.startsWith('gemini') ||\n        deploymentName.startsWith('imagen')) &&\n      !deploymentName.endsWith('-nothink') &&\n      !deploymentName.endsWith('-search')\n    ) {\n      return new GoogleGenerativeAILanguageModel(\n        deploymentName,\n        {\n          provider: 'aihubmix.chat',\n          baseURL: 'https://aihubmix.com/gemini/v1beta',\n          headers: {\n            ...headers,\n            'x-goog-api-key': headers['Authorization'].split(' ')[1],\n          },\n          generateId: () => `aihubmix-${Date.now()}`,\n          supportedUrls: () => ({}),\n        },\n      );\n    }\n\n    return new OpenAIChatLanguageModel(deploymentName, {\n      provider: 'aihubmix.chat',\n      url,\n      headers: getHeaders,\n      fetch: options.fetch,\n    });\n  };\n\n  const createCompletionModel = (\n    modelId: string,\n    settings: any = {},\n  ) =>\n    new OpenAICompletionLanguageModel(modelId, {\n      provider: 'aihubmix.completion',\n      url,\n      headers: getHeaders,\n      fetch: options.fetch,\n    });\n\n  const createEmbeddingModel = (\n    modelId: string,\n    settings: any = {},\n  ) => {\n    return new OpenAIEmbeddingModel(modelId, {\n      provider: 'aihubmix.embeddings',\n      headers: getHeaders,\n      url,\n      fetch: options.fetch,\n    });\n  };\n\n  const createResponsesModel = (modelId: string) =>\n    new OpenAIResponsesLanguageModel(modelId, {\n      provider: 'aihubmix.responses',\n      url,\n      headers: getHeaders,\n    });\n\n  const createImageModel = (\n    modelId: string,\n    settings: any = {},\n  ) => {\n    return new OpenAIImageModel(modelId, {\n      provider: 'aihubmix.image',\n      url,\n      headers: getHeaders,\n      fetch: options.fetch,\n    });\n  };\n\n  const createTranscriptionModel = (modelId: string) =>\n    new AihubmixTranscriptionModel(modelId, {\n      provider: 'aihubmix.transcription',\n      url,\n      headers: getTranscriptionHeaders,\n      fetch: options.fetch,\n    });\n  const createSpeechModel = (modelId: string) =>\n    new OpenAISpeechModel(modelId, {\n      provider: 'aihubmix.speech',\n      url,\n      headers: getHeaders,\n      fetch: options.fetch,\n    });\n  const provider = function (\n    deploymentId: string,\n    settings?: OpenAIProviderSettings,\n  ) {\n    if (new.target) {\n      throw new Error(\n        'The Aihubmix model function cannot be called with the new keyword.',\n      );\n    }\n\n    return createChatModel(deploymentId, settings);\n  };\n\n  provider.languageModel = createChatModel;\n  provider.chat = createChatModel;\n  provider.completion = createCompletionModel;\n  provider.responses = createResponsesModel;\n  provider.embedding = createEmbeddingModel;\n  provider.textEmbedding = createEmbeddingModel;\n  provider.textEmbeddingModel = createEmbeddingModel;\n\n  provider.image = createImageModel;\n  provider.imageModel = createImageModel;\n\n  provider.transcription = createTranscriptionModel;\n  provider.transcriptionModel = createTranscriptionModel;\n\n  provider.speech = createSpeechModel;\n  provider.speechModel = createSpeechModel;\n\n  provider.tools = aihubmixTools;\n\n  return provider as AihubmixProvider;\n}\n\nexport const aihubmix = createAihubmix();\n","import { z } from 'zod';\n\nconst WebSearchPreviewParameters = z.object({});\n\nfunction webSearchPreviewTool({\n  searchContextSize,\n  userLocation,\n}: {\n  searchContextSize?: 'low' | 'medium' | 'high';\n  userLocation?: {\n    type?: 'approximate';\n    city?: string;\n    region?: string;\n    country?: string;\n    timezone?: string;\n  };\n} = {}): {\n  type: 'provider-defined';\n  id: 'aihubmix.web_search_preview';\n  args: {};\n  parameters: typeof WebSearchPreviewParameters;\n} {\n  return {\n    type: 'provider-defined',\n    id: 'aihubmix.web_search_preview',\n    args: {\n      searchContextSize,\n      userLocation,\n    },\n    parameters: WebSearchPreviewParameters,\n  };\n}\n\nexport const aihubmixTools = {\n  webSearchPreview: webSearchPreviewTool,\n};\n"],"mappings":"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","names":[]}