クイック・スタート

次のステップを使用して、OCI Responses APIを使用したエンタープライズAIエージェントの構築を開始します。

ヒント

このQuickStartで提供されるステップおよび機能の概要については、このページを縮小したまま、タイトルを確認してください。次に、各セクションを展開して詳細を確認します。

最初の6つのステップでは、レスポンスAPIを使用してモデル・レスポンスを取得するように環境を設定します。ここでは、エージェントを構築するためのその他の機能について説明します。

OCIレスポンスAPIの設定

前提条件

プロジェクトを作成するか、OCIレスポンスAPIをコールする前に、必要なIAM権限が設定されていることを確認してください。

OCI生成AIリソースへのアクセス権の付与

sk管理者は、このQuickStart <QuickStart-compartment-name>に使用されるコンパートメント内のOCI生成AIリソースを管理する権限に属しているユーザー・グループに付与します。

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

この権限により、<QuickStart-compartment-name>にプロジェクト、APIキー、ベクトル・ストアおよびセマンティック・ストアを含むすべての生成AIサービス・リソースを作成できます。

重要

このQuickStartでは、権限にサンドボックス・スタイルの設定を使用します。サンドボックス環境で作業している管理者またはユーザーにのみ、広範なアクセス権を付与することをお薦めします。本番環境では、より限定的なポリシーを適用します。
1. プロジェクトの作成

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

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

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

基本情報

まず、プロジェクトのコア属性を定義します。

  • 名前(オプション):

    文字またはアンダースコアで始まり、その後に文字、数字、ハイフンまたはアンダースコアが続く名前を指定します。長さは1 - 255文字です。名前を指定しない場合は、generativeaiproject<timestamp>という形式(generativeaiproject20260316042443など)を使用して自動的に生成されます。これは後で更新できます。

  • 説明(オプション):

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

  • コンパートメント:

    <QuickStart-compartment-name>コンパートメントを選択します。

データ保持

生成されたデータが格納される期間を構成します。

  • レスポンスの保持:

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

  • 会話の保持:

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

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

短期メモリー圧縮構成

短期的なメモリ圧縮は、最近の会話履歴をコンパクトな表現に要約します。トークンの使用状況とレイテンシを削減しながら、コンテキストを維持するのに役立ちます。

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

    短期的なメモリ圧縮を有効にして、以前のインタラクションを自動的に凝縮します。

  • モデルの選択:

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

    使用可能なモデルについては、短期メモリー(会話履歴)圧縮の場合を参照してください。

重要

  • 圧縮モデルは作成時にのみ選択でき、後でこのオプションを変更することはできません。
  • 有効にすると、プロジェクトを削除せずにこの機能を無効にすることはできません。

長期メモリー構成

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

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

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

  • モデルの選択:

    次のモデルを選択します。

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

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

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

タグ

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

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

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

終了したら、「作成」を選択します。

2. 認証の設定

OCIレスポンスAPIでは、2つの認証方法がサポートされています。いずれのオプションも使用できます。

  • OCI生成AI APIキー

    OpenAI互換の生成AIサービス固有のAPIキーを使用して、モデルとエンドポイントを認証し、アクセスします。このオプションは、テストおよび早期開発に使用します。

  • OCI IAMベースの認証

    署名付きAPIリクエストを使用して、モデルおよびエンドポイントを認証し、アクセスします。このオプションは、本番ワークロードおよびOCI管理環境にお薦めします。次の場合は、IAM認証の使用を検討してください:

    • FunctionsやOracle Kubernetes Engine (OKE)などのOCIサービスでのアプリケーションの実行
    • 長期間のAPIキーを回避したい
    • OCI IAMによる一元的なアクセス制御が必要
2.1 (a) APIキーの作成

このステップは、OCI生成AI APIキー認証を使用する場合にのみ必要です。

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

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

  • 「APIキー」リスト・ページで、「APIキーの作成」を選択します。

    基本的な情報

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

    キー名および有効期限

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

    oci generative-ai api-key create [OPTIONS]

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

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

2.1 (b) APIキーへの権限の追加

このステップは、OCI生成AI APIキー認証を使用する場合にのみ必要です。

APIキーOCIDの検索

権限を特定のAPIキーにスコープ指定するには、最初にそのOCIDを取得します。

コンソールで:

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

APIキーへの権限の付与

