Перейти к основному содержимому

OpenAI / API — готовые промпты и вызовы

Подборка готовых промптов и рабочих вызовов OpenAI API с построчным разбором каждой строки — как в галерее Turtle или Fetch / axios. Материал для тех, кто в Google ищет «openai api python example», «как подключить chatgpt api», «openai chat completions», «system prompt example», «openai streaming python», «chatgpt api key python» или сдаёт лабораторную по нейросетям.

Каждый блок ниже можно скопировать целиком → подставить свой ключ → запустить → прочитать таблицу «что написано» и «зачем так».


Для кого эта статья

АудиторияЗачем открыть
ШкольникиПервый скрипт «спросить GPT из Python», проект на информатике
СтудентыЛабораторная «чат-бот», «анализ текста», отчёт с листингом кода
СамоучкиСкопировали .pypython ask.py → разобрали таблицу под кодом
После ChatGPT в браузереПонять, как тот же диалог выглядит в HTTP и Python
Сначала теория

Как устроены LLM — большие языковые модели и ChatGPT. Роль, контекст и окно токенов — контекст. Temperature, top_p, max_tokens — параметры генерации. Промышленная обёртка — интеграция ИИ в Python. Локально без облака — Ollama. HTTP в терминале — curl / fetch. Эта статья — практическая галерея, как примеры Turtle для рисования.

API-ключ

Ключ храните в OPENAI_API_KEY, в .env (файл в .gitignore) или в секретах CI. Никогда не коммитьте ключ в Git и не вставляйте в чат с другой нейросетью. При утечке — отзовите ключ в кабинете провайдера и создайте новый.


Как пользоваться статьёй

  1. Пройдите подготовку окружения — ключ, pip install openai.
  2. Запустите минимальный Python-пример — убедитесь, что ответ приходит.
  3. Скопируйте нужный блок (промпт или вызов) в свой файл.
  4. Прочитайте Разбор построчно и блок Частая ошибка под кодом.
  5. Измените текст промпта или temperature — так быстрее запоминается API.

Частые запросы в Google — куда смотреть

Ищут в интернетеРаздел ниже
openai api python example / chat completions pythonМинимальный вызов Python
chatgpt api python / how to use openai apiОбязательный шаблон ask.py
openai api curl example / chatgpt api curlТот же запрос через curl
openai api javascript / fetch openai nodeВызов из Node.js
openai api key environment variableПодготовка окружения
system prompt openai exampleРоль system
openai json mode python / response_formatОтвет в JSON
openai streaming python exampleПотоковый ответ
openai embeddings pythonEmbeddings
openai api 401 / invalid api keyТипичные ошибки
openai temperature max_tokens exampleПараметры генерации
chatgpt prompt template code reviewГотовые промпты
chatgpt api vs website / разница api и chatgptChatGPT и API

ChatGPT в браузере и OpenAI API

ChatGPT (сайт)OpenAI API (код)
Кто нажимаетВы в чатеВаша программа, бот, сайт
ОплатаПодписка Plus / бесплатный лимитОплата за токены (объём текста)
ФорматОкно браузераHTTP POST + JSON
АвтоматизацияВручнуюЦикл, база данных, Telegram-бот

Смысл API: вы отправляете тот же тип сообщений (system, user, assistant), что видит модель в ChatGPT, только из Python, JavaScript или curl. Ответ приходит строкой текста (или JSON) — её можно сохранить в файл, показать на сайте или отправить в Telegram.


Словарь за 30 секунд

ТерминПростыми словамиКак в коде
API«Дверь» для программ к серверу моделиPOST https://api.openai.com/v1/chat/completions
Chat CompletionsМетод «диалог» — список репликclient.chat.completions.create(...)
ПромптТекст запроса"content": "Объясни цикл for"
systemПравила для модели на весь чат"role": "system"
userВопрос или данные пользователя"role": "user"
assistantПрошлый ответ модели"role": "assistant"
modelКакая нейросеть отвечает"model": "gpt-4o-mini"
tokenКусок текста (~слово/часть слова)Поле usage в ответе
streamingОтвет по буквам, как в ChatGPTstream=True
embeddingВектор чисел «смысла» текстаclient.embeddings.create(...)

