Détecter des modèles à l'aide de la trousse SDK Python et de l'API REST

Explorez le catalogue de modèles du service d'intelligence artificielle générative pour OCI, filtrez les modèles pour votre application et inspectez les métadonnées de modèle avec des demandes de trousse SDK Python et REST signées.

Aperçu

L'API de détection de modèle regroupe les identificateurs de modèle, les fonctions, la compatibilité d'API, les paramètres de configuration et la disponibilité régionale. Utilisez ces métadonnées pour choisir des modèles pour un assistant de clavardage, une application de recherche ou un flux de travail multimodal avant d'écrire une demande d'inférence.

Les applications peuvent interroger le catalogue pour créer des interfaces de sélection de modèle et actualiser les choix disponibles. Les informations sur le cycle de vie régional vous aident à planifier les mises à niveau et à évaluer les remplacements déclarés.

MétadonnéesCe qu'il rapporteUtilisation
Identité et fournisseurcodes de modèles et données sur les fournisseurs;Recherchez un fournisseur et copiez un code de modèle exact.
Tâches et modalitésModéliser les capacités et les types d'entrée-sortie pris en charge.Identifier les candidats pour le clavardage, les intégrations, le reclassement ou les flux de travail multimodaux.
Compatibilité d'API avec APICapacités d'API d'inférence signalées pour le modèle.Sélectionnez une API prise en charge par le modèle.
Disponibilité régionaleDomaines, régions et modes de service sur demande ou dédiés.Recherchez des candidats pour votre emplacement de déploiement et votre mode de service.
Accès hébergé ou par mandataireClassification d'accès du modèle.Consultez la documentation appropriée sur le déploiement et le traitement des données.
ParamètresNoms, types, intervalles, valeurs par défaut et descriptions déclarés.Créez des formulaires de configuration et vérifiez les paramètres par rapport aux métadonnées retournées.
Cycle de vieDates d'abandon et de mise hors service par région et mode de service, plus remplacements lorsqu'ils sont fournis.Identifier les déploiements affectés et évaluer les candidats à la migration.
FiltresID modèle, domaine, région, capacité, capacité d'API, mode de service, type d'accès et statut du cycle de vie.Créez un sélecteur de modèle ciblé ou automatisez les recherches dans le catalogue.

Les modèles individuels peuvent ne pas alimenter tous les champs. La fonction Détection vous aide à sélectionner et à configurer des modèles. Il n'appelle pas d'inférence, n'accorde pas d'accès ou n'établit pas de référence pour la qualité du modèle. Valider un modèle sélectionné et tout remplacement suggéré par la charge de travail de votre application.

Dans ce tutoriel, vous apprendrez à vous authentifier au moyen d'une session OCI IAM, à repérer les interrogations au moyen de la trousse SDK Python, à envoyer la même demande au moyen de REST et à essayer dix exemples pratiques. Vous apprendrez également à lister les modèles déjà importés dans votre compartiment.

Note

L'opération est ListModelDiscovery. Il est distinct de list_models(), list_imported_models() et du point d'extrémité /models compatible avec OpenAI. L'envoi d'une demande de détection à Chicago ne limite pas les résultats du catalogue à Chicago. Utilisez un filtre region pour sélectionner la région de catalogue.

Avant de commencer

Pour terminer ce tutoriel, vous devez :

  • Un compte OCI et un compartiment où vous pouvez inspecter les modèles. ListModelDiscovery requiert GENERATIVE_AI_MODEL_INSPECT. Voir Autorisations de modèle.
  • Pour les exemples de modèle importé, autorisation d'inspecter les modèles importés dans le compartiment sélectionné et ressource importée existante à rechercher. Voir Autorisations de modèle importées.
  • Python 3.11 ou version ultérieure, uv et une interface de ligne de commande OCI installée. Les commandes utilisent un interpréteur de commandes compatible Bash sur macOS, Linux ou Windows Subsystem pour Linux.
  • Navigateur pour l'authentification de session de l'interface de ligne de commande OCI et l'accès au point d'extrémité du service. Ces exemples utilisent le Midwest américain (Chicago) dans le domaine commercial OC1.

Les exemples utilisent la signature de demande OCI IAM avec un jeton de session et sa clé privée. Une clé d'API du service d'intelligence artificielle générative pour OCI est une donnée d'identification distincte et ne remplace pas le signataire utilisé ici.

1. Préparer l'environnement et se connecter

  1. Créez et activez un environnement virtuel Python, puis installez les ensembles :
    uv venv --python 3.11 .venv
    source .venv/bin/activate
    uv pip install --upgrade oci requests

    Si l'environnement existe déjà, activez-le avant d'installer ou de mettre à niveau les ensembles.

  2. Vérifiez que la trousse SDK installée fournit la méthode de détection et que l'interface de ligne de commande OCI est disponible :
    python -c 'import oci; print(oci.__version__); print(hasattr(oci.generative_ai.GenerativeAiClient, "list_model_discovery"))'
    oci --version

    La vérification de la méthode doit imprimer True. Si elle imprime False, installez une version de trousse SDK qui inclut list_model_discovery.

  3. Définissez l'exemple de profil, de région de point d'extrémité et de compartiment pour cet interpréteur de commandes :
    export OCI_DISCOVERY_PROFILE=GENAI_DISCOVERY
    export OCI_DISCOVERY_REGION=us-chicago-1
    export OCI_COMPARTMENT_ID='<your-compartment-ocid>'

    Remplacez le paramètre fictif du compartiment par un compartiment auquel vous pouvez accéder. GENAI_DISCOVERY est l'exemple de nom de profil. Les scripts lisent ces variables d'environnement sans utiliser de compartiment par défaut.

  4. Créez une session d'interface de ligne de commande et terminez la connexion au navigateur :
    oci session authenticate \
      --profile-name "$OCI_DISCOVERY_PROFILE" \
      --region "$OCI_DISCOVERY_REGION"

    L'interface de ligne de commande stocke le profil dans ~/.oci/config. Les exemples Python chargent le jeton de session et la clé privée du profil avec SecurityTokenSigner. À l'expiration de la session, authentifiez-vous à nouveau et redémarrez le script ou la session Python interactive. Voir authentification basée sur un jeton pour l'interface de ligne de commande.

2. Détection d'interrogation avec la trousse SDK Python

Cet exemple montre comment rechercher les modèles de clavardage sur demande courants dans la région sélectionnée. Il suit la pagination et imprime les ID de modèle, les fournisseurs et les capacités. Les fonctions d'aide sont réutilisées dans des exemples ultérieurs.

  1. Enregistrez le code suivant sous le nom model_discovery.py dans votre répertoire de travail :
    """Query OCI Generative AI model metadata with an IAM session."""
    
    import os
    import re
    import unicodedata
    from pathlib import Path
    
    import oci
    
    
    def load_session():
        config = oci.config.from_file(
            profile_name=os.environ["OCI_DISCOVERY_PROFILE"]
        )
        config["region"] = os.environ["OCI_DISCOVERY_REGION"]
        token = Path(config["security_token_file"]).expanduser().read_text(
            encoding="utf-8"
        ).strip()
        private_key = oci.signer.load_private_key_from_file(
            str(Path(config["key_file"]).expanduser()),
            config.get("pass_phrase"),
        )
        signer = oci.auth.signers.SecurityTokenSigner(token, private_key)
        return config, signer
    
    
    def make_client():
        config, signer = load_session()
        return oci.generative_ai.GenerativeAiClient(config, signer=signer)
    
    
    def fetch_models(client, compartment_id, source="discovery", **filters):
        if source not in {"discovery", "imported"}:
            raise ValueError("source must be discovery or imported")
        operation = (
            client.list_model_discovery
            if source == "discovery"
            else client.list_imported_models
        )
        items = []
        while True:
            response = operation(compartment_id=compartment_id, **filters)
            items.extend(oci.util.to_dict(response.data)["items"])
            next_page = response.headers.get("opc-next-page")
            if not next_page:
                return items
            filters["page"] = next_page
    
    
    def normalized(value):
        value = unicodedata.normalize("NFKC", str(value)).casefold()
        return " ".join(re.findall(r"[^\W\d_]+|\d+", value))
    
    
    def search_models(models, query):
        terms = [normalized(term) for term in query.split()]
        terms = [term for term in terms if term]
    
        def matches(model):
            values = [
                model.get(field)
                for field in ("model_id", "id", "display_name", "vendor", "version")
            ]
            values.extend(
                value for value in (model.get("data_source") or {}).values()
                if isinstance(value, str)
            )
            candidates = [normalized(value) for value in values if value]
            return all(
                any(
                    re.search(
                        (r"(?<!\d)" if term[0].isdigit() else "")
                        + re.escape(term),
                        value,
                    )
                    for value in candidates
                )
                for term in terms
            )
    
        return [model for model in models if matches(model)]
    
    
    def show(models):
        print(f"{len(models)} matching model(s)")
        for model in models:
            name = (
                model.get("model_id")
                or model.get("display_name")
                or model.get("id")
            )
            capabilities = ", ".join(model.get("capabilities") or [])
            vendor = model.get("vendor") or "not reported"
            print(f"{name} | vendor={vendor} | capabilities={capabilities}")
    
    
    if __name__ == "__main__":
        client = make_client()
        models = fetch_models(
            client,
            os.environ["OCI_COMPARTMENT_ID"],
            region=[os.environ["OCI_DISCOVERY_REGION"]],
            capability=["CHAT"],
            serving_mode=["ON_DEMAND"],
            is_deprecated=False,
            is_on_demand_retired=False,
        )
        show(models)
  2. Exécutez le script dans l'environnement activé :
    python model_discovery.py
  3. Vérifiez les modèles correspondants et copiez un identificateur à inspecter.

    Les résultats dépendent du catalogue courant et de vos filtres. Un résultat vide n'est pas un test d'authentification ou la preuve qu'un modèle ne peut pas être importé.

    La trousse SDK extrait son point d'extrémité de gestion de config["region"]. L'argument region=[...] distinct filtre la disponibilité du catalogue. Aucune des valeurs ne configure un point d'extrémité d'inférence.

    Pour plus de détails sur les méthodes, consultez GenerativeAiClient.list_model_discovery.

