{"record":{"id":"489e0f90978e2e6c","repo":"spring-projects/spring-ai","slug":"no-speech-response-returned-for-request-request","errorCode":null,"errorMessage":"No speech response returned for request: + requestContext.request","messagePattern":"No speech response returned for request: \\+ requestContext\\.request","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"models/spring-ai-elevenlabs/src/main/java/org/springframework/ai/elevenlabs/ElevenLabsTextToSpeechModel.java","lineNumber":82,"sourceCode":"\t\tthis.elevenLabsApi = elevenLabsApi;\n\t\tthis.options = options;\n\t\tthis.retryTemplate = retryTemplate;\n\t}\n\n\tpublic static Builder builder() {\n\t\treturn new Builder();\n\t}\n\n\t@Override\n\tpublic TextToSpeechResponse call(TextToSpeechPrompt prompt) {\n\t\tRequestContext requestContext = prepareRequest(prompt);\n\n\t\tbyte[] audioData = RetryUtils.execute(this.retryTemplate, () -> {\n\t\t\tvar response = this.elevenLabsApi.textToSpeech(requestContext.request, requestContext.voiceId,\n\t\t\t\t\trequestContext.queryParameters);\n\t\t\tif (response.getBody() == null) {\n\t\t\t\tif (logger.isWarnEnabled()) {\n\t\t\t\t\tlogger.warn(\"No speech response returned for request: \" + requestContext.request);\n\t\t\t\t}\n\t\t\t\treturn new byte[0];\n\t\t\t}\n\t\t\treturn response.getBody();\n\t\t});\n\n\t\treturn new TextToSpeechResponse(List.of(new Speech(audioData)));\n\t}\n\n\t@Override\n\tpublic Flux<TextToSpeechResponse> stream(TextToSpeechPrompt prompt) {\n\t\tRequestContext requestContext = prepareRequest(prompt);\n\n\t\treturn RetryUtils.execute(this.retryTemplate, () -> this.elevenLabsApi\n\t\t\t.textToSpeechStream(requestContext.request, requestContext.voiceId, requestContext.queryParameters)\n\t\t\t.map(entity -> new TextToSpeechResponse(List.of(new Speech(Objects.requireNonNull(entity.getBody()))))));\n\t}\n","sourceCodeStart":64,"sourceCodeEnd":100,"githubUrl":"https://github.com/spring-projects/spring-ai/blob/98a7beda4f29d80a71c5837eb4053b03a93a46f7/models/spring-ai-elevenlabs/src/main/java/org/springframework/ai/elevenlabs/ElevenLabsTextToSpeechModel.java#L64-L100","documentation":"Warning logged by ElevenLabsTextToSpeechModel.call() inside the retry-wrapped request when the textToSpeech HTTP response has a null body. The method returns an empty byte[0] audio payload in the TextToSpeechResponse rather than throwing, so callers may silently write/play zero-length audio.","triggerScenarios":"elevenLabsApi.textToSpeech(requestContext.request, voiceId, queryParameters) returns a ResponseEntity whose getBody() is null — empty response body from ElevenLabs, or deserialization yielding null after retries.","commonSituations":"Exhausted ElevenLabs quota (Free tier limits) returning unusual empty responses; invalid or deleted voiceId; API outage or gateway stripping the body; expired/invalid API key returning an unexpected empty 2xx.","solutions":["Verify the ElevenLabs API key and remaining character quota in your account dashboard.","Confirm the voiceId passed in the request context still exists in your ElevenLabs account.","Check the raw HTTP response with an interceptor; a 4xx body may be swallowed as null by generic error handling.","Treat byte[0] speech output as failure in application code and retry or surface an error."],"exampleFix":"// before\nbyte[] audio = ttsModel.call(new TextToSpeechRequest(text, voiceId, null)).getAudio();\nFileOutputStream out = new FileOutputStream(f); // writes empty file silently\n// after\nif (audio == null || audio.length == 0) throw new IllegalStateException(\"TTS returned no audio\");","handlingStrategy":"try-catch","validationCode":"// pre-flight: verify voiceId exists and quota remains\nassert voiceId != null && !voiceId.isBlank();","typeGuard":"static boolean hasAudio(TextToSpeechResponse r) {\n    return r != null && r.getSpeech() != null && r.getSpeech().stream().anyMatch(s -> s.getAudio() != null && s.getAudio().length > 0);\n}","tryCatchPattern":"TextToSpeechResponse r = ttsModel.call(req);\nif (!hasAudio(r)) throw new IllegalStateException(\"ElevenLabs returned no audio; check quota/key/voiceId\");","preventionTips":["Monitor ElevenLabs character quota programmatically","Cache voice IDs and validate them against the voices endpoint","Never write audio bytes to disk without a length check"],"tags":["elevenlabs","text-to-speech","empty-response","audio"],"backgroundTag":"empty-response-body","analyzedSha":"98a7beda4f29d80a71c5837eb4053b03a93a46f7","analyzedAt":"2026-09-11T14:15:49.441Z","contentChangedAt":"2026-09-11T14:15:49.441Z","schemaVersion":2},"datasetVersion":"2026-09-14T11:17:12.474Z"}