Приклади / Mesh-мережа

Шеринг GPU без облікових даних

У друга є GPU. Вам потрібна модель. Він генерує invite. Ви скануєте QR-код. Без передачі API-ключів. Без налаштування сервера.

mesh (для guest конфіг не потрібен)

Проблема

Ви хочете користуватися LLM, але не маєте GPU. У вашого колеги є потужна машина з llama.cpp. Як скористатися його моделлю?

  • Поділитися API-ключами → небезпечно, складно відкликати, без аудиту
  • Підняти Ollama / vLLM server → Docker, firewall rules, конфігурація endpoint, затримки
  • Використати proxy → ще один сервіс у підтримці, ще одна точка відмови

Кожен наявний варіант або відкриває облікові дані, або вимагає інфраструктурної роботи. Має бути кращий спосіб.

Підхід QueryMT

Mesh-мережа QueryMT дозволяє вузлам ділитися LLM-провайдерами без передачі API-ключів. Host запускає свої провайдери як завжди. Guest підключається через підписаний invite-токен. Chat-повідомлення проходять мережею, а облікові дані — ні.

HOST (GPU-сервер)

qmtcode --mesh \
--mesh-invite="Team GPU" \
--invite-uses=5

Генерує QR-код і invite URL.
API-ключ лишається тут.
GUEST (ноутбук)

qmtcode --mesh-join=TOKEN

Скануйте QR або вставте URL.
Агент автоматично знаходить провайдери через DHT.
API-ключ не потрібен.

Модель безпеки

У цьому й полягає головна інновація. Ось що саме відбувається на рівні протоколу:

Host-машина

ProviderHostActor
Локально запускає LLM. Зберігає API-ключ.

API Key: заблокований тут
Invite: ed25519-підписаний grant
Usage: відстежується для кожного invite
ChatMessage →← Response
Guest-машина

MeshChatProvider
Проксіює chat-запити на host.

API Key: немає
Token: перевіряється offline (без мережі)
Discovery: DHT auto-find
Мережею проходять лише chat-повідомлення

Агент guest-вузла надсилає host-вузлу ChatMessage. Host запускає його через свій локальний провайдер із API-ключем. Потім повертається відповідь. Guest ніколи не бачить, не торкається і не потребує API-ключа. Токен перевіряється offline за допомогою ed25519-підписів — без виклику до центрального сервера.

Життєвий цикл invite

1. Згенерувати invite
Host запускає: qmtcode --mesh --mesh-invite="Team GPU" --invite-uses=5 --invite-ttl=7d
Це створює ed25519-підписаний grant на 5 використань, який спливає за 7 днів.
2. Поділитися invite
Термінал host-а показує:
• QR-код (можна сканувати телефоном)
• A URL: qmt://mesh/join/BASE64TOKEN
• Можна передати будь-який із них guest-у
3. Guest приєднується
Guest запускає: qmtcode --mesh-join=qmt://mesh/join/BASE64TOKEN
Токен перевіряється offline за публічним ключем host-а. Без мережевого виклику до центрального сервера.
4. Прозоре виявлення
Агент guest-вузла знаходить провайдер llama_cpp через Kademlia DHT. Маршрутизація працює прозоро — у конфігу guest-а не потрібно вказувати адресу host-а. Воно просто працює.
5. Відстеження використання
Host бачить у dashboard статистику: скільки разів кожен invite використали, ким і коли.
6. Відкликання
Щоб відкликати доступ: видаліть invite_id з InviteStore на host-і. Ефект миттєвий. API-ключі обертати не треба.

Як працює виявлення

Для mesh-рівня QueryMT використовує libp2p із двома режимами виявлення:

  • mDNS (LAN): автоматично знаходить peers у тій самій мережі. Нуль конфігу. Працює в офісах, вдома, у кав'ярнях.
  • Kademlia DHT (internet): знаходить peers у різних мережах. Invite-токени містять peer ID host-а. DHT резолвить його в адресу.

Guest не потрібно знати IP-адресу або порт host-а. Потрібен лише invite-токен. Mesh сам виконує маршрутизацію.

Конфіг guest-а

Guest не потрібен спеціальний конфіг. Достатньо auto_fallback = true у mesh-налаштуваннях. Коли агент guest-а потребує провайдера, якого немає локально, він звертається до mesh.

# Guest: просто приєднайтесь і користуйтеся
qmtcode --mesh-join=qmt://mesh/join/BASE64TOKEN

# І все. Агент автоматично знаходить віддалені провайдери.
# Для guest-а конфіг-файл не потрібен.

Ключові можливості

  • ProviderHostActor / MeshChatProvider — host запускає LLM, guest прозоро проксіює
  • Підписані invite-grant-и — ed25519-підписи, offline-перевірка
  • Кодування QR-кодом — діліться invite-ами наживо через сканування
  • DHT auto-discovery — без ручної конфігурації endpoint
  • Usage limits + TTL — кожен invite має max use count і строк дії
  • Відкликання окремого invite — можна видалити один invite без впливу на інші
  • Ізоляція облікових даних — API-ключі ніколи не залишають host-машину

Спробуйте самі

# Термінал 1: Host (машина з GPU)
cargo run --example qmtcode --features dashboard -- \
  --mesh --mesh-invite="Demo" --invite-uses=5 --dashboard

# Термінал 2: Guest (будь-яка машина в тій самій мережі)
cargo run --example qmtcode --features dashboard -- \
  --mesh-join=qmt://mesh/join/<TOKEN_FROM_HOST> --dashboard

# Dashboard guest-а покаже llama_cpp-провайдер host-а
# Поставте guest-агенту будь-яке запитання — воно піде на модель host-а