クイック・スタート

次のステップを使用して、OCI Generative AIによるエンタープライズAIエージェントの構築を開始します。このガイドでは、何をするのではなくなぜ重要なのかを理解するために、途中でコンテキストとともに初期設定について説明します。

前提条件: IAM権限の設定

プロジェクトを作成する前に、適切なユーザー・グループがOCI生成AIリソースにアクセスできることを確認してください。これらの権限がないと、プロジェクトおよび関連アセットを作成または管理できなくなります。

OCIには、単一のポリシーを介してすべての生成AIリソース・タイプへのアクセス権を付与する集計リソース・タイプgenerative-ai-familyが用意されています。

ヒント

サンドボックスまたは開発環境で作業している管理者またはユーザーにのみ、広範なアクセス権を付与します。本番環境では、より限定的なポリシーを適用することを検討してください。

テナンシ・レベルでのアクセス権の付与

ユーザー・グループがテナンシ全体のすべての生成AIリソースを管理できるようにするには:

allow group <your-group-name> to manage generative-ai-family 
in tenancy

コンパートメント・レベルでのアクセス権の付与

特定のコンパートメントへのアクセスをスコープ指定するには:

allow group <your-group-name> to manage generative-ai-family 
in compartment <your-compartment-name>

これらの権限が設定されると、最初のプロジェクトを作成する準備が整います。

1. プロジェクトの作成

プロジェクトは、OCI Generative AIでAIエージェントと関連資産を組織および管理するための基盤となるリソースです。Oracle Cloudコンソールを使用してプロジェクトを作成できます。

プロジェクトを作成した後、コンソールを使用して管理できます。たとえば、詳細の更新、別のコンパートメントへの移動、タグの管理、削除などです。これらのアクションは、「アクション」メニュー(3つのドット)プロジェクト・リスト・ページから使用できます。

開始するには、プロジェクト・リスト・ページに移動し、「プロジェクトの作成」を選択します。

基本的な情報

まず、プロジェクトのコア属性を定義します。
  • 名前(オプション):

    文字またはアンダースコアで始まり、その後に文字、数字、ハイフンまたはアンダースコア(1-255文字)が続く名前を指定します。名前を指定しない場合は、次の形式を使用して自動的に生成されます。

    generativeaiproject<timestamp> (たとえば、generativeaiproject20260316042443)。これは後で更新できます。

  • 説明(オプション):

    プロジェクトの目的の識別に役立つ簡単な説明を追加します。

  • コンパートメント:

    プロジェクトが存在するコンパートメントを選択します。デフォルトでは、これは現在のコンパートメントですが、必要な権限を持つ任意のコンパートメントを選択できます。

データ保存

生成されたデータが格納される期間を構成します。これにより、操作性とデータ・ライフサイクル要件のバランスが取れます。

  • レスポンスの保持:

    生成後に個々のモデル・レスポンスが格納される期間を定義します。

  • 会話の保持:

    会話全体が最新の更新後に保持される期間を決定します。

両方の値を、最大720時間(30日)の時間数で設定できます。

短期メモリー圧縮

この機能により、最近の会話履歴をコンパクトな表現にまとめることで効率が向上します。トークンの使用状況とレイテンシを削減しながら、コンテキストを維持するのに役立ちます。

  • 有効化(オプション):

    短期メモリー圧縮を有効にして、以前の相互作用を自動的に凝縮します。

  • モデルの選択:

    有効な場合は、圧縮モデルを選択します。使用可能なモデルはリージョンによって異なります。

重要

  • 圧縮モデルは作成時に選択され、後で変更できません。
  • 有効にすると、プロジェクトを削除せずにこの機能を無効にすることはできません。
  1. (オプション)短期メモリー圧縮を有効にして、以前のチャット履歴を要約し、コンテキストを軽く保ちます。
  2. 短期メモリー圧縮機能を有効にした場合は、圧縮するモデルをリストから選択します。
    モデルのリストは地域によって異なります。使用可能なモデルについては、エージェントAPIの生成AIモデルおよびリージョンを参照してください。

長期メモリー

長期的なメモリにより、システムは、将来の使用のために会話から重要な情報を抽出し、保持することができます。このデータは埋込みとして格納されるため、相互作用全体で検索および再利用できます。

  • 有効化(オプション):

    長期的なメモリをオンにして、会話の重要なインサイトを維持します。

  • モデルの選択:
    • 抽出モデル: 重要な情報を識別して取得します。
    • 埋込みモデル: 格納されたデータをベクトル表現に変換して取得します。
重要

  • これらのモデルは、プロジェクトの作成中に選択する必要があり、後で変更できません。
  • 有効にすると、プロジェクトが削除されないかぎり、長期メモリーを無効にできません。
ヒント

最良の結果を得るには、レスポンスと会話の両方の保持を、長期メモリーの使用時に最大期間(720時間)に設定します。

タグ

タグは、リソースを編成および管理するのに役立ちます。

  • (オプション) 「タグの追加」を選択して、プロジェクトにメタデータを割り当てます。

    詳細は、リソース・タグを参照してください。

最後に、「作成」を選択してプロジェクトを作成します。

2.APIキーの作成

OCI生成AIへのリクエストを認証するためのAPIキーを作成します。キーに名前を付けることができ、オプションで、有効期限と時間を使用して最大2つのキー名を構成できます。

APIキーは、OCI生成AIへのリクエストを認証するために使用されます。このステップでは、アプリケーションまたはツールがサービスに安全にアクセスするために使用できるキーを作成します。

コンソール、CLIまたはAPIを使用して、APIキーを作成および管理できます。

重要

キーを作成した後、APIキー権限の追加を行ってください。
  • APIキー・リスト・ページで、「APIキーの作成」を選択します。リスト・ページの検索に関するヘルプが必要な場合は、APIキーのリストを参照してください。

    基本情報

    1. APIキーの名前を入力します(必須)。名前は文字またはアンダースコアで開始し、その後に文字、数字、ハイフンまたはアンダースコアが続きます。1から255文字の長さにできます。
    2. (オプション)「説明」を入力します。
    3. (オプション)APIキーをリストされているものとは異なるコンパートメントに保存するには、別のコンパートメントを選択します。
      コンパートメント内のリソースを表示するには、コンパートメントで作業する権限が必要です。使用するコンパートメントがわからない場合は、管理者に連絡してください。詳細は、コンパートメントの理解を参照してください。
    4. (オプション)このAPIキーにタグを割り当てます。リソース・タグを参照してください。

    キー名と有効期限

    1. 最初のキーの名前として「1つの名前をキー」を入力します。名前は文字またはアンダースコアで開始し、その後に文字、数字、ハイフンまたはアンダースコアが続きます。1から255文字の長さにできます。
    2. (オプション)「キー1有効期限」および「キー1有効期限(UTC)」を設定します。
      デフォルト値は、作成日から3か月です。
    3. 2番目のキーの名前(キー2の名前)を入力します。
    4. (オプション)「キー2の有効期限」および「キー2の有効期限(UTC)」を設定します。
      デフォルト値は、作成日から3か月です。
    5. 「作成」を選択します。
    キーを作成した後、必ずAPIキー権限の追加を行ってください。
  • APIキーを作成するには、api-key createコマンドおよび必須パラメータを使用します。

    oci generative-ai api-key create [OPTIONS]

    CLIコマンドのパラメータおよび値の完全なリストは、CLIコマンド・リファレンスを参照してください。

  • CreateApiKey操作を実行して、APIキーを作成します。表示名、オプションの説明、および有効期限タイムスタンプ(UTC)を含むすべてのキー名を指定します。