特定のユーザー・グループにこのAPIキーを使用したレスポンスAPIの起動を許可するには、次のIAMポリシーを追加します:

allow group <agent-builders-with-Responses-API-group>
to manage generative-ai-response 
in compartment <QuickStart-compartment-name> 
where ALL {request.principal.type='generativeaiapikey',
request.principal.id='<api-key-OCID>'}

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

より広範なサンドボックス・アクセスの場合のみ、次のポリシーを使用できます。

allow any-user to use generative-ai-family 
in compartment <QuickStart-compartment-name> 
where ALL {request.principal.type='generativeaiapikey', 
request.principal.id='<your-api-key-OCID>'}
2.2 (a) OCI Generative AI IAM Auth Libraryのインストール

このステップは、OCI生成AI APIキー認証を使用する場合にのみ必要です。OCI生成AI APIキーを使用している場合は、このステップをスキップします。

OCI Generative AI認証ヘルパー・パッケージをインストールします。

pip install oci-genai-auth

oci-genai-authパッケージは、次のようなOCI IAM認証をOpenAI SDKと統合するための認証ヘルパーを提供します。

  • ローカル開発用のOciSessionAuth
  • OCI IAM API署名キーを使用するユーザー向けのOciUserPrincipalAuth
  • OciInstancePrincipalAuth
  • OCI管理環境の場合はOciResourcePrincipalAuth

OpenAIクライアントでOCI IAM認証を使用する場合は、api_key="not-used"を設定し、認証されたhttp_clientを指定します。

OciUserPrincipalAuthの場合は、リクエストに署名するアイデンティティのOCI構成ファイルを設定します。次の関連トピックを参照してください。

3.openaiのインストール

公式のOpenAI SDKをインストールします。

Python

pip install openai
ノート

レスポンスAPIを起動するには、OCI SDKではなく、OpenAI SDKを使用します。また、OpenAI SDKの最新バージョンも必ず使用してください。

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

4.OCIレスポンスAPIのエンドポイントの検索

OCI Responses APIは、OCI Generative AIでエンタープライズAIエージェント・アプリケーションを構築するための主要なAPIです。これにより、モデル・リクエストの送信、ツールの使用、および単一のAPIを介した会話コンテキストの管理が可能になります。

レスポンスAPIを使用して、次のことを行います。

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

OCI Responses APIは、OpenAI互換インタフェースを使用します。リクエストは同じOpenAIスタイルの構文を使用しますが、これらはOCI生成AIに送信され、OCI生成AI APIキーやOCI IAMベースの認証などのOCI資格証明で認証されます。

推奨されるクライアントは、OpenAI SDKです。Python、Java、TypeScript、Go、.NETなどの言語をサポートしています。また、LangChain、LlamaIndex、OpenAI Agents SDKなどのフレームワークでも使用できます。

次のベースURLを使用します。

ベースURL: https://inference.generativeai.${region}.oci.oraclecloud.com/openai/v1

${region}をOCIリージョン(us-chicago-1など)に置き換えます。

レスポンスAPIでは、次のエンドポイント・パスを使用します:

/responses
5. サポートされているモデルIDおよびリージョンの検索

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

オンデマンドモード

オンデマンド・モデルはOCIによってホストおよび管理され、専用の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."
)

専用モード

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

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

リクエストを送信する場合は、必ずクラスタと同じリージョンを選択してください。

使用可能なリージョンでモデルを選択し、パフォーマンス、コストおよびコントロールの要件に最も適した使用可能なモードにします。

6. 最初の応答の作成

次の例は、Pythonを使用してResponses APIをコールする方法を示しています。リクエストから説明が返された場合、OCIレスポンスAPIは正常に動作しています。

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)
OciUserPrincipalAuthの例

このアプローチは、OCI IAM API署名キー(OCI生成AI APIキーではない)を使用する場合に使用します。必要なキーとOCIDを参照してください。

from openai import OpenAI
from oci_openai import OciUserPrincipalAuth
import httpx

client = OpenAI(
    base_url="https://inference.generativeai.us-chicago-1.oci.oraclecloud.com/openai/v1",
    api_key="not-used",
    project="ocid1.generativeaiproject.oc1.us-chicago-1.xxxxxxxx",
    http_client=httpx.Client(
        auth=OciUserPrincipalAuth(
            config_file="~/.oci/config",
            profile_name="DEFAULT",
        )
    )

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)
OciSessionAuthの例

