import { LanguageModelV3, NoSuchModelError, ProviderV3, } from '@ai-sdk/provider'; import { FetchFunction, loadApiKey, withoutTrailingSlash, withUserAgentSuffix, } from '@ai-sdk/provider-utils'; import { DeepSeekChatModelId } from './chat/deepseek-chat-options'; import { DeepSeekChatLanguageModel } from './chat/deepseek-chat-language-model'; import { VERSION } from './version'; export interface DeepSeekProviderSettings { /** * DeepSeek API key. */ apiKey?: string; /** * Base URL for the API calls. */ baseURL?: string; /** * Custom headers to include in the requests. */ headers?: Record; /** * Custom fetch implementation. You can use it as a middleware to intercept requests, * or to provide a custom fetch implementation for e.g. testing. */ fetch?: FetchFunction; } export interface DeepSeekProvider extends ProviderV3 { /** * Creates a DeepSeek model for text generation. */ (modelId: DeepSeekChatModelId): LanguageModelV3; /** * Creates a DeepSeek model for text generation. */ languageModel(modelId: DeepSeekChatModelId): LanguageModelV3; /** * Creates a DeepSeek chat model for text generation. */ chat(modelId: DeepSeekChatModelId): LanguageModelV3; /** * @deprecated Use `embeddingModel` instead. */ textEmbeddingModel(modelId: string): never; } export function createDeepSeek( options: DeepSeekProviderSettings = {}, ): DeepSeekProvider { const baseURL = withoutTrailingSlash( options.baseURL ?? 'https://api.deepseek.com', ); const getHeaders = () => withUserAgentSuffix( { Authorization: `Bearer ${loadApiKey({ apiKey: options.apiKey, environmentVariableName: 'DEEPSEEK_API_KEY', description: 'DeepSeek API key', })}`, ...options.headers, }, `ai-sdk/deepseek/${VERSION}`, ); const createLanguageModel = (modelId: DeepSeekChatModelId) => { return new DeepSeekChatLanguageModel(modelId, { provider: `deepseek.chat`, url: ({ path }) => `${baseURL}${path}`, headers: getHeaders, fetch: options.fetch, }); }; const provider = (modelId: DeepSeekChatModelId) => createLanguageModel(modelId); provider.specificationVersion = 'v3' as const; provider.languageModel = createLanguageModel; provider.chat = createLanguageModel; provider.embeddingModel = (modelId: string) => { throw new NoSuchModelError({ modelId, modelType: 'embeddingModel' }); }; provider.textEmbeddingModel = provider.embeddingModel; provider.imageModel = (modelId: string) => { throw new NoSuchModelError({ modelId, modelType: 'imageModel' }); }; return provider; } export const deepseek = createDeepSeek();