Modül 5 · Tool Use with Claude · ⏱ 9 dakika

Tool'larla multi-turn conversation'lar

Multi-turn conversations with tools

Orijinal İngilizce video — Anthropic Academy / JWPlayer. Aşağıdaki Türkçe metin dersi birebir özetler.

Bu modül için tahmini süre: 9 dakika

Genel bakış

Birden çok tool ile uygulamalar inşa ederken, Claude’un tek bir kullanıcı sorusunu yanıtlamak için birkaç tool’u sırayla çağırması gerekebilir. Örneğin bir kullanıcı “What day is 103 days from today?” diye sorarsa Claude önce güncel tarihi almalı, sonra ona 103 gün eklemelidir.

Bu, Claude’un final cevabı vermeden önce birden çok tool isteği yaptığı bir multi-turn conversation pattern’i yaratır. Uygulamanızın bunu otomatik olarak yönetmesi gerekir.

Multi-turn tool pattern’i

Claude’un birden çok tool’a ihtiyacı olduğunda perde arkasında olanlar:

  1. Kullanıcı sorar: “What day is 103 days from today?”
  2. Claude get_current_datetime talep eden bir tool use block ile yanıt verir
  3. Server’ınız fonksiyonu çağırır ve sonucu döndürür
  4. Claude daha fazla bilgiye ihtiyacı olduğunu fark eder ve add_duration_to_datetime talep eder
  5. Server’ınız o fonksiyonu çağırır ve sonucu döndürür
  6. Claude artık final cevap için yeterli bilgiye sahiptir

Bir conversation loop inşa etmek

Bu pattern’i yönetmek için, Claude tool talep etmeyi durdurana kadar devam eden bir conversation loop gereklidir:

def run_conversation(messages):
    while True:
        response = chat(messages)

        add_assistant_message(messages, response)

        # Pseudo code
        if response isn't asking for a tool:
            break

        tool_result_blocks = run_tools(response)
        add_user_message(messages, tool_result_blocks)
        
    return messages

Helper function’ları refactor etmek

Conversation loop’u implement etmeden önce, helper function’larınızı birden çok message block’unu düzgün yönetecek şekilde güncellemeniz gerekir.

Message handler’larını güncellemek

add_user_message ve add_assistant_message fonksiyonlarınız şu anda her zaman plain text ile çalıştığınızı varsayıyor. Bunları tam message object’leri yönetecek şekilde güncelleyin:

from anthropic.types import Message

def add_user_message(messages, message):
    user_message = {
        "role": "user",
        "content": message.content if isinstance(message, Message) else message
    }
    messages.append(user_message)

Bu, bir string, block listesi veya tam bir message object geçirebilmenizi sağlar.

Chat fonksiyonunu güncellemek

Chat fonksiyonunuzu bir tools listesi kabul edecek ve sadece text yerine tam message döndürecek şekilde değiştirin:

def chat(messages, system=None, temperature=1.0, stop_sequences=[], tools=None):
    params = {
        "model": model,
        "max_tokens": 1000,
        "messages": messages,
        "temperature": temperature,
        "stop_sequences": stop_sequences,
    }
    
    if tools:
        params["tools"] = tools
        
    if system:
        params["system"] = system
        
    message = client.messages.create(**params)
    return message

Message’lardan text çıkarmak

Artık tam message object döndürdüğünüz için, gerektiğinde text çıkarmak için bir helper oluşturun:

def text_from_message(message):
    return "\n".join(
        [block.text for block in message.content if block.type == "text"]
    )

Bu fonksiyon bir message’daki tüm text block’ları bulup birleştirir; final yanıtı kullanıcılara göstermeniz gerektiğinde kullanışlıdır.

Temel iyileştirmeler

Bu refactoring adımları kodunuzu sağlam tool yönetimi için hazırlar:

  • Esnek message handling — Helper function’larınız artık farklı message format’larıyla çalışabilir
  • Chat’te tool desteği — Chat fonksiyonu tool schema’ları alıp geçirebilir
  • Tam message dönüşleri — Sadece text yerine tam message object’leri alırsınız, tüm block’lar korunur
  • Text extraction utility — Karmaşık message’lardan okunabilir text almanın kolay yolu

Bu temeller hazır olduğunda, birden çok tool çağrısını otomatik yöneten conversation loop’u implement etmeye hazırsınız; Claude’un kullanıcı sorularını yanıtlamak için gerektiği kadar tool’u kullanabildiği sorunsuz bir deneyim yaratırsınız.

Temel çıkarımlar

  • Claude tek bir kullanıcı sorusu için birden çok tool çağrısı zincirleyebilir; uygulama bunu otomatik handle etmeli
  • Çekirdek desen: while döngüsü → chat → eğer tool_use yoksa çık → yoksa tool’u çalıştır, sonucu user message olarak ekle
  • add_user_message / add_assistant_message artık string, block listesi veya tam Message object kabul etmeli
  • chat fonksiyonu tools parametresini destekleyecek ve text yerine tam Message object döndürecek
  • text_from_message helper’ı message’ın text block’larını birleştirerek kullanıcıya gösterilecek metni çıkarır
  • Bu refactor, sonraki derste yazılacak loop’un tek satırlık koşullarla çalışmasını mümkün kılar