Auf dieser Seite

ChatGPT RESTful API-Klient

Beispiel für die Verwendung des OpenAPI-Generators zur Erstellung eines RESTful-API-Clients für die Kommunikation mit OpenAI-Modellen.

Modellauswahl-Dropdown und vier Moduskarten mit den Bezeichnungen Wizard, Scientist, Regular mode und Your choice

Dieses Beispiel verwendet die neueste OpenAPI-Spezifikation für die OpenAI-API zur Erstellung von RESTful-API-Client-Code. Da es sich nur um ein Beispiel handelt, implementiert es nicht alle Modelle und Operationen, die in der offiziellen OpenAI-Spezifikation beschrieben sind. Insbesondere ist das Beispiel auf zwei Operationen beschränkt, die in der Datei response_api.yaml beschrieben sind:

  • listModels - empfängt die Liste der verfügbaren Modelle.
  • createResponse - sendet eine Benutzeranfrage an das gewählte Modell und empfängt eine Antwortnachricht.

Ausführen des Beispiels

Zum Ausführen des Beispiels von Qt Creatorauszuführen, öffnen Sie den Modus Welcome und wählen Sie das Beispiel aus Examples. Weitere Informationen finden Sie unter Qt Creator: Tutorial: Erstellen und Ausführen.

Hinweis: Das Beispiel erfordert einen privaten OpenAI-Schlüssel, um mit den Modellen zu interagieren. Verwenden Sie die Umgebungsvariable CHAT_OPENAI_KEY, um den Schlüssel anzugeben. Wenn Sie das Beispiel von Qt Creatorausführen, kann es unter Projects -> Run Settings -> Environment ausgeführt werden.

Funktionalität der Anwendung

Das Beispiel ermöglicht es Ihnen, ein OpenAI-Modell aus der Liste der verfügbaren Modelle auszuwählen und dann mit ihm zu chatten. Die Kommunikation wird in vier Konfigurationsmodi angeboten:

  • Zauberer - Das Setup verhält sich wie ein Zauberer und diskutiert am liebsten über Themen, die mit Magie zu tun haben.
  • Scientist - Das Setup verhält sich wie Albert Einstein und diskutiert gerne über Physik.
  • Regulärer Modus - Standard-ChatGPT-Setup ohne zusätzliche Funktionen.
  • Ihre Wahl - Sie können eine eigene Beschreibung für das Verhalten von ChatGPT erstellen.

Sobald ein Modus ausgewählt wurde, erscheint die Chatseite.

Chat-Konversation mit Texteingabefeld und den Schaltflächen Zurück und Senden

Generierung von Client-Code aus einer OpenAPI-Spezifikation

Der Qt 6 OpenAPI-Generator wird aus der Datei CMakeLists.txt aufgerufen, um Client-Code aus der Spezifikation response_api.yaml zu erzeugen, indem die Funktion qt_add_openapi_client() aufgerufen wird.

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

Die generierten API-Klassen ResponsesApi und ModelsApi behandeln alle HTTP-Details auf niedriger Ebene:

  • Server-Konfiguration
  • Aufbau von HTTP-Anfragen für alle Standard-HTTP-Methoden
  • Serialisierung der Eingabeparameter entsprechend der Spezifikation
  • Deserialisierung von Serverantworten in typisierte Objekte
  • Erfolgs- und Fehlermeldungen durch Qt-Signale

Jetzt müssen Sie nur noch eine Anfrage an das Modell senden, indem Sie die createResponse() Operation der ResponsesApi Klasse aufrufen und die Antwort parsen, wie unten gezeigt:

m_responseApi->createResponse(response, this, [&](const QRestReply &reply, const Response &summary) { if (!reply.isSuccess()) {        qWarning() << "createResponse:" << reply.errorString() << reply.error();
    } else { // Um den Kontext der Konversation mit dem openAI-Modell zu speichern, // müssen wir die zurückkehrende ResponseId der Nachricht des letzten Modells verfolgen. // Der Kontext wird nach dem Wechsel zum anderen Modell irrelevant. Wenn das Modell // die Kontext-ID nicht kennt, antwortet es, als ob die ResponseId leer wäre.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()); } } });

Generierte APIs für QML freigeben

Die Hilfsklasse OpenAIChatManager macht die generierten API-Klassen ResponsesApi und ModelsApi für QML sichtbar. Sie ist in openaichatmanager.h definiert.

Die Hilfsklasse verwendet die Makros QML_ELEMENT und QML_SINGLETON und registriert die zugrunde liegende C++-Instanz als Singleton, so dass QML auf dasselbe Objekt zugreifen kann, während die Eigentümerschaft in C++ verbleibt:

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)

Die Operation createResponse() wird über die aufrufbare Funktion des Singletons OpenAIChatManager offengelegt:

    Q_INVOKABLE void sendUserRequest();

Weitere Einzelheiten finden Sie in der Qt QML-Dokumentation über die Registrierung einer Klasse zur Bereitstellung von Singletons.

Verwendung der APIs von QML

Einmal registriert, ist das Singleton global in QML verfügbar. Dadurch können QML-Komponenten auf ResponsesApi und ModelsApi zugreifen, indem sie die Singleton-Methoden verwenden, wie unten gezeigt:

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

Quelldateien

Beispielprojekt @ code.qt.io

Siehe auch Alle Qt Beispiele und 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.