Контекст диалога на Mastra Memory вместо своей таблицы

- Контекст диалога хранит Mastra Memory (LibSQL, memory.db рядом с DB_PATH), тред на чат
- Бюджет истории — messageHistory.maxTokens (CONTEXT_TOKEN_LIMIT, по умолчанию 12000)
- ToolCallFilter: результаты инструментов не попадают в прошлые реплики, внутри ответа — только свежий шаг
- Системный промпт стабилен для всего чата (кешируется провайдером); автор и упоминания — в <turn author_name>
- Фото передаются через context и не сохраняются в памяти
- maxSteps и maxOutputTokens (ANSWER_TOKEN_LIMIT) — в defaultOptions агента
- /context и /clear работают через Memory recall/deleteThread
- Удалены свои dialog_messages, dialog-repository и dialog-service

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
yunogasai
2026-09-24 20:55:06 +02:00
parent b8f09227b0
commit b615518f22
19 changed files with 464 additions and 179 deletions

View File

@@ -0,0 +1,30 @@
import { LibSQLStore } from "@mastra/libsql";
import { Memory } from "@mastra/memory";
import { ensureParentDir } from "../../libs/db.js";
interface AssistantMemoryOptions {
path: string;
/** Бюджет токенов на весь промпт: сверх него Mastra срезает самые старые реплики диалога. */
maxTokens: number;
}
/**
* Контекст диалога с ботом — Mastra Memory: тред на каждый чат, только история сообщений.
* Архив переписки чата живёт отдельно (SQLite бота) и читается инструментами.
*/
export const createAssistantMemory = ({ path, maxTokens }: AssistantMemoryOptions): Memory => {
ensureParentDir(path);
return new Memory({
storage: new LibSQLStore({ id: "boltun-memory", url: `file:${path}` }),
options: {
messageHistory: { maxTokens },
semanticRecall: false,
workingMemory: { enabled: false },
generateTitle: false,
},
});
};
/** Один тред на чат: вопросы разных админов и ответы бота — общий диалог (шаблон Mastra для групповых чатов). */
export const chatThreadId = (chatId: number): string => `chat:${chatId}`;