接入DeepSeek API测试(使用Qt)

一、接入DeepSeek介绍

deepseek开发平台入口:DeepSeek

创建key,自己保存下来,后面API调用需要使用

文档地址:

首次调用 API | DeepSeek API Docs

二、代码测试

1.定义

class DeepSeekNetwork : public QObject
{
    Q_OBJECT
public:
    explicit DeepSeekNetwork(QObject* parent = nullptr);
    Q_INVOKABLE void seek(const QString &string);

signals:
    void signalOutput(DeepSeekOutput data);

private:
    QNetworkRequest mRequest; // 封装网络请求信息
    QNetworkAccessManager *mNetWorkManager { nullptr }; // 管理网络请求和响应
    QNetworkReply *mNetWorkReply { nullptr }; // 网络请求响应
    // base_url:https://api.deepseek.com
    // 出于与 OpenAI 兼容考虑,您也可以将 base_url 设置为 https://api.deepseek.com/v1 来使用,但注意,此处 v1 与模型版本无关。
    // deepseek-chat 模型已全面升级为 DeepSeek-V3,接口不变。 通过指定 model='deepseek-chat' 即可调用 DeepSeek-V3。
    // deepseek-reasoner 是 DeepSeek 最新推出的推理模型 DeepSeek-R1。通过指定 model='deepseek-reasoner',即可调用 DeepSeek-R1。
    QString mCurlHttps = "https://api.deepseek.com/chat/completions";
    QString mModel = "deepseek-chat"; //deepseek-reasoner r1模型  ||  deepseek-chat v3模型
    QString mApiKey = "sk-23********************10a4f"; // API Key(前面自己创建的key)
    bool mIsStream{true}; // 是否流式数据

private slots:
    void onReadyRead();

private:
    void initialize();
    void request(const QByteArray &postData);
};

2.请求数据

void DeepSeekNetwork::seek(const QString &string)
{
    // messages部分
    QJsonArray messages;
    QJsonObject role;
    role["role"] = "system";
    role["content"] = "You are a helpful assistant.";
    messages.append(role);
    QJsonObject role2;
    role2["role"] = "user";
    role2["content"] = string;
    messages.append(role2);

    QJsonObject data;
    data["model"] = mModel;
    data["messages"] = messages;
    data["stream"] = true;

    QJsonDocument doc(data);
    QByteArray postData = doc.toJson();
    request(postData);
}

void DeepSeekNetwork::request(const QByteArray &postData)
{
    qDebug() << Q_FUNC_INFO << QThread::currentThread() << postData;
    // url
    mRequest.setUrl(QUrl(mCurlHttps));
    // head
    mRequest.setRawHeader("Authorization", ("Bearer " + mApiKey).toUtf8());
    mRequest.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
    // ssl
    QSslConfiguration config = QSslConfiguration::defaultConfiguration();
    config.setProtocol(QSsl::AnyProtocol);
    config.setPeerVerifyMode(QSslSocket::VerifyNone);
    mRequest.setSslConfiguration(config);

    //发送post请求
    mNetWorkReply = mNetWorkManager->post(mRequest, postData);
    // 链接槽函数
    if (mNetWorkReply != nullptr) {
        disconnect(mNetWorkReply, &QIODevice::readyRead, this, &DeepSeekNetwork::onReadyRead);
        connect(mNetWorkReply, &QIODevice::readyRead, this, &DeepSeekNetwork::onReadyRead);
    }
}

3.接收数据

