Files
agentik/memory-api/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

78 lines
3.4 KiB
Markdown

# :memory-api — `pw.binom.agentik.memory`
**Интерфейсы долговременной памяти агента: `MemoryStore`, `MemoryNote`,
`MemoryCategory`, `MemoryPrefetcher`, `MemoryReviewer`, `MemoryTools`.**
Без зависимостей от конкретного хранилища.
## Какую проблему решает
LLM не помнит между сессиями. Чтобы агент становился **умнее с каждым
диалогом**, нужна долговременная память: факты о пользователе, мире,
предпочтениях, плюс механизм извлечения (reviewer) и подмешивания (prefetcher)
в контекст. Бэкенды памяти бывают разные (md-файлы, векторный ANN, sqlite,
KV-store), и `:standalone` не должен быть привязан ни к одному из них.
`:memory-api` определяет **контракт**: что умеет любая реализация памяти.
Конкретные бэкенды — `:memory-md` (Hermes-style §-файлы) и `:memory-vector`
(SQLite + JVector + эмбеддинги).
## Что в контракте
```kotlin
interface MemoryStore : AutoCloseable {
suspend fun upsert(note: MemoryNote)
suspend fun get(id: String): MemoryNote?
suspend fun list(category: MemoryCategory?, conversationId: String?, limit, offset): List<MemoryNote>
suspend fun search(query: MemorySearchQuery): List<MemorySearchResult>
suspend fun delete(id: String): Boolean
suspend fun markUsed(ids: List<String>) // бампит lastUsedAt + useCount
fun events(): Flow<MemoryStoreEvent> // опционально
}
enum class MemoryCategory { USER, WORLD, PREFERENCE }
data class MemoryNote(
val id: String,
val conversationId: String?,
val category: MemoryCategory,
val title: String,
val body: String,
val source: MemorySource, // AUTO_REVIEW / USER / MANUAL
val createdAt: Instant,
val lastUsedAt: Instant?,
val useCount: Int,
)
```
`MemoryPrefetcher` — компонент, который **перед** каждым user-ходом выбирает
релевантные заметки (через `search()`) и форматирует `[Memory context…]` блок
в начало user-сообщения. `MemoryReviewer` — компонент, который **после**
assistant-хода извлекает новые факты (через LiteLlm) и вызывает `upsert`.
`MemoryTools` — `memory_save` / `memory_recall` / `memory_list` / `memory_delete`,
которыми модель может пользоваться явно.
## Подключение
```kotlin
commonMain {
implementation("pw.binom.agentik:memory-api:$version")
// + выберите реализацию:
implementation("pw.binom.agentik:memory-md:$version") // md-файлы
// или
implementation("pw.binom.agentik:memory-vector:$version") // JVector+SQLite
}
```
## Где смотреть версии
- `version` из `gradle.properties` (`version=0.1.0`)
- релизы: `https://git.binom.pw/subochev/agentik/releases`
## Сборка
```bash
./gradlew :memory-api:build
```
KMP-таргеты — полный набор. Зависимостей нет (только `kotlinx-coroutines-core` для `Flow`).