From b8c2dc8fdac7a4d8d6f0d54e912cba1943aef5b5 Mon Sep 17 00:00:00 2001 From: culpen0 Date: Sat, 18 Oct 2025 21:14:42 -0400 Subject: [PATCH 1/3] feat: add Poe provider integration and icon support --- .../presenter/configPresenter/providers.ts | 15 ++++++++++ .../presenter/llmProviderPresenter/index.ts | 5 ++++ .../providers/poeProvider.ts | 29 +++++++++++++++++++ .../src/components/icons/ModelIcon.vue | 2 ++ 4 files changed, 51 insertions(+) create mode 100644 src/main/presenter/llmProviderPresenter/providers/poeProvider.ts 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..de0f95d17 --- /dev/null +++ b/src/main/presenter/llmProviderPresenter/providers/poeProvider.ts @@ -0,0 +1,29 @@ +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, From 18894ac9477ea13939acf003d81434c71ec8267f Mon Sep 17 00:00:00 2001 From: zerob13 Date: Sun, 19 Oct 2025 18:55:56 +0800 Subject: [PATCH 2/3] chore: format and lint --- .../presenter/llmProviderPresenter/providers/poeProvider.ts | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/main/presenter/llmProviderPresenter/providers/poeProvider.ts b/src/main/presenter/llmProviderPresenter/providers/poeProvider.ts index de0f95d17..9eca00ef5 100644 --- a/src/main/presenter/llmProviderPresenter/providers/poeProvider.ts +++ b/src/main/presenter/llmProviderPresenter/providers/poeProvider.ts @@ -1,8 +1,4 @@ -import { - LLM_PROVIDER, - MODEL_META, - IConfigPresenter -} from '@shared/presenter' +import { LLM_PROVIDER, MODEL_META, IConfigPresenter } from '@shared/presenter' import { OpenAICompatibleProvider } from './openAICompatibleProvider' /** From 6151909b001da65641d97f2055253299373788e0 Mon Sep 17 00:00:00 2001 From: culpen0 Date: Sun, 19 Oct 2025 16:54:51 -0400 Subject: [PATCH 3/3] feat(settings): add code font size customization options --- .../settings/components/DisplaySettings.vue | 31 +++++++++++++++++++ src/renderer/src/App.vue | 4 +++ src/renderer/src/assets/style.css | 10 ++++++ src/renderer/src/components/ChatInput.vue | 2 +- .../src/composables/useCodeFontSize.ts | 25 +++++++++++++++ src/renderer/src/i18n/en-US/settings.json | 1 + src/renderer/src/i18n/zh-CN/settings.json | 1 + src/renderer/src/stores/settings.ts | 30 ++++++++++++++++++ 8 files changed, 103 insertions(+), 1 deletion(-) create mode 100644 src/renderer/src/composables/useCodeFontSize.ts diff --git a/src/renderer/settings/components/DisplaySettings.vue b/src/renderer/settings/components/DisplaySettings.vue index cdea6c001..48dccbf08 100644 --- a/src/renderer/settings/components/DisplaySettings.vue +++ b/src/renderer/settings/components/DisplaySettings.vue @@ -212,6 +212,29 @@ + +
+ + + {{ t('settings.display.codeFontSize') }} + + + + +
+
settingsStore.updateFontSizeLevel(value) }) +// --- Code Font Size Settings --- +const codeFontSizeOptions = ['12px', '14px', '16px', '18px', '20px'] + +const codeFontSizeLevel = computed({ + get: () => settingsStore.codeFontSizeLevel, + set: (value) => settingsStore.updateCodeFontSizeLevel(value) +}) + // --- Content Protection Settings --- const contentProtectionEnabled = computed({ get: () => { diff --git a/src/renderer/src/App.vue b/src/renderer/src/App.vue index 933cbb755..094279707 100644 --- a/src/renderer/src/App.vue +++ b/src/renderer/src/App.vue @@ -18,6 +18,7 @@ import ThreadView from '@/components/ThreadView.vue' import ModelCheckDialog from '@/components/settings/ModelCheckDialog.vue' import { useModelCheckStore } from '@/stores/modelCheck' import MessageDialog from './components/ui/MessageDialog.vue' +import { useCodeFontSize } from '@/composables/useCodeFontSize' import 'vue-sonner/style.css' // vue-sonner v2 requires this import const route = useRoute() @@ -30,6 +31,9 @@ const themeStore = useThemeStore() const langStore = useLanguageStore() const modelCheckStore = useModelCheckStore() const { t } = useI18n() + +// Initialize code font size +useCodeFontSize() // Error notification queue and currently displayed error const errorQueue = ref>([]) const currentErrorId = ref(null) diff --git a/src/renderer/src/assets/style.css b/src/renderer/src/assets/style.css index c46dc5edb..0633e71f1 100644 --- a/src/renderer/src/assets/style.css +++ b/src/renderer/src/assets/style.css @@ -150,6 +150,7 @@ html { --dc-font-scale: 1; + --dc-code-font-size: 14px; } html.text-sm { @@ -979,3 +980,12 @@ font-weight: var(--text-weight); } } + +/* Code font size customization */ +.prose pre, +.prose code, +.prose pre code, +.cm-editor .cm-content, +.cm-editor .cm-line { + font-size: var(--dc-code-font-size) !important; +} diff --git a/src/renderer/src/components/ChatInput.vue b/src/renderer/src/components/ChatInput.vue index 4ac0a4899..67d6c1d4a 100644 --- a/src/renderer/src/components/ChatInput.vue +++ b/src/renderer/src/components/ChatInput.vue @@ -1,6 +1,6 @@