AI Gateway Universal Endpoint
Cloudflare AI Gateway がとうとうGAしました!これはLLMモデルに対するプロキシーを提供するサービスです。LLMを社内用プログラムから利用する際に直接LLMをたたくのではなくCloudflareが提供するエンドポイントを呼び出すことで、トークンの管理、キャッシュの機能、問い合わせ内容と応答のログ、不自然に連続するリクエストを自動でドロップするRate Limitingなどの機能が提供されます。
ログは以下のようにJSONで問合せ内容と戻りを確認することができ、その回答をキャッシュすることでトークンを節約させることができます。
対応しているLLMは以下の通りです。
- Amazon Bedrock
- Anthropic
- Azure OpenAI
- Cohere
- Google Vertex AI
- Groq
- HuggingFace
- OpenAI
- Perplexity
- Replicate
- Universal Endpoint
- Workers AI
Workers AI
は皆さん専用の関数を作成して無くても純粋なLLMモデルとして動作します。
Universal Endpoint
Universal Endpoint
とは複数のLLMをセットできるエンドポイントのことです。例えばOpenAIとWorkersAIを同時にセットしておくことでPrimaryとの通信が行えない場合や、認証トークンやLLM使用用トークン量に異常が発生した際にセコンダリのLLMと通信を自動で行ってくれます。
https://gateway.ai.cloudflare.com/v1/{account_id}/{gateway_slug}
こんな書式でまとめて複数のLLMを呼びだすことができます。
"headers": {
"Authorization": "Bearer {token}",
として認証用トークンを引き渡します。
さっそくやってみる
AI Gateway自体のハンズオンはここにありますので、まずはこれを終わらせることを推奨しますが、なくても大丈夫です。(一部コピペだけで終わるので理解が難しい、ぐらいです)+
をクリックして適当な名前のゲートウェイを作ります。
次に+
ボタンの右にあるAPI
ボタンを押します。
ドロップダウンからUniversal
を選びます。
curl https://gateway.ai.cloudflare.com/v1/709e3d845e10aafe52a88a8336178220/test -X POST \
--header 'Content-Type: application/json' \
--data '[ \
{ \
"provider": "workers-ai", \
"endpoint": "@cf/meta/llama-2-7b-chat-int8", \
"headers": { \
"Authorization": "Bearer XXXX", \
"Content-Type": "application/json" \
}, \
"query": { \
"messages": [ \
{ \
"role": "system", \
"content": "You are a friendly assistant" \
}, \
{ \
"role": "user", \
"content": "Why is pizza so good" \
} \
] \
} \
}, \
{ \
"provider": "openai", \
"endpoint": "chat/completions", \
"headers": { \
"Authorization": "Bearer XXXX", \
"Content-Type": "application/json" \
}, \
"query": { \
"model": "gpt-3.5-turbo", \
"messages": [ \
{ \
"role": "user", \
"content": "What is Cloudflare?" \
} \
] \
} \
} \
]'
XXXの部分はそれぞれCloudflareとOpenAIのトークンに置き換える必要があります。Cloudflare 用トークンは少し間違いやすいですが、Workers AI用トークンです。作成する際にAI Gateway用トークンも作成できるので勘違いしやすいですね。また汎用のGlobal API Keyでは動作しません。
成功するとWorkresAIからPizzaに対する回答が戻ってきます。
意図的にWorkersAIのトークンを1文字変えて呼び出しを失敗させてみましょう。
以下の通りOpenAIを呼び出していることがわかります。
HTTP/1.1 200 OK
Date: Mon, 03 Jun 2024 03:23:38 GMT
Content-Type: application/json
Transfer-Encoding: chunked
Connection: close
CF-Ray: 88dc90bfd9602639-NRT
CF-Cache-Status: DYNAMIC
Set-Cookie: __cf_bm=9z4J2MIrXDK1XbVAmfchDUDxyz2f28nSz3kxiT13XMI-1717385018-1.0.1.1-czqFQXCNTi8WEXlRVIDGAoPxL2PMhDbHb7TdJBZ3ZecAY0S2fR498q2xHYrOyX_DhnJKQjmdWkxNPVP6bM6ivA; path=/; expires=Mon, 03-Jun-24 03:53:38 GMT; domain=.api.openai.com; HttpOnly; Secure,_cfuvid=d.DoW6Y3Zs4.jPwZ2tDXBMV_C7W2f8M2a0NbG7pqih8-1717385018360-0.0.1.1-604800000; path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None
Strict-Transport-Security: max-age=15724800; includeSubDomains
openai-organization: user-cv5omgmgeptlb7uruwfighx7
openai-processing-ms: 1424
openai-version: 2020-10-01
x-ratelimit-limit-requests: 10000
x-ratelimit-limit-tokens: 60000
x-ratelimit-remaining-requests: 9998
x-ratelimit-remaining-tokens: 59978
x-ratelimit-reset-requests: 15.933s
x-ratelimit-reset-tokens: 22ms
x-request-id: req_58119715f8d5db9250dd6e2bf9a4996b
Vary: Accept-Encoding
Server: cloudflare
Content-Encoding: gzip
{
"id": "chatcmpl-9VsaG5ghdqDP1otxlbsD9RY081xnn",
"object": "chat.completion",
"created": 1717385016,
"model": "gpt-3.5-turbo-0125",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "Cloudflare is a company that provides content delivery network (CDN), DDoS mitigation, Internet security, and distributed domain name server (DNS) services. It acts as an intermediary between website visitors and the hosting server, helping to increase website performance, security, and reliability. Cloudflare's services also help protect websites from various online threats, such as cyber attacks and malicious bots."
},
"logprobs": null,
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 12,
"completion_tokens": 77,
"total_tokens": 89
},
"system_fingerprint": null
}
同時に両方のLLMを呼び出すことはできませんので、注意してください。
Discussion