3.APIキーへの権限の追加

APIキーOCIDの検索

権限を特定のAPIキーにスコープ指定するには、そのOCIDが必要です。

コンソールで:

  1. 「APIキー」リスト・ページに移動します。
  2. 作成したAPIキーを選択します。
  3. OCIDをコピーします(通常はocid1.generativeaiapikey...で始まります)

APIキーへの権限の付与

APIキーによるレスポンスAPIの呼出しを許可するIAMポリシーを作成します:

allow group <your-group-name> 
to manage generative-ai-response in tenancy where ALL 
{request.principal.type='generativeaiapikey', 
request.principal.id='<your-api-key-OCID>'}

このポリシーにより、指定されたAPIキーで認証されたリクエストがレスポンスAPIにアクセスできるようになり、アクセスの有効範囲と制御が維持されます。

4.OCI Responses APIのコール

OCI Responses APIは、OCI Generative AIでエンタープライズAIエージェント・アプリケーションを構築するための主要なインタフェースです。オーケストレーション、推論、ツール、会話の状態などのコア機能を1つのリクエストにまとめるための柔軟な方法を提供します。

このAPIを使用すると、次のことができます。

  • シンプルな単一ステップの推論を実行するか、マルチステップのエージェント・ワークフローを構築します。
  • ユース・ケースに応じて推論を有効または無効にします
  • 統合ツール(プラットフォーム管理またはクライアント側)
  • サービス内またはクライアント内の会話状態の管理

この統一されたアプローチにより、コスト、レイテンシおよび動作を管理しながら、より高度なエージェントをシンプルかつ段階的に構築できます。

ベースURL 🔗

OCIレスポンスAPIにアクセスするには、次のベースURLを使用します:

https://inference.generativeai.<region>.oci.oraclecloud.com/openai/v1

<region>を適切なリージョン識別子(たとえば、us-chicago-1)に置き換えます。

SDKのサポート🔗

OCIレスポンスAPIは、サービスとの対話に推奨されるOpenAI SDKと互換性があります。Python、Java、TypeScript、Go、.NETなど、多くの言語でサポートされています。

また、LangChain、LlamaIndex、OpenAI Agents SDKなどの一般的なエージェント・フレームワークでも使用できます。

公式のOpenAI SDK (Python)のインストール

Python

pip install openai
ノート

レスポンスAPIを起動するには、OCI SDKではなく、OpenAI SDKを使用していることを確認してください。また、OpenAI SDKの最新バージョンがインストールされていることを確認します。

その他の言語については、OpenAIライブラリ・ページを参照してください。

最初のリクエストの作成🔗

次の例では、Pythonを使用してResponses APIをコールする方法を示します。

from openai import OpenAI

client = OpenAI(
    base_url="https://inference.generativeai.us-chicago-1.oci.oraclecloud.com/openai/v1", # change the region if needed
    api_key="sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", # replace with your Generative AI API Key created in Step 2
    project="ocid1.generativeaiproject.oc1.us-chicago-1.xxxxxxxx"  # replace with your Generative AI Project OCID created in Step 1
)

response = client.responses.create(
    model="xai.grok-4-1-fast-reasoning",
    input="Write a one-sentence explanation of what a database is."
)

print(response.output_text)

レスポンスが説明を返す場合、OCIレスポンスAPIは正しく動作しています。

OCIレスポンスAPIエンドポイントの理解

OCI Responses APIはOpenAI互換インタフェースを使用しますが、すべてのリクエストはOCI Generative AI推論エンドポイントを介してルーティングされます。

https://inference.generativeai.<region>.oci.oraclecloud.com/openai/v1

つまり、使い慣れたOpenAIスタイルのAPI (/responses/containersなど)を使用でき、すべてのリクエストはOCI内で実行されます。

APIはOpenAI形式に従いますが、OCIと完全に統合されています。

  • 認証では、OpenAI資格情報ではなく、OCI生成AI APIキーまたはIAMベースのアクセスを使用します
  • リソース(コンテナ、ベクトル・ストア、ファイルなど)は、OpenAI環境ではなくOCI内で作成および管理されます
  • 実行とデータ処理は完全にOCI内にとどまる

たとえば、次のようにコールするとします。

/openai/v1/containers

コンテナは、OCI Generative AIで作成および管理されます。

リストされている次のエンドポイントのみがサポートされます。他のOpenAIエンドポイントは、OCI生成AIと互換性がありません。

このクイックスタートの残りの部分では、これらのエンドポイントの使用方法の例を示します。

使用可能なエンドポイント

API ベースURL 認証 エンドポイント・パス
レスポンスAPI https://inference.generativeai.${region}.oci.oraclecloud.com APIキーまたはIAMセッション /openai/v1/responses
会話API https://inference.generativeai.${region}.oci.oraclecloud.com APIキーまたはIAMセッション /openai/v1/conversations
ファイルAPI https://inference.generativeai.${region}.oci.oraclecloud.com APIキーまたはIAMセッション /openai/v1/files
ベクトル・ストア・ファイルAPI https://inference.generativeai.${region}.oci.oraclecloud.com APIキーまたはIAMセッション /openai/v1/vector_stores/{id}/files
ベクトル・ストア検索 https://inference.generativeai.${region}.oci.oraclecloud.com APIキーまたはIAMセッション /openai/v1/vector_stores/{id}/search
コンテナAPI https://inference.generativeai.${region}.oci.oraclecloud.com APIキーまたはIAMセッション /openai/v1/containers
プロジェクトCRUD https://generativeai.${region}.oci.oraclecloud.com IAMセッションのみ /20231130/generativeAiProjects
APIキーCRUD https://generativeai.${region}.oci.oraclecloud.com IAMセッションのみ /20231130/apikeys
セマンティック・ストアCRUD https://generativeai.${region}.oci.oraclecloud.com IAMセッションのみ /20231130/semanticStores
ベクトル・ストアCRUD https://generativeai.${region}.oci.oraclecloud.com IAMセッションのみ /20231130/openai/v1/vector_stores

OCI IAM認証

前のステップでは、生成AI APIキーを使用して、OCIレスポンスAPIへのリクエストを認証しました。APIキーは、迅速なテストと早期開発に便利なオプションです。ただし、本番ワークロードの場合、多くのチームは、セキュリティの向上とアクセス制御の一元化のためにOCI IAMベースの認証を好みます。

OCI Responses APIは、OCI IAM認証を完全にサポートしています。この項では、APIキーのかわりにIAMベースの認証を使用する方法について説明します。

IAM認証を使用する場合

次の場合は、IAM認証の使用を検討してください:

  • OCIサービスでのアプリケーションの実行(FunctionsやOKEなど)
  • APIキーなどの長期間の資格証明の回避
  • IAMポリシーによるファイングレイン・アクセス・コントロールの強制

OCI IAM認証ライブラリのインストール

OCI IAM認証をOpenAI SDKと統合するためのヘルパー・ユーティリティを提供するoci-genai-authライブラリをインストールします:

