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

做第三方的qq互联接口时_回调到自己的网站时要延时很久是什么原因徐州seo排名收费

做第三方的qq互联接口时_回调到自己的网站时要延时很久是什么原因,徐州seo排名收费,做纺织都有那些好网站,程序员做网站给女朋友今天讲的是使用qt做一个界面(负责接受deepseek返回的数据和客户发送数据的端口)会用流的方式接受数据提高用户体验 测试效果源码流程配置deepseek调用思路deepseek与qt联合开发界面思路 上一篇文章用的不是流开发,会让客户等待很久&#xff0…

今天讲的是使用qt做一个界面(负责接受deepseek返回的数据和客户发送数据的端口)会用流的方式接受数据提高用户体验

  • 测试效果
  • 源码
  • 流程
    • 配置
    • deepseek调用思路
    • deepseek与qt联合开发界面思路

上一篇文章用的不是流开发,会让客户等待很久,会让人误以为卡住和掉线,今天将会用流的方式读取数据。
在这里插入图片描述

测试效果

20250422_191017


下面这个是换了调教词
看addSystemMessage(u8"你是一个贴吧的暴躁老哥很喜欢怼人

20250422_190503

源码

源码分为三部分
如有qt配置疑问可以参考我之前的文章链接: qt配置与libevent编译
如有curl和jsoncpp编译疑问参考libevent编译就行

下面是pro文件的配置
INCLUDEPATH就是绑定头文件,
LIBS就是绑定库,格式(路径+库)例/home/juan/Qt_Work/tests/(路劲)libevent_core.so(库)


QMAKE_LFLAGS+=-Wl,-rpath,'.'
INCLUDEPATH+=/home/juan/PublicLibrary/libevent-release-2.1.10-stable/include
INCLUDEPATH+=/home/juan/PublicLibrary/libevent-release-2.1.10-stable/include/event2
INCLUDEPATH+=/home/juan/PublicLibrary/build-libevent-release-2.1.10-stable-Desktop_Qt_5_9_3_GCC_64bit-Release/include
LIBS+=/home/juan/Qt_Work/tests/libevent_core.so
LIBS+=/home/juan/Qt_Work/tests/libevent.so
LIBS+=/home/juan/Qt_Work/tests/libevent_openssl.so
LIBS+=/home/juan/Qt_Work/tests/libevent_pthreads.soLIBS+=/home/juan/PublicLibrary/build-jsoncpp-master-Desktop_Qt_5_9_3_GCC_64bit-Release/lib/libjsoncpp.so
INCLUDEPATH+=/home/juan/PublicLibrary/jsoncpp-master/includeINCLUDEPATH+=/home/juan/PublicLibrary/curl-curl-8_13_0/include
LIBS+=/home/juan/PublicLibrary/build-curl-curl-8_13_0-Desktop_Qt_5_9_3_GCC_64bit-Release/lib/libcurl.soLIBS+=/usr/lib/x86_64-linux-gnu/libssl.so
LIBS+=/usr/lib/x86_64-linux-gnu/libssl3.so
LIBS+=/usr/lib/x86_64-linux-gnu/libcrypto.so.1.1

在这里插入图片描述
libeventuse.h

#ifndef LIBEVENTUSE_H
#define LIBEVENTUSE_H//这个作用是让头文件只调用一次避免重复调用
#include <QMainWindow>
#include<qthread.h>
class globalSignal:public QObject
{Q_OBJECT
public:static void sendSignal(QString ip){if(m_instance){emit m_instance->singnal(ip);}}static globalSignal *m_instance;~globalSignal();signals:void singnal(QString  ip);private:explicit globalSignal(QObject*parent=nullptr):QObject(parent){}
};class workThread:public QThread{//继承qthread是为了继承里面的虚函数方便统一格式Q_OBJECT
public:explicit  workThread(QObject *parent = nullptr);QString dataStr;
protected:void run() override;//override避免重复构造虚函数
signals:void workThread_signal(QString ip);//自定义信号void server_finish();void workThread_signalData(QString ip);
};#endif // LIBEVENTUSE_H

libeventuse.cpp

#include "libeventuse.h"globalSignal* globalSignal::m_instance = new globalSignal;globalSignal::~globalSignal()
{if(m_instance){delete m_instance;}
}#include"qdebug.h"
#include <iostream>
#include <string>
#include <vector>
#include <curl/curl.h>
#include <json/json.h>
#include <iostream>
#include <curl/curl.h>void print_json_value(const Json::Value& value)//专门用来打印json
{// 方法1:使用StyledWriter格式化输出(经典方式){Json::StyledWriter writer;std::string styled = writer.write(value);qDebug("=== StyledWriter 输出 === %s\n",styled.c_str());}
}// 调试回调函数,用于打印请求信息
static int debug_callback(CURL* handle, curl_infotype type, char* data, size_t size, void* userptr) {std::string* debug_log = static_cast<std::string*>(userptr);const char* type_str = "";switch (type) {case CURLINFO_TEXT:type_str = "INFO";break;case CURLINFO_HEADER_OUT:  // 输出请求头type_str = "HEADER_OUT";break;case CURLINFO_DATA_OUT:    // 输出请求体type_str = "DATA_OUT";break;default:return 0;  // 忽略其他类型}// 将调试信息追加到日志字符串debug_log->append("[").append(type_str).append("] ").append(data, size);return 0;
}using namespace Json;static size_t WriteCallback(void* contents, size_t size, size_t nmemb, std::string* response) {//写的回调函数size_t total_size = size * nmemb;std::string tmp = (char*)contents;Json::Value root;Json::CharReaderBuilder reader;std::string full_response;std::string json_str = tmp.substr(tmp.find('{'));// 解析JSONstd::istringstream iss(json_str);std::string errs;if (Json::parseFromStream(reader, iss, &root, &errs)) {// 提取增量内容const auto& content = root["choices"][0]["delta"]["content"];if (!content.isNull()) {full_response += content.asString();*response += full_response;//printf("%s", full_response.c_str());emit globalSignal::m_instance->singnal(full_response.c_str());}const auto& contentR1 =root["choices"][0]["delta"]["reasoning_content"];if (!contentR1.isNull()){full_response += contentR1.asString();*response += full_response;// printf("%s", full_response.c_str());emit globalSignal::m_instance->singnal(full_response.c_str());//发送信号给主客户端让他接受数据}// 检测终止条件if (root["choices"][0].isMember("finish_reason")) {}}return total_size;
}class ChatGPTClient {
public:ChatGPTClient(const std::string& api_key)//设置模型与api路径: api_key_(api_key),endpoint_("https://api.siliconflow.cn/v1/chat/completions"),model_("deepseek-ai/DeepSeek-V3") {curl_ = curl_easy_init();// 初始化系统消息// addSystemMessage(u8"你是一个贴吧的暴躁老哥很喜欢怼人,你回复的时候不能说自己的身份且要有很强的语言攻击性回复问题");addSystemMessage(u8"你中文编程大师");//调教词,你怎么写deeepseek就按你写的转换身份}~ChatGPTClient() {if (curl_) curl_easy_cleanup(curl_);}void addSystemMessage(const std::string& content) {Value message;message["role"] = "system";message["content"] = content;history_.append(message);}std::string ask(const std::string& question) {if (!curl_) return "Error: CURL init failed";// 添加用户问题到历史为了多轮对话,由于ds服务器不会存你的聊天记录所以要自己保存Value userMessage;userMessage["role"] = "user";userMessage["content"] = question;history_.append(userMessage);// 构建请求体Value request;request["model"] = model_;request["messages"] = history_;request["temperature"] = 0.7;//理性值,越大越理性request["max_tokens"] = 512;//你就理解为ds她最大能理解的文本数request["stream"] = true;//启动流式回复// 序列化StreamWriterBuilder writer;std::string post_data = writeString(writer, request);std::string debug_log;// 发送请求struct curl_slist* headers = nullptr;headers = curl_slist_append(headers, "Content-Type: application/json");headers = curl_slist_append(headers, ("Authorization: Bearer " + api_key_).c_str());std::string response_str;char error_buffer[CURL_ERROR_SIZE] = { 0 };curl_easy_setopt(curl_, CURLOPT_VERBOSE, 1L);                // 启用详细日志curl_easy_setopt(curl_, CURLOPT_DEBUGFUNCTION, debug_callback); // 设置回调curl_easy_setopt(curl_, CURLOPT_DEBUGDATA, &debug_log);         // 传递日志存储位置curl_easy_setopt(curl_, CURLOPT_URL, endpoint_.c_str());curl_easy_setopt(curl_, CURLOPT_HTTPHEADER, headers);curl_easy_setopt(curl_, CURLOPT_POSTFIELDS, post_data.c_str());curl_easy_setopt(curl_, CURLOPT_WRITEFUNCTION, WriteCallback);curl_easy_setopt(curl_, CURLOPT_WRITEDATA, &response_str);curl_easy_setopt(curl_, CURLOPT_ERRORBUFFER, error_buffer);curl_easy_setopt(curl_, CURLOPT_SSL_VERIFYPEER, 0L);CURLcode res = curl_easy_perform(curl_);// std::cout << "----- CURL REQUEST DEBUG -----\n";//打印日志// std::cout << debug_log << std::endl;curl_slist_free_all(headers);if (res != CURLE_OK) {return "CURL Error: " + std::string(error_buffer);}// 解析响应CharReaderBuilder reader;Value response_json;std::string parse_errors;//  printf("server:%s", response_str.c_str());Value userMessageassistant;userMessageassistant["role"] = "assistant";//把回复也要保存到历史记录里userMessageassistant["content"] = response_str;history_.append(userMessageassistant);//填充deepseek的历史回答return "ok";}private:CURL* curl_;std::string api_key_;std::string endpoint_;std::string model_;Value history_;  // 使用JSON数组存储对话历史
};static ChatGPTClient client("填自己的key");workThread::workThread(QObject *parent) : QThread(parent) {}void workThread::run() {
//dataStr+="\r\n";
client.ask(dataStr.toStdString());
}

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include"qdebug.h"
#include"libeventuse.h"MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);workThreaduse=new workThread;connect(globalSignal::m_instance,&globalSignal::singnal,ui->textEdit,[=](QString ip){QString data=ui->textEdit->toPlainText();data+=ip;//data+="\r\n";ui->textEdit->setText(data);ui->textEdit->moveCursor(QTextCursor::End);});connect(this->workThreaduse,&workThread::finished,[=](){ui->pushButton->setEnabled(true);});}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_pushButton_clicked()
{QString data=ui->textEdit_2->toPlainText();emit this->workThreaduse->workThread_signalData(data);ui->textEdit_2->setText("");QString tmpdata=ui->textEdit->toPlainText();if(tmpdata.size()){tmpdata+="\r\n";}tmpdata+="user:";tmpdata+=data;tmpdata+="\r\nAI:";ui->textEdit->setText(tmpdata);this->workThreaduse->dataStr=data;this->workThreaduse->start();ui->textEdit->moveCursor(QTextCursor::End);ui->pushButton->setEnabled(false);
}

ui界面

在这里插入图片描述
你们要熟悉基本的qt配置信息,要去看我以前的文章或者别人的博客才行
代码要自己修改对应的控件否则运行不起来。

流程

配置

1.配置key位置找到这个填入自己的key即可
在这里插入图片描述
2.deepseek的性格配置位置
在这里插入图片描述
3.temperature理性值越大越理性,max_tokens。,deepseek理解的最大字节数在这里插入图片描述

deepseek调用思路

在这里插入图片描述
在这里插入图片描述
官网的意思是
1.先按固定格式发送curl给指定服务器即可
2.解析服务器放回的字符串
3.deepseek不会记录你的历史记录所以要自己拼接一个json给服务器这样她就有了能理解以前东西的能力
4.申请key参考我上一篇文章链接: link

deepseek与qt联合开发界面思路

1.构建一个线程专门负责deepseek的api调用,负责发送消息
2.deepseek返回的消息使用一个全局信号( emit globalSignal::m_instance->singnal(full_response.c_str());)把消息发给主客户端,这样主客户端就能用槽函数的形式实现异步效果能把所有数据显示到控件上且不会让程序异常。
3.deepseek流式数据,我需要实时解析流式的json让他能一段字一段子的显示到控件上,提高用户体验参考代码 const auto& content = root[“choices”][0][“delta”][“content”];下的实现,其实就是使用jsoncpp对json解析得出返回值
4.使用connect对信号进行连接 connect(globalSignal::m_instance,&globalSignal::singnal,ui->textEdit,[=](QString ip)
{
逻辑代码
}
connect(发送者,发送的信号,要处理的对象,回调函数或lambda函数)
5.界面设计,参考我以前的文章有叫你如何设计最简单的控件客户端

http://www.dtcms.com/wzjs/107033.html

相关文章:

  • 企业网站建设兴田德润实惠哈尔滨seo关键词排名
  • wordpress如何自建站成人电脑培训班办公软件
  • 高端营销型网站建设品牌常州网站建设书生商友
  • 从哪些方面评价一个企业的网站建设seo入门版
  • 黄金app软件下载大全免费抖音seo排名
  • 织梦电子行业网站模板seo网站排名优化软件
  • 河北网站建站制作优化公司流程制度
  • 做网站必须花钱吗seo优化排名是什么
  • 基本的网站建设知识青岛做网站的公司哪家好
  • 长沙疫情最新情况2024年百度seo排名点击器
  • 做衣服的网站百度安装应用
  • git做网站根目录百度小说搜索排行榜
  • 用html框架做网站广告优化师发展前景
  • 申请注册邮箱衡阳网站优化公司
  • 学做网站难不难千锋教育和黑马哪个好
  • 做网站和做网页有什么区别网站建设制作公司
  • 企业网站建设排名桂林网页
  • 怎么做网页截图安徽百度seo公司
  • 网站开发与客户交流最新热点新闻事件
  • 网站开发 案例seo优化裤子关键词
  • 西安知名的集团门户网站建设公司淘宝的关键词排名怎么查
  • 泰安网站建设哪家快英文外链seo兼职在哪里找
  • 基于p2p的网站建设搜索引擎推广简称
  • 贵州住房建设厅网站优化大师手机版下载
  • 苏州网站怎么做seo站长
  • 沈阳网站建设工作室seo百度快速排名
  • 尉氏网站建设开发app需要多少资金
  • 怎样做网站结构优化整合营销方案
  • 济南网站建设方案服务找培训机构的app
  • 免费生成网站的appseo对各类网站的作用