Vous disposez d'une interrogation de détection paginée et de fonctions réutilisables pour la recherche locale et l'inventaire de modèles importés.

3. Appeler directement l'API REST de détection

Une demande directe expose la méthode HTTP, le chemin, les paramètres d'interrogation et les en-têtes de réponse. Il appelle la même opération de détection que la trousse SDK. La demande nécessite toujours l'autorisation du service OCI IAM.

GET /20231130/modelDiscovery?compartmentId=<your-compartment-ocid>
  1. Définissez le point d'extrémité de gestion public de Chicago :
    export OCI_DISCOVERY_ENDPOINT=https://generativeai.us-chicago-1.oci.oraclecloud.com

    Cet exemple utilise le point d'extrémité OC1 Chicago. Pour une autre région ou un autre domaine, utilisez le point d'extrémité de gestion approprié dans la référence d'API et mettez à jour OCI_DISCOVERY_REGION pour le filtre de catalogue. Discovery utilise l'API de gestion et non une URL d'inférence de clavardage.

  2. Envoyer une demande signée avec l'interface de ligne de commande OCI :
    oci raw-request \
      --profile "$OCI_DISCOVERY_PROFILE" \
      --auth security_token \
      --http-method GET \
      --target-uri "${OCI_DISCOVERY_ENDPOINT}/20231130/modelDiscovery?compartmentId=${OCI_COMPARTMENT_ID}&region=${OCI_DISCOVERY_REGION}&capability=CHAT&servingMode=ON_DEMAND&isDeprecated=false&isOnDemandRetired=false"

    L'interface de ligne de commande signe la demande et affiche la réponse. Pour extraire une autre page, transmettez la valeur opc-next-page retournée en tant que paramètre d'interrogation page encodé en URL. L'exemple Python ci-dessous suit automatiquement la pagination.

  3. Enregistrez le code suivant sous le nom model_discovery_rest.py aux côtés de model_discovery.py :

    Le script importe l'assistant de signature de session à partir de l'exemple de trousse SDK. Il envoie des demandes HTTP au moyen de requests et imprime le statut et les ID demande à une erreur standard.

    """Call Model Discovery over HTTP with OCI request signing."""
    
    import os
    import sys
    
    import requests
    
    from model_discovery import load_session
    
    
    def fetch_rest_models(signer, endpoint, compartment_id, region):
        url = endpoint.rstrip("/") + "/20231130/modelDiscovery"
        params = {
            "compartmentId": compartment_id,
            "region": [region],
            "capability": ["CHAT"],
            "servingMode": ["ON_DEMAND"],
            "isDeprecated": "false",
            "isOnDemandRetired": "false",
        }
        items = []
        while True:
            response = requests.get(
                url,
                params=params,
                headers={"Accept": "application/json"},
                auth=signer,
                timeout=(10, 30),
                allow_redirects=False,
            )
            request_id = response.headers.get("opc-request-id", "not reported")
            print(
                f"HTTP {response.status_code} | request ID: {request_id}",
                file=sys.stderr,
            )
            if 300 <= response.status_code < 400:
                raise RuntimeError("Check the service endpoint. Redirect not followed.")
            response.raise_for_status()
            items.extend(response.json()["items"])
            next_page = response.headers.get("opc-next-page")
            if not next_page:
                return items
            params["page"] = next_page
    
    
    if __name__ == "__main__":
        _, signer = load_session()
        models = fetch_rest_models(
            signer,
            os.environ["OCI_DISCOVERY_ENDPOINT"],
            os.environ["OCI_COMPARTMENT_ID"],
            os.environ["OCI_DISCOVERY_REGION"],
        )
        print(f"{len(models)} matching model(s)")
        for model in models:
            print(f"{model['modelId']} | vendor={model.get('vendor') or 'not reported'}")
  4. Exécutez l'exemple REST :
    python model_discovery_rest.py
  5. Comparez les identificateurs de modèle aux résultats de la trousse SDK.

    Utilisez les mêmes profil, compartiment, région de point d'extrémité et filtres pour la comparaison. Les résultats peuvent changer au fur et à mesure que le catalogue change.

    Les champs de réponse REST utilisent camelCase, par exemple modelId. La sortie oci.util.to_dict() de la trousse SDK utilise snake_case, par exemple model_id. Pour les filtres REST évalués par liste, répétez la clé d'interrogation, par exemple region=us-chicago-1&region=us-ashburn-1. L'ensemble requests encode les listes dans params de cette façon.

