一、接入DeepSeek介绍
deepseek开发平台入口:DeepSeek
创建key,自己保存下来,后面API调用需要使用
文档地址:
二、代码测试
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接入测试视频