0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Google ADKでOCI Generative AIを使ったマルチエージェントのサンプルを作ってみた

0
Last updated at Posted at 2026-05-02

目的

  • 自分の学習用です

やったこと

  • Google ADKでOCI Generative AIのLLMを利用したアプリを作ってみました
    • OCI Generative AIでモデルを使うための設定
    • ローカル環境でGoogle ADKのアプリを構築

やらなかったこと

  • OCI Generative AI Agents に関しては触れません
  • Oracle のADKについても触れていません
  • OCIにデプロイはしていません(ローカルで動かすところまでしかできていません)

ソースコード

https://github.com/saiken/adk-oci-sample
※あまりテストもできていないです、、クオリティはご容赦ください

環境

  • ローカル
    • Mac
    • Python3.13
    • uv(Pythonパッケージマネージャ)
    • Codex CLI
  • 実行環境
    • OCI Generative AI

OCI Generative AI の設定

今回は、専用クラスタは用意せず、オンデマンドで利用したため、
利用可能なリージョンにいれば特に設定は不要です。

ただ、私は東京リージョンでFree Tierだったため、下記対応をしました。

リージョンの有効化

リージョンは、利用したいモデルを下記で確認し、利用リージョンを決めます

※OCIはCohereやLlamaしか使えないイメージでしたが、GPT(OSS版)やGemini(2.5で古い)も利用できるようでした

※2026/04/30時点で、OCI Generative AIは、東京リージョンではデプロイできません。

Free Tierの場合

私の場合、Free TierでOCIアカウントを作っていたため、複数リージョンが作れず、
下記を参考に、アカウントをアップグレードしました。

OCI 無料アカウントの有料アカウントへのアップグレードとリージョンサブスクライブ

※アップグレードの申請をして、2時間後くらいに完了のメールが来ていました

その後、大阪リージョンをSubscribeし、
5分くらい待つと大阪リージョンに切り替えれました、以下のようにGenerative AI がハンバーガーメニューから選択できるようになりました
image.png

Playground

Azure OpenAI のように、Playground機能でモデルを指定してチャットも利用できます

image.png

ローカル環境セットアップ

Codex

brew update
brew install codex
codex --version

※npm で入れるなど他にもいろいろ方法はあるようです
参考)Codex CLI クイックインストール(Mac/Windows対応)

~/.codex/config.toml に下記を設定し、

model = "gpt-5.2"

環境変数に、OpenAIのAPIキーを設定すれば利用できました

export OPENAI_API_KEY={YOUR_API_KEY}

OCI CLI

動作確認などで利用できるようにOCIのCLIもインストールしておきます

brew install oci-cli

APIキーの設定など下記で実施します

oci setup config

以下の記事を参考にしました
Oracle Cloud コマンド・ライン・インタフェース(CLI) をインストールしてみてみた

uv (Pythonのパッケージマネージャ)

参考)uvで始めるPythonプロジェクト管理

  • インストール
curl -LsSf https://astral.sh/uv/install.sh | sh
  • プロジェクトの初期化
uv init
  • sdkの追加
uv add oci
  • 環境の同期
uv sync
  • 実行してみる
    Playground の右上のView codeからPythonのコードを生成
    image.png

生成したコードを実行し、200が返ってくることを確認

 uv run chat_demo.py
