API Memory Service
Спецификация программных интерфейсов управляемого сервиса памяти агентов Платформы ИИ.
Общие сведения
API Memory Service совместим с контрактом mem0.
Публичные маршруты начинаются с /v1/. Аутентификация выполняется
через JWT платформы; user_id извлекается из токена, а не из тела
запроса.
Каждая защищённая операция проходит проверку прав через SpiceDB
(fail-closed). Операции записи регистрируются в immutable audit
log платформы.
Формат ошибок
Все ошибки возвращают объект:
{
"error": "string",
"message": "string",
"details": {}
}Эндпоинты
POST /v1/memories — Добавить память
Добавляет память из сообщений диалога. Извлечение фактов выполняется
асинхронно через очередь RabbitMQ. Возвращает event_id для
отслеживания статуса.
Тело запроса — AddMemoryRequest
| Поле | Тип | Обязательно | Описание |
|---|---|---|---|
messages | array | Да | Массив сообщений с полями role и content |
agent_id | string | Да (если нет run_id) | Идентификатор агента |
run_id | string | Да (если нет agent_id) | Идентификатор запуска |
infer | boolean | Нет | true — LLM-извлечение (по умолчанию); false — прямой импорт |
metadata | object | Нет | Произвольные метаданные записи |
expiration_date | string | Нет | Дата окончания срока хранения (YYYY-MM-DD) |
custom_instructions | string | Нет | Инструкции извлечения на вызов |
prompt | string | Нет | Алиас custom_instructions (совместимость с mem0) |
Ответ 202 — AddMemoryResponse
{
"event_id": "uuid",
"status": "PENDING"
}Пример
POST /v1/memories
{
"messages": [
{"role": "user", "content": "Я работаю в отделе закупок, отчёты нужны в xlsx"},
{"role": "assistant", "content": "Понял, буду присылать xlsx"}
],
"agent_id": "procurement-assistant-v1",
"run_id": "01J9X2K7...",
"infer": true,
"metadata": {"source": "chat"}
}
→ 202 Accepted
{"event_id": "01J9X2K8...", "status": "PENDING"}POST /v1/memories/search — Поиск памяти
Мультисигнальный поиск по запросу с фильтрами, ранжированием и бюджетом токенов. Выполняется синхронно.
Тело запроса — SearchMemoriesRequest
| Поле | Тип | Обязательно | Описание |
|---|---|---|---|
query | string | Да | Текст запроса |
filters | object | Да | Фильтры (scope + составные условия) |
top_k | integer | Нет | Количество результатов (1–200, по умолчанию 20) |
token_budget | integer | Нет | Лимит токенов в результатах |
threshold | number | Нет | Минимальный порог сходства (0–1, по умолчанию 0.1) |
explain | boolean | Нет | Включить детали оценок score_details |
show_expired | boolean | Нет | Показывать истёкшие записи (по умолчанию false) |
reference_date | string или integer | Нет | Якорь для темпорального ранжирования |
Фильтры
Минимум один entity-скоуп обязателен (agent_id или
run_id). user_id доступен только для admin/compliance.
{
"AND": [
{"agent_id": "procurement-assistant-v1"},
{"categories": {"in": ["preferences"]}}
]
}Ответ 200 — SearchMemoriesResponse
{
"results": [
{
"id": "uuid",
"memory": "Предпочитает отчёты в формате xlsx",
"categories": ["preferences"],
"score": 0.91,
"score_details": {
"semantic": 0.93,
"bm25": 0.88
},
"created_at": "2026-07-01T10:12:00Z",
"valid_from": "2026-07-01"
}
],
"tokens_returned": 312
}Пример
POST /v1/memories/search
{
"query": "в каком формате присылать отчёт",
"filters": {
"AND": [
{"agent_id": "procurement-assistant-v1"},
{"categories": {"in": ["preferences"]}}
]
},
"top_k": 20,
"token_budget": 4000
}
→ 200 OK
{
"results": [...],
"tokens_returned": 312
}GET /v1/memories — Список памяти
Возвращает список фактов по фильтрам. Обязателен минимум один скоуп.
Параметры запроса
| Поле | Тип | Обязательно | Описание |
|---|---|---|---|
agent_id | string | Нет | Идентификатор агента |
run_id | string | Нет | Идентификатор запуска |
top_k | integer | Нет | Максимум записей (1–1000, по умолчанию 100) |
page | integer | Нет | Номер страницы (по умолчанию 1) |
page_size | integer | Нет | Размер страницы (1–100, по умолчанию 100) |
show_expired | boolean | Нет | Показывать истёкшие записи (по умолчанию false) |
categories | array | Нет | Фильтр по категориям |
Ответ 200 — ListMemoriesResponse
{
"count": 42,
"next": "https://api.example.com/v1/memories?page=2",
"previous": null,
"results": [
{
"id": "uuid",
"memory": "Предпочитает отчёты в формате xlsx",
"agent_id": "procurement-assistant-v1",
"created_at": "2026-07-01T10:12:00Z"
}
]
}GET /v1/memories/memory_id — Одна запись
Возвращает одну запись памяти по идентификатору.
Параметры пути
| Поле | Тип | Обязательно | Описание |
|---|---|---|---|
memory_id | string | Да | UUID записи памяти |
Ответ 200 — MemoryItem
{
"id": "uuid",
"memory": "Предпочитает отчёты в формате xlsx",
"user_id": "user-123",
"agent_id": "procurement-assistant-v1",
"categories": ["preferences"],
"score": null,
"hash": "sha256-...",
"created_at": "2026-07-01T10:12:00Z",
"updated_at": "2026-07-02T14:30:00Z",
"role": "user"
}PUT /v1/memories/memory_id — Изменить запись
Изменяет текст или метаданные существующей записи.
Тело запроса — UpdateMemoryRequest
| Поле | Тип | Обязательно | Описание |
|---|---|---|---|
text | string | Нет | Новый текст факта |
metadata | object | Нет | Новые метаданные |
expiration_date | string или null | Нет | Новая дата окончания срока; null — снять |
Ответ 200 — MemoryItem
DELETE /v1/memories/memory_id — Удалить запись
Удаляет одну запись (soft-delete).
Параметры запроса
| Поле | Тип | Обязательно | Описание |
|---|---|---|---|
delete_linked | boolean | Нет | Удалить связанные записи (по умолчанию false) |
Ответ 200 — DeleteMemoryResponse
{
"message": "Memory deleted successfully"
}DELETE /v1/memories — Удалить по фильтру
Удаляет все записи, соответствующие фильтру. Используется для реализации права на забвение.
Параметры запроса
| Поле | Тип | Обязательно | Описание |
|---|---|---|---|
user_id | string | Нет | Идентификатор субъекта (из JWT) |
agent_id | string | Нет | Идентификатор агента |
run_id | string | Нет | Идентификатор запуска |
Ответ 200 — DeleteAllMemoriesResponse
{
"message": "All relevant memories deleted",
"deleted_count": 5,
"confirmation_id": "uuid"
}GET /v1/memories/memory_id/history — История записи
Возвращает историю изменений одной записи памяти.
Параметры пути
| Поле | Тип | Обязательно | Описание |
|---|---|---|---|
memory_id | string | Да | UUID записи памяти |
Ответ 200 — MemoryHistoryResponse
[
{
"id": "uuid",
"memory_id": "uuid",
"old_memory": "Отчёты в PDF",
"new_memory": "Отчёты в xlsx",
"event": "UPDATE",
"created_at": "2026-07-02T14:30:00Z",
"is_deleted": false
}
]GET /v1/events/event_id — Статус события
Возвращает статус асинхронной обработки добавления памяти.
Параметры пути
| Поле | Тип | Обязательно | Описание |
|---|---|---|---|
event_id | string | Да | UUID события |
Ответ 200 — EventResponse
{
"event_id": "uuid",
"status": "SUCCEEDED",
"memory_ids": ["uuid-1", "uuid-2"],
"created_at": "2026-07-01T10:00:00Z",
"updated_at": "2026-07-01T10:00:05Z"
}Статусы: PENDING, SUCCEEDED, FAILED.
При FAILED возвращается поле error.
POST /v1/sessions/session_id/state — Сохранить состояние сессии
Сохраняет рабочую память / чекпоинт сессии.
Тело запроса — PutSessionStateRequest
| Поле | Тип | Обязательно | Описание |
|---|---|---|---|
state | object или string | Да | Прозрачный чекпоинт (JSON или base64) |
agent_id | string | Нет | Идентификатор агента |
run_id | string | Нет | Идентификатор запуска |
ttl_seconds | integer | Нет | Время жизни (60–2592000, по умолчанию 86400) |
Ответ 200 — SessionStateResponse
{
"session_id": "uuid",
"state": {"key": "value"},
"updated_at": "2026-07-01T10:00:00Z",
"ttl_remaining_seconds": 82800
}GET /v1/sessions/session_id/state — Восстановить состояние сессии
Восстанавливает рабочую память / чекпоинт сессии.
Параметры запроса
| Поле | Тип | Обязательно | Описание |
|---|---|---|---|
agent_id | string | Нет | Идентификатор агента |
Ответ 200 — SessionStateResponse
Ответ 404 — Error — состояние не найдено