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 как бинарные ассеты.
78 lines
3.4 KiB
Markdown
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`).
|