Using Quarkus Fault Tolerance with AI Services

Quarkus Fault Tolerance helps you make your AI service interactions more robust and resilient to failure. This is particularly useful when working with external model providers that may be unavailable or experience latency.

To enable fault tolerance for AI services, follow these steps:

  • Add the quarkus-smallrye-fault-tolerance extension to your project:

<dependency>
    <groupId>io.quarkus</groupId>
    <artifactId>quarkus-smallrye-fault-tolerance</artifactId>
</dependency>
  • Use fault tolerance annotations such as @Fallback, @Timeout, or @Retry on your AI service methods:

package io.quarkiverse.langchain4j.samples;

import java.time.temporal.ChronoUnit;

import org.eclipse.microprofile.faulttolerance.Fallback;
import org.eclipse.microprofile.faulttolerance.Timeout;

import dev.langchain4j.service.SystemMessage;
import dev.langchain4j.service.UserMessage;
import io.quarkiverse.langchain4j.RegisterAiService;

@RegisterAiService
public interface AiServiceWithFaultTolerance {

    @SystemMessage("You are a professional poet")
    @UserMessage("Write a poem about {topic}. The poem should be {lines} lines long.")
    @Timeout(value = 60, unit = ChronoUnit.SECONDS)
    @Fallback(fallbackMethod = "fallback")
    String writeAPoem(String topic, int lines);

    default String fallback(String topic, int lines) {
        return "I'm sorry, I can't write a poem about " + topic;
    }
}

Understanding the Annotations

  • @Fallback: provides an alternative response if the AI interaction fails

  • @Timeout: limits how long the LLM call is allowed to run

  • @Retry: automatically retries the call in case of transient failure

Use @Timeout carefully when using tools or multi-step function calls, as those may require more time to complete due to multiple background interactions with your application’s tools or services.

Example: Handling Disabled Integrations

If model integrations are disabled (e.g. via quarkus.langchain4j.openai.enable-integration=false), calling the AI service will throw a ModelDisabledException. You can use @Fallback to gracefully recover:

package io.quarkiverse.langchain4j.samples;

import org.eclipse.microprofile.faulttolerance.Fallback;

import dev.langchain4j.model.ModelDisabledException;
import dev.langchain4j.service.SystemMessage;
import dev.langchain4j.service.UserMessage;
import io.quarkiverse.langchain4j.RegisterAiService;

@RegisterAiService
public interface AiServiceWithFaultToleranceOnlyOnDisabledIntegration {
    @SystemMessage("You are a professional poet")
    @UserMessage("Write a poem about {topic}. The poem should be {lines} lines long.")
    @Fallback(fallbackMethod = "fallback", applyOn = ModelDisabledException.class)
    String writeAPoem(String topic, int lines);

    // In this case, the fallback is only applied if a ModelDisabledException is thrown
    default String fallback(String topic, int lines) {
        return "I'm sorry, I can't write a poem about " + topic;
    }
}