セットアップ
CLI の実行
フォルダをインデックスし、質問する。ブラウザもサーバーもなしで。
CLI はパイプラインが動いていることを確かめる一番手早い方法です。 フォルダを 1 つ取り、一時的な brain を作り、質問を 1 つ投げ、引用付きで 回答を表示し、終わりがけに brain を削除する、という流れです。
実行する
bun run cli examples/sample-brain "Why does LocalLens use QWEN3_1_7B_INST_Q4?"うまく動くと次のように表示されます。
LocalLens uses QWEN3_1_7B_INST_Q4 because it offers a strong balance of answer
quality and local resource use [1]. A 600M fallback is wired in for slimmer
machines [2].
Sources:
- locallens.md#0
- qvac-notes.md#1初回はチャットモデルと embedding モデルが読み込まれるため、数秒間 止まります。2 回目以降は重みがキャッシュされているので、ずっと速く なります。
内部で起きていること
src/cli.ts は意図的に短く書かれています。一度読めばワークフロー全体が
頭に入ります。
const app = new LocalLensApp();
let brain: Brain | undefined;
try {
brain = await app.createBrainFromFolder({
name: folderPath.split(/[\\/]/).filter(Boolean).at(-1) ?? "cli-brain",
folderPath,
});
const result = await app.askBrain(brain.id, question);
console.log(`\n${result.answer}\n`);
if (result.citations.length > 0) {
console.log("Sources:");
for (const citation of result.citations) {
console.log(`- ${citation.relativePath}#${citation.chunkIndex}`);
}
}
} finally {
if (brain) await app.deleteBrain(brain.id).catch(() => undefined);
await app.close();
}押さえておきたいポイントが 3 つあります。
- brain は
finallyで削除されます。 CLI はワンショットです。JSON エントリを残しません。ブラウザパスでは brain を残します。これが 2 つのエントリポイントの実質的な違いです。 await app.close()は重要です。 これが QVAC を片付けます。これを 省くと、モデルプロセスがバックグラウンドに残り続けることがあります。- brain の名前はフォルダ名から取られます。 brain が短命のあいだ、 JSON ストアを読みやすくするのにちょうど良い情報量です。
複数の質問をしたい場合
CLI は毎回再インデックスします。同じフォルダに複数の質問を投げたい場合は ブラウザアプリを使ってください。リクエスト間で brain を保持します。
出てきうるエラー
Folder not found— 渡したパスがディレクトリではありません。 綴りと、リポジトリのルートにいるかを確認してください。Choose a folder with supported text files— フォルダはあるが、 その中に対象になるファイルがありません。対応拡張子はsrc/files.tsにあります。バイナリファイルと 2 MB を超えるファイルはスキップされます。- 長い待ち時間のあとにモデルエラーが出た場合 — 1.7B モデルの読み込みに 失敗しています。ゲートウェイは自動的に 600M にフォールバックします。 それも失敗するなら、メモリが足りていない可能性が高いです。