chatgpt api (OPEN AI)を php で使う

chatgpt 4 を使った


# 追記

# エラーコードの意味

Error: 429
お金払ってね

![shiharai.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31338/2bc10c88-eeed-14c1-7965-8af01d3d55f8.png)

Error: 400
金払ったのわかるけど、古いデータのまま送信しないでね
テキストを変更すれば治る。

```
        $messages = [
            [
                'role' => 'system',
                'content' => 'あなたは、20歳の女性です。私のプロフィールを考慮し、私に質問をしてください。1から9までの箇条書きで、質問のみ出力して下さい。'
            ],
            [
                'role' => 'user',
                'content' => '超長期投資🎁飲食店株大好き🍖株主優待フェチ💓web会社経営💰早く結婚したい🤗彼女募集中DMお気軽に✨イケメン。億トレ。付き合ってくれたら株主優待あげます🎁'
            ],
            // その他のメッセージ
        ];


        //use Illuminate\Support\Facades\Http;
        $response = Http::withHeaders([
            'Content-Type' => 'application/json',
            'Authorization' => 'Bearer ' . config('app.open_ai_secret')
        ])->post('https://api.openai.com/v1/chat/completions', [
            'model' => 'gpt-4-1106-preview',
            'messages' => $messages,
            'max_tokens' => 500,
        ]);

        if ($response->failed()) {
            $res = 'Error: ' . $response->status();
            pd($response->body());
        } else {
            $res = $response->json();
//            var_dump($result['choices'][0]['message']['content']);
        }
```

これで gpt-4 turbo が使える。






chatgpt の api と書いてあるのは open aiのAPI
※ 同じGPT3.5系のモデルを使った文章生成AIのこと

# アカウントを作成
https://auto-worker.com/blog/?p=6988

# .env を設定

キーが外部にもれないよう、.envに。
```env
OPEN_AI_SECRET=sk-xxxfff
```

# app.php

```
'open_ai_secret' => env('OPEN_AI_SECRET'),
```

# キャッシュのお掃除

```
php artisan config:cache
rm -f bootstrap/cache/config.php
```

# 日本語生成
```
$apiUrl = 'https://api.openai.com/v1/completions';

// APIに送信するパラメーター
$apiParams = [
    'model' => 'text-davinci-003',
    'prompt' => '日本の現在の総理大臣は誰ですか？',
    'max_tokens' => 100,
];

// Guzzleを使ってAPIにリクエストを送信する
$client = new Client();
$response = $client->post($apiUrl, [
    'headers' => [
        'Content-Type' => 'application/json',
        'Authorization' => 'Bearer ' . config('app.open_ai_secret'),

    ],
    'json' => $apiParams,
]);

// APIからのレスポンスを取得する
$result = json_decode($response->getBody()->getContents(), true);



print_r($result);
```

# 結果
```

Array
(
    [id] => cxxx
    [object] => text_completion
    [created] => 16753333
    [model] => text-davinci-003
    [choices] => Array
(
[0] => Array
(
    [text] =>

安倍晋三です。
    [index] => 0
    [logprobs] =>
    [finish_reason] => stop
)

)

[usage] => Array
(
    [prompt_tokens] => 27
    [completion_tokens] => 14
    [total_tokens] => 41
)

)

```

はい、これで日本語出力できましたね
textのモデルは複数あるが、text-davinci-003以外は使いものにならない。

# 画像生成

```

$client = new Client();

$response = $client->post('https://api.openai.com/v1/images/generations', [
    'headers' => [
        'Content-Type' => 'application/json',
        'Authorization' => 'Bearer ' . config('app.open_ai_secret'),

    ],
    'json' => [
        'model' => 'image-alpha-001',
        'prompt' => '婚活している30代日本人女性',
        //                'prompt' => 'かわいい20歳の日本人女の子がマイクロビキニを着て男を誘惑している',//エロはダメ
        'num_images' => 1,
        'size' => '256x256'
    ],
]);

$json_result = json_decode($response->getBody(), true);
$image_url = $json_result['data'][0]['url'];

echo $image_url;

```

# ここに画像

![mesu.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31338/760326af-af7f-760b-098d-5ecf22e8adb3.png)
![konkatusitesou.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31338/d5548a29-367a-e57a-1f1c-97f1d9c68490.png)
![konka.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31338/d16c7a1d-b47d-41e4-a5ba-c89f8548e4ca.png)



# 他にできること

・Code Completion(コード生成)
・Fine-tuning(モデル学習)
・Embedding(数字変換)

# 料金は？

Davinci
1000トークン当たり0.0200ドル
( 1 ドル で 50000 トークン )

英語は1単語を1トークン。
カンマ(,)やピリオド(.)、クエスチョンマーク(?)も1トークン

日本語だと
十八番とは？：11トークン

大体1文字2トークン程度になる

Davinciで1回平均1000トークン消費して1000回APIリクエストした場合、100万トークン発生して20ドル(約2600円)が課金される


画像生成

1024×1024	$0.020 / 画像
512×512	$0.018 / 画像
256×256	$0.016 / 画像

つまり1024x1024を100枚で$2 (260円)

# 有名なダヴィンチさんは？

linebotでよく聞く、ダヴィンチさんは

```
4文字以下は応答対象外
81文字以上の文章も応答対象外
1日に対話できるのは3回まで
```

らしいです。

# さらに追記していきます
https://qiita.com/ma7ma7pipipi/items/6cc73dc2e3ad0bb1b13b