前回、ADKでマルチエージェントのサンプルを作りましたが、
Google ADKでOCI Generative AIを使ったマルチエージェントのサンプルを作ってみた
これだと、外部から利用するのが難しいため、今回Rest APIで呼び出せるようにしました。
ソースコード
https://github.com/saiken/adk-oci-sample/blob/main/main.py
※FastAPIとADK周りの連携はこのファイルで実装しています
環境
- ローカル
- Mac
- Python3.13
- Codex CLI
サマリー
以下の構成にしました
- ローカルデバッグ用に、adk webなどはそのまま利用できるようにしつつ、
- main.pyでuvicornを起動し、FastAPI経由でagentを実行
実装
※今回も基本的にCodex CLIに依頼して修正してもらっています
Fast APIの設定とuvicornの起動
app = FastAPI(title="ADK Agent API", version="0.1.0")
// エンドポイントの定義
@app.post("/message", response_model=MessageResponse)
async def post_message(payload: MessageRequest, request: Request) -> MessageResponse:
// ここに処理を記載
return MessageResponse(session_id=session_id, response=response_text)
def main() -> None:
host = os.getenv("HOST", "127.0.0.1")
port = int(os.getenv("PORT", "8000"))
uvicorn.run("main:app", host=host, port=port, reload=os.getenv("RELOAD") == "1")
ADKのRunnerを定義
runner = Runner(app_name=APP_NAME, agent=root_agent, session_service=session_service)
ADKのエージェントを実行
runner.run_asyncでエージェントの処理を実行
async for event in runner.run_async(
user_id=user_id, session_id=session_id, new_message=user_content
):
event に、ADKのイベントが渡されてきて、ログを出力したりレスポンスを生成したりできます
セッション制御
継続してやりとりするために、会話履歴が必要でセッションを使います
session_serviceを取得
session_service = InMemorySessionService()
ADKのRunnerを定義する際に、session_serviceもわたす
runner = Runner(app_name=APP_NAME, agent=root_agent, session_service=session_service)
session_serviceでセッションIDがなければcreate
async def _ensure_session(*, user_id: str, session_id: str) -> None:
lock = _get_session_lock(user_id, session_id)
async with lock:
session = await session_service.get_session(
app_name=APP_NAME, user_id=user_id, session_id=session_id
)
if session is None:
await session_service.create_session(
app_name=APP_NAME, user_id=user_id, session_id=session_id
)
起動方法
uv run python main.py
実行結果
$ curl -s -X POST http://127.0.0.1:8000/message \
> -H 'content-type: application/json' \
> -d '{"message":"OCI Generative AI とGenerative AI Agentsの違いを教えて"}' \
> | jq .
{
"session_id": "0cc986f085e2488490f25edbc2915318",
"response": "OCI Generative AI と Generative AI Agents の違いは、その機能の幅広さと用途の特化性にあります。\n\nOCI Generative AI は、Oracle Cloud Infrastructure によって提供される包括的な AI サービスです。テキスト、画像、音声の生成や操作、分析など、幅広い AI 機能を提供し、開発者がさまざまなアプリケーションを構築できるプラットフォームとなっています。自然言語処理や画像認識などの分野で活用され、企業や開発者の AI 活用をサポートします。\n\n一方、Generative AI Agents は、特定のタスクや目的のために設計された AI を利用したソフトウェアエージェントです。人間のように行動し、複雑なタスクを実行したり、ユーザーと対話したりすることができます。自然言語処理や機械学習技術を利用して、ユーザーからの要求に応え、チャットボットや仮想アシスタントなどの特定の用途やシナリオに合わせてカスタマイズされた専門的なソリューションを提供します。\n\n要約すると、OCI Generative AI は幅広い AI 機能を提供するプラットフォームであり、Generative AI Agents は特定のタスクに特化したエージェントです。OCI は開発者や企業の AI 活用を包括的にサポートし、Generative AI Agents は専門的な用途に特化したツールとして機能します。\n\nこの説明で違いが理解できたでしょうか?さらに詳しい情報や確認したい点があれば、お気軽にお尋ねください。"
}
学習メモ
ADKのapi_server機能
ADKにも、起動オプションでapi_serverとして動かす機能があるようです
ただ、エンドポイントをカスタマイズできなかったり自由度は低そうだったので今回の実装をしました
参考)下記の「実行方法3:APIサーバー (adk api_server)」のところ
adk web との共存
adk web agents で動かすと、パスのルートが変わってしまい、import でエラーになりました
※ルートがagents ディレクトリになってしまうようでした。
そのため、 adk web で動かす場合は、以下のようにして実行するようにしました
PYTHONPATH=. uv run adk web agents