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

Birden çok turu implement etmek

Implementing multiple turns

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

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

Genel bakış

Tool’lu bir conversation sistemi inşa etmek, Claude tool kullanmayı bırakana kadar çağrı yapmaya devam eden bir loop implement etmeyi gerektirir. Claude artık tool talep etmediğinde, bu kullanıcı için hazır bir final response olduğu sinyalidir. Bu derste döngünün nasıl yazıldığını, stop_reason kontrolünün önemini ve hata durumunda bile devam eden sağlam bir tool router’ın nasıl yapılandırıldığını göreceksiniz.

Tool isteklerini tespit etmek

Claude’un bir tool kullanmak isteyip istemediğini bilmenin anahtarı, response message’ın stop_reason field’ında yatar. Claude bir tool çağrısı yapmak istediğinde bu field "tool_use" olarak set edilir. Bu, conversation loop’una devam edip etmememiz gerektiğini kontrol etmenin temiz bir yoludur:

if response.stop_reason != "tool_use":
    break  # Claude is done, no more tools needed

Conversation loop

Ana conversation fonksiyonu basit bir pattern’i takip eder:

def run_conversation(messages):
    while True:
        response = chat(messages, tools=[get_current_datetime_schema])
        add_assistant_message(messages, response)
        print(text_from_message(response))
        
        if response.stop_reason != "tool_use":
            break
            
        tool_results = run_tools(response)
        add_user_message(messages, tool_results)
    
    return messages

Bu loop, Claude herhangi bir tool talep etmeden final cevabı verene kadar devam eder.

Birden çok tool çağrısını yönetmek

Claude tek bir yanıtta birden çok tool talep edebilir. Message content bir block listesi içerir ve her tool use block’unu ayrı işlememiz gerekir:

run_tools fonksiyonu bunu, tool use block’larını filtreleyerek ve her birini işleyerek yönetir:

def run_tools(message):
    tool_requests = [
        block for block in message.content if block.type == "tool_use"
    ]
    tool_result_blocks = []
    
    for tool_request in tool_requests:
        # Process each tool request...

Tool result block’ları

Her tool use block’una karşılık gelen bir tool result block ile yanıt verilmelidir. Aralarındaki bağlantı ID eşleştirmesi ile korunur:

Tool result block yapısı:

tool_result_block = {
    "type": "tool_result",
    "tool_use_id": tool_request.id,
    "content": json.dumps(tool_output),
    "is_error": False
}

Error handling

Sağlam tool execution potansiyel hataları yönetmeyi gerektirir. Bir tool başarısız olduğunda bile Claude’a bir result block sağlamamız gerekir:

try:
    tool_output = run_tool(tool_request.name, tool_request.input)
    tool_result_block = {
        "type": "tool_result",
        "tool_use_id": tool_request.id,
        "content": json.dumps(tool_output),
        "is_error": False
    }
except Exception as e:
    tool_result_block = {
        "type": "tool_result", 
        "tool_use_id": tool_request.id,
        "content": f"Error: {e}",
        "is_error": True
    }

Scalable tool routing

Birden çok tool’u desteklemek için, tool isimlerini implementasyonlarına eşleyen bir routing fonksiyonu oluşturun:

def run_tool(tool_name, tool_input):
    if tool_name == "get_current_datetime":
        return get_current_datetime(**tool_input)
    elif tool_name == "another_tool":
        return another_tool(**tool_input)
    # Add more tools as needed

Bu yaklaşım, çekirdek conversation logic’ini değiştirmeden yeni tool’lar eklemeyi kolaylaştırır.

Tam workflow

Tam multi-turn conversation şöyle çalışır:

  • Mevcut tool’larla birlikte user message’ı Claude’a gönderin
  • Claude text ve/veya tool istekleri ile yanıt verir
  • Talep edilen tüm tool’ları çalıştırın ve result block’ları oluşturun
  • Tool sonuçlarını bir user message olarak geri gönderin
  • Claude final cevap verene kadar tekrarlayın

Bu, Claude’un karmaşık kullanıcı isteklerini tam yanıtlamak için birkaç tur boyunca birden çok tool kullanabileceği sorunsuz bir deneyim yaratır. Conversation history tam context’i korur ve Claude’un kapsamlı yanıtlar sağlamak için önceki tool sonuçlarının üzerine inşa etmesine olanak tanır.

Temel çıkarımlar

  • Loop’un durma koşulu response.stop_reason != "tool_use" kontrolüdür
  • Tek bir assistant message birden fazla tool_use block’u içerebilir; hepsi tek tek koşulur
  • Her tool_result, karşılık geldiği tool_use’un id’siyle eşleşmelidir
  • Try/except içine alınan tool çağrısı hata durumunda is_error: True ile result döner; Claude bunu görüp düzeltme deneyebilir
  • run_tool adında basit bir name → function router, kodu modüler tutar
  • Conversation history her turda büyür; Claude önceki sonuçlar üzerine inşa ederek nihai cevabı verir