@uehaj/sys1grep 0.5.0-next.0 → 0.5.0-next.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.ja.md +156 -29
- package/README.md +164 -36
- package/docs/sentence.svg +1 -1
- package/package.json +1 -1
- package/sys1grep.mjs +742 -149
package/README.ja.md
CHANGED
|
@@ -13,7 +13,7 @@ Jev は文章を生成せず、typed な質問に確率だけを返すモデル
|
|
|
13
13
|
./sys1grep -n -e "顧客が怒っている、または不満を持っている" tickets.txt
|
|
14
14
|
```
|
|
15
15
|
|
|
16
|
-
[](https://uehaj.github.io/
|
|
16
|
+
[](https://uehaj.github.io/jev-semgrep/)
|
|
17
17
|
|
|
18
18
|
<sub>▶ デモをクリックするか <a href="https://uehaj.github.io/sys1grep/">uehaj.github.io/sys1grep</a> を開くと、ランディングページで全編のデモが見られます。</sub>
|
|
19
19
|
|
|
@@ -122,8 +122,7 @@ top-k か質問ごとの閾値調整が要ります。また索引を作らず
|
|
|
122
122
|
その項の意味を尋ねられるので、意味の前に安い正規表現を置くと、費用も待ち時間も下がります。行が送られるのは、
|
|
123
123
|
どれかの項の正規表現がすべて当たったときだけです(正規表現の無い項はどの行にも当たる扱い)。そのため
|
|
124
124
|
`-e '/re/' -a A -e B` では、`re` を含まない行も送られ、`B` だけを尋ねられます。正規表現項だけの式は何も
|
|
125
|
-
|
|
126
|
-
ときは `--sentence=rules` を使います。`/…/flags` の形をしていないものは今まで通り意味です。`-e '/etc 以下のファイルを変更している'`
|
|
125
|
+
送りません。`--unit=sentence-by-jev` でも、そのときは折り返しのつなぎ方を規則だけで決めます。`/…/flags` の形をしていないものは今まで通り意味です。`-e '/etc 以下のファイルを変更している'`
|
|
127
126
|
(閉じる `/` が無い)は影響を受けません。本当に `/` で始まり `/` で終わる意味は、正規表現と誤認されない
|
|
128
127
|
よう先頭にスペースを置けます。
|
|
129
128
|
|
|
@@ -159,23 +158,50 @@ $ ./sys1grep -o -n -e '/[A-Z]+-\d+/' -a 'チケットがまだ閉じていない
|
|
|
159
158
|
Jev に送る行が増えるほど、費用も時間もかかります。いちばん安いのは、送らずに済ませた行です。絞り方を、
|
|
160
159
|
大きく削れるものから順に並べます。
|
|
161
160
|
|
|
162
|
-
- **どのファイルを探すか。** `-r` は `.git`、`node_modules
|
|
161
|
+
- **どのファイルを探すか。** `-r` は `.git`、`node_modules`、バイナリ、秘密情報らしいファイル、生成されたファイル
|
|
162
|
+
(ソースマップ、minify 済み JS/CSS、ロックファイル)、git が無視する
|
|
163
163
|
ものを飛ばします。[`git sys1grep`](#git-のサブコマンドとして-git-sys1grep) は追跡しているファイルだけを探します。
|
|
164
164
|
`--include` / `--exclude`(ファイル名のグロブ)と `--changed-within`(`30m`、`7d`、`today`、`this-week`、日付)で
|
|
165
165
|
さらに絞れます。言語や変更時期を指定する意味は、それだけでファイルを絞ります
|
|
166
166
|
([意味からの絞り込み](#意味からの絞り込み))。
|
|
167
167
|
- **どの行を送るか。** [正規表現項](#正規表現項)はローカルで判定し、当たった行だけが同じ AND 項の意味を
|
|
168
|
-
|
|
168
|
+
尋ねられます。空行は送りません。`-M`/`--max-columns`(既定 2000、`-z` なら 8000)を超える行は、
|
|
169
|
+
先頭からその文字数までだけを送ります。判定はそれでも行われ、超えた先にしか無い一致だけが見つかりません。
|
|
169
170
|
- **何回判定するか。** [`--dedup`](#テンプレートごとに-1-行だけ判定する---dedup) は、ID・数値・時刻・パスだけが
|
|
170
171
|
違う行をまとめて、テンプレートごとに 1 行だけ判定します。
|
|
171
|
-
- **払う前に確かめる。** `--dry-run`
|
|
172
|
-
|
|
173
|
-
|
|
172
|
+
- **払う前に確かめる。** `--dry-run` は何も送らず、この検索が使う設定、検索するファイル、ファイルごとの
|
|
173
|
+
送る行数、各リクエストとその質問を表示します。最後の行には入力トークン数と、TypeSafe 本体なら料金の
|
|
174
|
+
見積もりが出ます(`~3178 input tokens, ~$0.000133`。誤差 1 割程度)。`-i` は同じ集計を端末に出し、
|
|
175
|
+
`y` と答えたときだけ送ります。
|
|
176
|
+
リクエストの本体を送る前に、まず対象のサイズ(`--max-filesize`、既定 10M)を計測し、超えるものは
|
|
177
|
+
rg の `--max-filesize` と同じく無条件に飛ばして stderr に名前を出します(`-y` は効きません)。`.gz` は
|
|
178
|
+
展開後の大きさで計測します(上限で展開を止めるので、大きすぎるものを全部展開することはありません)。標準入力は
|
|
179
|
+
読んでから(すでにメモリ上にあるので)計測し、超えていれば同じく飛ばします。`--cached` / `<tree>:` の
|
|
180
|
+
対象はファイルではなく blob なので、その内容(`git cat-file --batch` で一括して読んだもの。blob ごとに
|
|
181
|
+
git を起動し直しません)から計測します。`-g` のコミットはここに含まれません。送るときにすでに `-M` で
|
|
182
|
+
上限があるからです。
|
|
183
|
+
送る予定のトークンの値段(`--max-cost`、既定 1 USD)は別に見積もり、超えていれば端末で続けるか聞きます。
|
|
184
|
+
`-y` は聞かずに yes と答え、端末が無く超えていれば終了コード 2 です(`-q` でも同じで、スクリプトからは
|
|
185
|
+
`-y` を渡します)。
|
|
174
186
|
|
|
175
187
|
```sh
|
|
176
188
|
$ sys1grep --dry-run -r --include='*.log' --changed-within=today -e '/ERROR|FATAL/' -a '顧客に影響が出ている' logs/
|
|
177
189
|
```
|
|
178
190
|
|
|
191
|
+
`--verbose`(や `--dry-run`)は、コマンドラインで指定しなかった設定が*どこから*来たか
|
|
192
|
+
(`SYS1GREP_OPTS`、環境変数、`~/.config/sys1grep/.env`、プリセットの既定値のいずれか)も表示するので、
|
|
193
|
+
想定と違う結果をその設定まで辿れます。キーの値は表示せず、どのオプションや変数が渡したかだけを表示します。
|
|
194
|
+
|
|
195
|
+
```sh
|
|
196
|
+
$ SYS1GREP_OPTS='--level strict' sys1grep --verbose -e "APIキーがファイルから読まれている" .
|
|
197
|
+
sys1grep: endpoint api.typesafe.ai/v1/systemone (default), model jev-latest (default)
|
|
198
|
+
sys1grep: key: SYS1GREP_API_KEY (~/.config/sys1grep/.env)
|
|
199
|
+
sys1grep: SYS1GREP_OPTS: --level strict
|
|
200
|
+
sys1grep: options: --level strict (SYS1GREP_OPTS) = -t 0.7 -T 0.3, --chunk 30, -j 8, scope on, -M 2000, --max-filesize 10M, --max-cost 1
|
|
201
|
+
sys1grep: file ./a.py: 120 lines, 120 to send
|
|
202
|
+
…
|
|
203
|
+
```
|
|
204
|
+
|
|
179
205
|
## インストール
|
|
180
206
|
|
|
181
207
|
使い方は 2 通りあります。コマンドラインツールとして使う(この節)か、Claude Code のスキルとして使う
|
|
@@ -369,12 +395,17 @@ tests/tickets/sub/b.txt
|
|
|
369
395
|
`-r` はディレクトリを名前順にたどり、`.git`、`node_modules`、`.ssh`、`.aws`、`.gnupg`、`.kube`、`.docker`、
|
|
370
396
|
バイナリ(先頭 8 KB に NUL がある、または PDF。BOM 付きの UTF-16 はテキストとして読む)、
|
|
371
397
|
秘密情報になりがちなファイル(`.env*`、`.netrc`、`.npmrc`、`.pypirc`、`.pgpass`、`.git-credentials`、`*.pem`、
|
|
372
|
-
`*.key`、`*.p12`、`*.pfx`、`*.jks`、`*.keystore`、`id_rsa*`
|
|
398
|
+
`*.key`、`*.p12`、`*.pfx`、`*.jks`、`*.keystore`、`id_rsa*` など。大文字小文字は区別しない)、
|
|
399
|
+
生成されたファイル(`*.map`、`*.min.js`、`*.min.css`、`package-lock.json`、`yarn.lock`、`pnpm-lock.yaml`、
|
|
400
|
+
`Cargo.lock`、`poetry.lock`、`composer.lock`、`Gemfile.lock`、`go.sum`)を飛ばします。
|
|
373
401
|
**検索対象の行はすべて TypeSafe の API に送られる**ので、スキャンするつもりのディレクトリだけを指定してください。
|
|
374
402
|
git リポジトリの中では、git が無視するもの(`.gitignore`、`.git/info/exclude`、グローバルの除外ファイル)も `-r` で
|
|
375
403
|
飛ばすので、ビルド成果物や手元だけのファイルは送られません。追跡中のファイルは、無視パターンに当たっても検索します。
|
|
376
404
|
コマンドラインで明示したファイルは、除外リストに該当しても、git が無視していても検索します。git が無視している
|
|
377
405
|
ディレクトリも、名前を指定すれば検索します(`sys1grep -r -e ... dist`)。
|
|
406
|
+
`*.gz`(ローテートしたログ `app.log.1.gz`)は `zgrep` のように展開して読み、ディスク上の名前で表示します
|
|
407
|
+
(`app.log.1.gz:12:...`)。`--include='*.gz'` で選べ、バイナリ判定は展開後のバイトで行い、壊れた `.gz` は
|
|
408
|
+
読めないファイルとして扱います。圧縮した秘密情報らしいファイル(`private.key.gz`)は元と同じく飛ばします。gzip だけ、名前だけで判断します。
|
|
378
409
|
`-l` は一致したファイルを見つかった順に 1 回ずつ表示し、`-r` の有無にかかわらず使えます。`-c` は行の代わりにファイルごとの一致行数を出します。
|
|
379
410
|
|
|
380
411
|
### 意味からの絞り込み
|
|
@@ -438,6 +469,26 @@ FILE を省くとカレントディレクトリ以下の追跡ファイルを全
|
|
|
438
469
|
「いま変わった」扱いになります。
|
|
439
470
|
ヘルプは `git sys1grep -h` です(`--help` は git が横取りして man ページを探しに行きます)。
|
|
440
471
|
|
|
472
|
+
`--cached`、`--untracked`、`<tree>...` は作業ツリーの代わりに探す対象を選びます。`git grep` と同じで、
|
|
473
|
+
3 つのうち同時に使えるのは 1 つだけです。
|
|
474
|
+
|
|
475
|
+
```sh
|
|
476
|
+
$ git sys1grep --cached -e "リトライしている" # ステージ済み、未コミットの変更も含む
|
|
477
|
+
$ git sys1grep --untracked -e "リトライしている" # 追跡ファイルに加え未追跡ファイルも (.gitignore は効いたまま)
|
|
478
|
+
$ git sys1grep -n -e "リトライしている" main v0.3.1 -- '*.py'
|
|
479
|
+
main:src/job.py:42: retry(job, times=3)
|
|
480
|
+
v0.3.1:src/job.py:40: retry(job)
|
|
481
|
+
```
|
|
482
|
+
|
|
483
|
+
`<tree>`(ブランチ・タグ・コミット・`@{u}`)は `--` の前に置いた、リビジョンとして解決できる引数です。複数指定でき、
|
|
484
|
+
指定順に探し、各行には解決前の名前をそのまま付けます (`@{u}:path` であって、解決したブランチ名ではありません)。
|
|
485
|
+
`--changed-within` は作業ツリーが要ります。blob(`--cached`、`<tree>`)には自分の mtime がないためです。
|
|
486
|
+
`<tree>` 自身の pathspec も sys1grep の他の場所と同じくグロブが使えます(空の tree との `git diff-tree` を使い、
|
|
487
|
+
`git ls-tree` 自身のリテラル・ディレクトリ前方一致のみのルールには従いません)。`--include` / `--exclude`
|
|
488
|
+
(名前で絞る方)はそのまま使えます。
|
|
489
|
+
**古い `<tree>` には、後で削除された秘密情報が普通のファイルとして残っていることがあります**。スキップ対象は
|
|
490
|
+
名前で判定するだけで、変更履歴では判定しません。
|
|
491
|
+
|
|
441
492
|
### 「〜でない」行を全部
|
|
442
493
|
|
|
443
494
|
```sh
|
|
@@ -465,15 +516,15 @@ $ git log -z --format='%h %s %b' | ./sys1grep -z -n -e "ユーザーに見える
|
|
|
465
516
|
ファイル名 (`-l`) と件数 (`-c`) は grep と同じく改行のままです。`-z` のとき `-n` はレコード番号、
|
|
466
517
|
`-A` / `-B` / `-C` は前後のレコード数、`--chunk` は 1 リクエストのレコード数を数えます。
|
|
467
518
|
|
|
468
|
-
### 1 文ずつ判定する (`--sentence
|
|
519
|
+
### 1 文ずつ判定する (`--unit=sentence-by-*`)
|
|
469
520
|
|
|
470
|
-
`--sentence`
|
|
521
|
+
`--unit=sentence-by-jev`(または後述の `sentence-by-rule`)を付けると、行ではなく文ごとに判定します。出力は grep と同じく行のままです。当たった文がかかる
|
|
471
522
|
行をすべて出し、端末では文の部分を太字の黄で強調します(その中の正規表現の一致は grep と同じ太字の赤)。文に分ける前に折り返した行をつなぐので、
|
|
472
523
|
複数行にまたがる文も 1 文として判定します。[`tests/prose.txt`](tests/prose.txt) には、折り返した英語と日本語の
|
|
473
524
|
段落が入っています。
|
|
474
525
|
|
|
475
526
|
```sh
|
|
476
|
-
$ ./sys1grep -n --sentence -e "the author admits they made a mistake" tests/prose.txt
|
|
527
|
+
$ ./sys1grep -n --unit=sentence-by-jev -e "the author admits they made a mistake" tests/prose.txt
|
|
477
528
|
1:I should have checked the input
|
|
478
529
|
2:before shipping, and that was my
|
|
479
530
|
3:mistake. Next time I will add a test
|
|
@@ -485,14 +536,14 @@ $ ./sys1grep -n --sentence -e "the author admits they made a mistake" tests/pros
|
|
|
485
536
|
端末で意味を 2 つ渡し、`-C 3` で前後も出すと、文がどこで始まりどこで終わるかが色で分かります。3 行目と 9 行目は、当たった文の
|
|
486
537
|
終わりまでだけ色が付き、4〜7 行目は文脈行(`-`)です:
|
|
487
538
|
|
|
488
|
-

|
|
539
|
+

|
|
489
540
|
|
|
490
541
|
`-o` を付けると、当たった文だけを 1 行ずつ出します。`grep -o` が一致した部分だけを出すのと同じです。
|
|
491
542
|
`-n` は文が始まる行の番号になります。日本語は空白を入れずにつなぎます。単語の間に空白を置かない
|
|
492
543
|
中国語・タイ語・ラオ語・クメール語・ミャンマー語・チベット語も同様です。
|
|
493
544
|
|
|
494
545
|
```sh
|
|
495
|
-
$ ./sys1grep -n -o --sentence -e "the author admits they made a mistake" -e "customer is asking for a refund" tests/prose.txt
|
|
546
|
+
$ ./sys1grep -n -o --unit=sentence-by-jev -e "the author admits they made a mistake" -e "customer is asking for a refund" tests/prose.txt
|
|
496
547
|
1:I should have checked the input before shipping, and that was my mistake.
|
|
497
548
|
8:先週買った掃除機が初日から動かないので返金してほしいです。
|
|
498
549
|
```
|
|
@@ -500,19 +551,19 @@ $ ./sys1grep -n -o --sentence -e "the author admits they made a mistake" -e "cus
|
|
|
500
551
|
`-o` なしでは、`-c` と `-A` / `-B` / `-C` はいつもどおり行で数えます。`-o` 付きでは文で数えます。
|
|
501
552
|
`-z` と併用すると、レコードごとに文に分け、当たったレコードをまるごと出します。
|
|
502
553
|
|
|
503
|
-
Jev は長い行の中からでも当たる文を自分で見つけるので、判定の精度のために `--sentence` を使う必要はありません。
|
|
554
|
+
Jev は長い行の中からでも当たる文を自分で見つけるので、判定の精度のために `--unit=sentence-by-jev` を使う必要はありません。
|
|
504
555
|
どの文が当たったかを見たいとき、`-o` で文そのものが欲しいとき、AND を 1 つの文の中で成り立たせたいときに
|
|
505
556
|
使います。式は文ごとに評価されます。そのため、`-v X` だけの式では「X でない文を 1 つでも含む行」がすべて出ます。
|
|
506
|
-
行全体として X でないものを探すなら、`--
|
|
557
|
+
行全体として X でないものを探すなら、`--unit` を `line` のままにします。
|
|
507
558
|
|
|
508
559
|
日本語や中国語では、チャットの発言、問い合わせ、メモの 1 行など、`。` で終わらない 1 行 1 件のデータがよくあります。
|
|
509
|
-
これをつなぐと、別々の項目が 1
|
|
560
|
+
これをつなぐと、別々の項目が 1 つの「文」になってしまいます。そこで `--unit=sentence-by-jev` では、
|
|
510
561
|
単語の間に空白を置かない文字に接する、句点の無い改行について、Jev に「この改行は文や項目の終わりか、文の途中の
|
|
511
562
|
折り返しか」を聞きます。30 行を 1 リクエストにまとめて改行ごとに yes/no を聞き、0.7 以上なら行をつなぎません。
|
|
512
|
-
[`tests/corpus.txt`](tests/corpus.txt) では、これで日本語の問い合わせ 4 件が 1 件ずつに分かれ、`--sentence` でも
|
|
563
|
+
[`tests/corpus.txt`](tests/corpus.txt) では、これで日本語の問い合わせ 4 件が 1 件ずつに分かれ、`--unit=sentence-by-jev` でも
|
|
513
564
|
行単位の検索と同じ返金の要求(14 行目と 18 行目)が見つかります。規則だけでは問い合わせがつながり、18 行目を
|
|
514
565
|
取りこぼしていました。追加のリクエストの費用は、意味を 1 つ増やすのと同じくらいです。避けたいときは
|
|
515
|
-
`--sentence
|
|
566
|
+
`--unit=sentence-by-rule` を使います。英語どうしの改行は聞きません。つないでも空白が残り、ピリオドで文が切れるためです。
|
|
516
567
|
|
|
517
568
|
改行が文の途中になりえないところでは、行をつなぎません。空行、括弧や `;` に接する改行(JSON やコード)、
|
|
518
569
|
`-` `*` `+` `#` `>` `"` や数字で始まる行(箇条書き、見出し、引用、番号、日時)の前です。そのため JSONL は
|
|
@@ -521,6 +572,36 @@ Jev は長い行の中からでも当たる文を自分で見つけるので、
|
|
|
521
572
|
`Mr.` のような略語の後ろでも切ります。ログは文章ではないので、`ERROR ...` の次の `WARN ...` のように
|
|
522
573
|
英字で始まるログ行が続くと、つながります。
|
|
523
574
|
|
|
575
|
+
### 関数ごとに判定する (`--unit=function`)
|
|
576
|
+
|
|
577
|
+
コードについての問いは、たいてい関数についての問い(「ネットワーク障害で再試行している」)で、関数の 1 行だけでは
|
|
578
|
+
そうと分かりません。`--unit=function` は関数ごとに判定し、当たった関数の行を出します。`-n` はファイルの行番号です。
|
|
579
|
+
|
|
580
|
+
```sh
|
|
581
|
+
$ ./sys1grep -n --unit=function -e "ネットワーク障害で再試行している" src/net.js
|
|
582
|
+
src/net.js:3:async function fetchWithRetry(url) {
|
|
583
|
+
src/net.js:4: for (let i = 0; i < 5; i++) {
|
|
584
|
+
src/net.js:5: try { return await fetch(url); }
|
|
585
|
+
src/net.js:6: catch { await sleep(2 ** i * 100); }
|
|
586
|
+
src/net.js:7: }
|
|
587
|
+
src/net.js:8:}
|
|
588
|
+
```
|
|
589
|
+
|
|
590
|
+
関数は、関数名の行から次の関数名の行の前までです(`git grep -W` と同じ)。最初の関数名の行より前の行は 1 つの単位に
|
|
591
|
+
なり、関数の末尾の空行は出力しません。関数名の行は git と同じく、`.gitattributes` の `diff=<driver>` 属性と、git config の
|
|
592
|
+
`diff.<driver>.xfuncname` で決めます。無ければ、JavaScript/TypeScript(トップレベルの `function`・`class`、関数を
|
|
593
|
+
代入する `const` / `let` / `var`)と Python(入れ子も含む `def` / `class`)は sys1grep の規則を使い(デコレータの行 `@retry` から関数が始まる)、それ以外は git の既定
|
|
594
|
+
(英字・`_`・`$` で始まる行)を使います。git 組み込みのドライバ(`diff=python` など)は読まないので、`xfuncname` の無い
|
|
595
|
+
ドライバも同じように扱います。
|
|
596
|
+
|
|
597
|
+
```sh
|
|
598
|
+
$ printf '*.go diff=golang\n' >> .gitattributes
|
|
599
|
+
$ git config diff.golang.xfuncname '^(func|type)[[:space:]]'
|
|
600
|
+
```
|
|
601
|
+
|
|
602
|
+
`-M` の既定は `-z` と同じ 8000 文字で、それより長い関数は先頭 8000 文字で判定します。`--chunk` は関数の数、
|
|
603
|
+
`-A`/`-B`/`-C` と `-c` は文の単位と同じく行の数を数えます。`-z`・`-g`・`-o` とは併用できません。
|
|
604
|
+
|
|
524
605
|
### テンプレートごとに 1 行だけ判定する (`--dedup`)
|
|
525
606
|
|
|
526
607
|
費用は送るテキストの量に比例します。機械が吐くログの大半は、ID や数値だけが違う同じ骨格の繰り返しです。
|
|
@@ -543,7 +624,7 @@ Jev に聞き、その種類はまとめません(上の 2 リクエストの
|
|
|
543
624
|
値を何も残さずにまとめた場合の実測では、43,071 行のシステムログが 550 テンプレート(バイト数で 1.2%)に、
|
|
544
625
|
`install.log` が 21.1% に縮みました。Claude Code のトランスクリプト(jsonl)は 56.8% までしか縮みません。
|
|
545
626
|
機械が吐くログ向けの機能で、散文には共通の骨格がなく、時刻を読む意味ではほとんど縮みません。
|
|
546
|
-
`-z` や `--sentence
|
|
627
|
+
`-z` や `--unit=sentence-by-*` では、行ではなくレコードや文をまとめます。
|
|
547
628
|
|
|
548
629
|
検索後の集計行には、まとめたことで浮いた分が `(2 folded by --dedup, ~235 input tokens / ~$0.000010 saved, 21%)`
|
|
549
630
|
のように出ます(上の例)。まとめた行を別のリクエストとして送った場合の推定値から、値の種類を聞いたリクエストの費用を引いた
|
|
@@ -571,15 +652,44 @@ $ sys1grep -r -n --summarize -e "API キーをファイルから読んでいる"
|
|
|
571
652
|
を尋ねた例では、Claude の入力が 22,059 トークンから 1,356 に、Jev を含む総額が $0.094 から $0.013 に下がり、答えは同じでした(#69)。
|
|
572
653
|
答えが少数の行にあるときに効きます。
|
|
573
654
|
|
|
574
|
-
- 一致した行はもう一度マシンの外へ、Anthropic
|
|
655
|
+
- 一致した行はもう一度マシンの外へ、Anthropic(や TOOL の接続先)に送られます。
|
|
575
656
|
- `-n`・`-A/-B/-C`・`-p`・ファイル名は表示どおりに渡し、色は付けません。一致がなければ何も渡しません(終了コード 1)。
|
|
576
|
-
- `SYS1GREP_SUMMARIZER` は値を付けない `--summarize` の TOOL
|
|
657
|
+
- `SYS1GREP_SUMMARIZER` は値を付けない `--summarize` の TOOL を、`SYS1GREP_SUMMARIZER_MODEL` はそのモデルを決めます。
|
|
577
658
|
- `-q`・`-l`・`-c` は行を出さないので、一緒には使えません。
|
|
659
|
+
- 答えはプレーンテキストです。何も言わなければ LLM は Markdown で書き、端末では雑音になるので、plain を頼みます。
|
|
660
|
+
`--summarize-format=markdown` か `=html` でそれらを頼めます(`… --summarize-format=html … > summary.html`)。
|
|
661
|
+
答えは確かめずにそのまま表示します。`SYS1GREP_OPTS` に書けば常用の設定になり、`--summarize` が無いときは無視します。
|
|
578
662
|
- `--dedup` では、Jev に送ったものと同じく、テンプレートごとの代表を 1 回だけ `(×N like it)` を付けて渡します。
|
|
579
663
|
答えを使い回したすべての行は渡しません。
|
|
580
664
|
- 200 KB(約 5 万トークン)を超えるときは何も渡さず、大きさを示して終了コード 2 で止まります。TOOL の費用がかかる前です。
|
|
581
665
|
先頭だけの要約は全体の要約に見えてしまうので、切り詰めはしません。
|
|
582
666
|
|
|
667
|
+
`--summarize-prompt=TEXT` で固定の指示の後に自分の指示(長さ・観点など)を足せます。
|
|
668
|
+
|
|
669
|
+
```sh
|
|
670
|
+
$ sys1grep -r -n --summarize --summarize-prompt="3 行以内で。どのファイルを直せばよいかだけ" \
|
|
671
|
+
-e "API キーをファイルから読んでいる" .
|
|
672
|
+
```
|
|
673
|
+
|
|
674
|
+
`--summarize` が要ります。空の TEXT は指定しないのと同じです。`--summarize-format` の文より後に置くので、TEXT で書式を上書きできます。
|
|
675
|
+
|
|
676
|
+
他の TOOL:
|
|
677
|
+
|
|
678
|
+
```sh
|
|
679
|
+
$ sys1grep --summarize=llm -e "..." FILE # Simon Willison 氏の llm、ツールなし (-T を渡さない)
|
|
680
|
+
$ sys1grep --summarize=pi -e "..." FILE # pi --print --no-tools --no-session ...
|
|
681
|
+
$ SYS1GREP_SUMMARIZER_MODEL=qwen3.5:9b sys1grep --summarize=ollama -e "..." FILE
|
|
682
|
+
$ SYS1GREP_SUMMARIZER_MODEL=some-id sys1grep --summarize=lmstudio -e "..." FILE # モデル id は GET /v1/models から
|
|
683
|
+
$ SYS1GREP_SUMMARIZER_MODEL=some-id sys1grep --summarize=http://localhost:8080/v1 -e "..." FILE # llama.cpp・vLLM・LocalAI・ゲートウェイ
|
|
684
|
+
```
|
|
685
|
+
|
|
686
|
+
`ollama` と `lmstudio` はローカルの OpenAI 互換サーバ (`POST /v1/chat/completions`) へ `fetch` で直接送ります。
|
|
687
|
+
CLI を挟まないので、一致した行がもう一度マシンの外へ出ることはありません。素の `http(s)://` URL は他の
|
|
688
|
+
OpenAI 互換サーバ全般です。3 つとも `SYS1GREP_SUMMARIZER_MODEL` が要ります(既定モデルが無いため)。
|
|
689
|
+
`SYS1GREP_SUMMARIZER_API_KEY` は URL の TOOL にだけ `Authorization: Bearer` として送られます
|
|
690
|
+
(Jev 用の `SYS1GREP_API_KEY` は送りません)。`OLLAMA_HOST` で ollama 側のホストを変えられます
|
|
691
|
+
(`ollama` CLI 自体と同じ)。
|
|
692
|
+
|
|
583
693
|
## Claude Code から使う
|
|
584
694
|
|
|
585
695
|
sys1grep を代わりに走らせてくれる Claude Code のスキルがあります。探したいものを言葉で書くと、式を組み立てて
|
|
@@ -633,7 +743,11 @@ usage: sys1grep [OPTION]... -e MEANING|-Q QUESTION [-a MEANING] [-v MEANING]...
|
|
|
633
743
|
-T THRESH 否定条件の閾値。確率 < THRESH で「〜でない」と判定 (--level より優先)
|
|
634
744
|
-t 0.6 -T 0.3 なら 0.3〜0.6 の曖昧な行はどちらにも当たらない
|
|
635
745
|
-r ディレクトリを再帰的に探す (FILE 省略時はカレント)。.git、node_modules、
|
|
636
|
-
|
|
746
|
+
バイナリ、秘密情報らしいファイル、生成されたファイル、git が無視するものは飛ばす
|
|
747
|
+
--cached git sys1grep 限定。作業ツリーではなくインデックスを探す (git grep --cached と同じ)
|
|
748
|
+
--untracked git sys1grep 限定。追跡ファイルに加え未追跡ファイルも探す (.gitignore は効いたまま。git grep --untracked と同じ)
|
|
749
|
+
<tree>... git sys1grep 限定。-- の前のブランチ・タグ・コミット・@{u} はそのリビジョンのツリーを探す
|
|
750
|
+
(git grep と同じ)。出力には <tree>: を付け、名前は解決前のまま表示する
|
|
637
751
|
--include=GLOB, --exclude=GLOB -r と git sys1grep で、名前が GLOB に合うファイルだけ (または合わないものだけ) を探す
|
|
638
752
|
(-r ではコマンドラインで指定したファイルは必ず探す。git sys1grep の pathspec は絞り込む)
|
|
639
753
|
--changed-within=WHEN -r と git sys1grep で、30m / 2h / 7d / 2w 以内、日付か日時以降、today / this-week /
|
|
@@ -651,13 +765,26 @@ usage: sys1grep [OPTION]... -e MEANING|-Q QUESTION [-a MEANING] [-v MEANING]...
|
|
|
651
765
|
判定も変わる
|
|
652
766
|
-j N 同時リクエスト数 (既定 8)
|
|
653
767
|
-n 行番号を付ける
|
|
654
|
-
|
|
655
|
-
--
|
|
656
|
-
|
|
768
|
+
--unit=UNIT 判定の単位: line (既定)、zero、sentence-by-jev、sentence-by-rule、function
|
|
769
|
+
-z, --null-data --unit=zero。行ではなく NUL 終端のレコードごとに判定し、NUL 終端で出力する (前述の「複数行にまたがるレコード」を参照)。
|
|
770
|
+
--unit=sentence-by-* と併用すると、レコードごとに文に分ける
|
|
771
|
+
--unit=sentence-by-jev|sentence-by-rule 行ではなく文ごとに判定する (前述の「1 文ずつ判定する」を参照)
|
|
772
|
+
--unit=function 関数ごとに判定し、当たった関数の行を出す (前述の「関数ごとに判定する」を参照)
|
|
773
|
+
-o --unit=sentence-by-* と併用し、当たった文だけを出す
|
|
657
774
|
-p 各意味の確率を行末に表示 (閾値調整用)
|
|
658
|
-
--dry-run
|
|
775
|
+
--dry-run 何も送らず、この検索が使う設定 (コマンドラインでなければその出どころも)・検索するファイル・
|
|
776
|
+
各リクエストとその質問を表示
|
|
659
777
|
--verbose 同じ表示を検索しながら stderr に出す
|
|
660
778
|
-i, --interactive --dry-run と同じ内容を見せ、端末で y と答えたときだけ検索する
|
|
779
|
+
-M NUM, --max-columns=NUM 行 (-z ならレコード) の先頭 NUM 文字までを送る。判定はそれでもされる
|
|
780
|
+
(NUM より先にしか無い一致だけ見つからない)。既定 2000、-z なら 8000
|
|
781
|
+
--max-filesize=SIZE 対象を先に計測 (K/M/G、既定 10M)。超えるものは rg の --max-filesize と同じく
|
|
782
|
+
無条件に飛ばす (-y は効かない)。標準入力は読んでから計測し、超えていれば同じく飛ばす。
|
|
783
|
+
--cached / <tree>: の対象は blob で、その内容から計測する。-g のコミットはここに
|
|
784
|
+
含まれない (送るときに -M ですでに上限がある)
|
|
785
|
+
--max-cost=USD 送る予定の入力を見積もって値段を出す。超えれば (既定 1) 端末で続けるか聞く。
|
|
786
|
+
-y は聞かずに yes と答える。端末が無く超えていれば終了コード 2、-q でも変わらない
|
|
787
|
+
(スクリプトからは -y)。-i は無条件かつこれより前に聞くので二重には聞かない
|
|
661
788
|
--dedup テンプレートごとに 1 行だけ判定し、その答えを残りにも使う (前述の「テンプレートごとに 1 行だけ判定する」を参照)
|
|
662
789
|
--color[=WHEN] 色付け。auto (端末なら付ける、既定) / always / never。=WHEN 省略時は auto
|
|
663
790
|
ファイル名・行番号は grep と同じ配色。-p の確率は閾値以上を緑、
|
|
@@ -742,14 +869,14 @@ fmt -w 100000 essay.txt | sys1grep -n -e "the author admits they made a mistake"
|
|
|
742
869
|
|
|
743
870
|
出力の 1 行が 1 段落になり、`-n` は元のファイルではなく `fmt` の出力の行番号になります。`fmt` は日本語の行をつなぐとき
|
|
744
871
|
間に空白を入れますが、Jev の判定には響きません。折り返しをまたぐ文を判定したいだけなら、どちらも要りません。
|
|
745
|
-
`--sentence` が行をつないで文に分けます。
|
|
872
|
+
`--unit=sentence-by-jev` が行をつないで文に分けます。
|
|
746
873
|
|
|
747
874
|
### 会話記録の JSONL を、発言 1 件ずつ判定したい
|
|
748
875
|
|
|
749
876
|
`jq` で本文を取り出し、発言ごとに NUL で終えてから、`-z` でレコードとして判定します。
|
|
750
877
|
|
|
751
878
|
```sh
|
|
752
|
-
jq -j '.content + "\u0000"' chat.jsonl | sys1grep -z -n --sentence -e "the customer is asking for a refund" | tr '\0' '\n'
|
|
879
|
+
jq -j '.content + "\u0000"' chat.jsonl | sys1grep -z -n --unit=sentence-by-jev -e "the customer is asking for a refund" | tr '\0' '\n'
|
|
753
880
|
```
|
|
754
881
|
|
|
755
882
|
`.content` は、本文が入っている場所に合わせて書き換えてください。発言 1 件が 1 レコードになるので、文が次の話者の
|