Skip to content

Commit faea45e

Browse files
authored
feat(stage-ui): add n1n provider (#968)
1 parent 311bd10 commit faea45e

File tree

4 files changed

+61
-0
lines changed

4 files changed

+61
-0
lines changed

packages/i18n/src/locales/en/settings.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -665,6 +665,9 @@ pages:
665665
openai-compatible:
666666
description: OpenAI Compatible
667667
title: OpenAI Compatible
668+
n1n:
669+
description: n1n.ai - High-performance AI API provider.
670+
title: n1n
668671
openrouter:
669672
description: openrouter.ai
670673
title: OpenRouter

packages/i18n/src/locales/zh-Hans/settings.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -639,6 +639,9 @@ pages:
639639
openai-compatible:
640640
description: OpenAI Compatible
641641
title: OpenAI Compatible
642+
n1n:
643+
description: n1n.ai - 高性能 AI API 服务来源
644+
title: n1n
642645
openrouter:
643646
description: OpenRouter.ai
644647
title: OpenRouter

packages/stage-ui/src/libs/providers/providers/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import './openai'
22
import './openai-compatible'
3+
import './n1n'
34
import './openrouter-ai'
45
import './groq'
56
import './anthropic'
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
import { createOpenAI } from '@xsai-ext/providers/create'
2+
import { z } from 'zod'
3+
4+
import { createOpenAICompatibleValidators } from '../../validators/openai-compatible'
5+
import { defineProvider } from '../registry'
6+
7+
const n1nConfigSchema = z.object({
8+
apiKey: z
9+
.string('API Key')
10+
.optional(),
11+
baseUrl: z
12+
.string('Base URL')
13+
.optional()
14+
.default('https://api.n1n.ai/v1'),
15+
})
16+
17+
type N1NConfig = z.input<typeof n1nConfigSchema>
18+
19+
export const providerN1N = defineProvider<N1NConfig>({
20+
id: 'n1n',
21+
order: 9,
22+
name: 'n1n',
23+
nameLocalize: ({ t }) => t('settings.pages.providers.provider.n1n.title'),
24+
description: 'n1n.ai - High-performance AI API provider.',
25+
descriptionLocalize: ({ t }) => t('settings.pages.providers.provider.n1n.description'),
26+
tasks: ['chat'],
27+
icon: 'i-lobe-icons:openai',
28+
29+
createProviderConfig: ({ t }) => n1nConfigSchema.extend({
30+
apiKey: n1nConfigSchema.shape.apiKey.meta({
31+
labelLocalized: t('settings.pages.providers.catalog.edit.config.common.fields.field.api-key.label'),
32+
descriptionLocalized: t('settings.pages.providers.catalog.edit.config.common.fields.field.api-key.description'),
33+
placeholderLocalized: t('settings.pages.providers.catalog.edit.config.common.fields.field.api-key.placeholder'),
34+
type: 'password',
35+
}),
36+
baseUrl: n1nConfigSchema.shape.baseUrl.meta({
37+
labelLocalized: t('settings.pages.providers.catalog.edit.config.common.fields.field.base-url.label'),
38+
descriptionLocalized: t('settings.pages.providers.catalog.edit.config.common.fields.field.base-url.description'),
39+
placeholderLocalized: t('settings.pages.providers.catalog.edit.config.common.fields.field.base-url.placeholder'),
40+
}),
41+
}),
42+
createProvider(config) {
43+
return createOpenAI(config.apiKey || '', config.baseUrl)
44+
},
45+
46+
validationRequiredWhen(config) {
47+
return !!config.apiKey?.trim()
48+
},
49+
validators: {
50+
...createOpenAICompatibleValidators({
51+
checks: ['connectivity', 'model_list', 'chat_completions'],
52+
}),
53+
},
54+
})

0 commit comments

Comments
 (0)