Experiential — открытый шлюз и роутер для агентских workflow

· 2 мин чтения
llm ai-gateway routing open-source python
📂 Исходный код на GitHub

Открытый zero-markup шлюз для BYOK-, self-hosted и 1000+ моделей маркетплейса. Учится на вашем трафике, снижает затраты, рекомендует лучшие модели и помогает обучить собственную specialized-модель.

Experiential — открытый шлюз и роутер для агентских workflow

Experiential — открытый шлюз и роутер для агентских workflow

Experiential — это open-source gateway и router для агентских workflow. Проект решает три задачи сразу: даёт доступ к hosted-, BYOK- и локальным моделям через один OpenAI-совместимый API, контролирует, кто и сколько может тратить на модели, и превращает продакшен-трафик в кастомный роутер или специализированную модель, оптимизированную по качеству, скорости и стоимости.

По описанию репозитория, это zero-markup шлюз: он не добавляет наценку к стоимости токенов, работает с BYOK-ключами, self-hosted моделями и 1000+ моделями из маркетплейса, учится на вашем трафике, помогает сократить расходы, рекомендует лучшие модели и позволяет обучить собственную specialized-модель. Проект написан на Python и распространяется под лицензией Apache-2.0.

Три опоры продукта

README описывает три ключевых возможност:

  1. Единый OpenAI-совместимый API для hosted-, BYOK- и локальных моделей. Вместо того чтобы подключать каждую модель через её собственный SDK, вы работаете с одним интерфейсом.
  2. Контроль доступа и бюджетов — какие пользователи и агенты могут использовать какие модели, для каких задач и сколько могут потратить.
  3. Оптимизация на основе продакшен-трафика — превращение реального трафика в кастомный роутер или в модель, обученную под ваши метрики качества, скорости и стоимости.

Быстрый старт: локальный шлюз

Минимальный путь занимает две команды:

pip install experiential
exp

При первом запуске запускается setup-мастер. Он использует общие селекторы провайдера, модели и reasoning effort, сохраняет каждое подключение к провайдеру, затем показывает значения по умолчанию для публичного alias, identity и командного бюджета в $50.00 и печатает одноразовый ключ.

После этого выбираете публичный alias вроде opus-5, фиксируете выданный ключ и отправляете запрос:

export EXP_GATEWAY_KEY=...
curl http://127.0.0.1:8000/v1/chat/completions \
  -H "Authorization: Bearer $EXP_GATEWAY_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"model":"opus-5","messages":[{"role":"user","content":"Help me"}]}'

Шлюз отвечает на loopback — компилированный native data plane обслуживает все маршруты локально. Локальный запуск выполняется командой exp (или exp run).

Хостинговая платформа

Если управлять собственным шлюзом не хочется, есть hosted-платформа на platform.experientiallabs.ai. Она отдаёт тот же OpenAI-совместимый (и Anthropic Messages) API по адресу https://api.experientiallabs.ai/v1.

В репозитории лежит SETUP.md — набор copy-paste промптов, которые вы отдаёте своему coding agent (Claude Code, Cursor, Codex и подобным): агент сам выполняет настройку. Там четыре промпта:

  • Загрузка LLM-трасс как телеметрии — мгновенная регистрация по email, затем загрузка существующих LLM-трасс на платформу в роли телеметрии.
  • Подключение ключей провайдеров (BYOK) — подключаете собственные ключи OpenAI, Anthropic, Gemini, Azure, Bedrock, Fireworks или OpenRouter: бесплатный pass-through без наценки.
  • Первые вызовы моделей через шлюз — первый /v1-вызов с помощью OpenAI и Anthropic SDK с ключом формата xpl_, плюс опциональный репоинт существующих coding agents.
  • Полный онбординг — регистрация, подключение ключей, импорт расходов и репоинт всех coding agents (Claude Code, Cursor, Codex, Aider и подобных) или Conductor на шлюз.

Работа с API из Python

Из Python загруженный project-router используется как официальный OpenAI-клиент, который стоит за собственным приватным шлюзом:

