Убрана зависимость pw.binom.agui:server из проекта — AGUI больше
не нужен (см. Memory #3675; agentik переходит на свой протокол :proto
и HTTP-фасад :server).
Чистка:
- standalone/build.gradle.kts: implementation(libs.agui.server) → удалено
- gradle/libs.versions.toml: [versions] agui + agui-api/agui-client/
agui-server entries → удалены
- settings.gradle.kts: убран 'AG-UI' из комментария к Nexus-репо
- proto/build.gradle.kts: комментарий 'Зеркалит набор AG-UI api' →
'Полный набор KMP-целей'
- proto/src/.../Agent.kt: KDoc '(замена AG-UI)' → удалено
- settings.gradle.kts: то же
- docs/ARCHITECTURE.md: переписан (описывал старую AGUI-centric
архитектуру с AbstractAgent/SessionStore/
AgentEngine — ничего этого в коде уже
нет; теперь отражает текущее состояние:
:proto + :server + :standalone + LiteLlm +
MCP + SqliteStores)
- NATIVE-COMPATIBILITY.md: пункт 10 'agui-server KMP-готовность' →
отменён (см. -); убран из 'Жёсткие блокеры'
В коде не осталось ни одного обращения к AGUI. После чистки в репо
больше нет ни одной зависимости от pw.binom.agui.*.
Проверка: ./gradlew :server:assemble (9/9 KMP-целей) +
:standalone:jvmTest 44/44 (ChatAgent 15, LlmConfig 6, McpConfig 8,
McpRegistry 4, Persistence 11) — зелёные.
> `NATIVE-COMPATIBILITY.md`, открытые вопросы — `IRC-QUESTIONS.md`.
## 1. Контекст
agentik — runtime агента. Внешне он exposes два фасада:
- **AG-UI** — SSE-поток событий для UI-клиентов (`POST /agui`), транспорт Netty.
- **A2A** — JSON-RPC для agent↔agent (`POST /`, `message/send`), транспорт CIO.
agentik — runtime агента. Ядро на собственном протоколе (`:proto`),
HTTP/SSE-фасад в `:server`, runtime-контейнер в `:standalone`. Раньше
фасадов было два (AG-UI + A2A); AG-UI убран как устаревший,
`a2a-server` остаётся заготовкой в `libs.versions.toml` и подключён в
`:standalone``build.gradle.kts`, но в `Main.kt` пока не монтируется.
Ядро (сессии, чат-цикл, тулы, LLM, MCP) **не зависит от транспорта**: фасады лишь сериализуют/десериализуют его. Библиотеки из каталога `caffeine`: `agui` 0.1.0, `a2a` 1.0.0-SNAPSHOT; LLM — `pw.binom.openai` (ktor-impl).
LLM — за интерфейсом `pw.binom.litert.LiteLlm`. Реализации:
Сервер (`aguiAgent(agent, path="/agui")`) не хранит ничего между запросами: декодирует `RunAgentInput`, вызывает `agent.run`, стримит события, оборачивает сбой в `RUN_ERROR`.
## 3. Как вписываемся (принципы)
1.**`threadId` = наша сессия.** Держим `SessionStore[threadId]` на сервере даже при stateless-сервере AGUI: на каждом ходе реконсилируем `input.messages` с сохранёнными и дописываем новые. Это даёт «настоящие сессии» с историей.
2.**`runId` = ход.** Один `RunAgentInput` → один цикл ядра → один поток событий.
3.**Ядро говорит на AGUI-событиях** — это и есть наш протокол вывода; фасады не переопределяют его.
4.**LLM — за интерфейсом.** Ядро не знает, какая LLM. Точка входа `LlmClient.complete(...)`.
5.**Тулы: внутренний реестр + MCP.**`ToolRegistry` объединяет «родные» тулы и тулы MCP-серверов (через bridge). LLM вызывает их; ядро исполняет и возвращает `TOOL_CALL_RESULT`.
6.**А2A = request/response.** Переиспользуем то же ядро, но собираем финальный текст и отдаём одним A2A `Message`.
Wiring (в `standalone`): `Main` собирает `AgentEngine(llm, tools+MCP, sessions)`, отдаёт его `AgentikAgent` (AGUI) и `EngineA2aHandler` (A2A). Конфигурация (LLM, MCP-серверы, тулы) — в одном месте (см. §8).
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.