Files
xsai/packages-ext/providers/scripts/utils/code-gen.ts
T
藍+85CD b68d21aa71 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
2025-11-01 11:54:57 +08:00

46 lines
1.9 KiB
TypeScript

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('\' | \'')}'`