Skip to main content
Glama
ashritkvs

TraceFlow Compress

by ashritkvs

Distil

Серверный MCP-коннектор для сжатия промптов, который быстро сжимает промпты и возвращает метрики в стиле Distil — токены, стоимость, задержку, вычислительную нагрузку, энергию и углерод — где каждое число либо измерено, либо является явно помеченной оценкой. Полный дизайн см. в SPEC.md.

Построен вокруг Prompt Intelligence из исходного whitepaper + слоя токенов/стоимости/вычислений/энергии/углерода (реализуемая часть — без GPU-оборудования).

Основные возможности

  • Расширение для браузера: сжимает то, что вы вводите прямо в claude.ai, chatgpt.com и gemini.google.com — не требуется API-ключ, работает внутри вашей обычной авторизованной чат-сессии. См. extension/README.md.

  • LLM Gateway: прокси-замена для OpenAI/Anthropic/Gemini — укажите base_url на Distil, и каждый запрос будет сжат (при необходимости с управлением) до того, как он достигнет реального провайдера, включая стриминг. См. ниже.

  • Быстро и без сервера: эвристическое сжатие по умолчанию — чистый Python (~3 мс, без модели, без API-ключа). Опциональный режим gpt-4o-mini для более высокого качества.

  • MCP-коннектор: предоставляет 5 инструментов + ресурс метрик через потоковый HTTP.

  • Метрики Distil: токены/стоимость/задержка (измеренные) + энергия/углерод/GPU-нагрузка (оценённые, помеченные). Намерение GPU сохраняется через модель вычислительной нагрузки, а не подделывается.

  • Живая панель мониторинга + публичный эндпоинт /metrics.

  • Честно по дизайну: каждая оценка помечена estimated: true; параметры закрытых моделей помечены params_known: false.

Related MCP server: token-optimization-mcp

LLM Gateway (прокси-замена) — коммерческий продукт

Укажите ваш существующий клиент OpenAI/Anthropic/Gemini на Distil вместо прямого обращения к провайдеру. Distil сжимает промпт, пересылает его реальному провайдеру с использованием вашего собственного API-ключа и стримит ответ обратно — та же форма запроса/ответа, так что ваш код не меняется, кроме базового URL.

your app → Distil (/v1/...)  →  compress + optional governance  →  real provider  →  same answer back to you

Изменение в одну строку (OpenAI SDK):

from openai import OpenAI

client = OpenAI(
    api_key="YOUR_OWN_OPENAI_KEY",       # unchanged — sent straight through, never stored
    base_url="https://getdistil.vercel.app/v1",
)
resp = client.chat.completions.create(
    model="gpt-4o-mini",
    messages=[{"role": "user", "content": "Could you please possibly explain, in a very detailed way, what a REST API is?"}],
)

curl (доказывает сжатие + обычный ответ + заголовки экономии):

curl -i https://getdistil.vercel.app/v1/chat/completions \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gpt-4o-mini",
    "messages": [{"role": "user", "content": "Could you please possibly explain, in a very detailed way, what a REST API is?"}]
  }'
# Response body is a normal OpenAI chat.completion object.
# Response headers include:
#   x-distil-original-tokens, x-distil-sent-tokens, x-distil-tokens-saved

Anthropic и Gemini работают так же — меняются только базовый URL/путь и заголовок авторизации (ваша клиентская библиотека справится с этим):

Провайдер

Базовый URL, на который вы указываете

Куда вставляется ваш ключ

OpenAI

https://getdistil.vercel.app/v1

Authorization: Bearer sk-...

Anthropic

https://getdistil.vercel.app/v1/messages

x-api-key: sk-ant-... (+ anthropic-version)

Gemini

https://getdistil.vercel.app/v1beta/models/{model}:generateContent?key=...

?key=... или x-goog-api-key