4. Préparer les exemples pratiques

  1. Enregistrez cette configuration sous le nom model_discovery_recipes.py aux côtés de model_discovery.py :
    import json
    import os
    from collections import Counter
    from pathlib import Path
    
    from model_discovery import fetch_models, make_client, search_models, show
    
    client = make_client()
    compartment_id = os.environ["OCI_COMPARTMENT_ID"]
    region = os.environ["OCI_DISCOVERY_REGION"]
    
    
    def fetch(source="discovery", **filters):
        return fetch_models(client, compartment_id, source=source, **filters)
  2. Démarrez Python avec la configuration chargée :
    python -i model_discovery_recipes.py

    L'option -i maintient Python ouvert. Exécutez un exemple dans les sections suivantes de cette session. Vous pouvez également ajouter un exemple au fichier de configuration et l'exécuter sans -i.

Sélectionner des filtres dans le catalogue retourné

Avant de sélectionner des filtres, inspectez les valeurs déclarées pour les modèles de votre région :

catalog = fetch(region=[region])
for field in ("capabilities", "api_capability", "model_access", "vendor"):
    counts = Counter()
    for model in catalog:
        values = model.get(field) or []
        if isinstance(values, str):
            values = [values]
        counts.update(set(values))
    print(field, dict(sorted(counts.items())))

for field in ("realm", "region", "serving_modes"):
    counts = Counter()
    for model in catalog:
        values = set()
        for availability in model.get("availability") or []:
            value = availability.get(field)
            if isinstance(value, list):
                values.update(value)
            elif value:
                values.add(value)
        counts.update(values)
    print(field, dict(sorted(counts.items())))

Chaque nombre correspond au nombre d'entrées de modèle retournées associées à une valeur. Un modèle peut contribuer à plusieurs valeurs de capacité ou de disponibilité. Les comptages reflètent les filtres d'interrogation.

