このページでは

ChatGPT RESTful API クライアント

OpenAPIジェネレーターを使用して、OpenAIモデルと通信するためのRESTful APIクライアントを作成する方法の例。

モデル選択用のドロップダウンメニューと、「ウィザード」、「サイエンティスト」、「通常モード」、「お好み」と表示された4つのモードカード

この例では、OpenAI APIの最新OpenAPI仕様に基づいてRESTful APIクライアントコードを作成しています。これはあくまで一例であるため、OpenAIの公式仕様で説明されているすべてのモデルや操作が実装されているわけではありません。特に、この例ではresponse_api.yaml ファイルに記載されている2つの操作に限定されています:

  • listModels - 利用可能なモデルのリストを取得します。
  • createResponse - 選択したモデルにユーザーのリクエストを送信し、応答メッセージを受け取ります。

例の動作確認

以下の場所からサンプルを実行できます:

注:このサンプルでは 、モデルと通信するために OpenAI のプライベートキーが必要です。CHAT_OPENAI_KEY 環境変数を使用してキーを指定してください。 Qt Creatorから実行する場合は、Projects -> Run Settings -> Environment ディレクトリ下で実行できます。

アプリケーションの機能

このサンプルでは、利用可能なモデルのリストから OpenAI モデルを選択し、そのモデルとチャットを行うことができます。通信には、以下の 4 つの設定モードが用意されています:

  • ウィザード - ウィザードのような振る舞いをし、魔法に関連する話題を好んで話し合います。
  • 科学者モード - アルベルト・アインシュタインのように振る舞い、物理学について議論することを好みます。
  • 通常モード - 追加機能のない標準的なChatGPTの設定です。
  • 「Your choice」 - ChatGPTの挙動について、独自の説明を作成できます。

モードを選択すると、チャットページが表示されます。

テキスト入力欄と「戻る」ボタン、「送信」ボタンを備えたチャット画面

OpenAPI仕様からクライアントコードを生成する

Qt 6 OpenAPI ジェネレータは、CMakeLists.txt ファイルから呼び出され、qt_add_openapi_client() 関数を呼び出すことで、response_api.yaml 仕様からクライアントコードを生成します。

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

生成された API クラス `ResponsesApi ` および `ModelsApi ` は、低レベルの HTTP に関するすべての詳細を処理します:

  • サーバーの設定
  • すべての標準 HTTP メソッドに対する HTTP リクエストの構築
  • 仕様に基づく入力パラメータのシリアライズ
  • サーバー応答の型付きオブジェクトへの逆シリアライズ
  • Qtシグナルによる成功およびエラーの報告

あとは、以下に示すように、ResponsesApi クラスのcreateResponse() オペレーションを呼び出してモデルにリクエストを送信し、そのレスポンスを解析するだけです。

m_responseApi->createResponse(response, this, [&](constQRestReply&reply,
                                                  constResponse&summary) {
    if(!reply.isSuccess()) {
        qWarning() << "createResponse:" << reply.errorString() << reply.error();
    }else{
        // OpenAIモデルとの会話のコンテキストを保存するには、
        // 最後のモデルからのメッセージで返されたResponseIdを追跡する必要があります。
       // 別のモデルに切り替えると、コンテキストは意味をなさなくなります。モデルが
        // コンテキストIDを知らない 場合 、ResponseIdが空であるかのように応答してしまいます。
       m_responseId=summary.getId();
        constQList<OutputMessage>outputMessage=summary.getOutput();
        for(qsizetype msgIndex= 0; msgIndex<outputMessage.size(); msgIndex++) {
            constQList<OutputTextContent>messages
                =outputMessage.at(msgIndex).getContent();
            for(qsizetype contentIndex= 0; contentIndex<messages.size(); contentIndex++)
                emitresponseReady(messages.at(contentIndex).getText());
        }
    }
});

生成されたAPIをQMLに公開する

ヘルパークラス `OpenAIChatManager ` は、生成された API クラス `ResponsesApi ` および `ModelsApi ` を QML に公開します。これは `openaichatmanager.h` に定義されています。

このヘルパークラスは、QML_ELEMENT およびQML_SINGLETONマクロを使用し、基になる C++ インスタンスをシングルトンとして登録します。これにより、所有権は C++ に留まりつつ、QML から同じオブジェクトにアクセスできるようになります。

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)

createResponse() の処理は、OpenAIChatManager シングルトンのinvocable関数を介して公開されます:

    Q_INVOKABLE void sendUserRequest();

詳細については、シングルトンを提供するためのクラスの登録に関する Qt Qml ドキュメントを参照してください。

QMLからのAPIの使用

登録されると、シングルトンはQML内でグローバルに利用可能になります。これにより、QMLコンポーネントは、以下に示すように、シングルトンのメソッドを使用してResponsesApi およびModelsApi にアクセスできるようになります。

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

ソースファイル

サンプルプロジェクト @ code.qt.io

関連項目: すべてのQtサンプルおよびColorPalette RESTful APIクライアント。

© 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.