本页内容

ChatGPT RESTful API 客户端

示例:如何使用 OpenAPI 生成器创建用于与 OpenAI 模型通信的 RESTful API 客户端。

模型选择下拉菜单以及四张模式卡片,分别标有“向导”、“科学家”、“常规模式”和“自定义”

本示例采用OpenAI API 的最新OpenAPI 规范来编写 RESTful API 客户端代码。由于这仅是一个示例,因此并未实现官方 OpenAI 规范中描述的所有模型和操作。具体而言,本示例仅限于response_api.yaml 文件中描述的两项操作:

  • listModels — 获取可用模型的列表。
  • createResponse - 向选定的模型发送用户请求,并接收响应消息。

运行示例

您可以从以下位置运行该示例:

注意:该示例 需要一个私有 OpenAI 密钥才能与模型进行交互。请使用环境变量 `CHAT_OPENAI_KEY ` 指定该密钥。如果您从 Qt Creator运行该示例,则可在Projects -> Run Settings -> Environment 目录下进行操作。

应用程序功能

该示例允许您从可用模型列表中选择一个 OpenAI 模型,然后与其进行对话。通信提供四种配置模式:

  • 向导模式——该设置像向导一样,更喜欢讨论与魔法相关的话题。
  • 科学家模式 - 该设置的行为方式类似于阿尔伯特·爱因斯坦,喜欢讨论物理学。
  • 常规模式——标准的 ChatGPT 设置,无额外功能。
  • 自定义模式——您可以为 ChatGPT 的行为创建自定义描述。

选择模式后,聊天页面随即显示。

带有文本输入框以及“返回”和“发送”按钮的聊天对话框

根据 OpenAPI 规范生成客户端代码

通过调用CMakeLists.txt 文件中的qt_add_openapi_client() 函数,可调用Qt 6 OpenAPI生成器,根据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>消息
                =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++ 实例注册为单例,从而允许 QML 访问同一对象,同时所有权仍归 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)

createResponse() 操作是通过OpenAIChatManager 单例的可调用函数暴露出来的:

    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.