Разработка с Claude API

Запросы, потоковые ответы, tool use, структурированный вывод и стоимость.

92 уроков, первые 3 бесплатно. Полный доступ: 1490 руб.

Уроки курса

  1. Welcome to the course
  2. Overview of Claude models
  3. Accessing the API
  4. Getting an API key
  5. Making a request
  6. Multi-Turn conversations
  7. Chat exercise
  8. System prompts
  9. System prompts exercise
  10. Temperature
  11. Course satisfaction survey
  12. Response streaming
  13. Structured data
  14. Structured data exercise
  15. Quiz on accessing Claude with the API
  16. Prompt evaluation
  17. A typical eval workflow
  18. Generating test datasets
  19. Running the eval
  20. Model based grading
  21. Code based grading
  22. Exercise on prompt evals
  23. Quiz on prompt evaluation
  24. Prompt engineering
  25. Being clear and direct
  26. Being specific
  27. Structure with XML tags
  28. Providing examples
  29. Exercise on prompting
  30. Quiz on prompt engineering techniques
  31. Introducing tool use
  32. Project overview
  33. Tool functions
  34. Tool schemas
  35. Handling message blocks
  36. Sending tool results
  37. Multi-turn conversations with tools
  38. Implementing multiple turns
  39. Using multiple tools
  40. Fine grained tool calling
  41. The text edit tool
  42. The web search tool
  43. Quiz on tool use with Claude
  44. Introducing Retrieval Augmented Generation
  45. Text chunking strategies
  46. Text embeddings
  47. The full RAG flow
  48. Implementing the RAG flow
  49. BM25 lexical search
  50. A Multi-Index RAG pipeline
  51. Extended thinking
  52. Image support
  53. PDF support
  54. Citations
  55. Prompt caching
  56. Rules of prompt caching
  57. Prompt caching in action
  58. Code execution and the Files API
  59. Quiz on features of Claude
  60. Introducing MCP
  61. MCP clients
  62. Project setup
  63. Defining tools with MCP
  64. The server inspector
  65. Implementing a client
  66. Defining resources
  67. Accessing resources
  68. Defining prompts
  69. Prompts in the client
  70. MCP review
  71. Quiz on Model Context Protocol
  72. Anthropic apps
  73. Claude Code setup
  74. Claude Code in action
  75. Enhancements with MCP servers
  76. Agents and workflows
  77. Parallelization workflows
  78. Chaining workflows
  79. Routing workflows
  80. Agents and tools
  81. Environment inspection
  82. Workflows vs agents
  83. Quiz on Agents and Workflows
  84. Final Assessment
  85. Course Wrap Up
  86. What You'll Learn
  87. What You'll Learn
  88. What You'll Learn
  89. What You'll Learn
  90. What You'll Learn
  91. What You'll Learn
  92. What You'll Learn

Отправка результатов использования инструментов Claude

Взаимодействие с большими языковыми моделями (LLM), такими как Claude, часто выходит за рамки простого обмена сообщениями. Чтобы Claude мог выполнять сложные задачи, требующие доступа к актуальной информации или внешним системам, мы используем механизм инструментов (tools). Это позволяет Claude "вызывать" функции, которые вы определяете, будь то поиск информации в базе данных, отправка электронного письма или получение текущего времени. Однако сам по себе вызов инструмента — это лишь половина дела. После того как Claude запрашивает использование инструмента, ваша задача — выполнить соответствующую функцию и, что самое главное, отправить результаты обратно. Только так Claude получит необходимую информацию и сможет завершить рабочий процесс, предоставив пользователю осмысленный ответ.

Выполнение функции инструмента

Когда Claude определяет, что ему нужен внешний инструмент для ответа на запрос пользователя, он генерирует специальный блок ToolUse в своем ответе. Этот блок содержит имя инструмента, который Claude хочет использовать, и все необходимые входные параметры. Ваша программа должна перехватить этот блок, извлечь из него данные и вызвать соответствующую функцию в вашем коде.

Для доступа к параметрам, которые Claude хочет передать вашей функции, вы обычно обращаетесь к свойству input внутри блока ToolUse. Например, если ответ Claude находится в переменной response, параметры могут быть доступны через response.content[1].input. Это свойство возвращает словарь, содержащий аргументы, которые Claude хочет передать вашей функции.

