Birden çok turu implement etmek
Implementing multiple turns
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: Trueile result döner; Claude bunu görüp düzeltme deneyebilir run_tooladı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