Інтеграція Anthropic Claude: Tool Use, кешування та оптимізація
Відзначимо: коли клієнт прийшов із запитом інтегрувати Claude у свій SaaS-продукт, перша версія викликала модель без жодної оптимізації. Після тижня тестів рахунок за API виріс до тисяч доларів, а якість відповідей не виправдовувала очікувань. Ми перепроектували архітектуру: впровадили Tool Use для агентських сценаріїв, налаштували Prompt Caching для статичних інструкцій і підібрали модель під кожен тип запиту. Підсумок — зниження витрат на 80% при збереженні latency p99 під 2 секунди. У цьому матеріалі — практичні кроки, які стануть у пригоді кожному, хто впроваджує Claude у production.
Яку модель Claude обрати для production?
| Модель | Контекст | Швидкість | Вартість | Застосування |
|---|---|---|---|---|
| Claude Opus | 200K | Середня (p99 ~5s) | Висока | Складний аналіз, генерація |
| Claude Sonnet | 200K | Висока (p99 ~1s) | Середня | Production, чат-боти |
| Claude Haiku | 200K | Дуже висока (p99 ~0.5s) | Низька | Класифікація, швидкі відповіді |
Claude Haiku у 5 разів дешевший за Opus при аналогічній якості на простих завданнях. Вибір моделі залежить від вашого сценарію: ми допомагаємо підібрати оптимальну конфігурацію під навантаження.
Чому вибір моделі визначає бюджет?
На одному з проектів ми замінили Opus на Sonnet для 70% запитів, залишивши Opus лише для складних міркувань. Це знизило загальні витрати на API в 3 рази. Для простих завдань на кшталт класифікації або вилучення даних Haiku дає ту саму точність, що й Opus, але коштує в 10 разів менше. Завжди тестуйте на своїх даних.
Як налаштувати базову інтеграцію?
import anthropic
from pydantic import BaseModel
client = anthropic.Anthropic() # ANTHROPIC_API_KEY з env
# Базовий виклик
def chat(prompt: str, model: str = "claude-sonnet-4-5") -> str:
message = client.messages.create(
model=model,
max_tokens=1024,
messages=[{"role": "user", "content": prompt}]
)
return message.content[0].text
# З system prompt
def chat_with_system(system: str, prompt: str) -> str:
message = client.messages.create(
model="claude-sonnet-4-5",
max_tokens=2048,
system=system,
messages=[{"role": "user", "content": prompt}],
temperature=0.1,
)
return message.content[0].text
# Streaming
def stream_response(prompt: str):
with client.messages.stream(
model="claude-sonnet-4-5",
max_tokens=1024,
messages=[{"role": "user", "content": prompt}],
) as stream:
for text in stream.text_stream:
yield text
# Vision
def analyze_image(image_base64: str, media_type: str, question: str) -> str:
message = client.messages.create(
model="claude-sonnet-4-5",
max_tokens=1024,
messages=[{
"role": "user",
"content": [
{
"type": "image",
"source": {
"type": "base64",
"media_type": media_type,
"data": image_base64,
},
},
{"type": "text", "text": question},
],
}]
)
return message.content[0].text
Що таке Tool Use і як побудувати агента?
Tool Use (Function Calling) дозволяє Claude викликати зовнішні функції. Ви описуєте інструменти в JSON Schema, і модель вирішує, коли їх застосувати. Це ключовий механізм для побудови агентів.
tools = [{
"name": "get_weather",
"description": "Get current weather for a city",
"input_schema": {
"type": "object",
"properties": {
"city": {"type": "string", "description": "City name"},
"units": {"type": "string", "enum": ["celsius", "fahrenheit"]},
},
"required": ["city"]
}
}]
def run_agent_loop(user_message: str) -> str:
messages = [{"role": "user", "content": user_message}]
while True:
response = client.messages.create(
model="claude-sonnet-4-5",
max_tokens=1024,
tools=tools,
messages=messages,
)
if response.stop_reason == "end_turn":
return response.content[-1].text
# Обробляємо tool_use блоки
tool_results = []
for block in response.content:
if block.type == "tool_use":
result = dispatch_tool(block.name, block.input)
tool_results.append({
"type": "tool_result",
"tool_use_id": block.id,
"content": str(result),
})
messages.append({"role": "assistant", "content": response.content})
messages.append({"role": "user", "content": tool_results})
При кількох інструментах логіка та сама — модель сама вибирає, який викликати. Важливо правильно обробляти помилки виклику інструментів: передавати їх у наступному запиті як is_error.
Як працює Prompt Caching і чому він економить до 90%?
Кешування великих статичних промптів (документи, інструкції) — ключовий прийом. Кеш зберігається 5 хвилин, економія на повторних викликах сягає 90%. Anthropic рекомендує використовувати кешування для блоків об'ємом понад 1024 токенів.
def cached_analysis(system_doc: str, question: str) -> str:
message = client.messages.create(
model="claude-sonnet-4-5",
max_tokens=1024,
system=[{
"type": "text",
"text": system_doc,
"cache_control": {"type": "ephemeral"}, # Кешуємо цей блок
}],
messages=[{"role": "user", "content": question}]
)
return message.content[0].text
На практиці: якщо у вас часто повторюються одні й ті самі інструкції (наприклад, опис формату відповіді), виносьте їх в окремий блок, що кешується. Це знижує latency і cost.
Порівняйте: з кешуванням і без
| Параметр | Без кешування | З кешуванням |
|---|---|---|
| Вартість на 1000 запитів (1000 токенів промпт + 100 токенів відповідь) | $1.20 | $0.12 |
| Latency p99 | 2.5 с | 0.8 с |
Економія на повторюваних інструкціях може досягати 90%. Замовте консультацію для розрахунку економії на вашому сценарії.
Приклад розрахунку економії при обсязі 10 000 запитів на день
Припустимо, кожен запит містить статичну інструкцію на 500 токенів. Без кешування ви платите за всі токени. З кешуванням інструкція оплачується лише при першому входженні у вікно 5 хвилин. При рівномірному розподілі запитів кеш спрацьовує для 80% запитів, знижуючи витрати на ту саму кількість токенів. На моделі Sonnet це дає економію приблизно $200 на місяць.
Що входить у нашу інтеграцію?
- Архітектурна документація зі схемою інтеграції та вибором моделі
- Репозиторій з кодом на Python (FastAPI або Flask) з підтримкою streaming, Vision, Tool Use
- Налаштування моніторингу та алертів (Grafana + Prometheus) за ключовими метриками: p99 latency, токени за хвилину, помилки
- Навчання команди замовника (2–3 години) з експлуатації та доопрацювання
- Підтримка протягом 30 днів після деплою
Покрокова інструкція з інтеграції
- Аналітика — визначаємо сценарій, навантаження, обираємо модель.
- Проектування — архітектура інтеграції, налаштування rate limiting та retry-логіки.
- Реалізація — базовий виклик, стримінг, Vision.
- Впровадження інструментів — Tool Use для агентів.
- Оптимізація — Prompt Caching, вибір моделі, налаштування температури.
- Тестування — перевірка під навантаженням, вимірювання p99 latency.
- Деплой — розгортання, моніторинг, навчання команди.
Кожен етап може бути виконаний окремо. Повний цикл займає до тижня.
Строки та вартість
- Базова інтеграція: від 0.5 дня
- Tool Use + agent loop: 2–3 дні
- Prompt Caching + оптимізація: 1 день
- Повний цикл: до тижня
Вартість розраховується індивідуально залежно від складності. Замовте консультацію — ми підберемо оптимальну архітектуру під вашу задачу.
Типові помилки при інтеграції
- Ігнорування кешування — призводить до зайвих витрат (можна було заощадити 50–90%).
- Неправильний вибір моделі — Haiku достатньо для 70% запитів, але використовують Opus.
- Відсутність retry-логіки — через rate limit втрачаються запити.
- Занадто довгі system prompts без кешування — зростає latency і cost.
Зв'яжіться з нами, щоб обговорити ваш сценарій інтеграції. Гарантуємо стабільну роботу та оптимізацію витрат.