コードをローカルで実行する場合は、次の方法を使用します。

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)
OciResourcePrincipalAuthの例

このアプローチは、OCI FunctionsOCI Container Engine for Kubernetes (OKE)などの管理対象環境を操作する場合に使用します:

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()),
)

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)

その他の機能の追加

デバッグ・ログの有効化

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はストリーミングをサポートしており、トークンが生成されるとモデル出力を段階的に受信できます。

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

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)

ストリーミングは、ユーザーが生成されたレスポンスを読み取ることができる対話型アプリケーションに特に役立ちます。

推論の追加

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

ヒント

モデルの詳細ページで主な機能をレビューして、コールするモデルに推論があることを確認します。使用可能なチャット・モデルを参照してください。

推論の取り組み

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

print(response.output_text)

理由要約出力

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

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

print(response.output_text)
構造化出力の取得

モデルで自由形式テキストではなく予測可能な形式でデータを返す場合は、構造化出力を使用します。これは、非構造化入力からフィールドを抽出したり、結果を他のシステムに渡したり、UIに特定の値を表示する場合に便利です。OCIレスポンスAPIでは、スキーマを定義し、それに対するレスポンスを解析することで、アプリケーションの出力の一貫性と使いやすさを向上させます。構造化出力は指定されたスキーマと一致しますが、JSONモードでは有効なJSONのみが保証されます。

強い型指定オブジェクトは、フィールドとデータ型が事前に定義されているオブジェクトです。たとえば、スキーマでcustomer_nameが文字列である必要があり、priority"low""medium"または"high"のいずれかである必要がある場合、解析された結果はその構造に従います。これにより、コードがレスポンスを安全かつ予測可能な方法で処理しやすくなります。OCIレスポンスAPIでは、スキーマを定義し、モデル出力を強く型指定されたオブジェクトに解析できるようにすることで、これをサポートしています。

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

from pydantic import BaseModel
from typing import Literal

class SupportRequest(BaseModel):
    customer_name: str
    product: str
    issue_summary: str
    priority: Literal["low", "medium", "high"]
    requested_action: str

response = client.responses.parse(
    model="<supported-model-id>",
    input=[
        {"role": "system", "content": "Extract the support request into the schema."},
        {
            "role": "user",
            "content": (
                "Sarah Johnson from Example Company says the mobile inventory app "
                "crashes whenever she scans more than 20 items in one session. "
                "This is delaying warehouse processing, and she wants a fix as soon as possible."
            ),
        },
    ],
    text_format=SupportRequest,
)

support_request = response.output_parsed
print(support_request)

出力例:

SupportRequest(
customer_name='Sarah Johnson', 
product='mobile inventory app', 
issue_summary='App crashes whenever she scans more than 20 items in one session.', 
priority='high', 
requested_action='Provide a fix as soon as possible'
)
マルチモーダル入力の送信

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="google.gemini-2.5-pro",
    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="google.gemini-2.5-pro",
    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)

ツール

OCIレスポンスAPIへのOpenAIツールの追加

ヒント

サポートされているモデル、リージョンおよびこれらのツールの使用方法の例については、次の項を展開します。

OCI OpenAI互換ツールについて

OCI Generative AIはResponses APIのツールをサポートし、サポートされているモデルがレスポンス生成時に統合ツールを使用できるようにします。モデルがデータから関連コンテンツを取得したり、Pythonコードを実行したり、アプリケーション定義関数をコールしたり、リモートMCPサーバーによって公開されるツールを使用できるように、Responses APIリクエストのtoolsプロパティにツール定義を追加します。

ツール・サポートは、APIでのみ使用可能です。要求に応じて、モデルは構成済みツールのいずれかを使用するかどうかを決定できます。サポートされているツールについては、次のセクションを展開します。例:

"tools": [
        { "type": "function", "name": "get_calendar_events" },
        { "type": "function", "name": "purchase_tickets" }
        { "type": "file_search", "vector_store_ids": ["<vector_store_id>"]
        }
    ]
コードインタプリタ

コード・インタプリタを使用して、モデルがセキュアで分離されたコンテナでPythonコードを記述して実行できるようにします。このツールは、計算、データ分析、ファイル処理、およびその他の計算負荷の高いタスクに役立ちます。

ノート