pip install oci-genai-auth

このライブラリには、次の認証ヘルパーが含まれています。

  • OciSessionAuth (ローカル開発用)
  • OciUserPrincipalAuth
  • OciInstancePrincipalAuth
  • OciResourcePrincipalAuth (OCI管理環境の場合)

OpenAIクライアントの構成

IAM認証を使用する場合は、カスタムHTTPクライアントおよび認証ハンドラを使用してOpenAIクライアントを初期化します。この場合、api_key値は"not used"です。

例: ローカル開発(OciSessionAuth)

このアプローチは、コードをローカルで実行する場合(たとえば、OCI CLIプロファイルを使用するラップトップの場合)に使用します。

from openai import OpenAI
from oci_openai import OciSessionAuth
import httpx

client = OpenAI(
    base_url="https://inference.generativeai.us-chicago-1.oci.oraclecloud.com/openai/v1",  # update region if needed
    api_key="not-used",
    project="ocid1.generativeaiproject.oc1.us-chicago-1.xxxxxxxx",  # project OCID created earlier
    http_client=httpx.Client(auth=OciSessionAuth(profile_name="DEFAULT"))  # update profile if needed
)

response = client.responses.create(
    model="xai.grok-4-1-fast-reasoning",
    input="Write a one-sentence explanation of what a database is."
)

print(response.output_text)

例: OCI管理対象環境(OciResourcePrincipalAuth)

OCI FunctionsOCI Container Engine for Kubernetes (OKE)などのOCIサービスで実行する場合は、このアプローチを使用します:

from openai import OpenAI
from oci_openai import OciResourcePrincipalAuth
import httpx

client = OpenAI(
    base_url="https://inference.generativeai.us-chicago-1.oci.oraclecloud.com/openai/v1",  # update region if needed
    api_key="not-used",
    project="ocid1.generativeaiproject.oc1.us-chicago-1.xxxxxxxx",  # project OCID created earlier
    http_client=httpx.Client(auth=OciResourcePrincipalAuth()),
)

OCI IAM認証を使用すると、アプリケーションはAPIキーを管理せずにOCI生成AIに安全にアクセスでき、標準のOCIセキュリティ・プラクティスに準拠できます。

必要な権限を確認

OCIレスポンスAPIをコールする前に、適切なIAMポリシーが適用されていることを確認します。必要なポリシーは、使用される認証方法によって異なります。

OCI IAM認証を使用する場合

「前提条件: IAM権限の設定」でポリシーを追加した場合は、このステップをスキップします。

ユーザー・グループがレスポンスAPIをコールできるようにするには、次のポリシーを追加します:

allow group <your-group-name> 
to manage generative-ai-response in tenancy

生成AI APIキー認証を使用する場合

APIキー認証を使用する場合は、APIキーを使用して行われたリクエストを認可するために別のポリシーが必要です。If you added the policies in 3. Add Permission to the API Key, skip this step.

特定のAPIキーへのアクセス権を付与するには:

allow group <your-group-name> 
to manage generative-ai-response in tenancy 
where ALL {request.principal.type='generativeaiapikey', 
request.principal.id='<your-api-key-OCID>'}

より広範なアクセス(テスト中など)には、より一般的なポリシーを使用できます。

allow any-user 
to manage generative-ai-family in tenancy 
where ALL {request.principal.type='generativeaiapikey', 
request.principal.id='<your-api-key-OCID>'}

これらのポリシーにより、IAMを介して認証されたリクエストでもAPIキーを使用して認証されたリクエストでも、OCI生成AIリソースにアクセスする権限が確保されます。

デバッグ・ログの有効化

APIのコール時に問題が発生した場合は、デバッグ・ロギングを有効にすると、トラブルシューティングに役立ちます。デバッグ・ログには、RAW HTTPリクエストおよびレスポンス(opc-request-idなど)が表示されます。これは、Oracleサポートの使用時に役立ちます。

問題をレポートする際にこのリクエストIDを参照して、問題をより迅速に識別および診断できます。

from openai import OpenAI
import logging

logger = logging.getLogger("openai")
logger.setLevel(logging.DEBUG)
logger.addHandler(logging.StreamHandler())

# Create and use the OpenAI client as usual
client = OpenAI(
    ...
)

コール・モデル

OCI Responses APIを使用して、OCI Generative AIでサポートされているリージョンで使用可能な様々なタイプのモデルをコールできます。サポートされているモデルおよびリージョンのリストは、エージェント・モデルおよびリージョンを参照してください。

サード・パーティのホスト・モデル

OCI Generative AIは、サードパーティ・プロバイダーからモデルへのアクセスを提供します。完全修飾名を使用してモデルを指定します。

response = client.responses.create(
    model="xai.grok-4-1-fast-reasoning",
    input="Write a one-sentence explanation of what a database is."
)

response = client.responses.create(
    model="google.gemini-2.5-pro",
    input="Write a one-sentence explanation of what a database is."
)

オンデマンド・モデル

オンデマンド・モデルはOCIによってホストおよび管理され、専用のインフラストラクチャを必要とせずに利用できます。

response = client.responses.create(
    model="openai.gpt-oss-120b",
    input="Write a one-sentence explanation of what a database is."
)

専用AIクラスタ(専用モード)

分離または予測可能なパフォーマンスを必要とする本番ワークロードの場合、専用AIクラスタにモデルをデプロイできます。この場合、クラスタ・エンドポイントOCIDをモデル識別子として使用します。

response = client.responses.create(
    model="<dedicated-ai-cluster-endpoint-ocid>",
    input="Write a one-sentence explanation of what a database is."
)

この柔軟性により、パフォーマンス、コストおよび制御の要件に最も適したデプロイメント・モデルを選択できます。

ストリーム応答

OCIレスポンスAPIはストリーミングをサポートしているため、生成時にモデル出力を段階的に受信できます。これにより、応答性が向上し、出力が長くなります。

すべてのイベントのストリーム

response_stream = client.responses.create(
    model="openai.gpt-oss-120b",
    input="Explain the difference between structured and unstructured data.",
    stream=True
)

for event in response_stream:
    print(event)

ストリームのみのテキスト出力(デルタ・トークン)

response_stream = client.responses.create(
    model="openai.gpt-oss-120b",
    input="Explain the difference between structured and unstructured data.",
    stream=True
)

for event in response_stream:
    if event.type == "response.output_text.delta":
        print(event.delta, end="", flush=True)

ストリーミングは、ユーザーへのレスポンスを生成時に表示したい対話型アプリケーションに特に役立ちます。

構造化出力

n個のユースケースでは、モデルがフリーフォームテキストではなく構造化された形式で応答を返すようにしたい場合があります。OCIレスポンスAPIでは、スキーマを定義し、モデル出力を強く型指定されたオブジェクトに解析できるようにすることで、これをサポートしています。

このアプローチは、ダウンストリーム・システムとの統合、一貫性の強制、または自然言語入力から特定のフィールドの抽出を行う場合に役立ちます。

from pydantic import BaseModel

class CalendarEvent(BaseModel):
    name: str
    date: str
    participants: list[str]


