This commit is contained in:
JackLee 2025-02-25 17:15:34 +08:00
parent 9c13b07c57
commit bda7544811
29 changed files with 4848 additions and 3781 deletions

Binary file not shown.

View File

@ -1,79 +1,29 @@
# ninja log v6
18 269 7621645896591194 F:/SourceCode/ctai/build/ctai_autogen/mocs_compilation.cpp da3870ebc94b983e
17912 29809 7621646075529326 F:/SourceCode/ctai/release/ctai.exe b22720a33d64aaa9
25 226 7621775545718640 ctai_autogen/mocs_compilation.cpp da3870ebc94b983e
3831 14140 7621766760724707 CMakeFiles/ctai.dir/src/ctai.cpp.obj c7f0e07034d2e115
4070 13239 7620828272176219 CMakeFiles/ctai.dir/src/sui.cpp.obj e1630d781a04e855
3857 4054 7620828271905766 qrc_res.cpp 9794859fafc6825
3707 13634 7621643165268059 CMakeFiles/ctai.dir/src/ctai_tabwidget.cpp.obj 6fa8a641137702e0
4080 8720 7620828272270625 CMakeFiles/ctai.dir/qrc_res.cpp.obj 9f74f1f5e59b5b50
3560 6938 7621113173344145 CMakeFiles/ctai.dir/src/ctai_switch_control.cpp.obj ddca150b42c8a71b
270 17912 7621645899099118 CMakeFiles/ctai.dir/src/ctai_curl.cpp.obj b2496aab435c15c7
18 269 7621645896591194 ctai_autogen/timestamp da3870ebc94b983e
18 269 7621645896591194 ctai_autogen/mocs_compilation.cpp da3870ebc94b983e
3701 14345 7621643165213401 CMakeFiles/ctai.dir/src/ctai.cpp.obj c7f0e07034d2e115
18 269 7621645896591194 F:/SourceCode/ctai/build/ctai_autogen/timestamp da3870ebc94b983e
3857 4054 7620828271905766 F:/SourceCode/ctai/build/qrc_res.cpp 9794859fafc6825
4075 7860 7620828272226167 CMakeFiles/ctai.dir/src/sui_sys_style.cpp.obj 3bdd07348bd84970
3705 14181 7621643165248358 CMakeFiles/ctai.dir/src/ctai_session_widget.cpp.obj 578ff58396e1bb80
3710 14540 7621643165298228 CMakeFiles/ctai.dir/src/main.cpp.obj 77280178abb968fc
16477 27054 7621775710223975 F:/SourceCode/ctai/release/ctai.exe b22720a33d64aaa9
25 226 7621775545718640 F:/SourceCode/ctai/build/ctai_autogen/mocs_compilation.cpp da3870ebc94b983e
256 715 7621662369248829 qrc_res.cpp 9794859fafc6825
4072 16884 7620828272196197 CMakeFiles/ctai.dir/src/sui_base_ex.cpp.obj 476c94d1f2c8cfea
3840 14031 7621766760809715 CMakeFiles/ctai.dir/src/main.cpp.obj 77280178abb968fc
4083 4223 7620828272305402 CMakeFiles/ctai.dir/sui.rc.obj e30df163c9cbe567
3699 15187 7621643165180959 CMakeFiles/ctai.dir/ctai_autogen/mocs_compilation.cpp.obj 696927afe9114740
25 226 7621775545718640 F:/SourceCode/ctai/build/ctai_autogen/timestamp da3870ebc94b983e
25 226 7621775545718640 ctai_autogen/timestamp da3870ebc94b983e
227 16477 7621775547726025 CMakeFiles/ctai.dir/src/ctai_curl.cpp.obj b2496aab435c15c7
4075 7860 7620828272226167 CMakeFiles/ctai.dir/src/sui_sys_style.cpp.obj 3bdd07348bd84970
256 715 7621662369248829 F:/SourceCode/ctai/build/qrc_res.cpp 9794859fafc6825
3835 13799 7621766760764673 CMakeFiles/ctai.dir/src/ctai_session_widget.cpp.obj 578ff58396e1bb80
3838 13416 7621766760789738 CMakeFiles/ctai.dir/src/ctai_tabwidget.cpp.obj 6fa8a641137702e0
717 3477 7621662369402559 CMakeFiles/ctai.dir/qrc_res.cpp.obj 9f74f1f5e59b5b50
3560 6938 7621113173344145 CMakeFiles/ctai.dir/src/ctai_switch_control.cpp.obj ddca150b42c8a71b
4077 13615 7620828272253227 CMakeFiles/ctai.dir/src/sui_title.cpp.obj e026b4b712cf9da4
3829 14642 7621766760704728 CMakeFiles/ctai.dir/ctai_autogen/mocs_compilation.cpp.obj 696927afe9114740
4058 8712 7620828272053173 CMakeFiles/ctai.dir/src/ctai_cmd.cpp.obj 80d6964d23a3e9c5
4063 8329 7620828272105475 CMakeFiles/ctai.dir/src/ctai_tabbar.cpp.obj 41b68d110b3c0daf
4077 13615 7620828272253227 CMakeFiles/ctai.dir/src/sui_title.cpp.obj e026b4b712cf9da4
22 3910 7621650333612904 ctai_autogen/timestamp da3870ebc94b983e
22 3910 7621650333612904 ctai_autogen/mocs_compilation.cpp da3870ebc94b983e
22 3910 7621650333612904 F:/SourceCode/ctai/build/ctai_autogen/timestamp da3870ebc94b983e
22 3910 7621650333612904 F:/SourceCode/ctai/build/ctai_autogen/mocs_compilation.cpp da3870ebc94b983e
3918 13850 7621650334749376 CMakeFiles/ctai.dir/src/ctai_tabwidget.cpp.obj 6fa8a641137702e0
3916 14284 7621650334731983 CMakeFiles/ctai.dir/src/ctai_session_widget.cpp.obj 578ff58396e1bb80
3920 14523 7621650334766767 CMakeFiles/ctai.dir/src/main.cpp.obj 77280178abb968fc
3912 14606 7621650334681956 CMakeFiles/ctai.dir/src/ctai.cpp.obj c7f0e07034d2e115
3910 15188 7621650334664564 CMakeFiles/ctai.dir/ctai_autogen/mocs_compilation.cpp.obj 696927afe9114740
3914 22527 7621650334699350 CMakeFiles/ctai.dir/src/ctai_curl.cpp.obj b2496aab435c15c7
22527 37074 7621650520836996 F:/SourceCode/ctai/release/ctai.exe b22720a33d64aaa9
17 246 7621651380285822 ctai_autogen/timestamp da3870ebc94b983e
17 246 7621651380285822 ctai_autogen/mocs_compilation.cpp da3870ebc94b983e
17 246 7621651380285822 F:/SourceCode/ctai/build/ctai_autogen/timestamp da3870ebc94b983e
17 246 7621651380285822 F:/SourceCode/ctai/build/ctai_autogen/mocs_compilation.cpp da3870ebc94b983e
247 16317 7621651382575746 CMakeFiles/ctai.dir/src/ctai_curl.cpp.obj b2496aab435c15c7
16317 27314 7621651543281686 F:/SourceCode/ctai/release/ctai.exe b22720a33d64aaa9
17 250 7621651864764006 ctai_autogen/timestamp da3870ebc94b983e
17 250 7621651864764006 ctai_autogen/mocs_compilation.cpp da3870ebc94b983e
17 250 7621651864764006 F:/SourceCode/ctai/build/ctai_autogen/timestamp da3870ebc94b983e
17 250 7621651864764006 F:/SourceCode/ctai/build/ctai_autogen/mocs_compilation.cpp da3870ebc94b983e
251 16974 7621651867100074 CMakeFiles/ctai.dir/src/ctai_curl.cpp.obj b2496aab435c15c7
16975 28772 7621652034347252 F:/SourceCode/ctai/release/ctai.exe b22720a33d64aaa9
17 268 7621652186939700 ctai_autogen/timestamp da3870ebc94b983e
17 268 7621652186939700 ctai_autogen/mocs_compilation.cpp da3870ebc94b983e
17 268 7621652186939700 F:/SourceCode/ctai/build/ctai_autogen/timestamp da3870ebc94b983e
17 268 7621652186939700 F:/SourceCode/ctai/build/ctai_autogen/mocs_compilation.cpp da3870ebc94b983e
16 231 7621652577848968 ctai_autogen/timestamp da3870ebc94b983e
16 231 7621652577848968 ctai_autogen/mocs_compilation.cpp da3870ebc94b983e
16 231 7621652577848968 F:/SourceCode/ctai/build/ctai_autogen/timestamp da3870ebc94b983e
16 231 7621652577848968 F:/SourceCode/ctai/build/ctai_autogen/mocs_compilation.cpp da3870ebc94b983e
232 16857 7621652579997141 CMakeFiles/ctai.dir/src/ctai_curl.cpp.obj b2496aab435c15c7
16858 29066 7621652746267812 F:/SourceCode/ctai/release/ctai.exe b22720a33d64aaa9
17 4054 7621653801163666 ctai_autogen/timestamp da3870ebc94b983e
17 4054 7621653801163666 ctai_autogen/mocs_compilation.cpp da3870ebc94b983e
17 4054 7621653801163666 F:/SourceCode/ctai/build/ctai_autogen/timestamp da3870ebc94b983e
17 4054 7621653801163666 F:/SourceCode/ctai/build/ctai_autogen/mocs_compilation.cpp da3870ebc94b983e
4062 14196 7621653802323893 CMakeFiles/ctai.dir/src/ctai_tabwidget.cpp.obj 6fa8a641137702e0
4061 14549 7621653802313691 CMakeFiles/ctai.dir/src/ctai_session_widget.cpp.obj 578ff58396e1bb80
4057 14885 7621653802268871 CMakeFiles/ctai.dir/src/ctai.cpp.obj c7f0e07034d2e115
4064 14927 7621653802341325 CMakeFiles/ctai.dir/src/main.cpp.obj 77280178abb968fc
4055 15492 7621653802251470 CMakeFiles/ctai.dir/ctai_autogen/mocs_compilation.cpp.obj 696927afe9114740
4059 23111 7621653802286262 CMakeFiles/ctai.dir/src/ctai_curl.cpp.obj b2496aab435c15c7
23112 33632 7621653992815378 F:/SourceCode/ctai/release/ctai.exe b22720a33d64aaa9
16 258 7621654925130662 ctai_autogen/timestamp da3870ebc94b983e
16 258 7621654925130662 ctai_autogen/mocs_compilation.cpp da3870ebc94b983e
16 258 7621654925130662 F:/SourceCode/ctai/build/ctai_autogen/timestamp da3870ebc94b983e
16 258 7621654925130662 F:/SourceCode/ctai/build/ctai_autogen/mocs_compilation.cpp da3870ebc94b983e
259 8971 7621654927559068 CMakeFiles/ctai.dir/src/ctai_session_widget.cpp.obj 578ff58396e1bb80
8971 19412 7621655014698186 F:/SourceCode/ctai/release/ctai.exe b22720a33d64aaa9
23 286 7621655252953030 ctai_autogen/timestamp da3870ebc94b983e
23 286 7621655252953030 ctai_autogen/mocs_compilation.cpp da3870ebc94b983e
23 286 7621655252953030 F:/SourceCode/ctai/build/ctai_autogen/timestamp da3870ebc94b983e
23 286 7621655252953030 F:/SourceCode/ctai/build/ctai_autogen/mocs_compilation.cpp da3870ebc94b983e
287 8389 7621655255599989 CMakeFiles/ctai.dir/src/ctai_session_widget.cpp.obj 578ff58396e1bb80
16 11189 7621655396214908 F:/SourceCode/ctai/release/ctai.exe b22720a33d64aaa9
31 286 7621777320575844 ctai_autogen/timestamp da3870ebc94b983e
31 286 7621777320575844 ctai_autogen/mocs_compilation.cpp da3870ebc94b983e
31 286 7621777320575844 F:/SourceCode/ctai/build/ctai_autogen/timestamp da3870ebc94b983e
31 286 7621777320575844 F:/SourceCode/ctai/build/ctai_autogen/mocs_compilation.cpp da3870ebc94b983e
287 15537 7621777323141011 CMakeFiles/ctai.dir/src/ctai_curl.cpp.obj b2496aab435c15c7
15537 25734 7621777475639941 F:/SourceCode/ctai/release/ctai.exe b22720a33d64aaa9