OCIコード・インタプリタ・ツールは、OCI OpenAI互換エンドポイントとともにResponses APIで使用されるOpenAIコード・インタプリタ・ツールと同じ形式を使用します。構文およびリクエストの詳細は、OpenAIドキュメントのコード・インタプリタに関するトピックを参照してください。
ヒント

プロンプトで、コード・インタプリタをpythonツールとして参照します。例: Use the python tool to solve the problem.

コードは外部ネットワーク・アクセスのない分離された環境で実行されるため、制御された設定でワークフローに計算またはファイル処理が必要な場合、コード・インタプリタは適切なオプションです。

コード・インタプリタの使用

これを初めて使用する場合は、コード・インタプリタをモデルの一時的なPythonワークスペースと考えてください。

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

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

実行環境

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

コードはサンドボックス・コンテナ内で実行されます。このコンテナは、Pythonが実行され、アップロードされたファイル、生成されたファイルおよび一時作業データがセッション中に格納される作業環境です。

コンテナ・メモリー制限

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

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

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

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

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

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

コンテナ失効

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

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

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

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

コード・インタプリタを使用するには、"type": "code_interpreter"を使用してtoolsプロパティにツール定義を追加します。

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ツールはコード・インタプリタです。

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

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

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

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

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

  • 自動: OCI Generative AIは、現在のコンテキストでコンテナをプロビジョニングまたは再利用します。
  • コンテナOCID: コンテナを自分で作成し、メモリー・サイズを定義して、OCIDを指定します。

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

ノート

OCIコード・インタプリタ・ツールは、OCI OpenAI互換エンドポイントとともにResponses APIで使用されるOpenAIコード・インタプリタ・ツールと同じ形式を使用します。構文およびリクエストの詳細は、Containers for Code IntepretersおよびOpenAI Containers APIのドキュメントを参照してください。

自動モード

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

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

  • OCI Generative AIでコンテナを管理したい
  • 環境を直接制御する必要はありません。
  • より簡単な設定が必要

memory_limitは必要に応じて指定できます。指定しない場合、デフォルトは1 GBです。

response = client.responses.create(
    model="xai.grok-code-fast-1",
    tools=[{
        "type": "code_interpreter",
        "container": {
            "type": "auto",
            "memory_limit": "1g"
        }
    }],
    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の読取り
  • チャートの生成
  • 処理済出力の保存中
  • ログまたはレポートの作成

APIリファレンス: OpenAI Container Files APIのドキュメントおよびContainer Files API

ファイルの永続性

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

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

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

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

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

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

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

  • コンテナ・ファイルの作成: マルチパート・アップロードまたは既存の/v1/files IDを参照して、コンテナにファイルを追加します
  • コンテナ・ファイルのリスト: コンテナ内のファイルを表示します。
  • コンテナ・ファイルの削除: ファイルの削除
  • コンテナ・ファイル・コンテンツの取得: コンテナからファイルをダウンロードします

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

出力ファイルと引用

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

これらの注釈には、次のものを含めることができます。

  • container_id
  • file_id
  • filename

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

レスポンスには、生成されたファイルを識別するcontainer_file_citationオブジェクトを含めることができます。「コンテナ・ファイル・コンテンツの取得」操作を使用してファイルをダウンロードします。

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

ノート

OCIファイルAPIでは、OCI OpenAI互換エンドポイントを含むOpenAIファイルAPIと同じ形式が使用されます。構文およびリクエストの詳細は、OpenAI Files APIのドキュメントを参照してください。
ノート

Ressponses APIのツールとして使用されるOCIコード・インタプリタは、OCI OpenAI互換エンドポイントを使用するOpenAIコード・インタプリタと同じ形式を使用します。構文およびリクエストについては、次のリファレンスを参照してください。

関数呼び出し

ファンクション・コールを使用して、レスポンスAPIワークフロー中にモデルがアプリケーションからデータまたはアクションをリクエストできるようにします。これは、カレンダ・データ、内部アプリケーションの状態、カスタム操作の結果など、プロンプト自体で使用できない情報または操作をモデルが必要とする場合に便利です。

このパターンでは、モデルは関数を直接実行しません。かわりに、関数名と引数が返され、アプリケーションによって関数が実行されてから、モデルを続行してユーザー対応の回答を生成できるように、アプリケーションが関数出力を返送します。

有効にする内容

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

ユース・ケースの例:

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

関数内で、外部サービス、データベース、独自のライブラリAPIの1つ、CLI、またはローカルMCPサーバーを呼び出すことができます。

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

実行フロー

一般的な関数呼び出し相互作用は次のように機能します。

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

状態処理オプション

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

  • サービス管理状態

    ほとんどのユース・ケースに推奨されます。フォローアップ・リクエストにはprevious_response_idが含まれ、サービスは以前の交換を追跡します。

  • クライアント管理の状態

    アプリケーションは、完全な相互作用履歴を保持し、蓄積されたコンテキストを各リクエストに送信します。

ヒント

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

関数ツールの定義

関数ツールを定義するには、"type": "function"を使用してtoolsプロパティにエントリを追加します。

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

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)

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

