Loading...
Loading...
Guide for adding new AI provider packages to the AI SDK. Use when creating a new @ai-sdk/<provider> package to integrate an AI service into the SDK.
npx skill4agent add vercel/ai add-provider-package@ai-sdk/<provider>@ai-sdk/<provider>@ai-sdk/providerLanguageModelV3EmbeddingModelV3@ai-sdk/provider-utils@ai-sdk/<provider>aigenerateTextstreamTextgenerateObjectpackages/<provider>packages/<provider>/
├── src/
│ ├── index.ts # Main exports
│ ├── version.ts # Package version
│ ├── <provider>-provider.ts # Provider implementation
│ ├── <provider>-provider.test.ts
│ ├── <provider>-*-options.ts # Model-specific options
│ └── <provider>-*-model.ts # Model implementations (e.g., language, embedding, image)
├── package.json
├── tsconfig.json
├── tsconfig.build.json
├── tsup.config.ts
├── turbo.json
├── vitest.node.config.js
├── vitest.edge.config.js
└── README.mdCHANGELOG.mdpackage.json"name": "@ai-sdk/<provider>""version": "0.0.0""license": "Apache-2.0""sideEffects": false@ai-sdk/provider@ai-sdk/provider-utilsworkspace:*@ai-sdk/test-server@types/node@vercel/ai-tsconfigtsuptypescriptzod"engines": { "node": ">=18" }zod"zod": "^3.25.76 || ^4.1.8"{
"exports": {
"./package.json": "./package.json",
".": {
"types": "./dist/index.d.ts",
"import": "./dist/index.mjs",
"require": "./dist/index.js"
}
}
}{
"extends": "@vercel/ai-tsconfig/base.json",
"include": ["src/**/*.ts"],
"exclude": ["node_modules", "dist"]
}{
"extends": "./tsconfig.json",
"exclude": [
"**/*.test.ts",
"**/*.test-d.ts",
"**/__snapshots__",
"**/__fixtures__"
]
}tsup.config.tsimport { defineConfig } from 'tsup';
export default defineConfig({
entry: ['src/index.ts'],
format: ['cjs', 'esm'],
dts: true,
sourcemap: true,
clean: true,
});vitest.node.config.jsvitest.edge.config.jsanthropic// <provider>-provider.ts
import { NoSuchModelError } from '@ai-sdk/provider';
import { loadApiKey } from '@ai-sdk/provider-utils';
export interface ProviderSettings {
apiKey?: string;
baseURL?: string;
// provider-specific settings
}
export class ProviderInstance {
readonly apiKey?: string;
readonly baseURL?: string;
constructor(options: ProviderSettings = {}) {
this.apiKey = options.apiKey;
this.baseURL = options.baseURL;
}
private get baseConfig() {
return {
apiKey: () =>
loadApiKey({
apiKey: this.apiKey,
environmentVariableName: 'PROVIDER_API_KEY',
description: 'Provider API key',
}),
baseURL: this.baseURL ?? 'https://api.provider.com',
};
}
languageModel(modelId: string) {
return new ProviderLanguageModel(modelId, this.baseConfig);
}
// Shorter alias
chat(modelId: string) {
return this.languageModel(modelId);
}
}
// Export default instance
export const providerName = new ProviderInstance();@ai-sdk/providerLanguageModelV3EmbeddingModelV3ImageModelV1.optional()null.nullish().optional()__fixtures__capture-api-response-test-fixtureexamples/ai-functions/src/generate-text/<provider>.tsstream-text/<provider>.tsgenerate-object/<provider>.tsstream-object/<provider>.tsembed/<provider>.tsgenerate-image/<provider>.ts<provider>-tool-call.ts<provider>-cache-control.tscontent/providers/01-ai-sdk-providers/<last number + 10>-<provider>.mdxpnpm changesetmajorpnpm update-references# From workspace root
pnpm build
# From provider package
cd packages/<provider>
pnpm test # Run all tests
pnpm test:node # Run Node.js tests
pnpm test:edge # Run Edge tests
pnpm type-check # Type checking
# From workspace root
pnpm type-check:full # Full type check including examplescd examples/ai-functions
pnpm tsx src/generate-text/<provider>.ts
pnpm tsx src/stream-text/<provider>.tslanguageModel(id)imageModel(id)embeddingModel(id).chat(id).image(id).embedding(id)kebab-case.tskebab-case.test.tskebab-case.test-d.ts<Provider>Provider<Provider>LanguageModelJSON.parseparseJSONsafeParseJSON@ai-sdk/provider-utilsloadApiKey@ai-sdk/provider-utilsAISDKError@ai-sdk/providerimport { AISDKError } from '@ai-sdk/provider';
const name = 'AI_ProviderError';
const marker = `vercel.ai.error.${name}`;
const symbol = Symbol.for(marker);
export class ProviderError extends AISDKError {
private readonly [symbol] = true;
constructor({ message, cause }: { message: string; cause?: unknown }) {
super({ name, message, cause });
}
static isInstance(error: unknown): error is ProviderError {
return AISDKError.hasMarker(error, marker);
}
}mainbetavX.Ymainpackages/<provider>package.jsontsconfig.jsontsconfig.build.jsontsup.config.tsvitest.node.config.jsvitest.edge.config.jsexamples/ai-functions/src/content/providers/01-ai-sdk-providers/pnpm update-referencespnpm testpnpm type-check:fullpnpm update-referencespnpm type-check:fulltsup.config.ts