Как подготовить окружение

Шаг 1 — API key и переменная окружения

  1. Зарегистрируйтесь у провайдера (OpenAI или совместимый сервис).
  2. В личном кабинете создайте API key — строка вида sk-proj-....
  3. Задайте переменную окружения до запуска Python.

Windows PowerShell:

$env:OPENAI_API_KEY = "sk-proj-ВАШ_КЛЮЧ"

Linux / macOS:

export OPENAI_API_KEY="sk-proj-ВАШ_КЛЮЧ"

Разбор команд:

КомандаЧто делаетЗачем
$env:OPENAI_API_KEY = "..."Записывает ключ в переменную только для текущего окна PowerShellSDK читает ключ автоматически; его нет в коде
export OPENAI_API_KEY=...То же в bash/zshСтандарт для Linux-серверов и macOS
Кавычки вокруг ключаЗащита от спецсимволовБез кавычек shell может обрезать строку

Проверка (Python):

python -c "import os; print('OK' if os.getenv('OPENAI_API_KEY') else 'Нет ключа')"

Частая ошибка: ключ прописан в .py файле и случайно залит на GitHub — боты крадут такие ключи за минуты. Храните только в окружении или .env + .gitignore.


Шаг 2 — установка Python SDK

pip install openai

Разбор:

ЧастьСмысл
pipМенеджер пакетов Python
install openaiОфициальная библиотека OpenAI — обёртка над HTTP
После установкиВ коде from openai import OpenAI

Проверка версии:

python -c "import openai; print(openai.__version__)"

Шаг 3 — как запустить любой пример

Вариант A — файл ask.py (удобнее всего)

  1. Создайте папку, например gpt-lab.
  2. Сохраните код примера в ask.py.
  3. В терминале в этой папке:
python ask.py

Вариант B — интерактивный Python

python

Вставьте код без строк if __name__ == "__main__". После client = OpenAI() можно вызывать create построчно.

Вариант C — curl без Python

См. раздел curl — полезно для проверки ключа и отладки JSON.

Вариант D — Node.js

См. раздел Node fetch — файл script.mjs, команда node script.mjs.


Минимальный вызов — Python

Обязательный шаблон

Любой рабочий скрипт с OpenAI API строится из четырёх шагов — запомните их, как import turtle и turtle.done() в галерее Turtle:

  1. Импорт и создание клиента OpenAI().
  2. Массив messages — минимум одна реплика user.
  3. Вызов chat.completions.create с полем model.
  4. Чтение текста из response.choices[0].message.content.

Задача: задать один вопрос модели и вывести ответ в консоль.

import os
from openai import OpenAI

client = OpenAI()

response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[
{"role": "user", "content": "Объясни рекурсию в двух предложениях на русском."},
],
)

print(response.choices[0].message.content)

Разбор построчно:

