0fdc12695e
ci / JVM build + tests (push) Failing after 1m57s
- 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 как бинарные ассеты.
68 lines
2.6 KiB
Markdown
68 lines
2.6 KiB
Markdown
# :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).
|