ChatGPT-API Error Code 429の解決方法

## はじめに
お疲れ様です！ @Keichan_15 です！

皆様、ゴールデンウイークはいかがお過ごしでしょうか。
実はGWも後半に差し掛かったあたりで、私のSlackに一通のメッセージが届いていました。

:boy:「Keichanが作成したChatGPT_Bot、 **死んでるヨ！**」
:woman:「私も使えない…。何かした？」

:weary:「嘘…、なんで！？！？」

という訳で、貴重なGW後半がBotの検証に消えることが確定したのでありました…。悲しいネ:disappointed_relieved:

ただ、意外にも今回の事例は検索するとかなりヒットしたため、備忘録も兼ねて残しておこうといった記事になります。

よろしくお願いいたします！

## 現状
私が過去に執筆した以下の記事で、Slackのチャンネル内で投稿したユーザーのスレッドにBotが返信する機能を作成しました。

https://qiita.com/Keichan_15/items/a4facca87d178f356397

ただ、5/2以降からチャンネル内にメッセージを投稿してもBotが反応しなくなってしまいました。
他のSlackのワークスペースにも同様のAPI keyでBotを導入していたのですが、そちらも使用不可になっていてなんでや…ってなってたんですね。

ここで、自分の中ではBotが動かなくなった要因をざっくり3つ程度に絞っていました。

① Google App Scriptのデプロイ周り
② ChatGPT-APIのサイレント修正
③ 無料枠超過

まず①については速攻で違うと分かりました。
理由は「リアクションBotは正常に動作していた」からです。別のGASが正常にデプロイも動いているのであれば、ChatGPT-Bot用のGASだけ異常が生じる可能性は極めて低いと考えたためです。

https://qiita.com/Keichan_15/items/355ce2bf271bba4fe0eb

となると②か③になるな～ってところで、原因究明すべく早速GASを見ていきます。

## ログ取得 & エラーに遭遇…！？
まずAPIから正常にログが取得可能かデバッグしてみます。コードを以下の記述に変更しました。

```javascript:hoge.gs
const prop = PropertiesService.getScriptProperties().getProperties();

function doTest() {

  let app = SlackApp.create(prop.SLACK_BOT_TOKEN);

  const apiKey = prop.OPEN_AI_KEY;
  const url = "https://api.openai.com/v1/chat/completions";

  const payload = {
    "model": "gpt-3.5-turbo",
    "messages": [{"role": "user", "content": "Hello!"}]
  };

  const options = {
    "method": "post",
    "contentType": "application/json",
    "headers": {
      "Authorization": "Bearer " + apiKey
    },
    "payload": JSON.stringify(payload)
  };

  const response = UrlFetchApp.fetch(url, options);
  const content = JSON.parse(response);
  
  Logger.log(content);

}
```

ちなみにこのコードは以下の記事内でも紹介しています。

https://qiita.com/Keichan_15/items/a4facca87d178f356397#3-4-gas%E3%81%A7api%E3%82%92%E5%8F%A9%E3%81%84%E3%81%A6%E3%81%BF%E3%82%8B

ここで以下のエラーが出ました。

```javascript:hoge.gs
Error Code 429 - You exceeded your current quota, please check your plan and billing details.
```

- exceeded your current quota(枠を超過している？)
- please check your plan and billing details.(あなたの契約プランを確認して！)

って感じだったのでこれはもしやもしや…？

## 解決法
OpenAIの個人用アカウントにログインしてUsageを確認してみました。

https://platform.openai.com/overview

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2798073/31301fc6-26d4-73a0-bb94-9b5e8fa46462.png)

| GRANT | CREDIT GRANTED | EXPIRES (UTC) |
|:-:|:-:|:-:|
| Grant1 | $18.00 | Expired 2023年5月1日 |

おいおい、 **期限切れてるやん…。**

ちなみにエラーコードを調べてみるとOpenAIが `Error Code 429` に関する説明を公開していました。

https://help.openai.com/en/articles/6891831-error-code-429-you-exceeded-your-current-quota-please-check-your-plan-and-billing-details

> _This error message indicates that you have hit your maximum monthly spend (hard limit) for the API. This means that you have consumed all the credits or units allocated to your plan and have reached the limit of your billing cycle. This could happen for several reasons, such as:_
>
> このエラーメッセージは、お客様がAPIの月間最大使用量（ハードリミット）に達したことを示します。これは、お客様のプランに割り当てられたクレジットまたはユニットをすべて消費し、課金サイクルの限界に達したことを意味します。この現象は、以下のような理由で発生する可能性があります： (DeepL翻訳)

> - _**If you are using a free plan, consider upgrading to a pay-as-you-go plan that offers a higher quota.**_
>
> ・**無料プランをご利用の場合は、より高いクォータを提供する従量課金制プランへのアップグレードをご検討ください。** (DeepL翻訳)
>

ってな訳でクレジットカードを登録して課金することで解決しました。やっぱり全部が全部無料でってそんな美味しい話は無いんです。

具体的な登録方法については割愛しますが、個人的に以下の記事が参考になりました。

https://keikenchi.com/why-chatgpts-api-returns-429-error-even-after-many-days#:~:text=%E7%B5%90%E8%AB%96%E3%81%A8%E3%81%97%E3%81%A6%E3%81%AF%E3%80%81%E3%81%A9%E3%81%86%E3%82%84%E3%82%89API,3%E3%83%B6%E6%9C%88%E3%81%AE%E3%82%88%E3%81%86%E3%81%A7%E3%81%99%E3%80%82

ちなみに記事内でも紹介されていますが、

> APIの無料期間はAPI keyの発行から3ヶ月ではなく、**ChatGPTに登録してから3ヶ月**

これを完全に失念していました。ややこしいよ(笑)

それと個人的な内容ですが、ChatGPT-API有料版は **従量課金制** なので、 **``Hard limit`` の設定を絶対に忘れないで！** ということを強くお伝えしたいです。

``Billing > Usage limits`` 内に ``Hard limit`` を設定する箇所があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2798073/91c7e260-60a6-a09b-72e4-750a6025b49d.png)

この **``Hard limit``** が従量課金の上限値になります。初期値は120ドルに設定されていますが、自分は個人使用の範囲内なので $15.00 辺りに設定しました。

ちなみに下の ``Soft limit`` は、その値を超過すると **メールで通知** してくれます。AWSの無料利用枠のアラートと似たような感じですね！

この2つの設定はMustでやっておくべきだと思います！

## おわりに
いかがでしたでしょうか。
ChatGPTが公開されたのが大体2-3月頃だったと記憶しているので、そろそろ今回のような事象がぽつぽつ発生してきそうな気はします。
ちなみに最新のChatGPT-4のAPI waitlistに登録して早2ヶ月弱ですが、未だにお返事ございません。 ~~天狗になっちゃったのかな？OpenAIは！！~~
近々GPT-4にも触れてみようかなと思い立った矢先の今回のエラーでした。
おわり。