Anthropic SDK
Messages API, стриминг, инструменты и кеш промпта через Anthropic SDK.
Morphogen принимает формат Anthropic Messages. Укажите base_url без /v1 и ключ Morphogen. Формат подходит для любой текстовой модели каталога, не только для Claude.
Подключение
import os
from anthropic import Anthropic
client = Anthropic(
base_url="https://api.morphogen.ru",
api_key=os.environ["MORPHOGEN_API_KEY"],
)SDK сам добавляет путь /v1/messages и заголовок x-api-key.
Запрос
msg = client.messages.create(
model="claude-sonnet-5",
max_tokens=300,
system="Отвечай коротко.",
messages=[{"role": "user", "content": "Чем отличается TCP от UDP?"}],
)
print(msg.content[0].text)
print(msg.usage.input_tokens, msg.usage.output_tokens)В этом формате max_tokens обязателен. Параметры запроса: Messages.
Потоковый ответ
with client.messages.stream(
model="claude-sonnet-5",
max_tokens=300,
messages=[{"role": "user", "content": "Напиши хокку про дождь"}],
) as stream:
for text in stream.text_stream:
print(text, end="", flush=True)Вызов инструментов
tools = [{
"name": "get_weather",
"description": "Погода в городе",
"input_schema": {
"type": "object",
"properties": {"city": {"type": "string"}},
"required": ["city"],
},
}]
msg = client.messages.create(
model="claude-sonnet-5",
max_tokens=300,
tools=tools,
messages=[{"role": "user", "content": "Какая погода в Казани?"}],
)
for block in msg.content:
if block.type == "tool_use":
print(block.name, block.input)Результат функции верните блоком tool_result в следующем сообщении пользователя.
Кеш промпта
Длинный повторяющийся префикс отметьте блоком cache_control:
msg = client.messages.create(
model="claude-sonnet-5",
max_tokens=300,
system=[{
"type": "text",
"text": open("instructions.md").read(),
"cache_control": {"type": "ephemeral"},
}],
messages=[{"role": "user", "content": "Вопрос по инструкции"}],
)Поле проходит к модели как есть, запись и чтение кеша учитываются в расходе. У моделей GPT и Gemini кеш неявный, cache_control для них не нужен.
Картинки на входе
import base64
data = base64.standard_b64encode(open("schema.png", "rb").read()).decode()
msg = client.messages.create(
model="claude-sonnet-5",
max_tokens=300,
messages=[{
"role": "user",
"content": [
{"type": "image", "source": {"type": "base64", "media_type": "image/png", "data": data}},
{"type": "text", "text": "Что на схеме?"},
],
}],
)Ошибки
Ошибки приходят в формате Anthropic. При 429 SDK читает retry-after и повторяет запрос сам. Поля error.code в них нет, кроме key_revoked: читайте статус, error.type и error.message. Список ошибок: Ошибки.