Common AI framework utilities for the Embabel Agent system including LLM configuration, output converters, prompt contributors, and embedding service abstractions.
Task-oriented lookup for common operations.
Use a specific model:
val options = LlmOptions.withModel("gpt-4")Set temperature and parameters:
val options = LlmOptions.withModel("gpt-4")
.withTemperature(0.7)
.withMaxTokens(1000)Use fallback models:
val options = LlmOptions.withFirstAvailableLlmOf("gpt-4", "claude-3-opus")Convert JSON response to typed object:
val converter = JacksonOutputConverter(Person::class.java, objectMapper)
val person = converter.convert(llmResponse)Get JSON schema for prompt:
val schema = converter.jsonSchemaHandle markdown code blocks:
// Automatically handled by converter
val person = converter.convert("""```json
{"name": "Alice"}
```""")Filter properties from schema:
val converter = FilteringJacksonOutputConverter(
User::class.java,
objectMapper,
Predicate { !it.startsWith("internal") }
)Process JSONL stream:
val converter = StreamingJacksonOutputConverter(Event::class.java, objectMapper)
val stream: Flux<Event> = converter.convertStream(jsonlResponse)Extract thinking blocks:
val stream: Flux<StreamingEvent<Event>> =
converter.convertStreamWithThinking(response)Create pricing model:
val pricing = PricingModel.usdPer1MTokens(30.0, 60.0) // GPT-4Calculate request cost:
val cost = pricing.costOf(inputTokens = 1000, outputTokens = 500)Track session costs:
val tracker = CostTracker(pricing)
tracker.recordUsage(1000, 500)
val total = tracker.totalCost()Embed single text:
val embedding: FloatArray = embeddingService.embed(text)Batch embed texts:
val embeddings: List<FloatArray> = embeddingService.embed(texts)Calculate similarity:
val similarity = cosineSimilarity(embedding1, embedding2)Add fixed content:
val contributor = PromptContributor.fixed(
"You are a helpful assistant.",
role = "system",
location = PromptContributionLocation.BEGINNING
)Add dynamic content:
val contributor = PromptContributor.dynamic(
{ "Current time: ${LocalDateTime.now()}" },
role = "timestamp"
)Add current date:
val contributor = CurrentDate()Implement YAML loader:
class MyProviderLoader : AbstractYamlModelLoader<MyProvider>(
configPath = "META-INF/ai-models/my-provider.yaml"
) {
override fun getProviderClass() = MyProvider::class
override fun createEmptyProvider() = MyProvider(emptyList())
override fun getProviderName() = "my-provider"
override fun validateModels(provider: MyProvider) { /* ... */ }
}Check for parsing failure:
val result = converter.convert(llmResponse)
if (result == null) {
// Handle parsing error
}Catch model selection failure:
try {
val model = selectModel(criteria, availableModels)
} catch (e: NoSuitableModelException) {
// Handle no model found
}LLM request with structured output:
val options = LlmOptions.withModel("gpt-4").withTemperature(0.7)
val converter = JacksonOutputConverter(Response::class.java, objectMapper)
val prompt = "Extract data as: ${converter.jsonSchema}"
val response = llmClient.call(prompt, options)
val parsed = converter.convert(response)Streaming with cost tracking:
val converter = StreamingJacksonOutputConverter(Event::class.java, objectMapper)
val tracker = CostTracker(pricing)
val stream = converter.convertStream(jsonlResponse)
stream.doOnComplete { tracker.recordUsage(inputTokens, outputTokens) }tessl i tessl/maven-com-embabel-agent--embabel-agent-common@0.3.1