- Установка пакета OpenAI для Python
- Класс клиента OpenAI
- Чат-завершения: базовый запрос
- Потоковые ответы
- Вызов функций
- Асинхронное использование с AsyncOpenAI
- JavaScript SDK для OpenAI
- Интеграция Azure OpenAI с Python
- Переключение на совместимый с OpenAI API Novita AI
- Модели с открытым исходным кодом через Novita AI
- Часто задаваемые вопросы
- Рекомендуемые статьи
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 вашего ресурса AzureAZURE_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.
Рекомендуемые статьи
- Novita AI теперь поддерживает OpenAI Agents SDK! — Подключите модели Novita AI к OpenAI Agents SDK для многоагентной оркестрации, ограничений и трассировки.
- Qwen3 Coder 30B A3B Instruct: Быстрый старт — Идентификатор модели, цены, контекстное окно и примеры API для этой экономичной модели кодирования на Novita AI.
- Vercel AI SDK: Полное руководство разработчика по созданию AI-приложений — Используйте Vercel AI SDK с совместимой с OpenAI конечной точкой Novita AI для потоковой передачи, вызова инструментов и агентских циклов на TypeScript.
