{"record":{"id":"94556838d697e88b","repo":"theonedev/onedev","slug":"received-empty-response","errorCode":null,"errorMessage":"Received empty response","messagePattern":"Received empty response","errorType":"exception","errorClass":"ExplicitException","httpStatus":null,"severity":"error","filePath":"server-core/src/main/java/io/onedev/server/ai/DefaultChatService.java","lineNumber":468,"sourceCode":"\t\t\t\t\t\tif (requests.size() == 1) {\n\t\t\t\t\t\t\tvar prompt = \"Summarize below message as a compact title (only title, no comments or other text): \\n\\n\" + requests.get(0).getContent();\n\t\t\t\t\t\t\tvar title = chatModel.chat(new UserMessage(prompt)).aiMessage().text();\n\t\t\t\t\t\t\tif (StringUtils.isNotBlank(title)) {\n\t\t\t\t\t\t\t\tif (anonymous) {\n\t\t\t\t\t\t\t\t\tchat = SerializationUtils.clone(chat);\n\t\t\t\t\t\t\t\t\tchat.setTitle(title);\n\t\t\t\t\t\t\t\t\tsession.getAnonymousChats().put(chatId, chat);\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tchat.setTitle(title);\n\t\t\t\t\t\t\t\t\tdao.persist(chat);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\twebSocketService.notifyObservableChange(Chat.getChangeObservable(chatId), null);\t\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\t\t\n\t\t\t\t\tvar response = responseFuture.get(TIMEOUT_SECONDS, TimeUnit.SECONDS);\n\t\t\t\t\tif (StringUtils.isBlank(response))\n\t\t\t\t\t\tthrow new ExplicitException(\"Received empty response\");\t\t\n\t\t\t\t\tcreateResponse(response, false);\n\t\t\t\t} catch (Throwable t) {\n\t\t\t\t\tif (ExceptionUtils.find(t, InterruptedException.class) != null) {\n\t\t\t\t\t\tcreateIncompleteResponse(\"Conversation cancelled\");\n\t\t\t\t\t} else if (ExceptionUtils.find(t, TimeoutException.class) != null) {\n\t\t\t\t\t\tcreateIncompleteResponse(\"Conversation timed out\");\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvar explicitException = ExceptionUtils.find(t, ExplicitException.class);\n\t\t\t\t\t\tif (explicitException != null) {\n\t\t\t\t\t\t\tcreateResponse(explicitException.getMessage(), true);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcreateResponse(\"Error getting chat response, check server log for details\", true);\n\t\t\t\t\t\t\tlogger.error(\"Error getting chat response\", t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} finally {\n\t\t\t\t\tresponseFuture.cancel(false);\n\t\t\t\t\tvar respondingsOfSession = respondings.get(sessionId);\t\t\t\t","sourceCodeStart":450,"sourceCodeEnd":486,"githubUrl":"https://github.com/theonedev/onedev/blob/d44925c47c37992c828ea673a5f9620539bc3ff2/server-core/src/main/java/io/onedev/server/ai/DefaultChatService.java#L450-L486","documentation":"The chat runner waits for the LLM response future with a timeout; if the eventual response string is blank/whitespace, the service treats it as an unusable model output and throws this ExplicitException instead of creating an empty chat response.","triggerScenarios":"responseFuture.get(TIMEOUT_SECONDS, SECONDS) resolves but StringUtils.isBlank(response) is true — the model returned an empty completion (e.g. content filtered or empty stream).","commonSituations":"LLM provider returning empty completions due to content filters; misconfigured model endpoint returning empty bodies; prompt consisting only of tool calls with no final content; provider outage degrading responses.","solutions":["Retry the conversation — empty completions are often transient model/provider behavior","Check the configured AI provider endpoint, API key, and model name; test the provider directly","Inspect the prompt/messages sent — remove inputs that yield no content (e.g. only system instructions)","Check provider-side logs for content-filter or truncation flags on the request"],"exampleFix":"// before: response comes back blank\n// after: caller guards and retries once on empty response\ntry {\n    chatService.chat(chatId, prompt);\n} catch (ExplicitException e) {\n    if (\"Received empty response\".equals(e.getMessage())) {\n        retryWithBackoff(chatId, prompt, 1);\n    }\n}","handlingStrategy":"retry","validationCode":"// verify provider works before chatting\ndef provider_ok():\n    r = requests.post(MODEL_URL, headers=auth, json=ping_payload)\n    return r.status_code == 200 and r.text.strip() != \"\"","typeGuard":null,"tryCatchPattern":"try {\n    chatService.chat(chatId, prompt);\n} catch (ExplicitException e) {\n    if (\"Received empty response\".equals(e.getMessage())) {\n        retryWithBackoff(chatId, prompt);\n    }\n}","preventionTips":["Retry transient empty completions with backoff","Verify AI provider endpoint, key, and model configuration","Avoid prompts that can elicit no content (e.g. only tool calls)","Check provider content-filter flags when empty responses recur"],"tags":["llm","empty-response","ai-chat"],"backgroundTag":"empty-api-response","analyzedSha":"d44925c47c37992c828ea673a5f9620539bc3ff2","analyzedAt":"2026-09-06T07:18:27.995Z","contentChangedAt":"2026-09-06T07:18:27.995Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}