diff --git a/packages/i18n/src/locales/en/settings.yaml b/packages/i18n/src/locales/en/settings.yaml index 227b26e4d..1b0eb6e46 100644 --- a/packages/i18n/src/locales/en/settings.yaml +++ b/packages/i18n/src/locales/en/settings.yaml @@ -665,6 +665,9 @@ pages: openai-compatible: description: OpenAI Compatible title: OpenAI Compatible + n1n: + description: n1n.ai - High-performance AI API provider. + title: n1n openrouter: description: openrouter.ai title: OpenRouter diff --git a/packages/i18n/src/locales/zh-Hans/settings.yaml b/packages/i18n/src/locales/zh-Hans/settings.yaml index 75d3508a6..8ebe28976 100644 --- a/packages/i18n/src/locales/zh-Hans/settings.yaml +++ b/packages/i18n/src/locales/zh-Hans/settings.yaml @@ -639,6 +639,9 @@ pages: openai-compatible: description: OpenAI Compatible title: OpenAI Compatible + n1n: + description: n1n.ai - 高性能 AI API 服务来源 + title: n1n openrouter: description: OpenRouter.ai title: OpenRouter diff --git a/packages/stage-ui/src/libs/providers/providers/index.ts b/packages/stage-ui/src/libs/providers/providers/index.ts index 62f5790fd..569a0c686 100644 --- a/packages/stage-ui/src/libs/providers/providers/index.ts +++ b/packages/stage-ui/src/libs/providers/providers/index.ts @@ -1,5 +1,6 @@ import './openai' import './openai-compatible' +import './n1n' import './openrouter-ai' import './groq' import './anthropic' diff --git a/packages/stage-ui/src/libs/providers/providers/n1n/index.ts b/packages/stage-ui/src/libs/providers/providers/n1n/index.ts new file mode 100644 index 000000000..8677f1a57 --- /dev/null +++ b/packages/stage-ui/src/libs/providers/providers/n1n/index.ts @@ -0,0 +1,54 @@ +import { createOpenAI } from '@xsai-ext/providers/create' +import { z } from 'zod' + +import { createOpenAICompatibleValidators } from '../../validators/openai-compatible' +import { defineProvider } from '../registry' + +const n1nConfigSchema = z.object({ + apiKey: z + .string('API Key') + .optional(), + baseUrl: z + .string('Base URL') + .optional() + .default('https://api.n1n.ai/v1'), +}) + +type N1NConfig = z.input + +export const providerN1N = defineProvider({ + id: 'n1n', + order: 9, + name: 'n1n', + nameLocalize: ({ t }) => t('settings.pages.providers.provider.n1n.title'), + description: 'n1n.ai - High-performance AI API provider.', + descriptionLocalize: ({ t }) => t('settings.pages.providers.provider.n1n.description'), + tasks: ['chat'], + icon: 'i-lobe-icons:openai', + + createProviderConfig: ({ t }) => n1nConfigSchema.extend({ + apiKey: n1nConfigSchema.shape.apiKey.meta({ + labelLocalized: t('settings.pages.providers.catalog.edit.config.common.fields.field.api-key.label'), + descriptionLocalized: t('settings.pages.providers.catalog.edit.config.common.fields.field.api-key.description'), + placeholderLocalized: t('settings.pages.providers.catalog.edit.config.common.fields.field.api-key.placeholder'), + type: 'password', + }), + baseUrl: n1nConfigSchema.shape.baseUrl.meta({ + labelLocalized: t('settings.pages.providers.catalog.edit.config.common.fields.field.base-url.label'), + descriptionLocalized: t('settings.pages.providers.catalog.edit.config.common.fields.field.base-url.description'), + placeholderLocalized: t('settings.pages.providers.catalog.edit.config.common.fields.field.base-url.placeholder'), + }), + }), + createProvider(config) { + return createOpenAI(config.apiKey || '', config.baseUrl) + }, + + validationRequiredWhen(config) { + return !!config.apiKey?.trim() + }, + validators: { + ...createOpenAICompatibleValidators({ + checks: ['connectivity', 'model_list', 'chat_completions'], + }), + }, +})