← 記事一覧

Jev のご紹介:文章ではなく型で答えるセカンドオピニオン

Agent! は、シェルコマンドを実行する前に、そのコマンドがどれほど破壊的かを Jev(TypeSafe System One)に問い合わせるようになりました。Jev が新たな LLM プロバイダーではなくアドバイザーである理由を解説します。

本日、Agent! に新しい安全レイヤーが加わりました。TypeSafe System One の略称である Jev です。シェルコマンドを実行する前に、Agent! は Jev に1つの質問を投げかけられるようになりました。このコマンドがデータを不可逆的に破壊する可能性はどの程度か? その値が設定したしきい値を超えると、コマンドは拒否されます。

この機能は、コミット 337c94a2「Jev(TypeSafe System One)の意思決定レイヤーを追加」で導入されました。本記事では、最も重要な設計上の判断について説明します。それは、Jev は新たな LLM プロバイダーではないということです。

なぜ別のモデルに尋ねるだけではいけないのか

Agent! はすでに23の LLM プロバイダーと連携しています。手っ取り早いのは、「安全性モデル」をもう1つのプロバイダーとして追加し、コマンドが危険に見えるかどうかを自然言語で尋ねる方法だったでしょう。問題は、返ってくるのが文章だということです。「このコマンドは状況によってはリスクがある可能性があり……」というのは判定ではありません。結局、rm を実行するかどうかを決めるために文章を解析する羽目になります。

Jev の仕組みは異なります。Jev はある状態に関する型付きの質問に対して、Choice、Score、または型付きの「なし」を表す Noul で答えます。テキストは生成せず、ツールの引数も生成しません。コミットメッセージはその結論をこう述べています。Jev は「APIProvider として振る舞うのではなく、既存のツールループに助言する」のだと。

この役割分担こそが設計のすべてです。

  • 選択したモデルは行動する。計画を立て、ツールを呼び出し、コードを書きます。
  • Jev は判断する。コードがしきい値と比較できる数値を返します。

Jev の位置付け

Jev は何かを置き換えるものではありません。すべてのシェルコマンドに対するチェックの順序は次のとおりです。

  1. ShellSafetyService.check:壊滅的なコマンドを拒否するハードコードされたルール。モデルは関与しません。
  2. Jev:ステップ1をすでに通過したコマンドのみを対象に、パターンでは見抜けない部分についてセカンドオピニオンを提供します。
  3. コマンドを実行します。

初日から、このゲートは ShellTools にある2つのシェル実行パス(executeTCC と executeTCCStreaming)の両方をカバーしています。

タスクを決して止めない設計

エージェントをブロックできるアドバイザーは、それ自体が別の意味で危険です。サービスがダウンしたら、夜通し実行しているタスクは止まってしまうのでしょうか。答えはノーです。JevAdvisor はフェイルオープンです。キーがない、トグルがオフ、あるいは障害が発生している場合は「意見なし」とみなされ、コマンドはそのまま実行されます。

ただし、フェイルオープンが安全なのは、それが可視化されている場合に限られます。導入初日のうちに、2つのフォローアップでその点が確保されました。

  • アドバイザーを観測可能にする(e25384f3)では使用状況のコールバックとエラー報告が追加され、チェックの失敗が黙って「安全」に見えるのではなく、ログに記録されるようになりました。
  • Jev が応答したことだけでなく判定結果をログに残す(d3c47e67)により、すべてのチェックで実際の結果、つまり破壊的リスクのパーセンテージと、コマンドが許可されたか拒否されたかが出力されるようになりました。

クライアントは正式なパッケージ

最初のバージョンでは自作の HTTP クライアントを使っていました。質問には POST /v1/systemone、モデル一覧には GET /v1/models を使い、Bearer 認証を採用し、429 と 529 のレスポンスではバックオフしていました。数時間のうちに、9e330357 でこれが TypeSafeKit パッケージに置き換えられ、さらに f3a817b8 でそのパッケージが Agent リポジトリ内にベンダリングされたため、ビルドがパッケージの取得に依存することはなくなりました。

セットアップ

Jev は設定画面にあり、専用の API キーを持ちます。このキーはキーチェーン内の、プロバイダーとは別の専用スロットに保存されます。/v1/models から読み込まれるモデルピッカーと、アドバイザリーのトグルも用意されています。トグルをオフにすれば、Agent! の動作は以前とまったく同じになります。

なぜこれが重要なのか

エージェントはあらゆる場所でシェルへのアクセス権を得つつあり、安全性に対する標準的な答えは「モデルが注意するだろう」というものです。パターンルールのほうが優れています。チェック可能だからです。しかし、パターンルールは誰かが書き留めたパターンしか知りません。型付きのセカンドオピニオンは、曖昧さを持ち込むことなく判断力を加えます。数値を返し、最終的な判断はコードが下すのです。

今後は、デフォルトのしきい値を調整しながらログを注視していきます。Jev が拒否すべきでないものを拒否したり、検出すべきものを見逃したりした場合は、GitHub で issue を作成し、該当するログ行を添えてください。