Cloudflare AI Gatewayを使ってみる
What
お屠蘇気分でCloudflare AI Gatewayを試してみた記録。
新規性はあまりなく、既存の記事の収集などがメイン。
先行記事
2023/10
2024/05 GAになった時の記事
2024/05 Amazon Bedrockを使っている
料金
AI Gateway's core features available today are offered for free, and all it takes is a Cloudflare account and one line of code to get started. Core features include: dashboard analytics, caching, and rate limiting.
基本無料。追加ログで課金あり。
Free allocation and overage pricing
Plan | Free logs stored | Overage pricing |
---|---|---|
Workers Free | 100,000 logs total | N/A – Upgrade to Workers Paid |
Workers Paid | 200,000 logs total | $8 per 100,000 logs stored per month |
やってみる
Gatewayを作る
「AI」タブの下にあった。
Gemini(Google AI Studio)で試す
「API」のところからサンプルのCurlリクエストが取得できる。
プロバイダはAI Studioにした。
Use the code snippet below to test your endpoint:
の下のサンプルリクエストのGOOGLE_AI_STUDIO_TOKEN
のところにAPIキーを埋める。
ログ
以下のような感じ。
- Request
- Response
- Endpoint
- モデル
- Token
- コスト
が取得できる。
Analytics
プロバイダにまたがるログが取れる。良い。
!
Setting
キャッシュやRate Limit、Authなど、設定できる。
SDKとの連携
各SDKとの連携がちゃんとできるか気になった。
Vercel AI SDKの例があった。
Vertex AIでGeminiを使う場合、Application Default CredentialでAuthがちゃんと通るのか、やってみないと怪しい。
ドキュメントではAPIキーを使うように書いてあった。
各SDKでcustom endpointは設定できるはずなので、それらを使うっぽい。
Universal
プロバイダをリクエストボディで指定すると、単一エンドポイントで各種プロバイダを呼べる。
リクエストボディを配列にするとfallbackもできる。
Azure OpenAI(Node.jsライブラリ)の場合
以下のようにbaseURLを与えれば動作。
this.openai = new AzureOpenAI({
apiKey: env.OPENAI_API_KEY,
baseURL: `${env.CLOUDFLARE_AI_GATEWAY}/azure-openai/${env.AZURE_OPENAI_RESOURCE_NAME}`,
apiVersion: env.AZURE_OPENAI_API_VERSION,
})
this.model = env.OPENAI_MODEL
@google-cloud/vertexai
)
Vertex AI( this.vertexAI = new VertexAI({
project: env.GCLOUD_PROJECT_ID,
location: env.GCLOUD_LOCATION,
apiEndpoint: "gateway.ai.cloudflare.com/v1/<accointId>/<gateway_id>/google-vertex-ai"
})
ポイントとして、こちらはhttps://
は除く。理由はライブラリで以下のようになっているため。
export async function postRequest({
region,
resourcePath,
resourceMethod,
token,
data,
apiEndpoint,
requestOptions,
apiVersion = 'v1',
}: {
region: string;
resourcePath: string;
resourceMethod: string;
token: string | null | undefined;
data: GenerateContentRequest | CountTokensRequest;
apiEndpoint?: string;
requestOptions?: RequestOptions;
apiVersion?: string;
}): Promise<Response | undefined> {
const vertexBaseEndpoint = apiEndpoint ?? `${region}-${API_BASE_PATH}`;
let vertexEndpoint = `https://${vertexBaseEndpoint}/${apiVersion}/${resourcePath}:${resourceMethod}`;