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

68 lines
2.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# :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).