Поведение

  • Ваш ключ, ваш счёт. Distil пересылает Authorization/x-api-key/key, которые вы отправляете в каждом запросе, напрямую реальному провайдеру. Distil никогда не хранит его — в памяти сохраняется только односторонний хэш, используемый исключительно как идентификатор для ограничения скорости/учёта.

  • Что сжимается по умолчанию: текст каждого сообщения с ролью user (OpenAI/Anthropic) или записи contents с ролью user (Gemini) — охватывает как «последнее сообщение», так и любой большой контекст/документы, вставленные в него. system/system_instruction и предыдущие ходы assistant/model не трогаются. Схемы функций/инструментов (блоки tools, tool_calls, tool_result) никогда не изменяются.

  • Отказоустойчивость: если сжатие или управление по любой причине выдаёт ошибку, Distil пересылает ваш исходный несжатый запрос, а не прерывает вызов.

  • Стриминг: "stream": true сжимается один раз заранее, затем SSE-ответ провайдера ретранслируется обратно по частям, без буферизации (проверено локально на медленном тестовом источнике — части приходят в собственном темпе провайдера, а не пакетами).

  • Режимы управления через x-distil-govern: off (по умолчанию log) никогда не блокирует; log выполняет проверки classify/PII/injection/moderation и записывает нарушения, но всё равно пересылает запрос; enforce возвращает ошибку 4xx в форме провайдера вместо пересылки, когда вердикт — block.

Заголовки конфигурации (все необязательные)

Заголовок

По умолчанию

Эффект

x-distil-ratio

0.5

Целевая доля токенов, которые нужно сохранить (0.05–1.0)

x-distil-govern

log

off / log / enforce

x-distil-compress

on

on / off — управление по-прежнему работает независимо от этого

x-distil-compress-system

off

также сжимать текст system/systemInstruction

x-distil-enforcement

block

при блокировке в режиме enforce: block (остановить запрос) или redact (замаскировать обнаруженные PII/секреты и переслать замаскированный текст). Карантин/одобрение здесь не предлагаются — см. Рабочий процесс управления, почему живой прокси-вызов не может их поддерживать.

Примечания о честности

  • Сжатие в шлюзе — только эвристическое (без LLM-вызова на каждый запрос для сжатия — это удвоило бы задержку и стоимость). Текст может читаться слегка отрывисто; увеличьте x-distil-ratio (например, 0.7), если качество ответов на ваших промптах ухудшается, и протестируйте перед использованием в продакшене.

  • Проверено на живых API провайдеров, а не угадано: формы запросов/ответов/ошибок/SSE для OpenAI и Anthropic были подтверждены отправкой реальных запросов на api.openai.com и api.anthropic.com (с недействительным ключом, чтобы наблюдать реальную оболочку ошибки) и побайтовым анализом ответа. Форма запроса/ответа/ошибки generateContent для Gemini была проверена тем же способом; его потоковая структура (:streamGenerateContent?alt=sse) — это режим SSE, описанный в REST-примерах Google, но не проверен вживую с действительным ключом Gemini — протестируйте этот путь, прежде чем полагаться на него.

  • Поля usage/количество токенов внутри тела ответа самого провайдера — это реальные авторитетные числа провайдера (Distil их не трогает). Заголовки x-distil-* — это собственный подсчёт Distil того, что он сжал.

Быстрый старт (локально)

pip install -r requirements.txt
python demo.py                    # try the core on a sample
python eval/run_eval.py           # measured eval over sample prompts
pytest tests/                     # test suite
python mcp_server.py              # run the MCP server over stdio
uvicorn api.index:app --port 8000 # run the HTTP server + dashboard
# → open http://localhost:8000/  (dashboard) and /mcp (connector)

Инструменты MCP

Инструмент

Назначение

compress_prompt(text, target_ratio?, quality?, target_model?, use_cache?)

Сжатие + полная метрика. target_model="auto" маршрутизирует по сложности

route_prompt(text)

Рекомендует малую/большую модель по сложности + прозрачность стоимости

analyze_prompt(text)

Токены, слова-паразиты, избыточность (без сжатия)

estimate_savings(text, calls_per_day?, target_model?)

Прогнозируемая ежемесячная экономия стоимости/углерода

get_metrics()

Сводные метрики Distil, включая долю попаданий в кэш

get_top_prompts(n?)

