Démarrage express

Procédez comme suit pour commencer à créer des agents d'IA d'entreprise avec OCI Generative AI. Ce guide vous guide tout au long de la configuration initiale, avec le contexte en cours de route afin que vous compreniez non seulement quoi faire, mais aussi pourquoi cela compte.

Prérequis : configuration des droits d'accès IAM

Avant de créer un projet, assurez-vous que les groupes d'utilisateurs appropriés ont accès aux ressources OCI Generative AI. Sans ces autorisations, vous ne pourrez pas créer ni gérer des projets et des ressources associées.

OCI fournit un type de ressource agrégé, generative-ai-family, qui accorde l'accès à tous les types de ressource d'IA générative via une seule stratégie.

Conseil

Accordez un large accès uniquement aux administrateurs ou aux utilisateurs travaillant dans des environnements de modèle d'environnement restreint ou de développement. Pour une utilisation en production, envisagez d'appliquer des politiques plus restrictives.

Accorder l'accès au niveau de la location

Pour autoriser un groupe d'utilisateurs à gérer toutes les ressources d'IA générative dans la location, procédez comme suit :

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

Octroi de l'accès au niveau du compartiment

Pour définir la portée de l'accès à un compartiment spécifique, procédez comme suit :

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

Une fois ces autorisations en place, vous êtes prêt à créer le premier projet.

1. Création d'un projet

Un projet est la ressource de base pour l'organisation et la gestion des agents d'IA et des ressources associées dans OCI Generative AI. Vous pouvez créer un projet via la console Oracle Cloud.

Après avoir créé un projet, vous pouvez le gérer via la console, par exemple en mettant à jour ses détails, en le déplaçant vers un autre compartiment, en gérant les balises ou en le supprimant. Ces actions sont disponibles dans le menu Actions (trois points) de la page de la liste des projets.

Pour commencer, accédez à la page de la liste des projets et sélectionnez Créer un projet.

Informations de base

Commencez par définir les attributs de base du projet :
  • Nom (facultatif) :

    Indiquez un nom qui commence par une lettre ou un trait de soulignement, suivi de lettres, de chiffres, de traits d'union ou de traits de soulignement (1 à 255 caractères). Si vous n'indiquez pas de nom, un nom est généré automatiquement au format suivant :

    generativeaiproject<timestamp> (par exemple, generativeaiproject20260316042443). Vous pouvez le mettre à jour ultérieurement.

  • Description (facultatif):

    Ajoutez une brève description pour identifier l'objectif du projet.

  • Compartiment:

    Sélectionnez le compartiment où le projet résidera. Par défaut, il s'agit du compartiment en cours, mais vous pouvez choisir n'importe quel compartiment pour lequel vous disposez des droits d'accès requis.

Conservation des données

Configurer la durée pendant laquelle les données générées sont stockées. Cela vous aide à équilibrer la convivialité et les exigences du cycle de vie des données :

  • Conservation de la réponse :

    Définit la durée pendant laquelle les réponses de modèle individuelles sont stockées après la génération.

  • Conservation de la conversation :

    Détermine la durée pendant laquelle une conversation entière est conservée après sa mise à jour la plus récente.

Vous pouvez définir les deux valeurs en heures, jusqu'à 720 heures (30 jours) au maximum.

Compaction de mémoire à court terme

Cette fonctionnalité améliore l'efficacité en résumant l'historique des conversations récentes en une représentation compacte. Il permet de maintenir le contexte tout en réduisant l'utilisation et la latence des jetons.

  • Activer (facultatif) :

    Activez la compression de mémoire à court terme pour condenser automatiquement les interactions précédentes.

  • Sélection de modèle :

    Si cette option est activée, sélectionnez un modèle de compactage. Les modèles disponibles varient selon la région.

Important

  • Le modèle de compactage est sélectionné au moment de la création et ne peut pas être modifié ultérieurement.
  • Une fois activée, cette fonction ne peut pas être désactivée sans supprimer le projet.
  1. (Facultatif) Activez la compression de mémoire à court terme pour résumer l'historique des discussions antérieures et garder le contexte léger.
  2. Si vous activez la fonction de compactage de la mémoire à court terme, sélectionnez un modèle dans la liste pour le compactage.
    La liste des modèles varie selon les régions. Pour connaître les modèles disponibles, reportez-vous à Modèles et régions d'IA générative pour l'API Agentic.

Mémoire à long terme

La mémoire à long terme permet au système d'extraire et de conserver les informations importantes des conversations pour une utilisation future. Ces données sont stockées en tant qu'intégrations, ce qui les rend consultables et réutilisables dans les interactions.

  • Activer (facultatif) :

    Activez la mémoire à long terme pour conserver les informations clés des conversations.

  • Sélection de modèle :
    • Modèle d'extraction : identifie et capture les informations importantes.
    • Modèle d'intégration : convertit les données stockées en représentations vectorielles pour extraction.
Important

  • Ces modèles doivent être sélectionnés lors de la création du projet et ne peuvent pas être modifiés ultérieurement.
  • Une fois qu'elle est activée, la mémoire à long terme ne peut pas être désactivée, sauf si le projet est supprimé.
Conseil

Pour de meilleurs résultats, définissez la durée maximale (720 heures) de conservation des réponses et des conversations lors de l'utilisation de la mémoire à long terme.

