DEV Community

Anton Illarionov
Anton Illarionov

Posted on

Kotlin + Ktor + ODEI: Constitutional AI Agents on JVM

Kotlin + Ktor + ODEI: Constitutional AI Agents on JVM

Kotlin's coroutines + Ktor's async server + ODEI's constitutional validation = modern AI agents on JVM.

Ktor Integration

import io.ktor.client.*
import io.ktor.client.request.*
import io.ktor.client.statement.*
import kotlinx.serialization.Serializable
import kotlinx.serialization.json.Json

@Serializable
data class GuardrailResult(
    val verdict: String,
    val reasoning: String,
    val score: Int
)

class OdeiClient(private val token: String) {
    private val client = HttpClient()
    private val baseUrl = "https://api.odei.ai/api/v2"

    suspend fun checkAction(action: String, severity: String = "medium"): GuardrailResult {
        val response = client.post("$baseUrl/guardrail/check") {
            headers { append("Authorization", "Bearer $token") }
            contentType(ContentType.Application.Json)
            setBody(mapOf("action" to action, "severity" to severity))
        }
        return Json.decodeFromString(response.bodyAsText())
    }

    suspend fun safeExecute(action: String, fn: suspend () -> Unit) {
        val result = checkAction(action)
        when (result.verdict) {
            "APPROVED" -> fn()
            "ESCALATE" -> println("Review needed: ${result.reasoning}")
            else -> println("Blocked: ${result.reasoning}")
        }
    }
}
Enter fullscreen mode Exit fullscreen mode

Coroutine-Based Agent

class AutoAgent(private val odei: OdeiClient) {

    suspend fun executeWorkflow(tasks: List<Task>) = coroutineScope {
        tasks.map { task ->
            async {
                odei.safeExecute("execute: ${task.description}") {
                    task.execute()
                }
            }
        }.awaitAll()
    }
}
Enter fullscreen mode Exit fullscreen mode

Production

ODEI has been running since January 2026 with 92% task success rate.

API: https://api.odei.ai | MCP: npx @odei/mcp-server

Top comments (0)