CtrlK
CommunityDocumentationLog inGet started
Tessl Logo

tessl/maven-com-embabel-agent--embabel-agent-common

Common AI framework utilities for the Embabel Agent system including LLM configuration, output converters, prompt contributors, and embedding service abstractions.

Overview
Eval results
Files

types.mddocs/reference/

Types Reference

Complete type reference for Embabel Agent Common.

Model Configuration Types

LlmOptions

data class LlmOptions @JvmOverloads constructor(
    var modelSelectionCriteria: ModelSelectionCriteria? = null,
    var model: String? = null,
    var role: String? = null,
    override var temperature: Double? = null,
    override var frequencyPenalty: Double? = null,
    override var maxTokens: Int? = null,
    override var presencePenalty: Double? = null,
    override var topK: Int? = null,
    override var topP: Double? = null,
    var thinking: Thinking? = null,
    var timeout: Duration? = null
) : LlmHyperparameters, HasInfoString

ModelSelectionCriteria

sealed interface ModelSelectionCriteria

data class ByNameModelSelectionCriteria(val name: String) : ModelSelectionCriteria
data class ByRoleModelSelectionCriteria(val role: String) : ModelSelectionCriteria
data class RandomByNameModelSelectionCriteria(val names: List<String>) : ModelSelectionCriteria
data class FallbackByNameModelSelectionCriteria(val names: List<String>) : ModelSelectionCriteria
object AutoModelSelectionCriteria : ModelSelectionCriteria
object DefaultModelSelectionCriteria : ModelSelectionCriteria

Thinking

class Thinking private constructor(
    val enabled: Boolean = false,
    val tokenBudget: Int? = null,
    val extractThinking: Boolean = false
)

LlmHyperparameters

interface LlmHyperparameters {
    val temperature: Double?
    val frequencyPenalty: Double?
    val maxTokens: Int?
    val presencePenalty: Double?
    val topK: Int?
    val topP: Double?
}

Metadata Types

ModelMetadata

interface ModelMetadata {
    val name: String
    val provider: String
    val type: ModelType
}

ModelType

enum class ModelType {
    LLM,
    EMBEDDING
}

LlmMetadata

interface LlmMetadata : ModelMetadata {
    val knowledgeCutoffDate: LocalDate?
    val pricingModel: PricingModel?
}

EmbeddingServiceMetadata

interface EmbeddingServiceMetadata : ModelMetadata

EmbeddingServiceMetadataImpl

data class EmbeddingServiceMetadataImpl(
    override val name: String,
    override val provider: String
) : EmbeddingServiceMetadata

AiModel

interface AiModel<M> : ModelMetadata, HasInfoString {
    val model: M
    fun infoString(verbose: Boolean?, indent: Int): String
}

Conversion Types

JacksonOutputConverter

open class JacksonOutputConverter<T>(
    clazz: Class<T>,
    objectMapper: ObjectMapper
) : StructuredOutputConverter<T> {
    val objectMapper: ObjectMapper
    val jsonSchema: String
    fun convert(text: String): T?
    fun getFormat(): String
    protected open fun postProcessSchema(jsonNode: JsonNode)
}

FilteringJacksonOutputConverter

open class FilteringJacksonOutputConverter<T>(
    clazz: Class<T>,
    objectMapper: ObjectMapper,
    propertyFilter: Predicate<String>
) : JacksonOutputConverter<T>

StructuredOutputConverter

interface StructuredOutputConverter<T> {
    fun convert(text: String): T?
    fun getFormat(): String
}

OptionsConverter

fun interface OptionsConverter<O : ChatOptions> {
    fun convertOptions(options: LlmOptions): O
}

DefaultOptionsConverter

object DefaultOptionsConverter : OptionsConverter<ChatOptions> {
    override fun convertOptions(options: LlmOptions): ChatOptions
}

Streaming Types

StreamingJacksonOutputConverter

class StreamingJacksonOutputConverter<T>(
    clazz: Class<T>,
    objectMapper: ObjectMapper,
    propertyFilter: Predicate<String> = Predicate { true }
) : FilteringJacksonOutputConverter<T> {
    fun convertStream(jsonlContent: String): Flux<T>
    fun convertStreamWithThinking(text: String): Flux<StreamingEvent<T>>
    override fun getFormat(): String
}

StreamingEvent

sealed interface StreamingEvent<T> {
    data class Object<T>(val item: T) : StreamingEvent<T>
    data class Thinking(
        val content: String,
        val state: ThinkingState
    ) : StreamingEvent<Nothing>
}

ThinkingState

enum class ThinkingState {
    NONE,
    START,
    END,
    BOTH,
    CONTINUATION
}

Pricing Types

PricingModel

interface PricingModel {
    fun usdPerInputToken(): Double
    fun usdPerOutputToken(): Double
    fun costOf(inputTokens: Int, outputTokens: Int): Double
    fun costOf(usage: Usage): Double
}

PerTokenPricingModel

class PerTokenPricingModel(
    val usdPer1mInputTokens: Double,
    val usdPer1mOutputTokens: Double
) : PricingModel

Constants

const val ONE_MILLION = 1000000.0

