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 как бинарные ассеты.
155 lines
7.6 KiB
Markdown
155 lines
7.6 KiB
Markdown
# :standalone — agentik single-jar server
|
||
|
||
Self-contained HTTP-сервер на Ktor: AG-UI / A2A / :proto транспорты на одном порту,
|
||
встроенный SQLite для истории диалогов, долговременная память (Hermes-style
|
||
§-файлы или vector+JVector), загрузка MCP-инструментов, навыков (SKILL.md) и
|
||
персоны (SOUL.md).
|
||
|
||
## Сборка
|
||
|
||
```bash
|
||
# Полная сборка всего проекта + fatjar
|
||
./gradlew assemble
|
||
|
||
# Только fatjar :standalone (≈ 250 MB)
|
||
./gradlew :standalone:shadowJar
|
||
|
||
# Результат:
|
||
# standalone/build/libs/standalone-all.jar
|
||
```
|
||
|
||
Также публикуется в Nexus (`caffeine` репо) при создании релиза:
|
||
`pw.binom.agentik:standalone:VERSION` с classifier `all` (см.
|
||
`https://git.binom.pw/subochev/agentik/releases`).
|
||
|
||
## Запуск
|
||
|
||
```bash
|
||
java -jar standalone/build/libs/standalone-all.jar
|
||
```
|
||
|
||
По умолчанию слушает на `http://localhost:8080`. Healthcheck: `GET /health`.
|
||
|
||
Транспорты на одном порту:
|
||
- `GET /health` — liveness
|
||
- `POST /agentik/conversations` — создать беседу
|
||
- `GET /agentik/conversations/{id}/events` — SSE-стрим ответов
|
||
- `POST /a2a/` — A2A JSON-RPC (`message/send`, `tasks/get`, `tasks/cancel`)
|
||
- `GET /a2a/.well-known/agent-card.json` — AgentCard
|
||
- `POST /agui` — AG-UI (compatibility transport, legacy)
|
||
|
||
### Подкоманды
|
||
|
||
```bash
|
||
# Скачать модель Google LiteRT-LM в AGENTIK_GOOGLE_MODEL_PATH.
|
||
# Требует AGENTIK_LLM_BACKEND=google. Если файл уже есть — no-op.
|
||
java -jar standalone-all.jar pull-model
|
||
|
||
# Сервер (по умолчанию)
|
||
java -jar standalone-all.jar
|
||
```
|
||
|
||
## Переменные окружения
|
||
|
||
Все переменные читаются `AgentikConfig.fromEnv()`. Пусто или отсутствие → дефолт.
|
||
|
||
| Переменная | Дефолт | Назначение |
|
||
|---|---|---|
|
||
| `AGENTIK_PORT` | `8080` | Порт HTTP-сервера |
|
||
| `AGENTIK_DB_PATH` | `./agentik.db` | Путь к SQLite (история бесед + метаданные памяти) |
|
||
| `AGENTIK_SKILLS_DIR` | _выкл._ | Каталог со скилами (`SKILL.md` / `*.yaml`) |
|
||
| `AGENTIK_MEMORY_DIR` | `~/.agentik/memory` (md) или `AGENTIK_DB_PATH` (vector) | Каталог памяти (md); `"off"` отключает |
|
||
| `AGENTIK_MEMORY_BACKEND` | `md` | `md` (Hermes-style §-файлы) / `vector` (SQLite + JVector + LLM-эмбеддинги) / `off` |
|
||
| `AGENTIK_EMBEDDING_MODEL` | `text-embedding-3-small` | Модель эмбеддингов для vector-бэкенда (только HTTP) |
|
||
| `AGENTIK_EMBEDDING_DIMENSION` | `1536` | Размерность вектора (только HTTP; SIGLIP определяет автоматически) |
|
||
| `AGENTIK_EMBEDDING_BACKEND` | `HTTP` | `HTTP` (POST /v1/embeddings) или `SIGLIP` (on-device, без сети) |
|
||
| `AGENTIK_EMBEDDING_MODEL_PATH` | _только SIGLIP_ | Путь к `text_model_int8.onnx` (SigLIP2) |
|
||
| `AGENTIK_EMBEDDING_TOKENIZER_PATH` | _только SIGLIP_ | Путь к `tokenizer.model` (sentencepiece) |
|
||
| `AGENTIK_SOUL` | _выкл._ | Путь к `SOUL.md` — файл персоны (markdown), вставляется в начало system prompt |
|
||
| `AGENTIK_LLM_BACKEND` | — | `openai` или `google` (см. ниже) |
|
||
| `AGENTIK_MCP_CONFIG` | _выкл._ | Путь к JSON со списком MCP-серверов |
|
||
| `AGENTIK_SYSTEM_PROMPT` | `be brief` | Базовый system prompt |
|
||
| `OPENAI_CONTEXT_WINDOW` | _выкл._ | Лимит контекстного окна в токенах (для compaction'а) |
|
||
| `AGENTIK_GOOGLE_CONTEXT_WINDOW` | _выкл._ | То же для Google backend |
|
||
| `AGENTIK_COMPRESSION_THRESHOLD` | `0.8` | Доля лимита, при которой запускается compaction |
|
||
| `AGENTIK_REFLECTION_INTERVAL` | `10` | Self-reflection: каждый N-й пользовательский ход агент оценивает себя (LiteLlm) и сохраняет рефлексию. `0` = выключено. |
|
||
| `AGENTIK_REFLECTION_TOP_K` | `3` | Сколько последних рефлексий подмешивать в system prompt как «слабые места». `0` = не подмешивать. |
|
||
| `AGENTIK_SKILL_MINING_INTERVAL` | `15` | Skill mining: через сколько user-ходов запускать фоновый прогон SkillMiner. `0` = выключено. |
|
||
| `AGENTIK_SKILL_MINING_MAX_TURNS` | `30` | Сколько последних ходов передавать SkillMiner'у за один прогон. |
|
||
| `AGENTIK_DEBUG_ENDPOINTS` | `0` | `1` включает debug-эндпоинты (`/debug/reflect`, `/debug/skill-mine`, `/debug/curate`, `/debug/compact`, `/debug/tokens`) |
|
||
| `AGENTIK_AUTO_DOWNLOAD_MODEL` | `0` | `1` — при старте скачать LiteRT-LM модель в `AGENTIK_GOOGLE_MODEL_PATH` если её там нет (через `pull-model` логику). |
|
||
|
||
### OpenAI backend
|
||
|
||
| Переменная | Обязательна | Назначение |
|
||
|---|---|---|
|
||
| `OPENAI_BASE_URL` | да | Например, `https://api.openai.com/v1` |
|
||
| `OPENAI_API_KEY` | да | API key |
|
||
| `OPENAI_MODEL` | да | Имя модели (`gpt-4o-mini` и т.п.) |
|
||
|
||
### Google backend
|
||
|
||
| Переменная | Обязательна | Назначение |
|
||
|---|---|---|
|
||
| `AGENTIK_GOOGLE_MODEL_PATH` | да | Путь к `.litertlm` файлу |
|
||
| `AGENTIK_GOOGLE_MODEL_URL` | нет | URL для скачивания (default: `https://static.binom.pw/models/gemma-4-E2B-it.litertlm`) |
|
||
| `AGENTIK_GOOGLE_MODEL_SHA256_URL` | нет | URL с эталонным SHA-256 (если задано — файл проверяется) |
|
||
|
||
## Полный пример запуска
|
||
|
||
```bash
|
||
export AGENTIK_PORT=8080
|
||
export AGENTIK_DB_PATH=/var/lib/agentik/state.db
|
||
export AGENTIK_MEMORY_DIR=/var/lib/agentik/memory
|
||
export AGENTIK_SOUL=/etc/agentik/SOUL.md
|
||
export AGENTIK_SKILLS_DIR=/etc/agentik/skills
|
||
export AGENTIK_MCP_CONFIG=/etc/agentik/mcp.json
|
||
|
||
export AGENTIK_LLM_BACKEND=openai
|
||
export OPENAI_BASE_URL=https://api.openai.com/v1
|
||
export OPENAI_API_KEY=sk-…
|
||
export OPENAI_MODEL=gpt-4o-mini
|
||
|
||
mkdir -p "$(dirname "$AGENTIK_DB_PATH")" \
|
||
"$AGENTIK_MEMORY_DIR" \
|
||
"$(dirname "$AGENTIK_SOUL")" \
|
||
"$(dirname "$AGENTIK_MCP_CONFIG")"
|
||
|
||
java -jar standalone/build/libs/standalone-all.jar
|
||
```
|
||
|
||
На старте выведет что-то вроде:
|
||
|
||
```
|
||
agentik standalone listening on http://localhost:8080
|
||
GET /health
|
||
POST /agentik/conversations -> 201
|
||
GET /agentik/conversations/{id}/events -> SSE
|
||
storage: /var/lib/agentik/state.db
|
||
llm: OPENAI gpt-4o-mini @ https://api.openai.com/v1
|
||
mcp: 4 tools from 2 servers
|
||
skills: 3 loaded from /etc/agentik/skills
|
||
soul: /etc/agentik/SOUL.md (842 chars)
|
||
memory: /var/lib/agentik/memory (md-backend)
|
||
compaction: enabled, threshold=0.8, window=128000 tokens
|
||
curator: enabled (interval=1d, maxAge=90d)
|
||
reflection: enabled (interval=10, topK=3)
|
||
```
|
||
|
||
## Остановка
|
||
|
||
`Ctrl-C` → срабатывает shutdown hook: агент, MCP-серверы, SQLite-стора и
|
||
LLM-клиент закрываются корректно (SQLite фиксирует WAL, MCP-процессы
|
||
получают SIGTERM).
|
||
|
||
## Клиенты к :standalone
|
||
|
||
- `:agentik-cli` — REPL со slash-командами (`/new`, `/list`, `/interrupt` …).
|
||
- `:agentik-tui` — Compose-style TUI, чисто клавиатурная навигация.
|
||
|
||
## Тесты
|
||
|
||
```bash
|
||
./gradlew :standalone:jvmTest
|
||
```
|