Common AI framework utilities for the Embabel Agent system including LLM configuration, output converters, prompt contributors, and embedding service abstractions.
Complete LLM configuration system for model selection, hyperparameters, thinking configuration, and timeouts.
LlmOptions: Main configuration class combining model selection with hyperparameters ModelSelectionCriteria: Type-safe strategy for selecting models Thinking: Configuration for LLM reasoning/thinking capabilities
Complete LLM configuration with fluent builder API.
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 {
val criteria: ModelSelectionCriteria
fun withTemperature(temperature: Double?): LlmOptions
fun withMaxTokens(maxTokens: Int): LlmOptions
fun withTopK(topK: Int): LlmOptions
fun withTopP(topP: Double): LlmOptions
fun withFrequencyPenalty(frequencyPenalty: Double): LlmOptions
fun withPresencePenalty(presencePenalty: Double): LlmOptions
fun withThinking(thinking: Thinking): LlmOptions
fun withoutThinking(): LlmOptions
fun withTimeout(timeout: Duration): LlmOptions
companion object {
@JvmStatic operator fun invoke(): LlmOptions
@JvmStatic operator fun invoke(model: String): LlmOptions
@JvmStatic operator fun invoke(criteria: ModelSelectionCriteria): LlmOptions
@JvmStatic fun withDefaults(): LlmOptions
@JvmStatic fun withModel(model: String): LlmOptions
@JvmStatic fun withDefaultLlm(): LlmOptions
@JvmStatic fun withAutoLlm(): LlmOptions
@JvmStatic fun withLlmForRole(role: String): LlmOptions
@JvmStatic fun withFirstAvailableLlmOf(vararg names: String): LlmOptions
@JvmStatic fun fromCriteria(criteria: ModelSelectionCriteria): LlmOptions
}
}Specific model:
val options = LlmOptions.withModel("gpt-4")Automatic selection:
val options = LlmOptions.withAutoLlm()Platform default:
val options = LlmOptions.withDefaultLlm()Role-based selection:
val options = LlmOptions.withLlmForRole("code-generation")Fallback chain:
val options = LlmOptions.withFirstAvailableLlmOf("gpt-4", "claude-3-opus", "llama-3")From criteria:
val criteria = ModelSelectionCriteria.byName("gpt-4")
val options = LlmOptions.fromCriteria(criteria)Temperature (0.0 to 1.0+): Controls randomness. Lower = more deterministic, higher = more creative.
options.withTemperature(0.7)Max tokens: Maximum output length.
options.withMaxTokens(1000)Top-P (0.0 to 1.0): Nucleus sampling threshold.
options.withTopP(0.9)Top-K: Consider top K tokens only.
options.withTopK(50)Frequency penalty (-2.0 to 2.0): Penalizes token frequency.
options.withFrequencyPenalty(0.5)Presence penalty (-2.0 to 2.0): Penalizes tokens already present.
options.withPresencePenalty(0.3)val options = LlmOptions.withModel("gpt-4")
.withTemperature(0.8)
.withMaxTokens(1500)
.withTopP(0.9)
.withTopK(50)
.withFrequencyPenalty(0.5)
.withPresencePenalty(0.3)
.withTimeout(Duration.ofSeconds(30))Type-safe strategies for model selection.
sealed interface ModelSelectionCriteria {
companion object {
@JvmStatic fun byRole(role: String): ModelSelectionCriteria
@JvmStatic fun byName(name: String): ModelSelectionCriteria
@JvmStatic fun randomOf(vararg names: String): ModelSelectionCriteria
@JvmStatic fun firstOf(vararg names: String): ModelSelectionCriteria
@JvmStatic val Auto: ModelSelectionCriteria
@JvmStatic val PlatformDefault: ModelSelectionCriteria
}
}By exact name:
val criteria = ModelSelectionCriteria.byName("gpt-4")By role (application-defined roles):
val criteria = ModelSelectionCriteria.byRole("code-reviewer")Random selection (load balancing):
val criteria = ModelSelectionCriteria.randomOf("gpt-4", "claude-3-opus")Fallback chain (try in order until one works):
val criteria = ModelSelectionCriteria.firstOf("gpt-4-turbo", "gpt-4", "gpt-3.5-turbo")Automatic (platform decides):
val criteria = ModelSelectionCriteria.AutoPlatform default:
val criteria = ModelSelectionCriteria.PlatformDefaultdata 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 : ModelSelectionCriteriaConfiguration for LLM reasoning with token budgets and extraction.
class Thinking private constructor(
val enabled: Boolean = false,
val tokenBudget: Int? = null,
val extractThinking: Boolean = false
) {
fun applyExtraction(): Thinking
fun applyTokenBudget(tokenBudget: Int): Thinking
companion object {
@JvmStatic fun withTokenBudget(tokenBudget: Int): Thinking
@JvmStatic fun withExtraction(): Thinking
@JvmStatic val NONE: Thinking
}
}With token budget:
val thinking = Thinking.withTokenBudget(5000)
val options = LlmOptions.withModel("o1-preview").withThinking(thinking)With extraction:
val thinking = Thinking.withExtraction()
val options = LlmOptions.withModel("o1-preview").withThinking(thinking)Disabled:
val options = LlmOptions.withModel("gpt-4").withoutThinking()Combined:
val thinking = Thinking.withTokenBudget(3000).applyExtraction()Common hyperparameters interface implemented by LlmOptions.
interface LlmHyperparameters {
val temperature: Double?
val frequencyPenalty: Double?
val maxTokens: Int?
val presencePenalty: Double?
val topK: Int?
val topP: Double?
}// Development: higher creativity, verbose
val devOptions = LlmOptions.withModel("gpt-4")
.withTemperature(0.9)
.withMaxTokens(2000)
// Production: deterministic, concise
val prodOptions = LlmOptions.withModel("gpt-4")
.withTemperature(0.2)
.withMaxTokens(500)class ModelStrategy {
fun forTask(task: String): LlmOptions = when (task) {
"code-generation" -> LlmOptions.withModel("gpt-4")
.withTemperature(0.7)
"summarization" -> LlmOptions.withModel("gpt-3.5-turbo")
.withTemperature(0.3)
"creative-writing" -> LlmOptions.withModel("claude-3-opus")
.withTemperature(0.9)
else -> LlmOptions.withDefaultLlm()
}
}// Quick responses
val quickOptions = LlmOptions.withModel("gpt-3.5-turbo")
.withTimeout(Duration.ofSeconds(5))
// Complex tasks
val complexOptions = LlmOptions.withModel("gpt-4")
.withTimeout(Duration.ofSeconds(60))| Task | Model Selection | Temperature | Max Tokens |
|---|---|---|---|
| Code generation | Specific model | 0.7 | 1000-2000 |
| Data extraction | Specific model | 0.2 | 500 |
| Creative writing | Random/fallback | 0.9 | 2000+ |
| Summarization | By role | 0.3 | 500 |
| Classification | Specific model | 0.0 | 50 |
| Chat/conversation | Auto/default | 0.8 | 1000 |
→ See Performance Guide for optimization tips
tessl i tessl/maven-com-embabel-agent--embabel-agent-common@0.3.1