diff --git a/src/main/presenter/agentRuntimePresenter/index.ts b/src/main/presenter/agentRuntimePresenter/index.ts index ac7198b10..73dc22488 100644 --- a/src/main/presenter/agentRuntimePresenter/index.ts +++ b/src/main/presenter/agentRuntimePresenter/index.ts @@ -58,6 +58,7 @@ import { supportsOpenAIImageGenerationSettings } from '@shared/imageGenerationSettings' import { isDeepSeekSeriesModelId } from '@shared/model' +import { isTtsModelConfig, isTtsModelId } from '@shared/ttsSettings' import { nanoid } from 'nanoid' import type { SQLitePresenter } from '../sqlitePresenter' import { eventBus, SendTarget } from '@/eventbus' @@ -1963,6 +1964,9 @@ export class AgentRuntimePresenter implements IAgentImplementation { try { let providerMessages = injectedMessages let providerMaxTokens = requestMaxTokens + const isTtsRequest = + isTtsModelConfig(requestModelConfig) || isTtsModelId(requestModelId) + const effectiveRequestTools: MCPToolDefinition[] = isTtsRequest ? [] : requestTools if (!bypassContextBudget) { const protectedSteerTailCount = @@ -1971,7 +1975,7 @@ export class AgentRuntimePresenter implements IAgentImplementation { : 0 let requestPreflight = preflightRequestContext({ messages: injectedMessages, - tools: requestTools, + tools: effectiveRequestTools, contextLength: requestModelConfig.contextLength, requestedMaxTokens: requestMaxTokens, minimumProtectedTailCount: protectedSteerTailCount @@ -1988,7 +1992,7 @@ export class AgentRuntimePresenter implements IAgentImplementation { baseSystemPrompt, contextLength: requestModelConfig.contextLength, requestedMaxTokens: requestPreflight.requestedMaxTokens, - tools: requestTools, + tools: effectiveRequestTools, supportsVision, supportsAudioInput, interleavedReasoning, @@ -2001,7 +2005,7 @@ export class AgentRuntimePresenter implements IAgentImplementation { } requestPreflight = preflightRequestContext({ messages: requestMessages, - tools: requestTools, + tools: effectiveRequestTools, contextLength: requestModelConfig.contextLength, requestedMaxTokens: requestMaxTokens, minimumProtectedTailCount: protectedSteerTailCount @@ -2041,7 +2045,7 @@ export class AgentRuntimePresenter implements IAgentImplementation { requestModelConfig, requestTemperature, providerMaxTokens, - requestTools + effectiveRequestTools )) { if (!didConsumeSteerBatch && claimedSteerBatch.length > 0) { pendingInputCoordinator.consumeClaimedSteerBatch(sessionId) diff --git a/src/main/presenter/llmProviderPresenter/aiSdk/runtime.ts b/src/main/presenter/llmProviderPresenter/aiSdk/runtime.ts index 84d7ce9e3..8ae3b368c 100644 --- a/src/main/presenter/llmProviderPresenter/aiSdk/runtime.ts +++ b/src/main/presenter/llmProviderPresenter/aiSdk/runtime.ts @@ -32,6 +32,8 @@ import type { LLMCoreStreamEvent } from '@shared/types/core/llm-events' import { mcpToolsToAISDKTools } from './toolMapper' import { mapMessagesToModelMessages } from './messageMapper' import { buildProviderOptions } from './providerOptionsMapper' +import { ProxyAgent } from 'undici' +import { proxyConfig } from '../../proxyConfig' import { type AiSdkProviderKind, createAiSdkProviderContext } from './providerFactory' import { adaptAiSdkStream } from './streamAdapter' @@ -228,9 +230,11 @@ async function executeTtsPatternA( const controller = new AbortController() const timeoutId = timeout ? setTimeout(() => controller.abort(), timeout) : undefined + const proxyUrl = proxyConfig.getProxyUrl() + const dispatcher = proxyUrl ? new ProxyAgent(proxyUrl) : undefined try { - const response = await fetch(url, { + const fetchInit: RequestInit & { dispatcher?: ProxyAgent } = { method: 'POST', headers: { ...defaultHeaders, @@ -239,7 +243,9 @@ async function executeTtsPatternA( }, body: JSON.stringify(body), signal: controller.signal - }) + } + if (dispatcher) fetchInit.dispatcher = dispatcher + const response = await fetch(url, fetchInit) if (!response.ok) { const errText = await response.text().catch(() => '') @@ -283,9 +289,11 @@ async function executeTtsPatternB( const controller = new AbortController() const timeoutId = timeout ? setTimeout(() => controller.abort(), timeout) : undefined + const proxyUrl = proxyConfig.getProxyUrl() + const dispatcher = proxyUrl ? new ProxyAgent(proxyUrl) : undefined try { - const response = await fetch(url, { + const fetchInit: RequestInit & { dispatcher?: ProxyAgent } = { method: 'POST', headers: { ...defaultHeaders, @@ -294,7 +302,9 @@ async function executeTtsPatternB( }, body: JSON.stringify(body), signal: controller.signal - }) + } + if (dispatcher) fetchInit.dispatcher = dispatcher + const response = await fetch(url, fetchInit) if (!response.ok) { const errText = await response.text().catch(() => '') diff --git a/src/renderer/settings/components/ProviderModelList.vue b/src/renderer/settings/components/ProviderModelList.vue index c970888d8..d4b45ff76 100644 --- a/src/renderer/settings/components/ProviderModelList.vue +++ b/src/renderer/settings/components/ProviderModelList.vue @@ -453,7 +453,7 @@ const hasModelCapability = (model: RENDERER_MODEL_META, capability: ModelCapabil const getModelTypeLabel = (type: ModelType) => { if (type === ModelType.TTS) { - return t('settings.provider.voiceai.title') + return t('settings.provider.tts.title') } return t(`model.filter.typeOptions.${type}`) } diff --git a/src/renderer/settings/components/VoiceAIProviderConfig.vue b/src/renderer/settings/components/VoiceAIProviderConfig.vue index 8cdb2a3a8..6483142c3 100644 --- a/src/renderer/settings/components/VoiceAIProviderConfig.vue +++ b/src/renderer/settings/components/VoiceAIProviderConfig.vue @@ -6,9 +6,9 @@
-

{{ t('settings.provider.voiceai.title') }}

+

{{ t('settings.provider.tts.title') }}

- {{ t('settings.provider.voiceai.description') }} + {{ t('settings.provider.tts.description') }}

@@ -18,11 +18,11 @@

- {{ t('settings.provider.voiceai.audioFormat.helper') }} + {{ t('settings.provider.tts.audioFormat.helper') }}

- {{ t('settings.provider.voiceai.language.helper') }} + {{ t('settings.provider.tts.language.helper') }}

- {{ t('settings.provider.voiceai.model.helper') }} + {{ t('settings.provider.tts.model.helper') }}

- {{ t('settings.provider.voiceai.agentId.helper') }} + {{ t('settings.provider.tts.agentId.helper') }}

@@ -95,7 +95,7 @@
{{ temperature.toFixed(2) }}
@@ -108,14 +108,14 @@ @update:model-value="onTemperatureChange" />

- {{ t('settings.provider.voiceai.temperature.helper') }} + {{ t('settings.provider.tts.temperature.helper') }}

{{ topP.toFixed(2) }}
@@ -128,7 +128,7 @@ @update:model-value="onTopPChange" />

- {{ t('settings.provider.voiceai.topP.helper') }} + {{ t('settings.provider.tts.topP.helper') }}

diff --git a/src/renderer/src/components/chat/ChatStatusBar.vue b/src/renderer/src/components/chat/ChatStatusBar.vue index dc79db218..8d7612cc0 100644 --- a/src/renderer/src/components/chat/ChatStatusBar.vue +++ b/src/renderer/src/components/chat/ChatStatusBar.vue @@ -103,12 +103,6 @@ :is-dark="themeStore.isDark" /> {{ displayModelText }} - (null) -const capabilitySupportsAudioInput = ref(null) const capabilityReasoningPortrait = ref(null) const capabilitySupportsTemperature = ref(null) const capabilityProviderId = ref('') @@ -2103,7 +2096,6 @@ const fetchCapabilities = async (providerId: string, modelId: string): Promise { localSettings.value = null loadedSettingsSelection.value = null capabilityProviderId.value = '' - capabilitySupportsAudioInput.value = null capabilitySupportsReasoning.value = null capabilityReasoningPortrait.value = null return @@ -2251,7 +2241,6 @@ const syncGenerationSettings = async () => { localSettings.value = null loadedSettingsSelection.value = null capabilityProviderId.value = '' - capabilitySupportsAudioInput.value = null capabilityReasoningPortrait.value = null capabilitySupportsReasoning.value = null return diff --git a/src/renderer/src/components/settings/ModelConfigDialog.vue b/src/renderer/src/components/settings/ModelConfigDialog.vue index d87fdc3b0..71eaed14f 100644 --- a/src/renderer/src/components/settings/ModelConfigDialog.vue +++ b/src/renderer/src/components/settings/ModelConfigDialog.vue @@ -177,7 +177,7 @@ {{ t('settings.model.modelConfig.type.options.imageGeneration') }} - {{ t('settings.provider.voiceai.title') }} + {{ t('settings.provider.tts.title') }} @@ -241,7 +241,7 @@ {{ t('settings.model.modelConfig.apiEndpoint.options.image') }} - {{ t('settings.provider.voiceai.title') }} + {{ t('settings.provider.tts.title') }} diff --git a/src/renderer/src/components/settings/TtsSettingsFields.vue b/src/renderer/src/components/settings/TtsSettingsFields.vue index 8a7a40204..93144525d 100644 --- a/src/renderer/src/components/settings/TtsSettingsFields.vue +++ b/src/renderer/src/components/settings/TtsSettingsFields.vue @@ -1,29 +1,29 @@