会員登録すると
学習することができます。
会員登録する(無料)
学習することができます。
登録済みの方はこちら
ログイン
学ぶ目的
準備
npm install @anthropic-ai/sdk
export ANTHROPIC_API_KEY=sk-ant-...
APIキーは各自で取得します。ここから先は従量課金なので、練習中は短い入力で試してください。
1往復目:AIがツールを呼びたいと言う
import Anthropic from "@anthropic-ai/sdk";
const client = new Anthropic();
const messages = [{ role: "user", content: "いま東京は何度?" }];
let response = await client.messages.create({
model: "claude-opus-5",
max_tokens: 16000,
tools: [weatherTool],
messages,
});
console.log(response.stop_reason); // → "tool_use"
stop_reason が "tool_use" なら、AIはツールを呼びたがっています。
2往復目:実行して結果を返す
応答の content には複数のブロックが入ります。type で絞り込んでから使います。
while (response.stop_reason === "tool_use") {
// AIの発言をそのまま履歴に積む(content 全体を渡すこと)
messages.push({ role: "assistant", content: response.content });
const toolResults = [];
for (const block of response.content) {
if (block.type !== "tool_use") continue;
try {
const result = await getWeather(block.input.city);
toolResults.push({
type: "tool_result",
tool_use_id: block.id,
content: JSON.stringify(result),
});
} catch (error) {
// 失敗も必ず返す。黙って捨てるとAIは待ち続ける
toolResults.push({
type: "tool_result",
tool_use_id: block.id,
content: error.message,
is_error: true,
});
}
}
// 結果は「1つのuserメッセージ」にまとめて返す
messages.push({ role: "user", content: toolResults });
response = await client.messages.create({
model: "claude-opus-5",
max_tokens: 16000,
tools: [weatherTool],
messages,
});
}
const answer = response.content.find((b) => b.type === "text");
console.log(answer.text); // → 「東京はいま21.4℃です」など
3つの約束ごと
-
tool_use_idを必ず一致させる。どの呼び出しへの返事かが分からなくなります - 複数のツール結果は1つのuserメッセージにまとめる。分けて送ると、AIは以後まとめて呼ばなくなります
- 失敗したら
is_error: trueを付けて必ず返す。返さないと処理が止まります
このレクチャーで学ぶこと
- stop_reason を見てループを回す
- tool_result の返し方(idの一致・1メッセージにまとめる)
- 失敗を握りつぶさない
質問
まだ質問は投稿されていません。
質問投稿
ログイン後に質問の投稿ができます。