Первый запрос: 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.create | chat.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