はじめに
先日MastodonのTLを眺めていたところ、Val TownというPaaSを紹介している投稿*1を見かけました。
調べてみたところ、TypeScriptのコードをそのままデプロイでき、HTTPリクエストに加えてCronやメールによるトリガー実行、OpenAIのAPIやSQLite、Blob Storageの利用もできるすごそうなPaaSだったので、さっそく使ってみました。
ちなみに、Val Townの裏側はDenoのようです。
docs.val.town
サンプル用アプリの開発
今回は、以下のようなアプリケーションを作って、Val Townの機能を試してみました。
このアプリケーションのコードは以下のようになりました。
import { email } from "https://esm.town/v/std/email"; import { OpenAI } from "https://esm.town/v/std/openai"; import { sqlite } from "https://esm.town/v/std/sqlite"; import { randomUUID } from "node:crypto"; const openai = new OpenAI(); export default async function(interval: Interval) { const response = await fetch("https://example.com"); const body = await response.text(); const completion = await openai.chat.completions.create({ messages: [ { role: "user", content: `please summarize the following html: ${body}`, }, ], model: "gpt-4o-mini", max_tokens: 50, }); await email({ subject: "Web Page Summary", text: `${completion.choices[0].message.content}` }); await sqlite.execute(`create table if not exists cron_logs( key text unique, timestamp integer, value text )`); await sqlite.execute({ sql: `insert into cron_logs(key, timestamp, value) values (:key, :timestamp, :value)`, args: { key: randomUUID(), timestamp: Date.now(), value: completion.choices[0].message.content }, }); }
30行ちょっとで実装できてしまいました。
コードを書く際はエディタ上でAIによる補完が使えるので、完成までの時間は10分程度でした。
SQLiteのデータベースは、一つのアカウント内で共通のものが使われるため、以下のようなスクリプトを別途作れば内容を確認できます。
import { sqlite } from "https://esm.town/v/std/sqlite"; console.log(await sqlite.execute(`select * from cron_logs`));
メールの送信先は無料版では自分自身に制限されています。
今回は自分への通知の用途にしか利用していないので問題ないですが、複数のアドレスにメールを送信したい場合は有料版に切り替えるかメール送信用のSaaSと組み合わせる必要があります。
Val Townのすごいポイント
Val Townがすごいのは、今回紹介した機能は全て無料で使える点です。
特に、OpenAIのAPIをAPIキーの取得なしですぐに使える点はとても良かったです。
OpenAIのAPI呼び出しにはレートリミットなどの制限がありますが、自分でAPIキーを取得して使う方法も案内されているので、制限を超える使い方をしたい場合も安心です。
docs.val.town
また、オンラインエディタ上でAIによる補完が効く点もとても開発体験が良かったです。
Val Townの設定画面を見てみると、AIによる補完にはCodeiumというサービスが使われているようです。
その他の機能
今回は利用しませんでしたが、Val Townでは他にも以下のような機能が使えます。
今回利用したメール送信ではなく、メールの受信をトリガーとして処理を実行する機能です。
Emailをトリガーとして設定すると、Val Town側でユニークなメールアドレスを払い出してくれます。
払い出されたメールアドレスに対してメールが送られると、そのメールの情報を引数とした関数が呼び出されます。
添付ファイルも取得できるので、ファイルのデータを後述するBlob Storageに保存したりできます。
HTTP
HTTPリクエストをトリガーとして処理を実行する機能です。
サーバーサイドレンダリングの機能もあり、HTMLだけでなくJSXでUIを書いてレスポンスとして返せます。
また、Honoなどのライブラリを用いたルーティングの機能も使えます。
Townie
AIによる開発支援の機能です。
Val Townでは、エディタにもAIによる補完機能がありますが、Townieは対話式のUIでAI Chat Botとやりとりをしながらアプリケーションの開発ができます。
Val Townのドキュメントには、上記の4つの機能以外にもさまざまな機能の説明があり、実装できるアプリケーションの例なども紹介されています。
docs.val.town
おわりに
これまではちょっとしたアプリケーションのデプロイ先にはFly.ioやRender、Cloudflare Workersなどを利用していましたが、Val Townはシュッとコードを書いてデプロイする先としてかなり体験が良いなと感じました。
印象としては、超高機能なGoogle Apps Scriptといった感じです。
AIの補完による開発体験の良さに加えて、標準で提供されているライブラリやnpmのライブラリを簡単に利用できるので、面倒な設定なしに気軽にコードを書けるのがとても良かったです。
簡単なスクリプトのデプロイ先として、Val Townはかなりおすすめしたいです。