# :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. ## Использование ```kotlin 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): ```kotlin // Долгая живая подписка на события диалога. conv.events(after = lastSeen).collect { ev -> if (ev is Event.End) lastSeen = ev.date } ``` ## Подключение ```kotlin 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` ## Сборка ```bash ./gradlew :client:build ``` JVM-only (ktor-client-engine-cio — JVM).