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

c65e1bec14c2e4934184056fdd35aa7c.jpg

Всем привет! Сегодня я расскажу вам, как я сделал сервис для обхода блокировки 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 буквально за пару часов. Вперед к новым свершениям, и пусть ИИ помогает вам во всех ваших начинаниях!

Жду ваших комментариев и предложений по улучшению!

© Habrahabr.ru