Balises

Les balises vous aident à organiser et à gérer les ressources.

  • (Facultatif) Sélectionnez Ajouter une balise pour affecter des métadonnées à votre projet.

    Pour plus d'informations, reportez-vous à Balises de ressource.

Enfin, sélectionnez Créer pour créer le projet.

2. Création d'une clé d'API

Créez une clé d'API pour authentifier les demandes auprès d'OCI Generative AI. Vous pouvez nommer la clé et éventuellement configurer jusqu'à deux noms de clé avec des dates et heures d'expiration.

Les clés d'API sont utilisées pour authentifier les demandes auprès d'OCI Generative AI. Cette étape consiste à créer une clé que les applications ou les outils peuvent utiliser pour accéder au service en toute sécurité.

Vous pouvez créer et gérer des clés d'API à l'aide de la console, de l'interface de ligne de commande ou de l'API.

Important

Veillez à ajouter une autorisation de clé d'API après avoir créé la clé.
  • Sur la page de liste Clés d'API, sélectionnez Créer une clé d'API. Si vous avez besoin d'aide pour trouver la page de liste, reportez-vous à Liste des clés d'API.

    Informations de base

    1. Entrez le nom de la clé d'API (obligatoire). Commencez le nom par une lettre ou un tiret de soulignement, suivi de lettres, de chiffres, de traits d'union ou de trait de soulignement. Il peut comporter entre 1 et 255 caractères.
    2. (Facultatif) Entrez une description.
    3. (Facultatif) Pour enregistrer la clé d'API dans un compartiment différent de celui répertorié, sélectionnez un autre compartiment.
      Vous devez être autorisé à travailler dans un compartiment pour y voir les ressources. En cas de doute sur le compartiment à utiliser, contactez un administrateur. Pour plus d'informations, reportez-vous à Présentation des compartiments.
    4. (Facultatif) Affectez des balises à cette clé d'API. Reportez-vous à Balises de ressource.

    Noms de clé et délais d'expiration

    1. Entrez le nom de la première clé : Key one name. Commencez le nom par une lettre ou un tiret de soulignement, suivi de lettres, de chiffres, de traits d'union ou de trait de soulignement. Il peut comporter entre 1 et 255 caractères.
    2. (Facultatif) Définissez la date d'expiration de la clé un et la heure d'expiration de la clé un.
      La valeur par défaut est de trois mois à compter de la date de création.
    3. Entrez le nom de la seconde clé : Key two name.
    4. (Facultatif) Définissez la date d'expiration de la clé deux et la date d'expiration de la clé deux (UTC).
      La valeur par défaut est de trois mois à compter de la date de création.
    5. Sélectionnez Create (Créer).
    Veillez à ajouter un droit d'accès de clé d'API après avoir créé la clé.
  • Utilisez la commande api-key create et les paramètres requis pour créer une clé d'API.

    oci generative-ai api-key create [OPTIONS]

    Pour obtenir la liste complète des paramètres et des valeurs des commandes de la CLI, reportez-vous à la référence des commandes de la CLI.

  • Exécutez l'opération CreateApiKey pour créer une clé d'API. Fournissez le nom d'affichage, la description facultative et tous les noms de clé avec leur horodatage d'expiration (UTC).

3. Ajouter un droit d'accès à la clé d'API

Rechercher l'OCID de clé d'API

Pour définir la portée des droits d'accès à une clé d'API spécifique, vous avez besoin de son OCID.

Dans la console :

  1. Accédez à la page de liste des clés d'API.
  2. Sélectionnez la clé d'API que vous avez créée.
  3. Copiez l'OCID (il commence généralement par ocid1.generativeaiapikey...).

Accorder le droit d'accès à la clé d'API

Créez une stratégie IAM pour autoriser la clé d'API à appeler l'API des réponses :

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>'}

Cette stratégie permet aux demandes authentifiées avec la clé d'API indiquée d'accéder à l'API des réponses, tout en gardant l'accès étendu et contrôlé.

4. Appel de l'API OCI Responses

L'API OCI Responses est l'interface principale pour créer des applications agentiques d'IA d'entreprise dans OCI Generative AI. Elle offre un moyen flexible de combiner des fonctionnalités de base, telles que l'orchestration, le raisonnement, les outils et l'état des conversations, dans une seule demande.

Avec cette API, vous pouvez :

  • Exécutez une inférence simple en une seule étape ou créez des workflows d'agent en plusieurs étapes
  • Activer ou désactiver le raisonnement en fonction du cas d'utilisation
  • Intégrer des outils (gérés par plate-forme ou côté client)
  • Gérer l'état de la conversation dans le service ou au sein du client

Cette approche unifiée vous permet de lancer des agents simples et de créer progressivement des agents plus avancés, tout en gardant le contrôle sur les coûts, la latence et le comportement.

URL de base 🔗

Utilisez l'URL de base suivante pour accéder à l'API OCI Responses :

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

Remplacez <region> par l'identificateur de région approprié (par exemple, us-chicago-1).

Prise en charge du kit SDK 🔗

L'API des réponses OCI est compatible avec le kit SDK OpenAI, qui est recommandé pour interagir avec le service. Il est pris en charge dans de nombreux langages, notamment Python, Java, TypeScript, Go et .NET.

