載入中

當 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,完成工具使用循環。