**************************Chat Result**************************
{'status': 200, 'headers': {'Date': 'Fri, 01 May 2026 02:42:59 GMT', 'Content-Type': 'application/json', 'Content-Length': '1109', 'Connection': 'keep-alive', 'opc-request-id': ・・・

ローカルでADKアプリを開発

とりあえず動くもの

基本的に、Codex CLIにまかせます

まずはサンプルを作成

> GoogleのADKを使ったマルチエージェントのサンプルを作ってください

いい感じにサンプルを作ってくれたものの、Gemini利用になっていたので修正

› agent.py で利用するモデルをOpenAI のgpt-5.2 にするようにおねがいします

など、出てきたものに対して、VSCodeでソースを見ながら適宜依頼

› .adk配下のsession.db は必要ですか?
› 生成しないようにすることはできますか?

生成されたコードについて質問しつつ、

› セッションサービスを in-memory にしてください
› .envや.env.example はプロジェクトのルート直下においてください

適宜修正

一旦OpenAIベースで動くことを確認

$ uv run adk web agents

こんな感じで適当な質問に対して、マルチエージェントで動いている様子を確認できます
image.png

OCI Generative AIを使うように変更

Codex CLIで以下のようなプロンプトで修正を依頼していきます

› エージェントの構成を、全体オーケストレーションエージェントと領域ごとのエージェントに分けたいです
  以下のようなイメージです
  - オーケストレーション
    - 全体オーケストレーションエージェントでユーザーからの入力に対して、サブタスクに分解し、適したエージェントにタスク
  を依
  頼する
    - 最後に各エージェントが出力した内容をもとに回答を生成する
  - OCIの専門家エージェント
    - タスクからWeb検索用のクエリーを生成
    - Web検索を実行
    - 検索結果を元に回答を生成
  - システム開発エンジニアスペシャリスト
    - システムでどのように実現するかを検討し、回答を生成
以下のエージェントごとに、ディレクトリを分解してください
- オーケストレーション
- OCIの専門家エージェント
- システム開発エンジニアスペシャリスト

リファクタリングや出てきたエラーの解消も基本的にCodex CLIに依頼
PRを出して、まず自分がレビュワーとして確認し、マージしていくような流れで進めました

Google ADKでOCI Generative AIに接続する方法

以下のように、OCI Generative AI用のクラスを生成し、

def _create_oci_inference_client():
  try:
    import oci  # type: ignore
    from oci.generative_ai_inference import GenerativeAiInferenceClient  # type: ignore
  except Exception as exc:  # pragma: no cover
    raise ImportError(
        "OCI Generative AI requires the OCI Python SDK. Install it with `uv sync`."
    ) from exc

  auth = os.getenv("OCI_AUTH", "api_key").strip().lower()
  region = os.getenv("OCI_REGION", "").strip() or None

  if auth == "resource_principal":
    signer = oci.auth.signers.get_resource_principals_signer()
    config = {"region": region} if region else {}
    return GenerativeAiInferenceClient(config=config, signer=signer)

  config_file = os.getenv("OCI_CONFIG_FILE", "~/.oci/config")
  profile = os.getenv("OCI_PROFILE", "DEFAULT")
  config = oci.config.from_file(
      file_location=os.path.expanduser(config_file),
      profile_name=profile,
  )
  if region:
    config["region"] = region
  return GenerativeAiInferenceClient(config=config)

各エージェントで、modelを指定する際に、以下のように設定

task_router_agent = LlmAgent(
    name="OrchestratorRouter",
    model=MODEL, # ← ここで、OCI Generative AI用のmodelを指定
    description="・・・",
    generate_content_config=GEN_CONFIG,
    instruction=(
        "・・・"
    ),
    output_key="task_breakdown",
)

※詳細はGitHubのコードを参考にしてください(といってもCodexに出力してもらったものがほとんどですが)
https://github.com/saiken/adk-oci-sample

最終的に

ディレクトリ構成

(この辺もCodex CLIがかってに書いてくれます)

.
├── .env.example                 # 環境変数のサンプル(OpenAI / OCI 切り替え)
├── README.md
├── pyproject.toml               # 依存関係(google-adk / oci など)
├── uv.lock
├── agents/
│   ├── orchestrator/
│   │   ├── __init__.py          # ADK エントリ
│   │   └── agent.py             # 全体オーケストレーション(分解→依頼→統合)
│   ├── oci_expert/
│   │   ├── __init__.py          # ADK エントリ
│   │   ├── agent.py             # OCI専門家(クエリ生成→検索→回答)
│   │   ├── oci_llm.py           # OCI Generative AI 用 LLM アダプタ
│   │   └── web_search.py        # Web検索ツール(DuckDuckGo HTML)
│   ├── system_dev_specialist/
│   │   ├── __init__.py          # ADK エントリ
│   │   └── agent.py             # システム開発エンジニア(設計/実装/運用)
└── .adk/                        # (任意)ローカル保存の session/artifacts(無効化可能)

画面での実行イメージ

こんな感じで、タスクを分解し、回答を生成してくれるようになりました
image.png

学習メモ

OCI Generative AIのオンデマンドと専用クラスタ

OCI Generative AIでLLMを利用する場合、
オンデマンドと専用クラスタの2つの方法があるようで、今回は検証用なのでオンデマンドで利用します

  • オンデマンド
    • すぐ使える(セットアップ不要)
    • 初期コストなし
    • 使った分だけ課金
    • スケールは自動だが制限あり
    • レイテンシや性能はやや不安定(共有のため)

→ 検証・小規模・たまに使う用途向け


  • 専用クラスタ
    • GPUなどのリソースを占有
    • 安定した性能・低レイテンシ
    • スループットが高い(大量リクエスト向き)
    • 常時コストが発生(使ってなくても課金)

→ 本番運用・高負荷・安定性重視の用途向け

Google ADK or OCI ADK

調べていると、OCIにもADKがあるようで、どちらを使うか少し悩みました
OCIのADKも、マネージドでいろいろ多機能なようではあったのですが、結論、GoogleのADKで今回は試しています。

理由は、OCI Generative AI Agents と密結合な印象だったため。
下記などを参考にしたのですが、AI Agentsのエンドポイントを指定したりする必要があるようでした。
(すみません、そんなに深くは調べれていないです)
OCI ADKを使ってGenerative AI Agents Platformを触ってみた

ADKでOCI Generative AIにつなぐLiteLLM経由案

OCI Generative AI用のクラスを用意するのに、
OCIのSDKを使って作る方法と、LiteLLM経由で使う方法とあるようですが、下記Codex の出力を参考に、
LiteLLM proxyでエラーがでていたのもあり、SDKを使う方法の方が無難かなと思いそちらを採用しました
(Google ADKが、うまくOCI部分を隠蔽して実装できたことも大きいです)

› いまの実装は、OCIのSDKを使って接続していますが、LiteLLMを使うことも可能でしょうか?メリット・デメリットを確認したいで
  す


• 可能です。OCI Generative AI は「OCI SDKで直接叩く」以外に、LiteLLM(=OpenAI互換などを含む統一IF)経由で呼ぶ構成も取り
  得ます。ただし、OCI Generative AI を LiteLLM が“ネイティブに”サポートしているか/どの機能まで対応しているかはバージョ
  ン依存です(確認が必要)。

  OCI SDK 直叩き(現状実装)のメリット

  - OCI Generative AI のAPI仕様に最短で追従しやすい(OnDemandServingMode、CohereChatRequest/GenericChatRequest 等をその
    まま扱える)
  - OCI の認証(APIキー/リソースプリンシパル)・署名が確実
  - エラー時の原因切り分けがしやすい(OCIのエラーがそのまま出る)

  OCI SDK 直叩きのデメリット

  - プロバイダ切替が重い(OpenAI/Anthropic等へ移すと実装も変わる)
  - 形式差(Cohere/Generic)の吸収を自前でやる必要がある
  - ストリーミングやツール呼び出し等も自前実装になりがち

  LiteLLM 経由のメリット

  - model 文字列の切替だけでプロバイダ変更しやすい(実装の共通化)
  - リトライ/ログ/レート制御などの周辺機能を揃えやすい(設定で統一)
  - ADK側は model="provider/model" の1行で済むことが多い

  LiteLLM 経由のデメリット

  - OCI 固有の“モデル形式差”(Cohere/Generic)を LiteLLM がどこまで正しく吸収できるか不確実
  - OCI の認証(リソースプリンシパル等)対応が限定的な場合がある
  - 問題発生時に「ADK→LiteLLM→OCI」の多段になりデバッグが難しくなる
  - 最新OCI機能が LiteLLM に来るまでタイムラグが出やすい

  結論として、本番でOCIをメインに使うなら OCI SDK 直叩きが堅い一方、将来プロバイダ切替・多ベンダ対応を重視するなら
  LiteLLM も検討価値ありです。

  LiteLLM でOCI Generative AIを使う構成に実際に切り替える案も作れますが、まず「OCI上で使いたいモデルが Cohere 系か
  Generic 系か(例: Command R / Llama)」と「認証は APIキー or リソースプリンシパル」だけ教えてください。そこに合わせて
  最小の実装方針を出します。

(ダメだったもの)CodexでもLightLLM経由でOCI Generative AIを利用する

当初、Codex CLI でもOCI Generative AIを使おうと考えていましたが、ハマりそうだったので諦めました。
LiteLLMをproxyとして利用しようとしたのですが、
LiteLLMでエラーがでて、うまくコード生成ができなかったため

ググっても、
OpenCodeとOCI Generative AIを連携する のように、
Codex 以外のサンプルは見つかったものの、Codex でうまくやっているものは見つからずでした。

uv tool install 'litellm[proxy]' -p 3.13

python 3.14 だと cannot import name 'BaseDefaultEventLoopPolicy' from 'asyncio.events' のエラーになるため、3.13 を指定しています

OCI Generative AIのmodelの確認方法

下記でmodelの情報がとれるので、そこからOCIDを取得したり、モデル名を取得したりしました

oci generative-ai model-collection list-models \
  --endpoint=https://generativeai.{region}.oci.oraclecloud.com \
  --compartment-id={compartment_id}

OCI Generative AIの料金

料金はこちらのOCI Generative AIのところ

価格表だと、
Oracle Cloud Infrastructure Generative AI - Large Cohere といったLarge とかSmall で書いてあって、
どれがどのモデルかわからないのがツラいですね。。

専用クラスタの場合は、APIを呼ばなくても、費用がかかるようでした

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?