Vous pouvez également l'utiliser avec des structures d'agent populaires telles que LangChain, LlamaIndex et OpenAI Agents SDK.

Installation du kit SDK OpenAI officiel (Python)

Python

pip install openai
Remarque

Pour appeler l'API des réponses, assurez-vous d'utiliser le kit SDK OpenAI, et non le kit SDK OCI. Assurez-vous également que la dernière version du kit SDK OpenAI est installée.

Pour les autres langues, reportez-vous à la page Bibliothèques OpenAI.

Faites votre première demande 🔗

L'exemple suivant montre comment appeler l'API de réponses à l'aide de Python :

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)

Si la réponse renvoie une explication, l'API OCI Responses fonctionne correctement.

Présentation des adresses d'API OCI Réponses

L'API OCI Responses utilise une interface compatible OpenAI, mais toutes les demandes sont acheminées via l'adresse d'inférence OCI Generative AI :

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

Cela signifie que vous pouvez utiliser des API de type OpenAI courantes (telles que /responses ou /containers), tandis que toutes les demandes sont exécutées dans OCI.

Bien que les API respectent le format OpenAI, elles sont entièrement intégrées à OCI :

  • L'authentification utilise les clés d'API OCI Generative AI ou l'accès basé sur IAM, et non les informations d'identification OpenAI
  • Les ressources (conteneurs, banques de vecteurs ou fichiers, par exemple) sont créées et gérées dans OCI, et non dans un environnement OpenAI
  • L'exécution et le traitement des données restent entièrement dans OCI

Par exemple, lorsque vous appelez :

/openai/v1/containers

le conteneur est créé et géré dans OCI Generative AI.

Seules les adresses répertoriées suivantes sont prises en charge. Les autres adresses OpenAI ne sont pas compatibles avec OCI Generative AI.

Le reste de ce démarrage rapide fournit des exemples d'utilisation de ces adresses.

Adresses disponibles

API URL de base Authentification Chemin d'adresse
API de réponses https://inference.generativeai.${region}.oci.oraclecloud.com Clé d'API ou session IAM /openai/v1/responses
API de conversations https://inference.generativeai.${region}.oci.oraclecloud.com Clé d'API ou session IAM /openai/v1/conversations
API de fichiers https://inference.generativeai.${region}.oci.oraclecloud.com Clé d'API ou session IAM /openai/v1/files
API de fichiers de banque de vecteurs https://inference.generativeai.${region}.oci.oraclecloud.com Clé d'API ou session IAM /openai/v1/vector_stores/{id}/files
Recherche de magasin de vecteurs https://inference.generativeai.${region}.oci.oraclecloud.com Clé d'API ou session IAM /openai/v1/vector_stores/{id}/search
API Containers https://inference.generativeai.${region}.oci.oraclecloud.com Clé d'API ou session IAM /openai/v1/containers
Projet CRUD https://generativeai.${region}.oci.oraclecloud.com Session IAM uniquement /20231130/generativeAiProjects
Clé d'API CRUD https://generativeai.${region}.oci.oraclecloud.com Session IAM uniquement /20231130/apikeys
CRUD du magasin sémantique https://generativeai.${region}.oci.oraclecloud.com Session IAM uniquement /20231130/semanticStores
Magasin de vecteurs CRUD https://generativeai.${region}.oci.oraclecloud.com Session IAM uniquement /20231130/openai/v1/vector_stores

Authentification OCI IAM

Au cours des étapes précédentes, vous avez utilisé une clé d'API d'IA générative pour authentifier les demandes auprès de l'API des réponses OCI. Les clés d'API sont une option pratique pour les tests rapides et le développement précoce. Cependant, pour les charges de travail de production, de nombreuses équipes préfèrent l'authentification basée sur OCI IAM pour une sécurité améliorée et un contrôle d'accès centralisé.

L'API OCI Responses prend entièrement en charge l'authentification OCI IAM. Cette section explique comment utiliser l'authentification basée sur IAM à la place des clés d'API.

Quand utiliser l'authentification IAM

Envisagez d'utiliser l'authentification IAM dans les cas suivants :

  • Exécution d'applications dans les services OCI (par exemple, Functions ou OKE)
  • Eviter les informations d'identification de longue durée, telles que les clés d'API
  • Application du contrôle d'accès de niveau fin via des stratégies IAM

Installation de la bibliothèque d'authentification OCI IAM

Installez la bibliothèque oci-genai-auth, qui fournit des utilitaires d'aide pour l'intégration de l'authentification OCI IAM au kit SDK OpenAI :

pip install oci-genai-auth

Cette bibliothèque inclut les aides à l'authentification suivantes :

  • OciSessionAuth (pour le développement local)
  • OciUserPrincipalAuth
  • OciInstancePrincipalAuth
  • OciResourcePrincipalAuth (pour les environnements gérés par OCI)

Configurer le client OpenAI

Lors de l'utilisation de l'authentification IAM, initialisez le client OpenAI avec un client HTTP personnalisé et un gestionnaire d'authentification. Dans ce cas, la valeur api_key est "not used".

Exemple : Développement local (OciSessionAuth)

Utilisez cette approche lorsque vous exécutez du code localement (par exemple, sur un ordinateur portable à l'aide d'un profil d'interface de ligne de commande OCI) :

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)

