Files
agentik/client/README.md
T
subochev 0fdc12695e
ci / JVM build + tests (push) Failing after 1m57s
docs: per-module README + root navigation hub + CI/release workflows
- README.md в каждом подмодуле: для библиотек — описание проблемы,
  подключение через maven-central/caffeine, версии в gradle/libs.versions.toml.
  Для запускаемых модулей — команды запуска + переменные среды с дефолтами.
- Корневой README.md переписан как навигационный хаб: что это, где клиенты,
  где серверы, как собрать, как опубликовать.
- build.gradle.kts: per-module POM-description через единую карту в rootProject.extra
  (порядок важен — нужно ДО apply плагина KMP, поэтому beforeEvaluate в subprojects).
- .gitea/workflows/ci.yml (новый): build + jvmTest + shadowJar на PR/push main.
- .gitea/workflows/release.yml (обновлён): публикует библиотеки в caffeine
  Nexus + собирает 3 fatjar'а и крепит их к release как бинарные ассеты.
2026-09-16 16:24:03 +03:00

2.6 KiB
Raw Blame History

:client — pw.binom.agentik.client

Ktor-клиент, превращающий HTTP-фасад :server обратно в Agent/Conversation из :proto. Подходит для JVM-приложений (CLI, desktop, integration-тесты).

Какую проблему решает

После того, как :server выставляет агента по HTTP, встаёт задача: дать вызывающей стороне тот же интерфейс, что был на сервере — а не отдельный REST-клиент с хендшейкингом SSE, парсингом полей, ручной постраничной подгрузкой. :client — обёртка: AgentikAgent(baseUrl).createConversation() возвращает Conversation, идентичный серверному, а вызовы send/getMessages/events прозрачно ездят по HTTP.

Использование

import pw.binom.agentik.client.AgentikAgent

val agent = AgentikAgent(id = "ops-bot", baseUrl = "http://localhost:8080/agentik")
val conv = agent.createConversation(temp = false)
conv.events(after = Clock.System.now()).collect { ev ->
    when (ev) {
        is Event.AppendText -> print(ev.body)
        is Event.End -> println()
        else -> Unit
    }
}
conv.send(listOf(Content.Text("Привет. Сколько будет 2+2?")))
// ... события стримятся в collect выше
conv.close()

Для фоновой подписки (reconnect-safe):

// Долгая живая подписка на события диалога.
conv.events(after = lastSeen).collect { ev ->
    if (ev is Event.End) lastSeen = ev.date
}

Подключение

implementation("pw.binom.agentik:client:$version")
// Транзитивно тянет :proto + ktor-client-core/cio/... + kotlinx-serialization.

SSE-парсер

Внутри — самописный парсер SSE (режет поток на data: строки, буферизует частичные, переживает keep-alive-комментарии). Зависимости — ktor-client-cio по умолчанию; если нужен другой engine — подмените через AgentikAgent(engineFactory = …).

Где смотреть версии

  • :client синхронизирован с :proto/server — version из gradle.properties
  • релизы: https://git.binom.pw/subochev/agentik/releases

Сборка

./gradlew :client:build

JVM-only (ktor-client-engine-cio — JVM).