CtrlK
CommunityDocumentationLog inGet started
Tessl Logo

tessl/maven-com-embabel-agent--embabel-agent-starter

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.

Overview
Eval results
Files

integration-model-providers.mddocs/

Model Providers

Type-safe LLM model identifiers and constants for various providers available through embabel-agent-api.

Importing Model Constants

Java

import com.embabel.agent.api.models.GeminiModels;
import com.embabel.agent.api.models.AnthropicModels;
import com.embabel.agent.api.models.OpenAiModels;
import com.embabel.agent.api.models.DeepSeekModels;
import com.embabel.agent.api.models.OllamaModels;
import com.embabel.agent.api.models.MistralAiModels;
import com.embabel.agent.api.models.GoogleGenAiModels;
import com.embabel.agent.api.models.LmStudioModels;
import com.embabel.agent.api.models.DockerLocalModels;

Kotlin

import com.embabel.agent.api.models.GeminiModels
import com.embabel.agent.api.models.AnthropicModels
import com.embabel.agent.api.models.OpenAiModels
import com.embabel.agent.api.models.DeepSeekModels
import com.embabel.agent.api.models.OllamaModels
import com.embabel.agent.api.models.MistralAiModels
import com.embabel.agent.api.models.GoogleGenAiModels
import com.embabel.agent.api.models.LmStudioModels
import com.embabel.agent.api.models.DockerLocalModels

Google Gemini Models

Model Constants

public class GeminiModels {
    // Gemini 3.0 Series
    public static final Llm GEMINI_3_PRO_PREVIEW;

    // Gemini 2.5 Series
    public static final Llm GEMINI_2_5_PRO;
    public static final Llm GEMINI_2_5_FLASH;
    public static final Llm GEMINI_2_5_FLASH_LITE;

    // Gemini 2.0 Series
    public static final Llm GEMINI_2_0_FLASH;
    public static final Llm GEMINI_2_0_FLASH_LITE;

    // Embedding Models
    public static final EmbeddingModel TEXT_EMBEDDING_004;
    public static final EmbeddingModel DEFAULT_TEXT_EMBEDDING_MODEL;
}

Model Characteristics

ModelUse CaseContext WindowSpeed
GEMINI_3_PRO_PREVIEWAdvanced reasoning, complex tasksLargeModerate
GEMINI_2_5_PROProduction workloads, balancedVery LargeModerate
GEMINI_2_5_FLASHFast responses, simple tasksLargeFast
GEMINI_2_5_FLASH_LITELightweight, high-throughputMediumVery Fast
GEMINI_2_0_FLASHLegacy fast responsesMediumFast
GEMINI_2_0_FLASH_LITELegacy lightweightSmallVery Fast

Usage Example (Java)

import com.embabel.agent.api.models.GeminiModels;
import com.embabel.agent.api.llm.Ai;

public class MyAgent {
    public Result process(Input input, Ai ai) {
        return ai
            .withLlm(GeminiModels.GEMINI_2_5_PRO)
            .createObject("Process this input: " + input);
    }

    public Embedding embed(String text, Ai ai) {
        return ai
            .withEmbeddingModel(GeminiModels.TEXT_EMBEDDING_004)
            .embed(text);
    }
}

Configuration

spring:
  ai:
    gemini:
      api-key: ${GOOGLE_STUDIO_API_KEY}

Requires embabel-agent-starter-gemini dependency.

Anthropic Models

Model Constants (Kotlin)

object AnthropicModels {
    // Claude 3.7 Series
    val CLAUDE_37_SONNET: Llm

    // Claude 3.5 Series
    val CLAUDE_35_HAIKU: Llm

    // Claude 4.0 Series
    val CLAUDE_40_OPUS: Llm
    val CLAUDE_41_OPUS: Llm

    // Claude 4.5 Series (Latest)
    val CLAUDE_SONNET_4_5: Llm
    val CLAUDE_HAIKU_4_5: Llm
}