Argument de trousse SDKExemple ou objectif
region, realmListe des identificateurs de région ou des valeurs de domaine. Utiliser les valeurs déclarées par le catalogue.
model_idUn identifiant de modèle exact.
capabilityListe telle que ["CHAT"], ["TEXT_EMBEDDINGS"] ou ["TEXT_RERANK"].
api_capabilityListe des identificateurs d'API signalés par le catalogue.
serving_mode["ON_DEMAND"] ou ["DEDICATED"].
model_access["HOSTED"] ou ["PROXY"].
is_deprecatedFalse exclut les modèles obsolètes.
is_on_demand_retired, is_dedicated_retiredUtilisez False pour le mode de service dont vous voulez exclure les modèles retirés.
page, limitJeton de pagination et taille de page demandée. L'exemple suit opc-next-page jusqu'à ce que toutes les pages soient extraites.

Utilisez search_models() pour la mise en correspondance de sous-chaîne locale après l'extraction de toutes les pages. La recherche n'est pas un paramètre de ListModelDiscovery. Consultez les références d'opération pour obtenir le vocabulaire de filtre complet.

Dix exemples Python pratiques

1. Parcourir les modèles des deux modes de service

Filtrer par région de déploiement prévue. L'omission de serving_mode rend les modèles sur demande et dédiés admissibles.

catalog = fetch(region=[region])
show(catalog)

2. Rechercher des modèles par nom partiel ou fournisseur

Recherchez les métadonnées retournées localement. Chaque terme séparé par des espaces doit correspondre à un champ interrogeable. L'appariement ignore la casse et la ponctuation. Le filtre model_id du service nécessite un identificateur exact.

catalog = fetch(region=[region])
show(search_models(catalog, "grok"))

Remplacez le terme de recherche par un fournisseur ou une famille de modèles dans vos résultats.

3. Rechercher les modèles de clavardage sur demande courants

Exclure les modèles obsolètes et les modèles mis hors service pour les services sur demande.

show(fetch(
    region=[region],
    capability=["CHAT"],
    serving_mode=["ON_DEMAND"],
    is_deprecated=False,
    is_on_demand_retired=False,
))

4. Trouver des modèles pour un service dédié

Appliquez le filtre de mise hors service pour le service dédié. Cette interrogation recherche dans le catalogue d'exploration. Pour lister les ressources que vous avez importées, utilisez l'exemple 8.

show(fetch(
    region=[region],
    serving_mode=["DEDICATED"],
    is_deprecated=False,
    is_dedicated_retired=False,
))

5. Rechercher des modèles d'intégration et de reclassement

Interrogez chaque fonction séparément. La détection utilise TEXT_EMBEDDINGS et TEXT_RERANK. Les ressources du modèle importé utilisent un vocabulaire de capacité différent, y compris EMBEDDING et RERANK.

for capability in ("TEXT_EMBEDDINGS", "TEXT_RERANK"):
    print("\nCapability:", capability)
    show(fetch(region=[region], capability=[capability]))

6. Rechercher des modèles mandataires avec une capacité d'API déclarée

Lisez les identificateurs d'API retournés par le catalogue, puis copiez une valeur pour filtrer les modèles mandataires. Consultez les notes d'appel externe et le traitement des données pour un modèle sélectionné.

catalog = fetch(region=[region], model_access=["PROXY"])
api_values = sorted({
    api for model in catalog for api in model.get("api_capability") or []
})
print(api_values)
if api_values:
    api = input("Enter an API capability from the list: ").strip()
    if api in api_values:
        show(fetch(
            region=[region],
            model_access=["PROXY"],
            api_capability=[api],
        ))
    else:
        print("Enter an exact value from the returned list.")
else:
    print("No API capabilities were reported for these results.")

7. Inspecter les paramètres du modèle et les détails du cycle de vie

Copiez un identificateur de modèle exact à partir de vos résultats. Inspectez les entrées de disponibilité complètes pour conserver chaque région associée à ses modes de service, à ses dates de cycle de vie et aux remplacements déclarés.

model_id = input("Enter an exact model ID from your results: ").strip()
for model in fetch(model_id=model_id):
    print(model["model_id"])
    for field in (
        "api_capability", "modality_support", "parameters", "availability"
    ):
        print(field)
        print(json.dumps(model.get(field), indent=2, default=str))

