Fine-grained tool calling

Чему научитесь

Видео 10:56 и текст урока

К концу урока вы сможете:

Видео и текст урока.

Смотреть урок на Skilljar Fine grained tool calling · 10:56

Если совместить tool use с потоковой передачей, вы получаете обновления в реальном времени, пока Claude генерирует аргументы инструмента. Интерфейс становится отзывчивее, но есть важные детали того, как это устроено внутри.

Потоковая передача вызовов

При включённом потоке Claude присылает события разных типов. Вы уже знаете события вроде ContentBlockDelta для обычного текста. Для вызовов инструментов понадобится обрабатывать ещё один тип событий — InputJsonEvent.

События потока Claude по порядку от MessageStart до MessageStop; текст — в событиях ContentBlockDelta.
События потока по порядку, от MessageStart до MessageStop; текст приходит в ContentBlockDelta.

У каждого InputJsonEvent два ключевых свойства:

Вот как обрабатывать эти события в потоке:

for chunk in stream:
    if chunk.type == "input_json":
        # Process the partial JSON chunk
        print(chunk.partial_json)
        # Or use the complete snapshot so far
        current_args = chunk.snapshot
При потоке три InputJsonEvent, чьи куски partial_json складываются в snapshot с заголовком Vector Storage.
Три события InputJsonEvent: куски partial_json складываются в snapshot с заголовком «Vector Storage».

Как работает проверка JSON

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

Сервер отправляет save_article_schema и сообщение пользователя; в Anthropic API куски abstract, This paper и pre.
Сервер отправляет save_article_schema и сообщение; в API приходят куски «abstract», «This paper», «pre»…

API ждёт полной пары «ключ — значение» верхнего уровня, прежде чем что-то отправить. Например, если инструмент ожидает такую структуру:

{
  "abstract": "This paper presents a novel...",
  "meta": {
    "word_count": 847,
    "review": "This paper introduces QuanNet..."
  }
}

API:

Четыре накопленных куска объединяются в один ключ abstract со значением, который API сверяет с save_article_schema.
Четыре накопленных куска складываются в пару «abstract — значение», и API сверяет её со схемой.

Эта проверка объясняет, почему даже при включённом потоке вы видите паузы, а потом всплески текста: куски придерживаются, пока не будет готова полная валидная пара верхнего уровня.

API держит четыре куска, пока пара abstract верхнего уровня не станет валидной, затем отправляет все четыре на сервер.
API держит куски, пока пара abstract не станет валидной, а потом отправляет все разом.

Fine-grained tool calling

Если нужен более быстрый и дробный поток — например, чтобы сразу показывать пользователю обновления или быстрее начать обрабатывать частичные результаты, — можно включить fine-grained tool calling.

Anthropic API отправляет серверу группы кусков частичного JSON, каждая группа обрывается посреди значения, а не на ключе.
С fine-grained tool calling API отправляет куски группами, которые обрываются посреди значения, а не на границе ключа.

Fine-grained tool calling делает одно главное: отключает проверку JSON на стороне API. Это значит:

Включается добавлением fine_grained=True в вызов:

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

С fine-grained tool calling значение word_count может прийти гораздо раньше, не дожидаясь, пока будет готов весь объект meta.

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

С fine-grained tool calling Claude может сгенерировать невалидный JSON вроде "word_count": undefined вместо нормального числа. Приложение должно корректно обрабатывать такие случаи:

try:
    parsed_args = json.loads(chunk.snapshot)
except json.JSONDecodeError:
    # Handle invalid JSON appropriately
    print("Received invalid JSON, continuing...")

Без fine-grained tool calling проверка на стороне API поймала бы такую ошибку и, возможно, обернула бы проблемные значения в строки, которые могут не совпасть с ожидаемой схемой.

Когда использовать fine-grained tool calling

Имеет смысл включать его, когда:

Для большинства приложений поведения по умолчанию с проверкой вполне достаточно. Но когда нужна дополнительная отзывчивость, fine-grained tool calling позволяет получать куски так быстро, как Claude их генерирует.

Дальше

Следующий урок — встроенный инструмент текстового редактора: схему знает Claude, а реализацию пишете вы.

Оригинал урока: Fine grained tool calling.