Перша тримовна локальна пам'ять та граф знань для ШІ-агентів розробки, що встановлюється автоматично. Заощаджуйте до 60% вашого бюджету на ключі доступу (токени), надаючи вашому ШІ-помічнику постійний, супершвидкий та зв'язаний мозок.
Уявіть, що ви працюєте з ШІ-кодинг-асистентом (як-от Claude Code, Gemini CLI, Cursor або Codex). Щоразу, коли ви починаєте нову сесію, ШІ все забуває. Він забуває ваші архітектурні рішення, правила оформлення коду, те, як ви виправили той складний баг з базою даних, або навіть ваші особисті уподобання в коді. Вам доводиться пояснювати все спочатку або згодовувати ШІ величезні файли, що забирає ваш час та марно витрачає ключі доступу (токени), коштуючи вам реальних грошей.
Turbo Quant Memory вирішує це раз і назавжди. Це локальний Model Context Protocol (MCP) сервер, який дає вашим ШІ-агентам постійний мозок. Він зберігає:
- 🎯 Рішення та уроки: Чому речі були побудовані саме так, щоб ШІ не зламав їх при наступних правках.
- 💡 Шаблони та підводні камені (Gotchas): Багаторазові трюки та перевірені виправлення помилок.
- 🕸️ Графові зв'язки знань: Структуровані зв'язки між нотатками пам'яті, файлами коду, завданнями чи багами.
- 📦 Індекс кодової бази: Компактний пошук по Markdown-блоках, завдяки якому ШІ миттєво розуміє структуру вашого проекту.
Замість того, щоб щоразу зчитувати величезні файли, ваш ШІ-агент використовує Компактне вилучення (Compact Retrieval), роблячи запити до своєї пам'яті та отримуючи лише надважливі 600-токенні резюме.
| Показник | Значення | Перевага для Вас |
|---|---|---|
| Економія контексту | 📉 ~83.79% менше байт | Менше витрат на токени, довший контекст |
| Затримка пошуку | ⚡ ~400 мс | Достатньо швидко для дефолтного retrieval-шляху (разом з ембедингом на CPU) |
| Архітектурний фокус | 🎯 Dynamic Pruning | ШІ бачить лише важливе, ігнорує сесійний шум |
| Зв'язність знань | 🕸️ Knowledge Graph | ШІ розуміє зв'язки між кодом, тасками та рішеннями |
| Самоочищення графу | 🔄 Dynamic Lifecycle | Неактуальні зв'язки видаляються або маркуються застарілими |
Вам не потрібно вводити команди в терміналі чи налаштовувати конфігураційні файли JSON. Нехай ваш ШІ-помічник зробить усе сам!
Просто скопіюйте посилання на цей репозиторій:
https://github.com/Lexus2016/turbo_quant_memory
І надішліть цей текст вашому ШІ-агенту (Claude Code, Gemini CLI, Codex тощо):
"Привіт! Будь ласка, встанови та налаштуй мені сервер розумної пам'яті Turbo Quant Memory для моєї робочої області за допомогою цього репозиторію: https://github.com/Lexus2016/turbo_quant_memory. Прочитай README.uk.md, виконай 'Інструкції для ШІ-агентів' у самому низу файлу, щоб встановити пакет через
uv tool, зареєструвати MCP-серверtqmemory, запустити перевірку здоров'я, проіндексувати цей проект та налаштувати нашу постійну пам'ять. Повідом мені, коли все буде готово!"
Ваш ШІ-агент автоматично клонує, встановить, зареєструє та проіндексує все за вас!
Якщо ви віддаєте перевагу ручному налаштуванню, виконайте цей 60-секундний процес:
-
Встановіть CLI-інструмент:
uv tool install git+https://github.com/Lexus2016/turbo_quant_memory@v0.18.0
-
Додайте MCP-сервер
tqmemoryу ваш клієнт:# Codex codex mcp add tqmemory -- turbo-memory-mcp serve # Gemini CLI gemini mcp add tqmemory turbo-memory-mcp serve # Claude Code (масштаб проекту) claude mcp add --scope project tqmemory -- turbo-memory-mcp serve
-
Перезапустіть ваш клієнт і насолоджуйтесь магією!
Для кастомних інтеграцій (Cursor, OpenCode, Antigravity тощо) див. CLIENT_INTEGRATIONS.uk.md.
Кожен запит шукає у векторному просторі (семантичний зміст) і в текстовому індексі BM25 FTS (точні збіги: імена функцій, шляхи, ідентифікатори). Провідним є векторний канал: якщо його найкращий збіг впевнений — він повертається напряму; інакше канал BM25 додається через Reciprocal Rank Fusion (RRF, k=60) як знижений за вагою рятувальний. Це vector-first гейтування виміряно перевершило рівне RRF на реальних багатомовних корпусах (шумний текстовий канал більше не тягне впевнений семантичний збіг донизу). Якщо канал дає збій, пошук м'яко переходить на лише-векторний.
Ви можете створювати зв'язки між нотатками, файлами, завданнями чи багами за допомогою спрямованих зв'язків. Сервер пам'яті автоматично збагачує результати пошуку та гідрації цими зв'язками, дозволяючи ШІ легко орієнтуватися в асоціативному контексті коду.
- Старіння та синхронізація: Зв'язки мають часову мітку
created_atта динамічно успадковують статус сутностей. Якщо пов'язана нотатка старіє і позначається як застаріла черезdeprecate_note(), весь зв'язаний шлях графу розумно маркується застарілим для ШІ-агентів. - Гнучке керування (Розрив зв'язків): Будь-який зв'язок можна легко видалити або розірвати за допомогою інструменту
unlink_entities(). Це дозволяє гнучко адаптувати пам'ять до змін в архітектурі. - Автодіагностика: Під час запуску
lint_knowledge_base()система автоматично перевіряє цілісність графу, виявляючи "осиротілі" зв'язки та допомагаючи запобігти накопиченню застарілого сміття в асоціативній пам'яті моделі.
graph TD
A[ШІ-Агент / Запит] -->|1. semantic_search| B[tqmemory Server]
B -->|2. Векторний індекс| C[Dense Vector Search]
B -->|2. Текстовий індекс| D[BM25 FTS Search]
C -->|3. Злиття результатів RRF| E[Кандидати знань]
D -->|3. Злиття результатів RRF| E
E -->|4. Декорування зв'язками| F[Knowledge Graph / Асоціації]
F -->|5. Збагачений контекст| A
subgraph Життєвий цикл зв'язків
G[Створення зв'язку: link_entities] -->|Еволюція знань| H[Застарівання нотатки: deprecate_note]
H -->|Діагностика: lint_knowledge_base| I[Розірвати зв'язок: unlink_entities]
end
Нотатки розділені на логічні рівні (tiers):
durable(довговічна): рішення, архітектурні шаблони, уроки.episodic(епізодична): передача контексту сесій, щоденний прогрес.reference(довідкова): Markdown-блоки, посилання на файли.
Пошук за замовчуванням повертає лише рівні durable + reference, щоб епізодичний шум сесій не заважав важливим архітектурним рішенням!
За замовчуванням ембедер працює на PyTorch. На слабкій машині (напр. ~2 ГБ RAM) ту саму багатомовну модель можна запустити через ONNX Runtime — це прибирає важкий слід PyTorch заради значно меншого обсягу памʼяті, без зміни якості й без переіндексації (вектори лишаються сумісними).
pip install 'turbo-memory-mcp[onnx]'
export TQMEMORY_EMBEDDING_BACKEND=fastembed # за замовчуванням: sentence-transformersСтандартна інсталяція не змінюється — це суто опційно.
Кожна нотатка фіксує, хто її створив: human-explicit, коли ти прямо просиш агента щось запамʼятати («запамʼятай це», «закинь у базу знань»), або agent, коли агент сам зберігає урок чи рішення. Позначеним людиною нотаткам більше довіри — вони ранжуються вище за створені агентом за рівної релевантності (детермінований tie-breaker плюс невеликий бонус до оцінки). Поле опційне й зворотно-сумісне: наявні нотатки просто читаються як agent, тож міграція не потрібна.
Повнотекстова лінія BM25 розбиває текст за межами слів Unicode, з приведенням до нижнього регістру та згортанням діакритики, тож українські, російські та інші не-англійські точні слова вже знаходяться (незалежно від регістру й діакритики) — кирилиця ніколи не псується. Чого один індекс не вміє — це стемити кілька мов водночас. За замовчуванням стемиться англійська; для кирилично-домінантної інсталяції стемер можна перемкнути:
export TQMEMORY_FTS_LANGUAGE=Russian # за замовчуванням: EnglishРосійський стемінг додатково знаходить словоформи кирилиці (документ ↔ документами, а також багато спільних українських суфіксів) — ціною англійського стемінгу, бо LanceDB застосовує один стемер на індекс. Окремого стемера Snowball для української немає, тож Russian — найближчий варіант; непідтримуване значення безпечно відкочується на English із попередженням. Зміна набуває чинності після перебудови FTS-індексу (скидання + переіндексація), як і зміна моделі вбудовувань — а словоформи в будь-якому разі вже покриває семантично щільна векторна лінія.
Набридло вставляти SSH-ключі, рядки підключення до БД чи API-токени у кожен новий чат? Сховище секретів вирішує цю проблему — не забираючи у вас жодного контролю над вашими даними.
Агенти раз за разом просили один і той самий prod-DB DSN, той самий staging SSH-хост, той самий bearer-токен — щосесії. Звичайна project-пам'ять для цього не підходить: усе, що індексується, потенційно може виплисти у результатах пошуку. Тому Phase 9 додає окреме, зашифроване, виключно project-scope сховище поруч із вашими нотатками.
- Чотири нових MCP-інструменти:
set_secret,get_secret,list_secrets,delete_secret. Кількість tools зростає з14до18. - Одноразова міграція створює порожню директорію
secrets/для кожного існуючого проєкту при першому викликуturbo-memory-mcp migrate --applyпісля оновлення.
- Ваші існуючі нотатки, markdown-індекс,
semantic_search,hydrateіlint_knowledge_baseповодяться байт-у-байт ідентично. Оновлення їх не торкається. - Сховище opt-in. Якщо ви ніколи не викликаєте
set_secret, на диску лежить лише порожній 28-байтний зашифрований blob на проєкт. Нульовий вплив. - Якщо вам ця функція не потрібна — просто ігноруйте чотири нові tools назавжди, нічого не зламається.
- На вашій машині, зашифровано at-rest:
~/.turbo-quant-memory/projects/<project_id>/secrets/vault.tqv, AES-256-GCM, per-project майстер-ключ. - Ніде більше: дерево
src/цього пакету містить нуль outbound-HTTP коду — жоднихrequests,httpx,urllib.request, raw-сокетів. Нам нікуди передавати ваші секрети, навіть якби ми захотіли. (Перевірте самі:grep -rE 'requests|httpx|urllib\.request|aiohttp' src/— чисто.) - Ніколи у вашому retrieval-індексі: ingestion-walker і lint-walker hard-refuse будь-яку підпапку
secrets/.semantic_searchне може дотягтись до vault'а за дизайном. - Ніколи у транскриптах агента (при правильному використанні):
get_secretповертає значення у виділеному поліsecret_value, окремо від описового тексту. Агентам інструктовано пропускати його програмно, не друкуючи.
- Одноразове налаштування майстер-ключа (оберіть один шлях):
# macOS (auto-Keychain після першого set_secret, якщо ви пропустите цей крок): keyring set turbo-quant-memory secrets-master-<project_id> <32-byte-base64> # Headless / Linux / CI / Docker: export TQMEMORY_SECRETS_PASSPHRASE='your-long-passphrase' # додайте у shell rc
- Зберегли один раз, користуєтесь усюди — два шляхи, обираються за тим, чи значення вже у чаті:
- Значення ще НЕ у чаті — CLI (prophylactic path):
Значення читається через
turbo-memory-mcp secret-set prod-db-dsn # prompt: Value for 'prod-db-dsn' (input hidden): ******getpass— воно ніколи не потрапляє у shell-історію, scrollback або чат-транскрипт. Рекомендовано, коли ви тільки збираєтесь задати свіжий credential і хочете тримати його повністю поза розмовою. - Значення вже у чаті — нехай агент пише (reactive path):
Використовуйте щоразу, коли значення вже видиме: ви його вставили, або агент сам згенерував всередині розмови. Агент детерміновано розв'язує активний
set_secret("prod-db-dsn", "postgresql://user:pass@host:5432/db")project_idзcwd— це краще, ніж просити користувача передруковувати значення в терміналі, де його cwd може не збігатися з потрібним проєктом. Після того як expozицію зроблено у чаті, CLI не дає додаткової секретності;set_secret— безпечніший write-шлях.
- Значення ще НЕ у чаті — CLI (prophylactic path):
- Агенти дістають за потребою:
get_secret("prod-db-dsn") → {"status": "ok", "secret_value": "postgresql://..."}
Захищаємо (реалістичні загрози для single-developer-машини):
- Випадкові витоки через бекап (Time Machine, rsync, iCloud Desktop sync plaintext-файлів).
- Share-screen / скриншоти зі збереженою credential на екрані.
- Випадковий
git addне того файла з вашої home-директорії.
Не захищаємо (і не претендуємо):
- Скомпрометований root-користувач на вашому ноутбуці.
- Live-атакер, який вже захопив запущений daemon-процес.
- Hardware-атаки, evil-maid, cold-boot.
Якщо ваша threat-модель ширша — використовуйте спеціалізований secret-manager (1Password, HashiCorp Vault), а tqmemory залиште для знань.
- "Чи постраждає моя існуюча пам'ять?" Ні. Нотатки, markdown, search, hydrate, lint — без змін.
- "Чи треба щось робити при оновленні?" Тільки якщо хочете почати користуватися
set_secret. Інакше — ігноруйте. - "Де саме зберігаються секрети?" Per project, під
~/.turbo-quant-memory/projects/<project_id>/secrets/(зашифрований blob + мінімальна метадата + audit-log timestamp'ів без значень). - "Чи можуть мої секрети просочитися у
semantic_search?" Ні. Жорстка ізоляція enforce'иться в ingester і linter; регресійний тест із sentinel'ом перевіряє, що search повертає нуль hit'ів. - "Що, якщо я взагалі не хочу цю функцію?" Її вже й немає — vault порожній, доки ви його не заповните. Нічого не запущено, нічого не передається, нічого не заплановано.
- "Що, якщо я видалю проєкт?" Його vault, audit-log і per-project майстер-ключ лежать усередині директорії проєкту і зникають разом із нею.
Important
УВАГА ШІ-АГЕНТУ (Claude, Gemini, Codex або Antigravity):
Тобі доступний MCP-сервер tqmemory. Це твоя довготривала пам'ять. Прочитай і суворо дотримуйся цих інструкцій для безперешкодної інтеграції та ефективного вилучення знань.
- Перевірка міграцій та здоров'я: Виклич
health()таserver_info(). Якщоmigrations_pending(уhealth) абоmigrations.pending(уserver_info) дорівнюєtrue, виведи користувачу повідомленняmigrations_hintдослівно, щоб він міг запустити оновлення через CLI. Не запускайmigrate --applyсамостійно, оскільки це вимагає закриття активних MCP-клієнтів. - Продовж з місця зупинки: На старті сесії — або одразу після стиснення контексту — спершу виклич
recent_context(). Це bootstrap без запиту: повертає найсвіжіші нотатки (новіші перші), включно з нотаткамиhandoff, які звичайнийsemantic_searchза замовчуванням приховує. Це надійна точка входу «де я зупинився», коли ти ще не знаєш, що шукати. - Отримання контексту: Для конкретної задачі виконай
semantic_search(query="<тема_задачі>", scope="hybrid")для отримання раніше збережених архітектурних рішень, правил оформлення коду, уроків чи інструкцій. Щоб дістати handoff запитом, передайtier_filter=["episodic"].
Коли ти дізнаєшся щось важливе, виправляєш складний баг або приймаєш архітектурне рішення — негайно збережи це за допомогою remember_note(). Не чекай кінця сесії.
- Уроки (
kind="lesson"): Зберігай виправлення багів або виявлені корисні закономірності. - Рішення (
kind="decision"): Зберігай вибір технологій, бібліотек чи структурних рішень. - Шаблони (
kind="pattern"): Зберігай шаблони проектування, стилістичні правила чи конвенції коду. - Контекст сесії (
kind="handoff"): Зберігай епізодичний прогрес перед завершенням або паузою в роботі (автоматично записується в рівеньepisodic).
Нотатки, позначені користувачем: коли користувач ПРЯМО просить щось запам'ятати («запам'ятай це», «закинь у базу знань»), виклич remember_note(..., provenance="human-explicit"). Нотатки, які ти пишеш із власної ініціативи, лишають типове provenance="agent" — позначені людиною нотатки ранжуються вище за створені агентом за рівної релевантності.
Пиши нотатки англійською мовою (Identifiers/code). Роби їх лаконічними, технічними та практичними. Додавай семантичні теги.
Використовуй графові зв'язки для асоціації ідей, файлів та завдань:
- Після збереження нотатки про виправлення багу у файлі
src/auth.pyвикличlink_entities(source="note:[note_id]", target="file:///absolute/path/to/src/auth.py", relation_type="fixes"). - Зв'язуй пов'язані нотатки:
link_entities(source="note:[new_note]", target="note:[old_note]", relation_type="supersedes")(замінює). - Зв'язуй файли із завданнями:
link_entities(source="file:///path/to/file", target="task:[task_id]", relation_type="implements").
- Застарівання знань: Коли шаблон чи рішення змінюється, запиши нову нотатку, а стару поміть як застарілу за допомогою
deprecate_note(), щоб уникнути плутанини при майбутніх пошуках. - Жодних сміттєвих нотаток: Не записуй тимчасові або тестові спогади.
- Походження (Provenance): Завжди зберігай шляхи до файлів та номери рядків у метаданих твоїх записів.
- Розкривай, не вгадуй: Шукай правильний виклик
get_secret(name)черезsemantic_searchзаpattern-нотаткою-рецептом, що документує credential. Ніколи не виловлюй імена з історії чату. - Діставай через виділене поле:
get_secret("name")повертає значення уsecret_value. Передавай його програмно (env-injection, аргумент підпроцесу). НЕ дублюй його у summary, логи,remember_note. - Пиши те, що користувач уже передав тобі: якщо користувач вставив credential у чат (або ти сам згенерував його у розмові) — просто виклич
set_secret(name, value). Ти знаєш точний активнийproject_idчерез cwd resolution; користувач, що запускає CLI у терміналі, не завжди. НЕ відсилай користувача знову до CLI, щоб переробити те, що уже зроблено — expozицію він зробив тоді, коли надрукував; фрикція її не відмінить. - Тягнись до CLI тільки як до prevention: якщо користувач лише ЗБИРАЄТЬСЯ поділитись credential, але ще не вставив — пропонуй
turbo-memory-mcp secret-set NAMEз терміналу: getpass тримає значення поза чатом. Після того як значення уже у чаті, CLI — це фрикція без виграшу. - Помилку
master_key_unavailableвіддавай дослівно: відповідь містить полеsetup_hintз точнимиexport/keyring setкомандами, потрібними користувачу. Виведи їх, після чого зупинись — ключі не вигадуй.
Hermes запускає MCP-сервери через systemd-керований шлюз — це інший підхід, ніж Claude Code або Cursor.
uv tool install turbo-quant-memoryДодай до ~/.hermes/config.yaml:
mcp_servers:
tqmemory:
command: turbo-memory-mcp
args: ["serve"]
enabled: trueПерезапусти шлюз:
systemctl --user restart hermes-gatewayЯкщо MCP-інструменти видають таймаут "MCP call timed out after 120.0s" — скоріше за все, блокування демона зависло після попереднього крашу або сну хоста. Відновлення:
# 1. Завершити всі процеси демона
pkill -f turbo-memory-mcp
# 2. Видалити завислий lock-файл
rm -f ~/.turbo-quant-memory/.daemon.lock
# 3. Перевірити та застосувати міграції
turbo-memory-mcp migrate --status
turbo-memory-mcp migrate --apply
# 4. Швидка діагностика
turbo-memory-mcp doctor
# 5. Перезапустити шлюз
systemctl --user restart hermes-gateway
# 6. Зачекати 30-60с для повторного підключення MCPВстанови TQMEMORY_MIGRATE_ON_STARTUP=1 у середовищі, щоб сервер автоматично застосовував очікувані міграції (з роллінг-знімком) при старті у ролі primary або standalone:
mcp_servers:
tqmemory:
command: turbo-memory-mcp
args: ["serve"]
enabled: true
env:
TQMEMORY_MIGRATE_ON_STARTUP: "1"Результат авто-міграції видно у відповіді health() у полі migration_auto_result.
| Симптом | Причина | Виправлення |
|---|---|---|
| MCP-таймаут | Завислий .daemon.lock |
rm -f ~/.turbo-quant-memory/.daemon.lock |
| Кілька демонів | Краш залишив сироти | pkill -f turbo-memory-mcp |
| Інструменти повертають помилки | Очікуються міграції схеми | turbo-memory-mcp migrate --apply |
| Шлюз не завантажує MCP | Помилка синтаксису config | Перевірити config.yaml |
| Тихий збій старту | Немає видимості ролі демона | Перевірити stderr: [tqmemory] role=... |
Ця документація підтримується у трьох синхронізованих версіях:
- 🇺🇸 English README
- 🇺🇦 Ukrainian README
- 🇷🇺 Russian README