Prompt System Types

PromptContributor

interface PromptContributor : PromptElement {
    fun promptContribution(): PromptContribution
    fun contribution(): String
}

PromptContribution

data class PromptContribution(
    val content: String,
    val location: PromptContributionLocation,
    val role: String?
) {
    companion object {
        const val KNOWLEDGE_CUTOFF_ROLE = "knowledge_cutoff"
        const val CURRENT_DATE_ROLE = "current_date"
    }
}

PromptContributionLocation

enum class PromptContributionLocation {
    BEGINNING,
    END
}

PromptElement

interface PromptElement {
    val role: String?
    val promptContributionLocation: PromptContributionLocation
}

PromptContributorConsumer

interface PromptContributorConsumer {
    val promptContributors: List<PromptContributor>
}

CurrentDate

class CurrentDate(
    val formatter: DateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd")
) : PromptContributor {
    override val role: String
    override val promptContributionLocation: PromptContributionLocation
}

KnowledgeCutoffDate

class KnowledgeCutoffDate(
    val date: LocalDate,
    val formatter: DateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM")
) : PromptContributor {
    override val role: String
    override val promptContributionLocation: PromptContributionLocation
}

Auto-Configuration Types

AbstractYamlModelLoader

abstract class AbstractYamlModelLoader<T : LlmAutoConfigProvider<*>>(
    private val resourceLoader: ResourceLoader = DefaultResourceLoader(),
    private val configPath: String
) : LlmAutoConfigMetadataLoader<T> {
    protected val logger: Logger
    protected val yamlMapper: ObjectMapper
    override fun loadAutoConfigMetadata(): T
    protected abstract fun getProviderClass(): kotlin.reflect.KClass<T>
    protected abstract fun createEmptyProvider(): T
    protected abstract fun getProviderName(): String
    protected abstract fun validateModels(provider: T)
    protected fun validateCommonFields(model: LlmAutoConfigMetadata)
}

LlmAutoConfigMetadata

interface LlmAutoConfigMetadata {
    val name: String
    val modelId: String
    val displayName: String?
    val knowledgeCutoffDate: LocalDate?
    val pricingModel: PerTokenPricingModel?
}

LlmAutoConfigProvider

interface LlmAutoConfigProvider<T : LlmAutoConfigMetadata> {
    val models: List<T>
}

LlmAutoConfigMetadataLoader

interface LlmAutoConfigMetadataLoader<T> {
    fun loadAutoConfigMetadata(): T
}

ProviderInitialization

data class ProviderInitialization(
    val provider: String,
    val registeredLlms: List<RegisteredModel>,
    val registeredEmbeddings: List<RegisteredModel>,
    val initializedAt: Instant
) {
    val totalLlms: Int
    val totalEmbeddings: Int
    fun summary(): String
}

RegisteredModel

data class RegisteredModel(
    val beanName: String,
    val modelId: String
)

Embedding Types

EmbeddingService

interface EmbeddingService : AiModel<Any>, EmbeddingServiceMetadata {
    val dimensions: Int
    fun embed(text: String): FloatArray
    fun embed(texts: List<String>): List<FloatArray>
}

SpringAiEmbeddingService

data class SpringAiEmbeddingService(
    override val name: String,
    override val provider: String,
    override val model: EmbeddingModel
) : EmbeddingService {
    override val type: ModelType
    override val dimensions: Int
}

Exception Types

NoSuitableModelException

class NoSuitableModelException(
    criteria: ModelSelectionCriteria,
    modelNames: List<String>
) : RuntimeException {
    companion object {
        @JvmStatic
        fun forModels(
            criteria: ModelSelectionCriteria,
            models: List<AiModel<*>>
        ): NoSuitableModelException
    }
}

Utility Types

ObjectProviders

object ObjectProviders {
    fun <T> empty(): ObjectProvider<T>
}

HasInfoString

interface HasInfoString {
    fun infoString(verbose: Boolean?, indent: Int): String
}

Type Hierarchies

Model Configuration Hierarchy

LlmOptions (data class)
├── implements LlmHyperparameters
├── implements HasInfoString
├── contains ModelSelectionCriteria
└── contains Thinking

ModelSelectionCriteria (sealed interface)
├── ByNameModelSelectionCriteria
├── ByRoleModelSelectionCriteria
├── RandomByNameModelSelectionCriteria
├── FallbackByNameModelSelectionCriteria
├── AutoModelSelectionCriteria
└── DefaultModelSelectionCriteria

Metadata Hierarchy

ModelMetadata (interface)
├── LlmMetadata (interface)
│   └── contains PricingModel
└── EmbeddingServiceMetadata (interface)
    └── EmbeddingServiceMetadataImpl (data class)

AiModel<M> (interface)
├── implements ModelMetadata
├── implements HasInfoString
└── wraps model instance

Converter Hierarchy

StructuredOutputConverter<T> (interface)
└── JacksonOutputConverter<T> (open class)
    └── FilteringJacksonOutputConverter<T> (open class)
        └── StreamingJacksonOutputConverter<T> (class)

Prompt System Hierarchy