Exemple : environnements gérés par OCI (OciResourcePrincipalAuth)

Utilisez cette approche lorsque vous exécutez des services OCI tels qu'OCI Functions ou OCI 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()),
)

L'authentification OCI IAM permet à l'application d'accéder en toute sécurité à OCI Generative AI sans gérer les clés d'API, tout en s'alignant sur les pratiques de sécurité OCI standard.

Vérifier les autorisations requises

Avant d'appeler l'API OCI Responses, vérifiez que les stratégies IAM appropriées sont en place. Les stratégies requises dépendent de la méthode d'authentification utilisée.

Utilisation de l'authentification OCI IAM

Si vous avez ajouté les stratégies dans Prérequis : configuration des droits d'accès IAM, ignorez cette étape.

Pour autoriser un groupe d'utilisateurs à appeler l'API des réponses, ajoutez la stratégie suivante :

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

Si vous utilisez l'authentification par clé d'API d'IA générative

Lors de l'utilisation de l'authentification par clé d'API, une autre stratégie est requise pour autoriser les demandes effectuées avec la clé d'API. Si vous avez ajouté les stratégies dans 3. Ajouter un droit d'accès à la clé d'API, ignorez cette étape.

Pour accorder l'accès à une clé d'API spécifique, procédez comme suit :

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>'}

Pour un accès plus large (par exemple lors des tests), vous pouvez utiliser une stratégie plus générale :

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

Ces stratégies garantissent que les demandes, qu'elles soient authentifiées via IAM ou des clés d'API, sont autorisées à accéder aux ressources OCI Generative AI.

Activer le journal de débogage

Si vous rencontrez des problèmes lors de l'appel de l'API, l'activation de la journalisation du débogage peut vous aider à résoudre les problèmes. Les journaux de débogage affichent les demandes et réponses HTTP brutes, y compris le fichier opc-request-id, qui est utile lors de l'utilisation du support technique Oracle.

Vous pouvez référencer cet ID de demande lorsque vous signalez des problèmes afin d'identifier et de diagnostiquer plus rapidement les problèmes.

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

Modèles d'appel

Vous pouvez utiliser l'API OCI Responses pour appeler différents types de modèle disponibles dans les régions prises en charge par OCI Generative AI. Pour obtenir la liste des modèles et des régions pris en charge, reportez-vous à Modèles et régions d'agent.

Modèles hébergés tiers

OCI Generative AI fournit un accès aux modèles de fournisseurs tiers. Indiquez le modèle en utilisant son nom qualifié complet :

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."
)

Modèles à la demande

Les modèles à la demande sont hébergés et gérés par OCI et sont disponibles sans infrastructure dédiée :

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

Clusters d'IA dédiés (mode dédié)

Pour les charges de travail de production nécessitant une isolation ou des performances prévisibles, vous pouvez déployer des modèles sur un cluster d'IA dédié. Dans ce cas, utilisez l'OCID d'adresse de cluster comme identificateur de modèle :

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

Cette flexibilité vous permet de sélectionner le modèle de déploiement qui correspond le mieux à vos exigences en matière de performances, de coûts et de contrôle.

Réponses de flux

L'API OCI Responses prend en charge la transmission en continu, ce qui vous permet de recevoir les sorties de modèle de manière incrémentielle au fur et à mesure de leur génération. Cela peut améliorer la réactivité pour des sorties plus longues.

Diffuser tous les événements

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)

Sortie de texte de flux uniquement (jetons delta)

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)

Le streaming est particulièrement utile pour les applications interactives où vous souhaitez afficher les réponses aux utilisateurs au fur et à mesure de leur génération.

Sortie structurée

Dans certains cas d'utilisation, vous pouvez souhaiter que le modèle renvoie des réponses dans un format structuré au lieu d'un texte de forme libre. L'API OCI Responses le prend en charge en vous permettant de définir un schéma et d'analyser la sortie du modèle en objets fortement typés.

Cette approche est utile lors de l'intégration avec les systèmes en aval, de l'application de la cohérence ou de l'extraction de champs spécifiques à partir de la saisie du langage naturel.

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)

Trace des appels d'API

Lorsque vous appelez l'API OCI Responses, la réponse inclut un champ output. Ce champ est un tableau d'éléments qui décrivent ce qui s'est passé pendant la demande.

Chaque élément représente une étape de l'exécution et peut inclure différents types, tels que :

  • message
  • web_search_call
  • file_search_call
  • mcp_call
  • mcp_list_tools

Ces éléments de sortie fournissent une visibilité sur la façon dont la demande a été traitée. Vous pouvez les utiliser pour :

  • Déboguer et comprendre le comportement du modèle
  • Afficher les étapes d'exécution dans une interface utilisateur
  • Créez des workflows d'observabilité ou de journalisation personnalisés

Intégration aux outils d'observabilité 🔗

Pour obtenir des informations plus approfondies telles que la latence, les coûts et les traces d'exécution, vous pouvez intégrer l'API OCI Responses aux plates-formes d'observabilité.

