ChatGPT-бот в консоли

Первые шаги – вызываем модель 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 — так код получается проще и единообразнее

Начать заново?

Помощник начнёт новый диалог по этой задаче. Текущая переписка останется в истории до конца срока хранения.

О переписке

Можно приложить до трёх фото PNG, JPEG или WebP по 5 МБ.

Переписка и фото хранятся 90 дней после последнего принятого сообщения. Преподаватель получит доступ к диалогу, когда вы попросите его помочь.

Проверка решения остаётся отдельным действием.