🤖

ChatGPT GPT-4 APIを使用するのに苦労した話

2023/10/16に公開

使用できないことの確認

※この記事は2023年10月16日現在の情報です。今後OpenAIの仕様に依存して同じ手順でも再現しなくなる場合があります。

2023年3月14日にChatGPTのGPT-4がリリースされました。また、OpenAIはChatGPTのAPIを提供しています。そのため、当然ながらGPT-4のAPIも提供されています。

GPT-4 APIのリリースページには

(2023年7月6日) Starting today, all paying API customers have access to GPT-4
Today all existing API developers with a history of successful payments can access the GPT-4 API with 8K context.

と書かれています。私は以下のように支払い設定を行っていたため、GPT-4 APIを利用できると思っていました。

billing

not billing

しかし、実際には使用できませんでした。使用できるかはPlaygroundのModelから確認できます。

playground-gpt3

使用できない理由

GPT-4 APIのリリースページにはこのように書かれています(再掲)。

Today all existing API developers with a history of successful payments can access the GPT-4 API with 8K context.

この文章の「with a history of successful payments」が重要で、以下のようにChatGPTを結構使用していましたが、Billing Historyには1ドルも請求されていませんでした。

usage

billing history

対策

支払い履歴が存在すれば良いのですが、少し使ったくらいでは請求書の「繰越し」項目で割り引かれてしまい支払いがされないようです。おそらく、無料枠があるんでしょうね。その枠がどれくらいなのかわかる方がいれば教えてください🙏

invoice

そこで、ChatGPTに大量にアクセスを行い、無理やり支払い履歴を作ります。以下がその割と適当なスクリプトです。DoS対策でよくAPIのエラーが出ますが、気にせず再実行とかしてください。また、今回はDenoを使っていますがcurlでもPythonでもなんでも良いです。Denoがない人はreadTextFileSyncをNodeのやつにするのが一番楽そうです。

type Message = {
  role: "user" | "system" | "assistant";
  content: string;
};

// CHANGE ME from https://platform.openai.com/account/api-keys
const apiKey = "";

const completeChat = async (messages: Message[]): Promise<Message> => {
  const body = JSON.stringify({
    messages,
    model: "gpt-3.5-turbo",
  });
  try {
    return fetch("https://api.openai.com/v1/chat/completions", {
      method: "POST",
      headers: {
        "Content-Type": "application/json",
        Authorization: `Bearer ${apiKey}`,
      },
      body,
    })
      .then((res) => res.json())
      .then((data) => data.choices?.[0]?.message);
  } catch (e) {
    return {
      role: "system",
      content: "Error: " + e,
    }
  }
};

const chat = async (message: string, idx: number) => {
  const messages: Message[] = [
    {
      role: "user",
      content: message,
    },
  ];
  completeChat(messages).then((res) => {
    console.log(`(${idx})-[${new Date().toISOString()}] ${res?.content}`);
  });
};

const readJson = (start: number, end: number) => {
  // Quiz Dataset
  // https://domo-support.domo.com/s/article/360043931814?language=ja
  const data = Deno.readTextFileSync("./questions.json");
  const json = JSON.parse(data);
  return json.slice(start, Math.min(end, json.length));
};

const main = async () => {
  const start = 0;
  const qSize = 216930;
  const batchSize = 1000;

  for (let i = Math.floor(start / batchSize); i < qSize / batchSize; i += 1) {
    const startIdx = i * batchSize;
    const endIdx = startIdx + batchSize;

    const json = readJson(startIdx, endIdx).map((d: any) => d.question);

    for (let idx = 0; idx < json.length; idx++) {
      await chat(json[idx], i * batchSize + idx);
      await new Promise((r) => setTimeout(r, 50));
    }
  }
};
main();

Usageページで逐次、利用量を確認しつつ、私は16.98ドルでスクリプトを止めました。すると、このように支払い履歴が作成されました!ただし、請求書のCREATEDが10月1日になっていますが、実際に私の方から見えるようになったのは10月11日でした。月が変わったらすぐに使えるようになるわけではない、ということに注意してください。

billing history after

そして、PlaygroundのModelからGPT-4が選択できるようになりました🎉

gpt-4

smasbros

まとめ

  • GPT-4 APIを使用するには、支払い履歴が必要
  • 支払い履歴は、請求書の「繰越し」項目で一部割り引かれてしまう
  • 支払い履歴が発生するほどのアクセスをしても、月が変わったらすぐに使えるわけではないので注意
GitHubで編集を提案

Discussion