ツールの選択

ヒント

モデルは、リクエストに応じて、構成済ツールのいずれかを使用するかどうかを決定できます。必要に応じて、tool_choiceプロパティを使用してツールの動作をガイドすることもできます。
"tool_choice": {
    "type": "allowed_tools",
    "mode": "auto",
    "tools": [
        { "type": "function", "name": "get_calendar_events" },
        { "type": "function", "name": "purchase_tickets" }
    ]
  }
}
MCPコール

MCP (Model Context Protocol)ツールは、AIモデルが外部システムと対話するために使用できる実行可能関数または機能です。OCI生成AIでMCPコールを使用して、Responses APIリクエスト中にリモートMCPサーバーによって公開される実行可能ツールにモデルがアクセスできるようにします。これらのツールは、API、データベース、ファイル・システム、アプリケーション・エンドポイントなどの外部システムへのアクセスを提供できます。OCI Generative AIは、リクエスト・ワークフローの一環として、リモートMCPサーバーと直接通信します。

ノート

OCI MCPコール・ツールは、OCI OpenAI互換エンドポイントとともに、レスポンスAPIのOpenAI MCPコールと同じ形式を使用します。構文およびリクエストの詳細は、OpenAI MCPのドキュメントを参照してください。

MCP呼び出しを使用するタイミング

モデルがリモートMCPサーバーでホストされているツールにアクセスする必要がある場合は、MCP呼び出しを使用します。この方法は、次の場合に役立ちます。

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

主な機能

MCPコールには次の利点があります。

  • プラットフォーム間直接通信: クライアント・アプリケーションに制御を戻す標準関数コールとは異なり、MCPコールを使用すると、OCI生成AIはリモートMCPサーバーと直接通信できます。
  • レイテンシの低減: リクエストに余分なクライアント・ラウンドトリップが必要ないため、MCPコールによってオーケストレーションのオーバーヘッドを削減できます。

  • トランスポート・サポート: ストリーム可能なHTTP (SSEは非推奨およびサポート対象外)をサポートします。

MCPツールの定義

MCPツールを定義するには、"type": "mcp"を使用してtoolsプロパティにエントリを追加します。

response_stream = client.responses.create(
    model="openai.gpt-5.4",
    tools=[
        {
            "type": "mcp",
            "server_label": "dmcp",
            "server_description": "A Dungeons and Dragons MCP server to assist with dice rolling.",
            "server_url": "https://mcp.deepwiki.com/mcp",
            "require_approval": "never",
        },
    ],
    input="Roll 2d4+1",
    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": "dmcp",
            "server_description": "A Dungeons and Dragons MCP server to assist with dice rolling.",
            "server_url": "https://mcp.deepwiki.com/mcp",
            "require_approval": "never",
            "allowed_tools": ["roll"],
        },
    ],
    input="Roll 2d4+1",
    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
)

rawトークン値のみを渡します。Bearer接頭辞は含めないでください。

OCIは、TLS経由でAPIリクエスト本文のトークンを送信します。OCIでは、トークンをデコード、検査、格納またはログに記録しません。TLSで暗号化されたMCPサーバー・エンドポイントを使用することをお薦めします。

OCI NL2SQLツールの設定

NL2SQLを使用したSQL検索について

SQL検索(NL2SQL)を使用して、自然言語リクエストをOCI生成AIのエンタープライズ・データの検証済SQLに変換します。

NL2SQLは、エンタープライズAIエージェントが、基礎となるデータを移動または複製することなく、フェデレーテッド・エンタープライズ・データを操作するのに役立ちます。セマンティック・エンリッチメント・レイヤーを使用して、ビジネス用語をデータベース表、列および結合にマップし、自然言語入力からSQLを生成します。