response = client.responses.parse(
    model="openai.gpt-oss-120b",
    input=[
        {"role": "system", "content": "Extract the event details."},
        {
            "role": "user",
            "content": "The team meeting is scheduled for Monday with Sarah, John, and Priya.",
        },
    ],
    store=False,
    text_format=CalendarEvent,
)

event = response.output_parsed
print(event)

APIコールのトレース

OCIレスポンスAPIをコールすると、レスポンスにoutputフィールドが含まれます。このフィールドは、リクエスト中に発生した内容を説明するアイテムの配列です。

各項目は、実行のステップを表し、次のような様々なタイプを含めることができます。

  • message
  • web_search_call
  • file_search_call
  • mcp_call
  • mcp_list_tools

これらの出力アイテムにより、リクエストの処理方法が可視化されます。これらを使用して、次のことができます。

  • モデル動作のデバッグと理解
  • ユーザー・インタフェースでの実行ステップの表示
  • カスタムの可観測性またはロギング・ワークフローの構築

Observability Toolsとの統合🔗

レイテンシ、コスト、実行トレースなどのより深いインサイトを得るには、OCI Responses APIを可観測性プラットフォームと統合します。

多くのプロバイダがOpenAI互換APIをサポートしています。そのようなオプションの1つに、Langfuseがあります。これは、開発者がLLMアプリケーションをデバッグ、監視、改善するのに役立つオープンソースのLLMエンジニアリング・プラットフォームです。エージェント・アクションのトレース、プロンプト・バージョニングのサポート、およびモデル出力の評価に役立つエンドツーエンドの可観測性を提供します。Langfuseは、OpenAI、LangChain、LlamaIndexなどの一般的なフレームワークと統合されています。

次の例は、Langfuseを使用してResponses APIコールをトレースおよびモニターする方法を示しています。

ステップ1: Langfuse SDKをインストールする

pip install langfuse

ステップ2: 環境変数の構成

必要なLangfuseおよびOCI環境変数を設定します。

LANGFUSE_SECRET_KEY="sk-lf-xxxxxxxxx"
LANGFUSE_PUBLIC_KEY="pk-lf-xxxxxxxxx"
LANGFUSE_BASE_URL="https://us.cloud.langfuse.com"

# OCI Generative AI credentials
OCI_GENAI_API_KEY="sk-xxxxxxxxx"
OCI_GENAI_PROJECT_ID="ocid1.generativeaiproject.oc1.xxx"

ステップ3: OpenAIクライアントに計測機構を組み込む

Langfuse SDKからOpenAIクライアントをインポートします。既存のコードは変更されませんが、リクエストは自動的にトレースされます。

import os
from langfuse.openai import OpenAI  # Import from Langfuse

client = OpenAI(
    base_url="https://inference.generativeai.us-ashburn-1.oci.oraclecloud.com/openai/v1",
    api_key=os.getenv("OCI_GENAI_API_KEY"),
    project=os.getenv("OCI_GENAI_PROJECT_ID"),
)

# Requests are automatically instrumented by Langfuse
response = client.responses.create(
    model="openai.gpt-oss-120b",
    tools=[
        {
            "type": "mcp",
            "server_label": "dmcp",
            "server_url": "https://mcp.deepwiki.com/mcp",
            "require_approval": "never",
        },
    ],
    input="Explain why tracing and observability are important in distributed systems."
)

print(response.output_text)

この統合により、アプリケーション・コードに大幅な変更を行うことなく、APIコールをエンドツーエンドで可視化できます。

マルチモーダル入力

OCIレスポンスAPIは、マルチモーダル入力を受け入れるモデルをサポートしています。テキストをイメージ、ファイル、推論コントロールと組み合せて、ドキュメント分析、イメージの理解、より慎重なモデル・レスポンスなどのより豊富なワークフローをサポートできます。

Base64でエンコードされたデータURLとしてのイメージ入力

import base64

def encode_image(image_path):
    with open(image_path, "rb") as image_file:
        return base64.b64encode(image_file.read()).decode("utf-8")

base64_image = encode_image("/path/to/image.png")

response = client.responses.create(
    model="openai.gpt-oss-120b",
    input=[
        {
            "role": "user",
            "content": [
                {"type": "input_text", "text": "Describe the main objects in this image."},
                {
                    "type": "input_image",
                    "image_url": f"data:image/jpeg;base64,{base64_image}",
                    "detail": "high",
                },
            ],
        }
    ],
)

print(response.output_text)

インターネット・アクセス可能なURLとしてのイメージ入力

response = client.responses.create(
    model="openai.gpt-oss-120b",
    store=False,
    input=[
        {
            "role": "user",
            "content": [
                {"type": "input_text", "text": "Describe the scene shown in this image."},
                {
                    "type": "input_image",
                    "image_url": "https://example.photos/id/123",
                },
            ],
        }
    ],
)

print(response.output_text)

"image_url"を有効なイメージURLに置き換えます。

ファイルIDとして入力

重要

入力機能としてのファイルIDは、Google Geminiモデルでのみサポートされています。リクエストごとに、アップロードされたすべてのPDFファイルの合計サイズが50MB未満である必要があり、リクエストで最大10個のファイルIDを指定できます。サポートされているGeminiモデルを参照してください。
file = client.files.create(
    file=open("<path-to-file>", "rb"),
    purpose="user_data"
)

response = client.responses.create(
    model="google.gemini-2.5-pro",
    input=[
        {
            "role": "user",
            "content": [
                {
                    "type": "input_file",
                    "file_id": file.id,
                },
                {
                    "type": "input_text",
                    "text": "Summarize this document.",
                },
            ]
        }
    ]
)

print(response.output_text)

ファイル入力(インターネット・アクセス可能なURL)

response = client.responses.create(
    model="google.gemini-2.5-flash",
    input=[
        {
            "role": "user",
            "content": [
                {"type": "input_text", "text": "Summarize this file."},
                {
                    "type": "input_file",
                    "file_url": "https://www.example.com/letters/example-letter.pdf",
                },
            ],
        }
    ],
)

print(response.output_text)

推論

推論コントロールを使用すると、応答を生成する前にモデルが使用する労力を調整できます。これは、速度、深さ、または両方のバランスに優先順位を付ける場合に役立ちます。

推論の取り組み

import json

response = client.responses.create(
    model="openai.gpt-oss-120b",
    input="Solve 18 * (4 + 2).",
    reasoning={"effort": "medium"},
    store=False,
)

print(response.output_text)

理由要約出力

チャットボットを構築している場合、推論サマリーを有効にすると、モデルがどのように結果に達したかをユーザーがよりよく理解するのに役立ちます。ストリーミング中は、モデルの思考中に推論トークンを表示することもできます。

import json

response = client.responses.create(
    model="openai.gpt-oss-120b",
    input="Solve 18 * (4 + 2).",
    reasoning={"summary": "auto"},
    store=False,
)

print(response.output_text)

機能ツール

関数ツールを使用すると、モデルはレスポンス・フロー中にクライアント・アプリケーションからデータまたはアクションをリクエストできます。これは、カレンダ・データ、内部アプリケーションの状態、カスタム操作の結果など、プロンプト自体の外部に存在する情報をモデルで必要とする場合に便利です。

このパターンでは、モデルは関数を直接実行しません。かわりに、関数を使用する必要があることを示し、クライアント・アプリケーションがその作業を実行してから、モデルを続行してユーザー対応の回答を生成できるように、アプリケーションが結果を返送します。

