conductor-oss/conductor · error · RuntimeException

Failed to download from {url}

Error message

Failed to download from {url}

What it means

GeminiVertex.downloadFromUrl() catches any checked Exception (IOException, etc.) during the media URL download and wraps it with this message. RuntimeException (including error 192) is rethrown unchanged first. The original exception is preserved as the cause. This covers all transport-layer failures during media download from Gemini-provided URLs.

Source

Thrown at ai/src/main/java/org/conductoross/conductor/ai/providers/gemini/GeminiVertex.java:199

                }
            }
            builder.media(mediaList);
        }

        return builder.build();
    }

    private byte[] downloadFromUrl(String url) {
        okhttp3.Request request = new okhttp3.Request.Builder().url(url).get().build();
        try (okhttp3.Response response = httpClient.newCall(request).execute()) {
            if (response.body() == null) {
                throw new RuntimeException("Empty response downloading from " + url);
            }
            return response.body().bytes();
        } catch (RuntimeException e) {
            throw e;
        } catch (Exception e) {
            throw new RuntimeException("Failed to download from " + url, e);
        }
    }

    @Override
    public LLMResponse generateAudio(AudioGenRequest request) {
        GeminiApi.SpeechConfig speechConfig =
                new GeminiApi.SpeechConfig(
                        new GeminiApi.VoiceConfig(
                                new GeminiApi.PrebuiltVoiceConfig(request.getVoice())));
        GeminiApi.GenerationConfig genConfig =
                new GeminiApi.GenerationConfig(
                        null,
                        null,
                        null,
                        request.getMaxTokens(),
                        request.getStopWords(),
                        request.getFrequencyPenalty(),
                        null,

View on GitHub (pinned to cf7c3e4a8a)

Solutions

  1. Inspect getCause() for the specific IOException.
  2. Implement retry logic — media downloads from signed URLs are often transient-failure recoverable if the URL hasn't expired.
  3. Increase OkHttp readTimeout for video/media downloads (videos can be large).
  4. Verify network connectivity to the Google Cloud Storage / CDN domain in the URL.
Defensive patterns

Strategy: retry

Validate before calling

// Validate network reachability before download
void validateDownloadUrl(String url) {
    try {
        new java.net.URL(url).openConnection().connect();
    } catch (java.io.IOException e) {
        throw new IllegalArgumentException(
            "Cannot reach media URL: " + url, e);
    }
}

Try / catch

try {
    return vertex.downloadFromUrl(url);
} catch (RuntimeException e) {
    if (!e.getMessage().startsWith("Empty response")
            && e.getCause() instanceof java.io.IOException) {
        // Transient network error — retry with backoff
        Thread.sleep(3000);
        return vertex.downloadFromUrl(url);
    }
    throw e;
}

Prevention

When it happens

Trigger: IOException during the OkHttp GET to the Gemini-provided media URL: connection timeout, SSL handshake failure, connection reset, DNS resolution failure for the Google storage/CDN host.

Common situations: Network partition or firewall blocking Google Cloud Storage / CDN hosts. OkHttp readTimeout too short for large video files. Transient network blip during download. Proxy misconfiguration stripping or mangling the download request.

Related errors


AI-assisted analysis of conductor-oss/conductor@cf7c3e4a8a (2026-08-14). Data as JSON: /api/errors/03e7f67c5e3cd6d0. Report an issue: GitHub.