alibaba/spring-ai-alibaba · error · ResponseStatusException

Error deleting thread

Error message

Error deleting thread

What it means

Thrown by ThreadController.deleteThread when any exception escapes the deletion of a thread via threadService.deleteThread(...).block(). The controller converts the raw exception into a Spring ResponseStatusException with HTTP 500 and body "Error deleting thread", so the client only sees a generic server error while the root cause is logged server-side. It is a catch-all wrapper, not a domain-specific failure.

Source

Thrown at spring-ai-alibaba-studio/src/main/java/com/alibaba/cloud/ai/agent/studio/controller/ThreadController.java:290

	 * @return A ResponseEntity with status NO_CONTENT on success.
	 * @throws ResponseStatusException if deletion fails (INTERNAL_SERVER_ERROR).
	 */
	@DeleteMapping("/apps/{appName}/users/{userId}/threads/{threadId}")
	public ResponseEntity<Void> deleteThread(
			@PathVariable String appName, @PathVariable String userId, @PathVariable String threadId) {
		log.info(
				"Request received for DELETE /apps/{}/users/{}/threads/{}", appName, userId, threadId);
		try {

			threadService.deleteThread(appName, userId, threadId).block();
			log.info("Thread deleted successfully: {}", threadId);
			return ResponseEntity.noContent().build();
		}
		catch (Exception e) {

			log.error("Error deleting thread {}", threadId, e);

			throw new ResponseStatusException(
					HttpStatus.INTERNAL_SERVER_ERROR, "Error deleting thread", e);
		}
	}
}

View on GitHub (pinned to f82da0b50f)

Solutions

  1. Check the server log line 'Error deleting thread <threadId>' for the root-cause stack trace; the HTTP 500 body hides the real cause.
  2. Verify the checkpoint/saver backend (DB, Redis, file) is reachable and its connection config (URL, credentials) is correct.
  3. Confirm the threadId actually exists for the given appName/userId (GET the thread list first) before deleting.
  4. If using a custom ThreadService/saver, ensure deleteThread() does not throw on missing records and completes its Mono normally.
  5. Retry the DELETE once the backend recovers; the failure is often transient infrastructure unavailability.

Example fix

// before: service errors bubble into generic 500
catch (Exception e) {
    throw new ResponseStatusException(HttpStatus.INTERNAL_SERVER_ERROR, "Error deleting thread", e);
}

// after: caller checks existence first and handles empty/missing gracefully
if (threadService.getThread(appName, userId, threadId).block() == null) {
    return ResponseEntity.notFound().build(); // avoid exception path for missing threads
}
threadService.deleteThread(appName, userId, threadId).block();
Defensive patterns

Strategy: try-catch

Validate before calling

boolean exists = threadService.getThread(appName, userId, threadId).blockOptional().isPresent();
if (!exists) { throw new IllegalArgumentException("Thread not found: " + threadId); }

Try / catch

try {
    threadService.deleteThread(appName, userId, threadId).block();
} catch (ResponseStatusException e) {
    // inspect e.getCause() for the root persistence error; check saver backend health
} catch (Exception e) {
    // log and surface a friendly message; retry after backend recovery
}

Prevention

When it happens

Trigger: DELETE /apps/{appName}/users/{userId}/threads/{threadId} where threadService.deleteThread(...) fails: backing checkpoint/saver store unavailable, reactive pipeline errors (returned via .block()), unknown app/user/thread combination that the service rejects with an exception, or serialization/persistence errors while removing thread state.

Common situations: Database/Redis/file checkpoint saver is down or misconfigured (bad connection URL, missing credentials); deleting a thread that was already removed or belongs to another app/user; reactive blocking call failing because the underlying Mono errors (e.g., reactive chain throwing on empty or subscription failure).

Understand the failure class

Background: "API error: {status}" and "HTTP 401/403/404/429/5xx" errors: non-2xx HTTP responses explained — this error's family across 27 libraries.

Related errors


AI-assisted analysis of alibaba/spring-ai-alibaba@f82da0b50f (2026-09-09). Data as JSON: /api/errors/153a81ae14762e17. Report an issue: GitHub.