Model Characteristics

ModelUse CaseContext WindowSpeed
CLAUDE_SONNET_4_5Latest, most capableVery LargeModerate
CLAUDE_HAIKU_4_5Fast, lightweightLargeFast
CLAUDE_41_OPUSAdvanced reasoningVery LargeSlower
CLAUDE_40_OPUSComplex tasksLargeSlow
CLAUDE_37_SONNETBalanced performanceLargeModerate
CLAUDE_35_HAIKUQuick responsesMediumVery Fast

Usage Example (Kotlin)

import com.embabel.agent.api.models.AnthropicModels

fun processWithClaude(input: Input, ai: Ai): Result {
    return ai
        .withLlm(AnthropicModels.CLAUDE_SONNET_4_5)
        .createObject("Process this: $input")
}

Configuration

spring:
  ai:
    anthropic:
      api-key: ${ANTHROPIC_API_KEY}

Requires embabel-agent-starter-anthropic dependency.

OpenAI Models

Model Constants (Kotlin)

object OpenAiModels {
    // GPT-5 Series (Latest)
    val GPT_5: Llm
    val GPT_5_MINI: Llm
    val GPT_5_NANO: Llm

    // GPT-4.1 Series
    val GPT_41: Llm
    val GPT_41_MINI: Llm
    val GPT_41_NANO: Llm

    // Embedding Models
    val TEXT_EMBEDDING_3_SMALL: EmbeddingModel
}

Model Characteristics

ModelUse CaseContext WindowSpeed
GPT_5Most capable, latestVery LargeModerate
GPT_5_MINIBalanced cost/performanceLargeFast
GPT_5_NANOLightweight, high-throughputMediumVery Fast
GPT_41Previous generation, capableLargeModerate
GPT_41_MINIEfficient, cost-effectiveMediumFast
GPT_41_NANOUltra-fast responsesSmallVery Fast

Usage Example (Kotlin)

import com.embabel.agent.api.models.OpenAiModels

fun processWithGPT(input: Input, ai: Ai): Result {
    return ai
        .withLlm(OpenAiModels.GPT_5)
        .createObject("Process: $input")
}

Configuration

spring:
  ai:
    openai:
      api-key: ${OPENAI_API_KEY}

Requires embabel-agent-starter-openai dependency.

DeepSeek Models

Model Constants (Kotlin)

object DeepSeekModels {
    const val DEEPSEEK_CHAT = "deepseek-chat"
    const val DEEPSEEK_REASONER = "deepseek-reasoner"
    const val PROVIDER = "Deepseek"
}

Model Characteristics

ModelUse Case
DEEPSEEK_CHATGeneral-purpose chat and completion
DEEPSEEK_REASONERAdvanced reasoning and complex problem-solving

Usage Example (Kotlin)

import com.embabel.agent.api.models.DeepSeekModels

fun processWithDeepSeek(input: Input, ai: Ai): Result {
    return ai
        .withLlm(DeepSeekModels.DEEPSEEK_CHAT)
        .createObject("Analyze: $input")
}

fun complexReasoning(problem: Problem, ai: Ai): Solution {
    return ai
        .withLlm(DeepSeekModels.DEEPSEEK_REASONER)
        .createObject("Solve this problem: $problem")
}

Ollama Models

Model Constants (Kotlin)

object OllamaModels {
    // Ollama-hosted local model constants
}

Usage Example (Kotlin)

import com.embabel.agent.api.models.OllamaModels

fun processLocally(input: Input, ai: Ai): Result {
    return ai
        .withLlm(OllamaModels.LLAMA3_2)
        .createObject("Process: $input")
}

Configuration

spring:
  ai:
    ollama:
      base-url: http://localhost:11434

Requires embabel-agent-starter-ollama dependency and Ollama running locally.

Mistral AI Models

Model Constants (Kotlin)

object MistralAiModels {
    // Mistral AI model constants
}

