Concept: Messages and Content
The http4k AI/LLM module uses sealed class hierarchies to provide type-safe, compile-time validated message structures with limited, well-defined options.
Message Types
There are five main message types, each serving a specific purpose in the conversation flow:
sealed class Message {
// Instructions and context for the AI
data class System(val text: String) : Message()
// Human input with multimodal content
data class User(val contents: List<Content>) : Message()
// AI responses with optional tool requests
data class Assistant(val contents: List<Content>, val toolRequests: List<ToolRequest>) : Message()
// Results from tool executions
data class ToolResult(val id: RequestId, val tool: ToolName, val text: String) : Message()
// Extensible for provider-specific needs
data class Custom(val attributes: Map<String, Any>) : Message()
}
Multimodal Content Support
sealed class Content {
data class Text(val text: String) : Content()
data class Image(val image: Resource, val detail: DetailLevel) : Content()
data class Audio(val resource: Resource) : Content()
data class Video(val resource: Resource) : Content()
data class PDF(val resource: Resource) : Content()
data class Custom(val resource: Resource) : Content()
}
Messages can contain multiple content types - text, images, audio, video, PDFs, and custom formats. This enables rich, multimodal conversations with AI models.
Resource Handling
Resources can be referenced by URI or embedded as base64 binary data, providing flexibility in how media is handled.
sealed class Resource {
data class Ref(val uri: Uri, val mimeType: MimeType?) : Resource()
data class Binary(val content: Base64Blob, val mimeType: MimeType?) : Resource()
}
Tool Integration
Messages integrate seamlessly with tool calling - assistants can request tool executions, and tool results flow back as structured messages in the conversation.