void DeepSeekNetwork::onReadyRead()
{
    DeepSeekOutput result;
    result.status = 0;
    QString output;
    if (mNetWorkReply != nullptr && mNetWorkReply->error() == QNetworkReply::NoError) {
        QByteArray readData = (mNetWorkReply->readAll());
        qDebug() <<  readData;
        if (mIsStream) { // stream
            // "data: {\"id\":\"aae06e28-b806-4eda-82c1-0898ac13d5ba\",\"object\":\"chat.completion.chunk\",\"created\":1741859649,\"model\":\"deepseek-chat\",\"system_fingerprint\":\"fp_3a5770e1b4_prod0225\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\xE8\x8E\xB7\xE5\x8F\x96\"},\"logprobs\":null,\"finish_reason\":null}]}\n\n"
            QByteArray key = "data: ";
            QString str = QString::fromUtf8(readData);
            if (str.contains(key)) {
                QStringList strList = str.split(key);
                foreach (QString var, strList) {
                    if (var.isEmpty()) continue;
                    //对返回的json数据进行解析
                    QByteArray data = var.toUtf8();
                    QJsonObject obj = QJsonDocument::fromJson(data).object();
                    if (obj.contains("id") && obj.value("id").isString()) {
                        result.id = obj.value("id").toString();
                    }
                    qDebug() << Q_FUNC_INFO << QThread::currentThread() << "onReadyRead:" << obj;
                    if (obj.contains("error") && obj.value("error").isObject()) {
                        QJsonObject valueObj = obj.value("error").toObject();
                        QString message = valueObj.value("message").toString();
                        output = message;
                        result.status = -1;
                    } else {
                        QJsonArray choicesarray = obj.value("choices").toArray();
                        for (int i = 0; i < choicesarray.size(); i++) {
                            QJsonObject choiceobj = choicesarray[i].toObject();
                            if (choiceobj.contains("delta") && choiceobj.value("delta").isObject()) {
                                QJsonObject deltaObj = choiceobj.value("delta").toObject();
                                if (deltaObj.contains("content") && deltaObj.value("content").isString()) {
                                    output += deltaObj.value("content").toString();
                                }
                            }
                            if (choiceobj.contains("finish_reason") && choiceobj.value("finish_reason").isString()) {
                                QString finish_reason = choiceobj.value("finish_reason").toString();
                                if (finish_reason == "stop") result.status = 1;
                            }
                        }
                    }
                }
            }
        } else {
            //对返回的json数据进行解析
            QJsonObject obj = QJsonDocument::fromJson(readData).object();
            qDebug() << Q_FUNC_INFO << "onReadyRead:" << obj;
            if (obj.contains("id") && obj.value("id").isString()) {
                result.id = obj.value("id").toString();
            }
            if (obj.contains("error") && obj.value("error").isObject()) {
                QJsonObject valueObj = obj.value("error").toObject();
                // QString code = valueObj.value("code").toString();
                QString message = valueObj.value("message").toString();
                output = message;
                result.status = -1;
            } else {
                QJsonArray choicesarray = obj.value("choices").toArray();
                for (int i = 0; i < choicesarray.size(); i++) {
                    QJsonObject choiceobj = choicesarray[i].toObject();
                    if (choiceobj.contains("message") && choiceobj.value("message").isObject()) {
                        QJsonObject messageobj = choiceobj.value("message").toObject();
                        if (messageobj.contains("content") && messageobj.value("content").isString()) {
                            output += messageobj.value("content").toString();
                        }
                    }
                }
            }
        }

    } else {
        output = mNetWorkReply->errorString();
        result.status = -1;
        qDebug() << Q_FUNC_INFO << "https request error:" << output;
    }
    result.content = output;
    emit signalOutput(result);
}

deepseek api接入测试视频

### 将DeepSeek集成到Qt项目的指南 #### 集成背景与准备 为了将DeepSeek成功集成至Qt项目中,需先理解两者的技术栈差异以及兼容性。Qt主要应用于创建图形用户界面(GUI),并支持跨平台开发[^3];而DeepSeek作为一个假设的人工智能搜索引擎框架,其具体实现细节未在此提及。 #### 修改`CMakeLists.txt` 对于大多数现代Qt项目而言,构建过程通常由CMake管理。因此,在尝试集成任何外部库或工具时,修改`CMakeLists.txt`文件是一个重要步骤。虽然具体的配置取决于DeepSeek的具体API和支持的功能集,但一般情况下可以按照如下方式调整: ```cmake # 假设DeepSeek安装路径已知,并且提供了必要的头文件和链接选项 find_package(DeepSeek REQUIRED) add_executable(MyApp main.cpp) target_link_libraries(MyApp PRIVATE Qt::Core Qt::Gui ${DEEPSEEK_LIBRARIES}) include_directories(${DEEPSEEK_INCLUDE_DIRS}) ``` 此段脚本假定存在一个名为`DeepSeek`的包可以通过`find_package()`找到,并提供相应的变量用于编译器查找所需的头文件(`${DEEPSEEK_INCLUDE_DIRS}`) 和链接库 (`${DEEPSEEK_LIBRARIES}`)[^1]。 #### 编写代码以调用DeepSeek API 一旦完成了上述设置工作,则可以在应用程序源码内引入DeepSeek功能。下面给出了一段简单的示例代码片段来展示如何初始化并查询DeepSeek实例: ```cpp #include <QCoreApplication> // 假设有这样的头文件定义了DeepSeek接口 #include "deepseek_api.h" int main(int argc, char *argv[]) { QCoreApplication app(argc, argv); try { // 初始化DeepSeek引擎 auto* engine = new DeepSeekEngine(); // 执行某些操作... QString queryResult = engine->search("example query"); qDebug() << "Query result:" << queryResult; delete engine; } catch(const std::exception& e){ qCritical() << "Error occurred while using DeepSeek:" << e.what(); } return app.exec(); } ``` 这段代码展示了基本的应用逻辑——即通过创建`DeepSeekEngine`对象来进行搜索请求处理,并捕获可能发生的异常情况[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值