СтрокаЧто происходитЗачем
import osПодключает модуль для работы с ОСНиже можно проверить OPENAI_API_KEY (в расширенных примерах)
from openai import OpenAIКласс клиента из официального SDKБез SDK пришлось бы вручную собирать HTTP POST
client = OpenAI()Создаёт клиент с настройками по умолчаниюКлюч берётся из переменной OPENAI_API_KEY
client.chat.completions.create(Метод «создать ответ в чате»Внутри — запрос на /v1/chat/completions
model="gpt-4o-mini"Имя модели на сервереДешёвая и быстрая модель для учёбы и тестов
messages=[ ... ]Список реплик диалогаМодель читает их сверху вниз как историю
"role": "user"Роль «пользователь»Стандарт Chat Completions API
"content": "Объясни..."Текст вопроса — ваш промптМожно менять на любой текст
response = ...Объект ответа целикомВнутри — текст, статистика токенов, id запроса
response.choices[0]Первый (и обычно единственный) вариант ответаПри n=2 вариантов будет два
.message.contentСтрока с текстом от моделиИменно её показывают пользователю
print(...)Вывод в консольВ боте вместо print — отправка в Telegram / на сайт

Что увидите в консоли (пример, текст каждый раз чуть разный):

Рекурсия — это когда функция вызывает сама себя, передавая задачу «меньшего» размера.
Базовый случай останавливает цепочку вызовов, иначе программа зациклится.

Частые ошибки:

Ошибка в консолиПричинаИсправление
AuthenticationError: 401Нет или неверный OPENAI_API_KEYЗадать ключ в том же окне терминала, где запускаете python
RateLimitError: 429Лимит запросов или нулевой балансПодождать, пополнить billing или сменить модель
ModuleNotFoundError: openaiSDK не установленpip install openai
AttributeError: ... contentОбращение к пустому choicesПроверить response.choices — возможен фильтр контента

Попробуйте: замените вопрос на «Напиши функцию Python, которая складывает два числа» — ответ будет с кодом. Поставьте temperature=0.2 — ответ станет стабильнее.


Что возвращает сервер — структура JSON

Полезно один раз увидеть «сырой» ответ (как в curl). Главные поля:

{
"id": "chatcmpl-...",
"model": "gpt-4o-mini",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "Текст ответа модели..."
},
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 28,
"completion_tokens": 45,
"total_tokens": 73
}
}
ПолеСмысл
choices[0].message.contentГотовый текст — его читает ваш код
finish_reason: stopМодель закончила нормально
finish_reason: lengthОбрезка по max_tokens — ответ неполный
usage.total_tokensСколько токенов списали — для контроля бюджета

В Python можно напечатать usage:

print(response.usage.prompt_tokens, response.usage.completion_tokens)

Тот же запрос через curl

Задача: отправить тот же JSON, что и Python SDK, но из терминала — удобно для лабораторной «скриншот запроса и ответа».

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": "Назови три языка программирования для новичка."}
]
}'

Разбор построчно:

СтрокаЧто происходитЗачем
curl https://api.openai.com/v1/chat/completionsHTTP POST по умолчанию при -dАдрес метода Chat Completions
\ в конце строкиПеренос команды в bashОдна длинная команда на несколько строк
-H "Content-Type: application/json"Заголовок «тело — JSON»Сервер парсит -d как JSON
-H "Authorization: Bearer $OPENAI_API_KEY"Секретный ключ в заголовке$OPENAI_API_KEY подставляется из окружения
-d '{ ... }'Тело запросаТе же поля, что в Python: model, messages
"role": "user"Реплика пользователяСовпадает с Python-примером выше

Windows PowerShell — сохраните тело в body.json:

{
"model": "gpt-4o-mini",
"messages": [
{"role": "user", "content": "Назови три языка программирования для новичка."}
]
}
curl.exe https://api.openai.com/v1/chat/completions `
-H "Content-Type: application/json" `
-H "Authorization: Bearer $env:OPENAI_API_KEY" `
-d "@body.json"

Частая ошибка: в PowerShell $OPENAI_API_KEY без env: — переменная пустая, приходит 401.


Вызов из Node.js (fetch)

Задача: вызвать OpenAI из JavaScript — полезно, если уже проходили Fetch / axios.

Создайте файл openai.mjs:

