Sur cette page

Client API RESTful ChatGPT

Exemple d'utilisation du générateur OpenAPI pour créer un client API RESTful permettant de communiquer avec les modèles OpenAI.

Sélecteur de modèle déroulant et quatre cartes de mode intitulées Assistant, Scientifique, Mode normal et Votre choix.

Cet exemple utilise la dernière spécification OpenAPI pour l'API OpenAI afin de créer le code client de l'API RESTful. Comme il ne s'agit que d'un exemple, il ne met pas en œuvre l'ensemble des modèles et des opérations décrits dans la spécification officielle de l'OpenAI. En particulier, l'exemple est limité à deux opérations décrites dans le fichier response_api.yaml:

  • listModels - reçoit la liste des modèles disponibles.
  • createResponse - envoie une demande de l'utilisateur au modèle choisi, reçoit un message de réponse.

Exécution de l'exemple

Pour exécuter l'exemple à partir de Qt Creatorouvrez le mode Welcome et sélectionnez l'exemple à partir de Examples. Pour plus d'informations, voir Qt Creator: Tutoriel : Construire et exécuter.

Note : L'exemple nécessite une clé privée OpenAI afin d'interagir avec les modèles. Utilisez la variable d'environnement CHAT_OPENAI_KEY pour spécifier la clé. Si vous exécutez l'exemple à partir de Qt Creatoril peut être exécuté sous Projects -> Run Settings -> Environment.

Fonctionnalité de l'application

L'exemple vous permet de choisir un modèle OpenAI dans la liste des modèles disponibles et de discuter avec lui. La communication est assurée dans quatre modes de configuration :

  • Magicien - Le modèle se comporte comme un magicien et préfère discuter de sujets liés à la magie.
  • Scientifique - La configuration se comporte comme Albert Einstein et aime discuter de physique.
  • Mode normal - Configuration standard de ChatGPT sans fonctionnalités supplémentaires.
  • Votre choix - vous pouvez créer une description personnalisée pour le comportement de ChatGPT.

Une fois le mode sélectionné, la page de chat apparaît.

Conversation par chat avec champ de saisie de texte et boutons Retour et Envoyer

Générer du code client à partir d'une spécification OpenAPI

Le générateur Qt 6 OpenAPI est invoqué à partir du fichier CMakeLists.txt pour générer du code client à partir de la spécification response_api.yaml en appelant la fonction qt_add_openapi_client().

qt_add_library(openAIResponseApi)
qt_add_openapi_client(openAIResponseApi
    SPEC_FILE
        ${CMAKE_CURRENT_SOURCE_DIR}/response_api.yaml
)

Les classes API générées ResponsesApi et ModelsApi gèrent tous les détails HTTP de bas niveau :

  • Configuration du serveur
  • Construction de requêtes HTTP pour toutes les méthodes HTTP standard
  • Sérialisation des paramètres d'entrée conformément à la spécification
  • Désérialisation des réponses du serveur en objets typés
  • Signalement des succès et des erreurs par le biais de signaux Qt

Il ne vous reste plus qu'à envoyer une requête au modèle en appelant l'opération createResponse() de la classe ResponsesApi et à analyser sa réponse, comme indiqué ci-dessous :

m_responseApi->createResponse(response, this, [&](const QRestReply &reply, const Response &summary) { if (!reply.isSuccess()) {        qWarning() << "createResponse:" << reply.errorString() << reply.error();
    } else { // Pour sauvegarder le contexte de la conversation avec le modèle openAI, // nous devons suivre le retour du ResponseId du message du dernier modèle. // Le contexte n'est plus pertinent après avoir basculé vers l'autre modèle. Si le modèle // ne connaît pas l'identifiant du contexte, il répondra comme si le ResponseId était vide.m_responseId = summary.getIdValue() ; const QList<OutputMessage> outputMessage = summary.getOutputValue() ; for (qsizetype msgIndex = 0; msgIndex < outputMessage.size() ;  msgIndex++) { const QList<OutputTextContent> messages = outputMessage.at(msgIndex).getContentValue() ; for (qsizetype contentIndex = 0; contentIndex < messages.size() ;  contentIndex++) emit responseReady(messages.at(contentIndex).getTextValue()) ; } }) ;

Exposition des API générées à QML

La classe d'aide OpenAIChatManager expose les classes d'API générées ResponsesApi et ModelsApi à QML. Elle est définie dans openaichatmanager.h.

La classe d'aide utilise les macros QML_ELEMENT et QML_SINGLETON et enregistre l'instance C++ sous-jacente en tant que singleton, ce qui permet à QML d'accéder au même objet tout en conservant la propriété en C++ :

class OpenAIChatManager : public QObject
{
    Q_OBJECT
    QML_ELEMENT
    QML_SINGLETON

    Q_PROPERTY(QString modelName READ modelName WRITE setModelName NOTIFY modelNameChanged FINAL)
    Q_PROPERTY(QString userRequest READ userRequest
               WRITE setUserRequest NOTIFY userRequestChanged FINAL)
    Q_PROPERTY(QStringList modelList READ modelList
               WRITE setModelList NOTIFY modelListChanged FINAL)
    Q_PROPERTY(CharacterMode characterId READ characterId
               WRITE setCharacterId NOTIFY characterIdChanged FINAL)
    Q_PROPERTY(QString customUserCharacter READ customUserCharacter
               WRITE setCustomUserCharacter NOTIFY customUserCharacterChanged FINAL)

L'opération createResponse() est exposée via la fonction invocable du singleton OpenAIChatManager:

    Q_INVOKABLE void sendUserRequest();

Pour plus de détails, voir la documentation Qt Qml sur l'enregistrement d'une classe pour fournir des singletons.

Utiliser les API de QML

Une fois enregistré, le singleton est disponible globalement dans QML. Cela permet aux composants QML d'accéder à ResponsesApi et ModelsApi en utilisant les méthodes du singleton, comme indiqué ci-dessous :

function editingFinished() {
    var messageObject = {"name": "Me", "message": messageField.text };
    conversationModel.append(messageObject);
    OpenAIChatManager.userRequest = messageField.text;
    OpenAIChatManager.sendUserRequest();
    messageField.text = "";
}

Fichiers sources

Exemple de projet @ code.qt.io

Voir aussi Tous les exemples Qt et ColorPalette RESTful API client.

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.