PromptElement (interface)
└── PromptContributor (interface)
    ├── CurrentDate (class)
    └── KnowledgeCutoffDate (class)

PromptContributorConsumer (interface)
└── contains List<PromptContributor>

Pricing Hierarchy

PricingModel (interface)
└── PerTokenPricingModel (class)

Auto-Configuration Hierarchy

LlmAutoConfigMetadataLoader<T> (interface)
└── AbstractYamlModelLoader<T> (abstract class)
    └── [Provider-specific loaders]

LlmAutoConfigProvider<T> (interface)
└── contains List<T : LlmAutoConfigMetadata>

Streaming Hierarchy

StreamingEvent<T> (sealed interface)
├── StreamingEvent.Object<T> (data class)
└── StreamingEvent.Thinking (data class)
    └── contains ThinkingState (enum)

Embedding Hierarchy

EmbeddingServiceMetadata (interface)
└── EmbeddingService (interface)
    ├── implements AiModel<Any>
    └── SpringAiEmbeddingService (data class)

Package Organization

com.embabel.common.ai
├── model
│   ├── LlmOptions
│   ├── ModelSelectionCriteria
│   ├── Thinking
│   ├── ModelMetadata
│   ├── LlmMetadata
│   ├── EmbeddingServiceMetadata
│   ├── EmbeddingService
│   ├── SpringAiEmbeddingService
│   ├── AiModel
│   ├── ModelType
│   └── NoSuitableModelException
├── converters
│   ├── StructuredOutputConverter
│   ├── JacksonOutputConverter
│   ├── FilteringJacksonOutputConverter
│   ├── OptionsConverter
│   └── DefaultOptionsConverter
├── converters.streaming
│   ├── StreamingJacksonOutputConverter
│   ├── StreamingEvent (from embabel-common-core)
│   └── ThinkingState (from embabel-common-core)
├── prompt
│   ├── PromptContributor
│   ├── PromptContribution
│   ├── PromptContributionLocation
│   ├── PromptElement
│   ├── PromptContributorConsumer
│   ├── CurrentDate
│   └── KnowledgeCutoffDate
└── autoconfig
    ├── AbstractYamlModelLoader
    ├── LlmAutoConfigMetadata
    ├── LlmAutoConfigProvider
    ├── LlmAutoConfigMetadataLoader
    ├── ProviderInitialization
    └── RegisteredModel

Kotlin-Specific Features

Data Classes

Provide copy(), equals(), hashCode(), toString(), and destructuring:

  • LlmOptions
  • PromptContribution
  • RegisteredModel
  • ProviderInitialization
  • EmbeddingServiceMetadataImpl
  • SpringAiEmbeddingService
  • All ModelSelectionCriteria implementations

Sealed Interfaces

Enable exhaustive when expressions:

  • ModelSelectionCriteria
  • StreamingEvent

Object Declarations

Singletons with guaranteed thread safety:

  • AutoModelSelectionCriteria
  • DefaultModelSelectionCriteria
  • DefaultOptionsConverter
  • ObjectProviders

Companion Objects

Static-like factory methods and constants:

  • LlmOptions.Companion
  • ModelSelectionCriteria.Companion
  • Thinking.Companion
  • LlmMetadata.Companion
  • PricingModel.Companion
  • PromptContributor.Companion
  • NoSuitableModelException.Companion

Fun Interfaces

SAM (Single Abstract Method) for Java interop:

  • OptionsConverter

Nullability

Nullable Properties

Properties that can be null:

  • LlmOptions.modelSelectionCriteria
  • LlmOptions.model
  • LlmOptions.role
  • All hyperparameters in LlmHyperparameters
  • LlmOptions.thinking
  • LlmOptions.timeout
  • LlmMetadata.knowledgeCutoffDate
  • LlmMetadata.pricingModel
  • LlmAutoConfigMetadata.displayName
  • LlmAutoConfigMetadata.knowledgeCutoffDate
  • LlmAutoConfigMetadata.pricingModel
  • PromptElement.role

Nullable Return Values

Methods that return null on failure:

  • JacksonOutputConverter.convert(): T?
  • FilteringJacksonOutputConverter.convert(): T?
  • StreamingJacksonOutputConverter.convert(): T?

Thread Safety

Thread-Safe Types

Safe for concurrent use:

  • ObjectMapper (Jackson)
  • All converter instances
  • PricingModel implementations
  • All data classes (immutable)
  • Object declarations

Not Thread-Safe

Require external synchronization:

  • Mutable collections in examples
  • Cache implementations in examples
  • Custom service implementations (unless specified)

Java Interoperability

JvmStatic Annotation

Static access from Java:

  • All companion object methods marked @JvmStatic

JvmOverloads Annotation

Generate multiple constructors for Java:

  • LlmOptions constructor
  • Factory methods with default parameters

Platform Types

When integrating with Java libraries:

  • Spring AI's ChatOptions, EmbeddingModel, Usage
  • Jackson's ObjectMapper, JsonNode
  • Reactor's Flux, Mono
tessl i tessl/maven-com-embabel-agent--embabel-agent-common@0.3.1

docs

reference

index.md

quick-reference.md

README.md

tile.json