4c66947c25
- Add mcp/McpConfig + McpRegistry wrapping io.modelcontextprotocol:kotlin-sdk-client 0.15.0
- Supports stdio (uvx/npx/python) and streamable HTTP transports
- Claude Desktop-compatible JSON config (AGENTIK_MCP_CONFIG)
- server__tool name prefix to avoid collisions between servers
- Add agent/NamedTool (name + LiteTool pair) and tools: List<NamedTool> on ChatAgent/ChatConversation
- Implement tool-call loop in ChatConversation.runTurn:
- delta.toolCalls -> emit ToolCall event -> persist audit -> execute tool
-> emit ToolResult -> persist -> liteConv.addToolResult(callId, name, result)
- separate tc-/tr- prefixes keep SQL PRIMARY KEY unique while toolCallId FK is preserved
- 8 McpConfig + 4 McpRegistry unit tests; +1 ChatAgentTest tool-loop test (44/44 total)
- e2e verified: real MCP fetch server (mcp-server-fetch) + litellm local/codding
-> LLM calls fetch__fetch, MCP exec, result fed back, conversation continues
docs/STANDALONE.md: drop 'no tools / no MCP' from §8; replace 'Подключить тул (v2)' stub
with full in-agent + MCP recipe and tool-loop algorithm in §7
92 lines
3.0 KiB
Kotlin
92 lines
3.0 KiB
Kotlin
@file:OptIn(org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi::class)
|
|
|
|
import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi
|
|
import org.jetbrains.kotlin.gradle.targets.jvm.KotlinJvmTarget
|
|
|
|
plugins {
|
|
alias(libs.plugins.kotlin.multiplatform)
|
|
alias(libs.plugins.kotlin.serialization)
|
|
alias(libs.plugins.sqldelight)
|
|
}
|
|
|
|
kotlin {
|
|
jvmToolchain(21)
|
|
|
|
jvm {
|
|
binaries {
|
|
executable {
|
|
mainClass.set("pw.binom.agentik.standalone.MainKt")
|
|
}
|
|
}
|
|
}
|
|
|
|
sourceSets {
|
|
commonMain.dependencies {
|
|
implementation(project(":proto"))
|
|
implementation(project(":server"))
|
|
|
|
// Commons
|
|
implementation(libs.kotlinx.coroutines.core)
|
|
implementation(libs.kotlinx.serialization.json)
|
|
implementation(libs.kotlinx.datetime)
|
|
|
|
// litert-kmp: контракт (commonMain)
|
|
api(libs.litert.api)
|
|
|
|
// SQLDelight runtime (commonMain)
|
|
api(libs.sqldelight.runtime)
|
|
api(libs.sqldelight.coroutines)
|
|
}
|
|
|
|
jvmMain.dependencies {
|
|
// litert-openai: JVM-реализация
|
|
implementation(libs.litert.openai)
|
|
// litert-google: встроенный LiteRT-LM движок, нужен только на runtime
|
|
runtimeOnly(libs.litert.google)
|
|
|
|
// SQLDelight JDBC driver (JVM)
|
|
implementation(libs.sqldelight.sqlite.driver)
|
|
|
|
// Ktor server (для :server facade + a2aServer)
|
|
implementation(libs.ktor.server.core)
|
|
implementation(libs.ktor.server.sse)
|
|
implementation(libs.ktor.server.netty)
|
|
implementation(libs.ktor.server.content.negotiation)
|
|
implementation(libs.ktor.serialization.kotlinx.json)
|
|
|
|
// Транспортные фасады
|
|
implementation(libs.agui.server)
|
|
implementation(libs.a2a.server)
|
|
|
|
// MCP (Model Context Protocol) клиент — подключение внешних/внутренних MCP-серверов
|
|
implementation(libs.mcp.sdk.client)
|
|
implementation(libs.ktor.client.core)
|
|
implementation(libs.ktor.client.cio)
|
|
implementation(libs.ktor.client.content.negotiation)
|
|
implementation(libs.ktor.serialization.kotlinx.json)
|
|
}
|
|
|
|
commonTest.dependencies {
|
|
implementation(libs.kotlinx.coroutines.core)
|
|
implementation(libs.kotlin.test)
|
|
}
|
|
|
|
jvmTest.dependencies {
|
|
implementation(libs.kotlinx.coroutines.core)
|
|
implementation(libs.kotlinx.serialization.json)
|
|
implementation(libs.kotlin.test)
|
|
// Ktor test engine для smoke-тестов HTTP
|
|
implementation(libs.ktor.server.test.host)
|
|
}
|
|
}
|
|
}
|
|
|
|
sqldelight {
|
|
databases {
|
|
create("AgentikDatabase") {
|
|
packageName.set("pw.binom.agentik.standalone.persistence.sqlite")
|
|
srcDirs.setFrom("src/jvmMain/sqldelight")
|
|
}
|
|
}
|
|
}
|