<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>AI</title><link>https://blog.ast.moe/tags/ai/</link><description>Recent posts from 五里霧中</description><generator>Hugo</generator><item><title>Codexの判断をJevに切り出すMCPサーバーを作った</title><link>https://blog.ast.moe/blog/2026-09-20-2/</link><pubDate>Sun, 20 Sep 2026 18:29:44 +0900</pubDate><guid>https://blog.ast.moe/blog/2026-09-20-2/</guid><description>&lt;p&gt;
&lt;span&gt;
&lt;a target="_blank" href="https://github.com/ieee0824/jev-mcp"&gt;
jev-mcp
&lt;/a&gt;
&lt;img class="external-link-icon" src="https://blog.ast.moe/images/outer-link.png" width="12" height="12" alt="" aria-hidden="true" loading="lazy"&gt;
&lt;/span&gt;
というMCPサーバーを作った。&lt;/p&gt;
&lt;p&gt;
&lt;span&gt;
&lt;a target="_blank" href="https://docs.typesafe.ai/introduction"&gt;
TypeSafe AIの判断モデルJev
&lt;/a&gt;
&lt;img class="external-link-icon" src="https://blog.ast.moe/images/outer-link.png" width="12" height="12" alt="" aria-hidden="true" loading="lazy"&gt;
&lt;/span&gt;
を、Codexの作業中に呼び出すためのもの。Rustで実装していて、Codexとは標準入出力で通信する。&lt;/p&gt;
&lt;p&gt;コードを書く作業そのものを別のエージェントへ渡すのではなく、調査中に出てくる小さな判断を切り出したい。&lt;/p&gt;
&lt;p&gt;例えば「このファイルは今回の不具合に関係しているか」「次にどのサブシステムを調べるか」といった部分。調査・編集・テストはCodexが続け、その途中の分類や評価にJevを使う形にした。&lt;/p&gt;
&lt;p&gt;まだ実験段階なので、これで開発が何倍速くなったとか、トークンが何割減ったという話ではない。まず接続と使い方を用意したところ。&lt;/p&gt;
&lt;p&gt;以下は9月20日時点、&lt;code&gt;b1688a68&lt;/code&gt;の実装についてのメモ。&lt;/p&gt;
&lt;h2 id="作業全部ではなく一つの判断を渡す"&gt;作業全部ではなく、一つの判断を渡す&lt;/h2&gt;
&lt;p&gt;コーディングエージェントの作業には、ファイルを読む、編集する、テストを動かすという操作の間に、次の行動を選ぶ判断が入る。&lt;/p&gt;
&lt;p&gt;その全部を同じモデルで処理してもよい。ただ、候補の分類や、渡された証拠に対する関連性の判定なら、質問を小さくして別のモデルへ渡せるのでは、というのが今回の出発点。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Codexがコード・差分・ログを調べる
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -&amp;gt; 判断に必要な情報と質問をまとめる
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -&amp;gt; jev-mcpからTypeSafe APIへ送る
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -&amp;gt; 型付きの回答と確率分布を受け取る
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -&amp;gt; Codexが追加調査・編集・テストを進める
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;「この不具合を分析して直して」と丸ごと渡す使い方にはしていない。&lt;/p&gt;
&lt;p&gt;変更との関連性、調査先の選択、影響の大きさは、それぞれ別の質問にする。その結果を見て、次に何を実行するかは呼び出し側で決める。&lt;/p&gt;
&lt;p&gt;単純な文字列検索や、テストを実行すれば確定することまでモデルへ聞く必要はない。Jevを呼ぶこと自体が目的になると、通信が増えるだけになってしまう。&lt;/p&gt;
&lt;h2 id="用意したのは4つのツール"&gt;用意したのは4つのツール&lt;/h2&gt;
&lt;p&gt;Jevは、状態と型を指定した質問を受け取り、構造化された判断を返すモデル。今回のサーバーでは、その入口を4つのMCPツールとして公開した。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ツール&lt;/th&gt;
&lt;th&gt;用途&lt;/th&gt;
&lt;th&gt;主な回答&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;jev.noul&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;一つの条件が成立するか&lt;/td&gt;
&lt;td&gt;Yesの確率&lt;code&gt;noul&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;jev.choice&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;名前付きの選択肢から一つ選ぶ&lt;/td&gt;
&lt;td&gt;&lt;code&gt;choice&lt;/code&gt;、&lt;code&gt;probabilities&lt;/code&gt;、&lt;code&gt;confidence&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;jev.score&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;一つの観点を段階評価する&lt;/td&gt;
&lt;td&gt;&lt;code&gt;score&lt;/code&gt;、&lt;code&gt;legend&lt;/code&gt;、&lt;code&gt;probabilities&lt;/code&gt;、&lt;code&gt;confidence&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;jev.batch&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;同じ材料に対する独立した質問をまとめる&lt;/td&gt;
&lt;td&gt;質問IDごとの回答&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;ここで、Choiceは一つを選ぶためのもの。「この5ファイルのうち、関係がありそうなものを全部知りたい」なら、ファイルごとのNoulをまとめる方が質問に合っている。&lt;/p&gt;
&lt;p&gt;Scoreも、何となく100点満点で採点するのではなく、低い段階から順番に具体的な評価基準を渡す。現在の入力では2〜10段階を扱う。&lt;/p&gt;
&lt;p&gt;3段階ならscoreの範囲は0〜2で、小数も返る。これは段階番号の加重平均であって、障害が起こる確率ではない。&lt;/p&gt;
&lt;h2 id="判断材料は呼び出し側で集める"&gt;判断材料は呼び出し側で集める&lt;/h2&gt;
&lt;p&gt;jev-mcp自体には、リポジトリを探索する機能も、エージェントの実行履歴を自動収集する機能もない。&lt;/p&gt;
&lt;p&gt;渡すのは&lt;code&gt;state&lt;/code&gt;と質問。ファイルのパスだけを送っても、その中身を読んでくれるわけではない。&lt;/p&gt;
&lt;p&gt;例えば&lt;code&gt;jev.batch&lt;/code&gt;には次のような引数を渡す。これは説明用の例で、実際の障害ログではない。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;state&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;diff&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;ワーカーの再試行上限を3回から0回に変更した。&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;failure&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;worker_retries_transient_failure: expected 3 attempts, got 1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;questions&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;related&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;noul&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;instructions&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;failureはdiffに関係していますか？&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;investigate&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;choice&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;instructions&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;diffとfailureから、最初に調べる箇所を選んでください。&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;criteria&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;worker&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;ワーカーの再試行制御&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;api&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;HTTPリクエストの処理&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;unknown&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;判断材料が不足している&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;質問IDの&lt;code&gt;related&lt;/code&gt;や&lt;code&gt;investigate&lt;/code&gt;は回答を対応付けるための名前。質問そのものは&lt;code&gt;instructions&lt;/code&gt;へ書く。&lt;/p&gt;</description></item></channel></rss>