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') }}
- {{ 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') }}
- {{ t('settings.provider.voiceai.temperature.helper') }} + {{ t('settings.provider.tts.temperature.helper') }}
- {{ t('settings.provider.voiceai.topP.helper') }} + {{ t('settings.provider.tts.topP.helper') }}
- {{ t('settings.provider.voiceai.description') }} + {{ t('settings.provider.tts.description') }}
- {{ t('settings.provider.voiceai.temperature.helper') }} + {{ t('settings.provider.tts.temperature.helper') }}