前提条件

NL2SQLを使用する前に、次のものが必要です。

  • Oracle Autonomous Databaseなどのソース・データベース
  • 2つのDBTools接続:
    • エンリッチメントの接続
    • クエリー接続
  • セマンティック・ストア、NL2SQL、データベース・ツールおよびシークレットのIAM権限
  • このクイックスタートで使用されるOCIサービスAPI用に構成されたOCI IAM認証
1. データベース接続とDBTools接続の作成

セマンティック・ストアを作成する前に、ソース・データベースおよび必要なDBTools接続を作成します。

次の接続が必要です。

エンリッチメントの接続

エンリッチメント接続は、エンリッチメント中に使用される、より高い権限を持つデータベース接続です。次の権限が必要です。

  • 問合せの実行
  • DDL操作の実行
  • データベースからのサンプル値へのアクセス

OCI Generative AIは、この接続を使用してスキーマの詳細を読み取り、SQL生成に必要なメタデータを構築します。

クエリー接続

問合せ接続は、問合せユーザーのかわりに問合せを実行するために使用される、権限の低いデータベース接続です。

この分離は、生成と実行の責任を明確にし、より安全なアクセス制御をサポートするのに役立ちます。

関連トピック

2. セマンティック・ストアおよびNL2SQLのIAM権限の設定

セマンティック・ストアを作成する前に、必要なIAMポリシーを設定します。

セマンティック・ストア管理者用

OCI生成AIリソースへのアクセス権の付与を実行したQuickStartステップへのアクセス権を付与した場合、管理者に対してこのステップをスキップできます。すでにセマンティック・ストアを管理する権限があります。

セマンティック・ストア管理者は、OCI生成AIセマンティック・ストア・リソースおよびそのNL2SQL関連操作を作成、更新、削除および管理する管理者です。

管理者のIAMグループを作成するよう管理者に依頼します。このトピックでは、管理グループは次のように表されます。

  • <セマンティック・ストア- 管理者>
allow group <semantic-store-admin> 
to manage generative-ai-semantic-store 
in compartment <QuickStart-compartment-name>
allow group <semantic-store-admin> 
to manage generative-ai-nl2sql 
in compartment <QuickStart-compartment-name>
先行2つのポリシーで使用可能な管理タスク

<semantic-store-admin>では、次のことができます。

  • セマンティック・ストアの作成
  • 表示および更新
  • 削除または移動
  • トリガー・エンリッチメント
  • エンリッチメント結果の検査
  • 検証/テストのために自然言語からSQLを生成
  • ストアに関連付けられたNL2SQL操作の管理

OCI生成AIセマンティック・ストア向け

  • テナンシまたは指定したコンパートメントに作成されるセマンティック・ストアの動的グループを作成します。
  • 動的グループに次の権限を付与します。
    • データベース・ツール接続へのアクセス
    • データベース・メタデータの読取り
    • Autonomous Databaseメタデータの読取り
    • 生成AI推薦へのアクセス
    • データベース・ツール接続で使用されるシークレットの読取り
  1. 次の一致ルールを使用して、テナンシ内のアセマンティック・ストアの動的グループを作成します:
    all {resource.type='generativeaisemanticstore'}
  2. セマンティック・ストアを特定のコンパートメントに制限するには、前の条件を次のように更新します:
    all {resource.type='generativeaisemanticstore',
     resource.compartment.id='<QuickStart-compartment-name>'}
  3. ポリシーを作成して、指定されたコンパートメントのデータベース・ツール接続にアクセスする権限を動的グループに付与します。
    allow dynamic-group <dynamic-group-name> 
    to use database-tools-family in compartment <QuickStart-compartment-name>'}
  4. データベース・ツール接続で使用されるシークレットを読み取る権限を動的グループに付与するポリシーを追加します。
    allow dynamic-group <dynamic-group-name> 
    to read secret-family in compartment <QuickStart-compartment-name>
  5. データベース・ツール接続用のOracle Databaseメタデータを読み取る権限を動的グループに付与するポリシーを追加します。
    allow dynamic-group <dynamic-group-name> 
    to read database-family in compartment <QuickStart-compartment-name>
  6. データベース・ツールの接続およびエンリッチメント・ジョブのAutonomous Databaseメタデータを読み取る権限を動的グループに付与するポリシーを追加します。
    allow dynamic-group <dynamic-group-name> 
    to read autonomous-database-family in compartment <QuickStart-compartment-name>
  7. 推論のためにOCI生成AIリソースにアクセスする権限を動的グループに付与するポリシーを追加します。
    allow dynamic-group <dynamic-group-name> 
    to use generative-ai-family in compartment <QuickStart-compartment-name>
