[C++] 272 FLTK : ChatGPTアプリの製作 その1 ChatGPT API

[M1 Mac, Monterey 12.6.3, clang 13.0.0, FLTK 1.3.8, ChatGPT Plus, NO IDE]

FLTKでChatGPTアプリを製作します。あくまで私個人用です。

とりあえずたたき台を作成しました。返信されたJSONをそのまま表示しています。

#include <FLstd.h>
#include <cppstd.h>
#include <ChatGPT.h>

Fl_Input* input;
Fl_Text_Display* output;

void sendCB(Fl_Widget*, void*) {
	const char* question0 = input->value();
	string question = string(question0);
	json response = chatWithOpenAI(question);
	string resDump = response.dump();
	cout << resDump << endl;

	Fl_Text_Buffer *buffer = new Fl_Text_Buffer();
	buffer -> text(resDump.c_str());

	output -> buffer(buffer);
	output -> wrap_mode(Fl_Text_Display::WRAP_AT_BOUNDS, 5);
}

int main(int argc, char **argv) {
	Fl_Window* window = new Fl_Window (100, 100, 960, 640, "ChatGPT");
	window->color(fl_rgb_color(208,207,207));
	 
	// Question label
	Fl_Box* inputLabel = new Fl_Box(14,22,26,23,"Q");
	inputLabel->labelsize(18);
	inputLabel->labelcolor(fl_rgb_color(62,66,60));
	inputLabel->align(Fl_Align(FL_ALIGN_INSIDE|FL_ALIGN_LEFT));

	// Question input
	input = new Fl_Input(47,18,360,30,"");
	input->textsize(12);
    	
	// sendBtn
	Fl_Button* sendBtn = new Fl_Button(420,13,60,40,"送信");
	sendBtn->color(fl_rgb_color(112,128,144));
	sendBtn->labelcolor(fl_rgb_color(208,207,207));
	sendBtn->labelsize(16);
	sendBtn->callback(sendCB);

	// Response
	output = new Fl_Text_Display(30,70,448,552,"Response");
	output->labelcolor(fl_rgb_color(62,66,60));
	output->textsize(12);
	output->align(Fl_Align(FL_ALIGN_TOP_RIGHT));
	output->labelsize(10);

	window->end();  
	window->show(argc, argv);

	return Fl::run();
}

[C++] 271 ChatGPT APIをC++で使ってみる

[M1 Mac, Monterey 12.6.3, clang 13.0.0, ChatGPT Plus, NO IDE]

本日2023年3月2日からChatGPT APIが公開されたので早速使ってみました。

C++でChatGPTツールを製作し、ChatGPT Plusは解約して格安で使ってやろうという算段です。

#include <cppstd.h> // 自製ヘッダ
#include <curl/curl.h>
#include <nlohmann/json.hpp>

using json = nlohmann::json;

// Utility function to write response data to a string
size_t writeCallback(char* buf, size_t size, size_t nmemb, void* up) {
    // Append the response data to the string
    ((string*)up)->append((char*)buf, size * nmemb);
    return size * nmemb;
}

json chatWithOpenAI(const string& question) {
    // Set up the request parameters
    string url = "https://api.openai.com/v1/chat/completions";
    string apiKey = getenv("CHATGPT_API_KEY");
    string authHeader = "Authorization: Bearer " + apiKey;

    curl_slist* headers = nullptr;
    headers = curl_slist_append(headers, authHeader.c_str());
    headers = curl_slist_append(headers, "Content-Type: application/json");

    string requestData = R"({"model":"gpt-3.5-turbo", "messages":[{"role":"user","content":")" + question + R"("}], "temperature":0.0})";
    string responseData;

    cout << "requestData: " << requestData << endl;

    // Set up a curl session
    CURL* curl = curl_easy_init();
    if (curl) {
        // Set the request options
        curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
        curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
        curl_easy_setopt(curl, CURLOPT_POSTFIELDS, requestData.c_str());
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writeCallback);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, &responseData);

        // Send the request
        CURLcode res = curl_easy_perform(curl);
        if (res != CURLE_OK) {
            cerr << "curl_easy_perform() failed: " << curl_easy_strerror(res) << endl;
        }

        // Clean up
        curl_easy_cleanup(curl);

    } else {
        cerr << "curl_easy_init() failed" << endl;
    }

    // Parse the response data and extract the chat response
    json responseJson = json::parse(responseData);

    return responseJson;
}

int main() {
    string question = "iOSアプリをObjective-CやSwift以外の言語で作れますか";
    json response = chatWithOpenAI(question);
    cout << response.dump() << endl;
    return 0;
}
{"choices":[{"finish_reason":"stop","index":0,"message":
{"content":"\n\niOSアプリを作るためには、Appleが提供するiOS SDKを使用する必要があります。
iOS SDKはObjective-CやSwiftで書かれていますが、他の言語で書かれたアプリを作ることも可能です。\n\n
例えば、React NativeやXamarinなどのクロスプラットフォーム開発ツールを使用することで、
JavaScriptやC#などの言語でiOSアプリを作ることができます。
ただし、これらのツールはiOS SDKをラップしているため、一部の機能に制限がある場合があります。\n\n
また、C++やObjective-C++などの言語を使用してiOSアプリを作ることもできます。
ただし、iOS SDKの一部の機能にアクセスするためには、Objective-CやSwiftの知識が必要になる場合があります。\n\n
総じて、iOSアプリを作るためには、iOS SDKを使用する必要がありますが、他の言語を使用することも可能です。
ただし、iOS SDKの機能にアクセスするためには、Objective-CやSwiftの知識が必要になる場合があるため、
これらの言語を学ぶことをお勧めします。","role":"assistant"}}],"created":***,"id":"***","model":"gpt-3.5-turbo-0301","object":"chat.completion","usage":{"completion_tokens":348,"prompt_tokens":27,"total_tokens":375}}