feat(providers): new providers package (#223)

* feat(providers): auto generate from models.dev

* chore(providers): update code-gen impl, sync

* refactor(providers): split manual provider types

* feat(providers): openrouter provider

* feat(providers): anthropic, google provider

* feat(providers): cerebras provider

* feat(providers): groq, deepinfra provider

* [autofix.ci] apply automated fixes

* refactor(providers): move deepinfra to generated

* feat(providers): mistral provider

* refactor(providers): move cerebras to auto provider

* refactor(providers): improve structure

* feat(providers): azure provider

* [autofix.ci] apply automated fixes

* feat(providers): minimax provider

* feat(providers): novita provider

* refactor(providers): improve structure

* feat(providers): silicon-flow, stepfun provider

* feat(providers): tencent-hunyuan provider

* feat(providers): qwen provider (deprecated)

* feat(providers): perplexity, together-ai provider

* feat(providers): workers-ai provider

* feat(providers): xai provider

* chore(providers): remove metadata

* chore(providers): xai fallback

* refactor(providers): override deepseek

* refactor(providers): move google to generated

* refactor(providers): empty string fallback

* refactor(providers): move force provider to overrides

* feat(providers): featherless provider

* fix(ci): try set concurrency

* fix(ci): update test snapshot

* chore(providers): update test

* fix(ci): try fix build

* chore: lint code

* chore: remove concurrency

* chore: update type-fest import
This commit is contained in:
藍+85CD authored and GitHub committed 2025-11-01 11:54:57 +08:00
1 parent f8308823fa
commit b68d21aa71
33 files changed
+3802 -1661

No files matched your search

+2
View File
@@ -63,6 +63,7 @@ words:
- qwen
- reranker
- rhasspy
- scule
- siliconflow
- sonarjs
- SoVITS
@@ -73,6 +74,7 @@ words:
- sury
- Systran
- theguild
- togetherai
- twoslash
- typeschema
- unrs
+1
View File
@@ -28,6 +28,7 @@
"dotenv": "^17.2.1",
"eslint": "^9.31.0",
"pkgroll": "^2.14.3",
"tsdown": "^0.15.12",
"tsx": "^4.20.3",
"turbo": "^2.5.5",
"typescript": "^5.8.3",
+49
View File
@@ -0,0 +1,49 @@
{
"name": "@xsai-ext/providers",
"type": "module",
"version": "0.4.0-beta.4",
"private": true,
"description": "extra-small AI SDK.",
"author": "Moeru AI",
"license": "MIT",
"homepage": "https://xsai.js.org",
"repository": {
"type": "git",
"url": "git+https://github.com/moeru-ai/xsai.git",
"directory": "packages-ext/providers"
},
"bugs": "https://github.com/moeru-ai/xsai/issues",
"keywords": [
"xsai",
"openai",
"ai"
],
"sideEffects": false,
"exports": "./src/index.ts",
"files": [
"dist"
],
"publishConfig": {
"exports": {
".": {
"types": "./dist/index.d.ts",
"default": "./dist/index.js"
},
"./package.json": "./package.json"
},
"main": "./dist/index.js",
"types": "./dist/index.d.ts"
},
"scripts": {
"build": "pkgroll",
"sync": "tsx scripts/sync.ts",
"test": "vitest run"
},
"dependencies": {
"@xsai-ext/shared-providers": "workspace:~",
"@xsai/shared": "workspace:~"
},
"devDependencies": {
"scule": "^1.3.0"
}
}
+84
View File
@@ -0,0 +1,84 @@
import { writeFile } from 'node:fs/promises'
import type { CodeGenProvider, Providers } from './utils/types'
import { codeGenCreate, codeGenIndex, codeGenTypes } from './utils/code-gen'
import { extraProviders } from './utils/extra'
import { overrides } from './utils/overrides'
import { toCodeGenProvider } from './utils/process'
const manualProviderKeys = [
'anthropic',
'azure',
'openrouter',
'togetherai',
'cloudflare-workers-ai',
]
const providers = await fetch('https://models.dev/api.json')
.then(async res => res.json() as Promise<Providers>)
.then(ps => Object.values(ps))
.then(providers => providers.map(provider => ({
...provider,
...overrides[provider.id] ?? {},
})))
const [autoProviders, manualProviders] = providers
.filter(({ api }) => api != null)
.map(toCodeGenProvider)
.reduce(([auto, manual], provider) => {
if (manualProviderKeys.includes(provider.id))
manual.push(provider)
else
auto.push(provider)
return [auto, manual]
}, [[], []] as [CodeGenProvider[], CodeGenProvider[]])
const forceManualProviders = providers
.filter(p => p.api == null && manualProviderKeys.includes(p.id))
.map(toCodeGenProvider)
manualProviders.push(...forceManualProviders)
autoProviders.push(...extraProviders)
const create = [
[
'/* eslint-disable perfectionist/sort-union-types */',
'/* eslint-disable sonarjs/no-identical-functions */',
'/* eslint-disable sonarjs/use-type-alias */',
].join('\n'),
'import { createChatProvider, createEmbedProvider, createModelProvider, createSpeechProvider, createTranscriptionProvider, merge } from \'@xsai-ext/shared-providers\'',
...autoProviders.map(codeGenCreate),
].join('\n\n')
await writeFile('./src/generated/create.ts', `${create}\n`, { encoding: 'utf8' })
const creates = autoProviders
.filter(p => p.apiKey != null)
.map(codeGenIndex)
const imp = creates.map(({ im }) => im)
const exp = creates.map(({ ex }) => ex)
const index = [
'/* eslint-disable perfectionist/sort-named-imports */',
'import process from \'node:process\'',
[
'import {',
imp.map(str => ` ${str},`).join('\n'),
'} from \'./create\'',
].join('\n'),
...exp,
].join('\n\n')
await writeFile('./src/generated/index.ts', `${index}\n`, { encoding: 'utf8' })
const types = [
'/* eslint-disable perfectionist/sort-modules */',
'/* eslint-disable perfectionist/sort-union-types */',
...manualProviders.map(codeGenTypes),
]
.join('\n\n')
await writeFile('./src/generated/types.ts', `${types}\n`, { encoding: 'utf8' })
@@ -0,0 +1,45 @@
import { camelCase, pascalCase } from 'scule'
import type { CodeGenProvider } from './types'
const codeGenConstCreate = (provider: CodeGenProvider) => `create${provider.overrides?.create ?? pascalCase(provider.id)}`
const codeGenConstEntry = (provider: CodeGenProvider) => provider.overrides?.id ?? camelCase(provider.id)
/** code gen for '@xsai-ext/providers/create' */
export const codeGenCreate = (provider: CodeGenProvider) => [
'/**',
` * Create a ${provider.name} Provider`,
` * @see {@link ${provider.doc}}`,
' */',
`export const ${codeGenConstCreate(provider)} = (apiKey: string, baseURL = '${provider.baseURL}') => merge(`,
// eslint-disable-next-line sonarjs/no-nested-template-literals
` createChatProvider${provider.models.length > 0 ? `<'${provider.models.join('\' | \'')}'>` : ''}({ apiKey, baseURL }),`,
...(provider.capabilities?.model === false ? [] : [' createModelProvider({ apiKey, baseURL }),']),
...(provider.capabilities?.embed === true ? [' createEmbedProvider({ apiKey, baseURL }),'] : []),
...(provider.capabilities?.speech === true ? [' createSpeechProvider({ apiKey, baseURL }),'] : []),
...(provider.capabilities?.transcription === true ? [' createTranscriptionProvider({ apiKey, baseURL }),'] : []),
')',
].join('\n')
/** code gen for '@xsai-ext/providers' */
export const codeGenIndex = (provider: CodeGenProvider) => {
const create = codeGenConstCreate(provider)
return {
ex: [
'/**',
` * ${provider.name} Provider`,
` * @see {@link ${provider.doc}}`,
' * @remarks',
` * - baseURL - \`${provider.baseURL}\``,
` * - apiKey - \`${provider.apiKey}\``,
' */',
`export const ${codeGenConstEntry(provider)} = ${create}(process.env.${provider.apiKey} ?? '')`,
].join('\n'),
im: create,
}
}
/** code gen for internal use */
export const codeGenTypes = (provider: CodeGenProvider) => `export type ${pascalCase(provider.id)}Models = '${provider.models.join('\' | \'')}'`
@@ -0,0 +1,66 @@
import type { CodeGenProvider } from './types'
// TODO: cohere 'https://api.cohere.ai/compatibility/v1/'
export const extraProviders: CodeGenProvider[] = [
{
apiKey: 'MINIMAX_API_KEY',
baseURL: 'https://api.minimax.io/v1/',
doc: 'https://platform.minimax.io/docs/api-reference/text-openai-api',
id: 'minimax',
models: [],
name: 'Minimax',
},
{
apiKey: 'MINIMAX_API_KEY',
baseURL: 'https://api.minimaxi.com/v1/',
doc: 'https://platform.minimaxi.com/docs/api-reference/text-openai-api',
id: 'minimaxi',
models: [],
name: 'Minimaxi',
},
{
apiKey: 'NOVITA_API_KEY',
baseURL: 'https://api.novita.ai/v3/openai/',
doc: 'https://novita.ai/docs/guides/llm-api#api-integration',
id: 'novita',
models: [],
name: 'Novita AI',
},
{
apiKey: 'SILICON_FLOW_API_KEY',
baseURL: 'https://api.siliconflow.cn/v1/',
capabilities: {
embed: true,
speech: true,
transcription: true,
},
doc: 'https://docs.siliconflow.com/en/userguide/quickstart#4-3-call-via-openai-interface',
id: 'silicon-flow',
models: [],
name: 'SiliconFlow',
},
{
apiKey: 'STEPFUN_API_KEY',
baseURL: 'https://api.stepfun.com/v1/',
capabilities: {
embed: true,
speech: true,
transcription: true,
},
doc: 'https://www.stepfun.com',
id: 'stepfun',
models: [],
name: 'StepFun',
},
{
apiKey: 'TENCENT_HUNYUAN_API_KEY',
baseURL: 'https://api.hunyuan.cloud.tencent.com/v1/',
capabilities: {
embed: true,
},
doc: 'https://cloud.tencent.com/document/product/1729',
id: 'tencent-hunyuan',
models: [],
name: 'Tencent Hunyuan',
},
]
@@ -0,0 +1,48 @@
import type { Provider } from './types'
export const overrides: Record<string, Partial<Provider>> = {
cerebras: {
_capabilities: {
embed: true,
},
api: 'https://api.cerebras.ai/v1/',
},
deepinfra: {
_capabilities: {
embed: true,
},
api: 'https://api.deepinfra.com/v1/openai/',
},
deepseek: {
_overrides: {
create: 'DeepSeek',
},
},
google: {
_capabilities: {
embed: true,
},
_overrides: {
create: 'GoogleGenerativeAI',
},
api: 'https://generativelanguage.googleapis.com/v1beta/openai/',
},
groq: {
_capabilities: {
embed: true,
},
api: 'https://api.groq.com/openai/v1/',
},
mistral: {
_capabilities: {
embed: true,
},
api: 'https://api.mistral.ai/v1/',
},
perplexity: {
api: 'https://api.perplexity.ai/',
},
xai: {
api: 'https://api.x.ai/v1/',
},
}
@@ -0,0 +1,12 @@
import type { CodeGenProvider, Provider } from './types'
export const toCodeGenProvider = (provider: Provider): CodeGenProvider => ({
apiKey: provider.env.find(v => v.endsWith('_API_KEY')),
baseURL: provider.api!,
capabilities: provider._capabilities,
doc: provider.doc,
id: provider.id,
models: Object.values(provider.models).map(({ id }) => id),
name: provider.name,
overrides: provider._overrides,
})
@@ -0,0 +1,51 @@
export interface CodeGenProvider {
/** api key env name */
apiKey?: string
baseURL: string
capabilities?: CodeGenProviderCapabilities
doc: string
/** used by meta name */
id: string
/** used by type-hint */
models: string[]
name: string
overrides?: CodeGenProviderOverrides
}
export interface CodeGenProviderCapabilities {
embed?: boolean
/** @default true */
model?: boolean
speech?: boolean
transcription?: boolean
}
export interface CodeGenProviderOverrides {
/** `Bar` = `createFoo` => `createBar` */
create?: string
/** `bar` = `const foo = createFoo()` => `const bar = createFoo()` */
id?: string
}
/**
* currently unused
* @see {@link https://github.com/sst/models.dev#schema-reference}
*/
export interface Model {
id: string
}
/** @see {@link https://github.com/sst/models.dev#schema-reference} */
export interface Provider {
_capabilities?: CodeGenProviderCapabilities
_overrides?: CodeGenProviderOverrides
api?: string
doc: string
env: string[]
id: string
models: Record<string, Model>
name: string
npm: string
}
export type Providers = Record<string, Provider>
+2
View File
@@ -0,0 +1,2 @@
export * from './generated/create'
export * from './manual/create'
@@ -0,0 +1,458 @@
/* eslint-disable perfectionist/sort-union-types */
/* eslint-disable sonarjs/no-identical-functions */
/* eslint-disable sonarjs/use-type-alias */
import { createChatProvider, createEmbedProvider, createModelProvider, createSpeechProvider, createTranscriptionProvider, merge } from '@xsai-ext/shared-providers'
/**
* Create a Moonshot AI (China) Provider
* @see {@link https://platform.moonshot.cn/docs/api/chat}
*/
export const createMoonshotaiCn = (apiKey: string, baseURL = 'https://api.moonshot.cn/v1') => merge(
createChatProvider<'kimi-k2-0905-preview' | 'kimi-k2-0711-preview' | 'kimi-k2-turbo-preview'>({ apiKey, baseURL }),
createModelProvider({ apiKey, baseURL }),
)
/**
* Create a LucidQuery AI Provider
* @see {@link https://lucidquery.com/api/docs}
*/
export const createLucidquery = (apiKey: string, baseURL = 'https://lucidquery.com/api/v1') => merge(
createChatProvider<'lucidquery-nexus-coder' | 'lucidnova-rf1-100b'>({ apiKey, baseURL }),
createModelProvider({ apiKey, baseURL }),
)
/**
* Create a Moonshot AI Provider
* @see {@link https://platform.moonshot.ai/docs/api/chat}
*/
export const createMoonshotai = (apiKey: string, baseURL = 'https://api.moonshot.ai/v1') => merge(
createChatProvider<'kimi-k2-turbo-preview' | 'kimi-k2-0711-preview' | 'kimi-k2-0905-preview'>({ apiKey, baseURL }),
createModelProvider({ apiKey, baseURL }),
)
/**
* Create a Z.AI Coding Plan Provider
* @see {@link https://docs.z.ai/devpack/overview}
*/
export const createZaiCodingPlan = (apiKey: string, baseURL = 'https://api.z.ai/api/coding/paas/v4') => merge(
createChatProvider<'glm-4.5-flash' | 'glm-4.5' | 'glm-4.5-air' | 'glm-4.5v' | 'glm-4.6'>({ apiKey, baseURL }),
createModelProvider({ apiKey, baseURL }),
)
/**
* Create a Alibaba Provider
* @see {@link https://www.alibabacloud.com/help/en/model-studio/models}
*/
export const createAlibaba = (apiKey: string, baseURL = 'https://dashscope-intl.aliyuncs.com/compatible-mode/v1') => merge(
createChatProvider<'qwen3-livetranslate-flash-realtime' | 'qwen3-asr-flash' | 'qwen-omni-turbo' | 'qwen-vl-max' | 'qwen3-next-80b-a3b-instruct' | 'qwen-turbo' | 'qwen3-vl-235b-a22b' | 'qwen3-coder-flash' | 'qwen3-vl-30b-a3b' | 'qwen3-14b' | 'qvq-max' | 'qwen-plus-character-ja' | 'qwen2-5-14b-instruct' | 'qwq-plus' | 'qwen3-coder-30b-a3b-instruct' | 'qwen-vl-ocr' | 'qwen2-5-72b-instruct' | 'qwen3-omni-flash' | 'qwen-flash' | 'qwen3-8b' | 'qwen3-omni-flash-realtime' | 'qwen2-5-vl-72b-instruct' | 'qwen3-vl-plus' | 'qwen-plus' | 'qwen2-5-32b-instruct' | 'qwen2-5-omni-7b' | 'qwen-max' | 'qwen2-5-7b-instruct' | 'qwen2-5-vl-7b-instruct' | 'qwen3-235b-a22b' | 'qwen-omni-turbo-realtime' | 'qwen-mt-turbo' | 'qwen3-coder-480b-a35b-instruct' | 'qwen-mt-plus' | 'qwen3-max' | 'qwen3-coder-plus' | 'qwen3-next-80b-a3b-thinking' | 'qwen3-32b' | 'qwen-vl-plus'>({ apiKey, baseURL }),
createModelProvider({ apiKey, baseURL }),
)
/**
* Create a xAI Provider
* @see {@link https://docs.x.ai/docs/models}
*/
export const createXai = (apiKey: string, baseURL = 'https://api.x.ai/v1/') => merge(
createChatProvider<'grok-4-fast-non-reasoning' | 'grok-3-fast' | 'grok-4' | 'grok-2-vision' | 'grok-code-fast-1' | 'grok-2' | 'grok-3-mini-fast-latest' | 'grok-2-vision-1212' | 'grok-3' | 'grok-4-fast' | 'grok-2-latest' | 'grok-2-1212' | 'grok-3-fast-latest' | 'grok-3-latest' | 'grok-2-vision-latest' | 'grok-vision-beta' | 'grok-3-mini' | 'grok-beta' | 'grok-3-mini-latest' | 'grok-3-mini-fast'>({ apiKey, baseURL }),
createModelProvider({ apiKey, baseURL }),
)
/**
* Create a Vultr Provider
* @see {@link https://api.vultrinference.com/}
*/
export const createVultr = (apiKey: string, baseURL = 'https://api.vultrinference.com/v1') => merge(
createChatProvider<'deepseek-r1-distill-qwen-32b' | 'qwen2.5-coder-32b-instruct' | 'kimi-k2-instruct' | 'deepseek-r1-distill-llama-70b' | 'gpt-oss-120b'>({ apiKey, baseURL }),
createModelProvider({ apiKey, baseURL }),
)
/**
* Create a Nvidia Provider
* @see {@link https://docs.api.nvidia.com/nim/}
*/
export const createNvidia = (apiKey: string, baseURL = 'https://integrate.api.nvidia.com/v1') => merge(
createChatProvider<'moonshotai/kimi-k2-instruct-0905' | 'moonshotai/kimi-k2-instruct' | 'nvidia/cosmos-nemotron-34b' | 'nvidia/llama-embed-nemotron-8b' | 'nvidia/parakeet-tdt-0.6b-v2' | 'nvidia/nemoretriever-ocr-v1' | 'nvidia/llama-3.1-nemotron-ultra-253b-v1' | 'google/gemma-3-27b-it' | 'microsoft/phi-4-mini-instruct' | 'openai/whisper-large-v3' | 'openai/gpt-oss-120b' | 'qwen/qwen3-235b-a22b' | 'qwen/qwen3-coder-480b-a35b-instruct' | 'deepseek-ai/deepseek-v3.1-terminus' | 'deepseek-ai/deepseek-v3.1' | 'black-forest-labs/flux.1-dev'>({ apiKey, baseURL }),
createModelProvider({ apiKey, baseURL }),
)
/**
* Create a Upstage Provider
* @see {@link https://developers.upstage.ai/docs/apis/chat}
*/
export const createUpstage = (apiKey: string, baseURL = 'https://api.upstage.ai') => merge(
createChatProvider<'solar-mini' | 'solar-pro2'>({ apiKey, baseURL }),
createModelProvider({ apiKey, baseURL }),
)
/**
* Create a Groq Provider
* @see {@link https://console.groq.com/docs/models}
*/
export const createGroq = (apiKey: string, baseURL = 'https://api.groq.com/openai/v1/') => merge(
createChatProvider<'llama-3.1-8b-instant' | 'mistral-saba-24b' | 'llama3-8b-8192' | 'qwen-qwq-32b' | 'llama3-70b-8192' | 'deepseek-r1-distill-llama-70b' | 'llama-guard-3-8b' | 'gemma2-9b-it' | 'llama-3.3-70b-versatile' | 'moonshotai/kimi-k2-instruct-0905' | 'moonshotai/kimi-k2-instruct' | 'openai/gpt-oss-20b' | 'openai/gpt-oss-120b' | 'qwen/qwen3-32b' | 'meta-llama/llama-4-scout-17b-16e-instruct' | 'meta-llama/llama-4-maverick-17b-128e-instruct' | 'meta-llama/llama-guard-4-12b'>({ apiKey, baseURL }),
createModelProvider({ apiKey, baseURL }),
createEmbedProvider({ apiKey, baseURL }),
)
/**
* Create a GitHub Copilot Provider
* @see {@link https://docs.github.com/en/copilot}
*/
export const createGithubCopilot = (apiKey: string, baseURL = 'https://api.githubcopilot.com') => merge(
createChatProvider<'gemini-2.0-flash-001' | 'claude-opus-4' | 'grok-code-fast-1' | 'claude-haiku-4.5' | 'claude-3.5-sonnet' | 'o3-mini' | 'gpt-5-codex' | 'gpt-4o' | 'gpt-4.1' | 'o4-mini' | 'claude-opus-41' | 'gpt-5-mini' | 'claude-3.7-sonnet' | 'gemini-2.5-pro' | 'o3' | 'claude-sonnet-4' | 'gpt-5' | 'claude-3.7-sonnet-thought' | 'claude-sonnet-4.5'>({ apiKey, baseURL }),
createModelProvider({ apiKey, baseURL }),
)
/**
* Create a Mistral Provider
* @see {@link https://docs.mistral.ai/getting-started/models/}
*/
export const createMistral = (apiKey: string, baseURL = 'https://api.mistral.ai/v1/') => merge(
createChatProvider<'devstral-medium-2507' | 'open-mixtral-8x22b' | 'ministral-8b-latest' | 'pixtral-large-latest' | 'ministral-3b-latest' | 'pixtral-12b' | 'mistral-medium-2505' | 'devstral-small-2505' | 'mistral-medium-2508' | 'mistral-small-latest' | 'magistral-small' | 'devstral-small-2507' | 'codestral-latest' | 'open-mixtral-8x7b' | 'mistral-nemo' | 'open-mistral-7b' | 'mistral-large-latest' | 'mistral-medium-latest' | 'magistral-medium-latest'>({ apiKey, baseURL }),
createModelProvider({ apiKey, baseURL }),
createEmbedProvider({ apiKey, baseURL }),
)
/**
* Create a Nebius AI Studio Provider
* @see {@link https://docs.studio.nebius.com/quickstart}
*/
export const createNebius = (apiKey: string, baseURL = 'https://api.studio.nebius.com/v1/') => merge(
createChatProvider<'NousResearch/hermes-4-70b' | 'NousResearch/hermes-4-405b' | 'moonshotai/kimi-k2-instruct' | 'nvidia/llama-3_1-nemotron-ultra-253b-v1' | 'openai/gpt-oss-20b' | 'openai/gpt-oss-120b' | 'qwen/qwen3-235b-a22b-instruct-2507' | 'qwen/qwen3-235b-a22b-thinking-2507' | 'qwen/qwen3-coder-480b-a35b-instruct' | 'meta-llama/llama-3_1-405b-instruct' | 'meta-llama/llama-3.3-70b-instruct-fast' | 'meta-llama/llama-3.3-70b-instruct-base' | 'zai-org/glm-4.5' | 'zai-org/glm-4.5-air' | 'deepseek-ai/deepseek-v3'>({ apiKey, baseURL }),
createModelProvider({ apiKey, baseURL }),
)
/**
* Create a DeepSeek Provider
* @see {@link https://platform.deepseek.com/api-docs/pricing}
*/
export const createDeepSeek = (apiKey: string, baseURL = 'https://api.deepseek.com') => merge(
createChatProvider<'deepseek-chat' | 'deepseek-reasoner'>({ apiKey, baseURL }),
createModelProvider({ apiKey, baseURL }),
)
/**
* Create a Alibaba (China) Provider
* @see {@link https://www.alibabacloud.com/help/en/model-studio/models}
*/
export const createAlibabaCn = (apiKey: string, baseURL = 'https://dashscope.aliyuncs.com/compatible-mode/v1') => merge(
createChatProvider<'deepseek-r1-distill-qwen-7b' | 'qwen3-asr-flash' | 'deepseek-r1-0528' | 'deepseek-v3' | 'qwen-omni-turbo' | 'qwen-vl-max' | 'deepseek-v3-2-exp' | 'qwen3-next-80b-a3b-instruct' | 'deepseek-r1' | 'qwen-turbo' | 'qwen3-vl-235b-a22b' | 'qwen3-coder-flash' | 'qwen3-vl-30b-a3b' | 'qwen3-14b' | 'qvq-max' | 'deepseek-r1-distill-qwen-32b' | 'qwen-plus-character' | 'qwen2-5-14b-instruct' | 'qwq-plus' | 'qwen2-5-coder-32b-instruct' | 'qwen3-coder-30b-a3b-instruct' | 'qwen-math-plus' | 'qwen-vl-ocr' | 'qwen-doc-turbo' | 'qwen-deep-research' | 'qwen2-5-72b-instruct' | 'qwen3-omni-flash' | 'qwen-flash' | 'qwen3-8b' | 'qwen3-omni-flash-realtime' | 'qwen2-5-vl-72b-instruct' | 'qwen3-vl-plus' | 'qwen-plus' | 'qwen2-5-32b-instruct' | 'qwen2-5-omni-7b' | 'qwen-max' | 'qwen-long' | 'qwen2-5-math-72b-instruct' | 'moonshot-kimi-k2-instruct' | 'tongyi-intent-detect-v3' | 'qwen2-5-7b-instruct' | 'qwen2-5-vl-7b-instruct' | 'deepseek-v3-1' | 'deepseek-r1-distill-llama-70b' | 'qwen3-235b-a22b' | 'qwen2-5-coder-7b-instruct' | 'deepseek-r1-distill-qwen-14b' | 'qwen-omni-turbo-realtime' | 'qwen-math-turbo' | 'qwen-mt-turbo' | 'deepseek-r1-distill-llama-8b' | 'qwen3-coder-480b-a35b-instruct' | 'qwen-mt-plus' | 'qwen3-max' | 'qwq-32b' | 'qwen2-5-math-7b-instruct' | 'qwen3-next-80b-a3b-thinking' | 'deepseek-r1-distill-qwen-1-5b' | 'qwen3-32b' | 'qwen-vl-plus' | 'qwen3-coder-plus'>({ apiKey, baseURL }),
createModelProvider({ apiKey, baseURL }),
)
/**
* Create a Venice AI Provider
* @see {@link https://docs.venice.ai}
*/
export const createVenice = (apiKey: string, baseURL = 'https://api.venice.ai/api/v1') => merge(
createChatProvider<'dolphin-2.9.2-qwen2-72b' | 'mistral-31-24b' | 'venice-uncensored' | 'qwen-2.5-vl' | 'qwen3-235b' | 'qwen-2.5-qwq-32b' | 'deepseek-coder-v2-lite' | 'qwen3-4b' | 'llama-3.3-70b' | 'qwen-2.5-coder-32b' | 'deepseek-r1-671b' | 'llama-3.2-3b' | 'llama-3.1-405b'>({ apiKey, baseURL }),
createModelProvider({ apiKey, baseURL }),
)
/**
* Create a Chutes Provider
* @see {@link https://llm.chutes.ai/v1/models}
*/
export const createChutes = (apiKey: string, baseURL = 'https://llm.chutes.ai/v1') => merge(
createChatProvider<'moonshotai/Kimi-Dev-72B' | 'moonshotai/Kimi-K2-Instruct-75k' | 'moonshotai/Kimi-K2-Instruct-0905' | 'moonshotai/Kimi-VL-A3B-Thinking' | 'meituan-longcat/LongCat-Flash-Chat-FP8' | 'tngtech/DeepSeek-R1T-Chimera' | 'tngtech/DeepSeek-TNG-R1T2-Chimera' | 'openai/gpt-oss-120b' | 'chutesai/Devstral-Small-2505' | 'chutesai/Mistral-Small-3.2-24B-Instruct-2506' | 'Qwen/Qwen3-30B-A3B' | 'Qwen/Qwen3-30B-A3B-Thinking-2507' | 'Qwen/Qwen3-235B-A22B-Instruct-2507' | 'Qwen/Qwen3-Coder-30B-A3B-Instruct' | 'Qwen/Qwen3-Coder-480B-A35B-Instruct-FP8' | 'Qwen/Qwen3-30B-A3B-Instruct-2507' | 'Qwen/Qwen3-235B-A22B-Thinking-2507' | 'Qwen/Qwen3-Next-80B-A3B-Instruct' | 'Qwen/Qwen3-Next-80B-A3B-Thinking' | 'zai-org/GLM-4.5-turbo' | 'zai-org/GLM-4.6-FP8' | 'zai-org/GLM-4.6-turbo' | 'zai-org/GLM-4.5-FP8' | 'zai-org/GLM-4.5-Air' | 'deepseek-ai/DeepSeek-R1-0528-Qwen3-8B' | 'deepseek-ai/DeepSeek-R1-0528' | 'deepseek-ai/DeepSeek-V3.2-Exp' | 'deepseek-ai/DeepSeek-V3.1-Terminus' | 'deepseek-ai/DeepSeek-V3.1-turbo' | 'deepseek-ai/DeepSeek-V3.1:THINKING' | 'deepseek-ai/DeepSeek-R1-Distill-Llama-70B' | 'deepseek-ai/DeepSeek-V3.1' | 'deepseek-ai/DeepSeek-V3-0324'>({ apiKey, baseURL }),
createModelProvider({ apiKey, baseURL }),
)
/**
* Create a Cortecs Provider
* @see {@link https://api.cortecs.ai/v1/models}
*/
export const createCortecs = (apiKey: string, baseURL = 'https://api.cortecs.ai/v1') => merge(
createChatProvider<'nova-pro-v1' | 'claude-4-5-sonnet' | 'deepseek-v3-0324' | 'kimi-k2-instruct' | 'gpt-4.1' | 'gemini-2.5-pro' | 'gpt-oss-120b' | 'qwen3-coder-480b-a35b-instruct' | 'claude-sonnet-4' | 'llama-3.1-405b-instruct' | 'qwen3-32b'>({ apiKey, baseURL }),
createModelProvider({ apiKey, baseURL }),
)
/**
* Create a GitHub Models Provider
* @see {@link https://docs.github.com/en/github-models}
*/
export const createGithubModels = (apiKey: string, baseURL = 'https://models.github.ai/inference') => merge(
createChatProvider<'core42/jais-30b-chat' | 'xai/grok-3' | 'xai/grok-3-mini' | 'cohere/cohere-command-r-08-2024' | 'cohere/cohere-command-a' | 'cohere/cohere-command-r-plus-08-2024' | 'cohere/cohere-command-r' | 'cohere/cohere-command-r-plus' | 'deepseek/deepseek-r1-0528' | 'deepseek/deepseek-r1' | 'deepseek/deepseek-v3-0324' | 'mistral-ai/mistral-medium-2505' | 'mistral-ai/ministral-3b' | 'mistral-ai/mistral-nemo' | 'mistral-ai/mistral-large-2411' | 'mistral-ai/codestral-2501' | 'mistral-ai/mistral-small-2503' | 'microsoft/phi-3-medium-128k-instruct' | 'microsoft/phi-3-mini-4k-instruct' | 'microsoft/phi-3-small-128k-instruct' | 'microsoft/phi-3.5-vision-instruct' | 'microsoft/phi-4' | 'microsoft/phi-4-mini-reasoning' | 'microsoft/phi-3-small-8k-instruct' | 'microsoft/phi-3.5-mini-instruct' | 'microsoft/phi-4-multimodal-instruct' | 'microsoft/phi-3-mini-128k-instruct' | 'microsoft/phi-3.5-moe-instruct' | 'microsoft/phi-4-mini-instruct' | 'microsoft/phi-3-medium-4k-instruct' | 'microsoft/phi-4-reasoning' | 'microsoft/mai-ds-r1' | 'openai/gpt-4.1-nano' | 'openai/gpt-4.1-mini' | 'openai/o1-preview' | 'openai/o3-mini' | 'openai/gpt-4o' | 'openai/gpt-4.1' | 'openai/o4-mini' | 'openai/o1' | 'openai/o1-mini' | 'openai/o3' | 'openai/gpt-4o-mini' | 'meta/llama-3.2-11b-vision-instruct' | 'meta/meta-llama-3.1-405b-instruct' | 'meta/llama-4-maverick-17b-128e-instruct-fp8' | 'meta/meta-llama-3-70b-instruct' | 'meta/meta-llama-3.1-70b-instruct' | 'meta/llama-3.3-70b-instruct' | 'meta/llama-3.2-90b-vision-instruct' | 'meta/meta-llama-3-8b-instruct' | 'meta/llama-4-scout-17b-16e-instruct' | 'meta/meta-llama-3.1-8b-instruct' | 'ai21-labs/ai21-jamba-1.5-large' | 'ai21-labs/ai21-jamba-1.5-mini'>({ apiKey, baseURL }),
createModelProvider({ apiKey, baseURL }),
)
/**
* Create a Baseten Provider
* @see {@link https://docs.baseten.co/development/model-apis/overview}
*/
export const createBaseten = (apiKey: string, baseURL = 'https://inference.baseten.co/v1') => merge(
createChatProvider<'moonshotai/Kimi-K2-Instruct-0905' | 'Qwen3/Qwen3-Coder-480B-A35B-Instruct' | 'zai-org/GLM-4.6'>({ apiKey, baseURL }),
createModelProvider({ apiKey, baseURL }),
)
/**
* Create a Hugging Face Provider
* @see {@link https://huggingface.co/docs/inference-providers}
*/
export const createHuggingface = (apiKey: string, baseURL = 'https://router.huggingface.co/v1') => merge(
createChatProvider<'moonshotai/Kimi-K2-Instruct' | 'moonshotai/Kimi-K2-Instruct-0905' | 'MiniMaxAI/MiniMax-M2' | 'Qwen/Qwen3-Embedding-8B' | 'Qwen/Qwen3-Embedding-4B' | 'Qwen/Qwen3-Coder-480B-A35B-Instruct' | 'Qwen/Qwen3-235B-A22B-Thinking-2507' | 'Qwen/Qwen3-Next-80B-A3B-Instruct' | 'Qwen/Qwen3-Next-80B-A3B-Thinking' | 'zai-org/GLM-4.5' | 'zai-org/GLM-4.6' | 'zai-org/GLM-4.5-Air' | 'deepseek-ai/Deepseek-V3-0324' | 'deepseek-ai/DeepSeek-R1-0528'>({ apiKey, baseURL }),
createModelProvider({ apiKey, baseURL }),
)
/**
* Create a OpenCode Zen Provider
* @see {@link https://opencode.ai/docs/zen}
*/
export const createOpencode = (apiKey: string, baseURL = 'https://opencode.ai/zen/v1') => merge(
createChatProvider<'qwen3-coder' | 'claude-opus-4-1' | 'kimi-k2' | 'claude-haiku-4-5' | 'minimax-m2' | 'claude-sonnet-4-5' | 'gpt-5-codex' | 'an-gbt' | 'big-pickle' | 'claude-3-5-haiku' | 'glm-4.6' | 'grok-code' | 'claude-sonnet-4' | 'gpt-5'>({ apiKey, baseURL }),
createModelProvider({ apiKey, baseURL }),
)
/**
* Create a FastRouter Provider
* @see {@link https://fastrouter.ai/models}
*/
export const createFastrouter = (apiKey: string, baseURL = 'https://go.fastrouter.ai/api/v1') => merge(
createChatProvider<'moonshotai/kimi-k2' | 'x-ai/grok-4' | 'google/gemini-2.5-flash' | 'google/gemini-2.5-pro' | 'openai/gpt-5-nano' | 'openai/gpt-4.1' | 'openai/gpt-5-mini' | 'openai/gpt-oss-20b' | 'openai/gpt-oss-120b' | 'openai/gpt-5' | 'qwen/qwen3-coder' | 'anthropic/claude-opus-4.1' | 'anthropic/claude-sonnet-4' | 'deepseek-ai/deepseek-r1-distill-llama-70b'>({ apiKey, baseURL }),
createModelProvider({ apiKey, baseURL }),
)
/**
* Create a Google Provider
* @see {@link https://ai.google.dev/gemini-api/docs/pricing}
*/
export const createGoogleGenerativeAI = (apiKey: string, baseURL = 'https://generativelanguage.googleapis.com/v1beta/openai/') => merge(
createChatProvider<'gemini-embedding-001' | 'gemini-2.5-flash-image' | 'gemini-2.5-flash-preview-05-20' | 'gemini-flash-lite-latest' | 'gemini-2.5-flash' | 'gemini-flash-latest' | 'gemini-2.5-pro-preview-05-06' | 'gemini-2.5-flash-preview-tts' | 'gemini-2.0-flash-lite' | 'gemini-live-2.5-flash-preview-native-audio' | 'gemini-2.0-flash' | 'gemini-2.5-flash-lite' | 'gemini-2.5-pro-preview-06-05' | 'gemini-live-2.5-flash' | 'gemini-2.5-flash-lite-preview-06-17' | 'gemini-2.5-flash-image-preview' | 'gemini-2.5-flash-preview-09-2025' | 'gemini-2.5-flash-preview-04-17' | 'gemini-2.5-pro-preview-tts' | 'gemini-2.5-pro' | 'gemini-1.5-flash' | 'gemini-1.5-flash-8b' | 'gemini-2.5-flash-lite-preview-09-2025' | 'gemini-1.5-pro'>({ apiKey, baseURL }),
createModelProvider({ apiKey, baseURL }),
createEmbedProvider({ apiKey, baseURL }),
)
/**
* Create a Inception Provider
* @see {@link https://platform.inceptionlabs.ai/docs}
*/
export const createInception = (apiKey: string, baseURL = 'https://api.inceptionlabs.ai/v1/') => merge(
createChatProvider<'mercury-coder' | 'mercury'>({ apiKey, baseURL }),
createModelProvider({ apiKey, baseURL }),
)
/**
* Create a Weights & Biases Provider
* @see {@link https://weave-docs.wandb.ai/guides/integrations/inference/}
*/
export const createWandb = (apiKey: string, baseURL = 'https://api.inference.wandb.ai/v1') => merge(
createChatProvider<'moonshotai/Kimi-K2-Instruct' | 'microsoft/Phi-4-mini-instruct' | 'meta-llama/Llama-3.1-8B-Instruct' | 'meta-llama/Llama-3.3-70B-Instruct' | 'meta-llama/Llama-4-Scout-17B-16E-Instruct' | 'Qwen/Qwen3-235B-A22B-Instruct-2507' | 'Qwen/Qwen3-Coder-480B-A35B-Instruct' | 'Qwen/Qwen3-235B-A22B-Thinking-2507' | 'deepseek-ai/DeepSeek-R1-0528' | 'deepseek-ai/DeepSeek-V3-0324'>({ apiKey, baseURL }),
createModelProvider({ apiKey, baseURL }),
)
/**
* Create a Zhipu AI Coding Plan Provider
* @see {@link https://docs.bigmodel.cn/cn/coding-plan/overview}
*/
export const createZhipuaiCodingPlan = (apiKey: string, baseURL = 'https://open.bigmodel.cn/api/coding/paas/v4') => merge(
createChatProvider<'glm-4.6' | 'glm-4.5v' | 'glm-4.5-air' | 'glm-4.5' | 'glm-4.5-flash'>({ apiKey, baseURL }),
createModelProvider({ apiKey, baseURL }),
)
/**
* Create a Perplexity Provider
* @see {@link https://docs.perplexity.ai}
*/
export const createPerplexity = (apiKey: string, baseURL = 'https://api.perplexity.ai/') => merge(
createChatProvider<'sonar-reasoning' | 'sonar' | 'sonar-pro' | 'sonar-reasoning-pro'>({ apiKey, baseURL }),
createModelProvider({ apiKey, baseURL }),
)
/**
* Create a ZenMux Provider
* @see {@link https://docs.zenmux.ai}
*/
export const createZenmux = (apiKey: string, baseURL = 'https://zenmux.ai/api/v1') => merge(
createChatProvider<'moonshotai/kimi-k2-0905' | 'x-ai/grok-4-fast-non-reasoning' | 'x-ai/grok-4' | 'x-ai/grok-code-fast-1' | 'x-ai/grok-4-fast' | 'deepseek/deepseek-chat' | 'google/gemini-2.5-pro' | 'openai/gpt-5-codex' | 'openai/gpt-5' | 'inclusionai/ring-1t' | 'inclusionai/lint-1t' | 'z-ai/glm-4.5-air' | 'z-ai/glm-4.6' | 'qwen/qwen3-coder-plus' | 'kuaishou/kat-coder-pro-v1' | 'anthropic/claude-haiku-4.5' | 'anthropic/claude-opus-4.1' | 'anthropic/claude-sonnet-4.5'>({ apiKey, baseURL }),
createModelProvider({ apiKey, baseURL }),
)
/**
* Create a Synthetic Provider
* @see {@link https://synthetic.new/pricing}
*/
export const createSynthetic = (apiKey: string, baseURL = 'https://api.synthetic.new/v1') => merge(
createChatProvider<'hf:Qwen/Qwen3-235B-A22B-Instruct-2507' | 'hf:Qwen/Qwen2.5-Coder-32B-Instruct' | 'hf:Qwen/Qwen3-Coder-480B-A35B-Instruct' | 'hf:Qwen/Qwen3-235B-A22B-Thinking-2507' | 'hf:MiniMaxAI/MiniMax-M2' | 'hf:meta-llama/Llama-3.1-70B-Instruct' | 'hf:meta-llama/Llama-3.1-8B-Instruct' | 'hf:meta-llama/Llama-3.3-70B-Instruct' | 'hf:meta-llama/Llama-4-Scout-17B-16E-Instruct' | 'hf:meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8' | 'hf:meta-llama/Llama-3.1-405B-Instruct' | 'hf:moonshotai/Kimi-K2-Instruct' | 'hf:moonshotai/Kimi-K2-Instruct-0905' | 'hf:zai-org/GLM-4.5' | 'hf:zai-org/GLM-4.6' | 'hf:deepseek-ai/DeepSeek-R1' | 'hf:deepseek-ai/DeepSeek-R1-0528' | 'hf:deepseek-ai/DeepSeek-V3.1-Terminus' | 'hf:deepseek-ai/DeepSeek-V3' | 'hf:deepseek-ai/DeepSeek-V3.1' | 'hf:deepseek-ai/DeepSeek-V3-0324' | 'hf:openai/gpt-oss-120b'>({ apiKey, baseURL }),
createModelProvider({ apiKey, baseURL }),
)
/**
* Create a Deep Infra Provider
* @see {@link https://deepinfra.com/models}
*/
export const createDeepinfra = (apiKey: string, baseURL = 'https://api.deepinfra.com/v1/openai/') => merge(
createChatProvider<'moonshotai/Kimi-K2-Instruct' | 'Qwen/Qwen3-Coder-480B-A35B-Instruct' | 'Qwen/Qwen3-Coder-480B-A35B-Instruct-Turbo' | 'zai-org/GLM-4.5'>({ apiKey, baseURL }),
createModelProvider({ apiKey, baseURL }),
createEmbedProvider({ apiKey, baseURL }),
)
/**
* Create a Zhipu AI Provider
* @see {@link https://docs.z.ai/guides/overview/pricing}
*/
export const createZhipuai = (apiKey: string, baseURL = 'https://open.bigmodel.cn/api/paas/v4') => merge(
createChatProvider<'glm-4.6' | 'glm-4.5v' | 'glm-4.5-air' | 'glm-4.5' | 'glm-4.5-flash'>({ apiKey, baseURL }),
createModelProvider({ apiKey, baseURL }),
)
/**
* Create a submodel Provider
* @see {@link https://submodel.gitbook.io}
*/
export const createSubmodel = (apiKey: string, baseURL = 'https://llm.submodel.ai/v1') => merge(
createChatProvider<'openai/gpt-oss-120b' | 'Qwen/Qwen3-235B-A22B-Instruct-2507' | 'Qwen/Qwen3-Coder-480B-A35B-Instruct-FP8' | 'Qwen/Qwen3-235B-A22B-Thinking-2507' | 'zai-org/GLM-4.5-FP8' | 'zai-org/GLM-4.5-Air' | 'deepseek-ai/DeepSeek-R1-0528' | 'deepseek-ai/DeepSeek-V3.1' | 'deepseek-ai/DeepSeek-V3-0324'>({ apiKey, baseURL }),
createModelProvider({ apiKey, baseURL }),
)
/**
* Create a Z.AI Provider
* @see {@link https://docs.z.ai/guides/overview/pricing}
*/
export const createZai = (apiKey: string, baseURL = 'https://api.z.ai/api/paas/v4') => merge(
createChatProvider<'glm-4.5-flash' | 'glm-4.5' | 'glm-4.5-air' | 'glm-4.5v' | 'glm-4.6'>({ apiKey, baseURL }),
createModelProvider({ apiKey, baseURL }),
)
/**
* Create a Inference Provider
* @see {@link https://inference.net/models}
*/
export const createInference = (apiKey: string, baseURL = 'https://inference.net/v1') => merge(
createChatProvider<'mistral/mistral-nemo-12b-instruct' | 'google/gemma-3' | 'osmosis/osmosis-structure-0.6b' | 'qwen/qwen3-embedding-4b' | 'qwen/qwen-2.5-7b-vision-instruct' | 'meta/llama-3.2-11b-vision-instruct' | 'meta/llama-3.1-8b-instruct' | 'meta/llama-3.2-3b-instruct' | 'meta/llama-3.2-1b-instruct'>({ apiKey, baseURL }),
createModelProvider({ apiKey, baseURL }),
)
/**
* Create a Requesty Provider
* @see {@link https://requesty.ai/solution/llm-routing/models}
*/
export const createRequesty = (apiKey: string, baseURL = 'https://router.requesty.ai/v1') => merge(
createChatProvider<'google/gemini-2.5-flash' | 'google/gemini-2.5-pro' | 'openai/gpt-4.1-mini' | 'openai/gpt-5-nano' | 'openai/gpt-4.1' | 'openai/o4-mini' | 'openai/gpt-5-mini' | 'openai/gpt-4o-mini' | 'openai/gpt-5' | 'anthropic/claude-opus-4' | 'anthropic/claude-3-7-sonnet' | 'anthropic/claude-4-sonnet-20250522' | 'anthropic/claude-opus-4-1-20250805'>({ apiKey, baseURL }),
createModelProvider({ apiKey, baseURL }),
)
/**
* Create a Morph Provider
* @see {@link https://docs.morphllm.com/api-reference/introduction}
*/
export const createMorph = (apiKey: string, baseURL = 'https://api.morphllm.com/v1') => merge(
createChatProvider<'morph-v3-large' | 'auto' | 'morph-v3-fast'>({ apiKey, baseURL }),
createModelProvider({ apiKey, baseURL }),
)
/**
* Create a LMStudio Provider
* @see {@link https://lmstudio.ai/models}
*/
export const createLmstudio = (apiKey: string, baseURL = 'http://127.0.0.1:1234/v1') => merge(
createChatProvider<'openai/gpt-oss-20b' | 'qwen/qwen3-30b-a3b-2507' | 'qwen/qwen3-coder-30b'>({ apiKey, baseURL }),
createModelProvider({ apiKey, baseURL }),
)
/**
* Create a Fireworks AI Provider
* @see {@link https://fireworks.ai/docs/}
*/
export const createFireworksAi = (apiKey: string, baseURL = 'https://api.fireworks.ai/inference/v1/') => merge(
createChatProvider<'accounts/fireworks/models/deepseek-r1-0528' | 'accounts/fireworks/models/deepseek-v3p1' | 'accounts/fireworks/models/deepseek-v3-0324' | 'accounts/fireworks/models/kimi-k2-instruct' | 'accounts/fireworks/models/qwen3-235b-a22b' | 'accounts/fireworks/models/gpt-oss-20b' | 'accounts/fireworks/models/gpt-oss-120b' | 'accounts/fireworks/models/glm-4p5-air' | 'accounts/fireworks/models/qwen3-coder-480b-a35b-instruct' | 'accounts/fireworks/models/glm-4p5'>({ apiKey, baseURL }),
createModelProvider({ apiKey, baseURL }),
)
/**
* Create a ModelScope Provider
* @see {@link https://modelscope.cn/docs/model-service/API-Inference/intro}
*/
export const createModelscope = (apiKey: string, baseURL = 'https://api-inference.modelscope.cn/v1') => merge(
createChatProvider<'ZhipuAI/GLM-4.5' | 'ZhipuAI/GLM-4.6' | 'Qwen/Qwen3-30B-A3B-Thinking-2507' | 'Qwen/Qwen3-235B-A22B-Instruct-2507' | 'Qwen/Qwen3-Coder-30B-A3B-Instruct' | 'Qwen/Qwen3-30B-A3B-Instruct-2507' | 'Qwen/Qwen3-235B-A22B-Thinking-2507'>({ apiKey, baseURL }),
createModelProvider({ apiKey, baseURL }),
)
/**
* Create a Llama Provider
* @see {@link https://llama.developer.meta.com/docs/models}
*/
export const createLlama = (apiKey: string, baseURL = 'https://api.llama.com/compat/v1/') => merge(
createChatProvider<'llama-3.3-8b-instruct' | 'llama-4-maverick-17b-128e-instruct-fp8' | 'llama-3.3-70b-instruct' | 'llama-4-scout-17b-16e-instruct-fp8' | 'groq-llama-4-maverick-17b-128e-instruct' | 'cerebras-llama-4-scout-17b-16e-instruct' | 'cerebras-llama-4-maverick-17b-128e-instruct'>({ apiKey, baseURL }),
createModelProvider({ apiKey, baseURL }),
)
/**
* Create a Scaleway Provider
* @see {@link https://www.scaleway.com/en/docs/generative-apis/}
*/
export const createScaleway = (apiKey: string, baseURL = 'https://api.scaleway.ai/v1') => merge(
createChatProvider<'qwen3-235b-a22b-instruct-2507' | 'pixtral-12b-2409' | 'llama-3.1-8b-instruct' | 'mistral-nemo-instruct-2407' | 'mistral-small-3.2-24b-instruct-2506' | 'qwen3-coder-30b-a3b-instruct' | 'llama-3.3-70b-instruct' | 'whisper-large-v3' | 'deepseek-r1-distill-llama-70b' | 'voxtral-small-24b-2507' | 'gpt-oss-120b' | 'bge-multilingual-gemma2' | 'gemma-3-27b-it'>({ apiKey, baseURL }),
createModelProvider({ apiKey, baseURL }),
)
/**
* Create a Cerebras Provider
* @see {@link https://inference-docs.cerebras.ai/models/overview}
*/
export const createCerebras = (apiKey: string, baseURL = 'https://api.cerebras.ai/v1/') => merge(
createChatProvider<'qwen-3-235b-a22b-instruct-2507' | 'zai-glm-4.6' | 'qwen-3-coder-480b' | 'gpt-oss-120b'>({ apiKey, baseURL }),
createModelProvider({ apiKey, baseURL }),
createEmbedProvider({ apiKey, baseURL }),
)
/**
* Create a Minimax Provider
* @see {@link https://platform.minimax.io/docs/api-reference/text-openai-api}
*/
export const createMinimax = (apiKey: string, baseURL = 'https://api.minimax.io/v1/') => merge(
createChatProvider({ apiKey, baseURL }),
createModelProvider({ apiKey, baseURL }),
)
/**
* Create a Minimaxi Provider
* @see {@link https://platform.minimaxi.com/docs/api-reference/text-openai-api}
*/
export const createMinimaxi = (apiKey: string, baseURL = 'https://api.minimaxi.com/v1/') => merge(
createChatProvider({ apiKey, baseURL }),
createModelProvider({ apiKey, baseURL }),
)
/**
* Create a Novita AI Provider
* @see {@link https://novita.ai/docs/guides/llm-api#api-integration}
*/
export const createNovita = (apiKey: string, baseURL = 'https://api.novita.ai/v3/openai/') => merge(
createChatProvider({ apiKey, baseURL }),
createModelProvider({ apiKey, baseURL }),
)
/**
* Create a SiliconFlow Provider
* @see {@link https://docs.siliconflow.com/en/userguide/quickstart#4-3-call-via-openai-interface}
*/
export const createSiliconFlow = (apiKey: string, baseURL = 'https://api.siliconflow.cn/v1/') => merge(
createChatProvider({ apiKey, baseURL }),
createModelProvider({ apiKey, baseURL }),
createEmbedProvider({ apiKey, baseURL }),
createSpeechProvider({ apiKey, baseURL }),
createTranscriptionProvider({ apiKey, baseURL }),
)
/**
* Create a StepFun Provider
* @see {@link https://www.stepfun.com}
*/
export const createStepfun = (apiKey: string, baseURL = 'https://api.stepfun.com/v1/') => merge(
createChatProvider({ apiKey, baseURL }),
createModelProvider({ apiKey, baseURL }),
createEmbedProvider({ apiKey, baseURL }),
createSpeechProvider({ apiKey, baseURL }),
createTranscriptionProvider({ apiKey, baseURL }),
)
/**
* Create a Tencent Hunyuan Provider
* @see {@link https://cloud.tencent.com/document/product/1729}
*/
export const createTencentHunyuan = (apiKey: string, baseURL = 'https://api.hunyuan.cloud.tencent.com/v1/') => merge(
createChatProvider({ apiKey, baseURL }),
createModelProvider({ apiKey, baseURL }),
createEmbedProvider({ apiKey, baseURL }),
)
@@ -0,0 +1,456 @@
/* eslint-disable perfectionist/sort-named-imports */
import process from 'node:process'
import {
createMoonshotaiCn,
createLucidquery,
createMoonshotai,
createZaiCodingPlan,
createAlibaba,
createXai,
createVultr,
createNvidia,
createUpstage,
createGroq,
createMistral,
createNebius,
createDeepSeek,
createAlibabaCn,
createVenice,
createChutes,
createCortecs,
createBaseten,
createOpencode,
createFastrouter,
createGoogleGenerativeAI,
createInception,
createWandb,
createZhipuaiCodingPlan,
createPerplexity,
createZenmux,
createSynthetic,
createDeepinfra,
createZhipuai,
createZai,
createInference,
createRequesty,
createMorph,
createLmstudio,
createFireworksAi,
createModelscope,
createLlama,
createScaleway,
createCerebras,
createMinimax,
createMinimaxi,
createNovita,
createSiliconFlow,
createStepfun,
createTencentHunyuan,
} from './create'
/**
* Moonshot AI (China) Provider
* @see {@link https://platform.moonshot.cn/docs/api/chat}
* @remarks
* - baseURL - `https://api.moonshot.cn/v1`
* - apiKey - `MOONSHOT_API_KEY`
*/
export const moonshotaiCn = createMoonshotaiCn(process.env.MOONSHOT_API_KEY ?? '')
/**
* LucidQuery AI Provider
* @see {@link https://lucidquery.com/api/docs}
* @remarks
* - baseURL - `https://lucidquery.com/api/v1`
* - apiKey - `LUCIDQUERY_API_KEY`
*/
export const lucidquery = createLucidquery(process.env.LUCIDQUERY_API_KEY ?? '')
/**
* Moonshot AI Provider
* @see {@link https://platform.moonshot.ai/docs/api/chat}
* @remarks
* - baseURL - `https://api.moonshot.ai/v1`
* - apiKey - `MOONSHOT_API_KEY`
*/
export const moonshotai = createMoonshotai(process.env.MOONSHOT_API_KEY ?? '')
/**
* Z.AI Coding Plan Provider
* @see {@link https://docs.z.ai/devpack/overview}
* @remarks
* - baseURL - `https://api.z.ai/api/coding/paas/v4`
* - apiKey - `ZHIPU_API_KEY`
*/
export const zaiCodingPlan = createZaiCodingPlan(process.env.ZHIPU_API_KEY ?? '')
/**
* Alibaba Provider
* @see {@link https://www.alibabacloud.com/help/en/model-studio/models}
* @remarks
* - baseURL - `https://dashscope-intl.aliyuncs.com/compatible-mode/v1`
* - apiKey - `DASHSCOPE_API_KEY`
*/
export const alibaba = createAlibaba(process.env.DASHSCOPE_API_KEY ?? '')
/**
* xAI Provider
* @see {@link https://docs.x.ai/docs/models}
* @remarks
* - baseURL - `https://api.x.ai/v1/`
* - apiKey - `XAI_API_KEY`
*/
export const xai = createXai(process.env.XAI_API_KEY ?? '')
/**
* Vultr Provider
* @see {@link https://api.vultrinference.com/}
* @remarks
* - baseURL - `https://api.vultrinference.com/v1`
* - apiKey - `VULTR_API_KEY`
*/
export const vultr = createVultr(process.env.VULTR_API_KEY ?? '')
/**
* Nvidia Provider
* @see {@link https://docs.api.nvidia.com/nim/}
* @remarks
* - baseURL - `https://integrate.api.nvidia.com/v1`
* - apiKey - `NVIDIA_API_KEY`
*/
export const nvidia = createNvidia(process.env.NVIDIA_API_KEY ?? '')
/**
* Upstage Provider
* @see {@link https://developers.upstage.ai/docs/apis/chat}
* @remarks
* - baseURL - `https://api.upstage.ai`
* - apiKey - `UPSTAGE_API_KEY`
*/
export const upstage = createUpstage(process.env.UPSTAGE_API_KEY ?? '')
/**
* Groq Provider
* @see {@link https://console.groq.com/docs/models}
* @remarks
* - baseURL - `https://api.groq.com/openai/v1/`
* - apiKey - `GROQ_API_KEY`
*/
export const groq = createGroq(process.env.GROQ_API_KEY ?? '')
/**
* Mistral Provider
* @see {@link https://docs.mistral.ai/getting-started/models/}
* @remarks
* - baseURL - `https://api.mistral.ai/v1/`
* - apiKey - `MISTRAL_API_KEY`
*/
export const mistral = createMistral(process.env.MISTRAL_API_KEY ?? '')
/**
* Nebius AI Studio Provider
* @see {@link https://docs.studio.nebius.com/quickstart}
* @remarks
* - baseURL - `https://api.studio.nebius.com/v1/`
* - apiKey - `NEBIUS_API_KEY`
*/
export const nebius = createNebius(process.env.NEBIUS_API_KEY ?? '')
/**
* DeepSeek Provider
* @see {@link https://platform.deepseek.com/api-docs/pricing}
* @remarks
* - baseURL - `https://api.deepseek.com`
* - apiKey - `DEEPSEEK_API_KEY`
*/
export const deepseek = createDeepSeek(process.env.DEEPSEEK_API_KEY ?? '')
/**
* Alibaba (China) Provider
* @see {@link https://www.alibabacloud.com/help/en/model-studio/models}
* @remarks
* - baseURL - `https://dashscope.aliyuncs.com/compatible-mode/v1`
* - apiKey - `DASHSCOPE_API_KEY`
*/
export const alibabaCn = createAlibabaCn(process.env.DASHSCOPE_API_KEY ?? '')
/**
* Venice AI Provider
* @see {@link https://docs.venice.ai}
* @remarks
* - baseURL - `https://api.venice.ai/api/v1`
* - apiKey - `VENICE_API_KEY`
*/
export const venice = createVenice(process.env.VENICE_API_KEY ?? '')
/**
* Chutes Provider
* @see {@link https://llm.chutes.ai/v1/models}
* @remarks
* - baseURL - `https://llm.chutes.ai/v1`
* - apiKey - `CHUTES_API_KEY`
*/
export const chutes = createChutes(process.env.CHUTES_API_KEY ?? '')
/**
* Cortecs Provider
* @see {@link https://api.cortecs.ai/v1/models}
* @remarks
* - baseURL - `https://api.cortecs.ai/v1`
* - apiKey - `CORTECS_API_KEY`
*/
export const cortecs = createCortecs(process.env.CORTECS_API_KEY ?? '')
/**
* Baseten Provider
* @see {@link https://docs.baseten.co/development/model-apis/overview}
* @remarks
* - baseURL - `https://inference.baseten.co/v1`
* - apiKey - `BASETEN_API_KEY`
*/
export const baseten = createBaseten(process.env.BASETEN_API_KEY ?? '')
/**
* OpenCode Zen Provider
* @see {@link https://opencode.ai/docs/zen}
* @remarks
* - baseURL - `https://opencode.ai/zen/v1`
* - apiKey - `OPENCODE_API_KEY`
*/
export const opencode = createOpencode(process.env.OPENCODE_API_KEY ?? '')
/**
* FastRouter Provider
* @see {@link https://fastrouter.ai/models}
* @remarks
* - baseURL - `https://go.fastrouter.ai/api/v1`
* - apiKey - `FASTROUTER_API_KEY`
*/
export const fastrouter = createFastrouter(process.env.FASTROUTER_API_KEY ?? '')
/**
* Google Provider
* @see {@link https://ai.google.dev/gemini-api/docs/pricing}
* @remarks
* - baseURL - `https://generativelanguage.googleapis.com/v1beta/openai/`
* - apiKey - `GOOGLE_GENERATIVE_AI_API_KEY`
*/
export const google = createGoogleGenerativeAI(process.env.GOOGLE_GENERATIVE_AI_API_KEY ?? '')
/**
* Inception Provider
* @see {@link https://platform.inceptionlabs.ai/docs}
* @remarks
* - baseURL - `https://api.inceptionlabs.ai/v1/`
* - apiKey - `INCEPTION_API_KEY`
*/
export const inception = createInception(process.env.INCEPTION_API_KEY ?? '')
/**
* Weights & Biases Provider
* @see {@link https://weave-docs.wandb.ai/guides/integrations/inference/}
* @remarks
* - baseURL - `https://api.inference.wandb.ai/v1`
* - apiKey - `WANDB_API_KEY`
*/
export const wandb = createWandb(process.env.WANDB_API_KEY ?? '')
/**
* Zhipu AI Coding Plan Provider
* @see {@link https://docs.bigmodel.cn/cn/coding-plan/overview}
* @remarks
* - baseURL - `https://open.bigmodel.cn/api/coding/paas/v4`
* - apiKey - `ZHIPU_API_KEY`
*/
export const zhipuaiCodingPlan = createZhipuaiCodingPlan(process.env.ZHIPU_API_KEY ?? '')
/**
* Perplexity Provider
* @see {@link https://docs.perplexity.ai}
* @remarks
* - baseURL - `https://api.perplexity.ai/`
* - apiKey - `PERPLEXITY_API_KEY`
*/
export const perplexity = createPerplexity(process.env.PERPLEXITY_API_KEY ?? '')
/**
* ZenMux Provider
* @see {@link https://docs.zenmux.ai}
* @remarks
* - baseURL - `https://zenmux.ai/api/v1`
* - apiKey - `ZENMUX_API_KEY`
*/
export const zenmux = createZenmux(process.env.ZENMUX_API_KEY ?? '')
/**
* Synthetic Provider
* @see {@link https://synthetic.new/pricing}
* @remarks
* - baseURL - `https://api.synthetic.new/v1`
* - apiKey - `SYNTHETIC_API_KEY`
*/
export const synthetic = createSynthetic(process.env.SYNTHETIC_API_KEY ?? '')
/**
* Deep Infra Provider
* @see {@link https://deepinfra.com/models}
* @remarks
* - baseURL - `https://api.deepinfra.com/v1/openai/`
* - apiKey - `DEEPINFRA_API_KEY`
*/
export const deepinfra = createDeepinfra(process.env.DEEPINFRA_API_KEY ?? '')
/**
* Zhipu AI Provider
* @see {@link https://docs.z.ai/guides/overview/pricing}
* @remarks
* - baseURL - `https://open.bigmodel.cn/api/paas/v4`
* - apiKey - `ZHIPU_API_KEY`
*/
export const zhipuai = createZhipuai(process.env.ZHIPU_API_KEY ?? '')
/**
* Z.AI Provider
* @see {@link https://docs.z.ai/guides/overview/pricing}
* @remarks
* - baseURL - `https://api.z.ai/api/paas/v4`
* - apiKey - `ZHIPU_API_KEY`
*/
export const zai = createZai(process.env.ZHIPU_API_KEY ?? '')
/**
* Inference Provider
* @see {@link https://inference.net/models}
* @remarks
* - baseURL - `https://inference.net/v1`
* - apiKey - `INFERENCE_API_KEY`
*/
export const inference = createInference(process.env.INFERENCE_API_KEY ?? '')
/**
* Requesty Provider
* @see {@link https://requesty.ai/solution/llm-routing/models}
* @remarks
* - baseURL - `https://router.requesty.ai/v1`
* - apiKey - `REQUESTY_API_KEY`
*/
export const requesty = createRequesty(process.env.REQUESTY_API_KEY ?? '')
/**
* Morph Provider
* @see {@link https://docs.morphllm.com/api-reference/introduction}
* @remarks
* - baseURL - `https://api.morphllm.com/v1`
* - apiKey - `MORPH_API_KEY`
*/
export const morph = createMorph(process.env.MORPH_API_KEY ?? '')
/**
* LMStudio Provider
* @see {@link https://lmstudio.ai/models}
* @remarks
* - baseURL - `http://127.0.0.1:1234/v1`
* - apiKey - `LMSTUDIO_API_KEY`
*/
export const lmstudio = createLmstudio(process.env.LMSTUDIO_API_KEY ?? '')
/**
* Fireworks AI Provider
* @see {@link https://fireworks.ai/docs/}
* @remarks
* - baseURL - `https://api.fireworks.ai/inference/v1/`
* - apiKey - `FIREWORKS_API_KEY`
*/
export const fireworksAi = createFireworksAi(process.env.FIREWORKS_API_KEY ?? '')
/**
* ModelScope Provider
* @see {@link https://modelscope.cn/docs/model-service/API-Inference/intro}
* @remarks
* - baseURL - `https://api-inference.modelscope.cn/v1`
* - apiKey - `MODELSCOPE_API_KEY`
*/
export const modelscope = createModelscope(process.env.MODELSCOPE_API_KEY ?? '')
/**
* Llama Provider
* @see {@link https://llama.developer.meta.com/docs/models}
* @remarks
* - baseURL - `https://api.llama.com/compat/v1/`
* - apiKey - `LLAMA_API_KEY`
*/
export const llama = createLlama(process.env.LLAMA_API_KEY ?? '')
/**
* Scaleway Provider
* @see {@link https://www.scaleway.com/en/docs/generative-apis/}
* @remarks
* - baseURL - `https://api.scaleway.ai/v1`
* - apiKey - `SCALEWAY_API_KEY`
*/
export const scaleway = createScaleway(process.env.SCALEWAY_API_KEY ?? '')
/**
* Cerebras Provider
* @see {@link https://inference-docs.cerebras.ai/models/overview}
* @remarks
* - baseURL - `https://api.cerebras.ai/v1/`
* - apiKey - `CEREBRAS_API_KEY`
*/
export const cerebras = createCerebras(process.env.CEREBRAS_API_KEY ?? '')
/**
* Minimax Provider
* @see {@link https://platform.minimax.io/docs/api-reference/text-openai-api}
* @remarks
* - baseURL - `https://api.minimax.io/v1/`
* - apiKey - `MINIMAX_API_KEY`
*/
export const minimax = createMinimax(process.env.MINIMAX_API_KEY ?? '')
/**
* Minimaxi Provider
* @see {@link https://platform.minimaxi.com/docs/api-reference/text-openai-api}
* @remarks
* - baseURL - `https://api.minimaxi.com/v1/`
* - apiKey - `MINIMAX_API_KEY`
*/
export const minimaxi = createMinimaxi(process.env.MINIMAX_API_KEY ?? '')
/**
* Novita AI Provider
* @see {@link https://novita.ai/docs/guides/llm-api#api-integration}
* @remarks
* - baseURL - `https://api.novita.ai/v3/openai/`
* - apiKey - `NOVITA_API_KEY`
*/
export const novita = createNovita(process.env.NOVITA_API_KEY ?? '')
/**
* SiliconFlow Provider
* @see {@link https://docs.siliconflow.com/en/userguide/quickstart#4-3-call-via-openai-interface}
* @remarks
* - baseURL - `https://api.siliconflow.cn/v1/`
* - apiKey - `SILICON_FLOW_API_KEY`
*/
export const siliconFlow = createSiliconFlow(process.env.SILICON_FLOW_API_KEY ?? '')
/**
* StepFun Provider
* @see {@link https://www.stepfun.com}
* @remarks
* - baseURL - `https://api.stepfun.com/v1/`
* - apiKey - `STEPFUN_API_KEY`
*/
export const stepfun = createStepfun(process.env.STEPFUN_API_KEY ?? '')
/**
* Tencent Hunyuan Provider
* @see {@link https://cloud.tencent.com/document/product/1729}
* @remarks
* - baseURL - `https://api.hunyuan.cloud.tencent.com/v1/`
* - apiKey - `TENCENT_HUNYUAN_API_KEY`
*/
export const tencentHunyuan = createTencentHunyuan(process.env.TENCENT_HUNYUAN_API_KEY ?? '')
@@ -0,0 +1,13 @@
/* eslint-disable perfectionist/sort-modules */
/* eslint-disable perfectionist/sort-union-types */
export type OpenrouterModels = 'moonshotai/kimi-k2' | 'moonshotai/kimi-k2-0905' | 'moonshotai/kimi-dev-72b:free' | 'moonshotai/kimi-k2-0905:exacto' | 'moonshotai/kimi-k2:free' | 'thudm/glm-z1-32b:free' | 'nousresearch/hermes-4-70b' | 'nousresearch/hermes-4-405b' | 'nousresearch/deephermes-3-llama-3-8b-preview' | 'x-ai/grok-4' | 'x-ai/grok-code-fast-1' | 'x-ai/grok-3' | 'x-ai/grok-4-fast' | 'x-ai/grok-3-beta' | 'x-ai/grok-3-mini-beta' | 'x-ai/grok-3-mini' | 'cognitivecomputations/dolphin3.0-mistral-24b' | 'cognitivecomputations/dolphin3.0-r1-mistral-24b' | 'deepseek/deepseek-chat-v3.1' | 'deepseek/deepseek-r1:free' | 'deepseek/deepseek-v3-base:free' | 'deepseek/deepseek-v3.1-terminus' | 'deepseek/deepseek-r1-0528-qwen3-8b:free' | 'deepseek/deepseek-chat-v3-0324' | 'deepseek/deepseek-r1-0528:free' | 'deepseek/deepseek-r1-distill-llama-70b' | 'deepseek/deepseek-r1-distill-qwen-14b' | 'deepseek/deepseek-v3.1-terminus:exacto' | 'featherless/qwerky-72b' | 'tngtech/deepseek-r1t2-chimera:free' | 'minimax/minimax-m1' | 'minimax/minimax-m2:free' | 'minimax/minimax-01' | 'google/gemini-2.0-flash-001' | 'google/gemma-2-9b-it:free' | 'google/gemini-2.5-flash' | 'google/gemini-2.5-pro-preview-05-06' | 'google/gemma-3n-e4b-it' | 'google/gemini-2.5-flash-lite' | 'google/gemini-2.5-pro-preview-06-05' | 'google/gemini-2.5-flash-preview-09-2025' | 'google/gemini-2.5-pro' | 'google/gemma-3-12b-it' | 'google/gemma-3n-e4b-it:free' | 'google/gemini-2.5-flash-lite-preview-09-2025' | 'google/gemini-2.0-flash-exp:free' | 'google/gemma-3-27b-it' | 'microsoft/mai-ds-r1:free' | 'openai/gpt-4.1-mini' | 'openai/gpt-5-chat' | 'openai/gpt-5-nano' | 'openai/gpt-5-codex' | 'openai/gpt-4.1' | 'openai/gpt-oss-120b:exacto' | 'openai/o4-mini' | 'openai/gpt-5-mini' | 'openai/gpt-5-image' | 'openai/gpt-oss-20b' | 'openai/gpt-oss-120b' | 'openai/gpt-4o-mini' | 'openai/gpt-5' | 'openai/gpt-5-pro' | 'openrouter/horizon-alpha' | 'openrouter/sonoma-sky-alpha' | 'openrouter/cypher-alpha:free' | 'openrouter/sonoma-dusk-alpha' | 'openrouter/horizon-beta' | 'z-ai/glm-4.5' | 'z-ai/glm-4.5-air' | 'z-ai/glm-4.5v' | 'z-ai/glm-4.6' | 'z-ai/glm-4.6:exacto' | 'z-ai/glm-4.5-air:free' | 'qwen/qwen3-coder' | 'qwen/qwen3-32b:free' | 'qwen/qwen3-next-80b-a3b-instruct' | 'qwen/qwen-2.5-coder-32b-instruct' | 'qwen/qwen3-235b-a22b:free' | 'qwen/qwq-32b:free' | 'qwen/qwen3-30b-a3b-thinking-2507' | 'qwen/qwen3-30b-a3b:free' | 'qwen/qwen2.5-vl-72b-instruct' | 'qwen/qwen3-14b:free' | 'qwen/qwen3-30b-a3b-instruct-2507' | 'qwen/qwen3-235b-a22b-thinking-2507' | 'qwen/qwen2.5-vl-32b-instruct:free' | 'qwen/qwen2.5-vl-72b-instruct:free' | 'qwen/qwen3-235b-a22b-07-25:free' | 'qwen/qwen3-coder:free' | 'qwen/qwen3-235b-a22b-07-25' | 'qwen/qwen3-8b:free' | 'qwen/qwen3-max' | 'qwen/qwen3-next-80b-a3b-thinking' | 'qwen/qwen3-coder:exacto' | 'mistralai/devstral-medium-2507' | 'mistralai/codestral-2508' | 'mistralai/mistral-7b-instruct:free' | 'mistralai/devstral-small-2505' | 'mistralai/mistral-small-3.2-24b-instruct' | 'mistralai/devstral-small-2505:free' | 'mistralai/mistral-small-3.2-24b-instruct:free' | 'mistralai/mistral-medium-3' | 'mistralai/mistral-small-3.1-24b-instruct' | 'mistralai/devstral-small-2507' | 'mistralai/mistral-medium-3.1' | 'mistralai/mistral-nemo:free' | 'rekaai/reka-flash-3' | 'meta-llama/llama-3.2-11b-vision-instruct' | 'meta-llama/llama-3.3-70b-instruct:free' | 'meta-llama/llama-4-scout:free' | 'anthropic/claude-opus-4' | 'anthropic/claude-haiku-4.5' | 'anthropic/claude-opus-4.1' | 'anthropic/claude-3.7-sonnet' | 'anthropic/claude-3.5-haiku' | 'anthropic/claude-sonnet-4' | 'anthropic/claude-sonnet-4.5' | 'sarvamai/sarvam-m:free'
export type TogetheraiModels = 'moonshotai/Kimi-K2-Instruct' | 'openai/gpt-oss-120b' | 'meta-llama/Llama-3.3-70B-Instruct-Turbo' | 'Qwen/Qwen3-Coder-480B-A35B-Instruct-FP8' | 'deepseek-ai/DeepSeek-R1' | 'deepseek-ai/DeepSeek-V3'
export type AzureModels = 'gpt-4.1-nano' | 'gpt-4' | 'gpt-4-32k' | 'gpt-4.1-mini' | 'gpt-5-chat' | 'gpt-3.5-turbo-0125' | 'gpt-4-turbo' | 'gpt-3.5-turbo-0613' | 'o1-preview' | 'o3-mini' | 'gpt-5-nano' | 'gpt-5-codex' | 'gpt-4o' | 'gpt-3.5-turbo-0301' | 'gpt-4.1' | 'o4-mini' | 'o1' | 'gpt-5-mini' | 'o1-mini' | 'gpt-3.5-turbo-instruct' | 'o3' | 'codex-mini' | 'gpt-4-turbo-vision' | 'gpt-4o-mini' | 'gpt-5' | 'gpt-3.5-turbo-1106'
export type CloudflareWorkersAiModels = 'mistral-7b-instruct-v0.1-awq' | 'aura-1' | 'mistral-7b-instruct-v0.2' | 'tinyllama-1.1b-chat-v1.0' | 'qwen1.5-0.5b-chat' | 'llama-3.2-11b-vision-instruct' | 'llama-2-13b-chat-awq' | 'llama-3.1-8b-instruct-fp8' | 'whisper' | 'stable-diffusion-xl-base-1.0' | 'llama-2-7b-chat-fp16' | 'resnet-50' | 'stable-diffusion-v1-5-inpainting' | 'sqlcoder-7b-2' | 'llama-3-8b-instruct' | 'llama-2-7b-chat-hf-lora' | 'llama-3.1-8b-instruct' | 'openchat-3.5-0106' | 'openhermes-2.5-mistral-7b-awq' | 'lucid-origin' | 'bart-large-cnn' | 'flux-1-schnell' | 'deepseek-r1-distill-qwen-32b' | 'gemma-2b-it-lora' | 'una-cybertron-7b-v2-bf16' | 'm2m100-1.2b' | 'llama-3.2-3b-instruct' | 'qwen2.5-coder-32b-instruct' | 'stable-diffusion-v1-5-img2img' | 'gemma-7b-it-lora' | 'qwen1.5-14b-chat-awq' | 'qwen1.5-1.8b-chat' | 'mistral-small-3.1-24b-instruct' | 'gemma-7b-it' | 'llamaguard-7b-awq' | 'hermes-2-pro-mistral-7b' | 'falcon-7b-instruct' | 'llama-3.3-70b-instruct-fp8-fast' | 'llama-3-8b-instruct-awq' | 'phoenix-1.0' | 'phi-2' | 'dreamshaper-8-lcm' | 'discolm-german-7b-v1-awq' | 'llama-2-7b-chat-int8' | 'llama-3.2-1b-instruct' | 'whisper-large-v3-turbo' | 'llama-4-scout-17b-16e-instruct' | 'starling-lm-7b-beta' | 'deepseek-coder-6.7b-base-awq' | 'gemma-3-12b-it' | 'llama-guard-3-8b' | 'neural-chat-7b-v3-1-awq' | 'whisper-tiny-en' | 'stable-diffusion-xl-lightning' | 'mistral-7b-instruct-v0.1' | 'llava-1.5-7b-hf' | 'gpt-oss-20b' | 'deepseek-math-7b-instruct' | 'gpt-oss-120b' | 'melotts' | 'qwen1.5-7b-chat-awq' | 'llama-3.1-8b-instruct-fast' | 'nova-3' | 'llama-3.1-70b-instruct' | 'qwq-32b' | 'zephyr-7b-beta-awq' | 'deepseek-coder-6.7b-instruct-awq' | 'llama-3.1-8b-instruct-awq' | 'mistral-7b-instruct-v0.2-lora' | 'uform-gen2-qwen-500m'
export type AnthropicModels = 'claude-opus-4-0' | 'claude-3-5-sonnet-20241022' | 'claude-opus-4-1' | 'claude-haiku-4-5' | 'claude-3-5-sonnet-20240620' | 'claude-3-5-haiku-latest' | 'claude-3-opus-20240229' | 'claude-sonnet-4-5' | 'claude-sonnet-4-5-20250929' | 'claude-sonnet-4-20250514' | 'claude-opus-4-20250514' | 'claude-3-5-haiku-20241022' | 'claude-3-haiku-20240307' | 'claude-3-7-sonnet-20250219' | 'claude-3-7-sonnet-latest' | 'claude-sonnet-4-0' | 'claude-opus-4-1-20250805' | 'claude-3-sonnet-20240229' | 'claude-haiku-4-5-20251001'
+2
View File
@@ -0,0 +1,2 @@
export * from './generated/index'
export * from './manual/index'
@@ -0,0 +1,7 @@
export { createAnthropic } from './providers/anthropic'
export { createAzure } from './providers/azure'
export { createFeatherless } from './providers/featherless'
export { createOpenRouter } from './providers/openrouter'
export * from './providers/renamed'
export { createTogetherAI } from './providers/together-ai'
export { createWorkersAI } from './providers/workers-ai'
@@ -0,0 +1,39 @@
import process from 'node:process'
import { createAnthropic, createFeatherless, createOpenRouter, createTogetherAI } from './create'
/**
* Anthropic Provider
* @see {@link https://docs.claude.com/en/api/openai-sdk}
* @remarks
* - baseURL - `https://api.anthropic.com/v1/`
* - apiKey - `ANTHROPIC_API_KEY`
*/
export const anthropic = createAnthropic(process.env.ANTHROPIC_API_KEY ?? '')
/**
* Featherless AI Provider
* @see {@link https://featherless.ai/models}
* @remarks
* - baseURL - `https://api.featherless.ai/v1/`
* - apiKey - `FEATHERLESS_API_KEY`
*/
export const featherless = createFeatherless(process.env.FEATHERLESS_API_KEY ?? '')
/**
* OpenRouter Provider
* @see {@link https://openrouter.ai/models}
* @remarks
* - baseURL - `https://openrouter.ai/api/v1/`
* - apiKey - `OPENROUTER_API_KEY`
*/
export const openrouter = createOpenRouter(process.env.OPENROUTER_API_KEY ?? '')
/**
* Together AI Provider
* @see {@link https://docs.together.ai/docs/serverless-models}
* @remarks
* - baseURL - `https://api.together.xyz/v1/`
* - apiKey - `TOGETHER_API_KEY`
*/
export const togetherai = createTogetherAI(process.env.TOGETHER_API_KEY ?? '')
@@ -0,0 +1,17 @@
import {
createChatProvider,
createModelProvider,
merge,
} from '@xsai-ext/shared-providers'
import type { AnthropicModels } from '../../generated/types'
/**
* Create a Anthropic Provider
* @see {@link https://docs.claude.com/en/api/openai-sdk}
*/
export const createAnthropic = (apiKey: string, baseURL = 'https://api.anthropic.com/v1/') => merge(
/** TODO: {@link https://docs.claude.com/en/api/openai-sdk#extended-thinking-support} */
createChatProvider<AnthropicModels>({ apiKey, baseURL }),
createModelProvider({ apiKey, baseURL }),
)
@@ -0,0 +1,98 @@
import type { Fetch } from '@xsai/shared'
import {
createChatProvider,
createEmbedProvider,
createModelProvider,
createSpeechProvider,
createTranscriptionProvider,
merge,
} from '@xsai-ext/shared-providers'
import type { AzureModels } from '../../generated/types'
export interface CreateAzureOptions {
/**
* The static API key or AD access token fetcher for authorization.
*
* If passed in as a function, it is treated as an accessTokenFetcher.
*
* @see {@link https://learn.microsoft.com/en-us/azure/api-management/api-management-authenticate-authorize-azure-openai}
*/
apiKey: (() => Promise<string> | string) | string
/**
* The Azure API version to use (`api-version` param).
*
* Notice: Different deployment over different time may have different API versions, please
* follow the exact prompt from either [Azure AI Foundry](https://ai.azure.com/) or Azure OpenAI service
* to get the correct API version from the Azure OpenAI Service endpoint.
*
* On Azure AI Foundry portal, you can go to https://ai.azure.com/build/overview > Choose the project >
* Overview > Endpoints and keys > Included capabilities > Azure OpenAI Service to get the correct endpoint.
*
* @see {@link https://learn.microsoft.com/en-us/azure/ai-services/openai/reference#rest-api-versioning}
*/
apiVersion?: string
/**
* Azure resource name.
*
* On Azure AI Foundry portal, you can go to https://ai.azure.com/build/overview > Choose the project >
* Overview > Endpoints and keys > Included capabilities > Azure OpenAI Service to get the correct endpoint.
*
* @see {@link https://learn.microsoft.com/en-us/azure/ai-services/openai/reference#uri-parameters}
*/
resourceName: string
}
/**
* Create a Azure Provider
* @see {@link https://ai.azure.com/explore/models}
* @see {@link https://learn.microsoft.com/en-us/azure/ai-foundry/model-inference/concepts/endpoints?tabs=rest#routing}
* @remarks
* For Azure AI services, you can have multiple deployments of the same model with different names.
*
* Please pass your deployment name as the `model` parameter. By default, Azure will use the model name
* as the deployment name when deploying a model.
*/
export const createAzure = async (options: CreateAzureOptions) => {
const headers = typeof options.apiKey === 'string'
? { 'api-key': options.apiKey }
: undefined
// More reference about how the URL concatenation works:
// https://learn.microsoft.com/en-us/azure/ai-foundry/model-inference/how-to/inference?tabs=python#endpoints
//
// Vercel AI SDK implemented it like this:
// https://sdk.vercel.ai/providers/ai-sdk-providers/azure
//
// For *.openai.azure.com, you can learn more here:
// https://learn.microsoft.com/en-us/azure/ai-services/openai/reference
const baseURL = `https://${options.resourceName}.services.ai.azure.com/models/`
const fetch: Fetch = async (input, init) => {
if (options.apiVersion != null)
input.searchParams.set('api-version', options.apiVersion)
// For the extra steps to obtain the bearer token, please refer to the following links:
// https://learn.microsoft.com/en-us/azure/api-management/api-management-authenticate-authorize-azure-openai
// https://learn.microsoft.com/en-us/azure/ai-services/openai/reference#authentication
const token = `Bearer ${typeof options.apiKey === 'function' ? await options.apiKey() : options.apiKey}`
init.headers ??= {}
if (Array.isArray(init.headers))
init.headers.push(['Authorization', token])
else if (init.headers instanceof Headers)
init.headers.append('Authorization', token)
else
init.headers.Authorization = token
return globalThis.fetch(input, init)
}
return merge(
createChatProvider<AzureModels>({ baseURL, fetch, headers }),
createEmbedProvider({ baseURL, fetch, headers }),
createSpeechProvider({ baseURL, fetch, headers }),
createTranscriptionProvider({ baseURL, fetch, headers }),
createModelProvider({ baseURL, fetch, headers }),
)
}
@@ -0,0 +1,20 @@
import {
createChatProvider,
createModelProvider,
merge,
} from '@xsai-ext/shared-providers'
/**
* Create a Featherless AI Provider
* @see {@link https://featherless.ai/models}
*/
export const createFeatherless = (apiKey: string, baseURL = 'https://api.featherless.ai/v1/') => merge(
createChatProvider({ apiKey, baseURL }),
createModelProvider({
apiKey,
baseURL,
fetch: async (...args: Parameters<typeof globalThis.fetch>) => globalThis.fetch(...args)
.then(async res => res.json() as Promise<unknown[]>)
.then(data => Response.json({ data, object: 'list' })),
}),
)
@@ -0,0 +1,133 @@
import type { ChatProviderWithExtraOptions } from '@xsai-ext/shared-providers'
import type { CommonRequestOptions } from '@xsai/shared'
import { createModelProvider, merge } from '@xsai-ext/shared-providers'
import { objCamelToSnake } from '@xsai/shared'
import type { OpenrouterModels } from '../../generated/types'
export interface OpenRouterOptions {
extraHeaders?: (Headers | Record<string, string>) & {
'HTTP-Referer'?: string
'X-Title'?: string
}
/**
* Model routing
*
* @see {@link https://openrouter.ai/docs/features/model-routing}
* @example
* ```
* {
* model: [ 'openai/gpt-1o' ],
* models: [ 'openai/gpt-4o', 'google/gemini-2.0-flash-001' ],
* messages: [
* { role: 'user', content: 'Hello, world!' },
* ]
* }
* ```
*/
models?: string[]
/**
* Provider routing
*
* @see {@link https://openrouter.ai/docs/features/provider-routing}
*/
provider?: {
/**
* Whether to allow backup providers when the primary is unavailable.
*
* @see {@link https://openrouter.ai/docs/features/provider-routing#disabling-fallbacks}
* @default true
* @example false
*/
allowFallbacks?: boolean
/**
* Control whether to use providers that may store data.
*
* @see {@link https://openrouter.ai/docs/features/provider-routing#requiring-providers-to-comply-with-data-policies}
* @default 'allow'
*/
dataCollection?: 'allow' | 'deny'
/**
* List of provider names to skip for this request.
*
* @see {@link https://openrouter.ai/docs/features/provider-routing#ignoring-providers}
*/
ignore?: string[]
/**
* List of provider names to try in order (e.g. ["Anthropic", "OpenAI"]).
*
* @see {@link https://openrouter.ai/docs/features/provider-routing#ordering-specific-providers}
* @example [ 'Anthropic', 'OpenAI' ]
*/
order?: string[]
/**
* List of quantization levels to filter by (e.g. ["int4", "int8"]).
*
* @see {@link https://openrouter.ai/docs/features/provider-routing#quantization}
* @example [ 'int4', 'int8' ]
*/
quantizations?: string[]
/**
* Only use providers that support all parameters in your request.
*
* @see {@link https://openrouter.ai/docs/features/provider-routing#requiring-providers-to-support-all-parameters-beta}
*/
requireParameters?: boolean
/**
* Sort providers by price or throughput. (e.g. "price" or "throughput").
*
* @see {@link https://openrouter.ai/docs/features/provider-routing#provider-sorting}
* @example 'price'
*/
sort?: string
}
/**
* To help with prompts that exceed the maximum context size of a model.
*
* All OpenRouter endpoints with 8k or less context length will default to using middle-out.
* To disable this, set `transforms: []` in the request body.
*
* @see {@link https://openrouter.ai/docs/features/message-transforms}
* @default 'middle-out'
*/
transforms?: string[]
}
/**
* Create a OpenRouter Provider
* @see {@link https://openrouter.ai/models}
*/
export const createOpenRouter = (apiKey: string, baseURL = 'https://openrouter.ai/api/v1/') => merge(
{
chat: (model: string, openRouterOptions?: OpenRouterOptions) => {
const requestOptions: CommonRequestOptions = { apiKey, baseURL, model }
const toOpenRouterOptions = ({ extraHeaders, models, provider }: OpenRouterOptions): Record<string, unknown> => {
if (extraHeaders != null) {
requestOptions.headers ??= {}
Object.assign(requestOptions.headers, extraHeaders)
}
let transformedProvider: Record<string, unknown> | undefined
if (provider != null) {
transformedProvider = objCamelToSnake(provider)
}
return objCamelToSnake({
models,
provider: transformedProvider,
})
}
return {
...(openRouterOptions ? toOpenRouterOptions(openRouterOptions) : {}),
...requestOptions,
}
},
} as ChatProviderWithExtraOptions<
OpenrouterModels,
OpenRouterOptions
>,
createModelProvider({ apiKey, baseURL }),
)
@@ -0,0 +1,11 @@
import { createAlibabaCn, createXai } from '../../generated/create'
import { createFeatherless } from './featherless'
/** @deprecated use `createFeatherless` instead. */
export const createFatherless = createFeatherless
/** @deprecated use `createAlibabaCn` instead. */
export const createQwen = createAlibabaCn
/** @deprecated use `createXai` instead. */
export const createXAI = createXai
@@ -0,0 +1,24 @@
import {
createChatProvider,
createEmbedProvider,
createModelProvider,
merge,
} from '@xsai-ext/shared-providers'
import type { TogetheraiModels } from '../../generated/types'
/**
* Create a Together AI Provider
* @see {@link https://docs.together.ai/docs/serverless-models}
*/
export const createTogetherAI = (apiKey: string, baseURL = 'https://api.together.xyz/v1/') => merge(
createChatProvider<TogetheraiModels>({ apiKey, baseURL }),
createEmbedProvider({ apiKey, baseURL }),
createModelProvider({
apiKey,
baseURL,
fetch: async (...args: Parameters<typeof globalThis.fetch>) => globalThis.fetch(...args)
.then(async res => res.json() as Promise<unknown[]>)
.then(data => Response.json({ data, object: 'list' })),
}),
)
@@ -0,0 +1,16 @@
import { createChatProvider, createEmbedProvider, merge } from '@xsai-ext/shared-providers'
import type { CloudflareWorkersAiModels } from '../../generated/types'
/**
* Create a Workers AI Provider
* @see {@link https://developers.cloudflare.com/workers-ai}
*/
export const createWorkersAI = (apiKey: string, accountId: string) => {
const baseURL = `https://api.cloudflare.com/client/v4/accounts/${accountId}/ai/v1/`
return merge(
createChatProvider<CloudflareWorkersAiModels>({ apiKey, baseURL }),
createEmbedProvider({ apiKey, baseURL }),
)
}
+14
View File
@@ -0,0 +1,14 @@
import { describe, expect, it } from 'vitest'
import { nvidia } from '../src'
describe('@xsai-ext/providers', () => {
it('nvidia', () => {
const model = 'openai/gpt-oss-120b'
const result = nvidia.chat(model)
expect(result.apiKey).toBe('')
expect(result.baseURL).toBe('https://integrate.api.nvidia.com/v1')
expect(result.model).toBe(model)
})
})
+1 -1
View File
@@ -34,7 +34,7 @@
"types": "./dist/index.d.ts"
},
"scripts": {
"build": "pkgroll"
"build": "tsdown"
},
"dependencies": {
"@xsai/shared": "workspace:~"
@@ -1,4 +1,4 @@
import type { UnionToIntersection } from 'type-fest'
import type { UnionToIntersection } from 'type-fest/source/union-to-intersection'
export const merge = <T extends object[]>(...arr: T): UnionToIntersection<T[number]> =>
Object.assign(arr[0], ...arr.slice(1)) as UnionToIntersection<T[number]>
@@ -0,0 +1,11 @@
import { defineConfig } from 'tsdown'
import pkg from './package.json' with { type: 'json' }
export default defineConfig({
dts: {
build: true,
resolve: Object.keys(pkg.devDependencies),
},
entry: 'src/index.ts',
})
@@ -606,7 +606,7 @@ exports[`@xsai/embed > embedMany 1`] = `
"-0.03",
"0.02",
"0.02",
"-0.02",
"-0.01",
"0.00",
"-0.02",
"-0.01",
@@ -1,5 +1,5 @@
import type { StreamTextOptions, StreamTextResult } from '@xsai/stream-text'
import type { PartialDeep } from 'type-fest'
import type { PartialDeep } from 'type-fest/source/partial-deep'
import type { Infer, Schema } from 'xsschema'
import { streamText } from '@xsai/stream-text'
@@ -1,4 +1,4 @@
import type { PartialDeep } from 'type-fest'
import type { PartialDeep } from 'type-fest/source/partial-deep'
import { parse } from 'best-effort-json-parser'
@@ -1,4 +1,4 @@
import type { PartialDeep } from 'type-fest'
import type { PartialDeep } from 'type-fest/source/partial-deep'
import { parse } from 'best-effort-json-parser'
+2116 -1654
View File
File diff suppressed because it is too large. Load diff
+1 -1
View File
@@ -1,4 +1,4 @@
{
"extends": "@moeru/tsconfig/tsconfig.node.json",
"include": ["**/*.config.ts", "**/scripts/*.ts"]
"include": ["**/*.config.ts", "**/scripts/**/*.ts"]
}