フューチャー技術ブログ

わかりやすいADKのAPIリクエストツール作成

AI Tips連載の8日目の記事です。

はじめに

こんにちは。フューチャーアーキテクト 製造・エネルギーサービス事業部の柴田です😌 見真の心で本質を探求しています!

本記事では、Google ADK (Agent Development Kit) を活用したマルチエージェントの構築、特に APIツール の利用に焦点を当てます。

OpenAPI仕様書からツールを生成し、APIキーを設定する具体的な手順を紹介します。これにより、自社開発や外部のAPIをAIエージェントと簡単に連携させる方法を示します。

もしこれからADKを始める方はこちらのクイックスタートがおすすめです。
https://cloud.google.com/vertex-ai/generative-ai/docs/agent-development-kit/quickstart?hl=ja

この記事が複雑なタスクを処理するマルチエージェント開発のTipsになればと思います!!

マルチエージェントとは

複数のAIエージェントが協調的または競合的に相互作用し、共通の目標達成や複雑な問題解決を目指すシステムです。

各エージェントは自律的に意思決定を行い、環境や他のエージェントの行動に応じて学習・適応することで、単一エージェントでは困難なタスクを効率的にこなします

Agent Development Kit(ADK)とは

ADKは、AIエージェントの開発とデプロイのためのフレームワークです。

AIエージェントごとに利用するモデル・役割・外部との連携を選択し、さらにAIエージェント同士の関係を記述することで、上記のようなマルチエージェントが作成できます。

ADKにおけるツールとは

AIエージェントに提供される機能を指しています。エージェントがLLMとしての能力を超えて、さまざまなアクションを実行したり、外部と連携することを可能にします。

エージェントに武器を持たせるイメージが自分の中でしっくりきています。このツールがADKによるマルチエージェント開発をすごく面白いものにしていると思います。

斧を装備した戦士

斧を装備した近距離型戦士

弓を装備した戦士

弓を装備した遠距離型戦士

※上記2つのイメージ画像はMiroで生成したものです

ツールの例

  • データベースのクエリ
  • APIリクエストの作成(例:天気データの取得、予約システム)
  • ウェブ検索
  • コードスニペットの実行
  • 文書からの情報の取得(RAG)
  • 他のソフトウェアやサービスとのやり取り

想定するマルチエージェントの構成

本記事ではツールの中のAPIリクエストの作成にターゲットを絞りますが、具体的に作成したいマルチエージェント構成を示します。

今回はこのマルチエージェントの中で、エネルギーデータ取得エージェントさんが必要データを取得するためにAPIツールを利用するという想定で話を進めます。

ルチエージェント構成図

マルチエージェント構成図

この構成では指定した期間の必要データをeiaから取得し、数値に変動大きい時期を特定して同時期の関連ニュースを検索し、まとめてレポートを作成します。そして最後にレポートを指定したメールに送付します。

APIツールの実装手順

OpenAPI仕様書の取得

素晴らしいことに ADKではOpenAPI仕様に準拠したJSONやYAMLファイルをインポートすることでツールを作成することができます。

ということで今回は油価を取得するAPIを求めて、エネルギー情報局 EIA(Energy Information Administration)のウェブサイトからOpenAPI仕様書をダウンロードします。

エネルギー情報局 EIAトップページ

eiaウェブサイト

APIキーの取得

このAPIを使うためにはAPIキーが必要ですので、ウェブサイトで登録してAPIキーを発行してもらいました。取得したAPIキーをエネルギーデータ取得エージェントに持たせることで、エージェントがAPIを利用できるようになります。

ツールの生成

OpenAPI仕様のファイルを読み込んでツールを生成します。このAPIではAPIキーを必要とするため、先にAuthSchemeAuthCredentialを生成します。これはagent.pyで定義すれば大丈夫です。まずはツール作成のコード全体を示します。

with open(eia_openapi_path, "r", encoding="utf-8") as file:
data = file.read()
auth_scheme, auth_credential = token_to_scheme_credential(
"apikey",
"query",
"api_key",
eia_api_key
)
eia_api_tools = OpenAPIToolset(
spec_str=data,
spec_str_type="yaml",
auth_scheme=auth_scheme,
auth_credential=auth_credential
)

それでは各処理を個別に見ていきます。

認証情報作成の説明

token_to_scheme_credential関数の各引数は次の通りです。nameではAPIの仕様書によって定義されているAPIキーのパラメータ名を指定し、credential_valueでAPIキーを指定します。

  • token_type: Literal["apikey", "oauth2Token"]
  • location: Optional[Literal["header", "query", "cookie"]] = None
  • name: Optional[str] = None
  • credential_value: Optional[str] = None

ツール生成の説明

次にOpenAPIToolset関数でツールを生成します。OpenAPI仕様書を文字列で読み込んで(下記の場合はdata)、先ほど生成したAuthSchemeAuthCredentialと合わせて引数に指定します。

これでのようにして作成したOpenAPIToolsetクラスのインスタンスがそのままツールとして利用することができます。

eia_api_tools = OpenAPIToolset(
spec_str=data,
spec_str_type="yaml",
auth_scheme=auth_scheme,
auth_credential=auth_credential
)

エージェントにツールを追加

作成したツールはAgenttoolsとしてそのまま使用できます。

具体的なコードは次の通りになります。インストラクションは長いので今回は省略します。動作確認をするだけであれば、descriptionの内容を指示として与えてもAPIを使用してくれると思います。API実行前にURIを明示してユーザーに確認してもらうようにするとデバッグが捗るかもしれません。

energy_data_agent = Agent(
name="energy_data_agent",
model="gemini-2.0-flash-001",
description="指定された日付範囲の様々なエネルギーデータを取得するエージェント",
instruction=f"""
インストラクションは長いので省略
""",

generate_content_config=types.GenerateContentConfig(temperature=0.0),
tools=[eia_api_tools],
output_key="energy_data_analysis",
)

ツールの動作確認

マルチエージェント構成の確認

先ほど作成したエージェントを組み込んで、最初に説明したマルチエージェントを作成したら、adk webで実行しましょう。

実行後にlocalhostに立ち上がった画面のEventで可視化されたマルチエージェントの構成を確認してみましょう。

このように一つ一つのAPIリクエストがツールとして構成されていることが分かります。

エージェントとツールの連携可視化.png

エージェントとツールの連携可視化

実行結果例

実行結果の例としてスクショを貼ります。このようにプロンプトによりAPIを使ってデータを取得できました。

今回のマルチエージェントでは、この後データの変動が大きい時期の関連ニュースをGoogle Searchで検索し、結果を統合してレポートを作成し、最後にレポートをメール送付しています。

エージェントとの会話画面

エージェントとの会話画面

最後に

以上、ADKのToolsの機能の内、APIリクエストを作成する方法を紹介しました。APIリクエストを自分で実装することなく、OpenAPI仕様書をそのまま利用できるので、非常に短時間で、API仕様を理解してパラメータを合わせこむ必要もなくAPIリスエストを利用できるようになりました。

ADKではこの他にも様々なツールが用意されており、これらを活用することでLLMの枠を超えた様々な機能が実現できますので、色々と試していただけると嬉しいです。

改善点メモ

OpenAPI仕様書のdescriptionにあまり詳細が書かれていないからか、API実行までに色々な質問が飛んできたり、APIパラメータを変えながら何度かリトライする状況がありました。OpenAPI仕様書のdesctiptionの情報補完して、さらに不要なAPIを削除すると、より使いやすいツールになるかもしれないです。

参考資料