diff --git a/src/main/provider/defaults.ts b/src/main/provider/defaults.ts index 83b2331d4..9bf998ef7 100644 --- a/src/main/provider/defaults.ts +++ b/src/main/provider/defaults.ts @@ -206,6 +206,20 @@ const PROVIDER_DEFAULTS: LLM_PROVIDER_BASE[] = [ models: 'https://xxapi.ai/pricing' } }, + { + id: 'llmbuzz', + name: 'llm.buzz', + apiType: 'openai-completions', + apiKey: '', + baseUrl: 'https://api.llm.buzz/api/v1', + enable: false, + websites: { + official: 'https://llm.buzz/', + apiKey: 'https://app.llm.buzz', + docs: 'https://llm.buzz', + models: 'https://api.llm.buzz/api/v1/models' + } + }, { id: 'apimodels', name: 'apimodels.app', diff --git a/src/main/provider/providerRegistry.ts b/src/main/provider/providerRegistry.ts index f029ffb57..2b788154b 100644 --- a/src/main/provider/providerRegistry.ts +++ b/src/main/provider/providerRegistry.ts @@ -357,6 +357,14 @@ const PROVIDER_ID_REGISTRY = new Map([ embeddingStrategy: 'none' }) ], + [ + 'llmbuzz', + createDefinition({ + ...OPENAI_BASE, + credentialStrategy: 'api-key', + embeddingStrategy: 'none' + }) + ], [ 'apimodels', createDefinition({ diff --git a/src/renderer/src/assets/llm-icons/llmbuzz.svg b/src/renderer/src/assets/llm-icons/llmbuzz.svg new file mode 100644 index 000000000..c4dbdbd04 --- /dev/null +++ b/src/renderer/src/assets/llm-icons/llmbuzz.svg @@ -0,0 +1 @@ + diff --git a/src/renderer/src/components/icons/modelIconRegistry.ts b/src/renderer/src/components/icons/modelIconRegistry.ts index 0c3c8e5a4..9848054d8 100644 --- a/src/renderer/src/components/icons/modelIconRegistry.ts +++ b/src/renderer/src/components/icons/modelIconRegistry.ts @@ -103,6 +103,7 @@ import futureinfraIcon from '@/assets/llm-icons/futureinfra.svg?url' import atmorouterIcon from '@/assets/llm-icons/atmorouter.svg?url' import yapiIcon from '@/assets/llm-icons/yapi.svg?url' import xxapiIcon from '@/assets/llm-icons/xxapi.svg?url' +import llmbuzzIcon from '@/assets/llm-icons/llmbuzz.svg?url' import apimodelsIcon from '@/assets/llm-icons/apimodels.png?url' import anonrouterIcon from '@/assets/llm-icons/anonrouter.svg?url' import typesafeIcon from '@/assets/llm-icons/typesafe.png?url' @@ -160,6 +161,7 @@ export const modelIcons = { atmorouter: atmorouterIcon, yapi: yapiIcon, xxapi: xxapiIcon, + llmbuzz: llmbuzzIcon, apimodels: apimodelsIcon, zeabur: zeaburColorIcon, zeroone: zerooneColorIcon, @@ -293,6 +295,7 @@ const monoIconUrls = new Set([ runcrateIcon, cloudgpuIcon, xxapiIcon, + llmbuzzIcon, demonrouteColorIcon, githubColorIcon, qiniuIcon, diff --git a/test/main/provider/basicApiKeyProviders.test.ts b/test/main/provider/basicApiKeyProviders.test.ts index 553e41be9..78b93d80c 100644 --- a/test/main/provider/basicApiKeyProviders.test.ts +++ b/test/main/provider/basicApiKeyProviders.test.ts @@ -1109,6 +1109,25 @@ describe('basic API-key provider registrations', () => { }) }) + it('resolves llm.buzz through authenticated OpenAI-compatible model discovery', () => { + expect( + resolveAiSdkProviderDefinition( + createProvider({ + id: 'llmbuzz', + name: 'llm.buzz', + baseUrl: 'https://api.llm.buzz/api/v1' + }) + ) + ).toMatchObject({ + runtimeKind: 'openai-compatible', + modelSource: 'openai', + checkStrategy: 'fetch-models', + credentialStrategy: 'api-key', + routeStrategy: 'none', + embeddingStrategy: 'none' + }) + }) + it('resolves API Route through authenticated OpenAI-compatible model discovery', () => { expect( resolveAiSdkProviderDefinition( diff --git a/test/main/provider/defaultProviders.test.ts b/test/main/provider/defaultProviders.test.ts index cb79209d2..e6b4191b5 100644 --- a/test/main/provider/defaultProviders.test.ts +++ b/test/main/provider/defaultProviders.test.ts @@ -321,6 +321,25 @@ describe('DEFAULT_PROVIDERS', () => { ) }) + it('includes llm.buzz as a disabled built-in OpenAI-compatible provider', () => { + expect(DEFAULT_PROVIDERS).toContainEqual( + expect.objectContaining({ + id: 'llmbuzz', + name: 'llm.buzz', + apiType: 'openai-completions', + baseUrl: 'https://api.llm.buzz/api/v1', + enable: false, + websites: expect.objectContaining({ + official: 'https://llm.buzz/', + apiKey: 'https://app.llm.buzz', + docs: 'https://llm.buzz', + models: 'https://api.llm.buzz/api/v1/models', + defaultBaseUrl: 'https://api.llm.buzz/api/v1' + }) + }) + ) + }) + it('includes apimodels.app as a disabled built-in OpenAI-compatible provider', () => { expect(DEFAULT_PROVIDERS).toContainEqual( expect.objectContaining({