const res = await fetch('https://api.openai.com/v1/chat/completions', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${process.env.OPENAI_API_KEY}`,
},
body: JSON.stringify({
model: 'gpt-4o-mini',
messages: [{ role: 'user', content: 'Что такое HTTP GET одним абзацем?' }],
}),
});

if (!res.ok) {
throw new Error(`HTTP ${res.status}: ${await res.text()}`);
}

const data = await res.json();
console.log(data.choices[0].message.content);

Разбор построчно:

СтрокаЧто происходитЗачем
await fetch('https://...')Асинхронный HTTP-запросNode 18+ и браузер умеют fetch нативно
method: 'POST'Метод POSTGET не передаёт JSON-тело с messages
'Content-Type': 'application/json'Тип телаСервер ожидает JSON
Authorization: `Bearer ${...}`Ключ из переменной окруженияТот же заголовок, что у curl
JSON.stringify({ model, messages })Объект JS → строка JSONВ Python это делает SDK сам
if (!res.ok)Статус не 2xxfetch не бросает ошибку на 401/429 — проверяем вручную
await res.text() в ошибкеТело ответа при сбоеТам часто { "error": { "message": "..." } }
await res.json()Разбор успешного JSONАналог response.json() в браузере
data.choices[0].message.contentТекст от моделиТот же путь, что в Python

Запуск:

export OPENAI_API_KEY="sk-..."
node openai.mjs

Частая ошибка: ключ в .env, но Node его не читает сам — нужен export или пакет dotenv.


Роль system в messages

Задача: задать модели «характер» и формат ответа через system, а конкретный вопрос — через user.

from openai import OpenAI

client = OpenAI()

response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[
{
"role": "system",
"content": (
"Ты помощник для школьников по информатике. "
"Отвечай кратко, простым языком, без жаргона. "
"Если не знаешь — скажи «не уверен»."
),
},
{
"role": "user",
"content": "Чем массив отличается от списка в Python?",
},
],
temperature=0.3,
)

print(response.choices[0].message.content)

Разбор ключевых строк:

СтрокаСмыслЗачем
"role": "system"Инструкция для моделиНе показывается пользователю на сайте, но влияет на каждый ответ
Многострочный content в скобках (...)Склеенная строка без \Удобно читать длинный system prompt
"role": "user"Вопрос ученикаМеняется каждый раз; system остаётся
temperature=0.3Низкая «креативность»Для объяснений и фактов — меньше выдумок
РольКогда использоватьПример content
systemПравила на весь диалог«Отвечай только на русском», «Формат — markdown»
userВопрос, код, документ«Исправь ошибку в коде ниже…»
assistantПрошлый ответ моделиНужен для истории диалога

Попробуйте: уберите блок system — ответ станет длиннее и «академичнее». Верните system с «максимум 3 предложения» — ответ укоротится.


Параметры генерации в запросе

Задача: управлять длиной и «креативностью» ответа без смены промпта. Подробная теория — параметры генерации LLM.

response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": "Придумай название для бота-помощника по математике."}],
max_tokens=150,
temperature=0.8,
top_p=0.9,
frequency_penalty=0.3,
presence_penalty=0.0,
)

Разбор параметров:

ПараметрЧто делаетКогда ставить
max_tokens=150Лимит длины ответаКороткий заголовок — 50–100; эссе — 500+
temperature=0.8Выше — разнообразнее формулировкиИмена, идеи — 0.7–1.0; код — 0.1–0.3
top_p=0.9Обрезает «хвост» маловероятных словЧасто 0.9–0.95 вместе с temperature
frequency_penalty=0.3Штраф за повтор одних словДлинные тексты, чтобы не зацикливалась
presence_penalty=0.0Штраф, если слово уже былоПоднимайте, если модель топчется на одной теме

Пример для кода (детерминированнее):

response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": "Напиши функцию Python: факториал n."}],
temperature=0.1,
max_tokens=512,
)

Частая ошибка: max_tokens=10 для объяснения темы — ответ обрежется посередине (finish_reason: length).


Готовые промпты — шаблоны с разбором

Каждый промпт — это текст в content. Хороший промпт отвечает на три вопроса: кто ты, что сделать, в каком формате.

Объяснение кода для новичка

System:

Ты терпеливый преподаватель программирования. Объясняй код построчно.
Используй простые аналогии. Не переписывай код целиком без просьбы.

User:

Объясни этот фрагмент Python для ученика 9 класса:

for i in range(3):
print(i * i)
Часть промптаЗачем так
«построчно»Модель идёт по строкам, а не даёт общую лекцию
«9 класса»Уровень сложности — без лишней теории
«Не переписывай код»Иначе ответ — только новый код без объяснения
Код с отступомЧётко отделён от инструкции

Рефакторинг с чек-листом

Роль: senior Python-разработчик.
Задача: улучшить читаемость функции ниже, сохранив поведение.
Формат ответа:
1) Краткий список проблем (маркированный список).
2) Улучшенный код в отдельном блоке python.
3) Что изменилось — три пункта.

Код:

def f(x):
r=[]
for i in x:
if i%2==0: r.append(i*2)
return r
ПриёмЭффект
«Роль: senior…»Стиль ответа ближе к код-ревью
Нумерованный формат ответаМодель не «размазывает» текст
«сохранив поведение»Меньше риск, что логика изменится

Перевод с сохранением терминов

Переведи на английский текст ниже. Термины API, HTTP, JSON оставь на английском.
Верни только перевод, без комментариев.

Текст: «Клиент отправляет POST-запрос с JSON-телом на эндпоинт /v1/chat/completions.»

Зачем «только перевод»: без этой строки модель часто добавляет «Sure! Here is…».


Резюме длинного текста

Сожми текст в 5 маркированных пунктов. Каждый пункт — одно предложение.
Если в тексте нет фактов — напиши «мало данных».

Текст:

Подставьте вместо абзац из работы с файламиopen("article.txt").read().


Генерация тестовых вопросов

По теме «HTTP: методы GET и POST» составь 5 вопросов для самопроверки.
Формат: нумерованный список. После списка — блок «Ответы» с краткими ответами.
Уровень: школьник, первый курс.

Подходит для подготовки к зачёту по сетям.


JSON без лишнего текста

Верни только валидный JSON без markdown и пояснений.
Схема: {"title": string, "tags": string[], "reading_minutes": number}
Тема статьи: «Как работает DNS».

Используйте вместе с JSON mode — двойная страховка от «Here is your JSON:».


Разбор ошибки из traceback

Ниже traceback Python. Определи:
1) тип ошибки;
2) строку, где она возникла;
3) вероятную причину;
4) минимальное исправление (один фрагмент кода).

Traceback:

Совет: вставляйте полный traceback из консоли — последняя строка NameError: ... критична.


Ответ в JSON (response_format)

Задача: получить словарь Python, а не текст с пояснениями — удобно для скриптов и лабораторных.

import json
from openai import OpenAI

client = OpenAI()

response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[
{
"role": "system",
"content": "Отвечай только валидным JSON по запросу пользователя.",
},
{
"role": "user",
"content": (
'Верни объект: {"city": "...", "country": "...", "fun_fact": "..."} '
"для города Казань."
),
},
],
response_format={"type": "json_object"},
temperature=0.2,
)

raw = response.choices[0].message.content
data = json.loads(raw)
print(data["city"], data["fun_fact"])

Разбор построчно:

СтрокаЧто происходитЗачем
import jsonСтандартный парсер JSONПревращает строку в dict
system «только JSON»Инструкция моделиБез markdown-обёртки ```json
response_format={"type": "json_object"}Режим APIСервер просит модель вернуть объект JSON
temperature=0.2Низкая случайностьСтабильные ключи city, country
raw = ...contentСтрока вида {"city": "Казань", ...}Ещё не dict — только текст
json.loads(raw)ПарсингПосле этого data["city"] работает
print(data["city"], ...)Доступ по ключамТак данные идут в БД или на сайт

Пример вывода:

Казань Столица Tatarstan, город на слиянии Волги и Казанки.

Частая ошибка: забыть json.loadsdata["city"] на строке даст ошибку или неверный доступ.


Потоковый ответ (streaming)

Задача: печатать ответ по мере генерации — как в ChatGPT, когда текст появляется постепенно.

from openai import OpenAI

client = OpenAI()

stream = client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": "Расскажи коротко, что такое TCP."}],
stream=True,
)