Un champ peut être vide ou non déclaré. Évaluez tout remplacement suggéré avec votre application avant la migration.

8. Trouver un modèle Qwen importé

Utilisez source="imported" pour interroger les importations existantes dans votre compartiment et votre région client. Cet exemple recherche un modèle Qwen 3.6 35B. Il retourne une correspondance uniquement si vous avez importé un modèle correspondant et que vous pouvez inspecter cette ressource. Voir Modèles Qwen 3.6 compatibles pour la compatibilité avec l'importation.

imports = fetch(source="imported")
selected = search_models(imports, "qwen 3.6 35B")
show(selected)
for model in selected:
    print("Imported resource OCID:", model["id"])
    print("Resource state:", model.get("lifecycle_state"))

L'OCID retourné identifie la ressource de modèle importée. Un état de ressource ACTIVE n'établit pas qu'un point d'extrémité d'inférence a été déployé. Pour les étapes de déploiement, voir Gestion des modèles importés.

9. Comparer la détection aux ressources importées

Comparez les deux sources lorsqu'un modèle apparaît dans les stocks importés mais pas dans la détection. Les résultats de la détection et les ressources importées dans votre compartiment répondent à différentes questions.

print("Discovery catalog for the selected region:")
show(search_models(fetch(region=[region]), "qwen"))
print("\nImported resources in this compartment and client region:")
show(search_models(fetch(source="imported"), "qwen"))

Si les résultats importés sont vides, vérifiez le compartiment, la région du client et les autorisations. L'interrogation du modèle importé ne balaie pas d'autres compartiments ou régions.

10. Exporter les modèles importés correspondants

Écrivez les métadonnées complètes des ressources importées sélectionnées dans un fichier JSON local.

selected = search_models(fetch(source="imported"), "qwen 3.6 35B")
Path("qwen-imports.json").write_text(
    json.dumps({"items": selected}, indent=2, default=str),
    encoding="utf-8",
)
print(f"Saved {len(selected)} matching resource(s) to qwen-imports.json")

Vérifier le résultat et le dépannage

Une demande réussie retourne les métadonnées du modèle ou une liste vide lorsqu'aucune entrée ne correspond. Vérifiez les identificateurs, les capacités, les paramètres et la disponibilité avant de créer une demande d'inférence.

SymptômeQue vérifier
La trousse SDK n'a pas de méthode list_model_discovery.Mettez à niveau oci dans l'environnement virtuel actif et répétez la vérification de la méthode.
Une demande signée retourne HTTP 401.Validez ou recréez la session d'interface de ligne de commande, vérifiez le profil sélectionné et redémarrez Python afin qu'il lit le nouveau jeton.
Le service signale une erreur d'autorisation.Vérifiez les autorisations IAM et l'OCID du compartiment. Les stocks importés nécessitent une autorisation pour inspecter les ressources du modèle importé.
Un filtre d'ID modèle exact ne retourne aucun résultat.Parcourez ou recherchez localement d'abord, puis copiez un identificateur à partir de la réponse. Vérifiez les filtres de région et de cycle de vie.
La réponse inclut la disponibilité en dehors de la région du point d'extrémité.Définissez le filtre de détection region explicitement et inspectez chaque entrée de disponibilité. La région du point d'extrémité seule ne limite pas les résultats du catalogue.
Aucun modèle importé n'est retourné.Vérifiez la région, le compartiment, les autorisations et le nom d'affichage de la ressource du client. Utilisez list_imported_models() pour les stocks importés.
Seule une partie du catalogue est retournée.Suivez opc-next-page. Les exemples Python de cette page récupèrent toutes les pages.
La demande REST échoue alors que la trousse SDK réussit.Utilisez le même profil et le même compartiment. Vérifiez les noms de point d'extrémité de gestion, de chemin et d'interrogation camelCase, puis vérifiez le statut et l'ID demande.

Pour la commande d'interface de ligne de commande générée, voir list-model-discovery. Pour les ressources importées, voir ListImportedModels. Pour les champs de métadonnées retournés par le repérage, voir ModelDiscovery.