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», проект на информатике |
| Студенты | Лабораторная «чат-бот», «анализ текста», отчёт с листингом кода |
| Самоучки | Скопировали .py → python ask.py → разобрали таблицу под кодом |
| После ChatGPT в браузере | Понять, как тот же диалог выглядит в HTTP и Python |
Как устроены LLM — большие языковые модели и ChatGPT. Роль, контекст и окно токенов — контекст. Temperature, top_p, max_tokens — параметры генерации. Промышленная обёртка — интеграция ИИ в Python. Локально без облака — Ollama. HTTP в терминале — curl / fetch. Эта статья — практическая галерея, как примеры Turtle для рисования.
Ключ храните в OPENAI_API_KEY, в .env (файл в .gitignore) или в секретах CI. Никогда не коммитьте ключ в Git и не вставляйте в чат с другой нейросетью. При утечке — отзовите ключ в кабинете провайдера и создайте новый.
Как пользоваться статьёй
- Пройдите подготовку окружения — ключ,
pip install openai. - Запустите минимальный Python-пример — убедитесь, что ответ приходит.
- Скопируйте нужный блок (промпт или вызов) в свой файл.
- Прочитайте Разбор построчно и блок Частая ошибка под кодом.
- Измените текст промпта или
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 python | Embeddings |
| openai api 401 / invalid api key | Типичные ошибки |
| openai temperature max_tokens example | Параметры генерации |
| chatgpt prompt template code review | Готовые промпты |
| chatgpt api vs website / разница api и chatgpt | ChatGPT и 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 | Ответ по буквам, как в ChatGPT | stream=True |
| embedding | Вектор чисел «смысла» текста | client.embeddings.create(...) |
Как подготовить окружение
Шаг 1 — API key и переменная окружения
- Зарегистрируйтесь у провайдера (OpenAI или совместимый сервис).
- В личном кабинете создайте API key — строка вида
sk-proj-.... - Задайте переменную окружения до запуска Python.
Windows PowerShell:
$env:OPENAI_API_KEY = "sk-proj-ВАШ_КЛЮЧ"
Linux / macOS:
export OPENAI_API_KEY="sk-proj-ВАШ_КЛЮЧ"
Разбор команд:
| Команда | Что делает | Зачем |
|---|---|---|
$env:OPENAI_API_KEY = "..." | Записывает ключ в переменную только для текущего окна PowerShell | SDK читает ключ автоматически; его нет в коде |
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 (удобнее всего)
- Создайте папку, например
gpt-lab. - Сохраните код примера в
ask.py. - В терминале в этой папке:
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:
- Импорт и создание клиента
OpenAI(). - Массив
messages— минимум одна репликаuser. - Вызов
chat.completions.createс полемmodel. - Чтение текста из
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: openai | SDK не установлен | 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/completions | HTTP 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' | Метод POST | GET не передаёт JSON-тело с messages |
'Content-Type': 'application/json' | Тип тела | Сервер ожидает JSON |
Authorization: `Bearer ${...}` | Ключ из переменной окружения | Тот же заголовок, что у curl |
JSON.stringify({ model, messages }) | Объект JS → строка JSON | В Python это делает SDK сам |
if (!res.ok) | Статус не 2xx | fetch не бросает ошибку на 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.loads — data["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 | Фрагмент текста или None | None — служебный chunk без текста |
if part: | Пропуск пустых | Без проверки иногда печатается None |
print(part, end="", flush=True) | Без перевода строки после каждой буквы | flush=True — сразу видно в консоли |
Финальный print() | Перевод строки в конце | Красивый вывод перед следующей командой |
| Режим | Когда использовать |
|---|---|
Обычный (stream=False) | Скрипты, где нужен целый текст сразу |
| Streaming | CLI-чат, 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 | Текст вокруг JSON | response_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 — файлы и текст |
| Парсинг логов API | Regex — паттерны |
Каркас .env и Git | Шаблоны |
См. также
Другие статьи этого же раздела в боковом меню (как на странице "О разделе"). Практическая карта типовых IT-задач: термины, пошаговое внедрение, проверка качества и типичные ошибки. Простой консольный чат на C# — учебное приложение с сокетами: TCP между клиентом и сервером, многопоточность и обмен сообщениями в консоли. Примеры вёрстки на HTML и CSS с разбором: центрирование, Flexbox, Grid, формы, шапка, подвал и адаптив для учебы и портфолио. Перед началом работы обязательно изучите главу Turtle . Галерея 3D-фигур на Panda3D — карточки, куб, пирамида, сфера, сетки и составные сцены; код для локального запуска. Готовые docker-compose.yml с разбором каждой строки — nginx, PostgreSQL, Redis, WordPress, MongoDB. Примеры для школьников и студентов: postgres example, поднять базу локально, app + db. Примеры nginx.conf для статики, reverse proxy, React/Vue SPA, PHP, SSL и балансировки — построчный разбор директив, проверка curl и типичные ошибки для лабораторных и VPS. dockerfile example — 10 готовых Dockerfile с построчным разбором: node, python, golang, react nginx, spring boot, php, dotnet. Для студентов, лабораторных и docker build с нуля. PromQL example — готовые запросы Prometheus и Grafana с построчным разбором: up, rate, node_exporter cpu, memory, disk, http_requests_total, histogram_quantile p99, алерты. Для студентов, лабораторных и devops docker compose. Готовые манифесты Kubernetes с разбором каждой строки — Pod, Deployment, Service, ConfigMap, Secret, Ingress. Примеры для Minikube, kind и kubectl apply. Примеры графиков Matplotlib на Python для школьников и студентов — sin, cos, парабола, столбцы, scatter, гистограмма, подграфики; код с подробным разбором. Примеры pandas на Python для школьников и студентов — DataFrame, фильтрация, groupby, очистка, merge, сводные таблицы и экспорт; код с подробным разбором каждой строки.Готовые решения
Простой консольный чат на CSharp
HTML + CSS — готовые макеты
Примеры фигур Turtle на Python
Примеры фигур Panda3D на Python
Docker Compose — готовые стеки
Nginx — конфиги под задачу
Dockerfile — 10 типовых образов
Prometheus + Grafana — запросы
Kubernetes YAML — минимальные манифесты
Matplotlib — графики
Pandas — типовые операции