當 Claude 以工具使用請求回應時,您的伺服器需要實際執行所請求的工具並將結果傳回。這個步驟涉及從 Claude 的回應中提取工具使用部分、執行適當的函式,以及正確格式化結果。
處理多個工具請求
Claude 可以在單一回應中傳送多個工具使用部分。您的程式碼需要以防禦性的方式處理這種可能性。一個助手訊息可能包含一個文字部分,後面跟著一個、兩個,甚至更多的工具使用部分。

流程運作方式如下:Claude 傳送帶有 JSON schema 的請求,接收一個工具使用部分,然後您的伺服器執行該工具並傳回一個工具結果部分,供 Claude 提供最終回應。

提取工具使用部分
首先,建立一個函式來處理聊天請求傳回的所有部分:
python
def run_tools(parts):
tool_requests = [part for part in parts if "toolUse" in part]
tool_result_parts = []
for tool_request in tool_requests:
tool_use_id = tool_request["toolUse"]["toolUseId"]
tool_name = tool_request["toolUse"]["name"]
tool_input = tool_request["toolUse"]["input"]這個推導式會過濾部分列表,只包含含有「toolUse」鍵的字典,忽略文字部分。
執行實際的工具
建立一個輔助函式來執行所請求的工具:
python
def run_tool(tool_name, tool_input):
if tool_name == "get_current_datetime":
return get_current_datetime(**tool_input)
else:
raise Exception(f"Unknown tool name: {tool_name}")這裡的關鍵細節是使用 **tool_input 將引數字典展開到您的工具函式中。Claude 總是以字典物件的形式傳回引數,因此您需要正確地將其解包。
建立工具結果部分
執行工具後,您需要將回應格式化為工具結果部分:

工具結果部分需要三個關鍵屬性:
- toolUseId - 必須與原始工具使用部分的 ID 相符
- content - 您工具的輸出,序列化為字串
- status - 「success」或「error」
理解工具使用 ID
當 Claude 並行請求多個工具時,工具使用 ID 系統變得很重要。例如,如果 Claude 想要執行計算器工具兩次:

每個工具使用都會獲得一個唯一的 ID(例如「ab3」和「po9」),而您的工具結果必須包含相符的 ID,以便 Claude 知道哪個結果對應於哪個請求。
錯誤處理
將您的工具執行包裝在 try-catch 區塊中。Claude 對工具錯誤很聰明,如果您傳回適當的錯誤資訊,它可能會調整其方法:
python
try:
tool_output = run_tool(tool_name, tool_input)
tool_result_part = {
"toolResult": {
"toolUseId": tool_use_id,
"content": [{"text": json.dumps(tool_output)}],
"status": "success"
}
}
except Exception as e:
tool_result_part = {
"toolResult": {
"toolUseId": tool_use_id,
"content": [{"text": f"Error: {e}"}],
"status": "error"
}
}完整實作
以下是處理工具請求並傳回格式化結果的完整函式:
python
def run_tools(parts):
tool_requests = [part for part in parts if "toolUse" in part]
tool_result_parts = []
for tool_request in tool_requests:
tool_use_id = tool_request["toolUse"]["toolUseId"]
tool_name = tool_request["toolUse"]["name"]
tool_input = tool_request["toolUse"]["input"]
try:
tool_output = run_tool(tool_name, tool_input)
tool_result_part = {
"toolResult": {
"toolUseId": tool_use_id,
"content": [{"text": json.dumps(tool_output)}],
"status": "success"
}
}
except Exception as e:
tool_result_part = {
"toolResult": {
"toolUseId": tool_use_id,
"content": [{"text": f"Error: {e}"}],
"status": "error"
}
}
tool_result_parts.append(tool_result_part)
return tool_result_parts一旦您擁有工具結果部分,就可以在下一次聊天請求中將它們傳回給 Claude,完成工具使用循環。