有効にする内容

関数ツールは、アプリケーションが実行の制御を維持しながら、モデルが外部情報が必要なタイミングを決定できる場合に役立ちます。

一般的なユース ケースには、次のものがあります。

  • カレンダ・イベントの検索
  • アプリケーション・データの取得中
  • 内部または外部APIの呼出し
  • ビジネス・ロジックまたは計算の実行

この方法では、アプリケーション内で実行パスを保持しながら柔軟性を確保できます。

実行フロー 🔗

一般的な関数ツールの相互作用は次のように機能します。

  1. クライアントは、1つ以上のツール定義を含むリクエストを送信します。
  2. モデルは、これらのツールのいずれかが必要かどうかを判断します。
  3. ツールが必要な場合、モデルはツール名と引数を返します。
  4. アプリケーションによってツールが実行され、結果が準備されます。
  5. アプリケーションは、その結果をフォローアップ・リクエストで返送します。
  6. モデルは、その結果を使用して応答を完了します。

状態処理オプション 🔗

これらのリクエスト間で状態を管理するには、次の2つの一般的な方法があります。

  • サービス管理状態: ほとんどのユース・ケースで推奨されます。フォローアップ・リクエストにはprevious_response_idが含まれ、サービスは以前の交換を追跡します。
  • クライアント管理状態: アプリケーションは相互作用履歴全体を保持し、蓄積されたコンテキストを各リクエストに送信します。
ヒント

ツール定義を正確に保ちます。明確な名前、正確な説明、および明確に定義されたパラメータは、モデルが適切なツールを選択し、使用可能な引数を生成するのに役立ちます。

関数ツールの定義

次の例では、指定した日付のカレンダ・イベントを取得するツールを定義します。

tools = [
    {
        "type": "function",
        "name": "get_calendar_events",
        "description": "Return calendar events scheduled for a specific date.",
        "parameters": {
            "type": "object",
            "properties": {
                "date": {
                    "type": "string",
                    "description": "Date to query, for example 2026-04-02"
                }
            },
            "required": ["date"],
        },
    },
]

このtools配列をclient.responses.create()リクエストに含めます。

例: サービス管理状態

このパターンでは、最初の要求により、モデルがツールが必要かどうかを判断できます。2番目のリクエストは、ツールの結果を返送し、以前のレスポンスを参照します。

import json

tools = [
    {
        "type": "function",
        "name": "get_calendar_events",
        "description": "Return calendar events scheduled for a specific date.",
        "parameters": {
            "type": "object",
            "properties": {
                "date": {
                    "type": "string",
                    "description": "Date to query, for example 2026-04-02"
                }
            },
            "required": ["date"],
        },
    },
]

def get_calendar_events(date):
    # Replace this with actual calendar logic or an API call
    return [
        {"time": "09:00", "title": "Team standup"},
        {"time": "13:00", "title": "Design review"},
        {"time": "16:00", "title": "Project check-in"},
    ]

# Initial request
response = client.responses.create(
    model="openai.gpt-oss-120b",
    tools=tools,
    input="Show the calendar events for 2026-04-02.",
)

# Execute the requested function
tool_outputs = []
for item in response.output:
    if item.type == "function_call" and item.name == "get_calendar_events":
        args = json.loads(item.arguments)
        events = get_calendar_events(**args)
        tool_outputs.append({
            "type": "function_call_output",
            "call_id": item.call_id,
            "output": json.dumps({"events": events}),
        })

# Follow-up request
final = client.responses.create(
    model="openai.gpt-oss-120b",
    instructions="Summarize the schedule clearly for the user.",
    tools=tools,
    input=tool_outputs,
    previous_response_id=response.id,
)

print(final.output_text)

例: サービス管理状態

このパターンでは、アプリケーションは完全な交換を保持し、フォローアップ・リクエストで再送信します。

import json

tools = [
    {
        "type": "function",
        "name": "get_calendar_events",
        "description": "Return calendar events scheduled for a specific date.",
        "parameters": {
            "type": "object",
            "properties": {
                "date": {
                    "type": "string",
                    "description": "Date to query, for example 2026-04-02"
                }
            },
            "required": ["date"],
        },
    },
]

def get_calendar_events(date):
    # Replace this with actual calendar logic or an API call
    return [
        {"time": "09:00", "title": "Team standup"},
        {"time": "13:00", "title": "Design review"},
        {"time": "16:00", "title": "Project check-in"},
    ]

conversation = [
    {"role": "user", "content": "Show the calendar events for 2026-04-02."}
]

response = client.responses.create(
    model="openai.gpt-oss-120b",
    tools=tools,
    input=conversation,
)

conversation += response.output

for item in response.output:
    if item.type == "function_call" and item.name == "get_calendar_events":
        args = json.loads(item.arguments)
        events = get_calendar_events(**args)
        conversation.append({
            "type": "function_call_output",
            "call_id": item.call_id,
            "output": json.dumps({"events": events}),
        })

final = client.responses.create(
    model="openai.gpt-oss-120b",
    instructions="Summarize the schedule clearly for the user.",
    tools=tools,
    input=conversation,
)

print(final.output_text)

ファンクション・ツールは、アプリケーションが実行、アクセス制御および統合ロジックを担当し、モデルが必要とする情報を要求できる強力なオプションです。

MCPツール

MCPツールを使用すると、モデルは要求中にリモートMCPサーバーによって公開される機能を使用できます。これらの機能には、外部サービス、データ・ソースまたはアプリケーション・エンドポイントへのアクセスを含めることができます。

OCI Generative AIでは、この機能はリモートMCPコールを介して使用でき、これにより、サービスはモデル・ワークフローの一部としてMCPサーバーと対話できます。

MCPツールを使用するタイミング

MCPツールは、モデルがMCPサーバーでホストされている外部機能にアクセスする必要がある場合に使用します。

この方法は、次の場合に役立ちます。

  • MCPサーバーと直接通信するサービス
  • クライアント側のオーケストレーション・ステップの削減
  • クライアントが実行するツール・パターンより短いレイテンシ
  • リモートMCPサーバーを介して公開される機能へのアクセス

MCPツールは、OCI Generative AIツールセットの一部であり、サポートされている他のツールと一緒に使用できます。

輸送サポート

リモートMCP呼び出しでは、Streamable HTTPが使用されます。

MCPツールの定義

リクエストのtoolsフィールドにMCPサーバー定義を追加します。

response_stream = client.responses.create(
    model="xai.grok-code-fast-1",
    tools=[
        {
            "type": "mcp",
            "server_label": "calendar",
            "server_description": "An MCP server that retrieves calendar events for a specified date.",
            "server_url": "https://example.com/mcp",
            "require_approval": "never",
        },
    ],
    input="What events are scheduled for 2026-04-02?",
    stream=True,
)

for event in response_stream:
    if event.type == "response.output_text.delta":
        print(event.delta, end="", flush=True)

この例では、レスポンスをストリーミングし、生成されたテキストを出力します。

MCPサーバーが公開するツールを制限する

リモートMCPサーバーがアプリケーションの必要以上のツールを公開する場合は、allowed_toolsを使用して使用可能なセットを絞り込むことができます。

