OpenAI Python SDK: установка, настройка и практическая интеграция

OpenAI Python SDK: установка, настройка и практическая интеграция

OpenAI Python SDK (openai на PyPI) — это официальный Python-клиент для API OpenAI. Он обрабатывает аутентификацию, форматирование запросов, разбор ответов, потоковую передачу и повторные попытки, так что вам не нужно реализовывать это самостоятельно. Это руководство охватывает установку, основной класс OpenAI, чат-завершения, потоковую передачу, вызов функций, асинхронное использование, эквивалент JavaScript SDK, интеграцию Azure OpenAI, а также то, как направить тот же SDK на совместимую с OpenAI конечную точку Novita AI для использования моделей с открытым весом без переписывания кода.

Установка пакета OpenAI для Python

Требуется Python 3.8 или новее:

pip install openai

Для разработки добавьте его в requirements.txt или pyproject.toml:

pip install openai>=1.0.0

Релиз 1.x (выпущенный в конце 2023 года) значительно изменил интерфейс по сравнению с API 0.x. Если вы переносите старый код, обратите внимание, что openai.ChatCompletion.create() больше не существует; используйте client.chat.completions.create().

Установите ваш API-ключ как переменную окружения. Не помещайте его в исходный код:

export OPENAI_API_KEY="sk-..."

Класс клиента OpenAI

Класс OpenAI — это основная точка входа. По умолчанию он считывает API-ключ из переменной окружения OPENAI_API_KEY, или вы можете передать его явно:

import os
from openai import OpenAI

client = OpenAI(
    api_key=os.environ["OPENAI_API_KEY"],
)

Клиент управляет пулом соединений, повторными попытками и тайм-аутами. Создайте один экземпляр и используйте его повторно во всем приложении, а не создавайте новый для каждого запроса.

Настраиваемые параметры при инициализации:

Параметр По умолчанию Описание
api_key переменная окружения OPENAI_API_KEY Учетные данные для аутентификации
base_url https://api.openai.com/v1 Переопределение для прокси или совместимого API
timeout 600 с Тайм-аут на запрос
max_retries 2 Автоматические повторные попытки при ошибках ограничения скорости
http_client None Пользовательский клиент httpx для прокси или конфигурации сертификата

Чат-завершения: базовый запрос

Чат-завершения — самый распространенный вариант использования. Список messages следует тому же формату, что и API: список словарей с ролью и содержимым, представляющих беседу:

import os
from openai import OpenAI

client = OpenAI(api_key=os.environ["OPENAI_API_KEY"])

response = client.chat.completions.create(
    model="gpt-4o",
    messages=[
        {"role": "system", "content": "Вы — полезный ассистент по программированию."},
        {"role": "user", "content": "В чем разница между списком и кортежем в Python?"},
    ],
    temperature=0.3,
    max_tokens=512,
)

print(response.choices[0].message.content)

Ответ — объект ChatCompletion. Ключевые поля:

  • response.choices[0].message.content — текстовый ответ
  • response.usage.prompt_tokens — токены, потребленные входными данными
  • response.usage.completion_tokens — токены, потребленные выходными данными
  • response.model — версия модели, которая обслужила запрос

Для продакшена передавайте max_tokens, чтобы избежать неконтролируемых затрат на генерацию, и temperature=0 или низкие значения, когда вам нужны детерминированные выходные данные.

Потоковые ответы

Для интерактивных интерфейсов, где пользователи видят токены по мере их поступления, используйте stream=True:

import os
from openai import OpenAI

client = OpenAI(api_key=os.environ["OPENAI_API_KEY"])

with client.chat.completions.stream(
    model="gpt-4o",
    messages=[
        {"role": "user", "content": "Объясните генераторы Python простым языком."},
    ],
) as stream:
    for text in stream.text_stream:
        print(text, end="", flush=True)

Использование менеджера контекста (оператор with) гарантирует, что соединение будет правильно закрыто после итерации. Атрибут .text_stream выдает простые строки; .stream выдает необработанные объекты событий, если вам нужны метаданные, такие как статистика использования на каждый чанк.

