Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[OPIK-853] handle gemini client errors #1138

Merged
merged 3 commits into from
Feb 18, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -22,5 +22,5 @@ void generateStream(

void validateRequest(@NonNull ChatCompletionRequest request);

Optional<ErrorMessage> getLlmProviderError(@NonNull Throwable runtimeException);
Optional<ErrorMessage> getLlmProviderError(@NonNull Throwable throwable);
}
Original file line number Diff line number Diff line change
Expand Up @@ -57,8 +57,8 @@ public void validateRequest(@NonNull ChatCompletionRequest request) {
}

@Override
public Optional<ErrorMessage> getLlmProviderError(@NonNull Throwable runtimeException) {
if (runtimeException instanceof AnthropicHttpException anthropicHttpException) {
public Optional<ErrorMessage> getLlmProviderError(@NonNull Throwable throwable) {
if (throwable instanceof AnthropicHttpException anthropicHttpException) {
return Optional.of(new ErrorMessage(anthropicHttpException.statusCode(),
anthropicHttpException.getMessage()));
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.comet.opik.infrastructure.llm.gemini;

import io.dropwizard.jersey.errors.ErrorMessage;

import java.util.Optional;

public record GeminiErrorObject(GeminiError error) {
public Optional<ErrorMessage> toErrorMessage() {
if (error != null) {
return Optional.of(new ErrorMessage(error.code(), error.message(), error().status()));
}

return Optional.empty();
}
}

record GeminiError(int code, String message, String status) {
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,20 @@

import com.comet.opik.api.ChunkedResponseHandler;
import com.comet.opik.domain.llm.LlmProviderService;
import com.comet.opik.utils.JsonUtils;
import dev.ai4j.openai4j.chat.ChatCompletionRequest;
import dev.ai4j.openai4j.chat.ChatCompletionResponse;
import io.dropwizard.jersey.errors.ErrorMessage;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

import java.io.UncheckedIOException;
import java.util.Optional;
import java.util.concurrent.CompletableFuture;
import java.util.function.Consumer;

@Slf4j
@RequiredArgsConstructor
public class LlmProviderGemini implements LlmProviderService {
private final @NonNull GeminiClientGenerator llmProviderClientGenerator;
Expand Down Expand Up @@ -39,9 +43,31 @@ public void generateStream(@NonNull ChatCompletionRequest request, @NonNull Stri
public void validateRequest(@NonNull ChatCompletionRequest request) {
}

/// gemini throws RuntimeExceptions with message structure as follows:
/// ```
/// java.lang.RuntimeException: HTTP error (429): {
/// "error": {
/// "code": 429,
/// "message": "Resource has been exhausted (e.g. check quota).",
/// "status": "RESOURCE_EXHAUSTED"
/// }
/// }
/// ```
@Override
public Optional<ErrorMessage> getLlmProviderError(@NonNull Throwable runtimeException) {
public Optional<ErrorMessage> getLlmProviderError(@NonNull Throwable throwable) {
String message = throwable.getMessage();
var openBraceIndex = message.indexOf('{');
if (openBraceIndex >= 0) {
String jsonPart = message.substring(openBraceIndex); // Extract JSON part
try {
var geminiError = JsonUtils.readValue(jsonPart, GeminiErrorObject.class);
return geminiError.toErrorMessage();
} catch (UncheckedIOException e) {
log.warn("failed to parse Gemini error message", e);
return Optional.empty();
idoberko2 marked this conversation as resolved.
Show resolved Hide resolved
}
}

return Optional.empty();
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,8 @@ public void validateRequest(@NonNull ChatCompletionRequest request) {
}

@Override
public Optional<ErrorMessage> getLlmProviderError(@NonNull Throwable runtimeException) {
if (runtimeException instanceof OpenAiHttpException openAiHttpException) {
public Optional<ErrorMessage> getLlmProviderError(@NonNull Throwable throwable) {
if (throwable instanceof OpenAiHttpException openAiHttpException) {
return Optional.of(new ErrorMessage(openAiHttpException.code(), openAiHttpException.getMessage()));
}

Expand Down
Loading