Примеры / 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 grants — 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-а
# Задайте любой вопрос — запрос уйдет на модель host-а