response_stream = client.responses.create(
    model="openai.gpt-oss-120b",
    tools=[
        {
            "type": "mcp",
            "server_label": "calendar",
            "server_description": "An MCP server that retrieves calendar events for a specified date.",
            "server_url": "https://example.com/mcp",
            "require_approval": "never",
            "allowed_tools": ["get_events"],
        },
    ],
    input="Show the calendar events for 2026-02-02.",
    stream=True,
    store=False,
)

MCPサーバーへの認証を提供する

リモートMCPサーバーに認証が必要な場合は、authorizationフィールドにアクセス・トークンを渡します。
response_stream = client.responses.create(
    model="xai.grok-4-1-fast-reasoning",
    tools=[
        {
            "type": "mcp",
            "server_label": "calendar",
            "server_url": "https://calendar.example.com/mcp",
            "authorization": "$CALENDAR_OAUTH_ACCESS_TOKEN"
        },
    ],
    input="List my meetings for 2026-02-02.",
    stream=True,
    store=False,
)

トークン値のみを渡します。Bearer接頭辞は含めないでください。OCIは、リクエストの一部としてTLS経由でトークンを送信し、デコード、検査、格納またはログに記録しません。

MCPサーバー・ホスティング

OCI Generative AIは、MCPサーバーの導入と拡張に役立つMCPサーバーのホスティングも提供します。

MCPツールは、リクエストの実行中にOCI生成AIがリモートMCPサーバーと直接連携し、クライアント・アプリケーションで各ツール・ステップ自体を処理する必要がない場合に適しています。

コードインタプリタ

コード・インタプリタを使用すると、モデルはセキュアなコンテナでPythonコードを記述して実行できます。これは、計算、データ分析、ファイル処理などのタスクに役立ちます。

プロンプトでは、コード・インタプリタ・ツールをpythonツールとしてコールできます。例: pythonツールを使用して問題を解決します。

コードは外部ネットワーク・アクセスのない分離された環境で実行されるため、制御された設定で計算またはファイル処理を必要とするタスクに適しています。

使用目的

これを初めて使用する場合、Code Interpreterをモデルの一時的なPythonワークスペースと考えるのに役立ちます。

これは、次のようなタスクに使用できます。

  • 数学の問題の解決
  • アップロードされたファイルの分析
  • データのクリーニングまたは変換
  • チャートまたは表の作成
  • ログや処理されたデータセットなどの出力ファイルの生成

実行環境

Python環境には420を超えるプリインストール・ライブラリが含まれているため、多くの一般的なタスクは追加の設定なしで機能します。

コードはコンテナ内で実行されます。このコンテナは、Pythonが実行される作業環境であり、セッション中にファイルが格納される場所です。

コンテナ・メモリー制限

コード・インタプリタ・コンテナは、テナンシ当たり64 GBの共有メモリー・プールを使用します。

サポートされているコンテナ・サイズは、次のとおりです。

  • 1 GB
  • 4 GB
  • 16 GB
  • 64 GB

この共有制限は、複数のコンテナに分割できます。たとえば、次のものをサポートできます。

  • 64個の1 GBコンテナ
  • 16個の4 GBコンテナ
  • 4つの16 GBコンテナ
  • 1つの64 GBコンテナ

容量を増やす必要がある場合は、サービス・リクエストを送信できます。

コンテナ失効

コンテナは、20分間非アクティブ後に期限切れになります。

これは、マルチステップ・フローを構築するタイミングを知ることが重要です。

  • 期限切れのコンテナは再利用できません
  • 新しいコンテナを作成する必要があります。
  • ファイルは必要に応じて再度アップロードする必要があります
  • Python変数などのインメモリー状態は失われます

そのため、コンテナを一時的な作業環境として扱うのが最善です。

response = client.responses.create(
    model="xai.grok-4-1-fast-reasoning",
    tools=[
        {
            "type": "code_interpreter",
            "container": {"type": "auto"}
        }
    ],
    instructions="Use the python tool to solve the problem and explain the result.",
    input="Find the value of (18 / 3) + 7 * 2."
)

print(response.output_text)

コード・インタプリタのコンテナ

コード・インタプリタにはコンテナが必要です。コンテナは、モデルがPythonコードを実行する分離された環境です。

コンテナは次のものを保持できます。

  • アップロードされたファイル
  • モデルによって作成されたファイル
  • 実行中の一時作業データ

コード・インタプリタを使用する場合は、次の2つのコンテナ・モードのいずれかを割り当てることができます。

  • 自動: OCI Generative AIはコンテナを作成し、コンテナ・サイズを自動的に割り当てます。
  • conatiner OCID: コンテナを自分で作成し、コンテナ・サイズを定義してOCIDを指定します。

どちらのオプションでも、コンテナはOCI生成AIで作成および管理されます。これらのコンテナで実行されるコードは、OCI生成AIテナンシでも実行されます。

自動モード

自動モードでは、サービスによってコンテナが作成されます。これは最も簡単なオプションであり、ほとんどのユーザーにとって良い出発点です。

自動モードは次の場合に使用します。

  • OCI Generative AIでコンテナを管理したい
  • 環境を直接制御する必要はありません。
  • より簡単な設定が必要
response = client.responses.create(
    model="xai.grok-code-fast-1",
    tools=[{
        "type": "code_interpreter",
        "container": {
            "type": "auto"
        }
    }],
    input="Use the python tool to calculate the average of 12, 18, 24, and 30."
)

明示的モード

明示モードでは、最初にコンテナを作成し、サイズを設定します。次に、リクエストでコンテナIDを渡します。

メモリー・サイズなどのコンテナの詳細をより詳細に制御する場合は、明示モードを使用します。

container = client.containers.create(name="test-container", memory_limit="4g")

response = client.responses.create(
    model="xai.grok-code-fast-1",
    tools=[{
        "type": "code_interpreter",
        "container": container.id
    }],
    tool_choice="required",
    input="Use the python tool to calculate the average of 12, 18, 24, and 30."
)

print(response.output_text)

コード・インタプリタ内のファイル

コード・インタプリタは、コンテナの存続期間中にファイルを操作できます。モデルは、指定したファイルを読み取ることができ、新しいファイルを作成することもできます。

これは、次のようなワークフローに役立ちます。

  • CSVまたはPDFの読取り
  • チャートの生成
  • 処理された出力の保存
  • ログまたはレポートの作成

ファイルの永続性 🔗

pythonツールによって作成または変更されたファイルは、コンテナが期限切れになっていないかぎり、同じコンテナ内に保持されます。

これは、モデルが同じセッションで以前の作業に基づいて構築できることを意味します。たとえば、次のことが可能です。

  1. ファイルの読み取り
  2. 解析する
  3. チャートの保存
  4. このチャートを同じコンテナで後で使用します

コンテナが期限切れになると、その状態は使用できなくなります。

ファイルのアップロードおよび管理 🔗

コンテナ・ファイルAPIを使用してコンテナ・ファイルを管理できます。

一般的な操作は次のとおりです。

  • コンテナ・ファイルの作成: コンテナにファイルを追加します
  • コンテナ・ファイルのリスト: コンテナ内のファイルを表示します。
  • コンテナ・ファイルの削除: ファイルの削除
  • コンテナ・ファイル・コンテンツの取得: コンテナからファイルをダウンロードします

