Base starter module for the Embabel Agent Framework providing core dependencies for building agentic flows on the JVM with Spring Boot integration and GOAP-based intelligent path finding.
Complete reference for retry policies, backoff strategies, and resilience patterns.
| Property | Type | Default | Description |
|---|---|---|---|
embabel.agent.platform.models.anthropic.max-attempts | int | 10 | Maximum retry attempts |
embabel.agent.platform.models.anthropic.backoff-millis | long | 5000 | Initial backoff in milliseconds |
embabel.agent.platform.models.anthropic.backoff-multiplier | double | 5.0 | Backoff multiplier |
embabel.agent.platform.models.anthropic.backoff-max-interval | long | 180000 | Maximum backoff interval (ms) |
embabel:
agent:
platform:
models:
anthropic:
max-attempts: 10
backoff-millis: 5000
backoff-multiplier: 5.0
backoff-max-interval: 180000Backoff calculation:
Delay = min(backoff-millis * (backoff-multiplier ^ attempt), backoff-max-interval)Example retry sequence:
| Property | Type | Default | Description |
|---|---|---|---|
embabel.agent.platform.models.openai.max-attempts | int | 10 | Maximum retry attempts |
embabel.agent.platform.models.openai.backoff-millis | long | 5000 | Initial backoff in milliseconds |
embabel.agent.platform.models.openai.backoff-multiplier | double | 5.0 | Backoff multiplier |
embabel.agent.platform.models.openai.backoff-max-interval | long | 180000 | Maximum backoff interval (ms) |
embabel:
agent:
platform:
models:
openai:
max-attempts: 10
backoff-millis: 5000
backoff-multiplier: 5.0
backoff-max-interval: 180000| Property | Type | Default | Description |
|---|---|---|---|
embabel.agent.platform.ranking.max-attempts | int | 5 | Maximum ranking attempts |
embabel.agent.platform.ranking.backoff-millis | long | 100 | Initial backoff in milliseconds |
embabel.agent.platform.ranking.backoff-multiplier | double | 5.0 | Backoff multiplier |
embabel.agent.platform.ranking.backoff-max-interval | long | 180000 | Maximum backoff interval (ms) |
embabel:
agent:
platform:
ranking:
max-attempts: 5
backoff-millis: 100
backoff-multiplier: 5.0
backoff-max-interval: 180000| Property | Type | Default | Description |
|---|---|---|---|
embabel.agent.platform.llm-operations.data-binding.max-attempts | int | 10 | Maximum data binding attempts |
embabel.agent.platform.llm-operations.data-binding.fixed-backoff-millis | long | 30 | Fixed backoff in milliseconds |
embabel:
agent:
platform:
llm-operations:
data-binding:
max-attempts: 10
fixed-backoff-millis: 30Note: Data binding uses fixed backoff (not exponential).
embabel:
agent:
platform:
models:
anthropic:
max-attempts: 15
backoff-millis: 10000
backoff-multiplier: 2.0
backoff-max-interval: 300000
openai:
max-attempts: 15
backoff-millis: 10000
backoff-multiplier: 2.0
backoff-max-interval: 300000
ranking:
max-attempts: 10
backoff-millis: 200
llm-operations:
data-binding:
max-attempts: 15Use case: Production environments requiring high reliability.
Retry sequence (Anthropic/OpenAI):
embabel:
agent:
platform:
models:
anthropic:
max-attempts: 3
backoff-millis: 1000
backoff-multiplier: 2.0
backoff-max-interval: 30000
openai:
max-attempts: 3
backoff-millis: 1000
backoff-multiplier: 2.0
backoff-max-interval: 30000
ranking:
max-attempts: 2
backoff-millis: 50
llm-operations:
data-binding:
max-attempts: 5Use case: Development environments preferring fast failure feedback.
Retry sequence (Anthropic/OpenAI):
embabel:
agent:
platform:
models:
anthropic:
max-attempts: 1
backoff-millis: 0
backoff-multiplier: 1.0
backoff-max-interval: 0
openai:
max-attempts: 1
backoff-millis: 0
backoff-multiplier: 1.0
backoff-max-interval: 0
ranking:
max-attempts: 1
llm-operations:
data-binding:
max-attempts: 1Use case: Testing environments requiring immediate failures.
| Property | Type | Default | Description |
|---|---|---|---|
spring.ai.mcp.client.request-timeout | Duration | 30s | Request timeout duration |
spring:
ai:
mcp:
client:
request-timeout: 30sSupported formats:
30s - 30 seconds1m - 1 minute5m30s - 5 minutes 30 secondsPT30S - ISO-8601 durationdelay(attempt) = min(initial * (multiplier ^ attempt), maxInterval)Configuration:
backoff-millis: 1000
backoff-multiplier: 2.0
backoff-max-interval: 60000Sequence: 1s, 2s, 4s, 8s, 16s, 32s, 60s, 60s, ...
Advantages:
delay(attempt) = fixed-backoff-millisConfiguration:
fixed-backoff-millis: 30Sequence: 30ms, 30ms, 30ms, ...
Advantages:
embabel:
agent:
platform:
models:
anthropic:
max-attempts: 3
backoff-millis: 1000
backoff-multiplier: 2.0
backoff-max-interval: 30000
openai:
max-attempts: 3
backoff-millis: 1000
backoff-multiplier: 2.0
backoff-max-interval: 30000
spring:
ai:
mcp:
client:
request-timeout: 10sembabel:
agent:
platform:
models:
anthropic:
max-attempts: 15
backoff-millis: 10000
backoff-multiplier: 2.0
backoff-max-interval: 300000
openai:
max-attempts: 15
backoff-millis: 10000
backoff-multiplier: 2.0
backoff-max-interval: 300000
spring:
ai:
mcp:
client:
request-timeout: 60sActivate with:
export SPRING_PROFILES_ACTIVE=prod
# or
java -jar app.jar --spring.profiles.active=prodpublic class RetryProperties {
private int maxAttempts;
private long backoffMillis;
private double backoffMultiplier;
private long backoffMaxInterval;
// Getters and setters
}| Property | Valid Range | Notes |
|---|---|---|
max-attempts | 1 - Integer.MAX_VALUE | 1 = no retries |
backoff-millis | 0 - Long.MAX_VALUE | 0 = no delay |
backoff-multiplier | 1.0 - Double.MAX_VALUE | 1.0 = linear |
backoff-max-interval | 0 - Long.MAX_VALUE | 0 = no cap |
logging:
level:
com.embabel.agent: DEBUGExample output:
DEBUG: Attempt 1/10 failed for Anthropic API call, retrying in 5000ms
DEBUG: Attempt 2/10 failed for Anthropic API call, retrying in 25000ms
INFO: Anthropic API call succeeded on attempt 3/10import io.micrometer.core.instrument.Counter;
import io.micrometer.core.instrument.MeterRegistry;
@Component
public class RetryMetrics implements AgenticEventListener {
private final Counter retryCounter;
private final Counter failureCounter;
public RetryMetrics(MeterRegistry registry) {
this.retryCounter = Counter.builder("embabel.agent.retries")
.description("Number of retry attempts")
.register(registry);
this.failureCounter = Counter.builder("embabel.agent.failures")
.description("Number of permanent failures")
.register(registry);
}
@Override
public void onEvent(AgenticEvent event) {
if (event instanceof RetryEvent) {
retryCounter.increment();
} else if (event instanceof FailureEvent) {
failureCounter.increment();
}
}
}try {
Result result = aiService.generateResponse(prompt);
} catch (RetryExhaustedException e) {
logger.error("All retry attempts exhausted", e);
// Handle failure
}@Action
public void streamWithErrorHandling(String prompt) {
try {
streaming.stream(token -> {
try {
processToken(token);
} catch (Exception e) {
logger.error("Error processing token: {}", token, e);
}
});
} catch (StreamingException e) {
logger.error("Streaming failed", e);
}
}# Production-ready resilience configuration
spring:
ai:
mcp:
client:
request-timeout: 60s
embabel:
agent:
platform:
models:
anthropic:
max-attempts: 15
backoff-millis: 10000
backoff-multiplier: 2.0
backoff-max-interval: 300000
openai:
max-attempts: 15
backoff-millis: 10000
backoff-multiplier: 2.0
backoff-max-interval: 300000
ranking:
max-attempts: 10
backoff-millis: 200
backoff-multiplier: 5.0
backoff-max-interval: 180000
llm-operations:
data-binding:
max-attempts: 15
fixed-backoff-millis: 50
logging:
level:
com.embabel.agent: INFOtessl i tessl/maven-com-embabel-agent--embabel-agent-starter@0.3.1docs