agentsclimarketplace

Bifrost gateway ru

Skill SiteVisorCloud/bifrost-gateway-integration-skill/skills/bifrost-gateway-ru

Направляет КАЖДЫЙ запрос к любой языковой модели / ИИ-провайдеру через шлюз Bifrost (https://your-gateway.example.com), чтобы все вызовы логировались и фиксировались в одном месте. Используй этот навык ВСЕГДА, когда пишешь, настраиваешь или чинишь любой код, который обращается к LLM или ИИ-провайдеру — OpenAI/GPT, Anthropic/Claude, Google Gemini, Mistral или любому другому — на ЛЮБОМ языке (Python, PHP, JavaScript/TypeScript, Go, curl) и в любом фреймворке (LangChain, LlamaIndex, Vercel AI SDK). Сюда входят новые интеграции, правка существующей настройки клиента, конфигурация base_url / api_key, вызовы chat completions, Responses API, embeddings и стриминг. Срабатывай, даже если пользователь просто говорит «вызови gpt-4o», «добавь Claude в этот скрипт», «sk-bf-...», «сгенерируй текст через нейросеть» или упоминает SDK провайдера, но не сам шлюз. НИКОГДА не обращайся к API провайдеров напрямую — весь смысл шлюза в том, чтобы ни один запрос не шёл мимо него.From its SKILL.md

Install
npx -y skills add SiteVisorCloud/bifrost-gateway-integration-skill --skill bifrost-gateway-ru

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

One thing to look at

  • 1 stars1 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.

SKILL.md

16.2 KB, ~4.1k tokens by cl100k_base, as published. Nobody here has run it

Шлюз Bifrost

У пользователя развёрнут LLM-шлюз Bifrost по адресу https://your-gateway.example.com. Любой вызов любого ИИ-провайдера должен идти через него — так все запросы логируются и фиксируются в одном месте. Прямое обращение к api.openai.com, api.anthropic.com, generativelanguage.googleapis.com и т.п. рушит весь смысл: такие запросы будут невидимы для логирования шлюза.

Поэтому задача навыка простая: как только ты трогаешь код, который общается с LLM, направляй его на шлюз, а не на провайдера напрямую. На практике это почти всегда изменение одной строки (base_url) плюс использование ключа шлюза.

Ещё нет шлюза? — быстрый старт Bifrost (разово)

Если шлюз не запущен, подними его через Bifrost (опенсорсный LLM-gateway):

docker run -p 8080:8080 -v "$(pwd)/data:/app/data" maximhq/bifrost
# или без Docker:  npx -y @maximhq/bifrost

Открой http://localhost:8080, добавь API-ключи своих провайдеров и создай virtual key в разделе Governance (этот ключ — обычно с префиксом sk-bf- — и есть BIFROST_API_KEY). Тогда BIFROST_BASE_URL — это http://localhost:8080/v1 (или твой задеплоенный хост + /v1). Полные шаги: references/install-bifrost.md.

Три вещи, которые нужны всегда

  1. Базовый URL: https://your-gateway.example.com/v1
  2. Строка модели: провайдер/модель — например openai/gpt-4o-mini, anthropic/claude-3-5-sonnet-20241022
  3. Авторизация: Authorization: Bearer <ключ>, где ключ всегда начинается с sk-bf-

Так как шлюз говорит на протоколе OpenAI, любой инструмент, SDK или язык, умеющий работать с OpenAI, умеет работать и со шлюзом — меняется только базовый URL и строка модели. Это общее правило для любого языка, даже не показанного ниже.

Ключ доступа

  • Пользователь передаёт ключ в чате. Он всегда начинается с sk-bf- (по этому префиксу его и опознавай). Если в диалоге встретилась строка вида sk-bf-abc123... — это и есть ключ шлюза.
  • Никогда не зашивай ключ в исходники. В рабочем коде читай его из переменной окружения — по умолчанию BIFROST_API_KEY (запасной вариант — OPENAI_API_KEY, если SDK/инструмент читает только это имя). Литерал ключа допустим только в разовых однострочниках или когда пользователь прямо просит.
  • Если ключа ещё нет, а нужен рабочий код — используй переменную окружения и напиши, что её надо задать: export BIFROST_API_KEY=sk-bf-.... Не выдумывай фейковый sk-bf--ключ, похожий на настоящий.

Строка модели

На едином эндпоинте модель — всегда провайдер/модель. Префикс говорит шлюзу, к какому провайдеру идти; хвост — это имя модели у самого провайдера.

Провайдеры, включённые на your-gateway.example.com, и их префиксы. Ключевой момент: в строке модели используется каноничный ключ Bifrost, а не разговорное имя. Особенно легко ошибиться с Claude и Grok:

Провайдер (как обычно называют)префикспример строки модели
OpenAIopenaiopenai/gpt-4o-mini, openai/gpt-4o
Claude (Anthropic)anthropicanthropic/claude-3-5-sonnet-20241022
Gemini (Google)geminigemini/gemini-1.5-pro, gemini/gemini-2.0-flash
DeepSeekdeepseekdeepseek/deepseek-chat, deepseek/deepseek-reasoner
Grok (xAI)xaixai/grok-2-latest
Perplexityperplexityperplexity/sonar-pro

То есть Claude — это anthropic/... (НЕ claude/...), а Grok — xai/... (НЕ grok/...). Имена самих моделей (хвост после слэша) и их актуальный список бери из даташита — см. ниже.

Точные имена моделей, поддерживаемые параметры, контекстное окно и стоимость для каждой модели живут в даташите Bifrost (источник истины, цены меняются):

Сводка по параметрам запроса и по тому, что различается между провайдерами, — в references/models-and-parameters.md. Если не уверен в точном имени модели или префиксе — сохрани форму провайдер/модель, свернись на пример из таблицы и уточни у пользователя, а не угадывай.

Какой эндпоинт выбрать: Responses API → Chat Completions

По умолчанию используй Responses API (/v1/responses) — это более новый и актуальный формат OpenAI. Шлюз принимает /v1/responses с любым провайдер/модель и сам транслирует запрос под нужного провайдера, так что приоритет Responses работает для всех провайдеров, а не только для OpenAI.

Падай на Chat Completions (/v1/chat/completions), только если клиент, SDK или фреймворк не умеет Responses API (или ты не уверен, что умеет). Оба эндпоинта используют один и тот же ключ sk-bf-... и один и тот же формат провайдер/модель.

Ориентир, кто умеет Responses API:

Поддерживают Responses API (приоритет)Только Chat Completions (fallback)
Свежий OpenAI SDK: client.responses.create (Python/Node)Старые версии OpenAI SDK
Vercel AI SDK: openai.responses("model")LlamaIndex OpenAILike, многие «OpenAI-compatible» клиенты
Прямой HTTP / curl на /v1/responsesopenai-php, если в его версии нет ->responses()
langchain-openai с use_responses_api=TrueЛюбой клиент, где нет явной поддержки Responses

Нативные SDK Anthropic и Google — это отдельный формат (messages / generate_content), это не Responses и не Chat Completions; см. references/native-sdks.md.

Способ 1 (по умолчанию): единый эндпоинт, приоритет Responses API

Responses API — приоритетный вариант

curl:

curl https://your-gateway.example.com/v1/responses \
  -H "Authorization: Bearer $BIFROST_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "openai/gpt-4o-mini",
    "input": "Привет!"
  }'

