@ai-sdk/elevenlabs
Version:
The **[ElevenLabs provider](https://ai-sdk.dev/providers/ai-sdk-providers/elevenlabs)** for the [AI SDK](https://ai-sdk.dev/docs) contains language model support for the ElevenLabs chat and completion APIs and embedding model support for the ElevenLabs em
139 lines (121 loc) • 3.77 kB
text/typescript
import {
NoSuchModelError,
type TranscriptionModelV3,
type SpeechModelV3,
type ProviderV3,
} from '@ai-sdk/provider';
import {
loadApiKey,
withUserAgentSuffix,
type FetchFunction,
} from '@ai-sdk/provider-utils';
import { ElevenLabsTranscriptionModel } from './elevenlabs-transcription-model';
import type { ElevenLabsTranscriptionModelId } from './elevenlabs-transcription-options';
import { ElevenLabsSpeechModel } from './elevenlabs-speech-model';
import type { ElevenLabsSpeechModelId } from './elevenlabs-speech-options';
import { VERSION } from './version';
export interface ElevenLabsProvider extends ProviderV3 {
(
modelId: 'scribe_v1',
settings?: {},
): {
transcription: ElevenLabsTranscriptionModel;
};
/**
* Creates a model for transcription.
*/
transcription(modelId: ElevenLabsTranscriptionModelId): TranscriptionModelV3;
/**
* Creates a model for speech generation.
*/
speech(modelId: ElevenLabsSpeechModelId): SpeechModelV3;
/**
* @deprecated Use `embeddingModel` instead.
*/
textEmbeddingModel(modelId: string): never;
}
export interface ElevenLabsProviderSettings {
/**
* API key for authenticating requests.
*/
apiKey?: string;
/**
* Custom headers to include in the requests.
*/
headers?: Record<string, string>;
/**
* 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;
}
/**
* Create an ElevenLabs provider instance.
*/
export function createElevenLabs(
options: ElevenLabsProviderSettings = {},
): ElevenLabsProvider {
const getHeaders = () =>
withUserAgentSuffix(
{
'xi-api-key': loadApiKey({
apiKey: options.apiKey,
environmentVariableName: 'ELEVENLABS_API_KEY',
description: 'ElevenLabs',
}),
...options.headers,
},
`ai-sdk/elevenlabs/${VERSION}`,
);
const createTranscriptionModel = (modelId: ElevenLabsTranscriptionModelId) =>
new ElevenLabsTranscriptionModel(modelId, {
provider: `elevenlabs.transcription`,
url: ({ path }) => `https://api.elevenlabs.io${path}`,
headers: getHeaders,
fetch: options.fetch,
});
const createSpeechModel = (modelId: ElevenLabsSpeechModelId) =>
new ElevenLabsSpeechModel(modelId, {
provider: `elevenlabs.speech`,
url: ({ path }) => `https://api.elevenlabs.io${path}`,
headers: getHeaders,
fetch: options.fetch,
});
const provider = function (modelId: ElevenLabsTranscriptionModelId) {
return {
transcription: createTranscriptionModel(modelId),
};
};
provider.specificationVersion = 'v3' as const;
provider.transcription = createTranscriptionModel;
provider.transcriptionModel = createTranscriptionModel;
provider.speech = createSpeechModel;
provider.speechModel = createSpeechModel;
provider.languageModel = (modelId: string) => {
throw new NoSuchModelError({
modelId,
modelType: 'languageModel',
message: 'ElevenLabs does not provide language models',
});
};
provider.embeddingModel = (modelId: string) => {
throw new NoSuchModelError({
modelId,
modelType: 'embeddingModel',
message: 'ElevenLabs does not provide embedding models',
});
};
provider.textEmbeddingModel = provider.embeddingModel;
provider.imageModel = (modelId: string) => {
throw new NoSuchModelError({
modelId,
modelType: 'imageModel',
message: 'ElevenLabs does not provide image models',
});
};
return provider as ElevenLabsProvider;
}
/**
* Default ElevenLabs provider instance.
*/
export const elevenlabs = createElevenLabs();