これにより、コンテナをモデルドリブン・コード実行の一時ワークスペースとして使用できます。

出力ファイルおよび引用🔗

モデルでファイルが作成されると、それらのファイルはコンテナに格納され、レスポンスで参照できます。

次の参照が含まれます。

  • container_id
  • file_id
  • filename

これらの値を使用して、生成されたファイルの内容を取得できます。

OCIレスポンスAPIは、レスポンス、ファイル、コンテナ、コンテナ・ファイルなどの機能に対してOpenAI互換のエンドポイントをサポートします。このため、関連するOpenAIドキュメントは、リクエスト構造、レスポンス形式および一般的なワークフローの参照として使用できます。ただし、これらのAPIをOCIで使用する場合は、リクエストをOCI Generative AI推論エンドポイントに送信し、OCI認証を使用して、リソースと実行はOpenAIテナンシではなくOCI Generative AIに残っていることに注意してください。

ノート

OCIレスポンスAPIは、レスポンス、ファイル、コンテナ、コンテナ・ファイルなどの機能に対してOpenAI互換のエンドポイントをサポートします。このため、関連するOpenAIドキュメントは、リクエスト構造、レスポンス形式および一般的なワークフローの参照として使用できます。ただし、これらのAPIをOCIで使用する場合は、OCI生成AI推論エンドポイントにリクエストを送信し、OCI認証を使用し、リソースおよび実行はOpenAIテナンシではなくOCI生成AIに残ります。ベースURLおよびサポートされているエンドポイントについては、使用可能なエンドポイントを参照してください。

OpenAI参照

NL2SQLツール

NL2SQLツールは、エンタープライズAIエージェントが自然言語を検証されたSQLに変換するのに役立ちます。これは、基礎となるデータを移動または複製せずに、フェデレーテッド・エンタープライズ・データを問い合せるために設計されています。

NL2SQLは、セマンティック・エンリッチメント・レイヤーを介して、ビジネス言語をデータベース・フィールド、表および結合にマップします。ツールはSQLのみを生成します。問合せ自体は実行されません。

問合せの実行は、DBTools MCPサーバーによって個別に処理されます。このサーバーは、NL2SQLサービスをコールしてSQLを生成し、エンド・ユーザーのアイデンティティと適切なガードレールを使用して、ソース・データベースに対する問合せを承認および実行します。

NL2SQLを使用するには、OCI セマンティック・ストア・リソースを作成します。セマンティック・ストアは、構造化されたデータを含むベクトル・ストアによってバックアップされ、次の2つのDBTools接続が含まれます。

  • エンリッチメントの接続
  • クエリー接続

設定時に、エンリッチメントが実行されるタイミングを選択します。

  • 作成時: エンリッチメントは、セマンティック・ストアの作成後に自動的に開始されます
  • 手動: エンリッチメントは後でAPIコールによってトリガーされます

エンリッチメント・プロセスでは、接続されたデータベースから表や列などのスキーマ・メタデータが読み取られます。そのメタデータは、より正確なSQLを生成するために使用されます。

エンリッチメントの完了後、GenerateSqlFromNl APIをコールして、自然言語入力をSQLに変換できます。

前提条件

NL2SQLツールを使用する前に、まずデータベースを作成し、必要なデータベース接続を構成します。

詳細は、次を参照してください:

セマンティック・ストアの権限

NL2SQLおよびスキーマ対応の問合せに構造化データを使用するには、セマンティック・ストアを作成する前に必要なIAMポリシーを設定します。

シークレットへのアクセス

データベース・ツールで使用されるシークレットを読み取るためのグループ・アクセス権を付与します:

allow group <your-group-name> 
to read secret-family in compartment <your-compartment-name> 
where all {request.principal.type='generativeaisemanticstore'}

データベース・ツール接続へのアクセス

必要なデータベース・ツール・リソースへのグループ・アクセス権を付与します。

allow group <your-group-name> 
to use database-tools-family in compartment <compartment-name> 
where all {request.principal.type='generativeaisemanticstore'}
allow group <your-group-name> 
to read database-family in compartment <compartment-name> 
where all {request.principal.type='generativeaisemanticstore'}
allow group <your-group-name> 
to read autonomous-database-family in compartment <compartment-name> 
where all {request.principal.type='generativeaisemanticstore'}

生成AIリソースへのアクセス

次のより広範なポリシーがすでに適用されている場合は、セマンティック・ストア・リソースへのアクセスが含まれます:

allow group <your-group-name> 
to manage generative-ai-family in tenancy

アクセスを絞り込む場合は、かわりに次のポリシーを使用して、グループにセマンティック・ストアの作成および管理を許可します:

allow group <your-group-name> 
to manage generative-ai-semantic-store 
in compartment <your-compartment-name>

グループで既存のセマンティック・ストアのみを使用し、NL2SQLをコールする必要がある場合は、次のより具体的なポリシーを使用します。

allow group <your-group-name> 
to use generative-ai-semantic-store 
in compartment <your-compartment-name>
allow group <your-group-name> 
to manage generative-ai-nl2sql 
in compartment <your-compartment-name>

セマンティック・ストアの作成

セマンティック・ストアは、データベースを指す構造化データを持つベクトル・ストアです。このタスクでは、Oracle Cloudコンソールを使用して構造化データを含むベクトル・ストアを作成するステップについて説明します。

ヒント

ベクトル・ストアを作成した後は、その詳細を表示し、その更新や削除など、その他のタスクを実行できます。コンソールの「アクション」メニュー(3つのドット)を使用して、これらのタスクにアクセスします。

ベクトル・ストアを作成するには、リスト・ページで「ベクトル・ストアの作成」を選択します。リスト・ページの検索に関するヘルプが必要な場合は、ベクトル・ストアのリストを参照してください。

基本的な情報

  1. ベクトル・ストアの名前を入力します。
    名前は文字またはアンダースコアで開始し、その後に文字、数字、ハイフンまたはアンダースコアが続きます。長さは1 - 255文字です。
  2. (オプション)ベクトル・ストアの説明を入力します。
  3. ベクトル・ストアを作成するコンパートメントを選択します。デフォルト・コンパートメントはリスト・ページと同じですが、作業する権限がある任意のコンパートメントを選択できます。

データソース・タイプ

「構造化データ」を選択します。このオプションは、NL2SQLおよびスキーマ対応問合せ用のセマンティク・ストアを作成します。

構造化データ

  1. 「同期コネクタの構成」で、接続タイプを選択します。

    指定できる値: OCIデータベース・ツール

  2. 「エンリッチメント接続ID」を入力し、「エンリッチメント接続のテスト」を選択してアクセスを検証します。
  3. 「問合せ接続ID」を入力し、「問合せ接続のテスト」を選択してアクセスを確認します。
  4. 「スキーマ」で、NL2SQLおよびスキーマ対応の問合せ用に収集するデータベース・スキーマ名を指定します。

セマンティック・ストアAPI

セマンティック・ストアは、次のAPIを使用して管理できます。

  • ChangeSemanticStoreCompartment
  • CreateSemanticStore
  • DeleteSemanticStore
  • GetSemanticStore
  • UpdateSemanticStore
  • ListSemanticStores

エンリッチメント・ジョブ管理では、次のAPIも使用できます。

  • ListEnrichmentJobs
  • GetEnrichmentJob
  • GenerateEnrichmentJob
  • CancelEnrichmentJob