Ответ лежит в output / output_text, а не в choices[].message.

Python (OpenAI SDK):

import os
from openai import OpenAI

client = OpenAI(
    base_url="https://your-gateway.example.com/v1",
    api_key=os.environ["BIFROST_API_KEY"],   # sk-bf-...
)

resp = client.responses.create(
    model="openai/gpt-4o-mini",                 # провайдер/модель
    input="Привет!",
)
print(resp.output_text)

# Многоходовый диалог — цепочка через previous_response_id
follow_up = client.responses.create(
    model="openai/gpt-4o-mini",
    input="А теперь смешнее.",
    previous_response_id=resp.id,
)
print(follow_up.output_text)

PHP (сырой cURL — работает на любой версии PHP):

<?php
$ch = curl_init('https://your-gateway.example.com/v1/responses');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => [
        'Authorization: Bearer ' . getenv('BIFROST_API_KEY'),  // sk-bf-...
        'Content-Type: application/json',
    ],
    CURLOPT_POST => true,
    CURLOPT_POSTFIELDS => json_encode([
        'model' => 'openai/gpt-4o-mini',                          // провайдер/модель
        'input' => 'Привет!',
    ], JSON_UNESCAPED_UNICODE),
]);
$data = json_decode(curl_exec($ch), true);
curl_close($ch);
echo $data['output_text'] ?? json_encode($data['output'], JSON_UNESCAPED_UNICODE);

