最近話題の Jev を触ってみようと思って調べていくうちに、どうやら公式で TypeScript と Python 向けの SDK は公開しているものの1、CLIとして直接呼び出す公式ツールは存在しないことに気づいたので一旦作ることにしました。
stefafafan/jev の思想
標準入力から値を受け取って、結果を出力し、 jq コマンドなどを便利に組み合わせられるインターフェースを意識しました。あと、 Go を使っているので、公式の SDK は特に利用していないです。
活用イメージとしてはこんな感じです:
git diff | jev noul "差分に破壊的変更はありますか?" | jq .また、 TypeSafe AI の新規受付が閉じていて自分も困っていたのですが、 Cloudflare Workers AI や、 Vercel AI Gateway でも Jev が利用できるらしいので、それらに対応させました。
以下のような感じで、特定の環境変数がセットされていれば対応したプロバイダーが使われたり、 --provider で明示的に指定できるようにしてみました。
export TYPESAFE_API_KEY=...
git diff | jev --provider typesafe noul "差分に破壊的変更はありますか?" | jq .export CLOUDFLARE_API_TOKEN=...
export CLOUDFLARE_ACCOUNT_ID=...
git diff | jev --provider cloudflare noul "差分に破壊的変更はありますか?" | jq .GitHub Actions でも使いたい
元々個人的に持っていたアイデアとして、 Pull Request のレビューが大変なので、一次レビューとして高速で激安と噂の Jev にざっくり判断してもらおうというのがありました。ということで、ついでに↑のCLIを GitHub Actions にインストールするだけの Action も用意してみました。
名前の通り、ただセットアップするだけで、内部では OS やバージョンに対応するバイナリを入れるみたいな感じです。
- uses: stefafafan/setup-jev@68157056af19eac3d6d649efa641d1e9662b5186 # v1.0.1
with:
version: v0.1.2実際に GitHub Workflow に組み込んでみる
実際に stefafafan/jev のリポジトリでは、 Pull Request のリスクを判定する Workflow を動かしてみました。
特定の状態の Pull Request で発火し、 gh pr diff の出力を jev choice へ渡し、risk-low、risk-medium、risk-high のいずれかを選ばせています。中心となる部分は以下のようになっています。
result=$(gh pr diff "$PR_NUMBER" --repo "$GITHUB_REPOSITORY" | \
jev --provider cloudflare choice \
--option risk-low \
--option risk-medium \
--option risk-high \
"$instructions")
risk=$(jq -er '.answers.result.choice' <<< "$result")あとは受け取った結果をもとに label をつけ外しするという感じです。試してみたところ、外部APIを叩いてる割には判別するステップで1-2秒くらいで終わっているので便利そう。
一方、現状は事前に発行したトークンを使うため、漏洩時のリスクが気になります。理想的にはWorkflow実行時だけ有効な短命トークンを使いたいところですが、今のところ難しそう。可能な範囲で権限や有効期限を絞り、Budgetの上限も設定しておくくらいが現状できることに思います。