for chunk in stream:
part = chunk.choices[0].delta.content
if part:
print(part, end="", flush=True)
print()

Разбор построчно:

СтрокаЧто происходитЗачем
stream=TrueРежим потокаСервер шлёт много маленьких JSON вместо одного большого
for chunk in streamЦикл по кускамКаждый chunk — часть ответа
chunk.choices[0].deltaПриращение, не полное сообщениеВ обычном режиме было бы .message
.delta.contentФрагмент текста или NoneNone — служебный chunk без текста
if part:Пропуск пустыхБез проверки иногда печатается None
print(part, end="", flush=True)Без перевода строки после каждой буквыflush=True — сразу видно в консоли
Финальный print()Перевод строки в концеКрасивый вывод перед следующей командой
РежимКогда использовать
Обычный (stream=False)Скрипты, где нужен целый текст сразу
StreamingCLI-чат, UX «модель печатает»

Embeddings — векторы для поиска

Задача: превратить текст в массив чисел и найти похожие по смыслу фразы — основа RAG и семантического поиска.

Один текст → один вектор

from openai import OpenAI

client = OpenAI()

response = client.embeddings.create(
model="text-embedding-3-small",
input="OpenAI API позволяет вызывать языковые модели по HTTP.",
)

vector = response.data[0].embedding
print(len(vector), vector[:5])

