Введение
С OpenAI API можно взаимодействовать через HTTP-запросы помощью любого языка программирования, используя наши официальные библиотеки для Python и Node.js, а также сторонние библиотеки.
Чтобы установить официальную библиотеку Python, выполните следующую команду:
pip install openai
Чтобы установить официальную библиотеку для Node.js, выполните следующую команду в вашем проекте Node.js:
npm install openai
Аутентификация
API ключи
OpenAI API использует ключи API для аутентификации. В России доступ к API OpenAI ограничен. Чтобы получить API-ключ, можно воспользоваться сервисом AITunnel, который предоставляет доступ к OpenAI API в России. API-ключи AiTunnel обладают полной совместимостью с OpenAI, что позволяет вам исключить необходимость в переписывании ваших скриптов. Поддерживает стандартные библиотеки для Python, JavaScript, GO, php, curl, что делает интеграцию в ваши проекты простой и быстрой.
Каждый ключ API может быть ограничен одним из следующих вариантов:
- Ключи проекта — предоставляют доступ к одному проекту (предпочтительный вариант); доступ можно получить, выбрав конкретный проект, для которого вы хотите сгенерировать ключи.
- Ключи пользователя — наши устаревшие ключи. Предоставляют доступ ко всем организациям и всем проектам, к которым добавлен пользователь; предлагается переход на ключи проектов для обеспечения лучшей безопасности, однако доступ через этот метод пока поддерживается.
Помните, что ваш API ключ — это секрет! Не делитесь им с другими и не публикуйте его в коде на клиентской стороне (браузеры, приложения). Запросы необходимо направлять через ваш собственный сервер, где ключ API можно безопасно загрузить из переменной окружения или сервиса управления ключами.
Все API-запросы должны включать ваш ключ API в HTTP-заголовок Authorization следующим образом:
Authorization: Bearer OPENAI_API_KEY
Организации и проекты (опционально)
Если вы принадлежите к нескольким организациям или используете свои проекты через устаревший пользовательский ключ API, можно передать заголовок, чтобы указать, какая организация и проект будут использованы для API-запроса. Пользование этими API-запросами будет считаться в качестве использования указанной организации и проекта.
Чтобы получить доступ к проекту по умолчанию в организации, оставьте заголовок OpenAI-Project пустым.
Пример команды curl:
curl https://api.openai.com/v1/models \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-H "OpenAI-Organization: YOUR_ORG_ID" \
-H "OpenAI-Project: $PROJECT_ID"
Пример с пакетом openai для Python:
from openai import OpenAI
client = OpenAI(
organization='YOUR_ORG_ID',
project='$PROJECT_ID',
)
Пример с пакетом openai для Node.js:
import OpenAI from "openai";
const openai = new OpenAI({
organization: "YOUR_ORG_ID",
project: "$PROJECT_ID",
});
Идентификаторы организаций можно найти на странице настроек вашей организации. Идентификаторы проектов можно найти на странице общих настроек, выбрав конкретный проект.
Выполнение запросов
Вы можете вставить следующую команду в терминал, чтобы выполнить ваш первый API-запрос. Убедитесь, что заменили $OPENAI_API_KEY вашим секретным API ключом. Если вы используете устаревший ключ пользователя и у вас несколько проектов, вам также нужно указать Идентификатор проекта. Для повышения безопасности рекомендуется переходить на ключи, основанные на проектах.
curl https://api.openai.com/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-d '{
"model": "gpt-4o-mini",
"messages": [{"role": "user", "content": "Say this is a test!"}],
"temperature": 0.7
}'
Этот запрос запрашивает модель gpt-4o-mini
(которая в реальности представляет собой вариант модели gpt-4o-mini
), чтобы завершить текст, начиная с подсказки "Say this is a test". В ответ вы должны получить нечто вроде следующего:
{
"id": "chatcmpl-abc123",
"object": "chat.completion",
"created": 1677858242,
"model": "gpt-4o-mini",
"usage": {
"prompt_tokens": 13,
"completion_tokens": 7,
"total_tokens": 20,
"completion_tokens_details": {
"reasoning_tokens": 0,
"accepted_prediction_tokens": 0,
"rejected_prediction_tokens": 0
}
},
"choices": [
{
"message": {
"role": "assistant",
"content": "\n\nThis is a test!"
},
"logprobs": null,
"finish_reason": "stop",
"index": 0
}
]
}
Теперь, когда вы сгенерировали ваше первое завершение чата, давайте разберем объект ответа. Мы можем увидеть, что finish_reason — это "stop", что означает, что API вернул полное завершение чата, сгенерированное моделью, не натолкнувшись на какие-либо ограничения. В списке choices мы сгенерировали только одно сообщение, но вы можете установить параметр n, чтобы сгенерировать несколько вариантов сообщений.
Потоковая передача
OpenAI API предоставляет возможность потоковой передачи ответов обратно клиенту для получения частичных результатов для некоторых запросов. Чтобы сделать это, мы следуем стандарту Server-sent events. Наши официальные библиотеки Node и Python включают функции, упрощающие разбор этих событий.
Стриминг поддерживается как для API завершений чата, так и для API ассистентов. В этом разделе основное внимание уделяется работе потоковой передачи для завершений чата. Узнайте больше о том, как работает потоковая передача в API ассистентов здесь.
Запрос на стриминг выглядит так:
from openai import OpenAI
client = OpenAI()
stream = client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": "Say this is a test"}],
stream=True,
)
for chunk in stream:
if chunk.choices[0].delta.content is not None:
print(chunk.choices[0].delta.content, end="")
import OpenAI from "openai";
const openai = new OpenAI();
async function main() {
const stream = await openai.chat.completions.create({
model: "gpt-4o-mini",
messages: [{ role: "user", content: "Say this is a test" }],
stream: true,
});
for await (const chunk of stream) {
process.stdout.write(chunk.choices[0]?.delta?.content || "");
}
}
main();
Разбор событий, отправленных сервером
Разбор событий, отправленных сервером, непростой и должен выполняться с осторожностью. Простые стратегии, такие как разделение по новой строке, могут привести к ошибкам разбора. Мы рекомендуем использовать существующие клиентские библиотеки, когда это возможно.
Отладка запросов
Помимо кодов ошибок, возвращаемых в ответах API, иногда может потребоваться проверить заголовки ответа HTTP. Особенно интересными будут заголовки, содержащие уникальный идентификатор конкретного API-запроса и информацию об ограничении скорости, применяемом к вашим запросам. Ниже приведен неполный список HTTP-заголовков, возвращаемых с ответами API:
Информация о метаданных API
- openai-organization: Организация, связанная с запросом
- openai-processing-ms: Время обработки вашего API запроса
- openai-version: Версия REST API, использованная для этого запроса (в настоящее время 2020-10-01)
- x-request-id: Уникальный идентификатор для этого API-запроса (используется при отладке)
Информация об ограничении скорости
- x-ratelimit-limit-requests
- x-ratelimit-limit-tokens
- x-ratelimit-remaining-requests
- x-ratelimit-remaining-tokens
- x-ratelimit-reset-requests
- x-ratelimit-reset-tokens
OpenAI рекомендует регистрировать идентификаторы запросов в производственных развертываниях, что позволит более эффективно устранять неполадки с нашей службой поддержки в случае необходимости. Наши официальные SDK предоставляют свойство на уровне объектов ответа, содержащее значение заголовка x-request-id.
Идентификатор запроса в Python
from openai import OpenAI
client = OpenAI()
response = client.chat.completions.create(
messages=[{
"role": "user",
"content": "Say this is a test",
}],
model="gpt-4o-mini",
)
print(response._request_id)
Идентификатор запроса в JavaScript
import OpenAI from 'openai';
const client = new OpenAI();
const response = await client.chat.completions.create({
messages: [{ role: 'user', content: 'Say this is a test' }],
model: 'gpt-4o-mini'
});
console.log(response._request_id);
Доступ к необработанным объектам ответов в SDK
Если вы используете низкоуровневый HTTP-клиент (например, fetch или HttpClient в C#), у вас уже должен быть доступ к заголовкам ответов как часть интерфейса HTTP.
Если вы используете один из официальных SDK OpenAI (которые в значительной степени абстрагируют цикл HTTP-запроса/ответа), вам нужно будет получить доступ к необработанным HTTP-ответам немного иначе.
Ниже приведен пример доступа к необработанному объекту ответа (и заголовку x-ratelimit-limit-tokens) с использованием нашего SDK для Python.
from openai import OpenAI
client = OpenAI()
response = client.chat.completions.with_raw_response.create(
messages=[{
"role": "user",
"content": "Say this is a test",
}],
model="gpt-4o-mini",
)
print(response.headers.get('x-ratelimit-limit-tokens'))
# получить объект, который `chat.completions.create()` вернет
completion = response.parse()
print(completion)
Вот как вы получите доступ к необработанному ответу (и заголовку x-ratelimit-limit-tokens) с использованием нашего SDK для JavaScript.
import OpenAI from 'openai';
const client = new OpenAI();
const response = await client.chat.completions.create({
messages: [{ role: 'user', content: 'Say this is a test' }],
model: 'gpt-4o-mini'
}).asResponse();
// доступ к объекту Response
console.log(response.headers.get('x-ratelimit-limit-tokens'));