HonoでCloudflare Pagesを作りつつ、wrangler.tomlを使ってVectorizeをよびだしてみた
2024年春のDeveloepr WeekでCloudflare Pagesがwrangler.tomlをサポート。Cloudflare Pagesプロジェクト作成時にwrangler.tomlが自動生成され、Vectorizeも利用可能。WorkerからVectorizeを利用する方法も紹介。Vectorizeの操作確認後デプロイし、エラーなし。PagesでVectorizeが使用できることを確認。Node.jsの互換性設定時にエラーあり。cryptoのエラー解決方法が課題。Wrangler.tomlの更新によりVectorizeが利用可能に。
目次
2024年春のDeveloepr WeekでCloudflare Pagesがwrangler.toml
をサポートしたとアナウンスがありました。せっかくなので、HonoでCloudflare Pagesプロジェクトを作ってみつつ、ついでに1つ気になっていた部分に挑戦してみました。
create-honoでプロジェクトをセットアップする
Honoでアプリを作る際にお馴染みのcreate-hono
コマンドを利用します。
% npm create hono@latest pages-demo
今回はバージョン0.6.3
を前提として紹介します。
[email protected]
Ok to proceed? (y) y
テンプレートはcloudflare-pages
を選びましょう。
? Which template do you want to use?
aws-lambda
bun
❯ cloudflare-pages
cloudflare-workers
deno
fastly
lambda-edge
(Use arrow keys to reveal more choices)
あとはライブラリのインストールを、お好きなツールで実行しましょう。
✔ Cloning the template
? Do you want to install project dependencies? (Y/n) y
? Which package manager do you want to use? (Use arrow keys)
❯ npm
bun
pnpm
yarn
作成が完了しました。
🎉 Copied project files
Get started with: cd pages-demo
Wrangler.tomlはすでに生成されている
アナウンスされてまだ1週間経っていませんが、すでにwrangler.toml
が用意されていました。
name = "pages-demo"
pages_build_output_dir = "./dist"
# [vars]
# MY_VAR = "my-variable"
# [[kv_namespaces]]
# binding = "MY_KV_NAMESPACE"
# id = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
# [[r2_buckets]]
# binding = "MY_BUCKET"
# bucket_name = "my-bucket"
# [[d1_databases]]
# binding = "DB"
# database_name = "my-database"
# database_id = ""
# [ai]
# binding = "AI"
あとは必要に応じてコメントアウトしたり、行ごと削除すればよさそうですね。
せっかくなので、あえてVectorizeを追加してみる
せっかくなので、用意されている設定ファイルに含まれていない、Cloudflare Vectorizeを追加してみましょう。インデックスの作成はWranglerで行います。
npx wrangler vectorize create rag-demo --dimensions=768 --metric=cosine
✅ Successfully created a new Vectorize index: 'rag-demo'
📋 To start querying from a Worker, add the following binding
configuration into 'wrangler.toml':
[[vectorize]]
binding = "VECTORIZE_INDEX" # available within your Worker on env.VECTORIZE_INDEX
index_name = "rag-demo"
wrangler.toml
を更新するように言われますので、試してみましょう。一緒にWorkers AIも有効化しておきます。
name = "pages-demo"
pages_build_output_dir = "./dist"
[ai]
binding = "AI"
[[vectorize]]
binding = "VECTORIZE_INDEX" # available within your Worker on
env.VECTORIZE_INDEX
index_name = "rag-demo"
Wranglerを使ってデプロイまで試みてみましょう。
% npm run deploy
ビルドに成功すると、Pagesプロジェクトを新規作成するか聞かれます。
> build
> vite build
vite v5.2.8 building SSR bundle for production...
✓ 43 modules transformed.
dist/_worker.js 28.15 kB
✓ built in 332ms
The project you specified does not exist: "pages-demo".
Would you like to create it?"
❯ Create a new project
ブランチを選択後、デプロイに成功しました。
✔ Enter the production branch name: … production
✨ Successfully created the 'pages-demo' project.
🌍 Uploading... (1/1)
✨ Success! Uploaded 1 files (1.29 sec)
✨ Compiled Worker successfully
✨ Uploading Worker bundle
✨ Deployment complete! Take a peek over at https://xxxx.pages-demo.pages.dev
Vectorizeが動作するかを試してみる
デプロイが成功したので、本当にPagesからVectorizeが利用できるか試してみましょう。src/index.tsx
に次のAPIを追加しました。
const app = new Hono<{
Bindings: {
VECTORIZE_INDEX: VectorizeIndex;
}
}>()
// 中略
app.get('/search', async c => {
try {
const postVector = await c.env.VECTORIZE_INDEX.getByIds(["123"])
console.log(postVector)
return c.text('hello')
} catch (e) {
return c.json(e)
}
})
データをなにも投入していないので、console.log
は空になるはずです。しかしそもそもVectorizeが利用できない場合は、c.env.VECTORIZE_INDEX.getById
がエラーになると予測しています。
この状態でプロジェクトをデプロイしてみましょう。
% npm run deploy
> deploy
> $npm_execpath run build && wrangler pages deploy dist
> build
> vite build
vite v5.2.8 building SSR bundle for production...
✓ 43 modules transformed.
dist/_worker.js 28.30 kB
✓ built in 381ms
🌍 Uploading... (1/1)
✨ Success! Uploaded 0 files (1 already uploaded) (0.37 sec)
✨ Compiled Worker successfully
✨ Uploading Worker bundle
その後ログを確認すると、エラーは発生していませんでした。ログにはただ「c.env.VECTORIZE_INDEX.getById
の結果がなにもないこと」だけを示しています。
Cloudflare PagesでもVectorizeが使える・・・っぽい
ダッシュボードのバインディング画面には出てこないのですが、このようにwrangler.toml
を使うことでVectorizeが利用できるみたいです。
追記:
LangChain.jsを使いたいと思って、wrangler.toml
を次のように更新しました。
name = "pages-demo"
pages_build_output_dir = "./dist"
compatibility_date = "2023-12-01"
node_compat = true
するとnode_compat
は使えないよというエラーが出ました。
✘ [ERROR] Running configuration file validation for Pages:
- Configuration file for Pages projects does not support "node_compat"
compatibility_flags = [ "nodejs_compat" ]
を使った場合、crypto
のエラーが発生します。
✘ [ERROR] Could not resolve "crypto"
assets/few_shot-DFLCx_Dl.js:1:61:
1 │ ...u}from"../_worker.js";import"crypto";class l extends p{construct...
╵ ~~~~~~~~
The package "crypto" wasn't found on the file system but is built into node.
Add the "nodejs_compat" compatibility flag to your Pages project and make sure to prefix the module name with "node:" to enable Node.js compatibility.
✘ [ERROR] Build failed with 2 errors:
_worker.js:1:525: ERROR: Could not resolve "crypto"
assets/few_shot-DFLCx_Dl.js:1:61: ERROR: Could not resolve "crypto"
ライブラリの内部で使われているのでnode:crypto
にする解決策は使えなさそうなのが悩ましいですね・・・