Разбор:

СтрокаСмысл
embeddings.createЭндпоинт векторизации, отдельный от chat completions
text-embedding-3-smallКомпактная модель embeddings
input="..."Одна строка или список строк
response.data[0].embeddingСписок float, длина ~1536
len(vector)Размерность
vector[:5]Первые 5 чисел

Пример вывода:

1536 [0.012, -0.034, 0.056, -0.001, 0.028]

Поиск ближайшего текста по смыслу

import numpy as np
from openai import OpenAI

client = OpenAI()

def cosine(a, b):
a, b = np.array(a), np.array(b)
return float(np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b)))

texts = [
"Как вызвать Chat Completions API",
"REST-запрос к языковой модели",
"Рецепт борща на кастрюлю",
]

emb = client.embeddings.create(model="text-embedding-3-small", input=texts)
vectors = [item.embedding for item in emb.data]

query_vec = client.embeddings.create(
model="text-embedding-3-small",
input="Пример HTTP-вызова OpenAI",
).data[0].embedding

scores = [(t, cosine(query_vec, v)) for t, v in zip(texts, vectors)]
for title, score in sorted(scores, key=lambda x: -x[1]):
print(f"{score:.3f}{title}")

Разбор логики:

ШагСмысл
cosine(a, b)Чем ближе к 1.0, тем похожее тексты по смыслу
input=textsТри embedding за один запрос — дешевле трёх отдельных
query_vecВектор запроса пользователя
zip(texts, vectors)Пара «фраза — её вектор»
sorted(..., reverse)Сначала самые похожие

Пример вывода (числа могут отличаться):

0.842 — REST-запрос к языковой модели
0.791 — Как вызвать Chat Completions API
0.312 — Рецепт борща на кастрюлю

Диалог с историей

Задача: второй вопрос опирается на первый — как в ChatGPT, где модель «помнит» переписку.

from openai import OpenAI

client = OpenAI()

history = [
{"role": "system", "content": "Ты консультант по выбору первого языка программирования."},
{"role": "user", "content": "Мне 14 лет, хочу делать игры."},
]

r1 = client.chat.completions.create(model="gpt-4o-mini", messages=history)
reply1 = r1.choices[0].message.content
print("1:", reply1)

history.append({"role": "assistant", "content": reply1})
history.append({"role": "user", "content": "А если ещё интересна веб-разработка?"})

r2 = client.chat.completions.create(model="gpt-4o-mini", messages=history)
print("2:", r2.choices[0].message.content)

Разбор по шагам:

ШагЧто происходитЗачем
history = [...]Список сообщенийЕдиная «лента» диалога
Первый create(messages=history)Модель видит system + userОтвет про игры
history.append assistantДобавили ответ моделиБез этого второй вопрос «с нуля»
Второй userУточняющий вопрос«веб» связывается с «играми» из контекста
Второй createТот же список, но длиннееAPI не хранит историю — вы шлёте её каждый раз
Лимит контекста

Каждое сообщение ест токены. Длинный чат обрежется или подорожает. Храните последние 10–20 реплик или сжимайте старое отдельным запросом «кратко перескажи диалог». Подробнее — контекст.


OpenAI-совместимые серверы (Ollama)

Задача: запустить локальную модель с тем же кодом — без облачного ключа.

from openai import OpenAI

client = OpenAI(
base_url="http://localhost:11434/v1",
api_key="ollama",
)

response = client.chat.completions.create(
model="llama3.2",
messages=[{"role": "user", "content": "Привет! Ответь одним предложением."}],
)

print(response.choices[0].message.content)

Разбор:

СтрокаСмысл
base_url="http://localhost:11434/v1"Адрес Ollama вместо OpenAI
api_key="ollama"Заглушка — Ollama ключ не проверяет
model="llama3.2"Имя модели в Ollama (ollama pull llama3.2)
Остальной кодТот же messages и choices[0].message.content

