Chat-GPTのAPIにC++でリクエストする

# Chat-GPTのAPIにC++でリクエストする


## 自己紹介
　記事には全く関係ないのですが、初めての投稿ということで少しだけお話させてください。
現在、大学4回生の情報系大学生になります。今後、余裕があればQiitaに自分が学習した事を投稿しようと思います。初心者ですが、よろしくおねがいします。


## 概要
　Chat-GPTのAPIを使う際、PythonやNode.jsなど人気でプログラミングしやすい言語でリクエストのプログラムを書いている記事をよく拝見します。もちろん、書きやすいことに越したことはないのですが、今回はあえて自分が最近勉強しているC++でChat-GPTのAPIへリクエストを送信し、GPTからの回答を受信できるプログラムを書きました。
　プログラムで使用するライブラリについては詳しく触れません。インストールは簡単なので、各自でよろしくです。


## 使用するライブラリ
- cpp-httplib(ブロッキング)  
- nlohmann.json.hpp  


## 処理順序
　以下に今回作成したプログラムの処理順序を示します。
1. 予め用意しておいたOpenAIのAPIKeyが記載されたテキストファイルからAPIKeyを読む。
1. Chat-GPTへリクエストを送信する先のURLを指定し、リクエスト用のインスタンスを作成。
1. ヘッダーの内容を指定し、ボディにはChat-GPTへ送信したいデータを指定。
1. リクエストを送信。
1. Chat-GPTからのレスポンスを受信し、受信データをJSONにパース。
1. 最後にChat-GPTからの質問に対する回答を表示

　上記のような流れで処理します。


## プログラム
```c++
#define CPPHTTPLIB_OPENSSL_SUPPORT
#include <iostream>
#include <nlohmann/json.hpp>
#include <httplib.h>


std::string readApiKey() {
    std::ifstream file("OpenAI_Key.txt");

    if (file.is_open()) {
        std::string line;

        while (std::getline(file, line)) {
            //std::cout << line << '\n';
        }

        file.close();
        // 読み込んだデータを返す
        return line;
    } else {
        std::cerr << "Unable to open file\n";
        return "error";
    }
}


int main() {
    httplib::SSLClient cli("api.openai.com", 443);

    // OpenAIのAPIKeyをファイルから読む
    std::string apiKey = readApiKey();
    if (apiKey == "error") {
        return 0;
    }

    // ヘッダーを作成
    httplib::Headers headers = {
        {"Content-Type", "application/json"},
        {"Authorization", "Bearer " + apiKey}
    };
   
    // Body内容を作成
    nlohmann::json jsonBody;
    jsonBody["model"] = "gpt-3.5-turbo";
    jsonBody["messages"] = {
        {{"role", "user"}, {"content", "Hello! What's your name?"}}
    };
    jsonBody["temperature"] = 0.7;

    // JSONデータを文字列に変換
    std::string body = jsonBody.dump();

    // POSTリクエストを送信
    auto res = cli.Post("/v1/chat/completions", headers, body, "application/json");
    
    if (res && res->status == 200) {
        // レスポンスをJSONに変換
        nlohmann::json resJson = nlohmann::json::parse(res->body);
        // Chat-GPTからの回答を表示
        std::cout << "Chat-GPT's response: " << resJson["choices"][0]["message"]["content"] << std::endl;
    } else {
        std::cout << "Request failed!" << std::endl;
        if (res) {
            std::cout << "Status code: " << res->status << std::endl;
            std::cout << "Body: " << res->body << std::endl;
        }
    }

    return 0;

}

```


## コンパイル方法
　cpp-httplibを使用するため、ライブラリやヘッダーへのパスをコンパイラに教える必要があります。以下に私がコンパイルした際のMakefileを書いておきますので、参考程度に見てください。

```Makefile
CC = g++
CFLAGS = -std=c++11 -O2 -Wall -I/home/kenji/WorkSpace/temp/cpp-httplib-master
LFLAGS = -L/usr/lib/x86_64-linux-gnu -lssl -lcrypto -pthread

all: client 

client: requestMessage.cpp
	$(CC) $(CFLAGS) -o requestMessage requestMessage.cpp $(LFLAGS)

```


## 実行結果
　実行結果を以下に示します。

```bash
Chat-GPT's response: "I am an AI language model created by OpenAI, I don't have a name. You can call me OpenAI though! How may I assist you today?"
```

　特に問題なく実行できると思います。（Chat-GPTからのレスポンス形式に変更があれば別）


## 感想
　PythonであればChat-GPTへのリクエスト用ライブラリがあるため、C++より簡単にプログラムを書くことができます。ただ、今回はC++の勉強ということもあり、このような記事を書かせて頂きました。