Наиболее сжимаемые из просмотренных промптов

detect_anomalies()

AIOps: выявление всплесков низкого сжатия / токенов / стоимости (базовая линия IQR)

route_provider_prompt(text)

Рекомендует конкретного провайдера + модель среди всех настроенных провайдеров (с учётом чувствительности данных, состояния и стоимости) — см. Рабочий процесс управления

redact_text(text)

Маскирует обнаруженные PII/секреты с помощью [REDACTED:<тип>]

check_model_policy(model, tenant?)

Проверяет модель на соответствие политике разрешений/запретов с учётом исключений

scan_licenses(text)

Классифицирует пакеты, упомянутые в text, по категориям лицензий

get_audit_log(n?) / export_audit_log(n?, fmt?)

Журнал аудита уровня доказательности (каждое решение по управлению, а не только нарушения)

list_review_queue(kind?, n?) / resolve_review(review_id, decision, ...)

Очередь карантина/одобрения — список удержанных промптов, одобрение или отклонение одного

grant_exception(scope, value, tenant?, ttl_hours?, reason?, granted_by?) / list_exceptions() / revoke_exception(id)

Ограниченные по области действия и времени переопределения блокировки пакета/модели

send_test_alert()

Отправляет тестовое оповещение на DISTIL_ALERT_WEBHOOK_URL

Ресурс: metrics://summary.

Каждый результат compress_prompt также содержит спаны распределённой трассировки (§2.2) — измеренные тайминги подэтапов (route, cache_lookup, compress, token_metrics, estimates).

Семантическое кэширование (§8.2) и маршрутизация по нескольким моделям (§8.4)

  • Кэш — двухуровневый, подходит для serverless: точный (нормализованный хэш) + по сходству (лексический косинус, DISTIL_CACHE_THRESHOLD, по умолчанию 0.92), чтобы почти идентичные промпты использовали предыдущее сжатие. Пространство имён: (ratio, quality, model). На каждый тёплый инстанс. Доля попаданий отображается на панели управления.

  • Маршрутизацияroute_prompt / target_model="auto" оценивает сложность промпта (глаголы рассуждения, код, структура, длина) и выбирает малую или большую модель, с оценкой стоимости для каждой модели, чтобы выбор был прозрачным.

Рабочий процесс управления

Помимо вердикта allow/warn/block от govern, Distil поддерживает:

  • Политика моделейDISTIL_MODEL_POLICY_MODE (denylist по умолчанию | allowlist)

    • DISTIL_DENIED_MODELS / DISTIL_ALLOWED_MODELS. Проверяется на шлюзе (model в теле запроса → 403 model_not_allowed) и в process_prompt.

  • Редактирование / карантин / требование одобренияprocess_prompt(..., enforcement=) может быть "block" (по умолчанию), "redact" (маскировать PII/секреты и продолжить), "quarantine" (удержать для проверки безопасности) или "approval" (удержать до подписания). Карантин/одобрение немедленно возвращают идентификатор проверки — ничего не сжимается, пока resolve_review не одобрит или не отклонит. Живой LLM-шлюз поддерживает только block/redact (заголовок x-distil-enforcement) — синхронный прокси-вызов не может приостановиться для человека, поэтому карантин/ одобрение доступны только через /process и MCP.

  • Рабочий процесс исключенийgrant_exception(scope, value, tenant?, ttl_hours?, reason?) предоставляет узкое истекающее переопределение блокировки пакета или модели вместо отключения всей политики. Автоматически проверяется check_packages / check_model_policy.

  • Сканирование лицензийscan_licenses(text) классифицирует упомянутые пакеты (permissive / weak_copyleft / copyleft / unknown) по небольшому офлайн-реестру; попадание copyleft повышает уровень управления до warn (флаг для юридической проверки, а не жёсткая блокировка). Неизвестные пакеты помечаются, а не угадываются.

  • Журнал аудита — каждый вызов govern (включая allow) записывает запись уровня доказательности — идентификатор решения, тенант, вердикт, причины, хэш промпта

    • превью из 60 символов (никогда полное содержимое промпта) — отдельно от журнала нарушений, чтобы объём аудита не загрязнял /metrics. export_audit_log(fmt="csv") для передачи аудитору.

  • ОповещенияDISTIL_ALERT_WEBHOOK_URL (+ DISTIL_ALERT_MIN_SEVERITY, по умолчанию high) отправляет вебхук при блокировке управления или отправке карантина/одобрения. Двухформатная полезная нагрузка: совместимое со Slack поле text плюс структурированное distil_event для автоматизации PagerDuty/Jira или общего приёма тикетов. Отказоустойчивость — сломанный вебхук никогда не влияет на запрос, который его вызвал.

  • Маршрутизация между провайдерамиroute_provider_prompt(text) (в отличие от рекомендации только по уровням в route_prompt) выбирает реального провайдера + модель: промпт с обнаруженными PII/секретами ограничивается DISTIL_TRUSTED_PROVIDERS (по умолчанию local), если он настроен; кандидаты ранжируются по недавнему состоянию (core.availability, питается реальным трафиком шлюза), затем по стоимости среди всех провайдеров с настроенным ключом, а не только по малым/большим уровням OpenAI.

