OpenAI API Bridge — это высокопроизводительный сервис-прокси на FastAPI, который служит мостом между новым Responses API
и классическим Chat Completions API
от OpenAI. Он позволяет разработчикам использовать единый, современный клиент для взаимодействия с любыми OpenAI-совместимыми моделями, независимо от того, какой формат API они поддерживают.
Архитектура
Система построена на двух ключевых адаптерах, которые обеспечивают двунаправленное преобразование запросов и ответов:
ResponsesToChatAdapter
— этот компонент "понижает" запросы. Он анализирует входящий запрос в форматеResponses API
и преобразует его в эквивалентный запрос дляChat Completions API
. Адаптер корректно обрабатывает такие сложные элементы, как системные инструкции, вызовы функций (tools), параметрыreasoning
и требования к формату ответа.ChatCompletionsToResponsesAdapter
— этот компонент "повышает" ответы. Он принимает стандартный или потоковый (SSE) ответ отChat Completions API
и преобразует его в современный, структурированный форматResponses API
. Адаптер генерирует корректную последовательность событий, включаяreasoning
, дельты контента и финальные данные об использовании токенов.
Сервер на FastAPI динамически определяет, какой API поддерживает целевая модель, и либо проксирует запрос напрямую, либо задействует адаптеры для конвертации.
Технологии
- Python 3.12+ — используется для обеспечения производительности и поддержки современных асинхронных возможностей.
- FastAPI — высокопроизводительный веб-фреймворк для создания асинхронных API.
- OpenAI Python SDK v1.x — для типизации и взаимодействия с API.
- Asyncio — для эффективной обработки параллельных запросов и потоковой передачи данных.
- Uv — современный и быстрый менеджер зависимостей и виртуальных окружений.
Особенности
- 🎯 Универсальность: Используйте единый клиент
Responses API
для работы с любыми моделями, поддерживающими OpenAI-совместимые API. - 🚀 Прозрачная адаптация: Автоматическое преобразование запросов и ответов "на лету" без необходимости изменять клиентский код.
- 🔄 Двунаправленная конвертация: Полная поддержка преобразования как из
Responses
вChat Completions
, так и обратно. - STREAM Потоковая передача: Корректная обработка и преобразование потоковых (server-sent events) ответов с сохранением всех событий, включая
reasoning
иtool_calls
. - 🛠️ Гибкая конфигурация: Настройка целевых эндпоинтов и моделей через переменные окружения, что позволяет легко интегрироваться с vLLM, Ollama, Groq и другими сервисами.
- 🧪 Надежность: Проект покрыт комплексными интеграционными и модульными тестами для обеспечения стабильности.
Пример использования
Сервер-мост запускается как прокси перед вашим основным OpenAI-совместимым API (например, vLLM).
1. Запуск сервера:
# Установка переменных окружения
export REMOTE_OPENAI_BASE_URL="http://localhost:8000" # URL вашего vLLM или другого API
export REMOTE_OPENAI_API_KEY="your-api-key"
export DEFAULT_MODEL="meta-llama/Llama-3-8B-Instruct"
# Запуск сервера
uv run python main.py
2. Клиентский код (Python):
Клиент отправляет запрос в формате Responses API
на адрес запущенного моста. Мост автоматически преобразует его в Chat Completions
и вернет ответ в формате Responses
.
from openai import OpenAI
# Клиент подключается к нашему мосту
client = OpenAI(
base_url="http://127.0.0.1:8099", # Адрес моста
api_key="not-needed"
)
# Используем современный Responses API
with client.responses.stream(
model="meta-llama/Llama-3-8B-Instruct",
input="Напиши короткую историю о роботе, который нашел друга.",
reasoning={"effort": "low"}
) as stream:
for event in stream:
# Клиент получает события в новом формате, даже если модель его не поддерживает
if event.type == 'response.reasoning_text.delta':
print(f"Модель размышляет: {event.delta}")
elif event.type == 'response.output_text.delta':
print(event.delta, end="")
Результат: Клиентский код остается чистым и современным, а вся сложность по адаптации API скрыта внутри сервиса-моста.
Подробнее о проекте и исходный код доступны на GitHub: ascorblack/openai-api-bridge.