ChatGPT使ってめんどくさい毎日の献立をたててもらおう

## はじめに
本記事はプロもくチャット Adevent Calendar2023の24日目です

https://qiita.com/advent-calendar/2023/puromoku

## 毎日の献立を決めるのがめんどくさいという主夫・主婦の方へ
ChatGPTに何個か要素入れて献立と作り方教えてもらおう

## 早速作っていく
Laravel使いましたがそこは割愛

https://readouble.com/laravel/10.x/ja/installation.html

### ChatGPTのAPI設定
APIキーの作成　※耳タコですがシークレットキーは適当に公開しないように
![スクリーンショット 2023-12-23 20.38.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314384/2cfac3af-9a94-5d86-4bd1-5a25c006f846.png)

### Laravel側の実装
ChatGPTが提供しているライブラリが合ったのでcomposerで入れてみる(今回だけのためなのでsailのパスは通してない)
https://platform.openai.com/docs/libraries/community-libraries

```
$ ./vender/bin/sail composer require openai-php/client
```

実際のプログラム
ルート
```php:web.php
Route::get('/recommend', [RecommendController::class, 'index']);
Route::post('/recommend', [RecommendController::class, 'recommend']);
```

コントローラー
```php:RecommendController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use OpenAI;

/**
 * Class RecommendController
 * @package App\Http\Controllers
 */
class RecommendController extends Controller
{

    /**
     * @param Request $request
     * @return \Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View
     */
    public function index()
    {
        return view('recommend');
    }

    /**
     * @param Request $request
     * @return \Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View
     */
    public function recommend(Request $request) {
        // ChatGPTにリクエスト送信する
        $chatGptApiSecretKey = env('CHAT_GPT_API_SECRET_KEY');
        $client = OpenAI::client($chatGptApiSecretKey);
        $prompt = $request->category . 'でおすすめの献立を' . $request->count . '人前での作り方を教えてください';

        $result = $client->completions()->create([
          'model' => 'text-davinci-003',
          'prompt' => $prompt,
          'max_tokens' => 1000
        ]);

        // ChatGPTからのレスポンスを取得する
        $response = $result['choices'][0]['text'];
        return view('recommend', compact('response'));
    }
}
```
```php:recommend.blade.php
<html>

<head>
    <meta charset='utf-8' />
</head>

<body>
  <div>食べる人数と種類を選択してください</div>
  <form method="POST">
      @csrf
      <select id="count" name="count">
          <option value="1">1人前</option>
          <option value="2">2人前</option>
          <option value="3">3人前</option>
          <option value="4">4人前</option>
      </select>
      　
      <select id="category" name="category">
          <option value="和食">和食</option>
          <option value="中華">中華</option>
          <option value="洋食">洋食</option>
      </select>
      　
      <button type="submit">送信</button>
  </form>

  @if(isset($response))
    <div>{{ $response }}</div>
  @endif
  </body>
</html>

```

ライブラリ入れたことでかなり簡単にAPI呼び出し出来ました。
max_tokensはリミット設定しておくことで膨大なデータが返却されないようになります。(今回はテスト用なので結構小さめに設定しました)

## 結果
入力画面
とりあえず1から4人前、和食・中華・洋食で選択出来るように作成
![スクリーンショット 2023-12-23 21.57.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314384/22fa8ee0-8692-3346-904f-7fd9f5c92ad0.png)

レスポンス画面
![スクリーンショット 2023-12-23 22.00.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314384/bc57c37a-1db6-e170-40e3-384746e2facd.png)

なんかちょっと見づらいけど結構美味しそうなやつ出てきた

## まとめ
今回はデザインは全くやってないですが、機能はこんな感じでもう少し選択肢を増やしていけばより自分が望むような献立を返してくれそうなのでまた今度試してみます