ファンクションコールのパラメーターの決定
以前、ファンクションコールの説明で関数を選ぶ方法についてご説明しました。
今回は、呼び出すファンクションを決定する際に、合わせてパラメーターを決定する方法についてご説明します。
関数のプロパティの設定
以前の説明では、呼び出すファンクションには、パラメーターが無い前提で進めていたため関数のプロパティは、
{"type": "object", "properties": {}, "additionalProperties": false}
という空っぽな設定になっていました。
今回は、
人物の名前をパラメーターにするとその人物の情報を取得できる
というAPIがある前提で進めます。
人物の情報取得関数
上記の仮想 API の取得関数は下記のように記述します。
- 関数名 : get_person_info
- 説明 : 指定された人物の情報を取得する
- プロパティ
{
"type": "object",
"properties": {"name": {"type": "string", "description": "情報を取得する人物の名前"}},
"required": ["name"],
"additionalProperties": false
}
LLM : 2 で、ファンクションコールの判定を行い、その結果を レスポンスノードで整形して出力します。
レスポンスノードは、LLM を介さずに固定的な出力を成型することができるノードです。固定的という言い方をしましたが、ワークフロー内部の変数や他のノードの出力結果を参照できるので、LLM の TOKEN を消費せずに最終出力を作成したい場合に便利に使えます。ただし、あくまで最終出力のテンプレートとその中の変数の置換になるため「クリエイティビティ」はありません。
という固定的な出力を行うことにします。つまり、実際に API を呼び出さず、その判定結果だけを確認します。
確認結果

人物の情報に関する質問の場合、期待通りのファンクション選択とパラメーター決定がされています。

人物とは関係ない質問の場合、関数の選択されないことが確認できます。
複数の人物の情報を出得する関数の追加
少し、今回のトピックスの本筋とはずれますが、調べるべき人物が複数だった場合に使える関数を追加して、どちらの関数を呼び出すかを分けて判別できるかを確認してみます。
- 関数名 : get_multiple_person_info
- 説明 : 指定された複数の人物の情報を取得する
- プロパティ
{
"type": "object",
"properties": {
"persons": {
"type": "array",
"items": {
"type": "object",
"properties": {"name": {"type": "string", "description": "取得する人物の名前"}},
"required": ["name"]
}
}
},
"required": ["persons"]
}
確認結果
ちゃんと呼び分けもできているようです。
直接的ではない指示
こういう聞き方でも自律的にどのアクション(どの関数をどのパラメータで呼ぶ)を考えて動作していますね。

