diff --git a/packages/types/src/provider-settings.ts b/packages/types/src/provider-settings.ts index 0c5965f7ff6..f30634e5f10 100644 --- a/packages/types/src/provider-settings.ts +++ b/packages/types/src/provider-settings.ts @@ -367,6 +367,7 @@ const litellmSchema = baseProviderSettingsSchema.extend({ litellmApiKey: z.string().optional(), litellmModelId: z.string().optional(), litellmUsePromptCache: z.boolean().optional(), + litellmFlattenContent: z.boolean().optional(), }) const cerebrasSchema = apiModelIdProviderModelSchema.extend({ diff --git a/src/api/providers/__tests__/lite-llm.spec.ts b/src/api/providers/__tests__/lite-llm.spec.ts index 9f3a641cb3b..562ad119659 100644 --- a/src/api/providers/__tests__/lite-llm.spec.ts +++ b/src/api/providers/__tests__/lite-llm.spec.ts @@ -920,4 +920,206 @@ describe("LiteLLMHandler", () => { expect(id1).not.toBe(id2) }) }) + + describe("content flattening for auto_router compatibility", () => { + it("should flatten array content to string by default (when litellmFlattenContent is undefined)", async () => { + const systemPrompt = "You are a helpful assistant" + const messages: Anthropic.Messages.MessageParam[] = [ + { + role: "user", + content: [ + { type: "text", text: "Hello" }, + { type: "text", text: "World" }, + ], + }, + ] + + const mockStream = { + async *[Symbol.asyncIterator]() { + yield { + choices: [{ delta: { content: "Hi!" } }], + usage: { prompt_tokens: 10, completion_tokens: 5 }, + } + }, + } + + mockCreate.mockReturnValue({ + withResponse: vi.fn().mockResolvedValue({ data: mockStream }), + }) + + const generator = handler.createMessage(systemPrompt, messages) + for await (const _chunk of generator) { + // Consume + } + + const createCall = mockCreate.mock.calls[0][0] + const userMessage = createCall.messages.find((msg: any) => msg.role === "user") + + // Content should be flattened to a string + expect(typeof userMessage.content).toBe("string") + expect(userMessage.content).toBe("Hello\n\nWorld") + }) + + it("should flatten array content to string when litellmFlattenContent is true", async () => { + const optionsWithFlatten: ApiHandlerOptions = { + ...mockOptions, + litellmFlattenContent: true, + } + handler = new LiteLLMHandler(optionsWithFlatten) + + const systemPrompt = "You are a helpful assistant" + const messages: Anthropic.Messages.MessageParam[] = [ + { + role: "user", + content: [{ type: "text", text: "Single block" }], + }, + ] + + const mockStream = { + async *[Symbol.asyncIterator]() { + yield { + choices: [{ delta: { content: "Response" } }], + usage: { prompt_tokens: 10, completion_tokens: 5 }, + } + }, + } + + mockCreate.mockReturnValue({ + withResponse: vi.fn().mockResolvedValue({ data: mockStream }), + }) + + const generator = handler.createMessage(systemPrompt, messages) + for await (const _chunk of generator) { + // Consume + } + + const createCall = mockCreate.mock.calls[0][0] + const userMessage = createCall.messages.find((msg: any) => msg.role === "user") + + expect(typeof userMessage.content).toBe("string") + expect(userMessage.content).toBe("Single block") + }) + + it("should NOT flatten array content when litellmFlattenContent is false", async () => { + const optionsWithoutFlatten: ApiHandlerOptions = { + ...mockOptions, + litellmFlattenContent: false, + } + handler = new LiteLLMHandler(optionsWithoutFlatten) + + const systemPrompt = "You are a helpful assistant" + const messages: Anthropic.Messages.MessageParam[] = [ + { + role: "user", + content: [ + { type: "text", text: "Hello" }, + { type: "text", text: "World" }, + ], + }, + ] + + const mockStream = { + async *[Symbol.asyncIterator]() { + yield { + choices: [{ delta: { content: "Hi!" } }], + usage: { prompt_tokens: 10, completion_tokens: 5 }, + } + }, + } + + mockCreate.mockReturnValue({ + withResponse: vi.fn().mockResolvedValue({ data: mockStream }), + }) + + const generator = handler.createMessage(systemPrompt, messages) + for await (const _chunk of generator) { + // Consume + } + + const createCall = mockCreate.mock.calls[0][0] + const userMessage = createCall.messages.find((msg: any) => msg.role === "user") + + // Content should remain as array + expect(Array.isArray(userMessage.content)).toBe(true) + expect(userMessage.content).toHaveLength(2) + }) + + it("should preserve string content unchanged regardless of flatten setting", async () => { + const systemPrompt = "You are a helpful assistant" + const messages: Anthropic.Messages.MessageParam[] = [ + { + role: "user", + content: "Simple string message", + }, + ] + + const mockStream = { + async *[Symbol.asyncIterator]() { + yield { + choices: [{ delta: { content: "Response" } }], + usage: { prompt_tokens: 10, completion_tokens: 5 }, + } + }, + } + + mockCreate.mockReturnValue({ + withResponse: vi.fn().mockResolvedValue({ data: mockStream }), + }) + + const generator = handler.createMessage(systemPrompt, messages) + for await (const _chunk of generator) { + // Consume + } + + const createCall = mockCreate.mock.calls[0][0] + const userMessage = createCall.messages.find((msg: any) => msg.role === "user") + + expect(typeof userMessage.content).toBe("string") + expect(userMessage.content).toBe("Simple string message") + }) + + it("should NOT flatten array content if it contains non-text blocks (images)", async () => { + const systemPrompt = "You are a helpful assistant" + const messages: Anthropic.Messages.MessageParam[] = [ + { + role: "user", + content: [ + { type: "text", text: "Look at this image:" }, + { + type: "image", + source: { + type: "base64", + media_type: "image/png", + data: "iVBORw0KGgo=", + }, + }, + ], + }, + ] + + const mockStream = { + async *[Symbol.asyncIterator]() { + yield { + choices: [{ delta: { content: "I see..." } }], + usage: { prompt_tokens: 10, completion_tokens: 5 }, + } + }, + } + + mockCreate.mockReturnValue({ + withResponse: vi.fn().mockResolvedValue({ data: mockStream }), + }) + + const generator = handler.createMessage(systemPrompt, messages) + for await (const _chunk of generator) { + // Consume + } + + const createCall = mockCreate.mock.calls[0][0] + const userMessage = createCall.messages.find((msg: any) => msg.role === "user") + + // Content should remain as array since it contains image + expect(Array.isArray(userMessage.content)).toBe(true) + }) + }) }) diff --git a/src/api/providers/lite-llm.ts b/src/api/providers/lite-llm.ts index cf8d16a1129..a860a6e4477 100644 --- a/src/api/providers/lite-llm.ts +++ b/src/api/providers/lite-llm.ts @@ -109,6 +109,45 @@ export class LiteLLMHandler extends RouterProvider implements SingleCompletionHa }) } + /** + * Flatten array content in messages to simple string format. + * + * LiteLLM's auto_router feature passes user content to embedding models for semantic routing. + * However, embedding models expect plain strings, not arrays of content blocks. + * When Roo Code sends messages with array content like: + * {"role": "user", "content": [{"type": "text", "text": "..."}]} + * + * The auto_router fails because it passes this array directly to embeddings. + * This method flattens such content to simple strings: + * {"role": "user", "content": "..."} + * + * This is enabled by default via litellmFlattenContent option. + * Users who need multimodal content (images) can disable this. + */ + private flattenMessageContent( + messages: OpenAI.Chat.ChatCompletionMessageParam[], + ): OpenAI.Chat.ChatCompletionMessageParam[] { + return messages.map((msg) => { + // Only flatten user and system messages with array content + if ((msg.role === "user" || msg.role === "system") && Array.isArray(msg.content)) { + // Check if all content blocks are text type + const allText = msg.content.every( + (part) => typeof part === "object" && "type" in part && part.type === "text", + ) + + // Only flatten if all content is text (no images) + if (allText) { + const textParts = msg.content.map((part) => (part as { type: "text"; text: string }).text) + return { + ...msg, + content: textParts.join("\n\n"), + } + } + } + return msg + }) + } + override async *createMessage( systemPrompt: string, messages: Anthropic.Messages.MessageParam[], @@ -116,10 +155,16 @@ export class LiteLLMHandler extends RouterProvider implements SingleCompletionHa ): ApiStream { const { id: modelId, info } = await this.fetchModel() - const openAiMessages = convertToOpenAiMessages(messages, { + let openAiMessages = convertToOpenAiMessages(messages, { normalizeToolCallId: sanitizeOpenAiCallId, }) + // Flatten array content to string for compatibility with LiteLLM's auto_router + // This is enabled by default (when litellmFlattenContent is undefined or true) + if (this.options.litellmFlattenContent !== false) { + openAiMessages = this.flattenMessageContent(openAiMessages) + } + // Prepare messages with cache control if enabled and supported let systemMessage: OpenAI.Chat.ChatCompletionMessageParam let enhancedMessages: OpenAI.Chat.ChatCompletionMessageParam[] diff --git a/webview-ui/src/components/settings/providers/LiteLLM.tsx b/webview-ui/src/components/settings/providers/LiteLLM.tsx index 38ae1f3a96a..6ee65c178b1 100644 --- a/webview-ui/src/components/settings/providers/LiteLLM.tsx +++ b/webview-ui/src/components/settings/providers/LiteLLM.tsx @@ -182,6 +182,20 @@ export const LiteLLM = ({ } return null })()} + + {/* Flatten content option for auto_router compatibility */} +
+ { + setApiConfigurationField("litellmFlattenContent", e.target.checked) + }}> + {t("settings:providers.litellmFlattenContent")} + +
+ {t("settings:providers.litellmFlattenContentDescription")} +
+
) } diff --git a/webview-ui/src/i18n/locales/ca/settings.json b/webview-ui/src/i18n/locales/ca/settings.json index 85e4abadcc5..c31b307fc12 100644 --- a/webview-ui/src/i18n/locales/ca/settings.json +++ b/webview-ui/src/i18n/locales/ca/settings.json @@ -402,6 +402,8 @@ "getXaiApiKey": "Obtenir clau API de xAI", "litellmApiKey": "Clau API de LiteLLM", "litellmBaseUrl": "URL base de LiteLLM", + "litellmFlattenContent": "Aplanar contingut dels missatges", + "litellmFlattenContentDescription": "Converteix el contingut dels missatges en format matriu a cadenes de text simples. Activeu aquesta opció per a la compatibilitat amb auto_router de LiteLLM i les funcions d'encaminament basades en incrustacions. Desactiveu només si necessiteu contingut multimodal (imatges).", "awsCredentials": "Credencials d'AWS", "awsProfile": "Perfil d'AWS", "awsApiKey": "Clau d'API d'Amazon Bedrock", diff --git a/webview-ui/src/i18n/locales/de/settings.json b/webview-ui/src/i18n/locales/de/settings.json index ff7e7b3ea0c..481f65de244 100644 --- a/webview-ui/src/i18n/locales/de/settings.json +++ b/webview-ui/src/i18n/locales/de/settings.json @@ -402,6 +402,8 @@ "getXaiApiKey": "xAI API-Schlüssel erhalten", "litellmApiKey": "LiteLLM API-Schlüssel", "litellmBaseUrl": "LiteLLM Basis-URL", + "litellmFlattenContent": "Nachrichteninhalt abflachen", + "litellmFlattenContentDescription": "Konvertiert Array-formatierten Nachrichteninhalt in einfache Zeichenketten. Aktivieren Sie dies für die Kompatibilität mit LiteLLMs auto_router und Embedding-basierten Routing-Funktionen. Deaktivieren Sie es nur, wenn Sie multimodale Inhalte (Bilder) benötigen.", "awsCredentials": "AWS Anmeldedaten", "awsProfile": "AWS Profil", "awsApiKey": "Amazon Bedrock API-Schlüssel", diff --git a/webview-ui/src/i18n/locales/en/settings.json b/webview-ui/src/i18n/locales/en/settings.json index 3230c4f93f8..f11e9a61002 100644 --- a/webview-ui/src/i18n/locales/en/settings.json +++ b/webview-ui/src/i18n/locales/en/settings.json @@ -456,6 +456,8 @@ "getXaiApiKey": "Get xAI API Key", "litellmApiKey": "LiteLLM API Key", "litellmBaseUrl": "LiteLLM Base URL", + "litellmFlattenContent": "Flatten message content", + "litellmFlattenContentDescription": "Convert array-formatted message content to plain strings. Enable this for compatibility with LiteLLM's auto_router and embedding-based routing features. Disable only if you need multimodal content (images).", "awsCredentials": "AWS Credentials", "awsProfile": "AWS Profile", "awsApiKey": "Amazon Bedrock API Key", diff --git a/webview-ui/src/i18n/locales/es/settings.json b/webview-ui/src/i18n/locales/es/settings.json index d02b5d05a76..235b2f6e033 100644 --- a/webview-ui/src/i18n/locales/es/settings.json +++ b/webview-ui/src/i18n/locales/es/settings.json @@ -402,6 +402,8 @@ "getXaiApiKey": "Obtener clave API de xAI", "litellmApiKey": "Clave API de LiteLLM", "litellmBaseUrl": "URL base de LiteLLM", + "litellmFlattenContent": "Aplanar contenido del mensaje", + "litellmFlattenContentDescription": "Convierte el contenido del mensaje en formato de matriz a cadenas de texto simples. Habilite esto para compatibilidad con auto_router de LiteLLM y funciones de enrutamiento basadas en embeddings. Deshabilite solo si necesita contenido multimodal (imágenes).", "awsCredentials": "Credenciales de AWS", "awsProfile": "Perfil de AWS", "awsApiKey": "Clave de API de Amazon Bedrock", diff --git a/webview-ui/src/i18n/locales/fr/settings.json b/webview-ui/src/i18n/locales/fr/settings.json index d86c1652bc2..e6a5183fd0d 100644 --- a/webview-ui/src/i18n/locales/fr/settings.json +++ b/webview-ui/src/i18n/locales/fr/settings.json @@ -402,6 +402,8 @@ "getXaiApiKey": "Obtenir la clé API xAI", "litellmApiKey": "Clé API LiteLLM", "litellmBaseUrl": "URL de base LiteLLM", + "litellmFlattenContent": "Aplatir le contenu des messages", + "litellmFlattenContentDescription": "Convertit le contenu des messages au format tableau en chaînes de caractères simples. Activez cette option pour la compatibilité avec auto_router de LiteLLM et les fonctionnalités de routage basées sur les embeddings. Désactivez uniquement si vous avez besoin de contenu multimodal (images).", "awsCredentials": "Identifiants AWS", "awsProfile": "Profil AWS", "awsApiKey": "Clé API Amazon Bedrock", diff --git a/webview-ui/src/i18n/locales/hi/settings.json b/webview-ui/src/i18n/locales/hi/settings.json index 6200d228499..7014ad98f41 100644 --- a/webview-ui/src/i18n/locales/hi/settings.json +++ b/webview-ui/src/i18n/locales/hi/settings.json @@ -402,6 +402,8 @@ "getXaiApiKey": "xAI API कुंजी प्राप्त करें", "litellmApiKey": "LiteLLM API कुंजी", "litellmBaseUrl": "LiteLLM आधार URL", + "litellmFlattenContent": "संदेश सामग्री को सपाट करें", + "litellmFlattenContentDescription": "ऐरे प्रारूप में संदेश सामग्री को सादा स्ट्रिंग में बदलें। LiteLLM के auto_router और एम्बेडिंग-आधारित रूटिंग सुविधाओं के साथ संगतता के लिए इसे सक्षम करें। केवल तभी अक्षम करें जब आपको मल्टीमॉडल सामग्री (छवियां) की आवश्यकता हो।", "awsCredentials": "AWS क्रेडेंशियल्स", "awsProfile": "AWS प्रोफाइल", "awsApiKey": "Amazon बेडरॉक API कुंजी", diff --git a/webview-ui/src/i18n/locales/id/settings.json b/webview-ui/src/i18n/locales/id/settings.json index 39e0eccb7f8..a3541eae0eb 100644 --- a/webview-ui/src/i18n/locales/id/settings.json +++ b/webview-ui/src/i18n/locales/id/settings.json @@ -406,6 +406,8 @@ "getXaiApiKey": "Dapatkan xAI API Key", "litellmApiKey": "LiteLLM API Key", "litellmBaseUrl": "LiteLLM Base URL", + "litellmFlattenContent": "Ratakan konten pesan", + "litellmFlattenContentDescription": "Mengubah konten pesan berformat array menjadi string teks biasa. Aktifkan untuk kompatibilitas dengan auto_router LiteLLM dan fitur routing berbasis embedding. Nonaktifkan hanya jika Anda memerlukan konten multimodal (gambar).", "awsCredentials": "AWS Credentials", "awsProfile": "AWS Profile", "awsApiKey": "Kunci API Amazon Bedrock", diff --git a/webview-ui/src/i18n/locales/it/settings.json b/webview-ui/src/i18n/locales/it/settings.json index 74c3da5757d..0dfbcd9f489 100644 --- a/webview-ui/src/i18n/locales/it/settings.json +++ b/webview-ui/src/i18n/locales/it/settings.json @@ -402,6 +402,8 @@ "getXaiApiKey": "Ottieni chiave API xAI", "litellmApiKey": "Chiave API LiteLLM", "litellmBaseUrl": "URL base LiteLLM", + "litellmFlattenContent": "Appiattisci contenuto messaggi", + "litellmFlattenContentDescription": "Converte il contenuto dei messaggi in formato array in stringhe semplici. Abilita questa opzione per la compatibilità con auto_router di LiteLLM e le funzionalità di routing basate su embedding. Disabilita solo se hai bisogno di contenuti multimodali (immagini).", "awsCredentials": "Credenziali AWS", "awsProfile": "Profilo AWS", "awsApiKey": "Chiave API Amazon Bedrock", diff --git a/webview-ui/src/i18n/locales/ja/settings.json b/webview-ui/src/i18n/locales/ja/settings.json index ae98a2b01b1..c0d809c6f87 100644 --- a/webview-ui/src/i18n/locales/ja/settings.json +++ b/webview-ui/src/i18n/locales/ja/settings.json @@ -402,6 +402,8 @@ "getXaiApiKey": "xAI APIキーを取得", "litellmApiKey": "LiteLLM APIキー", "litellmBaseUrl": "LiteLLM ベースURL", + "litellmFlattenContent": "メッセージコンテンツをフラット化", + "litellmFlattenContentDescription": "配列形式のメッセージコンテンツをプレーンな文字列に変換します。LiteLLMのauto_routerおよび埋め込みベースのルーティング機能との互換性のために有効にしてください。マルチモーダルコンテンツ(画像)が必要な場合のみ無効にしてください。", "awsCredentials": "AWS認証情報", "awsProfile": "AWSプロファイル", "awsApiKey": "Amazon Bedrock APIキー", diff --git a/webview-ui/src/i18n/locales/ko/settings.json b/webview-ui/src/i18n/locales/ko/settings.json index db6ba45dbc5..b655c1a2ba0 100644 --- a/webview-ui/src/i18n/locales/ko/settings.json +++ b/webview-ui/src/i18n/locales/ko/settings.json @@ -402,6 +402,8 @@ "getXaiApiKey": "xAI API 키 받기", "litellmApiKey": "LiteLLM API 키", "litellmBaseUrl": "LiteLLM 기본 URL", + "litellmFlattenContent": "메시지 콘텐츠 평탄화", + "litellmFlattenContentDescription": "배열 형식의 메시지 콘텐츠를 일반 문자열로 변환합니다. LiteLLM의 auto_router 및 임베딩 기반 라우팅 기능과의 호환성을 위해 활성화하세요. 멀티모달 콘텐츠(이미지)가 필요한 경우에만 비활성화하세요.", "awsCredentials": "AWS 자격 증명", "awsProfile": "AWS 프로필", "awsApiKey": "Amazon Bedrock API 키", diff --git a/webview-ui/src/i18n/locales/nl/settings.json b/webview-ui/src/i18n/locales/nl/settings.json index 49d02217db2..b7b8f2c4190 100644 --- a/webview-ui/src/i18n/locales/nl/settings.json +++ b/webview-ui/src/i18n/locales/nl/settings.json @@ -402,6 +402,8 @@ "getXaiApiKey": "xAI API-sleutel ophalen", "litellmApiKey": "LiteLLM API-sleutel", "litellmBaseUrl": "LiteLLM basis-URL", + "litellmFlattenContent": "Berichtinhoud afvlakken", + "litellmFlattenContentDescription": "Converteert berichtinhoud in array-formaat naar platte tekst. Schakel dit in voor compatibiliteit met LiteLLM's auto_router en op embedding gebaseerde routeringsfuncties. Schakel alleen uit als u multimodale inhoud (afbeeldingen) nodig heeft.", "awsCredentials": "AWS-inloggegevens", "awsProfile": "AWS-profiel", "awsApiKey": "Amazon Bedrock API-sleutel", diff --git a/webview-ui/src/i18n/locales/pl/settings.json b/webview-ui/src/i18n/locales/pl/settings.json index a20c9f56e14..337b73b47e0 100644 --- a/webview-ui/src/i18n/locales/pl/settings.json +++ b/webview-ui/src/i18n/locales/pl/settings.json @@ -402,6 +402,8 @@ "getXaiApiKey": "Uzyskaj klucz API xAI", "litellmApiKey": "Klucz API LiteLLM", "litellmBaseUrl": "URL bazowy LiteLLM", + "litellmFlattenContent": "Spłaszcz zawartość wiadomości", + "litellmFlattenContentDescription": "Konwertuje zawartość wiadomości w formacie tablicy na zwykłe ciągi znaków. Włącz dla kompatybilności z auto_router LiteLLM i funkcjami routingu opartymi na osadzeniach. Wyłącz tylko jeśli potrzebujesz treści multimodalnych (obrazów).", "awsCredentials": "Poświadczenia AWS", "awsProfile": "Profil AWS", "awsApiKey": "Klucz API Amazon Bedrock", diff --git a/webview-ui/src/i18n/locales/pt-BR/settings.json b/webview-ui/src/i18n/locales/pt-BR/settings.json index e96cbb0e743..2f78b0bdd90 100644 --- a/webview-ui/src/i18n/locales/pt-BR/settings.json +++ b/webview-ui/src/i18n/locales/pt-BR/settings.json @@ -402,6 +402,8 @@ "getXaiApiKey": "Obter chave de API xAI", "litellmApiKey": "Chave API LiteLLM", "litellmBaseUrl": "URL base LiteLLM", + "litellmFlattenContent": "Achatar conteúdo das mensagens", + "litellmFlattenContentDescription": "Converte o conteúdo das mensagens em formato de array para strings simples. Habilite para compatibilidade com o auto_router do LiteLLM e recursos de roteamento baseados em embeddings. Desabilite apenas se precisar de conteúdo multimodal (imagens).", "awsCredentials": "Credenciais AWS", "awsProfile": "Perfil AWS", "awsApiKey": "Chave de API Amazon Bedrock", diff --git a/webview-ui/src/i18n/locales/ru/settings.json b/webview-ui/src/i18n/locales/ru/settings.json index a746f1e29ae..cd8eb952174 100644 --- a/webview-ui/src/i18n/locales/ru/settings.json +++ b/webview-ui/src/i18n/locales/ru/settings.json @@ -402,6 +402,8 @@ "getXaiApiKey": "Получить xAI API-ключ", "litellmApiKey": "API-ключ LiteLLM", "litellmBaseUrl": "Базовый URL LiteLLM", + "litellmFlattenContent": "Выровнять содержимое сообщений", + "litellmFlattenContentDescription": "Преобразует содержимое сообщений в формате массива в простые строки. Включите для совместимости с auto_router LiteLLM и функциями маршрутизации на основе эмбеддингов. Отключайте только при необходимости мультимодального контента (изображений).", "awsCredentials": "AWS-учётные данные", "awsProfile": "Профиль AWS", "awsApiKey": "Ключ API Amazon Bedrock", diff --git a/webview-ui/src/i18n/locales/tr/settings.json b/webview-ui/src/i18n/locales/tr/settings.json index cbbbb673cc2..8d67b044e33 100644 --- a/webview-ui/src/i18n/locales/tr/settings.json +++ b/webview-ui/src/i18n/locales/tr/settings.json @@ -402,6 +402,8 @@ "getXaiApiKey": "xAI API Anahtarı Al", "litellmApiKey": "LiteLLM API Anahtarı", "litellmBaseUrl": "LiteLLM Temel URL", + "litellmFlattenContent": "Mesaj içeriğini düzleştir", + "litellmFlattenContentDescription": "Dizi formatındaki mesaj içeriğini düz metin dizelerine dönüştürür. LiteLLM'in auto_router ve gömme tabanlı yönlendirme özellikleriyle uyumluluk için etkinleştirin. Yalnızca çok modlu içeriğe (görüntüler) ihtiyacınız varsa devre dışı bırakın.", "awsCredentials": "AWS Kimlik Bilgileri", "awsProfile": "AWS Profili", "awsApiKey": "Amazon Bedrock API Anahtarı", diff --git a/webview-ui/src/i18n/locales/vi/settings.json b/webview-ui/src/i18n/locales/vi/settings.json index acbbea3688e..90a0eddc62b 100644 --- a/webview-ui/src/i18n/locales/vi/settings.json +++ b/webview-ui/src/i18n/locales/vi/settings.json @@ -402,6 +402,8 @@ "getXaiApiKey": "Lấy khóa API xAI", "litellmApiKey": "Khóa API LiteLLM", "litellmBaseUrl": "URL cơ sở LiteLLM", + "litellmFlattenContent": "Làm phẳng nội dung tin nhắn", + "litellmFlattenContentDescription": "Chuyển đổi nội dung tin nhắn định dạng mảng thành chuỗi văn bản thuần. Bật tùy chọn này để tương thích với auto_router của LiteLLM và các tính năng định tuyến dựa trên embedding. Chỉ tắt nếu bạn cần nội dung đa phương thức (hình ảnh).", "awsCredentials": "Thông tin xác thực AWS", "awsProfile": "Hồ sơ AWS", "awsApiKey": "Khóa API Amazon Bedrock", diff --git a/webview-ui/src/i18n/locales/zh-CN/settings.json b/webview-ui/src/i18n/locales/zh-CN/settings.json index 57b1b7795c5..8c386495bce 100644 --- a/webview-ui/src/i18n/locales/zh-CN/settings.json +++ b/webview-ui/src/i18n/locales/zh-CN/settings.json @@ -402,6 +402,8 @@ "getXaiApiKey": "获取 xAI API 密钥", "litellmApiKey": "LiteLLM API 密钥", "litellmBaseUrl": "LiteLLM 基础 URL", + "litellmFlattenContent": "展平消息内容", + "litellmFlattenContentDescription": "将数组格式的消息内容转换为纯字符串。启用此选项以兼容 LiteLLM 的 auto_router 和基于嵌入的路由功能。仅在需要多模态内容(图像)时禁用。", "awsCredentials": "AWS 凭证", "awsProfile": "AWS 配置文件", "awsApiKey": "Amazon Bedrock API 密钥", diff --git a/webview-ui/src/i18n/locales/zh-TW/settings.json b/webview-ui/src/i18n/locales/zh-TW/settings.json index 04eb9970f23..5dee613741a 100644 --- a/webview-ui/src/i18n/locales/zh-TW/settings.json +++ b/webview-ui/src/i18n/locales/zh-TW/settings.json @@ -411,6 +411,8 @@ "getXaiApiKey": "取得 xAI API 金鑰", "litellmApiKey": "LiteLLM API 金鑰", "litellmBaseUrl": "LiteLLM 基礎 URL", + "litellmFlattenContent": "展平訊息內容", + "litellmFlattenContentDescription": "將陣列格式的訊息內容轉換為純字串。啟用此選項以相容 LiteLLM 的 auto_router 和基於嵌入的路由功能。僅在需要多模態內容(圖像)時停用。", "awsCredentials": "AWS 認證", "awsProfile": "AWS Profile", "awsApiKey": "Amazon Bedrock API 金鑰",