二つの政治が与えるもの

generativeaisemanticstoreリソースでは、次のことができます。

  • 生成AIによるLLM推論の起動
  • データベース・ツール接続を使用したエンリッチメントおよび問合せ
  • データベース・ツールによってバックアップされた接続に必要なシークレットの読取り
  • Oracle DatabaseおよびAutonomous Databaseメタデータの読取り

セマンティック・ストア・ユーザー向け

セマンティック・ストア・ユーザーは、既存のセマンティック・ストアにアクセスしてNL2SQL機能を使用できるが、リソースを管理する必要がないエンド・ユーザーです。

管理者に、ユーザーのIAMグループを作成するように依頼します。このトピックでは、ユーザー・グループは次のように表されます。

  • <セマンティック・ストア・ユーザー>
allow group <semantic-store-users> 
to read generative-ai-semantic-store 
in compartment <QuickStart-compartment-name>
allow group <semantic-store-users> 
to manage generative-ai-nl2sql 
in compartment <QuickStart-compartment-name>
先行2つのポリシーで使用可能なユーザータスク

<semantic-store-users>では、次のことができます。

  • セマンティック・ストアを表示
  • 関連付けられたNL2SQL関連機能を使用
  • inspectおよびqueryの出力
  • アクセス・エンリッチメント情報

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

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

allow group <semantic-store-users>
to use database-tools-family in compartment <QuickStart-compartment-name>
where all {request.principal.type='generativeaisemanticstore'}
allow group <semantic-store-users>
to read database-family in compartment <QuickStart-compartment-name>
where all {request.principal.type='generativeaisemanticstore'}
allow group <semantic-store-users>
to read autonomous-database-family in compartment <QuickStart-compartment-name>
where all {request.principal.type='generativeaisemanticstore'}
3.OCI IAM認証の設定

このQuickStartでは、セマンティック・ストアの作成、エンリッチメント・ジョブの実行およびSQLの生成を行うOCIサービスAPIにOCI IAM認証を使用します。

リクエストに署名するアイデンティティのOCI IAM認証を設定します。この項の例では、OCI Python SDKおよびBaseClientを使用します。

次のものを使用して認証できます。

  • OCI構成ファイルおよびAPI署名キー
  • セキュリティ・トークン署名者

次の例では、SecurityTokenSignerを使用しますが、環境に適合する場合は、標準のOCI構成署名者を使用することもできます。

関連トピック

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

NL2SQLを使用するには、OCI セマンティック・ストア・リソースを作成します。

セマンティック・ストアは、構造化データを含むベクトル・ストアに支えられ、次のDBTools接続が含まれます。

  • エンリッチメントの接続
  • 問合せ接続

コンソールでのセマンティック・ストアの作成

  1. ベクトル・ストアのリスト・ページを開きます。
  2. 名前と説明を入力します。
  3. <QuickStart-compartment-name>コンパートメントを選択します。
  4. 「データ・ソース・タイプ」で、「構造化データ」を選択します。
  5. 「同期コネクタの構成」で、接続タイプとして「OCIデータベース・ツール」を選択します。
  6. 「エンリッチメント接続ID」を入力し、「エンリッチメント接続のテスト」を選択します。
  7. 「接続IDの問合せ」を入力し、「問合せ接続のテスト」を選択します。
  8. 「スキーマ」で、収集するデータベース・スキーマ名を指定します。
  9. 「自動化」で、エンリッチメントの実行時期を選択します。
    • なし
    • 作成時
  10. 「作成」を選択します。

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

次の例では、OCIサービスAPIを使用してセマンティック・ストアを作成および管理します。

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

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

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,
    )

if __name__ == "__main__":
    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": "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))
5. エンリッチメントの手動実行

「自動化」で、「作成時」のかわりに「なし」を選択した場合、セマンティック・ストアの作成後にエンリッチメントを実行できます。「作成時」オプションをスキップした場合は、このステップを実行します。

エンリッチメント・プロセスは、接続されたデータベースから表や列などのスキーマ・メタデータを読み取ります。OCI生成AIでは、このメタデータを使用してSQLを生成できます。

