Gonka GitHub Discussions · Discussion #869

GiP #860 — Inference Quality Protocol: Semantic Inference Optimization

Отдельная страница дискуссии с русским переводом и параллельным режимом RU / Original с точным сопоставлением предложений.

Как пользоваться: включите RU / Original и кликните по предложению — соответствующее предложение в другой колонке доскроллится и подсветится.
Discussion #869

GiP #860 — Inference Quality Protocol: Semantic Inference Optimization

Оригинал: GiP #860 — Inference Quality Protocol: Semantic Inference Optimization

Mayveskii avatar
MayveskiiАвтор
2026-03-06

Фон

Это обсуждение представляет собой проектный документ, предшествующий реализации. PR [#859 (https://github.com/gonka-ai/gonka/pull/859)] (семантический кеш) — это первая веха реализации; он существует для проверки гипотезы об инфраструктуре, а не для определения всей системы. Здесь определена вся система.

Согласно процессу проверки @akup (https://github.com/akup), описанному в [#856 (https://github.com/gonka-ai/gonka/pull/856)] и [#802 (https://github.com/gonka-ai/gonka/discussions/802)]: сначала проектируйте, затем кодируйте. Этот GiP и является тем этапом проектирования. PR [#859 (https://github.com/gonka-ai/gonka/pull/859)] строго ограничен тем, что обосновывает этот документ на этапе 0.

PR [#859 (https://github.com/gonka-ai/gonka/pull/859)] представляет CacheQualityWeight — вознаграждение за повторное использование кеша. Это работающая реализация, но ее область действия намеренно ограничена: она решает одну часть более крупной проблемы.

В этом обсуждении предлагается, что представляет собой эта более крупная проблема, как она связана со всем, что уже есть в протоколе, и как выглядит полное решение.

Пробел: качество не имеет протокольного представления

Сеть Gonka имеет строгую экономическую модель вычислений: Proof-of-Compute измеряет генерацию nonce, проверяет ее на всех узлах и преобразует в вес эпохи. Каждый узел понимает, оптимизирует и стимулирует PoC.

Качество вывода — был ли ответ полезным, точным, своевременным или соответствующим типу запроса — не имеет эквивалентного протокольного представления. Он невидим для цепи.

Это не критика. Это естественный этап развития. PoC необходимо было приземлиться первым (см. [#856 (https://github.com/gonka-ai/gonka/pull/856)], [#821 (https://github.com/gonka-ai/gonka/issues/821)]). Но по мере роста сети отсутствие качественного сигнала приводит к предсказуемым отказам:

  • Закон Гудхарта — любая отдельная метрика становится целью и перестает измерять то, что должна была измерять. CacheQualityWeight, основанный исключительно на reuseCount, будет управляться маршрутизацией, а не улучшением качества.
  • Слепота маршрутизации — GetRandomExecutor распределяет трафик равномерно независимо от того, какой узел лучше справляется с какой задачей. Узел, специализирующийся на генерации кода, получает тот же трафик, что и узел, оптимизированный для трансляции.
  • Нет пути обратной связи — участники, отправляющие запросы на вывод, не имеют возможности сообщить, был ли результат полезен. Их опыт не улучшает протокол.
  • Разногласия разработчиков — у разработчиков, интегрирующих Gonka, нет встроенных в протокол рекомендаций о том, как структурировать запросы для получения наилучших результатов, какую модель использовать для какой задачи или как измерять собственное качество вывода с течением времени.

Измерено на основе данных сети в реальном времени (эпохи 161–191, 2 503 595 выводов):

Составной показатель качества = 0,7236 (6 измеренных осей, 4 прогнозируемых) Ключевые узкие места: L8 Постоянство задержки: балл 0,32 (CV = 0,68, σ = 876 мс — высокая дисперсия) L0 Стабильность вычислений: балл 0,65 (CV = 0,35 — вес снизился на 60 % от пиковой до минимума) L6 Повторное использование (совместное): балл 0,00 (M=571 → hit_rate ≈ 0) L4 Полезность: не измеряется — механизма не существует.

Разрыв в качестве измерим. Путь улучшения поддается количественной оценке.

Что предлагает этот GiP

Контролируемая руководством многомерная система измерения качества и маршрутизации, поэтапно построенная на основе инфраструктуры PR [#859 (https://github.com/gonka-ai/gonka/pull/859)].

Он состоит из двух взаимосвязанных компонентов:

1 — Реестр оси качества (измерение)

Десять осей, каждая из которых активируется независимо с помощью весов управления:

Суммарный балл:

QualityScore = Σ(wi × Li) — веса являются параметрами управления.

Реестр является аддитивным. Ничего не сломается, если вес равен нулю. Оси активируются, когда руководство решает, что измерения достаточно надежны, чтобы повлиять на вознаграждение.

2 — Оптимизация семантического вывода (маршрутизация + опыт разработчика)

По мере того, как протокол накапливает завершенные выводы, он строит семантическую карту шаблонов выполнения: какие типы задач на каких узлах выполняются успешно, какие модели лучше всего обрабатывают какие архетипы запросов, как выглядят задержка и скорость выполнения в зависимости от специализации.

Эта карта позволяет сделать две вещи:

Сторона протокола (DAPI):

  • GetQualityWeightedExecutor заменяет GetRandomExecutor.
  • Потоки трафика пропорциональны QualityScore, а не равномерны.
  • Узлы, специализирующиеся на определенном типе задач, привлекают больше трафика → более высокая частота обращений → более высокий CacheQualityWeight → больше вознаграждений → более глубокая специализация.

Цикл экономический, а не административный

Сторона разработчика/участника:

  • GET /v1/models/profiles — предоставляет центроиды специализации узла и показатели качества.
  • Заголовки ответов: X-Suggested-Model, X-Task-Archetype, X-Quality-Score.
  • Разработчики узнают, какую модель использовать для своей рабочей нагрузки, на основе данных протокола, а не методом проб и ошибок.
  • Протокол становится центром знаний, а не просто диспетчером вычислений.

Это не быстрая модификация. Протокол не меняет то, что отправляют пользователи. Он предоставляет метаданные: «для этого типа запроса вот что, как известно сети, работает». Разработчики и клиенты действуют на основе этой информации добровольно.

Почему это не на грани осуществимости

Технические примитивы проверены, внедрены и находятся в производстве по всей отрасли:

Инфраструктуры от PR [#859 (https://github.com/gonka-ai/gonka/pull/859)] достаточно для этапов 0–4. Для этапов 5–7 требуются дополнительные конечные точки и клиентская библиотека (обсуждается ниже).

Измеренные доказательства

Все числа воспроизводятся из общедоступных конечных точек. Никакие личные данные не используются.

Базовая линия сети (gonka.gg/api/public, эпохи 161–191):

Выводы: всего 2 503 595 (в среднем 75 016 в эпоху) Участники: 109–197 в эпоху Промахи: 3,25 % (биномиальный тест: k = 81 360 << критическое 251 140, α = 0,05 → PASS) Завершение: среднее 90,4 %, диапазон 72–99 %, σ = 7,4 %

Живой вывод (proxy.gonka.gg, Qwen3-235B, 16 запросов):

Задержка без потока: среднее значение = 1280 мс, σ = 876 мс, CV = 0,68 ← узкое место первичного качества Точность потока: 8/8 SSE [DONE] получено (100%) мс/выходной токен: среднее 154 мс

Множитель специализации:

M=571 (Qwen3-32B, общий): hit_rate = 0,000473 M=12 (QwQ-32B, low-M): hit_rate = 0,0225 → 47,6× улучшение M=1 (уникальная модель): hit_rate = 0,27 → 571× улучшение

Экономическое обоснование специализации является математическим, а не умозрительным.

Моделирование маршрутизации:

Гипотезы (все ДОКАЗАННЫЕ на основе измеренных данных):

Возможно многоосное измерение качества → 6/10 осей измеряются из работающей сети

Специализация повышает качество → множитель 47,6× доказан математически из топологии

  • В протоколе отсутствует петля обратной связи по качеству → L4/L5 сегодня не имеют механизма протокола.

Маршрутизация с учетом качества улучшает экономику сети → доказано моделированием маршрутизации

Дорожная карта реализации

Фаза 7 — это продукт, ориентированный на разработчиков, а не предложение протокола. Он находится в отдельном репозитории под эгидой Gonka Labs. Протокол (этапы 0–6) предоставляет данные и конечные точки; SDK делает их эргономичными. Разделение их означает:

  • Протокол может развиваться со скоростью протокола (управление, безопасность, консенсус).
  • SDK может поставляться в темпе разработки (выпуски еженедельные, разрешены критические изменения).
  • Сторонние SDK (плагин LangChain, серверная часть маршрутизатора LiteLLM, сервер MCP) могут независимо создаваться на одних и тех же конечных точках фазы 6.

Стратегия инструментов разработчика (объем этапа 7)

Пробел сегодня: у разработчиков, интегрирующих Gonka, нет стандартного шаблона. Они пишут необработанные HTTP-вызовы, выбирают модели вручную, не имеют информации о качестве вывода и не получают указаний от протокола о том, как улучшить свою рабочую нагрузку.

SDK заполняет этот пробел, используя инфраструктуру, которая появится у протокола после этапа 6.

Что включает в себя SDK

Конечные точки протокола (этап 6): POST /v1/chat/completions Совместимость с OpenAI (существующий, proxy.gonka.gg) GET /v1/models/profiles Показатели качества + центроиды специализации (этап 6) POST /v1/chat/completions X-Inference-Feedback: заголовок +1/-1 (этап 3) Заголовки ответов (этап 6): X-Quality-Score: 0,82 Оценка качества узла для этого запроса X-Предлагаемая модель: Qwen/QwQ-32B Лучшая модель для этого типа задачи X-Task-Archetype: проверка кода Обнаруженная категория задач X-Cache: HIT/MISS Результат кэширования (фаза 0)

Разработка SDK (TypeScript/Python)

TypeScript (вставка на основе Axios, совместимая с OpenAI-SDK):

импортировать {GonkaClient} из "@gonka-labs/sdk"; const client = новый GonkaClient ({apiKey:process.env. GONKA_API_KEY, baseURL: "https://proxy.gonka.gg/v1",qualityFeedback: true, // автоматическая отправка X-Inference-Feedback на основе ответа autoRoute: true, // выбор модели из /v1/models/profiles для типа задачи }) ; константный ответ = ожидание клиента. чат . доработки. create ( { messages : [ { role : "user" , content : "review this code: ..." } ], // модель не требуется: SDK определяет архетип задачи → направляет к QwQ-32B, если код задачи } ); // SDK присоединяет метаданные качества к объекту ответа: console. журнал (ответ. качество. оценка); // 0.82 консоль. журнал (ответ. качество. предложенная модель); // Консоль «Qwen/QwQ-32B». журнал (ответ. качество. кэшХит); // ложь

Python (на основе httpx, добавление для пакета openai):

из gonka import GonkaClient client = GonkaClient (api_key = os. environ ["GONKA_API_KEY"], auto_route = True,quality_feedback = True,) ответ = client. чат . доработки. create ( messages = [{ "role" : "user" , "content" : "translate to French: ..." }], # SDK направляет к специализированному узлу перевода через /v1/models/profiles ) print (response .quality ) # QualityMetadata(score=0.91, cache_hit=True, latency_ms=340)

Чего это достигает

  • Разработчики сразу же получают выводы о лучших практиках, не читая документацию по протоколам.
  • Каждый запрос SDK отправляет X-Inference-Feedback, улучшая данные L4 для всех узлов.
  • Выбор модели определяется данными о качестве протокола, а не догадками.

Частота попаданий в кэш увеличивается, поскольку autoRoute концентрирует трафик на специализированных узлах (↑ M→1)

  • Цикл обратной связи по качеству замыкается: SDK → сигнал L4 → GetQualityWeightedExecutor → лучшая маршрутизация → более высокий показатель качества → SDK сообщает о лучших результатах → цикл

Связь с существующими шаблонами с открытым исходным кодом

Gonka SDK не является новым архитектурным изобретением — он следует устоявшимся шаблонам. Что делает его специфичным для Gonka, так это то, что сигналы маршрутизации и качества поступают из реестра качества внутри цепочки, а не из централизованной службы. Это отличительная черта.

Расширение прототипа (фаза 1)

Расширьте CacheQualityEpochSummary дополнительными осями:

message CacheQualityEpochSummary { // существующие поля 1–7 (PR #859) uint32complete_rate_bps = 8 ; // L9: MsgFinish / (MsgFinish + MsgMiss + MsgInvalidate) uint32 avg_latency_ms = 9; // L8: средняя задержка запроса uint32 latency_stddev_ms = 10; // L8: σ(latency) — сигнал согласованности uint32stream_fidelity_bps = 11 ; // L7: SSE Done_chunks / total_chunks × 10000 int64 Feedback_score_sum = 12 ; // L4: Σ сигналы обратной связи (+1/-1) int64 Feedback_count = 13 ; // L4: количество сигналов обратной связи в эту эпоху }

Параметры веса управления (новые поля в CacheQualityParams):

// axis_weights[i] — вес Ли в базисных пунктах. Сумма должна быть равна 10000. // По умолчанию: [1000,1000,1500,1000,1000,500,1000,1000,1000,1000] повторенный uint32 axis_weights = 8; // max_cache_entries ограничивает рост InMemoryCacheStore. // По умолчанию: 50000. При 1,5 КБ/запись: пик ~75 МБ. Требуется для производственных узлов. uint64 max_cache_entries = 9;

Ограничение масштаба (честно)

В настоящее время InMemoryCacheStore не имеет ограничения на количество участников. В масштабе основной сети (75 000 выводов/эпоху, 384-мерные встраивания, MaxCacheAgeEpochs=10): пик ~1,15 ГБ ОЗУ и O(75 000) косинусного сканирования на запрос.

Параметр управления max_cache_entries (фаза 1) ограничивает это. При N=50 000: пик ~75МБ, сканирование O(50К) — приемлемо на любом современном узле. Вызов EvictExpired на каждой границе эпохи сохраняет ограничение хранилища во времени.

Связанная работа

  • PR [feat(semantic-cache): конвейер качества L2 — уровень адаптивной когерентности + замыкание цикла концентратора [без дополнительного графического процессора] #859 (https://github.com/gonka-ai/gonka/pull/859)] — инфраструктура семантического кэша (от этого зависит это обсуждение)
  • PR [ [P2] Ak Issue554 Исправлен бесплатный вывод № 703 (https://github.com/gonka-ai/gonka/pull/703) ] — бесплатное исправление безопасности вывода (предварительное условие слияния для feat(semantic-cache): конвейер качества L2 — уровень адаптивной когерентности + замыкание цикла концентратора [без дополнительного графического процессора] # 859 (https://github.com/gonka-ai/gonka/pull/859) )
  • PR [ Feature/821 Continuous PoC Complete #856 (https://github.com/gonka-ai/gonka/pull/856) ] — Continuous PoC Complete ([Проектирование непрерывного PoC + реализация #821 (https://github.com/gonka-ai/gonka/issues/821)]): непосредственно проверяет ось L0. ContinuousPoC теперь представляет собой действующую инфраструктуру; Измерение качества (L0: стабильность вычислений, измеренное CV=0,35) лежит на вершине этого фундамента. Выбор времени выбран намеренно: сначала выполняется PoC, затем следует уровень качества.
  • PR [Улучшения производительности StartInference и FinishInference # 812 (https://github.com/gonka-ai/gonka/pull/812) ] — производительность StartInference/FinishInference (снижает стоимость горячего пути для каждого вывода, включая HIT кэша)
  • PR [[P2] Fix/784 безопасность ошибок атомарности фонда #789 (https://github.com/gonka-ai/gonka/pull/789) ] — исправление атомарности фонда: ось L2 (правильность) отслеживает уровень аннулирования. Исправления атомарности уменьшают число ложных признаний недействительными, улучшая базовый показатель L2.
  • GiP [Экспортер Prometheus для мониторинга узлов № 840 (https://github.com/gonka-ai/gonka/discussions/840)] — Экспортер Prometheus: /admin/v1/cache/stats является источником A в предложенном там треугольнике перекрестной проверки из трех источников.
  • GiP [Gonka Node Manager — автоматическое развертывание, обновление и мониторинг узлов #816 (https://github.com/gonka-ai/gonka/discussions/816)] — Node Manager: стандарт развертывания k8s, который максимизирует частоту попадания в кэш за счет специализации модели (M=1 на узел)
  • Обсуждение [Непрерывный PoC #802 (https://github.com/gonka-ai/gonka/discussions/802)] — процесс, ориентированный на проектирование: этот GiP явно следует этому процессу.
  • Проблема [Исследование пропущенных выводов на некоторых узлах (основные причины + устранение) № 820 (https://github.com/gonka-ai/gonka/issues/820)] — пропущенные выводы: оси L2 (правильность) и L9 (степень завершения) непосредственно количественно определяют основную причину
  • Проблема [тесты LogInfo в тестовой сети для StartInference и FinishInference #839 (https://github.com/gonka-ai/gonka/issues/839)] — log_format=json: уменьшение задержки в 3 раза; необходимое условие для честных измерений базовой линии L8 (согласованность задержки)

Открытые вопросы для сообщества

  • Управление весом: кто предлагает начальные значения axis_weights? Каков процесс внесения поправок при добавлении новой оси?

Управление весом: кто предлагает начальные значения axis_weights? What's the amendment process when a new axis is added?

  • Стимул обратной связи L4: следует ли вознаграждать участников (даже номинально) за отправку отзывов? Без стимулов принятие будет низким.

Стимул обратной связи L4: следует ли вознаграждать участников (даже номинально) за отправку отзывов? Без стимулов принятие будет низким.

  • Вебхук для разработчиков L5: согласие или отказ по умолчанию? Какова модель конфиденциальности данных о результатах?

Вебхук для разработчиков L5: согласие или отказ по умолчанию? Какова модель конфиденциальности данных о результатах?

  • Объем SDK: должна ли Фаза 7 быть проектом Gonka Labs или репозиторием, принадлежащим сообществу? Какова модель управления самим SDK?

Объем SDK: должна ли Фаза 7 быть проектом Gonka Labs или репозиторием, принадлежащим сообществу? Какова модель управления самим SDK?

  • max_cache_entries по умолчанию: 50 000 является консервативным. Существует ли предпочтительная граница, основанная на ожидаемых профилях оборудования узла?

max_cache_entries по умолчанию: 50 000 является консервативным. Существует ли предпочтительная граница, основанная на ожидаемых профилях оборудования узла?

  • Интеграция ContinuousPoC: должен ли ContinuousPoCEpochSummary.efficient_poc_weight быть частью расчета оси L0 или оставаться отдельной дорожкой PoC? ( @akup (https://github.com/akup) , @Mayveski (https://github.com/Mayveski) )

Интеграция ContinuousPoC: должен ли ContinuousPoCEpochSummary.efficient_poc_weight быть частью расчета оси L0 или оставаться отдельной дорожкой PoC? ( @akup (https://github.com/akup) , @Mayveski (https://github.com/Mayveski) )

Полный проектный документ с оценками, моделированием маршрутизации и матрицей сценариев: docs/specs/inference-quality-protocol.md в ветке PR [#859 (https://github.com/gonka-ai/gonka/pull/859)].

gmorgachev avatar
gmorgachevMaintainerMaintainer
2026-03-06
Качество вывода — был ли ответ полезным, точным, своевременным или соответствующим типу запроса — не имеет эквивалентного протокольного представления. Он невидим для цепи.

Качество ответа (с точки зрения точности LLM) является частью самой модели безопасности: управление точно определяет, какие модели обслуживаются, а перекрестная проверка проверяет это. Сам процесс проверки требует некоторого улучшения, но идея состоит в том, чтобы гарантировать одинаковое качество от всех участников явно, а не путем обратной связи.

Слепота маршрутизации — GetRandomExecutor распределяет трафик равномерно независимо от того, какой узел лучше справляется с какой задачей. Узел, специализирующийся на генерации кода, получает тот же трафик, что и узел, оптимизированный для трансляции.

То же самое: оно распределялось только между работниками, которые служили точно такой же модели. Хозяин не может сам выбрать другой вариант

Идея измерения производительности в целом — хорошее направление. Но я чувствую, что нынешнее предложение не учитывает то, как сеть работает сейчас.

Mayveskii avatar
2026-03-08

РЭ

@gmorgachev (https://github.com/gmorgachev) Спасибо, обращаясь к каждому пункту:

1. Качество ответа (точность LLM) и модель безопасности. Мы не заменяем управление или перекрестную проверку. Они по-прежнему определяют, какие модели разрешены, и проверяют идентичные результаты. В GiP #860 (https://github.com/gonka-ai/gonka/discussions/860) оси L0–L2 (стабильность вычислений, доступность, корректность) — это именно то, что уже есть в цепочке (RTV, валидация, стабильность веса). L4 (полезность) и L5 (результат) — это дополнительные сигналы сверху: «был ли этот результат полезен?» или «задача решена», а не замена «все участники возвращают одинаковый результат для одной и той же модели».

2. Маршрутизация и «хост не может выбрать другую модель» Согласен: хост не выбирает модель. В #869 (https://github.com/gonka-ai/gonka/discussions/869) GetQualityWeightedExecutor предназначен для работы внутри одной и той же модели: запрос уже привязан к модели (как сегодня), а вес влияет только на то, какой узел из тех, кто обслуживает эту модель, получит запрос. Таким образом, трафик по-прежнему осуществляется только между работниками одной и той же модели; изменение заключается в том, что «среди них выберите вариант с лучшими L6/L8/L9 (повторное использование, задержка, завершение) для этой модели».

3. «Предложение не учитывает то, как работает цепочка сейчас» В PR #859 (https://github.com/gonka-ai/gonka/pull/859) CacheQualityWeight вшит в существующий поток: он добавляется в baseCount там же, где вес PoC (module/chainvalidation.go, расчет). Никакого второго пути расчета — просто дополнительный член в той же формуле. Фазы 0–6 в #869 (https://github.com/gonka-ai/gonka/discussions/869) основаны на этом: расширить прототип (поля 8–13), сообщить L7/L8 в QualityReporter, проанализировать X-Inference-Feedback, маршрутизировать по качеству между исполнителями для одной и той же модели. Таким образом, мы явно строим поверх текущей логики цепочки, а не рядом с ней.

Что уже сделано: Мы проверили гипотезу #860 (https://github.com/gonka-ai/gonka/discussions/860) на реальной настройке: gonkalabs/gonka-agent (семантический кеш, два участника, разные рабочие области). R-3 в docs/testing.md показывает, что участник Б получает частичное попадание (0,79) из кеша А — тот же домен (гонка Go), другая структура. Это сценарий «один участник структурирует запросы → другой извлекает выгоду из кэша» из этого GiP; Измеряются повторное использование L6 и сэкономленное время. Промежуточное программное обеспечение L6/L8/L9 + X-Inference-Feedback находится в gonkalabs/opengnk. Таким образом, предложение не только на бумаге — оно реализуется по пути агент → прокси → сеть, сохраняя при этом текущую цепочку и поведение модели маршрутизации.

Русский перевод
Mayveskii avatar
MayveskiiАвтор
2026-03-06

Фон

Это обсуждение представляет собой проектный документ, предшествующий реализации. PR [#859 (https://github.com/gonka-ai/gonka/pull/859)] (семантический кеш) — это первая веха реализации; он существует для проверки гипотезы об инфраструктуре, а не для определения всей системы. Здесь определена вся система.

Согласно процессу проверки @akup (https://github.com/akup), описанному в [#856 (https://github.com/gonka-ai/gonka/pull/856)] и [#802 (https://github.com/gonka-ai/gonka/discussions/802)]: сначала проектируйте, затем кодируйте. Этот GiP и является тем этапом проектирования. PR [#859 (https://github.com/gonka-ai/gonka/pull/859)] строго ограничен тем, что обосновывает этот документ на этапе 0.

PR [#859 (https://github.com/gonka-ai/gonka/pull/859)] представляет CacheQualityWeight — вознаграждение за повторное использование кеша. Это работающая реализация, но ее область действия намеренно ограничена: она решает одну часть более крупной проблемы.

В этом обсуждении предлагается, что представляет собой эта более крупная проблема, как она связана со всем, что уже есть в протоколе, и как выглядит полное решение.

Пробел: качество не имеет протокольного представления

Сеть Gonka имеет строгую экономическую модель вычислений: Proof-of-Compute измеряет генерацию nonce, проверяет ее на всех узлах и преобразует в вес эпохи. Каждый узел понимает, оптимизирует и стимулирует PoC.

Качество вывода — был ли ответ полезным, точным, своевременным или соответствующим типу запроса — не имеет эквивалентного протокольного представления. Он невидим для цепи.

Это не критика. Это естественный этап развития. PoC необходимо было приземлиться первым (см. [#856 (https://github.com/gonka-ai/gonka/pull/856)], [#821 (https://github.com/gonka-ai/gonka/issues/821)]). Но по мере роста сети отсутствие качественного сигнала приводит к предсказуемым отказам:

  • Закон Гудхарта — любая отдельная метрика становится целью и перестает измерять то, что должна была измерять. CacheQualityWeight, основанный исключительно на reuseCount, будет управляться маршрутизацией, а не улучшением качества.
  • Слепота маршрутизации — GetRandomExecutor распределяет трафик равномерно независимо от того, какой узел лучше справляется с какой задачей. Узел, специализирующийся на генерации кода, получает тот же трафик, что и узел, оптимизированный для трансляции.
  • Нет пути обратной связи — участники, отправляющие запросы на вывод, не имеют возможности сообщить, был ли результат полезен. Их опыт не улучшает протокол.
  • Разногласия разработчиков — у разработчиков, интегрирующих Gonka, нет встроенных в протокол рекомендаций о том, как структурировать запросы для получения наилучших результатов, какую модель использовать для какой задачи или как измерять собственное качество вывода с течением времени.

Измерено на основе данных сети в реальном времени (эпохи 161–191, 2 503 595 выводов):

Составной показатель качества = 0,7236 (6 измеренных осей, 4 прогнозируемых) Ключевые узкие места: L8 Постоянство задержки: балл 0,32 (CV = 0,68, σ = 876 мс — высокая дисперсия) L0 Стабильность вычислений: балл 0,65 (CV = 0,35 — вес снизился на 60 % от пиковой до минимума) L6 Повторное использование (совместное): балл 0,00 (M=571 → hit_rate ≈ 0) L4 Полезность: не измеряется — механизма не существует.

Разрыв в качестве измерим. Путь улучшения поддается количественной оценке.

Что предлагает этот GiP

Контролируемая руководством многомерная система измерения качества и маршрутизации, поэтапно построенная на основе инфраструктуры PR [#859 (https://github.com/gonka-ai/gonka/pull/859)].

Он состоит из двух взаимосвязанных компонентов:

1 — Реестр оси качества (измерение)

Десять осей, каждая из которых активируется независимо с помощью весов управления:

Суммарный балл:

QualityScore = Σ(wi × Li) — веса являются параметрами управления.

Реестр является аддитивным. Ничего не сломается, если вес равен нулю. Оси активируются, когда руководство решает, что измерения достаточно надежны, чтобы повлиять на вознаграждение.

2 — Оптимизация семантического вывода (маршрутизация + опыт разработчика)

По мере того, как протокол накапливает завершенные выводы, он строит семантическую карту шаблонов выполнения: какие типы задач на каких узлах выполняются успешно, какие модели лучше всего обрабатывают какие архетипы запросов, как выглядят задержка и скорость выполнения в зависимости от специализации.

Эта карта позволяет сделать две вещи:

Сторона протокола (DAPI):

  • GetQualityWeightedExecutor заменяет GetRandomExecutor.
  • Потоки трафика пропорциональны QualityScore, а не равномерны.
  • Узлы, специализирующиеся на определенном типе задач, привлекают больше трафика → более высокая частота обращений → более высокий CacheQualityWeight → больше вознаграждений → более глубокая специализация.

Цикл экономический, а не административный

Сторона разработчика/участника:

  • GET /v1/models/profiles — предоставляет центроиды специализации узла и показатели качества.
  • Заголовки ответов: X-Suggested-Model, X-Task-Archetype, X-Quality-Score.
  • Разработчики узнают, какую модель использовать для своей рабочей нагрузки, на основе данных протокола, а не методом проб и ошибок.
  • Протокол становится центром знаний, а не просто диспетчером вычислений.

Это не быстрая модификация. Протокол не меняет то, что отправляют пользователи. Он предоставляет метаданные: «для этого типа запроса вот что, как известно сети, работает». Разработчики и клиенты действуют на основе этой информации добровольно.

Почему это не на грани осуществимости

Технические примитивы проверены, внедрены и находятся в производстве по всей отрасли:

Инфраструктуры от PR [#859 (https://github.com/gonka-ai/gonka/pull/859)] достаточно для этапов 0–4. Для этапов 5–7 требуются дополнительные конечные точки и клиентская библиотека (обсуждается ниже).

Измеренные доказательства

Все числа воспроизводятся из общедоступных конечных точек. Никакие личные данные не используются.

Базовая линия сети (gonka.gg/api/public, эпохи 161–191):

Выводы: всего 2 503 595 (в среднем 75 016 в эпоху) Участники: 109–197 в эпоху Промахи: 3,25 % (биномиальный тест: k = 81 360 << критическое 251 140, α = 0,05 → PASS) Завершение: среднее 90,4 %, диапазон 72–99 %, σ = 7,4 %

Живой вывод (proxy.gonka.gg, Qwen3-235B, 16 запросов):

Задержка без потока: среднее значение = 1280 мс, σ = 876 мс, CV = 0,68 ← узкое место первичного качества Точность потока: 8/8 SSE [DONE] получено (100%) мс/выходной токен: среднее 154 мс

Множитель специализации:

M=571 (Qwen3-32B, общий): hit_rate = 0,000473 M=12 (QwQ-32B, low-M): hit_rate = 0,0225 → 47,6× улучшение M=1 (уникальная модель): hit_rate = 0,27 → 571× улучшение

Экономическое обоснование специализации является математическим, а не умозрительным.

Моделирование маршрутизации:

Гипотезы (все ДОКАЗАННЫЕ на основе измеренных данных):

Возможно многоосное измерение качества → 6/10 осей измеряются из работающей сети

Специализация повышает качество → множитель 47,6× доказан математически из топологии

  • В протоколе отсутствует петля обратной связи по качеству → L4/L5 сегодня не имеют механизма протокола.

Маршрутизация с учетом качества улучшает экономику сети → доказано моделированием маршрутизации

Дорожная карта реализации

Фаза 7 — это продукт, ориентированный на разработчиков, а не предложение протокола. Он находится в отдельном репозитории под эгидой Gonka Labs. Протокол (этапы 0–6) предоставляет данные и конечные точки; SDK делает их эргономичными. Разделение их означает:

  • Протокол может развиваться со скоростью протокола (управление, безопасность, консенсус).
  • SDK может поставляться в темпе разработки (выпуски еженедельные, разрешены критические изменения).
  • Сторонние SDK (плагин LangChain, серверная часть маршрутизатора LiteLLM, сервер MCP) могут независимо создаваться на одних и тех же конечных точках фазы 6.

Стратегия инструментов разработчика (объем этапа 7)

Пробел сегодня: у разработчиков, интегрирующих Gonka, нет стандартного шаблона. Они пишут необработанные HTTP-вызовы, выбирают модели вручную, не имеют информации о качестве вывода и не получают указаний от протокола о том, как улучшить свою рабочую нагрузку.

SDK заполняет этот пробел, используя инфраструктуру, которая появится у протокола после этапа 6.

Что включает в себя SDK

Конечные точки протокола (этап 6): POST /v1/chat/completions Совместимость с OpenAI (существующий, proxy.gonka.gg) GET /v1/models/profiles Показатели качества + центроиды специализации (этап 6) POST /v1/chat/completions X-Inference-Feedback: заголовок +1/-1 (этап 3) Заголовки ответов (этап 6): X-Quality-Score: 0,82 Оценка качества узла для этого запроса X-Предлагаемая модель: Qwen/QwQ-32B Лучшая модель для этого типа задачи X-Task-Archetype: проверка кода Обнаруженная категория задач X-Cache: HIT/MISS Результат кэширования (фаза 0)

Разработка SDK (TypeScript/Python)

TypeScript (вставка на основе Axios, совместимая с OpenAI-SDK):

импортировать {GonkaClient} из "@gonka-labs/sdk"; const client = новый GonkaClient ({apiKey:process.env. GONKA_API_KEY, baseURL: "https://proxy.gonka.gg/v1",qualityFeedback: true, // автоматическая отправка X-Inference-Feedback на основе ответа autoRoute: true, // выбор модели из /v1/models/profiles для типа задачи }) ; константный ответ = ожидание клиента. чат . доработки. create ( { messages : [ { role : "user" , content : "review this code: ..." } ], // модель не требуется: SDK определяет архетип задачи → направляет к QwQ-32B, если код задачи } ); // SDK присоединяет метаданные качества к объекту ответа: console. журнал (ответ. качество. оценка); // 0.82 консоль. журнал (ответ. качество. предложенная модель); // Консоль «Qwen/QwQ-32B». журнал (ответ. качество. кэшХит); // ложь

Python (на основе httpx, добавление для пакета openai):

из gonka import GonkaClient client = GonkaClient (api_key = os. environ ["GONKA_API_KEY"], auto_route = True,quality_feedback = True,) ответ = client. чат . доработки. create ( messages = [{ "role" : "user" , "content" : "translate to French: ..." }], # SDK направляет к специализированному узлу перевода через /v1/models/profiles ) print (response .quality ) # QualityMetadata(score=0.91, cache_hit=True, latency_ms=340)

Чего это достигает

  • Разработчики сразу же получают выводы о лучших практиках, не читая документацию по протоколам.
  • Каждый запрос SDK отправляет X-Inference-Feedback, улучшая данные L4 для всех узлов.
  • Выбор модели определяется данными о качестве протокола, а не догадками.

Частота попаданий в кэш увеличивается, поскольку autoRoute концентрирует трафик на специализированных узлах (↑ M→1)

  • Цикл обратной связи по качеству замыкается: SDK → сигнал L4 → GetQualityWeightedExecutor → лучшая маршрутизация → более высокий показатель качества → SDK сообщает о лучших результатах → цикл

Связь с существующими шаблонами с открытым исходным кодом

Gonka SDK не является новым архитектурным изобретением — он следует устоявшимся шаблонам. Что делает его специфичным для Gonka, так это то, что сигналы маршрутизации и качества поступают из реестра качества внутри цепочки, а не из централизованной службы. Это отличительная черта.

Расширение прототипа (фаза 1)

Расширьте CacheQualityEpochSummary дополнительными осями:

message CacheQualityEpochSummary { // существующие поля 1–7 (PR #859) uint32complete_rate_bps = 8 ; // L9: MsgFinish / (MsgFinish + MsgMiss + MsgInvalidate) uint32 avg_latency_ms = 9; // L8: средняя задержка запроса uint32 latency_stddev_ms = 10; // L8: σ(latency) — сигнал согласованности uint32stream_fidelity_bps = 11 ; // L7: SSE Done_chunks / total_chunks × 10000 int64 Feedback_score_sum = 12 ; // L4: Σ сигналы обратной связи (+1/-1) int64 Feedback_count = 13 ; // L4: количество сигналов обратной связи в эту эпоху }

Параметры веса управления (новые поля в CacheQualityParams):

// axis_weights[i] — вес Ли в базисных пунктах. Сумма должна быть равна 10000. // По умолчанию: [1000,1000,1500,1000,1000,500,1000,1000,1000,1000] повторенный uint32 axis_weights = 8; // max_cache_entries ограничивает рост InMemoryCacheStore. // По умолчанию: 50000. При 1,5 КБ/запись: пик ~75 МБ. Требуется для производственных узлов. uint64 max_cache_entries = 9;

Ограничение масштаба (честно)

В настоящее время InMemoryCacheStore не имеет ограничения на количество участников. В масштабе основной сети (75 000 выводов/эпоху, 384-мерные встраивания, MaxCacheAgeEpochs=10): пик ~1,15 ГБ ОЗУ и O(75 000) косинусного сканирования на запрос.

Параметр управления max_cache_entries (фаза 1) ограничивает это. При N=50 000: пик ~75МБ, сканирование O(50К) — приемлемо на любом современном узле. Вызов EvictExpired на каждой границе эпохи сохраняет ограничение хранилища во времени.

Связанная работа

  • PR [feat(semantic-cache): конвейер качества L2 — уровень адаптивной когерентности + замыкание цикла концентратора [без дополнительного графического процессора] #859 (https://github.com/gonka-ai/gonka/pull/859)] — инфраструктура семантического кэша (от этого зависит это обсуждение)
  • PR [ [P2] Ak Issue554 Исправлен бесплатный вывод № 703 (https://github.com/gonka-ai/gonka/pull/703) ] — бесплатное исправление безопасности вывода (предварительное условие слияния для feat(semantic-cache): конвейер качества L2 — уровень адаптивной когерентности + замыкание цикла концентратора [без дополнительного графического процессора] # 859 (https://github.com/gonka-ai/gonka/pull/859) )
  • PR [ Feature/821 Continuous PoC Complete #856 (https://github.com/gonka-ai/gonka/pull/856) ] — Continuous PoC Complete ([Проектирование непрерывного PoC + реализация #821 (https://github.com/gonka-ai/gonka/issues/821)]): непосредственно проверяет ось L0. ContinuousPoC теперь представляет собой действующую инфраструктуру; Измерение качества (L0: стабильность вычислений, измеренное CV=0,35) лежит на вершине этого фундамента. Выбор времени выбран намеренно: сначала выполняется PoC, затем следует уровень качества.
  • PR [Улучшения производительности StartInference и FinishInference # 812 (https://github.com/gonka-ai/gonka/pull/812) ] — производительность StartInference/FinishInference (снижает стоимость горячего пути для каждого вывода, включая HIT кэша)
  • PR [[P2] Fix/784 безопасность ошибок атомарности фонда #789 (https://github.com/gonka-ai/gonka/pull/789) ] — исправление атомарности фонда: ось L2 (правильность) отслеживает уровень аннулирования. Исправления атомарности уменьшают число ложных признаний недействительными, улучшая базовый показатель L2.
  • GiP [Экспортер Prometheus для мониторинга узлов № 840 (https://github.com/gonka-ai/gonka/discussions/840)] — Экспортер Prometheus: /admin/v1/cache/stats является источником A в предложенном там треугольнике перекрестной проверки из трех источников.
  • GiP [Gonka Node Manager — автоматическое развертывание, обновление и мониторинг узлов #816 (https://github.com/gonka-ai/gonka/discussions/816)] — Node Manager: стандарт развертывания k8s, который максимизирует частоту попадания в кэш за счет специализации модели (M=1 на узел)
  • Обсуждение [Непрерывный PoC #802 (https://github.com/gonka-ai/gonka/discussions/802)] — процесс, ориентированный на проектирование: этот GiP явно следует этому процессу.
  • Проблема [Исследование пропущенных выводов на некоторых узлах (основные причины + устранение) № 820 (https://github.com/gonka-ai/gonka/issues/820)] — пропущенные выводы: оси L2 (правильность) и L9 (степень завершения) непосредственно количественно определяют основную причину
  • Проблема [тесты LogInfo в тестовой сети для StartInference и FinishInference #839 (https://github.com/gonka-ai/gonka/issues/839)] — log_format=json: уменьшение задержки в 3 раза; необходимое условие для честных измерений базовой линии L8 (согласованность задержки)

Открытые вопросы для сообщества

  • Управление весом: кто предлагает начальные значения axis_weights? Каков процесс внесения поправок при добавлении новой оси?

Управление весом: кто предлагает начальные значения axis_weights? What's the amendment process when a new axis is added?

  • Стимул обратной связи L4: следует ли вознаграждать участников (даже номинально) за отправку отзывов? Без стимулов принятие будет низким.

Стимул обратной связи L4: следует ли вознаграждать участников (даже номинально) за отправку отзывов? Без стимулов принятие будет низким.

  • Вебхук для разработчиков L5: согласие или отказ по умолчанию? Какова модель конфиденциальности данных о результатах?

Вебхук для разработчиков L5: согласие или отказ по умолчанию? Какова модель конфиденциальности данных о результатах?

  • Объем SDK: должна ли Фаза 7 быть проектом Gonka Labs или репозиторием, принадлежащим сообществу? Какова модель управления самим SDK?

Объем SDK: должна ли Фаза 7 быть проектом Gonka Labs или репозиторием, принадлежащим сообществу? Какова модель управления самим SDK?

  • max_cache_entries по умолчанию: 50 000 является консервативным. Существует ли предпочтительная граница, основанная на ожидаемых профилях оборудования узла?

max_cache_entries по умолчанию: 50 000 является консервативным. Существует ли предпочтительная граница, основанная на ожидаемых профилях оборудования узла?

  • Интеграция ContinuousPoC: должен ли ContinuousPoCEpochSummary.efficient_poc_weight быть частью расчета оси L0 или оставаться отдельной дорожкой PoC? ( @akup (https://github.com/akup) , @Mayveski (https://github.com/Mayveski) )

Интеграция ContinuousPoC: должен ли ContinuousPoCEpochSummary.efficient_poc_weight быть частью расчета оси L0 или оставаться отдельной дорожкой PoC? ( @akup (https://github.com/akup) , @Mayveski (https://github.com/Mayveski) )

Полный проектный документ с оценками, моделированием маршрутизации и матрицей сценариев: docs/specs/inference-quality-protocol.md в ветке PR [#859 (https://github.com/gonka-ai/gonka/pull/859)].

gmorgachev avatar
gmorgachevMaintainerMaintainer
2026-03-06
Качество вывода — был ли ответ полезным, точным, своевременным или соответствующим типу запроса — не имеет эквивалентного протокольного представления. Он невидим для цепи.

Качество ответа (с точки зрения точности LLM) является частью самой модели безопасности: управление точно определяет, какие модели обслуживаются, а перекрестная проверка проверяет это. Сам процесс проверки требует некоторого улучшения, но идея состоит в том, чтобы гарантировать одинаковое качество от всех участников явно, а не путем обратной связи.

Слепота маршрутизации — GetRandomExecutor распределяет трафик равномерно независимо от того, какой узел лучше справляется с какой задачей. Узел, специализирующийся на генерации кода, получает тот же трафик, что и узел, оптимизированный для трансляции.

То же самое: оно распределялось только между работниками, которые служили точно такой же модели. Хозяин не может сам выбрать другой вариант

Идея измерения производительности в целом — хорошее направление. Но я чувствую, что нынешнее предложение не учитывает то, как сеть работает сейчас.

Mayveskii avatar
2026-03-08

РЭ

@gmorgachev (https://github.com/gmorgachev) Спасибо, обращаясь к каждому пункту:

1. Качество ответа (точность LLM) и модель безопасности. Мы не заменяем управление или перекрестную проверку. Они по-прежнему определяют, какие модели разрешены, и проверяют идентичные результаты. В GiP #860 (https://github.com/gonka-ai/gonka/discussions/860) оси L0–L2 (стабильность вычислений, доступность, корректность) — это именно то, что уже есть в цепочке (RTV, валидация, стабильность веса). L4 (полезность) и L5 (результат) — это дополнительные сигналы сверху: «был ли этот результат полезен?» или «задача решена», а не замена «все участники возвращают одинаковый результат для одной и той же модели».

2. Маршрутизация и «хост не может выбрать другую модель» Согласен: хост не выбирает модель. В #869 (https://github.com/gonka-ai/gonka/discussions/869) GetQualityWeightedExecutor предназначен для работы внутри одной и той же модели: запрос уже привязан к модели (как сегодня), а вес влияет только на то, какой узел из тех, кто обслуживает эту модель, получит запрос. Таким образом, трафик по-прежнему осуществляется только между работниками одной и той же модели; изменение заключается в том, что «среди них выберите вариант с лучшими L6/L8/L9 (повторное использование, задержка, завершение) для этой модели».

3. «Предложение не учитывает то, как работает цепочка сейчас» В PR #859 (https://github.com/gonka-ai/gonka/pull/859) CacheQualityWeight вшит в существующий поток: он добавляется в baseCount там же, где вес PoC (module/chainvalidation.go, расчет). Никакого второго пути расчета — просто дополнительный член в той же формуле. Фазы 0–6 в #869 (https://github.com/gonka-ai/gonka/discussions/869) основаны на этом: расширить прототип (поля 8–13), сообщить L7/L8 в QualityReporter, проанализировать X-Inference-Feedback, маршрутизировать по качеству между исполнителями для одной и той же модели. Таким образом, мы явно строим поверх текущей логики цепочки, а не рядом с ней.

Что уже сделано: Мы проверили гипотезу #860 (https://github.com/gonka-ai/gonka/discussions/860) на реальной настройке: gonkalabs/gonka-agent (семантический кеш, два участника, разные рабочие области). R-3 в docs/testing.md показывает, что участник Б получает частичное попадание (0,79) из кеша А — тот же домен (гонка Go), другая структура. Это сценарий «один участник структурирует запросы → другой извлекает выгоду из кэша» из этого GiP; Измеряются повторное использование L6 и сэкономленное время. Промежуточное программное обеспечение L6/L8/L9 + X-Inference-Feedback находится в gonkalabs/opengnk. Таким образом, предложение не только на бумаге — оно реализуется по пути агент → прокси → сеть, сохраняя при этом текущую цепочку и поведение модели маршрутизации.

Оригинал
Mayveskii avatar
MayveskiiАвтор
2026-03-06

Background

This discussion is the design document that precedes implementation . PR [ #859 (https://github.com/gonka-ai/gonka/pull/859) ] (semantic cache) is the first implementation milestone; it exists to test the infrastructure hypothesis, not to define the full system. The full system is defined here.

Per the review process @akup (https://github.com/akup) outlined on [ #856 (https://github.com/gonka-ai/gonka/pull/856) ] and [ #802 (https://github.com/gonka-ai/gonka/discussions/802) ]: design first, then code. This GiP is that design step. PR [ #859 (https://github.com/gonka-ai/gonka/pull/859) ] is scoped strictly to what this document justifies in Phase 0.

PR [ #859 (https://github.com/gonka-ai/gonka/pull/859) ] introduces CacheQualityWeight — a reward for cache reuse. It is a working implementation, but deliberately scoped: it solves one part of a larger problem.

This discussion proposes what that larger problem is, how it connects to everything already in the protocol, and what the full solution looks like.

The gap: quality has no protocol representation

The Gonka network has a rigorous economic model for compute : Proof-of-Compute measures nonce generation, validates it across nodes, and converts it to epoch weight. Every node understands, optimizes for, and is incentivized by PoC.

Quality of inference — whether a response was useful, accurate, timely, or appropriate for the request type — has no equivalent protocol representation. It is invisible to the chain.

This is not a criticism. It is a natural stage of development. PoC needed to land first (see [ #856 (https://github.com/gonka-ai/gonka/pull/856) ], [ #821 (https://github.com/gonka-ai/gonka/issues/821) ]). But as the network grows, the absence of a quality signal creates predictable failure modes:

  • Goodhart's Law — any single metric becomes a target and ceases to measure what it was supposed to. CacheQualityWeight based solely on reuseCount would be gamed by routing, not by quality improvement.
  • Routing blindness — GetRandomExecutor distributes traffic uniformly regardless of which node is better at which task. A node specializing in code generation gets the same traffic as one optimized for translation.
  • No feedback path — participants sending inference requests have no way to signal whether the result was useful. Their experience does not improve the protocol.
  • Developer friction — developers integrating Gonka have no protocol-native guidance on how to structure requests for best results, which model to use for which task, or how to measure their own inference quality over time.

Measured from live network data (epochs 161–191, 2,503,595 inferences):

Composite QualityScore = 0.7236 (6 axes measured, 4 projected) Key bottlenecks: L8 Latency consistency: score 0.32 (CV = 0.68, σ = 876ms — high variance) L0 Compute stability: score 0.65 (CV = 0.35 — weight dropped 60% peak-to-trough) L6 Reuse (shared): score 0.00 (M=571 → hit_rate ≈ 0) L4 Usefulness: not measured — no mechanism exists

The quality gap is measurable. The improvement path is quantifiable.

What this GiP proposes

A governance-controlled, multi-dimensional quality measurement and routing framework , built incrementally on the infrastructure PR [ #859 (https://github.com/gonka-ai/gonka/pull/859) ] provides.

It has two interlocking components:

1 — Quality Axis Registry (measurement)

Ten axes, each independently activatable via governance weights:

Composite score:

QualityScore = Σ(wi × Li) — weights are governance parameters

The registry is additive. Nothing breaks if a weight is zero. Axes activate when governance decides the measurement is trustworthy enough to affect rewards.

2 — Semantic Inference Optimization (routing + developer experience)

As the protocol accumulates completed inferences, it builds a semantic map of execution patterns: which task types succeed on which nodes, which models handle which request archetypes best, what latency and completion rate look like per specialization.

This map enables two things:

Protocol side (DAPI):

GetQualityWeightedExecutor replaces GetRandomExecutor

Traffic flows proportional to QualityScore , not uniformly

  • Nodes specializing in a task type attract more of that traffic → higher hit rate → higher CacheQualityWeight → more rewards → deeper specialization

The loop is economic, not administrative

Developer / participant side:

GET /v1/models/profiles — exposes node specialization centroids and quality scores

Response headers: X-Suggested-Model , X-Task-Archetype , X-Quality-Score

Developers learn which model to use for their workload from protocol data, not from trial and error

The protocol becomes a knowledge hub, not just a compute dispatcher

This is not prompt modification. The protocol does not change what users send. It provides metadata: "for this type of request, here is what the network knows works." Developers and clients act on that information voluntarily.

Why this is not on the edge of feasibility

The technical primitives are proven, deployed, and in production across the industry:

The infrastructure from PR [ #859 (https://github.com/gonka-ai/gonka/pull/859) ] is sufficient for phases 0–4. Phases 5–7 require additional endpoints and a client library (discussed below).

Measured evidence

All numbers are reproducible from public endpoints. No private data used.

Network baseline (gonka.gg/api/public, epochs 161–191):

Inferences: 2,503,595 total (avg 75,016/epoch) Participants: 109–197/epoch Miss rate: 3.25% (binomial test: k=81,360 << critical 251,140, α=0.05 → PASS) Completion: mean 90.4%, range 72–99%, σ=7.4%

Live inference (proxy.gonka.gg, Qwen3-235B, 16 requests):

Non-stream latency: mean=1280ms, σ=876ms, CV=0.68 ← primary quality bottleneck Stream fidelity: 8/8 SSE [DONE] received (100%) ms/output token: mean 154ms

Specialization multiplier:

M=571 (Qwen3-32B, shared): hit_rate = 0.000473 M=12 (QwQ-32B, low-M): hit_rate = 0.0225 → 47.6× improvement M=1 (unique model): hit_rate = 0.27 → 571× improvement

The economic case for specialization is mathematical, not speculative.

Routing simulation:

Hypotheses (all PROVEN from measured data):

Multi-axis quality measurement is feasible → 6/10 axes measured from live network

Specialization improves quality → 47.6× multiplier proven mathematically from topology

Protocol lacks a quality feedback loop → L4/L5 have zero protocol mechanism today

Quality-weighted routing improves network economics → proven from routing simulation

Implementation roadmap

Phase 7 is a developer-facing product, not a protocol proposal. It belongs in a separate repository under the Gonka Labs umbrella. The protocol (Phases 0–6) provides the data and the endpoints; the SDK makes them ergonomic. Keeping them separate means:

The protocol can evolve at protocol pace (governance, security, consensus)

The SDK can ship on developer pace (weekly releases, breaking changes allowed)

  • Third-party SDKs (LangChain plugin, LiteLLM router backend, MCP server) can build on the same Phase 6 endpoints independently

Developer tooling strategy (Phase 7 scope)

The gap today: developers integrating Gonka do not have a standard pattern. They write raw HTTP calls, pick models manually, have no signal on inference quality, and get no guidance from the protocol on how to improve their workloads.

The SDK fills that gap using infrastructure the protocol will have after Phase 6 .

What the SDK wraps

Protocol endpoints (Phase 6): POST /v1/chat/completions OpenAI-compatible (existing, proxy.gonka.gg) GET /v1/models/profiles Quality scores + specialization centroids (Phase 6) POST /v1/chat/completions X-Inference-Feedback: +1/-1 header (Phase 3) Response headers (Phase 6): X-Quality-Score: 0.82 Node quality score for this request X-Suggested-Model: Qwen/QwQ-32B Better model for this task type X-Task-Archetype: code-review Detected task category X-Cache: HIT / MISS Cache result (Phase 0)

SDK design (TypeScript / Python)

TypeScript (Axios-based, OpenAI-SDK-compatible drop-in):

import { GonkaClient } from "@gonka-labs/sdk" ; const client = new GonkaClient ( { apiKey : process . env . GONKA_API_KEY , baseURL : "https://proxy.gonka.gg/v1" , qualityFeedback : true , // auto-send X-Inference-Feedback based on response autoRoute : true , // pick model from /v1/models/profiles for task type } ) ; const response = await client . chat . completions . create ( { messages : [ { role : "user" , content : "review this code: ..." } ] , // no model needed: SDK detects task archetype → routes to QwQ-32B if code task } ) ; // SDK attaches quality metadata to the response object: console . log ( response . quality . score ) ; // 0.82 console . log ( response . quality . suggestedModel ) ; // "Qwen/QwQ-32B" console . log ( response . quality . cacheHit ) ; // false

Python (httpx-based, drop-in for openai package):

from gonka import GonkaClient client = GonkaClient ( api_key = os . environ [ "GONKA_API_KEY" ], auto_route = True , quality_feedback = True , ) response = client . chat . completions . create ( messages = [{ "role" : "user" , "content" : "translate to French: ..." }], # SDK routes to specialised translation node via /v1/models/profiles ) print ( response . quality ) # QualityMetadata(score=0.91, cache_hit=True, latency_ms=340)

What this achieves

Developers get best-practice inference out of the box , without reading protocol docs

Every SDK request sends X-Inference-Feedback , improving L4 data for all nodes

Model selection is driven by protocol quality data, not guesswork

Cache hit rate improves as autoRoute concentrates traffic on specialised nodes (↑ M→1)

  • The quality feedback loop closes: SDK → L4 signal → GetQualityWeightedExecutor → better routing → higher QualityScore → SDK reports better outcomes → loop

Relationship to existing open-source patterns

The Gonka SDK is not a novel architectural invention — it follows established patterns. What makes it Gonka-specific is that the routing and quality signals come from the on-chain quality registry , not a centralized service. That is the differentiator.

Proto extension (Phase 1)

Extend CacheQualityEpochSummary with additional axes:

message CacheQualityEpochSummary { // existing fields 1–7 (PR #859) uint32 completion_rate_bps = 8 ; // L9: MsgFinish / (MsgFinish + MsgMiss + MsgInvalidate) uint32 avg_latency_ms = 9 ; // L8: mean request latency uint32 latency_stddev_ms = 10 ; // L8: σ(latency) — consistency signal uint32 stream_fidelity_bps = 11 ; // L7: SSE done_chunks / total_chunks × 10000 int64 feedback_score_sum = 12 ; // L4: Σ feedback signals (+1/-1) int64 feedback_count = 13 ; // L4: number of feedback signals this epoch }

Governance weight parameters (new fields in CacheQualityParams ):

// axis_weights[i] is the weight for Li in basis points. Sum must equal 10000. // Default: [1000,1000,1500,1000,1000,500,1000,1000,1000,1000] repeated uint32 axis_weights = 8; // max_cache_entries bounds InMemoryCacheStore growth. // Default: 50000. At 1.5KB/entry: ~75MB peak. Required for production nodes. uint64 max_cache_entries = 9;

Scale constraint (honest)

InMemoryCacheStore currently has no entry limit. At mainnet scale (75K inferences/epoch, 384-dim embeddings, MaxCacheAgeEpochs=10 ): peak ~1.15GB RAM and O(75K) cosine scan per request.

max_cache_entries governance parameter (Phase 1) bounds this. With N=50,000: peak ~75MB, scan O(50K) — acceptable on any modern node. The EvictExpired call at each epoch boundary keeps the store bounded over time.

Related work

  • PR [ feat(semantic-cache): L2 quality gate pipeline — adaptive coherence floor + hub loop closure [no extra GPU] #859 (https://github.com/gonka-ai/gonka/pull/859) ] — semantic cache infrastructure (this discussion depends on it)
  • PR [ Feature/821 continuous poc complete #856 (https://github.com/gonka-ai/gonka/pull/856) ] — Continuous PoC complete ([ Continuous PoC design + implementation #821 (https://github.com/gonka-ai/gonka/issues/821) ]): directly validates L0 axis . ContinuousPoC is now live infrastructure; quality measurement (L0: compute stability, CV=0.35 measured) sits on top of this foundation. Timing is deliberate: PoC lands first, quality layer follows.
  • PR [ StartInference and FinishInference performance improvements #812 (https://github.com/gonka-ai/gonka/pull/812) ] — StartInference/FinishInference performance (reduces hot-path cost on every inference, including cache HITs)
  • PR [ [P2] Fix/784 fund atomicity error safety #789 (https://github.com/gonka-ai/gonka/pull/789) ] — fund atomicity fix: L2 (correctness) axis tracks invalidation rate. Atomicity fixes reduce false invalidations, improving baseline L2 score.
  • GiP [ Gonka Node Manager — Automated Node Deployment, Updates, and Monitoring #816 (https://github.com/gonka-ai/gonka/discussions/816) ] — Node Manager: k8s deployment standard that maximises cache hit rate organically through model specialization (M=1 per node)
  • Issue [ Investigate missed inference on some nodes (root causes + mitigation) #820 (https://github.com/gonka-ai/gonka/issues/820) ] — missed inferences: L2 (correctness) and L9 (completion rate) axes directly quantify the root cause
  • Issue [ LogInfo tests on testnet for StartInference and FinishInference #839 (https://github.com/gonka-ai/gonka/issues/839) ] — log_format=json: 3× latency improvement; prerequisite for honest L8 (latency consistency) baseline measurements

Open questions for the community

  • Weight governance : who proposes initial axis_weights ? What's the amendment process when a new axis is added?

Weight governance : who proposes initial axis_weights ? What's the amendment process when a new axis is added?

  • L4 feedback incentive : should participants be rewarded (even nominally) for submitting feedback? Without incentive, adoption will be low.

L4 feedback incentive : should participants be rewarded (even nominally) for submitting feedback? Without incentive, adoption will be low.

  • L5 developer webhook : opt-in or opt-out default? What's the privacy model for outcome data?

L5 developer webhook : opt-in or opt-out default? What's the privacy model for outcome data?

  • SDK scope : should Phase 7 be a Gonka Labs project or a community-owned repository? What's the governance model for the SDK itself?

SDK scope : should Phase 7 be a Gonka Labs project or a community-owned repository? What's the governance model for the SDK itself?

  • max_cache_entries default : 50,000 is conservative. Is there a preferred bound based on expected node hardware profiles?

max_cache_entries default : 50,000 is conservative. Is there a preferred bound based on expected node hardware profiles?

ContinuousPoC integration : should ContinuousPoCEpochSummary.effective_poc_weight be part of L0 axis calculation, or remain a separate PoC track? ( @akup (https://github.com/akup) , @Mayveskii (https://github.com/Mayveskii) )

Full design document with scores, routing simulation, and scenario matrix: docs/specs/inference-quality-protocol.md in the PR [ #859 (https://github.com/gonka-ai/gonka/pull/859) ] branch.

gmorgachev avatar
gmorgachevMaintainerMaintainer
2026-03-06
Quality of inference — whether a response was useful, accurate, timely, or appropriate for the request type — has no equivalent protocol representation. It is invisible to the chain.

The quality of the response (in terms of LLM accuracy) is part of the security model itself: governance exactly defines which models are served then cross-validation verifies that. The validation process itself requires some improvement but the idea is to guarantee the identicall quality from all participant explicitly, not by feedback

Routing blindness — GetRandomExecutor distributes traffic uniformly regardless of which node is better at which task. A node specializing in code generation gets the same traffic as one optimized for translation.

Same point, it distributed only between workers who served the exatly same model. Host can't choose to serve differnt one by itself

The idea to measure performance in general is a good direction. But i feel that current proposal don't take into account how chain works now

Mayveskii avatar
2026-03-08

RE

@gmorgachev (https://github.com/gmorgachev) Thanks, addressing each point:

1. Quality of response (LLM accuracy) and security model We’re not replacing governance or cross-validation. They still define which models are allowed and verify identical results. In GiP #860 (https://github.com/gonka-ai/gonka/discussions/860) , axes L0–L2 (compute stability, availability, correctness) are exactly what the chain already has (RTV, validation, weight stability). L4 (usefulness) and L5 (outcome) are additional signals on top: “was this result useful?” or “task resolved,” not a substitute for “all participants return the same output for the same model.”

2. Routing and “host can’t choose a different model” Agreed: the host doesn’t choose the model. In #869 (https://github.com/gonka-ai/gonka/discussions/869) , GetQualityWeightedExecutor is intended to work inside the same model: the request is already bound to a model (as today), and the weight only affects which node among those serving that model gets the request. So traffic is still only between workers for the same model; the change is “among those, prefer the one with better L6/L8/L9 (reuse, latency, completion) for that model.”

3. “Proposal doesn’t take into account how the chain works now” In PR #859 (https://github.com/gonka-ai/gonka/pull/859) , CacheQualityWeight is wired into the existing flow: it’s added to baseCount in the same place as PoC weight (module/chainvalidation.go, settlement). No second settlement path — just an extra term in the same formula. Phases 0–6 in #869 (https://github.com/gonka-ai/gonka/discussions/869) build on that: extend proto (fields 8–13), report L7/L8 in QualityReporter, parse X-Inference-Feedback, route by quality among executors for the same model. So we’re explicitly building on top of the current chain logic, not beside it.

What’s already done: We’ve validated the #860 (https://github.com/gonka-ai/gonka/discussions/860) hypothesis with a real setup: gonkalabs/gonka-agent (semantic cache, two participants, different workspaces). R-3 in docs/testing.md shows Participant B getting a partial hit (0.79) from A’s cache — same domain (Go race), different struct. That’s the “one participant structures requests → the other benefits from cache” scenario from this GiP; L6 reuse and time saved are measured. The L6/L8/L9 + X-Inference-Feedback middleware lives in gonkalabs/opengnk. So the proposal is not only on paper — it’s exercised in the agent → proxy → network path, while keeping the current chain and model-routing behavior.