Первый запрос: Claude и OpenAI

Делаем первый реальный вызов к Claude и к GPT и достаём текст из ответа.

Anthropic и OpenAI устроены похоже: вы шлёте массив сообщений, получаете ответ ассистента. Различия — в названиях полей и форме ответа.

Установка SDK

pip install anthropic   # для Claude
pip install openai      # для GPT

Claude — Anthropic Messages API

Создаём клиент (он читает ANTHROPIC_API_KEY из окружения), отправляем сообщение, забираем текст. Обратите внимание: max_tokens обязателен, а content ответа — это список блоков.

import anthropic

client = anthropic.Anthropic()

response = client.messages.create(
    model="claude-opus-4-8",
    max_tokens=1024,
    messages=[
        {"role": "user", "content": "Объясни, что такое API, в двух предложениях."}
    ],
)

# content — список блоков; берём текстовые
text = "".join(block.text for block in response.content if block.type == "text")
print(text)

OpenAI — Chat Completions

Здесь ответ лежит в choices[0].message.content — уже готовая строка. Системная инструкция передаётся как первое сообщение с ролью system прямо в массиве (в отличие от Claude, где для неё есть отдельный параметр system).

from openai import OpenAI

client = OpenAI()  # читает OPENAI_API_KEY из окружения

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

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

Два отличия, которые сразу видно

АспектAnthropic (Claude)OpenAI (GPT)
Методmessages.createchat.completions.create
Системная инструкцияотдельный параметр systemсообщение с ролью system в messages
max_tokensобязателеннеобязателен
Текст ответаcontent[i].text (список блоков)choices[0].message.content (строка)

Парсинг ответа из готовой строки (запускаемо)

Чтобы потренироваться извлекать текст, разберём готовый JSON ответа Anthropic — без сети, чистый Python:

import json

raw = '''
{
  "id": "msg_01XYZ",
  "type": "message",
  "role": "assistant",
  "model": "claude-opus-4-8",
  "content": [
    {"type": "text", "text": "Столица Франции — Париж."}
  ],
  "stop_reason": "end_turn",
  "usage": {"input_tokens": 12, "output_tokens": 8}
}
'''

resp = json.loads(raw)

# Извлекаем текст: собираем все блоки type == "text"
text = "".join(block["text"] for block in resp["content"] if block["type"] == "text")
print("Текст ответа:", text)
print("Причина остановки:", resp["stop_reason"])

usage = resp["usage"]
total = usage["input_tokens"] + usage["output_tokens"]
print(f"Токены: вход={usage['input_tokens']}, выход={usage['output_tokens']}, всего={total}")

Вывод:

Текст ответа: Столица Франции — Париж.
Причина остановки: end_turn
Токены: вход=12, выход=8, всего=20

Итог

  • Claude: client.messages.create(...), текст в content-блоках, max_tokens обязателен.
  • OpenAI: client.chat.completions.create(...), текст в choices[0].message.content.
  • Извлечение текста — это разбор JSON-структуры ответа.
Проверьте себя
1. Где находится текст ответа в Anthropic Messages API?
AВ response.text
BВ блоках массива response.content с типом text
CВ response.choices[0].message.content
DВ response.output
2. Чем отличается передача системной инструкции в Anthropic и OpenAI?
AВ Anthropic её передавать нельзя
BВ Anthropic это отдельный параметр system, в OpenAI — сообщение с ролью system в массиве messages
CВ OpenAI её передают в параметре instructions
DРазличий нет
3. Какой параметр обязателен в запросе к Anthropic Messages API, но не обязателен у OpenAI?
Amodel
Bmax_tokens
Ctemperature
Dsystem
Поддержать проект