Если вам нужна потоковая передача без менеджера контекста:

stream = client.chat.completions.create(
    model="gpt-4o",
    messages=[{"role": "user", "content": "Перечислите 5 лучших практик Python."}],
    stream=True,
)
for chunk in stream:
    delta = chunk.choices[0].delta
    if delta.content:
        print(delta.content, end="", flush=True)

Вызов функций

Вызов функций позволяет модели решать, когда вызвать функцию, и возвращать объект аргументов в формате JSON. Ваше приложение выполняет функцию, а затем отправляет результат обратно, чтобы модель включила его в свой ответ:

import os
import json
from openai import OpenAI

client = OpenAI(api_key=os.environ["OPENAI_API_KEY"])

tools = [
    {
        "type": "function",
        "function": {
            "name": "get_weather",
            "description": "Возвращает текущую погоду для города.",
            "parameters": {
                "type": "object",
                "properties": {
                    "city": {
                        "type": "string",
                        "description": "Название города, например 'Сан-Франциско'",
                    }
                },
                "required": ["city"],
            },
        },
    }
]

messages = [{"role": "user", "content": "Какая погода в Токио?"}]

response = client.chat.completions.create(
    model="gpt-4o",
    messages=messages,
    tools=tools,
    tool_choice="auto",
)

choice = response.choices[0]
if choice.finish_reason == "tool_calls":
    tool_call = choice.message.tool_calls[0]
    args = json.loads(tool_call.function.arguments)
    # Выполните вашу фактическую функцию здесь
    result = {"city": args["city"], "temperature": "18°C", "condition": "облачно"}

    messages.append(choice.message)
    messages.append({
        "role": "tool",
        "tool_call_id": tool_call.id,
        "content": json.dumps(result),
    })

    final = client.chat.completions.create(
        model="gpt-4o",
        messages=messages,
    )
    print(final.choices[0].message.content)

Модель возвращает finish_reason="tool_calls", когда хочет вызвать функцию. Вы запускаете функцию, добавляете результат в список сообщений и делаете второй запрос. Этот двухшаговый цикл является стандартным шаблоном.

Асинхронное использование с AsyncOpenAI

Для FastAPI, сервисов на основе asyncio или любого кода, который выигрывает от неблокирующего ввода-вывода, используйте AsyncOpenAI:

import os
import asyncio
from openai import AsyncOpenAI

client = AsyncOpenAI(api_key=os.environ["OPENAI_API_KEY"])

async def get_response(prompt: str) -> str:
    response = await client.chat.completions.create(
        model="gpt-4o-mini",
        messages=[{"role": "user", "content": prompt}],
        max_tokens=256,
    )
    return response.choices[0].message.content

async def main():
    result = await get_response("Что такое asyncio в Python?")
    print(result)

asyncio.run(main())

AsyncOpenAI — это взаимозаменяемый асинхронный аналог; все методы являются ожидаемыми. Это предпочтительнее, чем использование asyncio.to_thread для обертывания синхронного клиента.

JavaScript SDK для OpenAI

JavaScript SDK для OpenAI (openai на npm) во многом повторяет интерфейс Python. Установите его:

npm install openai

Базовое чат-завершение в Node.js:

import OpenAI from "openai";

const client = new OpenAI({
  apiKey: process.env.OPENAI_API_KEY,
});

const response = await client.chat.completions.create({
  model: "gpt-4o",
  messages: [
    { role: "system", content: "You are a helpful assistant." },
    { role: "user", content: "Explain promises vs async/await in JavaScript." },
  ],
  max_tokens: 512,
});

console.log(response.choices[0].message.content);

Потоковая передача в JavaScript:

import OpenAI from "openai";

const client = new OpenAI({ apiKey: process.env.OPENAI_API_KEY });

const stream = await client.chat.completions.stream({
  model: "gpt-4o",
  messages: [{ role: "user", content: "Summarize the fetch API in 3 sentences." }],
});

