Сервис для обхода блокировки OpenAI API в России или ваш первый API

Всем привет! Сегодня я расскажу вам, как я сделал сервис для обхода блокировки OpenAI в россии со стороны OpenAI (не Роскомнадзор даже) с использованием FastAPI и Docker. Мотивация проста. У меня в РФ есть сервер на котором работают сервисы и я хочу подключить к ним OpenAI, но они не дают доступ, распознавая IP из россии. Подумал что напишу сервер для пересылки запроса. Если вам интересно, как за несколько шагов запаковать работу с ИИ в красивую и простую оболочку, то устраивайтесь поудобнее. Мы вместе погрузимся в этот увлекательный процесс!
О чем вообще речь?
Сперва подумал что лучше сделать реле HTTP запросов, но оказалось что там все куда сложнее и OpenAI использует систему Cookie подложенную в запросы и сервер в другом часовом поясе не будет работать, поэтому я поменял стратегию:
Идея проста: я хотел создать веб-сервис, который может принимать сообщения и с помощью API OpenAI выдавать осмысленные и даже забавные ответы. Однако вместо того, чтобы напрямую обращаться к OpenAI API через скрипты, я решил сделать что-то более изящное — API для API! И для этого выбрал FastAPI, который обещает высокую производительность, простоту в использовании и асинхронность из коробки.
А чтобы всё это легко запускалось где угодно (будь то локально или на сервере), я завернул проект в Docker. Почему бы и нет? Ведь с Docker работать приятно — раз поднял контейнер, и можно забыть о всяких проблемах с окружением.
Ну что, начнем!
FastAPI: как можно не любить этот фреймворк?
Если вы до сих пор не слышали про FastAPI, то срочно идите читать! Этот фреймворк — настоящая находка для тех, кто устал от громоздкости старых фреймворков и хочет чего-то простого, но мощного.
Моя цель была проста: сделать POST-запрос, который принимает список сообщений (например, фразы от пользователя и инструкции от системы) и возвращает ответ, сгенерированный моделью OpenAI (будь то GPT-4 или GPT-3.5). Ну и, конечно, я хотел добавить аутентификацию — ведь не хотелось, чтобы кто угодно мог получить доступ к сервису.
Код сервиса — это несколько строк, которые показывают всю мощь FastAPI:
from fastapi import FastAPI, HTTPException, Request, Depends
from pydantic import BaseModel
import openai
import os
from dotenv import load_dotenv
# Загружаем переменные окружения из .env файла
load_dotenv()
OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")
AUTH_TOKEN = os.getenv("AUTH_TOKEN")
app = FastAPI()
class OpenAIRequest(BaseModel):
model_name: str
messages: list[dict[str, str]]
def verify_token(request: Request):
token = request.headers.get("Authorization")
if token != AUTH_TOKEN:
raise HTTPException(status_code=403, detail="Unauthorized")
@app.post("/api/open_ai_request")
async def open_ai_request(openai_request: OpenAIRequest, token: None = Depends(verify_token)):
openai.api_key = OPENAI_API_KEY
response = openai.ChatCompletion.create(
model=openai_request.model_name,
messages=openai_request.messages
)
return {"response": response.choices[0].message['content']}
Что здесь происходит?
FastAPI предоставляет удобный интерфейс для создания HTTP-методов.
Мы используем асинхронные функции для максимальной производительности.
Добавили базовую проверку токена через заголовок
Authorization
, чтобы никто не мог использовать ваш сервис без разрешения.Самое главное — запросы к OpenAI выполняются с помощью асинхронного вызова API, чтобы всё летало как нужно!
Docker: чтобы не было «на моем компьютере работает»
Теперь давайте завернем наш сервис в Docker. Это позволит запускать его в любом окружении без мучений с установкой зависимостей.
Dockerfile у нас очень простой:
FROM python:3.10-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 8000
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
Что здесь происходит?
Мы берем легковесный образ Python 3.10.
Устанавливаем все необходимые зависимости (FastAPI, OpenAI и прочее).
Копируем исходники приложения.
И запускаем сервис через Uvicorn, который является отличным сервером для асинхронных приложений.
Но это еще не всё! Для удобства мы добавим docker-compose, чтобы всё поднималось одной командой:
version: '3.8'
services:
fastapi-openai-service:
build: .
env_file:
- .env
ports:
- "8000:8000"
restart: unless-stopped
Теперь, чтобы запустить сервис, достаточно просто:
docker-compose up --build
И через несколько секунд у вас готовый сервис для общения с ИИ, который работает на любом сервере или даже локально.
Проверим работу
После того как вы запустили контейнер, ваш сервис будет доступен по адресу http://localhost:8000
. Вы можете отправить POST-запрос с заголовком авторизации и телом запроса, например, с помощью curl
:
curl -X POST "http://localhost:8000/api/open_ai_request" \
-H "Authorization: your_secret_auth_token_here" \
-H "Content-Type: application/json" \
-d '{
"model_name": "gpt-4",
"messages": [
{"role": "system", "content": "Ты умный ассистент."},
{"role": "user", "content": "Расскажи шутку."}
]
}'
И вы получите в ответ что-то вроде:
{ "response": "Почему программисты не любят ходить в лес? Потому что там слишком много багов!"
}
Неплохо, да?
Что можно улучшить?
Как и любой проект, этот сервис можно доработать и расширить, чтобы повысить его функциональность и надежность. Вот несколько идей для улучшений:
Проверка токена не простым сравнением, а сравнением хешей. Хеша токена или сравнение с постоянной скоростью.
На данный момент у нас простая проверка токена через заголовок
Authorization
. Можно улучшить безопасность, добавив систему авторизации на основе JWT или OAuth 2.0, а также разграничить права доступа для разных типов пользователей.Важно добавить автоматизированные тесты, чтобы убедиться в стабильности работы сервиса при его доработке. Можно использовать
pytest
для написания юнит-тестов, а также инструменты для нагрузочного тестирования, такие какLocust
илиk6
, чтобы проверить производительность.
Подводим итоги
Мы создали простой, но функциональный сервис, который можно развернуть на вашей VPS после чего он будет отправлять запросы к OpenAI и возвращать ответы. При этом весь проект легко масштабируем и готов к деплою благодаря Docker и FastAPI.
Чем хорош этот подход:
Легкость развертывания: Docker помогает избегать проблем с зависимостями и окружениями.
Масштабируемость: FastAPI — быстрый и асинхронный фреймворк, что позволяет обрабатывать множество запросов без потери производительности.
Безопасность: Простая проверка токена позволяет ограничить доступ к вашему сервису.
Теперь вы знаете, как можно сделать API для работы с OpenAI буквально за пару часов. Вперед к новым свершениям, и пусть ИИ помогает вам во всех ваших начинаниях!
Жду ваших комментариев и предложений по улучшению!