Cloudflare - API Gateway - OpenAI API
この記事はCloudflare Advent Calendar 2023 - Qiitaの24日目の記事です。
Cloudflare API Gateway
とはその名の通り、CloudflareをOpenAI APIへのゲートウェイとして使用できる機能です。つまり、Cloudflareのエンドポイント経由でOpenAI APIを叩くことができます。
ブラウザ -> Cloudflare -> OpenAI
具体的には、エンドポイント https://gateway.ai.cloudflare.com/v1/
を、https://api.openai.com/v1
へのリバース・プロキシーとして設定できます。
それの何が嬉しいかと言うと、Cloudflareでリクエストのキャッシュやレートリミットをすることで、OpenAI APIの利用料金を安くすることができます。
また、CFダッシュボードからアクセス・ログを確認することができます。リクエストのキャッシュ・ヒット、消費トークン数、レスポンスデータなどを確認できます。
API Gatewayの作成
Cloudflareのダッシュボード
からAPI Gateway
のエンドポイントの作成をします。AI > API Gatewayから作成します。
新規にAI Gateway
を作成します。お好きな名前をつけてください。
作成が完了します。画面右上のリンク[API Endpoints]
をクリックします。
作成されたAI Gateway
のエンドポイントと、cURLコマンドのサンプルが表示されます。
Workersプロジェクトの作成
Webブラウザ -> CF Workers -> AI GW(OpenAI API)
の構成で作成します。
まずは、CF Workers
のプロジェクトを作成します。Hello World Worker
を選択します。
pnpm create cloudflare@latest
生成されたフォルダにcd
します。worker
をローカルで起動します。
pnpm run start
8787ポートで起動します。cURLでアクセスします。
curl http://127.0.0.1:8787
Hello World!
このworker
に機能を付け足していきます。
OpenAI API
まずはGWを使用しない、ダイレクトにOpenAI APIを呼び出すパターンを説明します。それを踏まえてAI GW
経由に変更する段取りで説明していきます。
OpenAI API
のライブラリをインストールします。
pnpm i openai
よくあるchatCompletion
のコードを書きます。
import OpenAI from 'openai';
export interface Env {
OPENAI_API_KEY: string;
}
export default {
async fetch(request: Request, env: Env, ctx: ExecutionContext): Promise<Response> {
const openai = new OpenAI({
apiKey: env.OPENAI_API_KEY
});
// make our request to the OpenAI API
const stream = await openai.chat.completions.create({
model: 'gpt-3.5-turbo',
messages: [{ role: 'user', content: 'Tell me a story' }],
stream: true
});
// Using our readable and writable to handle streaming data
let { readable, writable } = new TransformStream();
let writer = writable.getWriter();
const textEncoder = new TextEncoder();
// loop over the data as it is streamed from OpenAI and write it using our writeable
for await (const part of stream) {
console.log(part.choices[0]?.delta?.content || '');
writer.write(textEncoder.encode(part.choices[0]?.delta?.content || ''));
}
writer.close();
// Send readable back to the browser, so it can read the stream content
return new Response(readable);
}
};
wrangler.toml
に環境変数OPENAI_API_KEY
を設定し、main
に作成したソースコードを指定します。
name = "cf-ai-gw"
main = "src/openai.ts"
compatibility_date = "2023-12-18"
[vars]
OPENAI_API_KEY = "sk-あなたのOpenAI APIキー"
workerを起動し、cURLで呼び出します。
pnpm run start
curl http://127.0.0.1:8787
実行結果が返ります。
API Gateway経由に変更
準備ができたところで、API Gateway
経由に変更してみましょう。といっても、baseURL
にエンドポイントを指定するだけです。xxx
のところを最初にCFダッシュボードで確認したエンドポイントのものに書き換えてください。エンドポイントの最後にopenai
を付けるのを忘れないでください。
const openai = new OpenAI({
apiKey: env.OPENAI_API_KEY,
baseURL: 'https://gateway.ai.cloudflare.com/v1/xxx/mygw-1/openai'
});
このようにソースコードを1行変更するだけで動きます。簡単ですね。
CFダッシュボードからアクセス・ログを確認することができます。
レート・リミットの設定もできます。
ソースコードをこちらに置きます。
Discussion