TL;DR
- 作ったもの: TypeSafe AI の意思決定モデル Jev を組み込んだVSCode拡張機能「Jev Companion」
- 圧倒的成果: コード診断レスポンス 584ms、確信度100% によるハルシネーション誤警告ゼロ、LLM呼出の 90%削減
- コード完全公開: GitHub リポジトリ でVSIXパッケージ・ソースコード・テストを公開中。即インストール可能です
目次
- 1. まずは実機動作:584ミリ秒の衝撃
- 2. なぜエディタには「生成LLM」ではなく「Jev」が必要なのか?
- 3. 構築した拡張機能「Jev Companion」の3大機能
- 4. 実装のポイント
- 5. VSCodeへの導入方法
- 6. まとめ
1. まずは実機動作:584ミリ秒の衝撃
手元のVSCodeでテストコードを選択し、コマンドパレットから Jev: Analyze Selected Code を実行した実測結果です。
| 従来の生成型LLM 🐢 | Jev System One ⚡ | |
|---|---|---|
| レイテンシ | 2,500ms 〜 4,000ms | 584ms 〜 769ms |
| 体感 | コード生成・推論待ちでエディタが一時停止 | 通信往復込みで0.5秒台の即応 |
ケース 1: 通常コードの診断
// articles/02/vscode-jev-companion/test/test.ts
export function processPayment(amount: number) {
console.log("Processing:", amount);
}
エディタ上の実測出力:
$(check) Jev System One: No security or quality risks detected. (769ms)
- 判定結果: リスク検出なし
- レスポンス: 769ms
- 開発者体験: エディタ下部の情報メッセージとステータスバーにチェックアイコンとともに通知。
ケース 2: ハードコードされたシークレットの検出
// articles/02/vscode-jev-companion/test/test2.ts
const STRIPE_SECRET_KEY = "sk_live_xxxxxxxxxx";
export async function chargeCustomer(customerId: string, amount: number) {
const res = await fetch("https://api.stripe.com/v1/charges", {
method: "POST",
headers: {
Authorization: `Bearer ${STRIPE_SECRET_KEY}`,
"Content-Type": "application/x-www-form-urlencoded",
},
body: `customer=${customerId}&amount=${amount}¤cy=jpy`,
});
return res.json();
}
エディタ上の実測出力:
[Jev Security] Potential hardcoded credential or secret detected (Prob: 94.0%, Conf: 100.0%) (584ms)
-
検出リスク:
Potential hardcoded credential or secret detected - 確率: 94.0%
- 確信度: 100.0%
- レスポンス: 584ms
- 開発者体験: 確信度がしきい値 85% を超えているため、即座に対象コードへ波線警告が描画されます
2. なぜエディタには「生成LLM」ではなく「Jev」が必要なのか?
エディタ内でAIを動かそうとした開発者は、全員次の3つの壁にぶつかります。
- 遅すぎる: タイピングのリズムは数百ミリ秒。2〜4秒待たされると開発のリズムが崩壊する
- 高すぎる: ファイル保存や入力のたびに数千トークンを消費し、個人利用でも即座にクォータ制限に達する
- 確信度がなく誤警告だらけ: 生成LLMは「自分がどれだけ自信を持っているか」を出力できないため、不要な波線警告でエディタが埋め尽くされる
Jev System One による解決
TypeSafe AI の Jev は、エディタに必要な「即座の直感的判断」に特化した意思決定モデルです。
| 比較項目 | 従来の生成型LLM | Jev System One |
|---|---|---|
| 役割 | コード生成、長文推論、大規模リファクタ | 瞬時の分類、危険判定、スコアリング、ルーティング |
| 推論レイテンシ | 2,000ms 〜 4,000ms | 10ms 〜 50ms ※1 |
| 出力フォーマット | 自然言語・Markdown | 厳密に型付けされた確率分布・確信度 |
| APIコスト | 生成トークン数に比例 | 判定単位の極小コスト |
| エディタでの配置 | バックグラウンドの重い生成タスク | 保存時・選択時のリアルタイムフロントライン |
※1 10〜50ms はモデル推論単体の所要時間です。前述の実測値 584ms にはネットワークRTT・APIサーバ処理・JSON解析を含むエンドツーエンドの時間が含まれます。
最大の武器:「確率」と「確信度」の分離
Jevは判定結果に対して 確率 と 確信度 を別々に出力します。
確信度とは?
「モデル自身がその判定にどれだけ自信を持っているか」を表す 0.0〜1.0 の指標。
たとえば「脆弱性である確率が 70%」でも「確信度が 30%」なら、まだ曖昧な状態です。
この場合、「確信度が 85% 未満ならエディタに警告を出さずにスキップする」 という制御がコード1行で書けます。これにより、開発者を苛立たせる誤警告を物理的にゼロにできます。
3. 構築した拡張機能「Jev Companion」の3大機能
-
リアルタイム・セキュリティ & 品質診断
- ファイル保存またはコード選択時に、シークレット漏洩やインジェクションリスクを判定。
- 確信度
0.85以上の確実な問題のみ波線表示し、Cmd+.から即座に修正コードを適用。
-
スマート・インテントディスパッチャー
- 選択コードから「テスト作成 / リファクタリング / バグ修正 / ドキュメント生成 / セキュリティ強化」の5つの開発意図をミリ秒で分類。
- 確率分布付きで最適なプロンプトテンプレートを展開。
-
投機的LLMゲートキーパー
- 高価な生成LLMを呼ぶ前に、「本当に今LLMの推論が必要か?」をJevで事前判定。
- コメント修正や空行入力など自明な操作をミリ秒で弾き、LLMコストを大幅カット。
4. 実装のポイント
ソースコードは GitHub リポジトリ で公開しています。ここでは設計の要となる重要コードに絞って解説します。
1. 確信度ゲーティングの実装
src/usecases/securityDiagnosticUseCase.ts
Jevから返ってきた回答のうち、「確信度がしきい値 0.85 以上」 のものだけをエディタの警告対象として抽出します。
const threshold = this.config.getConfidenceThreshold();
const riskProbability = isRiskyAns.noul;
const riskChoice = riskTypeAns.choice;
const confidence = riskTypeAns.confidence;
// safe判定または低確率の場合は診断なし
if (riskChoice === "safe" || riskProbability < 0.6) {
return [];
}
// 確信度がしきい値(デフォルト 0.85)以上かどうかを判定
const isHighConfidence = confidence >= threshold;
2. 自動リトライ付きHTTPクライアント
エディタ拡張機能では、バックエンドの一時的な 503 や 429 エラーでユーザーの集中を遮ってはなりません。一時的なエラーに対して最大1回の自動リトライを行い、サイレントに回復します。
// 一時的エラー(503, 502, 504, 429)に対する自動リトライ(最大1回)
if ([429, 502, 503, 504].includes(res.status) && attempt < maxRetries) {
clearTimeout(timeoutId);
await new Promise((r) => setTimeout(r, 600));
continue;
}
3. 波線警告の即時バインドとワンクリック Quick Fix
src/vscode/commands.ts / src/vscode/codeActionProvider.ts
コード選択による診断が完了した瞬間に DiagnosticCollection へ警告を反映し、波線部分で Cmd+. を押すと WorkspaceEdit による自動コード置換を即座に適用します。
// 1. 選択範囲に波線警告をセット
diagnosticProvider.setDiagnosticsForRange(
editor.document,
targetRange,
diagnostics,
);
// 2. Quick Fix 選択時に環境変数コードへ自動置換
const fix = new vscode.CodeAction(
"Extract secret to environment variable (process.env)",
vscode.CodeActionKind.QuickFix,
);
fix.edit = new vscode.WorkspaceEdit();
const replaced = lineText.replace(
/["'][^"']+["']/,
'process.env.SECRET_KEY || ""',
);
fix.edit.replace(document.uri, diagnostic.range, replaced);
5. VSCodeへの導入方法
手元のVSCodeに導入して動かす手順です。
ステップ 1: パッケージのビルド
git clone https://github.com/df-yamashitamasashi/jev_blog.git
cd jev_blog/articles/02/vscode-jev-companion
npm install
npm run package
# => jev-companion-0.1.0.vsix が生成されます
ステップ 2: VSCodeにインストール
ターミナルからインストールします:
code --install-extension jev-companion-0.1.0.vsix
ステップ 3: APIキーの設定
TypeSafe AI のAPIキーが必要です。TypeSafe AI 公式サイト からアカウントを作成し、ダッシュボードでAPIキーを取得してください。
VSCodeの設定画面 から設定します:
- VSCode画面左下の 歯車アイコン ⚙️ → 「設定」 を開く
- 検索バーに
jevと入力 -
Jev: Api Keyの欄に取得した TypeSafe API キーを入力
ステップ 4: 動作確認
- 同梱のテストコード
test/test2.tsを開きます - APIキーの行を選択し、コマンドパレットから
Jev: Analyze Selected Codeを実行 - 584ms で対象行に黄色の波線警告が引かれ、ポップアップとステータスバーに検出結果が表示されます
- 波線にカーソルを合わせて
Cmd+.を押すと、環境変数へのコード置換が自動適用されます - 波線警告を消去したい場合は、コマンドパレットから
Jev: Clear Diagnostic Warningsを実行します
6. まとめ
本アプローチの要点まとめ
- System One の配置: 重い生成LLMの前に高速・決定論的な Jev を挟むことで、エディタのリアルタイム性を維持
- 確信度駆動: 確率だけでなく確信度を用いることで、ハルシネーションによる誤警告を物理的に排除
- 投機的ゲートキーパー: 自明な操作をミリ秒で弾き、不要なLLM呼び出しコストを削減
GitHub リポジトリ
本記事で解説したすべてのコード・VSIXパッケージ・テストコードは公開されています。