きっかけ
ganessa さんの記事「CLAUDE.md で判断を jev に任せたら…」を読みました。Claude Code に「判断は自分で推測せず Jev に聞け」というルールを入れたら、判断のブレが減った、という話です。
私は自宅のマシンで OpenClaw を何台か動かしていて、Discord から相談相手として使っています。同じことを OpenClaw の人格にもやらせたら良くなるのではないか、と思って1台に入れてみました。
結論から書くと、入れること自体はすぐできて、動作も安定していました。ただ、半日の本番運用で、人格が自分から Jev を呼んだのは0回でした。 この記事はその記録です。
Jev とは
Jev は TypeSafe AI の「判断専用」のモデルです。文章は返さず、渡した事実(state)と型付きの質問(questions)に対して、構造化された答えだけを返します1。
| 質問の型 | 返るもの |
|---|---|
| Noul | 「はい」である確率(0〜1) |
| Choice | 選択肢から1つ+各選択肢の確率+確信度 |
| Score | 段階評価+各段階の確率+確信度 |
API は POST https://api.typesafe.ai/v1/systemone 1本です2。料金は入力トークンのみの課金で 100万トークンあたり $0.042、出力は無料です3。人格が1日に何十回呼んでも誤差の範囲です。
ganessa さんの記事の要点は、判断に使う事実を全部 state に入れてから聞き、推測で決めないことでした。確信度が 0.8 未満なら「なぜ決まらないか」も Jev に聞き、成果物は要件ごとに Noul で確認してから完了にする、という運用です。
組み込み方を調べる
最初は「CLI ラッパーを1本置いて、スキルから呼ばせる」形を考えていました。ところが調べてみると、OpenClaw 本体に公式の typesafe プラグインがすでにありました。
公式プラグイン
OpenClaw の TypeSafe AI プラグインは、会話用のモデルとは別枠の**判断用モデル(decisionModel)**という役割を持ち込みます4。あわせて、人格が明示的に呼べる typesafe_evaluate ツールも登録されます。
{
plugins: {
allow: ["typesafe"],
entries: {
typesafe: {
enabled: true,
config: {
apiKey: { source: "store", provider: "default", id: "TYPESAFE_API_KEY" },
},
},
},
},
agents: {
defaults: { decisionModel: "typesafe/jev-latest" },
},
}
キーは OpenClaw の秘密情報ストアから読む形です。プラグインは既定で無効で、入れただけでは何も外に送りません。ローカルで動く互換モデル Kev(Qwen3 ベースの 0.6B / 4B / 8B)もあります。
ひとつ引っかかった点として、このプラグインは OpenClaw 2026.9.6 以上が必要です4。うちは全台 2026.8.1 でした。
コミュニティ実装
公式以外にも、9月中旬以降に出たばかりの実装がいくつか見つかりました(どれも star 0〜2)。
| リポジトリ | やっていること |
|---|---|
| herval/openclaw-jev-plugin | LLM に渡す前に「このメッセージに答えるべきか」を Jev に判定させる返信ゲート |
| jason-allen-oneal/openclaw-plugin-typesafe-ai | グループでの振り分け、ツールのガード、記憶圧縮時の選別など全部入り |
| Kevin-Zhouu/jevclaw | 記憶の整理の判断を Jev で行う |
| taaanmay/openclaw-jev-guard | 取り込んだ Web やメールのプロンプトインジェクションを審査 |
| westaicommerce/westai-openclaw-jev | 依存なしの CLI ラッパー+スキル |
公式プラグインは「人格が考えている途中で自分から呼ぶ」もの、返信ゲートは「そもそも答えるかをフックで必ず判定する」もので、役割が違います。
ただ返信ゲートは、うちの構成ではすぐには使えませんでした。メンション必須のチャンネルではゲートが見る前にメッセージが捨てられますし、モデル振り分けの機能は API 型のモデル専用で、Claude CLI で動かしている台には効きません。コミュニティ実装はどれも実績が1週間ほどしかないので、まず公式プラグインだけを1台で試すことにしました。
1台だけ 2026.9.6 に上げる
対象は、普段いちばん相談に使っている1台(以下「おぷー」)です。他の台は触りません。
やったことは次のとおりです。
-
Node 24 を追加で入れる。 2026.9.6 は Node
24.16以上(または26.1以上)が必須で5、うちは Node 22 でした。ほかの台の Node はそのままにして、この台だけ新しい Node で起動するようにしました - state を丸ごと退避する。 起動時に DB のスキーマが上がるので、退避を使わないと 8.1 には戻せません
-
外部プラグイン(Discord・LINE・検索・埋め込みなど)を 9.6 に揃えてから、
@openclaw/typesafeを入れる - 起動して、Discord と LINE に繋がること、
agent -m "1+1は?"に2と返ることを確認
ここまで、キーが無い状態でプラグインは無効のまま置いておきました。
注意点として、うちで入った 9.6 ではツール名が typesafe_evaluate でした。公式ドキュメントにも「optional typesafe_evaluate tool」として載っています6。
キーを入れて有効化する
TypeSafe の API キーはコンソールで発行します(うちの時点では早期アクセス扱いでした)。キーは Discord に貼らず、ターミナルから OpenClaw の秘密情報ストアに直接入れてもらいました。
有効化して typesafe_evaluate をツールとして許可し、試しに呼ばせたところ、実際に Jev が呼ばれて確率 0.96 が返りました。
1つ気をつける点があります。Jev を呼んだ記録は、ゲートウェイのログには出ませんでした。 人格は Claude CLI で動いているので、ツール呼び出しは裏の Claude の会話記録にしか残りません。「呼んだ」という人格の自己申告ではなく、その記録で呼び出しと返り値を確認しています。
AGENTS.md にルールを入れる
最後に、おぷーの AGENTS.md に「判断は Jev に任せる」節を足しました。中身は ganessa さんの記事の考え方と、公式の注意書きを合わせたものです。入れた時点の本文はこうでした。
## 判断は typesafe_evaluate(Jev)に任せる
`typesafe_evaluate` は TypeSafe の判定モデル Jev を呼ぶツール。文章は返さず、
渡した事実から確率だけを返す(noul=「はい」の確率、choice=選択肢+確信度、score=段階)。
**使う場面:** 案を比べて選ぶ・範囲内/要件を満たすかを判定する・段階を付ける・
「終わった」と言う前。雑談や一問一答には使わない。
- 選ぶ/判定する/段階を付けるときは、自分の推測で決めずに聞いて結果に従う
- state には判断の対象についての**事実だけ**を入れる。好み・意向・推測は入れない
- 判断に効く事実(公式の記述・実装・制約・守るべきルール)は実測して全部入れる
- 1 回に 1 つの判断。choice と score は criteria 必須。choice には「該当なし」を入れる
- choice の確信度が 0.8 未満なら、決まらない理由を choice で聞く
- 成果物を作ったら要件ごとに noul で満たすかを聞き、全項目が支持されてから完了とする
- 判断結果は根拠であって実行の許可ではない。送信・公開・変更の権限は別途確認する
- エラー/unavailable は「否定」ではない。自分で判断してその旨を書く
- 🔴 **state は TypeSafe(外部)に送られる。** 個人情報・会計・顧客情報・認証情報・
非公開の案件情報は入れない
最後の項目は大事です。state に入れた内容は外部に送られます。公式ドキュメントにも「判断モデルを選ぶと、選ばれた証拠を設定したエンドポイントへ送ることを許可したことになる」と書かれています4。
入れた直後に、指示なしで普通の相談を投げてみました。
社内の小さなツールの保存先は SQLite / PostgreSQL / DynamoDB のどれがいい?
おぷーは自分から Jev を2回呼び、「SQLite、確信度 0.99」を根拠に SQLite を勧める回答を返しました。これでルールは効いている、と判断して昼の作業を終えました。
半日使ってみた結果
ここからが本題です。その日の夜、有効化してから23時ごろまでの半日分を集計しました。あくまで半日時点の結果です。
動作は安定していた
- 有効化してから一度も再起動しておらず、応答は約90ターン処理しました
- 本番の会話セッション10本すべてで、ルールもツールも読み込まれていました
気になるログはいくつかありましたが、実害は出ていません。
- 1回だけ
typesafe invalid config: apiKey must be objectが出ました。同じ時刻にイベントループが12秒止まっていて、その最中に出たものです。設定ファイルは変わっておらず、その後のセッションにもツールは届いているので、一過性と見ています - 30分おきの DB 掃除が「別プロセスがロック中」でスキップされていました。gateway 自身の子プロセスとの競合と見ています
- cron が1件「CLI run aborted」で落ち、経過表示用のモデルが3回タイムアウトしました
おぷーが自分から Jev を使ったのは0回
使われたのは、昼に私が試した2回だけでした。 本番の会話では、人格が自分から Jev を呼んだことは一度もありません。
「使える状態なのに使っていない」わけです。
では、使う場面が無かったのかというと、そうではありません。集計の中に、使ってよさそうな場面が3つありました。
| 場面 | 会話 | 本来の使いどころ |
|---|---|---|
| 1 | 「小さくて GPS ありの機種はない?」(スマートウォッチ選び) | 選択肢の比較 → Choice |
| 2 | 家族の運動についての相談(「〜した方が良い?」) | すべきかの判断 → Noul |
| 3 | 「これで終わりかな?」(Amazon の件) | 完了判定 → 要件ごとに Noul |
3つ目は、ルールの中でいちばんはっきり書いたはずの「『終わった』と言う前」の場面です。それでも呼ばれていません。
見立て: ルールの書き方が抽象的すぎた
原因の見立てはこうです。
「案を比べて選ぶとき」という書き方が抽象的すぎて、普段の相談口調の会話と結びついていない。 昼に試した「SQLite / PostgreSQL / DynamoDB のどれがいい?」は、選択肢が3つ並んでいて、誰が見ても「案を比べて選ぶ」場面でした。一方、本番の相談は「小さくて GPS ありの機種はない?」「これで終わりかな?」のような口調です。Opus は自分で答えられると判断して、素通りしたのだと思います。
2つ目の場面には、別の可能性もあります。家族の話なので、「個人情報を送るな」の条項に従って送らなかったのかもしれません。この条項は「送るな」とだけ書いていて、「一般化すれば使ってよい」とは書いていませんでした。
昼のテストが通ったから効いている、ではなかった
振り返ると、昼のテストはルールに合わせた質問でした。「どれがいい?」と選択肢付きで聞けば、ルールの文面どおりの場面なので呼ばれて当然です。本番で飛んでくる質問は、そうきれいな形をしていません。
ツールを入れて、ルールを書いて、テストで1回呼ばれた。そこまでは「使える」の確認であって、「使われる」の確認ではありませんでした。
このあと
集計のあと、「もっと使ってみたいので多めに使われるようにしたい」ということで、ルールを具体例入りに書き直し始めています。方向としては次のようなものです。
- 「どれがいい?」「〜した方がいい?」「これで終わり?」のような言い回しを具体的に列挙して、その形で聞かれたら先に Jev を呼ぶ
- 使ったら返事に「Jev: A 0.97」のように一言添えて、使ったかどうかが会話上で見えるようにする
- 個人情報を理由に省かず、一般化してから使う(名前や学校名は入れないが「週3回運動している」のような事実は入れてよい)
ただし、雑談寄りの相談にまで毎回挟むと、そのぶん返事が遅くなります。「完了判定だけは必ず使い、比較は人格の裁量」くらいに留めるか、多めに寄せるか、どこに落ち着けるかはまだ決めている途中です。書き直したルールで本当に呼ばれるようになるかは、まだ測っていません。
まとめ
- OpenClaw 2026.9.6 以上なら、公式の
typesafeプラグインで Jev をすぐ組み込める。Node 24.16 以上が必要 - 導入・動作は安定していた。Jev 自体は速く、費用はほぼ気にならない
- ただし、ルールを入れただけでは、本番の会話で人格が自分から使うことはなかった(半日・10セッション・約90ターンで0回。使えそうな場面は3つ)
- ルールに「案を比べて選ぶとき」のような抽象的な場面を書いても、相談口調の質問とは結びつかない
- 呼ばれたかどうかは、人格の自己申告ではなく会話記録で確認する必要がある
ganessa さんの記事で効いていたのは、判断が必要な場面がはっきりしているコーディング作業だったからかもしれません。雑多な相談を受ける人格に入れるなら、「どういう言い方をされたら呼ぶか」まで書く必要がありそうです。そこはまた結果が出たら書きます。
参考リンク
- CLAUDE.md で判断を jev に任せたら…(ganessa さん・Qiita)
- TypeSafe AI / TypeSafe ドキュメント
- TypeSafe: Primitives(Choice / Score / Noul)
- TypeSafe: Models(料金・レート制限)
- TypeSafe: API reference
- OpenClaw: TypeSafe AI プラグイン
- OpenClaw: Decision models
- OpenClaw: Install(Node の要件)
- Kev(ローカルの System One モデル)
- herval/openclaw-jev-plugin(返信ゲート)
- 拙記事: 「ドメイン移管が失敗した理由を調べて」を Discord に投げてAIにやってもらう
-
出典: TypeSafe: Primitives。Choice は「selected option, a probability for each option, and confidence」、Score は「a score, a probability for each level, and confidence」、Noul は「the probability that the answer is yes」を返します。3種類は1回の API 呼び出しに混ぜられ、同じ state に対して並列に評価されます。 ↩
-
出典: TypeSafe: API reference。
POST https://api.typesafe.ai/v1/systemone、認証はAuthorization: Bearer <API_KEY>。 ↩ -
出典: TypeSafe: Models(2026-09-28 時点)。Jev 1.13(
jev-1.13.0、エイリアスjev-latest)は「$42 / $0.042(per Btok / per Mtok)」「Charged per input token. Output tokens are free.」。レート制限は 250,000 tokens/秒・1,200 requests/分で、「Rate limits are adjusting dynamically」と注記されています。 ↩ -
出典: OpenClaw: TypeSafe AI(2026.9.6 同梱ドキュメントで確認)。「Packaged installs require a host and plugin API of at least
2026.9.6」「The plugin is disabled by default. Installing or enabling it does not select a decision model or schedule background work.」「Selecting a decision model authorizes supported, otherwise-enabled consumers to send their selected evidence to the configured endpoint. Hosted Jev requests incur TypeSafe's normal usage charges.」 ↩ ↩2 ↩3 -
出典: OpenClaw: Install(2026.9.6 同梱ドキュメント)「Node 24.16+ or 26.1+ - Node 26 is recommended」。
package.jsonのengines.nodeも>=24.16.0 <25 || >=26.1.0です。 ↩ -
出典: OpenClaw: TypeSafe AI の Optional evaluation tool の節「The same plugin registers the optional
typesafe_evaluatetool. Enable it through your normal tool policy when an agent should make explicit evaluations. It accepts sharedstate, a map ofquestions, and an optional vendormodeloverride.」 ↩