← НАЗАД К КУРСУ Этап 2 · Урок 3 из 6

Урок 2.3 — Первый вызов Claude API

В этом уроке мы создадим свой чат с Claude прямо в терминале. Это будет как ChatGPT или Claude.ai — но ты сама его напишешь. Несколько строк кода — и у тебя свой AI-чат.


Зачем это делать

Ты уже общаешься с Claude через сайт. Но сайт — это чужой продукт. Ты не можешь поменять как он работает, добавить свои правила, подключить к Telegram или Google Sheets.

Когда ты пишешь свой код для работы с Claude — ты контролируешь всё: что спрашивать, как отвечать, куда сохранять. Именно так создаются AI-продукты.

Начнём с самого простого — чат в терминале.


Подготовка

1. Установи библиотеку

Открой терминал и выполни:

pip install anthropic
# pip — менеджер пакетов Python (урок 1.2)
# anthropic — SDK для работы с Claude API

2. Создай папку проекта

mkdir ~/Documents/Projects/my-claude-chat
cd ~/Documents/Projects/my-claude-chat

3. Создай файл с API-ключом

Создай файл .env (урок 1.6 — помнишь, файлы с точкой = скрытые):

ANTHROPIC_API_KEY=sk-ant-api03-твой-ключ-сюда
# Замени "sk-ant-api03-твой-ключ-сюда" на свой реальный ключ
# Его можно взять на console.anthropic.com → API Keys

Создай файл .gitignore:

.env

Версия 1: Один вопрос — один ответ

Создай файл chat.py:

from anthropic import Anthropic

# Создаём подключение к Claude
# SDK сам найдёт API-ключ в файле .env
client = Anthropic()

# Отправляем одно сообщение
response = client.messages.create(
    model="claude-sonnet-4-6",    # какую модель использовать
    max_tokens=1024,               # максимум слов в ответе
    messages=[
        {"role": "user", "content": "Привет! Кто ты?"}
        # "role": "user" — это говоришь ты
        # "content" — текст сообщения
    ]
)

# Выводим ответ
print(response.content[0].text)

Запусти:

python3 chat.py

Ты увидишь ответ Claude прямо в терминале. Работает!

Но это не чат — это один вопрос и один ответ. Давай сделаем настоящий чат.


Версия 2: Настоящий чат (как ChatGPT)

Заменим содержимое chat.py:

from anthropic import Anthropic

client = Anthropic()

# Список сообщений — это "память" нашего чата
# Сюда будем добавлять каждое сообщение
history = []

print("Твой личный Claude-чат! Пиши что угодно.")
print("Чтобы выйти — напиши 'выход'")
print("-" * 40)

# Бесконечный цикл — чат работает пока не напишешь "выход"
while True:

    # Спрашиваем пользователя (тебя)
    user_input = input("\nТы: ")
    # input() — ждёт пока ты напишешь текст и нажмёшь Enter

    # Если написала "выход" — останавливаем чат
    if user_input.lower() == "выход":
        print("Пока!")
        break
        # break — выход из цикла while (урок 1.4)

    # Добавляем твоё сообщение в историю
    history.append({"role": "user", "content": user_input})

    # Отправляем ВСЮ историю Claude
    # Именно так он "помнит" о чём вы говорили
    response = client.messages.create(
        model="claude-sonnet-4-6",
        max_tokens=1024,
        messages=history
        # Передаём не одно сообщение, а весь список
        # Claude видит весь разговор и отвечает с учётом контекста
    )

    # Достаём текст ответа
    assistant_message = response.content[0].text

    # Добавляем ответ Claude в историю
    history.append({"role": "assistant", "content": assistant_message})
    # Теперь в history: твоё сообщение + ответ Claude
    # В следующем цикле Claude увидит весь предыдущий разговор

    # Показываем ответ
    print(f"\nClaude: {assistant_message}")

Запусти:

python3 chat.py

Теперь у тебя настоящий чат! Попробуй:

Ты: Меня зовут Катя
Claude: Привет, Катя! Рада познакомиться!...

Ты: Как меня зовут?
Claude: Тебя зовут Катя!

Ты: выход
Пока!

Claude "помнит" имя, потому что мы отправляем ему всю историю каждый раз.


Как работает "память" чата

Вот что происходит внутри при каждом сообщении:

Сообщение 1:
history = [
    {"role": "user", "content": "Меня зовут Катя"}
]
→ Claude отвечает → добавляем ответ в history

Сообщение 2:
history = [
    {"role": "user", "content": "Меня зовут Катя"},
    {"role": "assistant", "content": "Привет, Катя!..."},
    {"role": "user", "content": "Как меня зовут?"}
]
→ Claude видит ВСЕ три сообщения → знает что ты Катя

У Claude нет своей памяти (урок 2.1). "Память" — это наш список history, который мы отправляем целиком с каждым запросом.


Версия 3: Чат с характером

Добавим system — инструкцию, которая задаёт поведение Claude:

from anthropic import Anthropic

client = Anthropic()
history = []

