在建構具有多個工具的應用程式時,您需要處理 Claude 可能需要依序呼叫多個工具才能回答單一使用者問題的情境。例如,如果使用者問「從今天起 103 天後是星期幾?」,Claude 需要先取得目前日期,然後再加上 103 天。

這會產生一種多輪對話模式,Claude 在提供最終答案之前會發出多個工具請求。您的應用程式需要自動處理這種情況。
多輪工具模式
以下是當 Claude 需要多個工具時,幕後發生的事情:
- 使用者問:「從今天起 103 天後是星期幾?」
- Claude 回應一個工具使用區塊,請求
get_current_datetime - 您的伺服器呼叫該函式並回傳結果
- Claude 意識到需要更多資訊,並請求
add_duration_to_datetime - 您的伺服器呼叫該函式並回傳結果
- Claude 現在有足夠的資訊可以提供最終答案

建構對話迴圈
為了處理這種模式,您需要一個對話迴圈,持續執行直到 Claude 不再請求工具為止:
python
def run_conversation(messages):
while True:
response = chat(messages)
add_assistant_message(messages, response)
# 偽代碼
if response isn't asking for a tool:
break
tool_result_blocks = run_tools(response)
add_user_message(messages, tool_result_blocks)
return messages
重構輔助函式
在實作對話迴圈之前,您需要更新輔助函式,以正確處理多個訊息區塊。
更新訊息處理函式
您的 add_user_message 和 add_assistant_message 函式目前假設您始終處理純文字。請更新它們以處理完整的訊息物件:
python
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)這樣一來,您就可以傳入字串、區塊清單,或完整的訊息物件。
更新聊天函式
修改您的聊天函式,使其能接受工具清單,並回傳完整訊息而非僅回傳文字:
python
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從訊息中提取文字
由於您現在回傳的是完整的訊息物件,請建立一個輔助函式,在需要時提取文字:
python
def text_from_message(message):
return "\n".join(
[block.text for block in message.content if block.type == "text"]
)此函式會找出訊息中所有的文字區塊並將它們合併在一起,這在您需要向使用者顯示最終回應時非常有用。
關鍵改進
這些重構步驟為您的程式碼做好準備,以便進行穩健的工具處理:
- 靈活的訊息處理 - 您的輔助函式現在可以處理不同的訊息格式
- 聊天中的工具支援 - 聊天函式可以接收並傳遞工具結構定義
- 完整訊息回傳 - 您取得的是完整的訊息物件,而非僅有文字,保留所有區塊
- 文字提取工具 - 輕鬆從複雜訊息中取得可讀文字的方法
有了這些基礎,您就準備好實作能自動處理多個工具呼叫的對話迴圈,創造出無縫的體驗,讓 Claude 可以使用任意數量的工具來回答使用者的問題。