[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}}