import exp

with exp.load_router("my-project") as client:
    response = client.chat.completions.create(
        model="my-project",
        messages=[{"role": "user", "content": "hello"}],
    )

Обратите внимание: модель здесь — имя вашего project-router, а не конкретная LLM. Дальше роутер сам решает, какую модель вызвать.

Оптимизация на основе трафика

Весь цикл оптимизации в README укладывается в три шага.

Шаг 1 — собрать OpenTelemetry-трассы из текущего агента. Для быстрого прогона есть публичный датасет terminal-tasks OTLP:

curl -L -o traces.otel.jsonl \
  https://huggingface.co/datasets/experiential-labs/wmo-terminal-tasks-traces/resolve/540883e451dc13d34fb50fdd36b143cb0f1fb0db/traces.otel.jsonl

Шаг 2 — собрать project. Команда build проводит по выбору провайдеров, моделей и бюджета и запрашивает файл с трассами:

# Build simulation from your agent traces and optimize a router against it
exp build support-agent

Из трасс строится симуляция, против которой оптимизируется роутер.

Шаг 3 — обучить свою модель. После сбора трасс от вашего роутера можно fine-tune'ить open-source модель, которая принадлежит вам, через Tinker:

exp optimize model support-agent

Это и есть путь от «просто проксируем вызовы» к «у нас есть роутер и специализированная модель под наши данные».

Телеметрия

По умолчанию включена анонимная aggregate-телеметрия PostHog. По заявлению авторов, она никогда не включает промпты, трассы, действия, наблюдения, пути, имена моделей, учётные данные или сырой контент клиентов.

exp config telemetry status
exp config telemetry disable
exp config telemetry enable

Настройка хранится локально в .exp/settings.toml.

Разработка

Репозиторий развивается на Python; конвенции репозитория и документации описаны в AGENTS.md. Локальный dev-стек:

uv sync --extra dev
uv run ruff format --check .
uv run ruff check .
uv run ty check
uv run pytest -q

То есть стандартный набор для современного Python-проекта: uv для зависимостей, ruff для форматирования и линтинга, ty для типов, pytest для тестов.

Как устроена модель контроля

Из README хорошо складывается триада «доступ — бюджет — оптимизация». Доступ описывается ключом-alias: вы даёте потребителю не сырой ключ провайдера, а публичный alias вида opus-5 плюс выданный шлюзом ключ (EXP_GATEWAY_KEY локально, xpl_ на hosted-платформе). Бюджет задаётся при первом запуске (по умолчанию — $50.00 командный бюджет) и дальше определяет, сколько потребитель может потратить. Оптимизация замыкает цикл: собранные трассы превращаются в симуляцию, симуляция — в роутер, роутер — в данные для fine-tune'а собственной модели.

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

Два режима работы

README явно разделяет два сценария:

Режим Когда брать Что получаете
Локальный шлюз (exp) Хотите всё держать у себя, работать с локальными моделями OpenAI-совместимый эндпоинт на loopback, native data plane, ключ и alias выдаёт setup-мастер
Hosted-платформа Нужен managed-вариант без своего окружения https://api.experientiallabs.ai/v1, OpenAI-совместимый и Anthropic Messages API, BYOK-подключение ключей

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

Кому это интересно

Experiential подходит, если вы уже агентизировали рабочие процессы и упёрлись в типовые проблемы: несколько провайдеров с разными ключами, непрозрачные расходы, нет контроля, какие агенты какие модели используют, и хочется со временем не просто переключаться между моделями, а обучить роутер или собственную модель под свой трафик. Формула «один OpenAI-совместимый endpoint + бюджеты + оптимизация на трассах» — как раз попытка собрать это в один инструмент с открытым исходным кодом.

Стоит заметить, что проект по духу близок к другим AI-gateway вроде LiteLLM, но делает ставку не столько на мультипровайдерный прокси, сколько на цикл «трафик → роутер → своя модель»: шлюз здесь — не только точка входа, но и источник данных для обучения.

Источник: https://github.com/experientiallabs/experiential