エンリッチメントを手動でトリガーするには、GenerateEnrichmentJob APIをコールします。

次のAPIを使用して、エンリッチメント・ジョブを管理することもできます。

  • ListEnrichmentJobs
  • GetEnrichmentJob
  • CancelEnrichmentJob
6. セマンティック・ストアおよびGenerateSqlFromNlのOCIエンドポイントの検索

NL2SQLでは、OCI OpenAI互換の/openai/v1パスではなく、OCIサービスAPIを使用します。

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

セマンティック・ストアCRUD操作には、次のベースURLを使用します。

ベースURL: https://generativeai.${region}.oci.oraclecloud.com

次のエンドポイント・パスを使用します:

/20231130/semanticStores

認証:

  • IAMセッションのみ

エンリッチメント・ジョブAPI

セマンティック・ストアのエンリッチメント・ジョブには、次のベースURLを使用します。

ベースURL: https://inference.generativeai.${region}.oci.oraclecloud.com

次のエンドポイント・パスを使用します:

/20260325/semanticStores/{semanticStoreId}/

認証:

  • IAMセッションのみ

自然言語からのSQLの生成

SQL生成には、次のベースURLを使用します。

ベースURL: https://inference.generativeai.${region}.oci.oraclecloud.com

次のエンドポイント・パターンを使用します。

/20260325/semanticStores/{semanticStoreId}/actions/generateSqlFromNl

認証:

  • IAMセッションのみ

使用可能なセマンティック・ストアおよびNL2SQL API

セマンティック・店舗

セマンティック・店舗
  • CreateSemanticStore
  • ListSemanticStores
  • GetSemanticStore
  • UpdateSemanticStore
  • ChangeSemanticStoreCompartment
  • DeleteSemanticStore
拡充ジョブ
  • ListEnrichmentJobs
  • GetEnrichmentJob
  • GenerateEnrichmentJob
  • CancelEnrichmentJob
SQLの生成
GenerateSqlFromNl
ノート

ベースURLは、セマンティック・ストアおよびエンリッチメント・ジョブAPIと異なります。
7. 最初のSQL文の生成

セマンティック・ストアの準備が完了し、エンリッチメントが完了したら、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レスポンスAPIアクティビティの確認

コールのトレースについて

OCI Responses APIの組込みレスポンス・トレース・データを使用して、リクエストの処理方法を理解します。より詳細な可観測性のために、OCI Responses APIをLangfuseなどの外部可観測性プラットフォームと統合することもできます。

このQuickStartでは、Responses APIによって返された実行詳細を検査する方法と、Langfuseを使用してリクエストをトレースする方法を示します。

前提条件

開始する前に、次のことが必要です:

  • OCI Generative AIプロジェクト
  • OCIレスポンスAPI用に構成された認証
  • OpenAI SDKがインストールされている
  • 動作中のOCIレスポンスAPIクライアント

(オプション) Langfuseと統合するには、Langfuseアカウントと資格証明が必要です。

1. レスポンスAPI出力の検査

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

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

  • message
  • file_search_call
  • mcp_call

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

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

たとえば、リクエストを送信した後、outputフィールドを検査できます。

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

for item in response.output:
    print(item.type)
2.Langfuse SDKのインストール

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

1つのオプションはLangfuseです。これは、開発者がLLMアプリケーションをデバッグ、監視、改善するのに役立つオープンソースのLLMエンジニアリング・プラットフォームです。Langfuseは、エージェント・アクションをトレースするためのエンドツーエンドの可観測性を提供し、迅速なバージョニングをサポートし、モデル出力の評価を支援します。OpenAI、LangChain、LlamaIndexなどの一般的なフレームワークと統合されます。

Langfuse SDKをインストールします。

pip install langfuse
3. 環境変数の構成

必要な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"
4.OpenAIクライアントのインストゥルメント

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

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

client = OpenAI(
    base_url="https://inference.generativeai.<region>.oci.oraclecloud.com/openai/v1",
    api_key=os.getenv("OCI_GENAI_API_KEY"),
    project=os.getenv("OCI_GENAI_PROJECT_ID"),
)
5. トレースされたレスポンスAPIリクエストの送信

クライアントをインストゥルメントした後、通常どおりResponses APIリクエストを送信します。Langfuseは自動的に要求をトレースします。

例:

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

print(response.output_text)