Chat Completions — запасной вариант (когда Responses не поддерживается)

curl:

curl https://your-gateway.example.com/v1/chat/completions \
  -H "Authorization: Bearer $BIFROST_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "anthropic/claude-3-5-sonnet-20241022",
    "messages": [{"role": "user", "content": "Привет!"}]
  }'

Python (OpenAI SDK):

import os
from openai import OpenAI

client = OpenAI(
    base_url="https://your-gateway.example.com/v1",
    api_key=os.environ["BIFROST_API_KEY"],   # sk-bf-...
)
resp = client.chat.completions.create(
    model="anthropic/claude-3-5-sonnet-20241022",
    messages=[{"role": "user", "content": "Привет!"}],
)
print(resp.choices[0].message.content)

PHP (сырой cURL):

<?php
$ch = curl_init('https://your-gateway.example.com/v1/chat/completions');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => [
        'Authorization: Bearer ' . getenv('BIFROST_API_KEY'),  // sk-bf-...
        'Content-Type: application/json',
    ],
    CURLOPT_POST => true,
    CURLOPT_POSTFIELDS => json_encode([
        'model' => 'openai/gpt-4o-mini',                          // провайдер/модель
        'messages' => [['role' => 'user', 'content' => 'Привет!']],
    ], JSON_UNESCAPED_UNICODE),
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
echo $response['choices'][0]['message']['content'];

Больше примеров:

Способ 2: нативные SDK провайдеров (drop-in) — когда код должен остаться на «родном» SDK

Иногда переписывать на формат OpenAI/Responses не имеет смысла — например, код уже использует Anthropic SDK с его специфичными полями или Google GenAI SDK. Bifrost даёт «родные» эндпоинты провайдеров: SDK остаётся тот же, меняется только базовый URL и ключ (всё тот же sk-bf-...):

SDKкакой base URL поставитьформат модели
OpenAI SDKhttps://your-gateway.example.com/openaigpt-4o-mini (или провайдер/модель для кросс-роутинга)
Anthropic SDKhttps://your-gateway.example.com/anthropicclaude-3-5-sonnet-20241022
Google GenAI SDKhttps://your-gateway.example.com/genaigemini-1.5-pro

Подробные примеры — в references/native-sdks.md. Для нового кода предпочитай Способ 1 (единый эндпоинт, Responses API); Способ 2 — только чтобы не переписывать уже работающий провайдер-специфичный код.

Перед завершением — быстрая самопроверка

Написал или поправил код с LLM — убедись, что верны все четыре пункта:

  • Базовый URL / хост указывает на your-gateway.example.com (а не на api.openai.com, api.anthropic.com, generativelanguage.googleapis.com или голый хост провайдера).
  • Формат запроса — Responses API (/v1/responses), а Chat Completions (/v1/chat/completions) только там, где клиент не умеет Responses.
  • Строка модели — провайдер/модель на эндпоинте /v1 (или родное имя модели на drop-in /openai /anthropic /genai).
  • Ключ — sk-bf-... ключ шлюза, прочитанный из переменной окружения, а не зашитый в код.
  • Ни один путь исполнения не идёт к провайдеру напрямую — включая настройки SDK по умолчанию, которые ты не переопределил. Если base URL клиента не переопределён, он молча пойдёт мимо шлюза, поэтому задавай его явно.

Если хоть какой-то код всё ещё достаёт провайдера напрямую — исправь: обойдённый запрос невидим для шлюза, а именно ради видимости всё это и делается.

What ships with it: 5 files

23.9 KB alongside SKILL.md

Keep looking

Skills are one crate of 325,949. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.