De nombreux fournisseurs prennent en charge les API compatibles OpenAI. L'une de ces options est Langfuse, une plate-forme d'ingénierie LLM open source qui aide les développeurs à déboguer, surveiller et améliorer les applications LLM. Il fournit une observabilité de bout en bout pour le suivi des actions de l'agent, prend en charge la gestion des versions rapide et aide à l'évaluation des sorties du modèle. Langfuse s'intègre aux structures populaires telles qu'OpenAI, LangChain et LlamaIndex.

L'exemple suivant montre comment utiliser Langfuse pour suivre et surveiller les appels d'API Responses.

Etape 1 : installation du kit SDK Langfuse

pip install langfuse

Etape 2 : Configurer les variables d'environnement

Définissez les variables d'environnement Langfuse et OCI requises :

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"

Étape 3 : Instrumenter le client OpenAI

Importez le client OpenAI à partir du SDK Langfuse. Le code existant reste inchangé, mais les demandes sont automatiquement tracées.

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)

Cette intégration offre une visibilité de bout en bout sur les appels d'API sans nécessiter de modification importante du code de votre application.

Entrées multimodales

L'API OCI Responses prend en charge les modèles qui acceptent les entrées multimodales. Vous pouvez combiner du texte avec des images, des fichiers et des contrôles de raisonnement pour prendre en charge des flux de travail plus riches tels que l'analyse de documents, la compréhension d'images et des réponses de modèles plus délibérées.

Entrée d'image en tant qu'URL de données codées en Base64

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)

Saisie d'image en tant qu'URL accessible par Internet

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)

Remplacez "image_url" par une URL d'image valide.

Entrée de fichier en tant qu'ID de fichier

Important

L'ID de fichier en tant que fonction d'entrée n'est pris en charge qu'avec les modèles Google Gemini. Pour chaque demande, la taille combinée de tous les fichiers PDF chargés doit être inférieure à 50 Mo et vous pouvez fournir un maximum de 10 ID de fichier dans la demande. Reportez-vous à Modèles Gemini pris en charge.
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)

Entrée de fichier en tant qu'URL accessible par Internet

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)

Raisonnement

Les contrôles de raisonnement vous permettent de régler l'effort que le modèle utilise avant de produire une réponse. Ceci est utile lorsque vous souhaitez hiérarchiser la vitesse, la profondeur ou un équilibre des deux.

Effort de raisonnement

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)

Sortie de synthèse du raisonnement

Si vous créez un chatbot, l'activation de résumés de raisonnement peut aider les utilisateurs à mieux comprendre comment le modèle est arrivé à un résultat. Pendant la diffusion en continu, les utilisateurs peuvent également voir des jetons de raisonnement pendant que le modèle réfléchit.

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)

Outils de fonction

Les outils de fonction permettent au modèle de demander des données ou des actions à partir de l'application client au cours d'un flux de réponse. Cela est utile lorsque le modèle a besoin d'informations qui se trouvent en dehors de l'invite elle-même, telles que les données de calendrier, l'état de l'application interne ou le résultat d'une opération personnalisée.

Avec ce modèle, le modèle n'exécute pas la fonction directement. Au lieu de cela, il indique qu'une fonction doit être utilisée, que l'application client effectue ce travail, puis que l'application renvoie le résultat afin que le modèle puisse continuer et produire la réponse côté utilisateur.

Ce qui permet

Les outils de fonction sont utiles lorsque l'application doit garder le contrôle de l'exécution tout en permettant au modèle de décider quand des informations externes sont nécessaires.

Les cas d'emploi les plus courants sont :

  • Recherche d'événements de calendrier
  • Extraction des données d'application
  • Appel d'API internes ou externes
  • Exécuter une logique métier ou des calculs

Cette approche vous offre de la flexibilité tout en conservant le chemin d'exécution dans l'application.

Flux d'exécution 🔗

Une interaction type d'un outil fonctionnel fonctionne comme suit :

  1. Le client envoie une demande qui inclut une ou plusieurs définitions d'outil.
  2. Le modèle décide si l'un de ces outils est nécessaire.
  3. Si un outil est nécessaire, le modèle renvoie le nom et les arguments de l'outil.
  4. L'application exécute l'outil et prépare le résultat.
  5. L'application renvoie ce résultat dans une demande de suivi.
  6. Le modèle utilise ce résultat pour terminer la réponse.

Options de traitement d'état 🔗

Il existe deux façons courantes de gérer l'état de ces demandes :

  • Etat géré par le service : recommandé pour la plupart des cas d'utilisation. La demande de suivi inclut previous_response_id et le service suit l'échange précédent.
  • Etat géré par le client : l'application conserve l'historique complet des interactions et envoie le contexte cumulé à chaque demande.
Conseil

Gardez les définitions d'outils précises. Des noms clairs, des descriptions précises et des paramètres bien définis aident le modèle à sélectionner le bon outil et à générer des arguments utilisables.

Définir un outil de fonction

L'exemple suivant définit un outil qui extrait les événements de calendrier pour une date spécifiée.

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"],
        },
    },
]

Incluez ce tableau tools dans la demande client.responses.create().

Exemple : état géré par le service

Dans ce modèle, la première demande permet au modèle de décider si l'outil est nécessaire. La seconde demande renvoie le résultat de l'outil et référence la réponse précédente.

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)

Exemple : état géré par le service

Dans ce modèle, l'application conserve l'échange complet et le soumet à nouveau avec la demande de suivi.

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)

