diff --git a/src/main/presenter/configPresenter/providers.ts b/src/main/presenter/configPresenter/providers.ts index dd84070a9..6e20f6892 100644 --- a/src/main/presenter/configPresenter/providers.ts +++ b/src/main/presenter/configPresenter/providers.ts @@ -199,6 +199,21 @@ export const DEFAULT_PROVIDERS: LLM_PROVIDER_BASE[] = [ defaultBaseUrl: 'https://openrouter.ai/api/v1/' } }, + { + id: 'poe', + name: 'Poe', + apiType: 'poe', + apiKey: '', + baseUrl: 'https://api.poe.com/v1', + enable: false, + websites: { + official: 'https://poe.com/', + apiKey: 'https://poe.com/api_key', + docs: 'https://creator.poe.com/docs/external-applications/openai-compatible-api', + models: 'https://api.poe.com/v1/models', + defaultBaseUrl: 'https://api.poe.com/v1' + } + }, { id: '302ai', name: '302.AI', diff --git a/src/main/presenter/llmProviderPresenter/index.ts b/src/main/presenter/llmProviderPresenter/index.ts index 1fa8f7311..a428be748 100644 --- a/src/main/presenter/llmProviderPresenter/index.ts +++ b/src/main/presenter/llmProviderPresenter/index.ts @@ -47,6 +47,7 @@ import { AihubmixProvider } from './providers/aihubmixProvider' import { _302AIProvider } from './providers/_302AIProvider' import { ModelscopeProvider } from './providers/modelscopeProvider' import { VercelAIGatewayProvider } from './providers/vercelAIGatewayProvider' +import { PoeProvider } from './providers/poeProvider' // Rate limit configuration interface interface RateLimitConfig { @@ -212,6 +213,8 @@ export class LLMProviderPresenter implements ILlmProviderPresenter { return new GroqProvider(provider, this.configPresenter) case 'vercel-ai-gateway': return new VercelAIGatewayProvider(provider, this.configPresenter) + case 'poe': + return new PoeProvider(provider, this.configPresenter) case 'aws-bedrock': return new AwsBedrockProvider(provider, this.configPresenter) default: @@ -264,6 +267,8 @@ export class LLMProviderPresenter implements ILlmProviderPresenter { return new GrokProvider(provider, this.configPresenter) case 'vercel-ai-gateway': return new VercelAIGatewayProvider(provider, this.configPresenter) + case 'poe': + return new PoeProvider(provider, this.configPresenter) case 'aws-bedrock': return new AwsBedrockProvider(provider, this.configPresenter) default: diff --git a/src/main/presenter/llmProviderPresenter/providers/poeProvider.ts b/src/main/presenter/llmProviderPresenter/providers/poeProvider.ts new file mode 100644 index 000000000..9eca00ef5 --- /dev/null +++ b/src/main/presenter/llmProviderPresenter/providers/poeProvider.ts @@ -0,0 +1,25 @@ +import { LLM_PROVIDER, MODEL_META, IConfigPresenter } from '@shared/presenter' +import { OpenAICompatibleProvider } from './openAICompatibleProvider' + +/** + * PoeProvider integrates Poe's OpenAI-compatible API surface with the shared + * BaseLLMProvider contract so the rest of the app can treat it just like + * any other OpenAI-style backend. + * + * Poe exposes hundreds of community and frontier models through a single + * endpoint. We reuse the OpenAICompatibleProvider implementation and only + * tweak metadata so the renderer can present a clearer group name. + */ +export class PoeProvider extends OpenAICompatibleProvider { + constructor(provider: LLM_PROVIDER, configPresenter: IConfigPresenter) { + super(provider, configPresenter) + } + + protected async fetchOpenAIModels(options?: { timeout: number }): Promise { + const models = await super.fetchOpenAIModels(options) + return models.map((model) => ({ + ...model, + group: 'Poe' + })) + } +} diff --git a/src/renderer/src/components/icons/ModelIcon.vue b/src/renderer/src/components/icons/ModelIcon.vue index b1464e1c9..91b574e42 100644 --- a/src/renderer/src/components/icons/ModelIcon.vue +++ b/src/renderer/src/components/icons/ModelIcon.vue @@ -44,6 +44,7 @@ import ppioColorIcon from '@/assets/llm-icons/ppio-color.svg?url' import tokenfluxColorIcon from '@/assets/llm-icons/tokenflux-color.svg?url' import moonshotColorIcon from '@/assets/llm-icons/moonshot.svg?url' import openrouterColorIcon from '@/assets/llm-icons/openrouter.svg?url' +import poeColorIcon from '@/assets/llm-icons/poe-color.svg?url' import geminiColorIcon from '@/assets/llm-icons/gemini-color.svg?url' import githubColorIcon from '@/assets/llm-icons/github.svg?url' import azureOpenaiColorIcon from '@/assets/llm-icons/azure-color.svg?url' @@ -119,6 +120,7 @@ const icons = { qwen: qwenColorIcon, moonshot: moonshotColorIcon, openrouter: openrouterColorIcon, + poe: poeColorIcon, gemini: geminiColorIcon, github: githubColorIcon, anthropic: claudeColorIcon,