File diff suppressed because it is too large Load Diff

View File

@ -38,7 +38,7 @@ constexpr auto qt_meta_stringdata_CLASSctai_curlENDCLASS = QtMocHelpers::stringD
"ctai_curl",
"send_post_out_data",
"",
"send_data",
"model_data",
"out_data"
);
#else // !QT_MOC_HAS_STRINGDATA
@ -79,7 +79,7 @@ Q_CONSTINIT const QMetaObject ctai_curl::staticMetaObject = { {
QtPrivate::TypeAndForceComplete<ctai_curl, std::true_type>,
// method 'send_post_out_data'
QtPrivate::TypeAndForceComplete<void, std::false_type>,
QtPrivate::TypeAndForceComplete<send_data, std::false_type>
QtPrivate::TypeAndForceComplete<model_data, std::false_type>
>,
nullptr
} };
@ -90,13 +90,13 @@ void ctai_curl::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, v
auto *_t = static_cast<ctai_curl *>(_o);
(void)_t;
switch (_id) {
case 0: _t->send_post_out_data((*reinterpret_cast< std::add_pointer_t<send_data>>(_a[1]))); break;
case 0: _t->send_post_out_data((*reinterpret_cast< std::add_pointer_t<model_data>>(_a[1]))); break;
default: ;
}
} else if (_c == QMetaObject::IndexOfMethod) {
int *result = reinterpret_cast<int *>(_a[0]);
{
using _t = void (ctai_curl::*)(send_data );
using _t = void (ctai_curl::*)(model_data );
if (_t _q_method = &ctai_curl::send_post_out_data; *reinterpret_cast<_t *>(_a[1]) == _q_method) {
*result = 0;
return;
@ -136,7 +136,7 @@ int ctai_curl::qt_metacall(QMetaObject::Call _c, int _id, void **_a)
}
// SIGNAL 0
void ctai_curl::send_post_out_data(send_data _t1)
void ctai_curl::send_post_out_data(model_data _t1)
{
void *_a[] = { nullptr, const_cast<void*>(reinterpret_cast<const void*>(std::addressof(_t1))) };
QMetaObject::activate(this, &staticMetaObject, 0, _a);

View File

@ -39,8 +39,8 @@ constexpr auto qt_meta_stringdata_CLASSctai_session_widgetENDCLASS = QtMocHelper
"ctai_session_widget",
"ctai_session_user_sending",
"",
"ctai_session_set_send_info",
"send_data",
"ctai_session_postback_info",
"model_data",
"resp_data",
"ctai_session_set_steam_mode"
);
@ -86,9 +86,9 @@ Q_CONSTINIT const QMetaObject ctai_session_widget::staticMetaObject = { {
QtPrivate::TypeAndForceComplete<ctai_session_widget, std::true_type>,
// method 'ctai_session_user_sending'
QtPrivate::TypeAndForceComplete<void, std::false_type>,
// method 'ctai_session_set_send_info'
// method 'ctai_session_postback_info'
QtPrivate::TypeAndForceComplete<void, std::false_type>,
QtPrivate::TypeAndForceComplete<send_data, std::false_type>,
QtPrivate::TypeAndForceComplete<model_data, std::false_type>,
// method 'ctai_session_set_steam_mode'
QtPrivate::TypeAndForceComplete<void, std::false_type>,
QtPrivate::TypeAndForceComplete<bool, std::false_type>
@ -103,7 +103,7 @@ void ctai_session_widget::qt_static_metacall(QObject *_o, QMetaObject::Call _c,
(void)_t;
switch (_id) {
case 0: _t->ctai_session_user_sending(); break;
case 1: _t->ctai_session_set_send_info((*reinterpret_cast< std::add_pointer_t<send_data>>(_a[1]))); break;
case 1: _t->ctai_session_postback_info((*reinterpret_cast< std::add_pointer_t<model_data>>(_a[1]))); break;
case 2: _t->ctai_session_set_steam_mode((*reinterpret_cast< std::add_pointer_t<bool>>(_a[1]))); break;
default: ;
}

File diff suppressed because it is too large Load Diff

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 703 B

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 605 B

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 602 B

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 893 B

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 928 B

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 963 B

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 952 B

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 769 B

After

Width:  |  Height:  |  Size: 2.3 KiB

8
save/sui.json Normal file
View File

@ -0,0 +1,8 @@
{
"sui": {
"font": 0,
"font_bold": 0,
"style": 1,
"style_system": 0
}
}

View File

@ -1,6 +1,7 @@
#include "ctai_curl.h"
ctai_curl::ctai_curl()
ctai_curl::ctai_curl() : m_curl(nullptr),
m_headers(nullptr)
{
}
ctai_curl::~ctai_curl()
@ -11,51 +12,37 @@ ctai_curl::~ctai_curl()
m_curl = nullptr; // 可选,避免野指针
}
}
size_t curl_callback(void *buffer, size_t sz, size_t nmemb, void *userdata)
// 流式输出回调
size_t stream_callback(void *buffer, size_t sz, size_t nmemb, void *userdata)
{
auto ctx = static_cast<call_back_context *>(userdata);
std::unique_lock<std::mutex> lock(ctx->instance->m_mutex);
size_t size = sz * nmemb;
if (ctx->m_data.steam_mode)
{
std::string chunk(static_cast<char *>(buffer), size);
qDebug()<<"info:"<<chunk;
std::string chunk(static_cast<char *>(buffer), size);
if(ctx->m_data.postback_stream_mode){
ctx->instance->send_stream(ctx->m_data, chunk);
}
else
{
ctx->m_data.model_data.append(static_cast<char *>(buffer), size);
}
}
qDebug() << "steam data chunk:" << chunk;
lock.unlock();
return sz * nmemb;
}
void ctai_curl::curl_init(send_data _send_args)
// 非流式输出回调
size_t not_stream_callback(void *buffer, size_t sz, size_t nmemb, void *userdata)
{
curl_global_init(CURL_GLOBAL_ALL);
m_curl = curl_easy_init();
m_error = CURLE_QUOTE_ERROR;
m_headers = nullptr;
set_send_post_option(_send_args);
}
void ctai_curl::set_send_post_option(send_data m_args)
{
set_send_post_headers(m_args.content_header);
set_send_post_headers(m_args.accept_header);
set_send_post_headers(m_args.api_key);
curl_easy_setopt(m_curl, CURLOPT_URL, m_args.api_url.c_str());
set_send_post_ssl(m_args.ssl_state);
set_send_post_timeout(m_args.timeout);
curl_easy_setopt(m_curl, CURLOPT_HTTPHEADER, m_headers);
curl_easy_setopt(m_curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0);
curl_easy_setopt(m_curl, CURLOPT_WRITEFUNCTION, curl_callback);
std::string *psResponse = static_cast<std::string *>(userdata);
size_t size = sz * nmemb;
psResponse->append(static_cast<char *>(buffer), size);
qDebug() << "not steam data chunk:" << *psResponse;
return sz * nmemb;
}
void ctai_curl::set_send_post_headers(std::string head_str)
{
{
m_headers = curl_slist_append(m_headers, head_str.c_str());
qDebug() << "header:" << head_str;
curl_easy_setopt(m_curl, CURLOPT_HTTPHEADER, m_headers);
}
void ctai_curl::set_send_post_ssl(bool ssl_state)
void ctai_curl::set_curl_ssl(bool ssl_state)
{
std::string ca_bundle = QDir::currentPath().toStdString() + "/cert/cacert.pem";
if (ssl_state)
@ -70,12 +57,14 @@ void ctai_curl::set_send_post_ssl(bool ssl_state)
curl_easy_setopt(m_curl, CURLOPT_SSL_VERIFYHOST, 0L);
ssl_state = false;
}
qDebug() << "curl opts ssl:" << ssl_state<<"ssl_pem:" << ca_bundle;
}
void ctai_curl::set_send_post_timeout(int time)
void ctai_curl::set_curl_timeout(int time)
{
curl_easy_setopt(m_curl, CURLOPT_TIMEOUT, time);
qDebug() << "curl opts timeout:" << time;
}
void ctai_curl::set_send_post_followlocation(bool followlocation_state)
void ctai_curl::set_curl_followlocation(bool followlocation_state)
{
if (followlocation_state)
{
@ -85,8 +74,9 @@ void ctai_curl::set_send_post_followlocation(bool followlocation_state)
{
curl_easy_setopt(m_curl, CURLOPT_FOLLOWLOCATION, 0L);
}
qDebug() << "curl opts followlocation_state:" << followlocation_state;
}
void ctai_curl::set_send_post_debug_verbose(bool verbose_state)
void ctai_curl::set_curl_debug_verbose(bool verbose_state)
{
if (verbose_state)
{
@ -96,8 +86,9 @@ void ctai_curl::set_send_post_debug_verbose(bool verbose_state)
{
curl_easy_setopt(m_curl, CURLOPT_VERBOSE, 0L);
}
qDebug() << "curl opts verbose_state:" << verbose_state;
}
void ctai_curl::set_send_post_tcp_keepalive(bool keepalive_state)
void ctai_curl::set_curl_tcp_keepalive(bool keepalive_state)
{
if (keepalive_state)
{
@ -113,16 +104,9 @@ void ctai_curl::set_send_post_tcp_keepalive(bool keepalive_state)
{
curl_easy_setopt(m_curl, CURLOPT_TCP_KEEPALIVE, 0L);
}
qDebug() << "curl opts keepalive_state:" << keepalive_state;
}
std::string ctai_curl::send_request_body(send_data &_data)
{
json _request_body = {
{"model", _data.user_model},
{"messages", {{{"role", "user"}, {"content", _data.user_data}}}},
{"temperature", 0.7},
{"stream", _data.steam_mode}};
return _request_body.dump();
}
std::vector<std::string> ctai_curl::steam_extract(const std::string &input)
{
std::vector<std::string> result;
@ -132,11 +116,13 @@ std::vector<std::string> ctai_curl::steam_extract(const std::string &input)
auto words_end = std::sregex_iterator();
// 遍历所有匹配结果
for (std::sregex_iterator i = words_begin; i != words_end; ++i) {
for (std::sregex_iterator i = words_begin; i != words_end; ++i)
{
std::smatch match = *i;
// 提取捕获组中的内容
result.push_back(match.str(1));
}
qDebug() << "result:" << result;
return result;
}
std::string ctai_curl::send_timestamp_to_time(time_t timestamp)
@ -145,92 +131,152 @@ std::string ctai_curl::send_timestamp_to_time(time_t timestamp)
QDateTime dateTime = QDateTime::fromSecsSinceEpoch(timestamp);
return dateTime.toString("yyyy-MM-dd hh:mm:ss").toStdString();
}
void ctai_curl::send_stream(send_data &data, std::string response_data)
void ctai_curl::send_stream(model_data &data, std::string response_data)
{
std::vector<std::string> _info_data = steam_extract(response_data);
for (auto str : _info_data)
{
if (str != "" && str != "[DONE]")
qDebug() << "response_data:" << response_data;
if(!_info_data.empty()){
for (auto str : _info_data)
{
qDebug() << "info:" << str;
json response = json::parse(str);
if (response.contains("choices") && !response["choices"].empty())
if (str != "" && str != "[DONE]")
{
data.model_data = response["choices"][0]["delta"]["content"];
json response = json::parse(str);
if (response.contains("choices") && !response["choices"].empty())
{
data.postback_model_data = response["choices"][0]["delta"]["content"];
}
// 获取时间戳自动转换为时间
if (response.contains("created") && !response["created"].empty())
{
data.postback_time = send_timestamp_to_time(response["created"]);
}
emit send_post_out_data(data);
}
// 获取时间戳自动转换为时间
if (response.contains("created") && !response["created"].empty())
{
data.time = send_timestamp_to_time(response["created"]);
}
emit send_post_out_data(data);
qDebug() << "send_stream:" << str;
}
}
}
void ctai_curl::send_not_stream(send_data &data, std::string response_data)
void ctai_curl::send_not_stream(model_data &data, std::string response_data)
{
json response = json::parse(response_data);
// 获取返回内容
if (response.contains("choices") && !response["choices"].empty())
{
data.model_data = response["choices"][0]["message"]["content"];
data.postback_model_data = response["choices"][0]["message"]["content"];
}
// 获取时间戳自动转换为时间
if (response.contains("created") && !response["created"].empty())
{
data.time = send_timestamp_to_time(response["created"]);
data.postback_time = send_timestamp_to_time(response["created"]);
}
// 生成模型
if (response.contains("model") && !response["model"].empty())
{
data.server_model = response["model"];
data.postback_server_model = response["model"];
}
// 数据信息
if (response.contains("usage") && !response["usage"].empty())
{
if (response["usage"].contains("prompt_tokens"))
{
data.prompt_tokens = response["usage"]["prompt_tokens"];
data.postback_prompt_tokens = response["usage"]["prompt_tokens"];
}
if (response["usage"].contains("completion_tokens"))
{
data.completion_tokens = response["usage"]["completion_tokens"];
data.postback_completion_tokens = response["usage"]["completion_tokens"];
}
if (response["usage"].contains("total_tokens"))
{
data.total_tokens = response["usage"]["total_tokens"];
data.postback_total_tokens = response["usage"]["total_tokens"];
}
if (response["usage"].contains("prompt_cache_hit_tokens"))
{
data.prompt_cache_hit_tokens = response["usage"]["prompt_cache_hit_tokens"];
data.postback_prompt_cache_hit_tokens = response["usage"]["prompt_cache_hit_tokens"];
}
if (response["usage"].contains("prompt_cache_miss_tokens"))
{
data.prompt_cache_hit_tokens = response["usage"]["prompt_cache_miss_tokens"];
data.postback_prompt_cache_hit_tokens = response["usage"]["prompt_cache_miss_tokens"];
}
}
qDebug() << "send_not_stream:" << response_data;
}
void ctai_curl::send_post_response(send_data &data)
std::string ctai_curl::send_send_body(model_data m_data)
{
json _request_body = {
{"model", m_data.user_model},
{"messages", {{{"role", "user"}, {"content", m_data.send_user_data}}}},
{"temperature", 0.7},
{"stream", m_data.postback_stream_mode}};
// 添加有效性检查
if(_request_body.is_discarded()) {
qDebug() << "Invalid JSON construction";
return "";
}
std::string body=_request_body.dump();
qDebug() << "send_request_body:" << body;
return body;
}
void ctai_curl::set_send_post_option(model_data m_data)
{
std::string request_body_str = send_send_body(m_data);
set_send_post_headers(m_data.send_content_header);
set_send_post_headers(m_data.send_accept_header);
set_send_post_headers(m_data.api_key);
curl_easy_setopt(m_curl, CURLOPT_ENCODING, "UTF-8");
curl_easy_setopt(m_curl, CURLOPT_URL, m_data.api_url.c_str());
curl_easy_setopt(m_curl, CURLOPT_POST, 1L);
curl_easy_setopt(m_curl, CURLOPT_POSTFIELDS, request_body_str.c_str());
curl_easy_setopt(m_curl, CURLOPT_POSTFIELDSIZE, request_body_str.length());
curl_easy_setopt(m_curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0);
}
void ctai_curl::curl_init(curl_opts opts)
{
curl_global_init(CURL_GLOBAL_ALL);
m_curl = curl_easy_init();
m_error = CURLE_QUOTE_ERROR;
m_headers = nullptr;
set_curl_ssl(opts.ssl_state);
set_curl_timeout(opts.timeout);
set_curl_followlocation(opts.followlocation);
set_curl_debug_verbose(opts.verbose);
set_curl_tcp_keepalive(opts.keepalive);
}
void ctai_curl::send_post_response(model_data m_data)
{
set_send_post_option(m_data);
std::string response_data;
call_back_context ctx;
if (m_data.postback_stream_mode)
{
//流式输出
ctx.m_data = m_data;
ctx.instance = this;
curl_easy_setopt(m_curl, CURLOPT_WRITEFUNCTION, stream_callback);
curl_easy_setopt(m_curl, CURLOPT_WRITEDATA, &ctx);
}
else
{
//非流式输出
curl_easy_setopt(m_curl, CURLOPT_WRITEFUNCTION, not_stream_callback);
curl_easy_setopt(m_curl, CURLOPT_WRITEDATA, &response_data);
}
if (m_curl)
{
call_back_context ctx;
ctx.m_data = data;
ctx.instance = this;
std::string request_body_str = send_request_body(data);
curl_easy_setopt(m_curl, CURLOPT_WRITEDATA, &ctx);
curl_easy_setopt(m_curl, CURLOPT_POST, 1L);
curl_easy_setopt(m_curl, CURLOPT_POSTFIELDS, request_body_str.c_str());
curl_easy_setopt(m_curl, CURLOPT_POSTFIELDSIZE, request_body_str.length());
m_error = curl_easy_perform(m_curl);
if (m_error == CURLE_OK)
{
if(!data.steam_mode){
send_not_stream(data,ctx.m_data.model_data);
emit send_post_out_data(data);
}
}else{
if (!m_data.postback_stream_mode)
{
send_not_stream(m_data, response_data.data());
emit send_post_out_data(m_data);
}
}
else
{
qDebug() << "fialed" << m_error;
}
curl_easy_reset(m_curl);
}
}

View File

@ -12,37 +12,42 @@
#include <regex>
using json = nlohmann::json;
typedef struct send_data
{
typedef struct curl_opts
{
bool ssl_state = true;
int timeout = 20;
bool followlocation = false;
bool keepalive = true;
bool verbose = true;
} curl_opts;
typedef struct model_data{
std::string api_url = "https://api.deepseek.com/chat/completions";
std::string api_key = "Authorization: Bearer sk-7e6932ed45674c389dea1cd3481e0ec2";
// std::string api_url="https://api.siliconflow.cn/v1/chat/completions";
// std::string api_key="Authorization: Bearer sk-oiphigpzqtmkkcoucyakrfevcvndroywvxhprvscjqhdykdb";
std::string content_header = "Content-Type: application/json";
std::string accept_header = "Accept: application/json";
bool ssl_state = true;
int timeout = 20;
bool followlocation = false;
bool tcp_keepalive = true;
bool debug_verbose = true;
bool steam_mode = false;
std::string user_data;
std::string model_data;
std::string time;
std::string user_model = "deepseek-chat";
std::string server_model;
std::string finish_reason;
//std::string api_url="https://api.siliconflow.cn/v1/chat/completions";
//std::string api_key="Authorization: Bearer sk-oiphigpzqtmkkcoucyakrfevcvndroywvxhprvscjqhdykdb";
//std::string user_model = "deepseek-ai/DeepSeek-V3";
std::string send_content_header = "Content-Type: application/json";
std::string send_accept_header = "Accept: application/json";
std::string send_user_data;
std::string postback_model_data;
bool postback_stream_mode = false;
std::string postback_time;
std::string postback_server_model;
std::string postback_finish_reason;
// 提示消耗tokens
int prompt_tokens;
int postback_prompt_tokens;
// 生成消耗tokens
int completion_tokens;
int postback_completion_tokens;
// 总消耗tokens
int total_tokens;
int postback_total_tokens;
// 提示命中缓存tokens
int prompt_cache_hit_tokens;
int postback_prompt_cache_hit_tokens;
// 生成未命中缓存tokens
int prompt_cache_miss_tokens;
} send_data;
int postback_prompt_cache_miss_tokens;
}model_data;
class ctai_curl : public QObject
{
@ -50,35 +55,35 @@ class ctai_curl : public QObject
public:
ctai_curl();
~ctai_curl();
void curl_init(send_data);
void set_send_post_option(send_data m_args);
void send_post_response(send_data &post_data);
void send_stream(send_data &, std::string response_data);
void send_not_stream(send_data &, std::string response_data);
void curl_init(curl_opts);
void send_post_response(model_data);
void send_stream(model_data &, std::string response_data);
void send_not_stream(model_data &, std::string response_data);
public:
std::mutex m_mutex;
private:
CURL *m_curl;
curl_slist *m_headers;
CURLcode m_error;
std::string send_request_body(send_data &post_data);
CURL *m_curl;
curl_slist *m_headers;
CURLcode m_error;
void set_send_post_option(model_data);
std::string send_send_body(model_data);
std::vector<std::string> steam_extract(const std::string &input);
void set_send_post_headers(std::string head_str);
void set_send_post_ssl(bool);
void set_send_post_timeout(int time);
void set_send_post_followlocation(bool followlocation_state);
void set_send_post_debug_verbose(bool verbose_state);
void set_send_post_tcp_keepalive(bool keepalive_state);
void set_curl_ssl(bool);
void set_curl_timeout(int time);
void set_curl_followlocation(bool followlocation_state);
void set_curl_debug_verbose(bool verbose_state);
void set_curl_tcp_keepalive(bool keepalive_state);
std::string send_timestamp_to_time(time_t timestamp);
signals:
void send_post_out_data(send_data out_data);
void send_post_out_data(model_data out_data);
};
typedef struct call_back_context
{
ctai_curl *instance;
send_data m_data;
model_data m_data;
} call_back_context;
#endif

View File

@ -94,25 +94,25 @@ void ctai_session_widget::ctai_disable_enable_btn(bool state){
void ctai_session_widget::init_curl()
{
m_curl = new ctai_curl();
m_curl->curl_init(user_args);
connect(m_curl, SIGNAL(send_post_out_data(send_data)), this, SLOT(ctai_session_set_send_info(send_data)));
m_curl->curl_init(curl_opt);
connect(m_curl, SIGNAL(send_post_out_data(model_data)), this, SLOT(ctai_session_postback_info(model_data)));
}
void ctai_session_widget::init_user_btn_size_tips(QPushButton &btn, QSize size, QString tip_str)
{
btn.setIconSize(size);
btn.setToolTip(tip_str);
}
void ctai_session_widget::ctai_session_set_send_info(send_data resp_data){
if(!resp_data.steam_mode){
m_session_info->append(QString::fromStdString(resp_data.time));
m_session_info->append(QString::fromStdString(resp_data.model_data));
void ctai_session_widget::ctai_session_postback_info(model_data resp_data){
if(!resp_data.postback_stream_mode){
m_session_info->append(QString::fromStdString(resp_data.postback_time));
m_session_info->append(QString::fromStdString(resp_data.postback_model_data));
}else{
if (resp_data.time!=current_info_time){
current_info_time=resp_data.time;
m_session_info->append(QString::fromStdString(resp_data.time));
m_session_info->append(QString::fromStdString(resp_data.model_data));
if (resp_data.postback_time!=current_info_time){
current_info_time=resp_data.postback_time;
m_session_info->append(QString::fromStdString(resp_data.postback_time));
m_session_info->append(QString::fromStdString(resp_data.postback_model_data));
}else{
m_session_info->insertPlainText(QString::fromStdString(resp_data.model_data));
m_session_info->insertPlainText(QString::fromStdString(resp_data.postback_model_data));
}
}
@ -122,7 +122,7 @@ void ctai_session_widget::ctai_session_set_send_info(send_data resp_data){
void ctai_session_widget::ctai_session_set_steam_mode(bool state){
qDebug()<<"steam mode:"<<state;
m_steam_switch->setToggle(state);
user_args.steam_mode=state;
user_model_data.postback_stream_mode=state;
}
void ctai_session_widget::ctai_session_user_sending()
{
@ -135,8 +135,8 @@ void ctai_session_widget::ctai_session_user_sending()
{
QFuture<void> future = QtConcurrent::run([=]()
{
user_args.user_data=m_session_user_edit_info->toPlainText().toStdString();
m_curl->send_post_response(user_args);
user_model_data.send_user_data=m_session_user_edit_info->toPlainText().toStdString();
m_curl->send_post_response(user_model_data);
});
ctai_disable_enable_btn(false);
m_lable_tips->setText("正在获取结果...");

View File

@ -58,8 +58,9 @@ private:
":/res/img/btn/btn_clear_context.png",
":/res/img/btn/btn_sending_info.png"};
QSpacerItem *sparcer_item = new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Fixed);
ctai_curl *m_curl;
send_data user_args;
ctai_curl *m_curl;
model_data user_model_data;
curl_opts curl_opt;
std::string current_info_time;
private:
void init_user_btn();
@ -67,7 +68,7 @@ private:
void ctai_disable_enable_btn(bool);
private slots:
void ctai_session_user_sending();
void ctai_session_set_send_info(send_data resp_data);
void ctai_session_postback_info(model_data resp_data);
void ctai_session_set_steam_mode(bool);
};