Les outils fonctionnels sont une option puissante lorsque l'application doit rester responsable de l'exécution, du contrôle d'accès et de la logique d'intégration, tout en permettant au modèle de demander les informations dont il a besoin.

Outil MCP

L'outil MCP permet à un modèle d'utiliser les fonctionnalités exposées par un serveur MCP distant lors d'une demande. Ces fonctionnalités peuvent inclure l'accès à des services externes, des sources de données ou des adresses d'application.

Dans OCI Generative AI, cette fonctionnalité est disponible via un appel MCP distant, qui permet au service d'interagir avec un serveur MCP dans le cadre du workflow de modèle.

Quand utiliser l'outil MCP

Utilisez l'outil MCP lorsque le modèle a besoin d'accéder à des fonctionnalités externes hébergées sur un serveur MCP.

Cette approche est utile lorsque vous voulez :

  • Le service pour communiquer directement avec le serveur MCP
  • Moins d'étapes d'orchestration côté client
  • Latence plus faible qu'un modèle d'outil exécuté par le client
  • Accès aux fonctionnalités exposées via un serveur MCP distant

L'outil MCP fait partie de l'ensemble d'outils OCI Generative AI et peut être utilisé avec d'autres outils pris en charge.

Soutien au transport

L'appel MCP distant utilise le HTTP Streamable.

Définition d'un outil MCP

Ajoutez la définition du serveur MCP dans le champ tools de la demande.

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)

Cet exemple transmet la réponse et imprime le texte au fur et à mesure qu'il est généré.

Limitation des outils exposés par le serveur MCP

Si le serveur MCP distant affiche plus d'outils que nécessaire pour l'application, vous pouvez affiner l'ensemble disponible à l'aide de 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,
)

Authentification du serveur MCP

Si le serveur MCP distant nécessite une authentification, transmettez le jeton d'accès dans le champ 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,
)

Transmettez uniquement la valeur de jeton. N'incluez pas le préfixe Bearer. OCI envoie le jeton via TLS dans le cadre de la demande et ne le décode pas, ne l'inspecte pas, ne le stocke pas et ne le consigne pas.

Hébergement de serveur MCP

OCI Generative AI fournit également un hébergement de serveur MCP pour aider à déployer et à faire évoluer les serveurs MCP.

L'outil MCP est une bonne option lorsque vous souhaitez qu'OCI Generative AI fonctionne directement avec un serveur MCP distant lors de l'exécution de la demande, sans nécessiter que l'application client gère chaque étape de l'outil elle-même.

Interpréteur de code

L'interpréteur de code permet au modèle d'écrire et d'exécuter du code Python dans un conteneur sécurisé. Cela est utile pour des tâches telles que les calculs, l'analyse des données et le traitement des fichiers.

Dans les invites, vous pouvez appeler l'outil Interpréteur de code en tant qu'outil python. Par exemple : Utilisez l'outil python pour résoudre le problème.

Etant donné que le code s'exécute dans un environnement isolé sans accès au réseau externe, il s'agit d'une bonne option pour les tâches nécessitant un calcul ou un traitement de fichier dans un paramètre contrôlé.

Pour quoi l'utiliser

Si vous l'utilisez pour la première fois, il est utile de penser à Code Interpreter comme un espace de travail Python temporaire pour le modèle.

Vous pouvez l'utiliser pour des tâches telles que :

  • résolution de problèmes mathématiques
  • analyse des fichiers téléchargés
  • nettoyage ou transformation de données
  • création de graphiques ou de tableaux
  • génération de fichiers de sortie tels que des journaux ou des jeux de données traités

Environnement d'exécution

L'environnement Python comprend plus de 420 bibliothèques préinstallées, de nombreuses tâches courantes fonctionnent sans configuration supplémentaire.

Le code est exécuté dans un conteneur. Ce conteneur est l'environnement de travail où Python est exécuté et où les fichiers sont stockés pendant la session.

Limites de mémoire du conteneur

Les conteneurs d'interpréteur de code utilisent un pool de mémoire partagée de 64 Go par location.

Les tailles de conteneur prises en charge sont les suivantes :

  • 1 Go
  • 4 Go
  • 16 Go
  • 64 Go

Cette limite partagée peut être divisée entre plusieurs conteneurs. Par exemple, il peut prendre en charge :

  • soixante-quatre conteneurs de 1 Go
  • seize conteneurs de 4 Go
  • quatre conteneurs de 16 Go
  • un conteneur de 64 Go

Si vous avez besoin de plus de capacité, vous pouvez soumettre une demande de service.

Expiration du conteneur

Un conteneur expire après 20 minutes d'inactivité.

Ceci est important à savoir lors de la création de flux à plusieurs étapes :

  • un conteneur expiré ne peut pas être réutilisé
  • vous devez créer un conteneur
  • les fichiers doivent être chargés à nouveau si nécessaire
  • L'état en mémoire, comme les variables Python, est perdu

Pour cette raison, il est préférable de traiter les conteneurs comme des environnements de travail temporaires.

Exemple

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)

Conteneurs pour l'interprète de code

L'interpréteur de code a besoin d'un conteneur. Le conteneur est l'environnement isolé où le modèle exécute du code Python.

Un conteneur peut contenir :

  • fichiers téléchargés
  • fichiers créés par le modèle
  • données de travail temporaires pendant l'exécution