Usage Example (Kotlin)

import com.embabel.agent.api.models.MistralAiModels

fun processWithMistral(input: Input, ai: Ai): Result {
    return ai
        .withLlm(MistralAiModels.MISTRAL_LARGE)
        .createObject("Process: $input")
}

Google GenAI Models

Model Constants (Kotlin)

object GoogleGenAiModels {
    // Google GenAI model constants
}

LM Studio Models

Model Constants (Kotlin)

object LmStudioModels {
    // LM Studio model constants
}

Configuration

LM Studio uses the OpenAI-compatible client. Ensure your LM Studio server is running.

Docker Local Models

Model Constants (Kotlin)

object DockerLocalModels {
    // Docker-hosted model constants
}

Using Model Constants in Actions

Selecting Models at Runtime

import com.embabel.agent.api.models.GeminiModels;
import com.embabel.agent.api.models.OpenAiModels;
import com.embabel.agent.api.llm.Ai;
import com.embabel.agent.api.llm.LlmOptions;

@Action
public Result intelligentRouting(ComplexInput input, Ai ai) {
    // Use cheaper, faster model for simple classification
    Category category = ai
        .withLlm(GeminiModels.GEMINI_2_5_FLASH_LITE)
        .createObject("Classify: " + input.getPreview(), Category.class);

    // Use more capable model for complex processing
    if (category.isComplex()) {
        return ai
            .withLlm(OpenAiModels.GPT_4_TURBO)
            .createObject("Deep analysis: " + input.getFullContent(), Result.class);
    } else {
        return ai
            .withLlm(GeminiModels.GEMINI_2_5_FLASH)
            .createObject("Quick process: " + input.getFullContent(), Result.class);
    }
}

With Advanced Options

import com.embabel.agent.api.llm.LlmOptions;

@Action
public CreativeResult generateCreative(Prompt prompt, Ai ai) {
    LlmOptions options = LlmOptions
        .withModel(GeminiModels.GEMINI_2_5_PRO)
        .withTemperature(0.9)  // High temperature for creativity
        .withMaxTokens(2000);

    return ai
        .withLlm(options)
        .createObject("Generate creative content: " + prompt, CreativeResult.class);
}

Kotlin DSL

@Action
fun processWithOptions(input: Input, ai: Ai): Result {
    val options = LlmOptions
        .withModel(GeminiModels.GEMINI_2_5_PRO)
        .withTemperature(0.2)  // Low temperature for consistency
        .withMaxTokens(1000)

    return ai
        .withLlm(options)
        .createObject("Analyze: $input")
}

Default Model Configuration

Configure default models in application.yml:

embabel:
  models:
    default-llm: gpt-4.1-mini  # Default LLM for all operations
    default-embedding-model: text-embedding-3-small  # Default embedding model

Using Default Models

@Action
public Result processWithDefault(Input input, Ai ai) {
    // Uses default LLM configured in application.yml
    return ai
        .withDefaultLlm()
        .createObject("Process: " + input);
}

Model Selection Strategies

Cost Optimization

// Use fast, cheap models for simple tasks
GeminiModels.GEMINI_2_5_FLASH_LITE  // Simple classification
GeminiModels.GEMINI_2_5_FLASH        // Quick Q&A

// Use capable models for complex tasks
GeminiModels.GEMINI_2_5_PRO          // Complex reasoning
OpenAiModels.GPT_4_TURBO             // Advanced analysis

Privacy and Local Models

// For sensitive data, use local models
OllamaModels.LLAMA3_2               // Local inference
LmStudioModels.LOCAL_MODEL          // LM Studio hosted
DockerLocalModels.CONTAINER_MODEL   // Docker container

Latency Optimization

// Fastest models
GeminiModels.GEMINI_2_5_FLASH_LITE
GeminiModels.GEMINI_2_0_FLASH_LITE

// Moderate speed
GeminiModels.GEMINI_2_5_FLASH
OpenAiModels.GPT_3_5_TURBO

