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/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 @@