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:
1 parent
f8308823fa
commit
b68d21aa71
33 files changed
+3802
-1661
No files matched your search
@@ -63,6 +63,7 @@ words:
|
||||
- qwen
|
||||
- reranker
|
||||
- rhasspy
|
||||
- scule
|
||||
- siliconflow
|
||||
- sonarjs
|
||||
- SoVITS
|
||||
@@ -73,6 +74,7 @@ words:
|
||||
- sury
|
||||
- Systran
|
||||
- theguild
|
||||
- togetherai
|
||||
- twoslash
|
||||
- typeschema
|
||||
- unrs
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
@@ -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>
|
||||
@@ -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'
|
||||
@@ -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 }),
|
||||
)
|
||||
}
|
||||
@@ -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)
|
||||
})
|
||||
})
|
||||
@@ -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'
|
||||
|
||||
|
||||
Generated
+2116
-1654
File diff suppressed because it is too large.
Load diff
+1
-1
@@ -1,4 +1,4 @@
|
||||
{
|
||||
"extends": "@moeru/tsconfig/tsconfig.node.json",
|
||||
"include": ["**/*.config.ts", "**/scripts/*.ts"]
|
||||
"include": ["**/*.config.ts", "**/scripts/**/*.ts"]
|
||||
}
|
||||
Reference in new issue
Block a user