決定するパラメーターについて
ここで決定されたパラメーターは、HTTP GET の query string や path なのか? POST の BODYなのか?と私は最初悩んでしまったんですが、結論としては、どちらでもなくどちらでもあります。
つまり特定の手法(APIをどのように呼ぶとか)をこの時点で特定するのではなく、その先の API ノード等でここで取得した情報を好きなようにお使いくださいということになります。
なので、実際の API のパラメーターの渡し方が、query string であればここで得たパラメーターの値を query string で渡すし、POST BODY なら BODY に埋め込んでください。
逆に言うと、ファンクションコールの判定の段階では、実際の API の仕様とは切り離して抽象的に 呼び出すファンクション名 と そのパラメーター を決定するとお考え下さい。
ワークフロー
{ "schema_version": 1, "nodes": [ { "id": 1, "type": "storm/request", "properties": {}, "metadata": { "position": {"x": 12, "y": 105.75}, "size": {"width": 300, "height": 51}, "virtualId": "eaGt1WokAQ" } }, { "id": 2, "type": "storm/llm", "properties": { "llm": { "model": "gpt-5-mini-2025-08-07", "chat_engine": "openai", "stop": [], "tools": [ { "type": "function", "function": { "name": "get_person_info", "description": "指定された人物の情報を取得する", "parameters": { "type": "object", "required": ["name"], "properties": { "name": {"type": "string", "description": "情報を取得する人物の名前"} }, "additionalProperties": false } } }, { "type": "function", "function": { "name": "get_multiple_person_info", "description": "指定された複数の人物の情報を取得する", "parameters": { "type": "object", "required": ["persons"], "properties": { "persons": { "type": "array", "items": { "type": "object", "required": ["name"], "properties": { "name": {"type": "string", "description": "取得する人物の名前"} } } } } } } } ] }, "system_template": "あなたは、ユーザーの質問を理解して、呼び出す関数を決定するエージェントです。\n", "user_template": "question : {{query}}", "retrieval_chunks_template": "[[#{{no}}]] filename: {{filename}}, pagename: {{pagename}}\nContext: {{context}}", "num_latest_chats": 5 }, "metadata": { "position": {"x": 352, "y": 105.75}, "size": {"width": 300, "height": 51}, "formDraft": { "propertiesHash": "18djuaes1wl", "fields": { "model": "gpt-5-mini-2025-08-07", "functions": [ { "name": "get_person_info", "parameters": "{\n \"type\": \"object\",\n \"properties\": {\"name\": {\"type\": \"string\", \"description\": \"情報を取得する人物の名前\"}},\n \"required\": [\"name\"],\n \"additionalProperties\": false\n}", "description": "指定された人物の情報を取得する" }, { "name": "get_multiple_person_info", "parameters": "{\n\"type\": \"object\",\n\"properties\": {\n\"persons\": {\n\"type\": \"array\",\n\"items\": {\n \"type\": \"object\",\n \"properties\": {\"name\": {\"type\": \"string\", \"description\": \"取得する人物の名前\"}},\n \"required\": [\"name\"]\n}\n}\n},\n\"required\": [\"persons\"]\n}", "description": "指定された複数の人物の情報を取得する" } ], "modelSettings": {"chat_engine": "openai"}, "user_template": "question : {{query}}", "modelParameters": { "stop": [], "extra_params": "", "max_tokens_fallback": 20000 }, "system_template": "あなたは、ユーザーの質問を理解して、呼び出す関数を決定するエージェントです。\n", "num_latest_chats": 5, "retrieval_chunks_template": "[[#{{no}}]] filename: {{filename}}, pagename: {{pagename}}\nContext: {{context}}" } }, "virtualId": "cu5NMSr8LX" } }, { "id": 3, "type": "storm/response", "properties": {"result_list": ["{{custom_variables}}"]}, "metadata": { "position": {"x": 1452, "y": 72}, "size": {"width": 300, "height": 51}, "virtualId": "S9kaoelXku" } }, { "id": 4, "type": "storm/ifelse", "properties": { "if": [ { "note": "", "logic": "AND", "condition": [ { "operator": "EQUAL", "value": "get_person_info", "comparison_target": "{{result.name:2}}" } ], "idx": 0, "links": [6] }, { "note": "", "logic": "AND", "condition": [ { "operator": "EQUAL", "value": "get_multiple_person_info", "comparison_target": "{{result.name:2}}" } ], "idx": 2, "links": [8] } ], "else": {"idx": 1, "links": [9], "note": ""} }, "metadata": { "position": {"x": 692, "y": 62.25}, "size": {"width": 300, "height": 138}, "extra": {"use_json": false}, "virtualId": "scPcQgKFlG" } }, { "id": 5, "type": "storm/text", "properties": { "text": "人物の情報取得 Function が選択されました。({{result.name:2}})\nパラメーターは、{{result.arguments:2}}です。\n" }, "metadata": { "position": {"x": 1072, "y": 123}, "size": {"width": 300, "height": 51}, "virtualId": "5RJZKR19JS" } }, { "id": 7, "type": "storm/text", "properties": {"text": "関数は選択されませんでした。"}, "metadata": { "position": {"x": 1072, "y": 12}, "size": {"width": 300, "height": 51}, "virtualId": "vRzOU448N8" } } ], "links": [ [1, 1, 2], [3, 2, 4], [6, 4, 5], [7, 5, 3], [8, 4, 5], [9, 4, 7], [10, 7, 3] ], "custom_variables": {} }まとめ
今回は、ファンクションコールの際のパラメーターの決定方法を追加で説明しました。
また、LLMを介さずに出力を成型するレスポンスノードについても説明しました。