for await (const chunk of stream) {
  const text = chunk.choices[0]?.delta?.content ?? "";
  process.stdout.write(text);
}

JavaScript SDK поддерживает Node.js 18+, Deno и браузерные среды (хотя раскрытие вашего API-ключа в браузере небезопасно — используйте прокси на стороне сервера). Опция base_url для указания на совместимые API работает точно так же, как в Python.

Интеграция Azure OpenAI с Python

Если вы используете сервис Azure OpenAI, а не прямой API OpenAI, используйте клиент AzureOpenAI из того же пакета:

import os
from openai import AzureOpenAI

client = AzureOpenAI(
    api_key=os.environ["AZURE_OPENAI_API_KEY"],
    azure_endpoint=os.environ["AZURE_OPENAI_ENDPOINT"],
    api_version="2024-02-01",
)

response = client.chat.completions.create(
    model="gpt-4o",  # Имя вашего развертывания в Azure
    messages=[
        {"role": "user", "content": "Как использовать Azure OpenAI с Python?"},
    ],
)

print(response.choices[0].message.content)

Необходимые переменные окружения для Azure:

  • AZURE_OPENAI_API_KEY: Ключ API вашего ресурса Azure
  • AZURE_OPENAI_ENDPOINT: URL вашей конечной точки, например https://your-resource.openai.azure.com/

Параметр model в Azure OpenAI относится к имени вашего развертывания, а не к базовому имени модели. Установите api_version в соответствии с версией API Azure, которую использует ваше развертывание (проверьте документацию Azure OpenAI для получения информации о текущих поддерживаемых версиях).

Для аутентификации через Microsoft Entra ID (ранее Azure AD) вместо ключа API:

from azure.identity import DefaultAzureCredential, get_bearer_token_provider
from openai import AzureOpenAI

token_provider = get_bearer_token_provider(
    DefaultAzureCredential(),
    "https://cognitiveservices.azure.com/.default",
)

client = AzureOpenAI(
    azure_ad_token_provider=token_provider,
    azure_endpoint=os.environ["AZURE_OPENAI_ENDPOINT"],
    api_version="2024-02-01",
)

Переключение на совместимый с OpenAI API Novita AI

Novita AI предоставляет совместимую с OpenAI конечную точку по адресу https://api.novita.ai/openai. Вы можете использовать тот же openai Python или JavaScript SDK, изменив только base_url и api_key. Никаких других изменений в коде не требуется:

import os
from openai import OpenAI

client = OpenAI(
    api_key=os.environ["NOVITA_API_KEY"],
    base_url="https://api.novita.ai/openai",
)

response = client.chat.completions.create(
    model="deepseek/deepseek-v4-pro",
    messages=[
        {"role": "system", "content": "Вы — полезный ассистент по программированию."},
        {"role": "user", "content": "Объясните, как GIL в Python влияет на многопоточность."},
    ],
    temperature=0.3,
    max_tokens=512,
)

print(response.choices[0].message.content)

Получите ключ API Novita AI на novita.ai/settings/key-management. Один и тот же ключ работает со всеми API Novita AI, включая совместимую с OpenAI конечную точку.

JavaScript с Novita AI:

import OpenAI from "openai";

const client = new OpenAI({
  apiKey: process.env.NOVITA_API_KEY,
  baseURL: "https://api.novita.ai/openai",
});

const response = await client.chat.completions.create({
  model: "qwen/qwen3-coder-30b-a3b-instruct",
  messages: [{ role: "user", content: "Write a Python type annotation cheatsheet." }],
  max_tokens: 600,
});

console.log(response.choices[0].message.content);

Все остальное — потоковая передача, вызов функций, асинхронное использование, response_format, temperature, max_tokens — работает идентично. Конечная точка Novita AI следует спецификации API Chat Completions OpenAI.

Модели с открытым исходным кодом через Novita AI