Lorsque vous utilisez l'interpréteur de code, vous pouvez affecter l'un des deux modes de conteneur suivants :

  • auto : OCI Generative AI crée le conteneur pour vous et affecte automatiquement une taille de conteneur.
  • OCID de conteneur : vous créez le conteneur vous-même, définissez la taille du conteneur et fournissez l'OCID.

Pour les deux options, les conteneurs sont créés et gérés dans OCI Generative AI. Le code qui s'exécute dans ces conteneurs s'exécute également dans la location OCI Generative AI.

Mode automatique

En mode automatique, le service crée le conteneur pour vous. C'est l'option la plus simple et un bon point de départ pour la plupart des utilisateurs.

Utiliser le mode automatique lorsque :

  • vous voulez qu'OCI Generative AI gère le conteneur
  • vous n'avez pas besoin de contrôle direct sur l'environnement
  • vous voulez une configuration plus simple
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."
)

Mode explicite

En mode explicite, vous créez d'abord le conteneur et définissez sa taille. Ensuite, vous transmettez l'ID de conteneur dans la demande.

Utilisez le mode explicite lorsque vous souhaitez plus de contrôle sur les spécificités du conteneur, telles que la taille de la mémoire.

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)

Fichiers dans l'interpréteur de code

L'interpréteur de code peut utiliser des fichiers pendant la durée de vie du conteneur. Le modèle peut lire les fichiers que vous fournissez et peut également créer de nouveaux fichiers.

Cela est utile pour les workflows tels que :

  • lecture d'un fichier CSV ou PDF
  • génération d'un graphique
  • enregistrement de la sortie traitée
  • création de journaux ou de rapports

Persistance des fichiers 🔗

Les fichiers créés ou modifiés par l'outil python restent disponibles dans le même conteneur tant que le conteneur n'a pas expiré.

Cela signifie que le modèle peut s'appuyer sur les travaux antérieurs de la même session. Par exemple, il peut :

  1. lire un fichier
  2. l'analyser
  3. enregistrer un graphique
  4. utiliser ce graphique ultérieurement dans le même conteneur

Lorsque le conteneur expire, cet état n'est plus disponible.

Téléchargement et gestion de fichiers 🔗

Vous pouvez gérer les fichiers conteneur via les API de fichier conteneur.

Les opérations courantes sont les suivantes :

  • Créer un fichier conteneur : ajoutez un fichier au conteneur.
  • Liste des fichiers de conteneur : visualisez les fichiers dans le conteneur.
  • Supprimer un fichier conteneur : enlever un fichier
  • Extraire le contenu du fichier conteneur : téléchargez un fichier à partir du conteneur.

Vous pouvez ainsi utiliser le conteneur en tant qu'espace de travail temporaire pour l'exécution de code basé sur un modèle.

Fichiers de sortie et citations 🔗

Lorsque le modèle crée des fichiers, ces fichiers sont stockés dans le conteneur et peuvent être référencés dans la réponse.

Ces références incluent :

  • container_id
  • file_id
  • filename

Vous pouvez utiliser ces valeurs pour extraire le contenu du fichier généré.

L'API des réponses OCI prend en charge les adresses compatibles OpenAI pour des fonctionnalités telles que les réponses, les fichiers, les conteneurs et les fichiers de conteneur. Pour cette raison, la documentation OpenAI associée peut être utilisée comme référence pour la structure des demandes, les formats de réponse et les workflows généraux. Toutefois, lorsque vous utilisez ces API avec OCI, envoyez des demandes aux adresses d'inférence OCI Generative AI, utilisez l'authentification OCI et notez que les ressources et l'exécution restent dans OCI Generative AI, et non dans une location OpenAI.

Remarque

L'API des réponses OCI prend en charge les adresses compatibles OpenAI pour des fonctionnalités telles que les réponses, les fichiers, les conteneurs et les fichiers de conteneur. Pour cette raison, la documentation OpenAI associée peut être utilisée comme référence pour la structure des demandes, les formats de réponse et les workflows généraux. Toutefois, lorsque vous utilisez ces API avec OCI, envoyez des demandes aux adresses d'inférence OCI Generative AI, utilisez l'authentification OCI et les ressources et l'exécution restent dans OCI Generative AI, et non dans une location OpenAI. Reportez-vous à Adresses disponibles pour obtenir l'URL de base et les adresses prises en charge.

Référence OpenAI

Outil NL2SQL

L'outil NL2SQL aide les agents d'IA d'entreprise à transformer le langage naturel en langage SQL validé. Il est conçu pour interroger les données d'entreprise fédérées sans déplacer ni dupliquer les données sous-jacentes.

NL2SQL mappe le langage métier avec des champs, des tables et des jointures de base de données via une couche d'enrichissement sémantique. L'outil génère uniquement du code SQL. Il n'exécute pas la requête elle-même.

L'exécution des requêtes est gérée séparément par le serveur DBTools MCP. Ce serveur appelle le service NL2SQL pour générer du code SQL, puis autorise et exécute la requête sur la base de données source à l'aide de l'identité de l'utilisateur final et des garde-fous appropriés.

