
News Observation Lab for Future
Node.jsで作るエージェント型ツール使用ボットのMVP構築手順

ChatGPT のように対話しながら実際の処理を行えるインターフェースを作りたいと考えたことはありませんか。本稿では、Node.js と OpenRouter を利用して、リアルタイムの天気情報(都市ごとの天候・気温・湿度)を取得できるチャットボット「Mausam AI」の最小実装(MVP)の作り方を解説します。
エージェントツール使用とは
大規模言語モデル(LLM)は学習時点までの静的知識しか持ちません。そのため「現在のムンバイの天気は?」と尋ねても、最新情報を取得できず、架空の回答や謝罪しか返せません。そこで「エージェント」ワークフローを導入し、LLM に外部ツール(例:get_mausam)を呼び出させることで、ライブデータを会話に組み込みます。
システムプロンプトとエージェントロジック
本ボットの核となるロジックは helper.js にあり、LLM に対して「START → PLAN → TOOL → OUTPUT」という構造化された思考ループを強制します。システムプロンプトで JSON 形式の応答を要求し、ツールが必要になった場合は次のようなオブジェクトを出力させます。
{"step":"TOOL","toolname":"get_mausam","input":"Mumbai"}
バックエンドはこの JSON を逐次解析し、ツール呼び出しを代行します。また、無限ループや誤動作を防止するために最大イテレーション数のチェックとエラーハンドリングを実装しています。
ツール:天気データ取得
LLM が get_mausam を呼び出すと、JavaScript の fetch 関数で wttr.in へリクエストし、コンソール向け天気サービスからリアルタイムの天気情報を取得します。
堅牢な API 呼び出し
OpenRouter の API キーが枯渇した場合に備えて、一次キーで失敗した際に自動的にバックアップキーへ切り替えるフォールバック機構を try/catch で実装しています。
Express バックエンドとチャット UI
全体のロジックはシンプルな Express サーバー(app.js)に統合されています。複数ユーザーが同時に利用できるよう、セッション ID をフロントエンド(index.ejs)で生成し、セッションマップに保存して状態を管理します。フロントエンドは暗色系 UI を採用し、1 秒ごとに GET /messages?sessionId=… をポーリングして AI の思考過程と最終回答をストリーミング表示します。途中の「思考」ステップは視覚的に区別できるようスタイル付けされています。
まとめ
大規模なフレームワークを導入せずとも、JSON スキーマと単純なループ制御だけで LLM に外部世界へのアクセス権を与えるエージェントパイプラインを構築できます。本稿の手順を参考に、独自のツール使用ボット開発に挑戦してみてください。