API 呼び出し
AI エージェント を作っていくうえで、ワークフローと呼ばれるエージェントのフローの中から外部 API を呼び出せると知った時、私は AI エージェント の可能性が無限に広がっていくような気持になりました。
- Web API で情報を取得して、その情報を AI エージェントが参照する
- LLM単体だと特定の時期までの情報しか持ってなかったりするが、API 接続により今この瞬間の情報を反映できる
- RAGも自身で蓄積した情報の参照という意味では強力な情報源だが、外部から情報を取得することにより、世界の広がりという観点では大きな可能性を持つ
- AI エージェントが生成したデータを Web API で Post して そのデータを二次活用する
- データの登録、書類の作成など、これまで人間の操作で実現してきた作業の自動化ができる
等、単なる「データ参照」だけではなく、LLM を現実世界へと接続するような気分になります。
最近のLLMのアプリでは、アプリ側でインターネットサーチして最新の情報を取り込めているようです。
API を呼んでみる
ここで説明する 実装例 の目的は、AIエージェントのベストプラクティスを示すことではなくて、シンプルに API のつなぎ方とそこから得られた情報の参照の仕方を説明するためのものです。
どう使ってどうやって広げていくかは、ご自身で想像していただけるとよいかなと思います。
呼び出す API
https://dummyjson.com/products/1
この Web API は、ダミーの商品・ユーザー等を返す無料API の中の一つの API の呼び方です。詳細は、
をご参照ください。
実際に、この Web API を呼び出すと
{
"id": 1,
"title": "Essence Mascara Lash Princess",
"description": "The Essence Mascara Lash Princess is a popular mascara known for its volumizing and lengthening effects. Achieve dramatic lashes with this long-lasting and cruelty-free formula.",
"category": "beauty",
"price": 9.99,
"discountPercentage": 10.48,
"rating": 2.56,
"stock": 99,
"tags": [
"beauty",
"mascara"
],
"brand": "Essence",
"sku": "BEA-ESS-ESS-001",
"weight": 4,
"dimensions": {
"width": 15.14,
"height": 13.08,
"depth": 22.99
},
"warrantyInformation": "1 week warranty",
"shippingInformation": "Ships in 3-5 business days",
"availabilityStatus": "In Stock",
"reviews": [
{
"rating": 3,
"comment": "Would not recommend!",
"date": "2025-04-30T09:41:02.053Z",
"reviewerName": "Eleanor Collins",
"reviewerEmail": "eleanor.collins@x.dummyjson.com"
},
{
"rating": 4,
"comment": "Very satisfied!",
"date": "2025-04-30T09:41:02.053Z",
"reviewerName": "Lucas Gordon",
"reviewerEmail": "lucas.gordon@x.dummyjson.com"
},
{
"rating": 5,
"comment": "Highly impressed!",
"date": "2025-04-30T09:41:02.053Z",
"reviewerName": "Eleanor Collins",
"reviewerEmail": "eleanor.collins@x.dummyjson.com"
}
],
"returnPolicy": "No return policy",
"minimumOrderQuantity": 48,
"meta": {
"createdAt": "2025-04-30T09:41:02.053Z",
"updatedAt": "2025-04-30T09:41:02.053Z",
"barcode": "5784719087687",
"qrCode": "https://cdn.dummyjson.com/public/qr-code.png"
},
"images": [
"https://cdn.dummyjson.com/product-images/beauty/essence-mascara-lash-princess/1.webp"
],
"thumbnail": "https://cdn.dummyjson.com/product-images/beauty/essence-mascara-lash-princess/thumbnail.webp"
}
という JSON が返ってきます。
API ノードの追加
STORM の ワークフロー上で、API ノード を追加して以下のように設定します。
今回は使い方の確認なので、ワークフロー起動時に必ず API を呼び出すようにフローをつなぎます。

API コール後の LLM のプロンプトは、下記のようにします。
{{body:4}} は、API ノード(ID:4)のレスポンスボディが格納されている変数です。
動作確認
テスト環境で質問してみます。
API のログを見ると
正常に取得できているようです。
まとめ
今回は、とりあえず Web API を呼ぶというところをゴールとして実験を行い、API を呼び出してその結果を LLM が参照するというところまで確認できました。
簡単な確認に対しては期待する動作ができていますが、若干の疑問点は残ります。例えば、API から帰ってきたデータは、
"title": "Essence Mascara Lash Princess"
とうデータがあるけど、それを製品名として LLM が "title" のタグから自動的に判断してるのね?わかりにくいタグだったらどうなるのかしら、とか。
その辺は別途報告したいと思います。
ワークフロー
{
"schema_version": 1,
"nodes": [
{
"id": 1,
"type": "storm/request",
"properties": {},
"metadata": {
"position": {"x": 12, "y": 12},
"size": {"width": 300, "height": 52},
"virtualId": "IEuqnaXAl7gLvum58xW5M"
}
},
{
"id": 2,
"type": "storm/llm",
"properties": {
"llm": {
"model": "gpt-5-2025-08-07",
"chat_engine": "openai",
"stop": [],
"max_tokens": 2048,
"tools": []
},
"system_template": "あなたは役に立つアシスタントチャットボットです。可能であれば日本語で回答してください。\n {{body:4}}に製品の情報が格納されています。\nこの情報からユーザーに回答してください。\n",
"user_template": "ユーザーの質問: {{query}}\n",
"retrieval_chunks_template": "[[#{{no}}]] filename: {{filename}}, pagename: {{pagename}}\nContext: {{context}}",
"num_latest_chats": 5
},
"metadata": {
"position": {"x": 692, "y": 12},
"size": {"width": 300, "height": 52},
"formDraft": {
"propertiesHash": "j1lavvxoxg",
"fields": {
"model": "gpt-5-2025-08-07",
"functions": [],
"modelSettings": {"chat_engine": "openai"},
"user_template": "ユーザーの質問: {{query}}\n",
"modelParameters": {
"stop": [],
"max_tokens": 2048,
"extra_params": "{}"
},
"system_template": "あなたは役に立つアシスタントチャットボットです。可能であれば日本語で回答してください。\n {{body:4}}に製品の情報が格納されています。\nこの情報からユーザーに回答してください。\n",
"num_latest_chats": 5,
"retrieval_chunks_template": "[[#{{no}}]] filename: {{filename}}, pagename: {{pagename}}\nContext: {{context}}"
}
},
"virtualId": "u-w03bWdm07fBW0YzZI5S"
}
},
{
"id": 3,
"type": "storm/response",
"properties": {"result_list": ["{{custom_variables}}"]},
"metadata": {
"position": {"x": 1032, "y": 12},
"size": {"width": 300, "height": 52},
"virtualId": "-Xs_NA2BlcWctCo9D0BHb"
}
},
{
"id": 4,
"type": "storm/apicall",
"properties": {
"method": "GET",
"url": "https://dummyjson.com/products/1",
"body": {"type": "JSON", "data": {}},
"timeout": {
"response_timeout": 5000,
"read_timeout": 5000,
"write_timeout": 5000
}
},
"metadata": {
"position": {"x": 352, "y": 12},
"size": {"width": 300, "height": 52},
"virtualId": "U3FLHL7CBds7_KXGmeYZL"
}
}
],
"links": [[2, 2, 3], [3, 1, 4], [4, 4, 2]],
"custom_variables": {}
}