// More capable but slower
GeminiModels.GEMINI_2_5_PRO
OpenAiModels.GPT_4_TURBO

Multi-Model Consensus

Use multiple models for critical decisions:

import com.embabel.agent.api.consensus.ConsensusBuilder;

@Action
public Decision criticalDecision(Problem problem, Ai ai) {
    return ConsensusBuilder
        .forDecision(Decision.class)
        .withModels(
            GeminiModels.GEMINI_2_5_PRO,
            OpenAiModels.GPT_4_TURBO,
            AnthropicModels.CLAUDE_3_5_SONNET
        )
        .requireConsensus(0.67)  // 2 out of 3 must agree
        .execute(ai, "Decide on: " + problem);
}

Provider Configuration

OpenAI

spring:
  ai:
    openai:
      api-key: ${OPENAI_API_KEY}

Requires embabel-agent-starter-openai dependency.

Anthropic

spring:
  ai:
    anthropic:
      api-key: ${ANTHROPIC_API_KEY}

Requires embabel-agent-starter-anthropic dependency.

Google Gemini

spring:
  ai:
    gemini:
      api-key: ${GOOGLE_STUDIO_API_KEY}

Requires embabel-agent-starter-gemini dependency.

Ollama (Local)

spring:
  ai:
    ollama:
      base-url: http://localhost:11434

Requires embabel-agent-starter-ollama dependency and Ollama running locally.

AWS Bedrock

spring:
  ai:
    bedrock:
      aws:
        region: us-east-1
        access-key: ${AWS_ACCESS_KEY_ID}
        secret-key: ${AWS_SECRET_ACCESS_KEY}

Requires embabel-agent-starter-bedrock dependency.

Resilience Configuration

Provider-Specific Retry Configuration

embabel:
  agent:
    platform:
      models:
        anthropic:
          max-attempts: 10                  # Maximum retry attempts
          backoff-millis: 5000              # Initial backoff in milliseconds
          backoff-multiplier: 5.0           # Backoff multiplier
          backoff-max-interval: 180000      # Maximum backoff interval (3 minutes)
        openai:
          max-attempts: 10
          backoff-millis: 5000
          backoff-multiplier: 5.0
          backoff-max-interval: 180000

Backoff Calculation

Delay = min(backoff-millis * (backoff-multiplier ^ attempt), backoff-max-interval)

Example Retry Sequence:

  • Attempt 1: 5000ms (5 seconds)
  • Attempt 2: 25000ms (25 seconds)
  • Attempt 3: 125000ms (125 seconds)
  • Attempt 4+: 180000ms (180 seconds, capped)

Best Practices

  1. Start with cheap models - Use fast, inexpensive models for simple tasks
  2. Route intelligently - Direct complex tasks to capable models
  3. Use local models for sensitive data - Privacy-critical operations should use local models
  4. Configure defaults - Set reasonable defaults in application.yml
  5. Test with multiple models - Different models have different strengths
  6. Monitor costs - Track usage and optimize model selection
  7. Use embeddings appropriately - Choose embedding models based on use case
  8. Consider latency - Balance capability with response time requirements
tessl i tessl/maven-com-embabel-agent--embabel-agent-starter@0.3.1

docs

api-annotations.md

api-domain-model.md

api-invocation.md

api-tools.md

concepts-actions.md

concepts-agents.md

concepts-goals.md

concepts-invocation.md

concepts-tools.md

guides-creating-agents.md

guides-creating-tools.md

guides-defining-actions.md

guides-goal-achievement.md

guides-human-in-loop.md

guides-multimodal.md

index.md

integration-mcp.md

integration-model-providers.md

integration-spring-boot.md

LlmTool.md

quickstart.md

reference-component-scanning.md

reference-configuration-properties.md

reference-installation.md

reference-logging.md

reference-resilience.md

reference-streaming.md

tile.json