例: Pythonを使用したセマンティック・ストアの作成と管理

import json
import oci
from oci.base_client import BaseClient
from oci.retry import DEFAULT_RETRY_STRATEGY

API_VERSION = "20231130"
HOST = "https://dev.generativeai.us-ashburn-1.oci.oraclecloud.com"
BASE_PATH = f"/{API_VERSION}"


def get_signer_auth_api_key(profile="DEFAULT"):
    config = oci.config.from_file("~/.oci/config", profile)
    signer = oci.signer.Signer(
        tenancy=config["tenancy"],
        user=config["user"],
        fingerprint=config["fingerprint"],
        private_key_file_location=config["key_file"],
        pass_phrase=config.get("pass_phrase"),
    )
    return config, signer


def get_signer_auth_security_token(profile="DEFAULT"):
    config = oci.config.from_file("~/.oci/config", profile)
    signer = oci.auth.signers.SecurityTokenSigner(config)
    return config, signer


def make_base_client(signer):
    return BaseClient(
        service_endpoint=HOST,
        signer=signer,
        retry_strategy=None,
    )


def create_semantic_store(client, body: dict):
    return client.call_api(
        resource_path=f"{BASE_PATH}/semanticStores",
        method="POST",
        header_params={"content-type": "application/json"},
        body=body,
    )


def update_semantic_store(client, semantic_store_id: str, body: dict):
    return client.call_api(
        resource_path=f"{BASE_PATH}/semanticStores/{semantic_store_id}",
        method="PUT",
        header_params={"content-type": "application/json"},
        body=body,
        retry_strategy=DEFAULT_RETRY_STRATEGY,
    )


def get_semantic_store(client, semantic_store_id: str):
    return client.call_api(
        resource_path=f"{BASE_PATH}/semanticStores/{semantic_store_id}",
        method="GET",
        retry_strategy=DEFAULT_RETRY_STRATEGY,
    )


def delete_semantic_store(client, semantic_store_id: str):
    return client.call_api(
        resource_path=f"{BASE_PATH}/semanticStores/{semantic_store_id}",
        method="DELETE",
        retry_strategy=DEFAULT_RETRY_STRATEGY,
    )


if __name__ == "__main__":
    # Choose one authentication method
    # config, signer = get_signer_auth_api_key(profile="DEFAULT")
    config, signer = get_signer_auth_security_token(profile="DEFAULT")

    client = make_base_client(signer)

    create_body = {
        "displayName": "TestSemanticStore",
        "description": "Semantic store for the ADMIN schema",
        "freeformTags": {},
        "definedTags": {},
        "dataSource": {
            "queryingConnectionId": "ocid1.databasetoolsconnection.oc1.xxx",
            "enrichmentConnectionId": "ocid1.databasetoolsconnection.oc1.xxx",
            "connectionType": "DATABASE_TOOLS_CONNECTION",
        },
        "refreshSchedule": {"type": "ON_CREATE"},
        "compartmentId": "ocid1.tenancy.oc1..xxx",
        "schemas": {
            "connectionType": "DATABASE_TOOLS_CONNECTION",
            "schemas": [{"name": "ADMIN"}],
        },
    }

    create_resp = create_semantic_store(client, create_body)
    print("CREATE status:", create_resp.status)

    create_payload = create_resp.data
    if isinstance(create_payload, (bytes, str)):
        create_payload = json.loads(create_payload)

    print("CREATE response:", json.dumps(create_payload, indent=2))

    semantic_store_id = create_payload.get("id") or "<semantic-store-ocid>"

    update_body = {
        "refreshSchedule": {"type": "ON_CREATE"},
        "schemas": {
            "connectionType": "DATABASE_TOOLS_CONNECTION",
            "schemas": [{"name": "ADMIN"}],
        },
    }

    update_resp = update_semantic_store(client, semantic_store_id, update_body)
    print("UPDATE status:", update_resp.status)
    print("UPDATE response:", update_resp.data)

    get_resp = get_semantic_store(client, semantic_store_id)
    print("GET status:", get_resp.status)
    print("GET response:", get_resp.data)

    delete_resp = delete_semantic_store(client, semantic_store_id)
    print("DELETE status:", delete_resp.status)
    print("DELETE response:", delete_resp.data)

例: NL2SQL APIのコール

セマンティック・ストアの準備が完了し、エンリッチメントが完了したら、NL2SQL APIをコールして自然言語からSQLを生成できます。

import json
import oci
from oci.base_client import BaseClient

INFERENCE_BASE_URL = "https://inference.generativeai.<region>.oci.oraclecloud.com"
API_VERSION = "20260325"
SEMANTIC_STORE_ID = "ocid1.generativeaisemanticstore.oc1.xxx"

config = oci.config.from_file("~/.oci/config", "oc1")
signer = oci.auth.signers.SecurityTokenSigner(config)

client = BaseClient(
    service_endpoint=INFERENCE_BASE_URL,
    signer=signer,
    retry_strategy=None,
)

resource_path = (
    f"/{API_VERSION}/semanticStores/{SEMANTIC_STORE_ID}/actions/generateSqlFromNl"
)

body = {
    "displayName": "Generate SQL example",
    "description": "Generate SQL from natural language",
    "inputNaturalLanguageQuery": "Give me last week's order details."
}

resp = client.call_api(
    resource_path=resource_path,
    method="POST",
    header_params={"content-type": "application/json"},
    body=body,
)

print("HTTP status:", resp.status)
print("opc-request-id:", resp.headers.get("opc-request-id"))

data = resp.data
if isinstance(data, (bytes, str)):
    data = json.loads(data)

print(json.dumps(data, indent=2))

複数ターンの会話

OCI Generative AIは、マルチターン・インタラクションをサポートしているため、ユーザーごとにコンテキストを維持するアプリケーションを構築できます。

これを行うには、次の2つの一般的な方法があります。

  • 応答連鎖
  • 会話API

応答連鎖

レスポンス・チェーンでは、新しい各レスポンスは前のレスポンスを指します。これは、会話リソースを明示的に作成せずにコンテキストを繰り越す場合の単純なオプションです。

# first turn
response1 = client.responses.create(
    model="openai.gpt-oss-120b",
    input="Give me three ideas for a team offsite.",
)
print("Response 1:", response1.output_text)

# second turn
response2 = client.responses.create(
    model="openai.gpt-oss-120b",
    input="Make the second idea more budget friendly.",
    previous_response_id=response1.id,
)
print("Response 2:", response2.output_text)

会話API

会話APIでは、最初に会話を作成し、その会話にレスポンスを添付します。これは、ターンをまたいで再利用できる専用の会話オブジェクトが必要な場合に便利です。
# create a conversation
conversation = client.conversations.create(
    metadata={"topic": "demo"}
)
print("Conversation ID:", conversation.id)

# first turn
response1 = client.responses.create(
    model="openai.gpt-oss-120b",
    input="Give me three ideas for a team offsite.",
    conversation=conversation.id,
)
print("Response 1:", response1.output_text)

# second turn
response2 = client.responses.create(
    model="openai.gpt-oss-120b",
    input="Make the second idea more budget friendly.",
    conversation=conversation.id,
)
print("Response 2:", response2.output_text)