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

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

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

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

Требуется Python 3.10 или выше:

pip install openai

Если вы переходите с устаревшего 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 600s Тайм-аут на запрос
max_retries 2 Автоматические повторные попытки при ошибках ограничения скорости
http_client None Пользовательский httpx-клиент для настройки прокси или сертификатов

Chat Completions: базовый запрос

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

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": "You are a helpful coding assistant."},
        {"role": "user", "content": "What is the difference between a list and a tuple in 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": "Explain Python generators in plain language."},
    ],
) 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": "List 5 Python best practices."}],
    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": "Returns current weather for a city.",
            "parameters": {
                "type": "object",
                "properties": {
                    "city": {
                        "type": "string",
                        "description": "City name, e.g. 'San Francisco'",
                    }
                },
                "required": ["city"],
            },
        },
    }
]

messages = [{"role": "user", "content": "What's the weather in Tokyo?"}]

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)
    # Execute your actual function here
    result = {"city": args["city"], "temperature": "18°C", "condition": "cloudy"}

    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", когда хочет вызвать функцию. Вы выполняете функцию, добавляете результат в список messages и отправляете второй запрос. Этот двухэтапный цикл — стандартный паттерн.

Асинхронное использование с 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("What is asyncio in Python?")
    print(result)

asyncio.run(main())

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

OpenAI JavaScript SDK

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

npm install openai

Базовый запрос Chat Completions в 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",  # Your deployment name in Azure
    messages=[
        {"role": "user", "content": "How do I use Azure OpenAI with 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 в соответствии с версией Azure API, которую использует ваше развёртывание (см. документацию 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",
)

Используйте Novita AI с тем же SDK

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-v3.1",
    messages=[
        {"role": "system", "content": "You are a helpful coding assistant."},
        {"role": "user", "content": "Explain how Python's GIL affects multithreading."},
    ],
    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-480b-a35b-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 Agent Sandbox

Используйте SDK OpenAI для вызовов моделей, а затем применяйте Novita Agent Sandbox, когда вашему процессу нужны изолированное выполнение кода, действия в браузере или файловые операции. Это позволяет уровню SDK оставаться сфокусированным на инференсе, в то время как Sandbox обрабатывает опасные части агентского цикла.

Открытые модели через Novita AI

Замена base_url даёт вам доступ к моделям с открытыми весами на Novita AI без изменения клиентского кода. Это полезно, когда вам нужна модель для кодинга, использования инструментов или работы с длинным контекстом, но при этом вы хотите сохранить тот же рабочий процесс SDK.

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

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

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"])

# Use open-weight for cost-sensitive, high-volume coding tasks
coding_client = get_client(use_novita=True)

# Use OpenAI for tasks where the closed model is genuinely better
openai_client = get_client(use_novita=False)

Это позволяет проводить A/B-тестирование качества ответов, направлять работу в Novita AI, когда это подходит, и сохранять единый путь SDK для всех провайдеров.

FAQ

Как называется пакет 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() и итерируйтесь по фрагментам.

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

Пакет на npm называется openai. Установите его с помощью npm install openai. Сигнатуры классов и методов почти идентичны Python SDK.

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

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

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

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

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

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

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