# Системное сообщение — "характер" нашего бота
system_prompt = "Ты — бизнес-ментор для предпринимателей в AI-сфере. Отвечай конкретно, с примерами, без воды. Если не знаешь — честно скажи."
# Попробуй другие:
# "Ты — саркастичный программист, который объясняет всё через мемы"
# "Ты — финансовый аналитик. Только факты и цифры."
# "Ты — переводчик. Переводи всё на английский."

print("AI Бизнес-ментор. Задавай вопросы!")
print("Выход — напиши 'выход'")
print("-" * 40)

while True:
    user_input = input("\nТы: ")

    if user_input.lower() == "выход":
        print("Удачи в бизнесе!")
        break

    history.append({"role": "user", "content": user_input})

    response = client.messages.create(
        model="claude-sonnet-4-6",
        max_tokens=1024,
        system=system_prompt,    # вот тут задаём характер
        messages=history
    )

    assistant_message = response.content[0].text
    history.append({"role": "assistant", "content": assistant_message})
    print(f"\nМентор: {assistant_message}")

system — это как роль в театре. Ты говоришь Claude: "ты теперь бизнес-ментор" — и он ведёт себя соответственно.


Что ты сейчас сделала

Ты создала три вещи:

  1. Версия 1 — отправила один запрос к Claude из кода
  2. Версия 2 — создала полноценный чат с памятью
  3. Версия 3 — добавила боту характер через system

Это тот же принцип, на котором работают ChatGPT, Claude.ai и все AI-чаты. Разница только в интерфейсе: у них красивый сайт, а у тебя — терминал. Внутри — один и тот же API.

К концу курса мы сделаем из этого полноценный продукт — с красивым дизайном, который нравится именно тебе, работающий 24/7 на твоём сервере, доступный с телефона из любой точки мира. И он будет дешевле, чем подписка на ChatGPT — потому что ты платишь только за API (за реальное использование), а не $20/месяц за фиксированную подписку.


Практика

Задание 1: Запусти чат

Создай файл, запусти Версию 2, поговори с Claude. Проверь, что он помнит контекст.

Задание 2: Свой персонаж

Измени system_prompt и создай бота с уникальным характером. Поговори с ним.

Задание 3: Посмотри расход токенов

Добавь после print(f"\nClaude: ...") эту строку:

print(f"  [токены: {response.usage.input_tokens} вход + {response.usage.output_tokens} выход]")

Поговори 5-6 сообщений и посмотри, как растёт количество входных токенов. Подумай почему.

Почему токены растут? Потому что с каждым сообщением `history` становится длиннее, и мы отправляем ВСЮ историю каждый раз. Чем дольше разговор — тем больше входных токенов — тем дороже каждый запрос.

Задание 4: Переводчик

Сделай бота-переводчика: system = "Переводи всё, что пишет пользователь, на английский. Ничего больше не делай." Проверь, работает ли.


Задачки на закрепление

Задача 1: Что делает строка history.append({"role": "user", "content": user_input})?

Ответ Добавляет твоё сообщение в список `history`. `append` — добавить в конец списка (урок 1.4). Формат: словарь с ролью ("user") и текстом. Это нужно, чтобы Claude видел всю историю разговора.

Задача 2: Что будет, если убрать строку history.append({"role": "assistant", ...})?

Ответ Claude перестанет "помнить" свои ответы. В history будут только твои сообщения. Claude увидит все твои вопросы, но не будет знать что он сам отвечал — и может повторяться или терять контекст.

Задача 3: Зачем нужен system параметр?

Ответ Он задаёт роль и поведение Claude для всего разговора. Без него Claude отвечает как обычный ассистент. С ним — как тот, кем ты его назначила: переводчик, ментор, аналитик.

Главное


Глоссарий

Термин Что значит
anthropic (библиотека) Python-пакет (SDK) от Anthropic, который упрощает отправку запросов к Claude из кода.
Anthropic() Команда, которая создаёт клиент — объект для общения с API Claude.
messages.create() Метод клиента, который отправляет сообщение к Claude и возвращает его ответ.
role (user/assistant/system) Роль автора сообщения: user — ты, assistant — Claude, system — инструкция для поведения Claude.
content Поле в сообщении, которое содержит сам текст — твой вопрос или ответ Claude.
model Параметр, указывающий какую именно модель Claude использовать (например, claude-sonnet-4-20250514).
max_tokens Максимальное количество токенов, которое Claude может использовать в своём ответе.
System prompt Специальная инструкция, которая задаёт роль и поведение Claude на весь разговор.
.env Файл для хранения секретных данных (например, API-ключа), который не попадает в Git.
API-ключ Уникальный секретный код, который подтверждает твою личность при обращении к API.
pip install Команда для установки Python-пакетов из интернета (например, pip install anthropic).
import Команда в Python, которая подключает установленную библиотеку к твоему коду.

Что дальше?

В следующем уроке — Prompt Engineering. Ты узнаешь, как формулировать задачи для AI, чтобы получать точные ответы. Это навык, который определяет разницу между "AI ерунду пишет" и "AI делает ровно то, что мне нужно".

← ПРЕДЫДУЩИЙ СЛЕДУЮЩИЙ →