spring-projects/spring-ai · error · CachedContentException

Failed to list cached content

Error message

Failed to list cached content

What it means

GoogleGenAiCachedContentService.list() wraps any failure while paginating cached content listings (contexts.list) in a CachedContentException. The library throws this when the listing API call or response handling throws for any reason.

Solutions

  1. Inspect the chained cause for the underlying API error
  2. Do not reuse stale page tokens; restart listing from the first page
  3. Verify credentials and API quota
  4. Retry with backoff on transient network errors

Example fix

// before
CachedContentPage page = service.list(null);
// after
try {
    CachedContentPage page = service.list(null);
} catch (CachedContentException e) {
    logger.warn("listing cached content failed, restarting from first page", e);
    CachedContentPage page2 = service.list(null);
}
Defensive patterns

Strategy: retry

Try / catch

CachedContentPage page = null;
for (int attempt = 0; attempt < 3; attempt++) {
    try { page = service.list(pageToken); break; }
    catch (CachedContentException e) {
        if (attempt == 2) throw e;
        sleep(backoff(attempt));
        pageToken = null; // restart listing on repeated failure
    }
}

Prevention

When it happens

Trigger: Calling list(pageToken/pageSize) when the remote list call fails: bad page token, API/network error, or invalid credentials.

Common situations: Reusing a pageToken from a previous session after items changed or expired, revoked API credentials, or quota/network issues in environments that enumerate cached content periodically.

Related errors


AI-assisted analysis of spring-projects/spring-ai@98a7beda4f (2026-09-11). Data as JSON: /api/errors/24f951bacea8586d. Report an issue: GitHub.

Appendix: source

Thrown at models/spring-ai-google-genai/src/main/java/org/springframework/ai/google/genai/cache/GoogleGenAiCachedContentService.java:236

				contents.add(GoogleGenAiCachedContent.from(content));
				// Only get the first page worth of results
				if (contents.size() >= (pageSize != null ? pageSize : 100)) {
					break;
				}
			}

			// Note: Pager doesn't expose page tokens directly, so we can't support
			// pagination
			// in the same way. This is a limitation of the SDK.
			if (logger.isDebugEnabled()) {
				logger.debug("Listed " + contents.size() + " cached content items");
			}

			return new CachedContentPage(contents, null);
		}
		catch (Exception e) {
			logger.error("Failed to list cached content", e);
			throw new CachedContentException("Failed to list cached content", e);
		}
	}

	/**
	 * Lists all cached content without pagination.
	 * @return list of all cached content
	 */
	public List<GoogleGenAiCachedContent> listAll() {
		List<GoogleGenAiCachedContent> allContent = new ArrayList<>();
		String pageToken = null;

		do {
			CachedContentPage page = list(100, pageToken);
			allContent.addAll(page.getContents());
			pageToken = page.getNextPageToken();
		}
		while (pageToken != null);

View on GitHub (pinned to 98a7beda4f)