Первые шаги – вызываем модель ChatGPT через API
Содержание курса
🔹 Первый запрос к API, разбор ответа
Разберём минимальный код, который отправляет запрос к модели через OpenAI API, и корректно извлекает текст ответа. Заодно поймём, где в объекте ответа лежат полезные поля, и как добавить базовые параметры.
🔸 Пример Responses API
Создайте файл hello_llm.py со следующим содержимым. Мы используем современный клиент OpenAI и метод client.responses.create(...):
import os
from dotenv import load_dotenv
from openai import OpenAI
load_dotenv()
# Клиент читает ключ и базовый URL из окружения
client = OpenAI(
api_key=os.getenv("OPENAI_API_KEY"),
base_url=os.getenv("OPENAI_API_BASE", "https://api.openai.com/v1"),
)
resp = client.responses.create(
model=os.getenv("OPENAI_MODEL", "gpt-4o"), # название модели
instructions="Ты дружелюбный ассистент. Отвечай кратко и по делу.", # Краткая инструкция ассистенту (необязательно)
input="Привет! Расскажи, что ты умеешь.", # Сам запрос (строка или массив «контента»)
# Примеры полезных параметров:
# temperature=0.7,
# max_output_tokens=300,
# timeout=15, # чтобы не вешать приложение при долгом ответе
)
# 1) Выводим ответ(самый простой способ)
print(resp.output_text)
# 2) При необходимости — посмотреть «сырой» объект целиком
# (структура может меняться от версии к версии, это нормально)
print(resp)
Запустите скрипт (python hello_llm.py). Если всё настроено правильно, в консоли появится ответ модели (строка):
а затем — распечатка всего объекта ответа:
🔸 Извлечение текста ответа
В интерфейсе Responses API уже есть готовое поле resp.output_text — это самый надёжный способ получить чистый текст. Этого достаточно в 99% случаев. Если нужен «низкоуровневый» доступ (например, вы парсите поток или мультимодальные ответы), работайте с полями объекта resp, но в учебных шагах мы ограничимся output_text.
🔸 Что ещё полезно посмотреть в ответе
- Идентификатор и модель: пригодятся для логов и отладки (например,
resp.id,resp.model, если поля присутствуют в вашей версии). - Статистика использования (tokens): в некоторых конфигурациях доступна через
resp.usage— удобно для грубой оценки стоимости. - Сырые блоки вывода: если вы решите анализировать структуру глубже (например, разметку контента), распечатайте весь объект
respи посмотрите поля output/content и т. п.
🔸 Параметры вызова (это базовый минимум, вообще параметров больше)
model— идентификатор модели. В нашем коде мы подставляем переменнуюOPENAI_MODELиз файла.env, чтобы легко переключаться между моделями в разных средахtemperature— «креативность» ответа. от 0 до 1. Чем больше тем креативней будет ответ. например: 0–0.3 для строгих и детерминированных ответов (код/формулы), 0.7–1.0 — для более творческих ответов, например для генерации стиховmax_output_tokens— верхний предел длины генерации (чтобы ответы не разрастались)timeout— секунд до принудительного прерывания запроса (защита от «виснущих» вызовов)
🔸 Про базовый URL
Если вы используете прокси, передайте адрес через OPENAI_API_BASE, как в примере как обсуждали на предыдущем шаге. С точки зрения кода всё то же самое. Если видите ошибки сети/авторизации — проверьте ключ и URL.
🔸 Альтернатива: Chat Completions (совместимость)
Если по каким-то причинам вам нужен именно чат-формат сообщений (с ролями system/user/assistant), используйте:
import os
from dotenv import load_dotenv
from openai import OpenAI
load_dotenv()
client = OpenAI(
api_key=os.getenv("OPENAI_API_KEY"),
base_url=os.getenv("OPENAI_API_BASE", "https://api.openai.com/v1"),
)
chat = client.chat.completions.create(
model=os.getenv("OPENAI_MODEL", "gpt-4o"),
messages=[
{"role": "system", "content": "Ты дружелюбный ассистент. Отвечай кратко."},
{"role": "user", "content": "Привет! Расскажи, что ты умеешь."}
],
# temperature=0.7,
# max_tokens=300,
# timeout=15,
)
print(chat.choices[0].message.content)
💡 Для учебного CLI мы остаёмся на Responses API — так код получается проще и единообразнее