Pour utiliser NL2SQL, créez une ressource de banque sémantique OCI. Une banque sémantique est soutenue par une banque de vecteurs avec des données structurées et comprend deux connexions DBTools :

  • Connexion d'enrichissement
  • Connexion de requête

Lors de la configuration, vous sélectionnez les options suivantes lors de l'exécution de l'enrichissement :

  • Lors de la création : l'enrichissement démarre automatiquement après la création de la banque sémantique
  • Manuel : l'enrichissement est déclenché ultérieurement via un appel d'API

Le processus d'enrichissement lit les métadonnées de schéma telles que les tables et les colonnes de la base de données connectée. Ces métadonnées sont ensuite utilisées pour générer des instructions SQL plus précises.

Une fois l'enrichissement terminé, vous pouvez appeler l'API GenerateSqlFromNl pour convertir l'entrée en langage naturel en code SQL.

Prérequis

Avant d'utiliser l'outil NL2SQL, commencez par créer une base de données et configurez les connexions de base de données requises.

Pour plus d'informations, reportez-vous à :

Autorisations pour les magasins sémantiques

Afin d'utiliser des données structurées pour l'interrogation NL2SQL et tenant compte des schémas, configurez les stratégies IAM requises avant de créer la banque sémantique.

Accès aux clés secrètes

Autorisez le groupe à lire les clés secrètes utilisées par Database Tools :

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

Accès aux connexions Database Tools

Autorisez le groupe à accéder aux ressources Database Tools requises :

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'}

Accès aux sources Generative AI

Si la stratégie plus large ci-dessous est déjà en place, elle inclut l'accès aux ressources de magasin sémantique :

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

Si vous souhaitez un accès plus restreint, utilisez plutôt la stratégie suivante pour autoriser le groupe à créer et à gérer des magasins sémantiques :

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

Si le groupe n'a besoin que d'utiliser une banque sémantique existante et d'appeler NL2SQL, utilisez les stratégies plus spécifiques suivantes :

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>

Créer un magasin sémantique

Une banque sémantique est une banque de vecteurs avec des données structurées pointant vers une base de données. Cette tâche décrit les étapes de création d'une banque de vecteurs avec des données structurées à l'aide de la console Oracle Cloud.

Conseil

Après avoir créé une banque de vecteurs, vous pouvez afficher ses détails et effectuer d'autres tâches, telles que sa mise à jour ou sa suppression. Utilisez le menu Actions (trois points) de la console pour accéder à ces tâches.

Pour créer une banque de vecteurs, dans la page de liste, sélectionnez Créer une banque de vecteurs. Si vous avez besoin d'aide pour trouver la page de liste, reportez-vous à Liste des magasins de vecteurs.

Informations de base

  1. Entrez le nom de la banque de vecteurs.
    Commencez le nom par une lettre ou un tiret de soulignement, suivi de lettres, de chiffres, de traits d'union ou de trait de soulignement. La longueur peut être comprise entre 1 et 255 caractères.
  2. (Facultatif) Entrez la description de la banque de vecteurs.
  3. Sélectionnez le compartiment dans lequel créer la banque de vecteurs. Le compartiment par défaut est celui de la page de liste, mais vous pouvez sélectionner n'importe quel compartiment dans laquelle vous êtes autorisé à travailler.

Type d'origine des données

Sélectionnez Données structurées. Cette option crée un emplacement de stockage sémantique pour les requêtes NL2SQL et sensibles au schéma.

Données structurées

  1. Sous Configurer le connecteur de synchronisation, sélectionnez un type de connexion.

    Valeur autorisée : Outil OCI Database.

  2. Entrez l'ID de connexion d'enrichissement, puis sélectionnez Tester la connexion d'enrichissement pour vérifier l'accès.
  3. Entrez l'ID de connexion de requête, puis sélectionnez Tester la connexion de requête pour vérifier l'accès.
  4. Dans Schémas, indiquez les noms de schéma de base de données à inclure pour NL2SQL et les requêtes tenant compte des schémas.

API de stockage sémantique

Vous pouvez gérer les banques sémantiques à l'aide de l'API suivante :

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

Pour la gestion des travaux d'enrichissement, l'API suivante est également disponible :

  • ListEnrichmentJobs
  • GetEnrichmentJob
  • GenerateEnrichmentJob
  • CancelEnrichmentJob

Exemple : création et gestion d'une banque sémantique avec 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)

Exemple : appel de l'API NL2SQL

Une fois la banque sémantique prête et l'enrichissement terminé, vous pouvez appeler l'API NL2SQL pour générer du code SQL à partir du langage naturel.

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

Conversations à rotation multiple

OCI Generative AI prend en charge les interactions multi-tours, de sorte que vous pouvez créer des applications qui gardent le contexte lors de la rotation des utilisateurs.

Pour ce faire, vous pouvez utiliser les méthodes suivantes :

  • Chaîne de réponses
  • API de conversations

Chaînage de réponses

Avec le chaînage des réponses, chaque nouvelle réponse pointe vers la précédente. Il s'agit d'une option simple lorsque vous voulez reporter le contexte sans créer explicitement de ressource de conversation.

# 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 de conversations

Avec l'API Conversations, vous créez d'abord une conversation, puis vous associez des réponses à cette conversation. Cela est utile lorsque vous voulez un objet de conversation dédié qui peut être réutilisé sur plusieurs virages.
# 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)