{"record":{"id":"ab13da37eef17ebc","repo":"spring-projects/spring-ai","slug":"no-moderation-response-returned-for-request-mis","errorCode":null,"errorMessage":"No moderation response returned for request: + mistralAiModerationRequest","messagePattern":"No moderation response returned for request: \\+ mistralAiModerationRequest","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"models/spring-ai-mistral-ai/src/main/java/org/springframework/ai/mistralai/moderation/MistralAiModerationModel.java","lineNumber":89,"sourceCode":"\tpublic ModerationResponse call(ModerationPrompt moderationPrompt) {\n\t\treturn RetryUtils.execute(this.retryTemplate, () -> {\n\t\t\tvar instructions = moderationPrompt.getInstructions().getText();\n\t\t\tvar model = ModelOptionsUtils.mergeOption(moderationPrompt.getOptions().getModel(),\n\t\t\t\t\tthis.options.getModel());\n\t\t\tvar moderationRequest = new MistralAiModerationRequest(instructions, model);\n\t\t\tvar moderationResponseEntity = this.mistralAiModerationApi.moderate(moderationRequest);\n\n\t\t\treturn convertResponse(moderationResponseEntity, moderationRequest);\n\t\t});\n\t}\n\n\tprivate ModerationResponse convertResponse(ResponseEntity<MistralAiModerationResponse> moderationResponseEntity,\n\t\t\tMistralAiModerationRequest mistralAiModerationRequest) {\n\t\tvar moderationApiResponse = moderationResponseEntity.getBody();\n\n\t\tif (moderationApiResponse == null) {\n\t\t\tif (logger.isWarnEnabled()) {\n\t\t\t\tlogger.warn(\"No moderation response returned for request: \" + mistralAiModerationRequest);\n\t\t\t}\n\t\t\treturn new ModerationResponse(null);\n\t\t}\n\n\t\tvar moderationResults = Stream.of(moderationApiResponse.results())\n\t\t\t.map(MistralAiModerationModel::convertModerationResult)\n\t\t\t.toList();\n\n\t\tvar moderation = Moderation.builder()\n\t\t\t.id(moderationApiResponse.id())\n\t\t\t.model(moderationApiResponse.model())\n\t\t\t.results(moderationResults)\n\t\t\t.build();\n\n\t\treturn new ModerationResponse(new Generation(moderation));\n\t}\n\n\tprivate static ModerationResult convertModerationResult(MistralAiModerationResult mistralAiModerationResult) {","sourceCodeStart":71,"sourceCodeEnd":107,"githubUrl":"https://github.com/spring-projects/spring-ai/blob/98a7beda4f29d80a71c5837eb4053b03a93a46f7/models/spring-ai-mistral-ai/src/main/java/org/springframework/ai/mistralai/moderation/MistralAiModerationModel.java#L71-L107","documentation":"Warning logged by MistralAiModerationModel.convertResponse() when the moderation endpoint's ResponseEntity body is null. The model returns a ModerationResponse wrapping null results instead of throwing, so callers receive a moderation result with no flags/scores — dangerous if the application treats this as 'content is safe'.","triggerScenarios":"convertResponse() receives moderationResponseEntity with getBody() == null — empty body from the Mistral moderation API after the request executed.","commonSituations":"Mistral moderation endpoint unavailable on the account/plan; API key or quota problems; incorrect baseUrl (moderation API not supported by the target endpoint); Mistral API changes breaking response shape.","solutions":["Verify your Mistral account/plan actually exposes the moderation endpoint and the model is available.","Check API key validity and inspect the raw HTTP response with an interceptor.","Treat ModerationResponse with null results as an indeterminate outcome, not as 'safe', in your content pipeline.","Confirm spring-ai-mistral-ai version compatibility with the current Mistral moderation API."],"exampleFix":"// before\nModerationResponse mr = moderationModel.call(new MistralAiModerationRequest(text));\nboolean safe = mr.getResults().isEmpty(); // wrong: null-body means indeterminate\n// after\nboolean safe = mr.getResults() != null && !mr.getResults().isEmpty()\n        && mr.getResults().get(0).isFlagged() == false;","handlingStrategy":"type-guard","validationCode":null,"typeGuard":"static boolean isIndeterminate(ModerationResponse r) {\n    return r == null || r.getResults() == null || r.getResults().isEmpty();\n}","tryCatchPattern":"ModerationResponse mr = moderationModel.call(req);\nif (isIndeterminate(mr)) {\n    throw new IllegalStateException(\"Moderation unavailable — do NOT treat as safe\");\n}","preventionTips":["Fail closed: treat null moderation results as unsafe/indeterminate","Verify your Mistral plan includes the moderation endpoint","Add integration tests asserting non-null moderation results"],"tags":["mistral","moderation","null-response","content-safety"],"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"}