Предположим, у вас есть функция Python, которая ожидает именованные аргументы, например, get_current_datetime(timezone="UTC"). Поскольку Claude передает параметры в виде словаря, вы можете использовать синтаксис распаковки словаря Python (**) для удобной передачи этих аргументов вашей функции. Например:

get_current_datetime(**response.content[1].input)

Этот подход позволяет динамически вызывать ваши функции с параметрами, предоставленными Claude, обеспечивая гибкость и масштабируемость.

Формирование блока результатов инструмента

После успешного выполнения функции инструмента (или в случае возникновения ошибки) вам необходимо сообщить Claude о результате. Для этого используется специальный блок tool_result, который включается в сообщение пользователя. Этот блок служит мостом между вашей внешней функцией и Claude, информируя модель о том, что произошло во время выполнения инструмента.

Блок tool_result имеет несколько важных свойств, которые обеспечивают правильное сопоставление и интерпретацию результатов:

Этот блок tool_result всегда помещается внутрь сообщения с ролью "user", так как именно пользователь (или система от его имени) предоставляет Claude информацию о внешнем мире.

Обработка нескольких вызовов инструментов

Claude — достаточно умная модель, чтобы понимать сложные запросы. В некоторых случаях он может запросить выполнение нескольких инструментов в одном ответе. Например, если пользователь спрашивает: "Сколько будет 10 + 10 и сколько 30 + 30?", Claude может ответить двумя отдельными блоками ToolUse, каждый из которых запрашивает выполнение функции калькулятора с разными аргументами.

В таких сценариях каждый вызов инструмента получает уникальный идентификатор (id). Крайне важно, чтобы вы сопоставляли эти идентификаторы при отправке результатов обратно. Это гарантирует, что Claude точно знает, какой результат соответствует какому запросу, даже если результаты поступают в другом порядке (например, из-за асинхронного выполнения функций). Правильное сопоставление tool_use_id с id запроса инструмента является залогом корректной работы всего механизма.

Построение последующего запроса к Claude

После того как вы выполнили функцию инструмента и сформировали блок tool_result, вам необходимо отправить его обратно Claude. Этот последующий запрос должен включать в себя полную историю разговора до текущего момента, а также новый блок tool_result. Claude нуждается в полном контексте, чтобы понять, как результаты инструмента вписываются в общую беседу.

Структура сообщения с результатами инструмента выглядит следующим образом:

messages.append({
    "role": "user",
    "content": [{
        "type": "tool_result",
        "tool_use_id": response.content[1].id, // ID из исходного ToolUse блока
        "content": "15:04:22", // Результат выполнения функции
        "is_error": False // Индикатор ошибки
    }]
})

Таким образом, полная история сообщений, отправляемая Claude, будет содержать:

Эта последовательность позволяет Claude отслеживать ход выполнения задачи и понимать, как внешний мир отреагировал на его запросы.

Отправка окончательного запроса и завершение цикла

Когда вы отправляете последующий запрос, содержащий историю сообщений и блок tool_result, важно помнить об одном нюансе: вы должны включить схему инструмента (tool schema) в параметр tools вашего запроса, даже если вы не ожидаете, что Claude сделает еще один вызов инструмента в этом конкретном ответе. Claude нуждается в схеме инструмента, чтобы правильно интерпретировать ссылки на инструменты в вашей истории разговора и полностью понять контекст. Без схемы Claude может "забыть" о возможностях инструмента или неправильно обработать предыдущие упоминания о нем.

Окончательный запрос к Claude будет выглядеть примерно так:

client.messages.create(
    model=model,
    max_tokens=1000,
    messages=messages, // Полная история сообщений
    tools=[get_current_datetime_schema] // Схема инструмента
)

После получения этого запроса Claude обработает результаты инструмента и сгенерирует окончательный ответ, который будет естественным образом включать полученную информацию. Например, если инструмент вернул текущее время, Claude может ответить: "Текущее время в вашем часовом поясе 15:04:22. Могу ли я еще чем-то помочь?". На этом этапе рабочий процесс использования инструмента считается завершенным: вы успешно позволили Claude получить доступ к реальной информации через вашу пользовательскую функцию и интегрировать ее в осмысленный диалог.