Common AI framework utilities for the Embabel Agent system including LLM configuration, output converters, prompt contributors, and embedding service abstractions.
Interfaces and classes for representing AI model metadata including provider information, model types, pricing, and knowledge cutoff dates.
Base interface for all AI model metadata with JSON serialization support.
interface ModelMetadata {
val name: String
val provider: String
val type: ModelType
}
enum class ModelType {
LLM,
EMBEDDING
}Metadata specific to language models.
interface LlmMetadata : ModelMetadata {
val knowledgeCutoffDate: LocalDate?
val pricingModel: PricingModel?
companion object {
@JvmStatic
operator fun invoke(
name: String,
provider: String,
knowledgeCutoffDate: LocalDate? = null,
pricingModel: PricingModel? = null
): LlmMetadata
@JvmStatic
@JvmOverloads
fun create(
name: String,
provider: String,
knowledgeCutoffDate: LocalDate? = null,
pricingModel: PricingModel? = null
): LlmMetadata
}
}Basic Usage:
import java.time.LocalDate
// Create LLM metadata
val llmMeta = LlmMetadata(
name = "gpt-4",
provider = "openai",
knowledgeCutoffDate = LocalDate.of(2023, 4, 1),
pricingModel = PricingModel.usdPer1MTokens(30.0, 60.0)
)
// Minimal properties
val simpleMeta = LlmMetadata(
name = "llama-3",
provider = "meta"
)Metadata for embedding services.
interface EmbeddingServiceMetadata : ModelMetadata {
companion object {
@JvmStatic
operator fun invoke(
name: String,
provider: String
): EmbeddingServiceMetadata
@JvmStatic
fun create(
name: String,
provider: String
): EmbeddingServiceMetadata
}
}Usage:
val embeddingMeta = EmbeddingServiceMetadata(
name = "text-embedding-ada-002",
provider = "openai"
)Generic wrapper combining model instance with metadata.
interface AiModel<M> : ModelMetadata, HasInfoString {
val model: M
fun infoString(verbose: Boolean?, indent: Int): String
}Usage:
class MyLlmModel(
override val name: String,
override val provider: String,
override val model: ChatModel
) : AiModel<ChatModel> {
override val type = ModelType.LLM
}
val llm = MyLlmModel(
name = "gpt-4",
provider = "openai",
model = springAiChatModel
)
val info = llm.infoString(verbose = false, indent = 0)LlmMetadata integrates with the pricing system for cost calculation.
val metadata = LlmMetadata(
name = "gpt-4-turbo",
provider = "openai",
pricingModel = PricingModel.usdPer1MTokens(10.0, 30.0)
)
metadata.pricingModel?.let { pricing ->
val cost = pricing.costOf(inputTokens = 1000, outputTokens = 500)
println("Cost: $$cost")
}Model metadata supports JSON serialization with type information preserved.
import com.fasterxml.jackson.databind.ObjectMapper
val mapper = ObjectMapper()
// Serialize
val json = mapper.writeValueAsString(llmMetadata)
// Deserialize with type information
val deserialized = mapper.readValue(json, ModelMetadata::class.java)tessl i tessl/maven-com-embabel-agent--embabel-agent-common@0.3.1