{"record":{"id":"f2466332dc73101f","repo":"spring-projects/spring-ai","slug":"query-translation-result-is-null-empty-returning","errorCode":null,"errorMessage":"Query translation result is null/empty. Returning the input query unchanged.","messagePattern":"Query translation result is null/empty\\. Returning the input query unchanged\\.","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"spring-ai-rag/src/main/java/org/springframework/ai/rag/preretrieval/query/transformation/TranslationQueryTransformer.java","lineNumber":99,"sourceCode":"\t}\n\n\t@Override\n\tpublic Query transform(Query query) {\n\t\tAssert.notNull(query, \"query cannot be null\");\n\n\t\tif (logger.isDebugEnabled()) {\n\t\t\tlogger.debug(\"Translating query to target language: \" + this.targetLanguage);\n\t\t}\n\n\t\tvar translatedQueryText = this.chatClient.prompt()\n\t\t\t.user(user -> user.text(this.promptTemplate.getTemplate())\n\t\t\t\t.param(\"targetLanguage\", this.targetLanguage)\n\t\t\t\t.param(\"query\", query.text()))\n\t\t\t.call()\n\t\t\t.content();\n\n\t\tif (!StringUtils.hasText(translatedQueryText)) {\n\t\t\tlogger.warn(\"Query translation result is null/empty. Returning the input query unchanged.\");\n\t\t\treturn query;\n\t\t}\n\n\t\treturn query.mutate().text(translatedQueryText).build();\n\t}\n\n\tpublic static Builder builder() {\n\t\treturn new Builder();\n\t}\n\n\tpublic static final class Builder {\n\n\t\tprivate ChatClient.@Nullable Builder chatClientBuilder;\n\n\t\tprivate @Nullable PromptTemplate promptTemplate;\n\n\t\tprivate @Nullable String targetLanguage;\n","sourceCodeStart":81,"sourceCodeEnd":117,"githubUrl":"https://github.com/spring-projects/spring-ai/blob/98a7beda4f29d80a71c5837eb4053b03a93a46f7/spring-ai-rag/src/main/java/org/springframework/ai/rag/preretrieval/query/transformation/TranslationQueryTransformer.java#L81-L117","documentation":"TranslationQueryTransformer asks a ChatModel to translate the query into a target language. If the model returns null or blank text, the transformer logs this warning and falls back to the original untranslated query so retrieval still proceeds. It signals the translation step silently failed.","triggerScenarios":"Calling transform(Query) with a targetLanguage whose model call yields null/blank content — e.g. unsupported target language confuses the model, content filter blocks the response, empty completion, or provider returns no content.","commonSituations":"Translating into less common languages with weak models; content filters (Azure OpenAI) emptying the response; maxTokens too low; provider outage; asking a model that only answers in the source language so it outputs nothing meaningful — or the model echoing, which is handled elsewhere.","solutions":["Verify the ChatModel actually returns content for this language; test the prompt manually outside the transformer.","Use a model with solid multilingual capability for the targetLanguage.","Increase maxTokens / adjust the translation prompt to forbid empty output or meta commentary.","Accept the fallback — the original query is returned, but expect degraded retrieval quality in the target language."],"exampleFix":"// before\nQueryTransformer t = TranslationQueryTransformer.builder()\n    .chatClientBuilder(clientBuilder)\n    .targetLanguage(\"xx\") // obscure/unsupported language\n    .build();\n// after\nQueryTransformer t = TranslationQueryTransformer.builder()\n    .chatClientBuilder(multilingualModelClientBuilder)\n    .targetLanguage(\"fr\")\n    .build();","handlingStrategy":"validation","validationCode":"if (query != null && StringUtils.hasText(query.text()) && targetLanguage != null && !targetLanguage.isBlank()) {\n    // proceed with translation; empty results fall back to original query\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Pick models with proven multilingual output for your target languages.","Write translation prompts that forbid empty or meta responses.","Smoke-test each targetLanguage against the model before rollout.","Beware content filters emptying responses on certain inputs."],"tags":["rag","translation","empty-response","graceful-degradation"],"backgroundTag":"empty-api-response","analyzedSha":"98a7beda4f29d80a71c5837eb4053b03a93a46f7","analyzedAt":"2026-09-11T14:15:49.441Z","contentChangedAt":"2026-09-11T14:15:49.441Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}