当前位置: 首页 > news >正文

“深入浅出”系列之QT:(10)Qt接入Deepseek

项目配置:

在.pro文件中添加网络模块:

 QT += core network

API配置:

  • 将apiUrl替换为实际的DeepSeek API端点

  • 将apiKey替换为你的有效API密钥

  • 根据API文档调整请求参数(模型名称、温度值等)

功能说明:

  • 使用QNetworkAccessManager处理HTTP请求

  • 自动处理JSON序列化/反序列化

  • 支持异步请求处理

  • 包含基本的错误处理

扩展建议:

  • 添加更完善的错误处理(HTTP状态码检查)

  • 实现异步回调机制

  • 添加请求超时处理

  • 支持流式响应(如果API支持)

  • 使用环境变量或配置文件管理API密钥

典型输出处理:

// 在handleResponse函数中可添加以下处理逻辑:if (!content.isEmpty()) {    qDebug() << "Received response:";    qDebug().noquote() << content;  // 保留原始格式} else {    qDebug() << "No content in response";}

代码举例:

#include <QCoreApplication>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <QDebug>

class ApiClient : public QObject {
    Q_OBJECT
public:
    explicit ApiClient(QObject *parent = nullptr) : QObject(parent) {
        manager = new QNetworkAccessManager(this);
        connect(manager, &QNetworkAccessManager::finished, 
                this, &ApiClient::handleResponse);
    }

    void sendRequest(const QString &prompt) {
        // API配置
        const QString apiUrl = "https://api.deepseek.com/v1/chat/completions";
        const QString apiKey = "your_api_key_here"; // 请替换为实际API密钥

        // 创建请求
        QNetworkRequest request;
        request.setUrl(QUrl(apiUrl));
        request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
        request.setRawHeader("Authorization", 
                           QString("Bearer %1").arg(apiKey).toUtf8());

        // 构建JSON请求体
        QJsonObject requestBody;
        requestBody["model"] = "deepseek-chat";  // 根据实际模型名称修改
        requestBody["temperature"] = 0.7;
        requestBody["max_tokens"] = 1000;

        QJsonArray messages;
        QJsonObject systemMsg;
        systemMsg["role"] = "system";
        systemMsg["content"] = "You are a helpful assistant.";
        messages.append(systemMsg);

        QJsonObject userMsg;
        userMsg["role"] = "user";
        userMsg["content"] = prompt;
        messages.append(userMsg);

        requestBody["messages"] = messages;

        // 发送POST请求
        manager->post(request, QJsonDocument(requestBody).toJson());
    }

private slots:
    void handleResponse(QNetworkReply *reply) {
        if (reply->error()) {
            qDebug() << "Error:" << reply->errorString();
            reply->deleteLater();
            return;
        }

        // 解析响应
        QJsonDocument response = QJsonDocument::fromJson(reply->readAll());
        QJsonObject jsonResponse = response.object();
        
        if (jsonResponse.contains("choices")) {
            QJsonArray choices = jsonResponse["choices"].toArray();
            if (!choices.isEmpty()) {
                QJsonObject choice = choices.first().toObject();
                QJsonObject message = choice["message"].toObject();
                QString content = message["content"].toString();
                qDebug() << "API Response:" << content;
            }
        } else {
            qDebug() << "Error response:" << response.toJson();
        }

        reply->deleteLater();
    }

private:
    QNetworkAccessManager *manager;
};

// 使用示例
int main(int argc, char *argv[]) {
    QCoreApplication a(argc, argv);

    ApiClient client;
    client.sendRequest("Explain quantum computing in simple terms");

    return a.exec();
}

#include "main.moc"
http://www.dtcms.com/a/26706.html

相关文章:

  • DeepSeek与ChatGPT:会取代搜索引擎和人工客服的人工智能革命
  • RelaTree隐私政策
  • FreeSwitch之mod_cidlookup 和 mod_blacklist和mod_curl的抉择
  • 【核心算法篇十九】《 DeepSeek因果推断:双重差分模型如何破解政策评估的「时空难题」》
  • 在ubuntu上用Python的openpyxl模块操作Excel的案例
  • 蓝桥杯备赛1-3时间加法
  • JupyterNotebook高级使用:常用魔法命令
  • bigemap pro如何合并面文件
  • django连接mysql数据库
  • 第三章 组件(5)- 数据绑定
  • 深研究:与Dify建立研究自动化应用
  • 撕碎QT面具(2):groupBox内容居中显示
  • MySQL 一条 SQL 执行流程解析
  • /etc/docker/daemon.json这个跟/etc/yum.repos.d/docker-ce.repo这个文件的关系
  • DeepSeek 助力 Vue 开发:打造丝滑的右键菜单(RightClickMenu)
  • 分布式大语言模型服务引擎vLLM论文解读
  • tortoiseSVN 如何克隆项目到本地
  • WEB项目接入Deepseek(硅基流动)
  • Shapr3D在ipad上无法识别鼠标点击问题
  • NPB安装使用教程
  • 基于iptables的Docker端口白名单控制
  • C++ 程序 return value 1 是什么原因
  • 寒假阶段学习总结
  • C++:pthread的使用
  • SpringSecurity基于配置方法控制访问权限:MVC匹配器、Ant匹配器
  • hive 编译慢问题处理
  • FontConfig封装分享
  • Token Embedding(词嵌入)和Positional Encoding(位置编码)的矩阵形状关系及转换过程
  • [grub]修改启动项选项来区分不同系统
  • fastapi sqlalchemy 日志 logging 写入异常 多进程文件写入异常