Перед запуском: ollama serve и скачанная модель.


Типичные ошибки — симптом, причина, код

СимптомПричинаЧто сделать
401 UnauthorizedПустой или неверный ключecho $OPENAI_API_KEY / $env:OPENAI_API_KEY
429 Too Many RequestsЛимит RPM или billingПауза, другая модель, пополнить счёт
400 Bad RequestОпечатка в model или JSONСверить имя модели в документации
Пустой contentФильтр или сбойСмотреть finish_reason, смягчить промпт
JSONDecodeErrorТекст вокруг JSONresponse_format, temperature 0.1–0.2
Счёт растётДлинные промпты в циклеЛогировать usage, лимит max_tokens

Проверка ключа перед работой:

import os
import sys

if not os.getenv("OPENAI_API_KEY"):
sys.exit("Задайте OPENAI_API_KEY в терминале перед запуском.")

Обработка ошибки API в Python:

from openai import OpenAI, AuthenticationError, RateLimitError

client = OpenAI()

try:
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": "Привет"}],
)
print(response.choices[0].message.content)
except AuthenticationError:
print("Неверный API key — проверьте OPENAI_API_KEY")
except RateLimitError:
print("Слишком много запросов — подождите минуту")

Обязательный шаблон — файл ask.py

Как базовый каркас Turtle в 111.mdскопируйте этот файл и меняйте только промпты.

import os
import sys
from openai import OpenAI

def ask(prompt: str, system: str = "Ты полезный помощник. Отвечай на русском.") -> str:
client = OpenAI()
response = client.chat.completions.create(
model=os.environ.get("OPENAI_MODEL", "gpt-4o-mini"),
messages=[
{"role": "system", "content": system},
{"role": "user", "content": prompt},
],
temperature=0.3,
)
return response.choices[0].message.content

if __name__ == "__main__":
if not os.environ.get("OPENAI_API_KEY"):
sys.exit("Задайте переменную OPENAI_API_KEY")
text = ask("Объясни, что такое API, в трёх предложениях.")
print(text)

Разбор построчно:

СтрокаЧто происходитЗачем
def ask(prompt, system=...)Функция-обёрткаОдин раз написали — много раз вызываете
-> strАннотация «вернёт строку»Подсказка в IDE и для отчёта
OpenAI() внутри функцииКлиент на каждый вызовВ учебном скрипте проще; в prod — один клиент на модуль
os.environ.get("OPENAI_MODEL", "gpt-4o-mini")Модель из env или defaultСмена модели без правки кода: export OPENAI_MODEL=gpt-4o
messages=[system, user]Стандартный диалогsystem задаёт язык и стиль
temperature=0.3Умеренная стабильностьДля фактов и объяснений
return ...contentТолько текст наружуВызывающий код не знает про choices
if __name__ == "__main__"Блок «если файл запущен напрямую»При import ask тест не выполнится
sys.exit("...")Выход с сообщениемПонятная ошибка вместо 401 из SDK

Запуск:

export OPENAI_API_KEY="sk-..."
python ask.py

Расширение для лабораторной — вопрос из input:

if __name__ == "__main__":
if not os.environ.get("OPENAI_API_KEY"):
sys.exit("Задайте OPENAI_API_KEY")
q = input("Ваш вопрос: ")
print(ask(q))

ChatGPT API и лабораторная — чек-лист сдачи

ПунктЧто показать преподавателю
КлючСкрин переменной окружения, не строки в коде
ЗапросЛистинг messages или curl с JSON
ОтветВывод программы или фрагмент choices[0].message.content
ПараметрыХотя бы model и temperature с пояснением
ОшибкаПример обработки 401 или 429 (блок try/except)

Куда идти дальше

ЦельМатериал
Retry, очереди, prod-клиентИнтеграция на Python
Локально без облакаOllama
HTTP с сайтаFetch / axios — ключ только на backend
Промпт из файлаPython — файлы и текст
Парсинг логов APIRegex — паттерны
Каркас .env и GitШаблоны

См. также

Другие статьи этого же раздела в боковом меню (как на странице "О разделе").

Освоение главы0%