Замена base_url дает вам доступ к каталогу моделей с открытым весом, которые теперь конкурентоспособны с закрытыми флагманскими моделями в конкретных задачах. Для рабочих процессов программирования, вызова функций и рассуждений с длинным контекстом практический разрыв значительно сократился.

Модели, доступные через совместимую с OpenAI конечную точку Novita AI, которые стоит оценить:

DeepSeek V4 Pro (deepseek/deepseek-v4-pro): Большая MoE-модель (лицензия, близкая к MIT), которая занимает высокие позиции в SWE-Bench и бенчмарках вызова функций. Мощная для агентов кодирования, ревью кода и задач многошагового использования инструментов, где в противном случае вы бы обратились к GPT-4o или Claude Opus.

Qwen3 Coder 30B A3B Instruct (qwen/qwen3-coder-30b-a3b-instruct): Разреженная MoE-модель на 30 млрд параметров из семейства Qwen Coder, оптимизированная для генерации кода, триажа ошибок и ревью пул-реквестов. По цене $0,07 за 1 млн входных токенов и $0,27 за 1 млн выходных токенов на Novita AI, она значительно дешевле большинства закрытых API для рутинной помощи в программировании.

Qwen3 235B A22B Instruct (qwen/qwen3-235b-a22b-instruct-2507): Большая MoE-модель (Apache 2.0) с сильными рассуждениями и многоязычной производительностью кодирования. Хороша для задач, где вы сейчас используете GPT-4o для креативных или сложных ответов, но хотите снизить затраты на токен при больших объемах.

Формат идентификатора модели на Novita AI: provider/model-name. Вы передаете его напрямую в параметр model в SDK.

Простой шаблон маршрутизации для команд, которые хотят смешивать открытые и закрытые модели:

def get_client(use_novita: bool = False) -> OpenAI:
    if use_novita:
        return OpenAI(
            api_key=os.environ["NOVITA_API_KEY"],
            base_url="https://api.novita.ai/openai",
        )
    return OpenAI(api_key=os.environ["OPENAI_API_KEY"])

# Используйте открытый вес для чувствительных к стоимости задач с высоким объемом кодирования
coding_client = get_client(use_novita=True)

# Используйте OpenAI для задач, где закрытая модель действительно лучше
openai_client = get_client(use_novita=False)

Это позволяет вам A/B тестировать качество вывода, сравнивать производительность по задачам и переносить объемы на более дешевые модели, не затрагивая логику запросов.

Часто задаваемые вопросы

Как называется пакет OpenAI для Python?

Имя пакета на PyPI — openai. Установка: pip install openai.

Как называется класс клиента OpenAI в Python?

Основной класс — OpenAI для синхронного использования и AsyncOpenAI для асинхронного. Оба находятся в модуле openai: from openai import OpenAI, AsyncOpenAI.

Поддерживает ли OpenAI Python SDK потоковую передачу?

Да. Используйте client.chat.completions.stream() как менеджер контекста или передайте stream=True в client.chat.completions.create() и итерируйтесь по чанкам.

Как называется пакет JavaScript SDK для OpenAI?

Пакет npm — openai. Установка: npm install openai. Сигнатуры классов и методов почти идентичны Python SDK.

Как использовать Azure OpenAI с Python?

Используйте класс AzureOpenAI из пакета openai. Передайте azure_endpoint, api_key и api_version. Параметр model относится к имени вашего развертывания Azure, а не к базовой модели.

Могу ли я использовать OpenAI Python SDK с другими провайдерами?

Да. Любой провайдер, реализующий формат API Chat Completions OpenAI, может быть использован путем установки base_url у клиента. Конечная точка Novita AI по адресу https://api.novita.ai/openai — один из примеров; полный набор функций SDK — потоковая передача, вызов функций, асинхронность — работает без изменений.

Как защитить мой ключ API OpenAI?

Храните ключ в переменной окружения (OPENAI_API_KEY) и считывайте его с помощью os.environ["OPENAI_API_KEY"]. Никогда не помещайте его в исходный код, публичные репозитории, логи сборки или клиентский JavaScript.

Рекомендуемые статьи