openai-api/openaiclient.cpp

68 lines
1.8 KiB
C++
Raw Permalink Normal View History

2025-04-14 21:01:36 +08:00
#include "openaiclient.h"
#include <iostream>
OpenAIClient::OpenAIClient(asio::io_context& io_context) : io_context_(io_context), socket_(io_context)
{
}
bool OpenAIClient::connect(const std::string& ip, unsigned int port)
{
ip_ = ip;
port_ = std::to_string(port);
try {
asio::ip::tcp::resolver resolver(io_context_);
asio::ip::tcp::resolver::results_type endpoints = resolver.resolve(ip_, port_);
asio::connect(socket_, endpoints);
std::cout << "Connected to server " << ip_ << ":" << port_ << std::endl;
return true;
} catch (const std::exception& ex) {
std::cerr << "Exception: " << ex.what() << "\n";
return false;
}
}
FrameData* OpenAIClient::ask_openai(const std::string& text)
{
FrameData send;
send.type = FrameType::TYPE_REQUEST;
send.data = new char[text.size()];
send.len = text.size();
memcpy(send.data, text.c_str(), text.size());
char* send_data{};
int len{};
std::shared_ptr<int> deleter(new int(1), [send_data](int* p) {
delete p;
delete[] send_data;
});
if (!com_pack(&send, &send_data, len)) {
std::cerr << "com_pack error" << std::endl;
return nullptr;
}
auto send_size = socket_.write_some(asio::buffer(send_data, len));
if (send_size != len) {
std::cerr << "send_size != text.size()" << std::endl;
return nullptr;
}
size_t read_size = socket_.read_some(asio::buffer(tmp_buf_));
FrameData* ret = nullptr;
while (read_size > 0) {
buffer_.push(tmp_buf_.data(), read_size);
auto* frame = com_parse(buffer_);
if (frame) {
ret = frame;
return ret;
}
read_size = socket_.read_some(asio::buffer(tmp_buf_));
}
return ret;
}
void OpenAIClient::disconnect()
{
}