Админ-эндпоинты (/audit, /review-queue/*, /exceptions/*, /alerts/test) защищены так же, как и остальной API — установите DISTIL_ADMIN_KEY для отдельного требования x-admin-key; в Distil пока нет разделения ролей помимо этого, поэтому без него любой действительный ключ Distil может их вызывать.

Развёртывание (serverless, Vercel)

  1. Запушьте в GitHub, импортируйте в Vercel (Python / Fluid Compute — определяется автоматически).

  2. Установите переменные окружения: CONNECTOR_API_KEY (защищает /mcp), опционально OPENAI_API_KEY (режим качества), опционально UPSTASH_REDIS_REST_URL + _TOKEN (постоянные метрики; в противном случае используется локальный JSON-файл).

  3. Добавьте в Claude через настройки коннектора → https://<app>.vercel.app/mcp.

Панель метрик: https://<app>.vercel.app/.

Справочник по метрикам

Измеряемые (реальные)

Оценочные (помеченные)

токены вход/выход/сэкономлено, % сокращения

сэкономленная стоимость (USD)

задержка (мс)

сэкономленная энергия (Вт·ч)

время CPU, пиковая RAM

сэкономленный углерод (г CO₂)

удалено слов-паразитов, % избыточности

нагрузка GPU-мс + % сокращения (2×params×tokens)

Структура

core/                 compression + intelligence + estimates + metrics store
core/gateway.py        LLM Gateway request rewriting (no networking; pure logic)
mcp_server.py          FastMCP tools/resource
api/index.py            serverless ASGI entrypoint (MCP + dashboard + /metrics + auth)
api/gateway_routes.py   LLM Gateway HTTP routes (/v1/chat/completions, /v1/messages, /v1beta/...)
dashboard/             static metrics page
eval/                  measured evaluation
tests/                 unit tests (tests/test_gateway.py covers the gateway)

Переиспользовано из Prompt Compression Agent

подсчёт tiktoken, список слов-паразитов + логика анализа, паттерн dataclass для метрик и интеграция с OpenAI (для опционального пути LLM).

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

No tool schema history has been recorded yet.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    B
    maintenance
    MCP proxy that compresses tool schemas on the fly. Up to 98% token reduction, 100% signal preserved verified after every compression. Zero LLM calls, fully deterministic.
    5
    4
    MIT
  • F
    license
    B
    quality
    C
    maintenance
    Local MCP server for token optimization, providing tools to compress code/JSON, optimize prompts, and manage placeholder-based content redaction and hydration to reduce LLM token usage.
    5
    -
  • A
    license
    Not graded
    quality
    C
    maintenance
    A local, zero-cloud MCP server for token and text compression. It provides tools to compress, auto-compress, measure, and decompress text using offline rules, lossless gzip packing, or a local Ollama semantic model.
    1
    MIT

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/ashritkvs/distil'

If you have feedback or need assistance with the MCP directory API, please join our Discord server