スポンサーリンク

C/C++からlibcurlでOpenAIに接続してみる

サンプルコード

SSLに対応したlibcurlで、OpenAIへリクエストを送る。


#include <iostream>
#include <fstream>
#include <string>

// libcurlを使うために必要
#define CURL_STATICLIB 
#include <curl/curl.h>

// ssl対応したlibcurlに必要
#pragma comment(lib, "CRYPT32.LIB")
#pragma comment(lib, "wldap32.lib" )
#pragma comment(lib, "Ws2_32.lib")

// ssl対応したlibcurlに必要
#pragma comment(lib,"libcurl.lib")
#pragma comment(lib,"libssl.lib")
#pragma comment(lib,"libcrypto.lib")


std::size_t WriteCallback(
    const char* in,
    std::size_t size,
    std::size_t num,
    std::string* out)
{
    const std::size_t totalBytes(size * num);
    out->append(in, totalBytes);
    return totalBytes;
}

////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////

int main() {

    ////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////
    // まず、OpenAI APIへアクセスするURLと、送信するデータを定義する

    // text-davinci-003 がモデル名。
    const std::string url = "https://api.openai.com/v1/engines/text-davinci-003/completions";

    // 送信するデータをjsonで記述。promptに指示を入れる。
    const std::string data = 
R"(
        {
            "prompt":"Translate the following English text to Japanese Romaji: 'Hello, world'", 
            "max_tokens":60
        }
)";

    ////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////
    // ここからlibcurlの処理開始

    CURL* curl = curl_easy_init();

    if (!curl) {
        std::cerr << "Error: Failed to initialize libcurl." << std::endl;
        return false;
    }
    ////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////
    // httpsの場合は、以下の設定が必要
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYSTATUS, 1);
    curl_easy_setopt(curl, CURLOPT_CAINFO, R"(.\cacert.pem)");
    curl_easy_setopt(curl, CURLOPT_CAPATH, R"(.\cacert.pem)");
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 1L);
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 1L);
    ////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////
    // サーバー側からの返答を受け取る関数と受け取ったデータを保存する変数を渡す
    std::string response;
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response);

    // OpenAI APIへのアクセスをするURLを設定
    CURLcode res = curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
    if (res != CURLE_OK) {
        fprintf(stderr, "curl_easy_setopt() failed: %s\n", curl_easy_strerror(res));
        return 1;
    }

    // sk-ABCDEFGHIJK1234567890 はAPIキー。これを自分のものに変える。
    curl_slist* hs = NULL;
    hs = curl_slist_append(hs, "Content-Type: application/json");
    hs = curl_slist_append(hs, "Authorization: Bearer sk-ABCDEFGHIJK1234567890");

    curl_easy_setopt(curl, CURLOPT_HTTPHEADER, hs);
    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data.c_str());

    ////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////

    // 通信の実行
    res = curl_easy_perform(curl);
    if (res != CURLE_OK) {
        fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
    }
    else {

        // エラーの場合は、response_codeが200以外になる
        long response_code;
        curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &response_code);
        if (response_code != 200) {
            std::wcout << "ERROR" << std::endl;
        }
        else
        {
	    std::wcout << "SUCCESS" << std::endl;
	}
        // 成功の場合、responseには結果が入る。
        // エラーの場合、responseにはエラーの原因などが入る。
        std::cout << "HTTP Response code: " << response_code << std::endl;
        std::cout << "Response: " << response << std::endl;

        // utf8で受け取ったデータを、Shift-JISに変換して保存する
        std::ofstream ofs("response.txt");
        ofs << response;
        ofs.close();

    }

    ////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////

    curl_slist_free_all(hs);
    curl_easy_cleanup(curl);

    return 0;
}

返答(成功例)

{"id":"cmpl-7NcCYUs1IuINlSSc8Km6ulUTjrakG","object":"text_completion","created":1685862746,"model":"text-davinci-003","choices":[{"text":"\n\nKonnichiwa, sekai.","index":0,"logprobs":null,"finish_reason":"stop"}],"usage":{"prompt_tokens":16,"completion_tokens":11,"total_tokens":27}}

ローマ字と指定しているので、Konnichiwa, sekai という返答が返ってきている。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


この記事のトラックバックURL: