Разработка с 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

Детальный вызов инструментов (Fine-Grained Tool Calling)

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

Основы потоковой передачи данных при использовании инструментов

При включенном стриминге Claude отправляет различные типы событий по мере обработки вашего запроса. Вы, вероятно, уже знакомы с событием ContentBlockDelta, которое используется для обычной генерации текста. Однако для работы с инструментами появляется новый тип событий, который содержит два ключевых свойства:

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

for chunk in stream:
    if chunk.type == "tool_input_chunk": # Пример названия типа события
        # Обработка частичного фрагмента JSON
        print(chunk.partial_json)
        # Или использование полного снимка на данный момент
        current_args = chunk.snapshot

Как работает валидация JSON по умолчанию

Именно здесь кроется важная особенность стандартного поведения API. API Anthropic не отправляет каждый фрагмент сразу же, как только Claude его генерирует. Вместо этого он буферизует фрагменты и сначала проверяет их. API ждет, пока будут сформированы полные пары ключ-значение верхнего уровня, прежде чем что-либо отправить.

Например, если ваш инструмент ожидает следующую структуру:

{
    "action": "save_article",
    "parameters": {
        "url": "...",
        "word_count": "..."
    }
}

API будет ждать, пока значение для ключа url не будет полностью сформировано и проверено по вашей схеме. Только после этого будут отправлены все буферизованные фрагменты, относящиеся к этому ключу. Затем процесс повторяется для следующего ключа, например, word_count. Этот процесс валидации объясняет, почему вы можете наблюдать задержки, за которыми следуют всплески текста, даже при включенном стриминге. Фрагменты удерживаются до тех пор, пока не будет готова полная и валидная пара ключ-значение верхнего уровня.

Детальный вызов инструментов (Fine-Grained Tool Calling)

Если вам требуется более быстрая и детальная потоковая передача данных – возможно, для того чтобы показывать пользователям немедленные обновления или быстро начинать обработку частичных результатов – вы можете включить функцию, называемую Fine-Grained Tool Calling (детальный вызов инструментов).

Основное отличие Fine-Grained Tool Calling заключается в том, что он отключает валидацию JSON на стороне API. Это означает, что:

Чтобы активировать эту функцию, достаточно добавить параметр fine_grained=True в ваш вызов API:

run_conversation(
    messages,
    tools=[save_article_schema],
    fine_grained=True
)

С включенным Fine-Grained Tool Calling вы можете получить значение, например, для url, значительно раньше в потоке, не дожидаясь завершения всего объекта parameters.

Обработка невалидного JSON

Когда вы используете Fine-Grained Tool Calling, Claude может генерировать невалидный JSON. Например, вместо корректного числа для word_count вы можете получить "word_count": undefined. Ваше приложение должно корректно обрабатывать такие случаи, чтобы избежать сбоев.

Пример обработки невалидного JSON:

import json

# ... в вашем цикле обработки стрима ...
try:
    parsed_args = json.loads(chunk.snapshot)
    # Дальнейшая обработка валидных аргументов
except json.JSONDecodeError:
    # Обработка невалидного JSON
    print("Получен невалидный JSON, продолжаем...")
    # Здесь можно реализовать логику пропуска, логирования или повторной попытки

Без Fine-Grained Tool Calling валидация на стороне API перехватила бы эту ошибку и, возможно, обернула бы проблемные значения в строки, что, однако, могло бы не соответствовать вашей ожидаемой схеме.

Когда использовать Fine-Grained Tool Calling?

Рассмотрите возможность включения Fine-Grained Tool Calling в следующих случаях:

Для большинства приложений поведение по умолчанию с валидацией API вполне адекватно и обеспечивает стабильность, поскольку API гарантирует корректность получаемых данных. Но когда вам нужна эта дополнительная отзывчивость и максимальный контроль над потоком данных, Fine-Grained Tool Calling дает вам возможность получать фрагменты данных так быстро, как Claude может их генерировать, перекладывая ответственность за валидацию на ваше приложение.