@uehaj/sys1grep 0.5.0-next.1 → 0.5.0
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 +521 -95
- package/README.md +522 -93
- package/examples/app.js +49 -0
- package/examples/app.py +54 -0
- package/examples/logs.txt +19 -0
- package/examples/prose.txt +10 -0
- package/examples/tickets.txt +9 -0
- package/lib/sentences.mjs +49 -0
- package/options.mjs +101 -0
- package/package.json +29 -5
- package/serve.mjs +1121 -0
- package/settings.mjs +58 -0
- package/sys1grep.mjs +1260 -442
- package/templates/default.html +102 -0
- package/templates/print.html +51 -0
- package/templates/search.html +114 -0
- package/templates/terminal.html +57 -0
package/README.ja.md
CHANGED
|
@@ -4,21 +4,23 @@
|
|
|
4
4
|
|
|
5
5
|
背景と設計の解説: [Jevのキラーアプリ、「意味で探す grep」を作った(Zenn)](https://zenn.dev/uehaj/articles/jev-semgrep-grep-by-meaning)
|
|
6
6
|
|
|
7
|
+
> **semgrep から改名しました(0.5.0)。** 理由は 2 つです。1 つは、静的解析ツール [Semgrep](https://semgrep.dev/) の商標と名前が衝突すること。もう 1 つは、このツールがもともと Jev 専用ではなく、System 1 モデル全般を対象にしていることです。TypeSafe AI が Jev の後に Jev 以外の名前で出すかもしれないモデルにも対応したいです :)。そこで 0.5.0 から **sys1grep**(System 1 + grep)になりました。npm パッケージは `@uehaj/sys1grep`(旧 `@uehaj/semgrep`)、コマンドは `sys1grep` / `git sys1grep`、環境変数は `SYS1GREP_*`、設定ファイルは `~/.config/sys1grep/.env` です。旧 `SEMGREP_*` と `~/.config/semgrep/.env` は 1 マイナーリリースの間は読み、使うたびに非推奨の 1 行を出します(1.0.0 で廃止)。詳細は [CHANGELOG](CHANGELOG.md#renamed)。Zenn 記事の URL は旧 slug のままです。
|
|
8
|
+
|
|
7
9
|
正規表現ではなく **意味** で行を探す grep です。
|
|
8
10
|
判定には [TypeSafe AI](https://typesafe.ai/) の System One モデル **Jev** を使います。
|
|
9
11
|
Jev は文章を生成せず、typed な質問に確率だけを返すモデルなので、1 行ごとに
|
|
10
12
|
「この行は『ネットワーク障害』の意味に合うか」と聞き、返ってきた確率を閾値で切ります。
|
|
11
13
|
|
|
12
14
|
```sh
|
|
13
|
-
|
|
15
|
+
sys1grep -n -e "顧客が怒っている、または不満を持っている" tickets.txt
|
|
14
16
|
```
|
|
15
17
|
|
|
16
|
-
[](https://
|
|
18
|
+
[](https://sys1grep.js.org/)
|
|
17
19
|
|
|
18
|
-
<sub>▶ デモをクリックするか <a href="https://
|
|
20
|
+
<sub>▶ デモをクリックするか <a href="https://sys1grep.js.org/">sys1grep.js.org</a> を開くと、ランディングページで全編のデモが見られます。</sub>
|
|
19
21
|
|
|
20
|
-
- 依存ゼロ。
|
|
21
|
-
- 速い。30 行を 1 リクエストにまとめ、8
|
|
22
|
+
- 依存ゼロ。Node.js 20.16 以降と `fetch` だけで動きます。
|
|
23
|
+
- 速い。30 行を 1 リクエストにまとめ、8 本並列で投げます(ローカル URL では 1 本)。210 行のファイルが 1 秒弱で終わります。
|
|
22
24
|
- 意味は AND / OR / NOT で自由に組み合わせられます。
|
|
23
25
|
- **言語を問わない。** 意味も本文もどの言語でも構いません。日本語の意味でフランス語・ロシア語・中国語・韓国語の行が同じように見つかります。翻訳は挟まず、速度も費用も同じです。
|
|
24
26
|
|
|
@@ -30,7 +32,7 @@ Jev は文章を生成せず、typed な質問に確率だけを返すモデル
|
|
|
30
32
|
**英語**の意味で**日本語**の行が見つかります。どの行にも angry / frustrated の語はなく、うち 2 行は日本語です。
|
|
31
33
|
|
|
32
34
|
```sh
|
|
33
|
-
$
|
|
35
|
+
$ sys1grep -n -e "customer is angry or frustrated" tests/corpus.txt
|
|
34
36
|
14:ユーザー山田さんからの問い合わせ: 返金してほしい、商品が壊れていた
|
|
35
37
|
16:ユーザー佐藤さんからの問い合わせ: 注文した覚えのない請求が来ています。至急確認してください
|
|
36
38
|
18:I want my money back. The item arrived broken and customer service ignored me.
|
|
@@ -41,7 +43,7 @@ $ ./sys1grep -n -e "customer is angry or frustrated" tests/corpus.txt
|
|
|
41
43
|
**日本語**の意味で**英語**の行が、日本語の行と同じ確信度で見つかります。
|
|
42
44
|
|
|
43
45
|
```sh
|
|
44
|
-
$
|
|
46
|
+
$ sys1grep -n -p -e "返金の要求" tests/corpus.txt
|
|
45
47
|
14:ユーザー山田さんからの問い合わせ: 返金してほしい、商品が壊れていた [0.97]
|
|
46
48
|
18:I want my money back. The item arrived broken and customer service ignored me. [0.95]
|
|
47
49
|
```
|
|
@@ -50,7 +52,7 @@ $ ./sys1grep -n -p -e "返金の要求" tests/corpus.txt
|
|
|
50
52
|
日本語の意味 1 つで 6 言語の返金要求がすべて見つかり、ロシア語で書いた意味でも同じ結果になります。
|
|
51
53
|
|
|
52
54
|
```sh
|
|
53
|
-
$
|
|
55
|
+
$ sys1grep -n -p -e "顧客が返金を求めている" tests/multi.txt
|
|
54
56
|
1:Je veux être remboursé, le produit est arrivé cassé. [0.98]
|
|
55
57
|
3:Я требую вернуть деньги, товар не работает. [0.97]
|
|
56
58
|
5:Ich möchte mein Geld zurück, das Gerät ist defekt. [0.97]
|
|
@@ -58,7 +60,7 @@ $ ./sys1grep -n -p -e "顧客が返金を求めている" tests/multi.txt
|
|
|
58
60
|
9:我要求退款,商品坏了。 [0.97]
|
|
59
61
|
11:환불해 주세요. 제품이 고장났어요. [0.97]
|
|
60
62
|
|
|
61
|
-
$
|
|
63
|
+
$ sys1grep -n -p -e "клиент требует возврат денег" tests/multi.txt
|
|
62
64
|
1:Je veux être remboursé, le produit est arrivé cassé. [0.94]
|
|
63
65
|
3:Я требую вернуть деньги, товар не работает. [0.97]
|
|
64
66
|
5:Ich möchte mein Geld zurück, das Gerät ist defekt. [0.92]
|
|
@@ -78,10 +80,11 @@ sys1grep は話題の近さではなく、その行について **命題が成
|
|
|
78
80
|
答える(cross-encoder 型の)モデルなので、誰が何をしたか、否定、「求めている」のか「済んだ」のかで答えが変わります。
|
|
79
81
|
行の埋め込みは質問を見る前に固定されるので、測れるのは話題の近さまでです。
|
|
80
82
|
|
|
81
|
-
|
|
83
|
+
`tests/contrast.txt` の 1〜6 行目はどれも「返金の話」ですが、顧客が返金を求めているのは 2 行だけです
|
|
84
|
+
(`-t 0` は 8 行すべてを出します。下は 1〜6 行目の抜粋で、7・8 行目は後の AND の例で使います)。
|
|
82
85
|
|
|
83
86
|
```sh
|
|
84
|
-
$
|
|
87
|
+
$ sys1grep -n -p -t 0 -e "customer is asking for a refund" tests/contrast.txt
|
|
85
88
|
1:返金してほしい。商品が壊れていた [0.98]
|
|
86
89
|
2:返金処理が完了しましたのでご確認ください [0.10]
|
|
87
90
|
3:当社の返金ポリシーは購入後30日以内です [0.10]
|
|
@@ -95,20 +98,23 @@ $ ./sys1grep -n -p -t 0 -e "customer is asking for a refund" tests/contrast.txt
|
|
|
95
98
|
|
|
96
99
|
```sh
|
|
97
100
|
# 返金の話だが、顧客が求めているのではない → 完了報告、ポリシー、却下、日数
|
|
98
|
-
$
|
|
101
|
+
$ sys1grep -n -e "about a refund" -v "the customer is asking for a refund" tests/contrast.txt
|
|
99
102
|
2:返金処理が完了しましたのでご確認ください
|
|
100
103
|
3:当社の返金ポリシーは購入後30日以内です
|
|
101
104
|
4:The manager denied the refund request yesterday
|
|
102
105
|
6:Refunds are processed within 5 business days
|
|
103
106
|
|
|
104
107
|
# 怒っている、かつ、それが顧客であってスタッフではない
|
|
105
|
-
$
|
|
108
|
+
$ sys1grep -n -e "someone is angry" -a "the customer, not the staff, is the one acting" tests/contrast.txt
|
|
106
109
|
5:I demand a full refund immediately
|
|
107
110
|
8:顧客が怒って電話を切った
|
|
108
111
|
```
|
|
109
112
|
|
|
110
113
|
7 行目の `カスタマーサポート担当者が怒って電話を切った` は、2 つ目の意味で 0.05 となり除外されます。
|
|
111
|
-
|
|
114
|
+
8 行目とは 1 語(*カスタマーサポート担当者* と *顧客*)しか違わず、埋め込みなら 8 行目のすぐ隣に置く言い回しです。
|
|
115
|
+
(この 2 行のコサイン類似度の数値は再現できませんでした。この環境では埋め込みモデルを使えず、リポジトリにも
|
|
116
|
+
その履歴にも、再実行できる測定スクリプトがありません。論拠は言い回しだけです: 7 行目の埋め込みには、
|
|
117
|
+
「カスタマーサポート担当者」が文の主語を変えていることを見分ける手段がありません。)
|
|
112
118
|
|
|
113
119
|
実用上の帰結が 2 つあります。確率は較正されているので閾値 0.5 がどの質問にも使えます。コサイン類似度は
|
|
114
120
|
top-k か質問ごとの閾値調整が要ります。また索引を作らず、目の前のファイルにそのまま当てられます。
|
|
@@ -117,18 +123,24 @@ top-k か質問ごとの閾値調整が要ります。また索引を作らず
|
|
|
117
123
|
|
|
118
124
|
## 正規表現項
|
|
119
125
|
|
|
120
|
-
`-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
126
|
+
`-P '/pattern/flags'`(先頭と末尾が `/`、フラグは JavaScript のもの)は `-e` と同じく OR 項を始めますが、
|
|
127
|
+
こちらは常に正規表現で、ローカルで判定されリクエストは一切発生しません。`-a`/`-v '/pattern/flags'` は
|
|
128
|
+
その項に AND / AND NOT で重なり、こちらも形で正規表現か意味かが決まるのは変わりません。同じ AND 項の
|
|
129
|
+
絞り込みになり、これが当たった行だけがその項の意味を尋ねられるので、意味の前に安い正規表現を置くと、
|
|
130
|
+
費用も待ち時間も下がります。行が送られるのは、どれかの項の正規表現がすべて当たったときだけです
|
|
131
|
+
(正規表現の無い項はどの行にも当たる扱い)。そのため `-P '/re/' -a A -e B` では、`re` を含まない行も
|
|
132
|
+
送られ、`B` だけを尋ねられます。正規表現項だけの式は何も送りません。`--unit=sentence-by-jev` でも、
|
|
133
|
+
そのときは折り返しのつなぎ方を規則だけで決めます。`-P '!/RE/'` は使えません。正規表現の否定は
|
|
134
|
+
`-v '/RE/'` で行います。`-e` は値を正規表現として読むことがもうありません。`/RE/flags` の形の
|
|
135
|
+
値を渡すと `-P` を案内するエラーで拒否されます(例: `-e '/catch/' is no longer a regex: use -P '/catch/'`)。
|
|
136
|
+
`-Q` は変わっていません。もともと常に質問で正規表現にはならなかったので、`-e '/etc 以下のファイルを
|
|
137
|
+
変更している'`(閉じる `/` が無い)はそのまま意味として通り、拒否されません。`-e`/`-a`/`-v` に渡す、
|
|
138
|
+
本当に `/` で始まり `/` で終わる意味は、先頭にスペースを置けば正規表現と誤認されずに通ります
|
|
139
|
+
(`-e ' /cat/'` は拒否されず、`" /cat/"` という意味を送ります)。
|
|
128
140
|
|
|
129
141
|
```sh
|
|
130
|
-
$
|
|
131
|
-
$
|
|
142
|
+
$ sys1grep -P '/ERROR|FATAL/' app.log # リクエストなし
|
|
143
|
+
$ sys1grep -P '/timeout/i' -a '顧客に影響が出ている' app.log # timeout を含む行だけ Jev へ
|
|
132
144
|
```
|
|
133
145
|
|
|
134
146
|
正規表現の名前付き・番号付きグループは、同じ AND 項の他の意味に `$<name>`、`$1`-`$99`、`$&`、`$$` として
|
|
@@ -138,7 +150,7 @@ $ ./sys1grep -e '/timeout/i' -a '顧客に影響が出ている' app.log
|
|
|
138
150
|
文字として残るので、`$100 以上の請求` は影響を受けません。
|
|
139
151
|
|
|
140
152
|
```sh
|
|
141
|
-
$
|
|
153
|
+
$ sys1grep -P '/(?<date>\d{4}-\d\d-\d\d) (?<time>\d\d:\d\d)/' \
|
|
142
154
|
-a '$<time> が深夜(0時〜5時)であり、$<date> が週末である' app.log
|
|
143
155
|
# 2026-09-19 03:12 ... → 「03:12 が深夜(0時〜5時)であり、2026-09-19 が週末である」と尋ねる
|
|
144
156
|
```
|
|
@@ -150,7 +162,7 @@ $ ./sys1grep -e '/(?<date>\d{4}-\d\d-\d\d) (?<time>\d\d:\d\d)/' \
|
|
|
150
162
|
`-o` は一致をそれぞれ 1 行ずつ出します(`grep -o` と同じ)。意味には「一致した部分」がないので、意味だけで当たった行は行全体を出します。
|
|
151
163
|
|
|
152
164
|
```sh
|
|
153
|
-
$
|
|
165
|
+
$ sys1grep -o -n -P '/[A-Z]+-\d+/' -a 'チケットがまだ閉じていない' notes.txt # チケット番号を 1 行ずつ
|
|
154
166
|
```
|
|
155
167
|
|
|
156
168
|
## 送る量を減らす
|
|
@@ -168,10 +180,18 @@ Jev に送る行が増えるほど、費用も時間もかかります。いち
|
|
|
168
180
|
尋ねられます。空行は送りません。`-M`/`--max-columns`(既定 2000、`-z` なら 8000)を超える行は、
|
|
169
181
|
先頭からその文字数までだけを送ります。判定はそれでも行われ、超えた先にしか無い一致だけが見つかりません。
|
|
170
182
|
- **何回判定するか。** [`--dedup`](#テンプレートごとに-1-行だけ判定する---dedup) は、ID・数値・時刻・パスだけが
|
|
171
|
-
違う行をまとめて、テンプレートごとに 1
|
|
183
|
+
違う行をまとめて、テンプレートごとに 1 行だけ判定します。`auto`/`always`/`never`、当面は既定で off。
|
|
184
|
+
`--dedup=auto` が割に合うときはヒントを出します。
|
|
185
|
+
- **同じ問いを二度送らない。** `--cache` は Jev の答えを `~/.config/sys1grep/cache` に残します。キーは送るリクエスト
|
|
186
|
+
(モデル・行・問い)と送信先のホスト名で、同じ検索をもう一度すると何も送らず、料金もかかりません。検索した行が
|
|
187
|
+
残るので既定は off で、`SYS1GREP_CACHE=on`(環境変数か `~/.config/sys1grep/.env`。settings.json には書けません)
|
|
188
|
+
で既定を変えられます。`--cache=only` はキャッシュだけで答え、無いリクエストがあればそれを名指しして終了コード 2
|
|
189
|
+
で終わり、何も送りません(`-q` が先に一致を見つけていれば 0)。`--dry-run` はキャッシュ済みの
|
|
190
|
+
リクエスト数と送る数を出します。期限はありません。モデルはキーに含まれ、Jev の答えは実行ごとに ±0.05 ほど
|
|
191
|
+
揺れるので、残るのはその 1 回分です。`--cache=clear` で空にします。
|
|
172
192
|
- **払う前に確かめる。** `--dry-run` は何も送らず、この検索が使う設定、検索するファイル、ファイルごとの
|
|
173
|
-
|
|
174
|
-
見積もりが出ます(`~3178 input tokens, ~$0.000133`。誤差 1
|
|
193
|
+
送る行数、各リクエストとその質問を表示します。最後の行には入力トークン数と、料金の
|
|
194
|
+
見積もりが出ます(`~3178 input tokens, ~$0.000133`。誤差 1 割程度。誰の価格かは「他のエンドポイント」を参照)。`-i` は同じ集計を端末に出し、
|
|
175
195
|
`y` と答えたときだけ送ります。
|
|
176
196
|
リクエストの本体を送る前に、まず対象のサイズ(`--max-filesize`、既定 10M)を計測し、超えるものは
|
|
177
197
|
rg の `--max-filesize` と同じく無条件に飛ばして stderr に名前を出します(`-y` は効きません)。`.gz` は
|
|
@@ -183,19 +203,23 @@ Jev に送る行が増えるほど、費用も時間もかかります。いち
|
|
|
183
203
|
送る予定のトークンの値段(`--max-cost`、既定 1 USD)は別に見積もり、超えていれば端末で続けるか聞きます。
|
|
184
204
|
`-y` は聞かずに yes と答え、端末が無く超えていれば終了コード 2 です(`-q` でも同じで、スクリプトからは
|
|
185
205
|
`-y` を渡します)。
|
|
206
|
+
`-r` と `git sys1grep` では、regex で絞られない term が 10,000 行を超えて送ろうとすると、同じ集計と
|
|
207
|
+
その term を stderr に 1 行出します(`sys1grep: sending 214,913 of 231,502 lines from 1,247 files
|
|
208
|
+
(~9.1M input tokens, ~$0.38); the term "…" has no regex to narrow it. Add -a '/RE/' to it, …`)。
|
|
209
|
+
検索はそのまま続きます。`-q` ではこの行は出ず、`-y` では消えません。
|
|
186
210
|
|
|
187
211
|
```sh
|
|
188
|
-
$ sys1grep --dry-run -r --include='*.log' --changed-within=today -
|
|
212
|
+
$ sys1grep --dry-run -r --include='*.log' --changed-within=today -P '/ERROR|FATAL/' -a '顧客に影響が出ている' logs/
|
|
189
213
|
```
|
|
190
214
|
|
|
191
215
|
`--verbose`(や `--dry-run`)は、コマンドラインで指定しなかった設定が*どこから*来たか
|
|
192
|
-
(`SYS1GREP_OPTS`、環境変数、`~/.config/sys1grep
|
|
216
|
+
(`SYS1GREP_OPTS`、環境変数、`~/.config/sys1grep/settings.json` か `.env`、プリセットの既定値のいずれか)も表示するので、
|
|
193
217
|
想定と違う結果をその設定まで辿れます。キーの値は表示せず、どのオプションや変数が渡したかだけを表示します。
|
|
194
218
|
|
|
195
219
|
```sh
|
|
196
220
|
$ SYS1GREP_OPTS='--level strict' sys1grep --verbose -e "APIキーがファイルから読まれている" .
|
|
197
221
|
sys1grep: endpoint api.typesafe.ai/v1/systemone (default), model jev-latest (default)
|
|
198
|
-
sys1grep: key:
|
|
222
|
+
sys1grep: key: key (~/.config/sys1grep/settings.json)
|
|
199
223
|
sys1grep: SYS1GREP_OPTS: --level strict
|
|
200
224
|
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
225
|
sys1grep: file ./a.py: 120 lines, 120 to send
|
|
@@ -205,7 +229,7 @@ sys1grep: file ./a.py: 120 lines, 120 to send
|
|
|
205
229
|
## インストール
|
|
206
230
|
|
|
207
231
|
使い方は 2 通りあります。コマンドラインツールとして使う(この節)か、Claude Code のスキルとして使う
|
|
208
|
-
(後述の [Claude Code から使う](#claude-code-から使う))か。スキルは `npx
|
|
232
|
+
(後述の [Claude Code から使う](#claude-code-から使う))か。スキルは `npx` で sys1grep を動かすので、
|
|
209
233
|
Claude Code からしか使わないならここでのインストールは不要で、API キーの設定だけで済みます。
|
|
210
234
|
|
|
211
235
|
Node.js 20.16 以降が必要です。ほかの依存はありません。
|
|
@@ -225,14 +249,33 @@ npx @uehaj/sys1grep -n -e "顧客が怒っている、または不満を持っ
|
|
|
225
249
|
|
|
226
250
|
```sh
|
|
227
251
|
export SYS1GREP_API_KEY=your-key # 環境変数
|
|
228
|
-
|
|
252
|
+
# ユーザー単位: ~/.config/sys1grep/settings.json (先に mkdir -p。権限は 0600 に)
|
|
253
|
+
(umask 077; echo '{"key": "your-key"}' > ~/.config/sys1grep/settings.json)
|
|
229
254
|
```
|
|
230
255
|
|
|
231
|
-
環境変数が優先で、足りない分は `~/.config/sys1grep
|
|
256
|
+
環境変数が優先で、足りない分は `~/.config/sys1grep/settings.json` から補います。項目は環境変数 1 つに 1 つです。
|
|
257
|
+
|
|
258
|
+
| 項目 | 環境変数 |
|
|
259
|
+
|---|---|
|
|
260
|
+
| `url` | `SYS1GREP_URL` |
|
|
261
|
+
| `key` | `SYS1GREP_API_KEY`(と `TYPESAFE_API_KEY`) |
|
|
262
|
+
| `model` | `SYS1GREP_MODEL` |
|
|
263
|
+
| `opts` | `SYS1GREP_OPTS`。配列で書く: `["--level", "strict", "-n"]` |
|
|
264
|
+
| `summarizer` | `SYS1GREP_SUMMARIZER` |
|
|
265
|
+
| `summarizerModel` | `SYS1GREP_SUMMARIZER_MODEL` |
|
|
266
|
+
| `summarizerKey` | `SYS1GREP_SUMMARIZER_API_KEY` |
|
|
267
|
+
| `lang` | `SYS1GREP_LANG`(`en` か `ja`: `--help` の言語、および `--serve` のページの既定言語) |
|
|
268
|
+
|
|
269
|
+
どの項目も省略できます。型の違う値、JSON でないファイルはエラーです。知らない項目は警告(stderr に項目名を出す)
|
|
270
|
+
だけで無視し、処理は続けます。新しいバージョンが項目を追加しても、古い sys1grep がそのまま動くようにするためです。
|
|
271
|
+
キーを含むファイルを他人が読める権限にしていると警告します。`~/.config/sys1grep/.env`(`名前=値` の行)も引き続き読みますが、settings.json より
|
|
272
|
+
下で、同じ変数なら settings.json の値が勝ちます。カレントディレクトリの `.env` は読みません。
|
|
232
273
|
clone したばかりのリポジトリのものかもしれず、`SYS1GREP_URL` を通じてキーを別のサーバへ送らせ得るからです。
|
|
233
274
|
プロジェクト単位の設定は、自分で読み込ませてください: `node --env-file=.env "$(command -v sys1grep)" ...`。
|
|
234
275
|
`SYS1GREP_API_KEY` が無ければ `TYPESAFE_API_KEY` も使えます。
|
|
235
276
|
|
|
277
|
+
この settings.json は `--serve` の **Settings** パネルからも編集できます([検索ページ](#検索ページ---serve)を参照)。
|
|
278
|
+
|
|
236
279
|
### 既定のオプション
|
|
237
280
|
|
|
238
281
|
`SYS1GREP_OPTS` に書いたオプションは毎回の呼び出しに付きます。読み方は上の設定と同じです。空白で区切って
|
|
@@ -244,15 +287,18 @@ sys1grep -e "決済の失敗" app.log # strict、8 並列、
|
|
|
244
287
|
sys1grep --level loose --no-n -e "決済の失敗" app.log
|
|
245
288
|
```
|
|
246
289
|
|
|
290
|
+
同じ既定値は settings.json に `"opts": ["--level", "strict", "-j", "8", "-n"]` とも書けます。1 要素が 1 引数なので、
|
|
291
|
+
値に空白を含められます。`SYS1GREP_OPTS` が設定されていれば、足し合わせずにそちらで置き換えます。
|
|
292
|
+
|
|
247
293
|
sys1grep を呼ぶスクリプトもこの既定値を拾います(grep が `GREP_OPTIONS` を廃止した理由です)。スクリプトからは
|
|
248
|
-
`SYS1GREP_OPTS= sys1grep ...`
|
|
294
|
+
`SYS1GREP_OPTS= sys1grep ...` と空にして呼んでください。空の変数は settings.json の `opts` も外します。
|
|
249
295
|
|
|
250
296
|
### 他のエンドポイント
|
|
251
297
|
|
|
252
298
|
API の設定は `SYS1GREP_API_KEY`(または `TYPESAFE_API_KEY`)、`SYS1GREP_URL`、`SYS1GREP_MODEL` の 3 つだけです。
|
|
253
299
|
TypeSafe の `POST /v1/systemone` と同じ形で話すエンドポイントなら使えます。キーは `SYS1GREP_URL` の先へそのまま
|
|
254
300
|
送られるので、2 つは組にして設定してください。コマンドラインの `--sys1-model=ID`、`--sys1-url=URL`、`--sys1-api-key=KEY` は
|
|
255
|
-
この 3 つより優先します。コマンドラインのキーは `ps` やシェル履歴に残るので、キーはなるべく `~/.config/sys1grep
|
|
301
|
+
この 3 つより優先します。コマンドラインのキーは `ps` やシェル履歴に残るので、キーはなるべく `~/.config/sys1grep/settings.json` に書いてください。
|
|
256
302
|
|
|
257
303
|
```sh
|
|
258
304
|
# OpenRouter
|
|
@@ -263,7 +309,30 @@ SYS1GREP_URL=https://ai-gateway.vercel.sh/typesafe/v1/systemone SYS1GREP_MODEL=t
|
|
|
263
309
|
SYS1GREP_URL=http://localhost:8000/v1/systemone sys1grep -e ...
|
|
264
310
|
```
|
|
265
311
|
|
|
266
|
-
|
|
312
|
+
sys1grep が出す価格(`--dry-run`、大量送信の警告、`--max-cost` の質問、集計行)は、エンドポイントが返した費用(`usage.cost`)か、
|
|
313
|
+
返さなければ `~` 付きの推定です。推定の 100 万入力トークンあたりの価格は、ローカルの URL なら 0(無料。`localhost`、`127.0.0.1`、`[::1]`。
|
|
314
|
+
書いたとおりのホスト名で判定し、DNS は引かず、`SYS1GREP_URL` か `--sys1-url` で自分で指定した URL のときだけ)、下の表のモデルなら
|
|
315
|
+
そのモデルの価格(`jev-latest` 0.042、`clef` 0.24、`clef-flash` 0.09、USD)、それ以外のモデルは Jev と同じ 0.042 です。
|
|
316
|
+
別の URL のときは、誰の価格かを添えます(`at TypeSafe's list price`、`at clef's list price`、`(local URL, free)`)。
|
|
317
|
+
`--max-cost` も同じ価格を使うので、ローカルの URL では何も聞きません。
|
|
318
|
+
|
|
319
|
+
**ローカルの判定モデル。** 同じ `POST /v1/systemone` を話すモデルは、キーもネットワークも無しで Jev の代わりに使えます。
|
|
320
|
+
ただし、これまでに試した 2 つは、どちらも Jev より精度が低いので、`-t` を上げ、`npm run judge` で調整し、偽陽性が増えることを前提にしてください。
|
|
321
|
+
どちらも 1 度に 1 リクエストしか受けないので、ローカルの URL(`localhost`、`127.0.0.1`、`[::1]`)では `-j` の既定が 1 になります。
|
|
322
|
+
指定した `-j`(コマンドライン、`SYS1GREP_OPTS`、settings.json のどれでも)はそちらが優先です。
|
|
323
|
+
|
|
324
|
+
- [Jeff](https://github.com/firelex/jeff)(`jeff-serve`、0.8B、ベース v1.2、ゼロショット、MLX):
|
|
325
|
+
`--sys1-url=http://127.0.0.1:8765/v1/systemone --sys1-model=jeff-latest` で動きます。2 つ目のリクエストにはすぐ
|
|
326
|
+
`529 "The model is busy"` を返し、`-j 8` では再試行が尽きます。`npm run judge`(51 行、10 ケース、`-j 1`)では、
|
|
327
|
+
既定のしきい値で適合率 0.68、再現率 0.61、F1 0.64、`-t 0.75 -T 0.85` で F1 0.77 でした。別の日の Jev の実行は F1 0.96 で、
|
|
328
|
+
置き換えにはなりません。v1.2 はコミュニティプレビューで、アダプタは版をまたいで引き継げません。
|
|
329
|
+
- [strands-decider](https://github.com/strands-labs/strands-decider)(`strands-decider serve`、2B、M4 の `mps`):
|
|
330
|
+
`SYS1GREP_URL=http://127.0.0.1:8000/v1/systemone` だけで、キーなしでそのまま動きます(30 行が 2.7 秒)。2 つのリクエストが
|
|
331
|
+
同時に届くとサーバーが落ちます(exit 134、Metal のアサーション)。同じ `npm run judge` の組で、既定のしきい値で適合率 0.64、
|
|
332
|
+
再現率 0.94、F1 0.76、`-t 0.6 -T 0.45` で F1 0.81 でした。
|
|
333
|
+
- sys1grep ではまだ試していないもの: Cloudflare の Clef。
|
|
334
|
+
|
|
335
|
+
1 リクエストの質問数は、どのバックエンドでも 64 までです。
|
|
267
336
|
|
|
268
337
|
ソースから使うなら `git clone https://github.com/uehaj/sys1grep.git && cd sys1grep && npm install -g .`、
|
|
269
338
|
またはそのまま `node sys1grep.mjs ...` で動きます。
|
|
@@ -273,16 +342,18 @@ SYS1GREP_URL=http://localhost:8000/v1/systemone sys1grep -e ...
|
|
|
273
342
|
例はすべて [`tests/corpus.txt`](tests/corpus.txt) に対するものです。サーバログ、日英の問い合わせ、
|
|
274
343
|
ソースコード、SQL、雑談が混ざった 51 行のファイルです。
|
|
275
344
|
|
|
345
|
+
仕事別(障害対応、問い合わせの仕分け、リリースノートなど)に実データで試した例は [docs/use-cases.md](docs/use-cases.md)(英語)にあります。
|
|
346
|
+
|
|
276
347
|
### 概念で探す。言語は問わない
|
|
277
348
|
|
|
278
349
|
```sh
|
|
279
|
-
$
|
|
350
|
+
$ sys1grep -n -e "customer is angry or frustrated" tests/corpus.txt
|
|
280
351
|
14:ユーザー山田さんからの問い合わせ: 返金してほしい、商品が壊れていた
|
|
281
352
|
16:ユーザー佐藤さんからの問い合わせ: 注文した覚えのない請求が来ています。至急確認してください
|
|
282
353
|
18:I want my money back. The item arrived broken and customer service ignored me.
|
|
283
354
|
21:Your product ruined my weekend. Never buying from you again.
|
|
284
355
|
23:This is the third time I'm writing. Nobody has replied to my previous emails.
|
|
285
|
-
5 of 51 lines matched; 51 sent to Jev in 2 requests, 3225 input tokens
|
|
356
|
+
5 of 51 lines matched; 51 sent to Jev in 2 requests, 3225 input tokens, ~$0.000135
|
|
286
357
|
```
|
|
287
358
|
|
|
288
359
|
どの行にも「angry」「frustrated」という語はありません。英語の意味で日本語の行も拾えています。
|
|
@@ -293,8 +364,8 @@ $ ./sys1grep -n -e "customer is angry or frustrated" tests/corpus.txt
|
|
|
293
364
|
そのため、問いは尋ねるときのままの疑問文で書ける:
|
|
294
365
|
|
|
295
366
|
```sh
|
|
296
|
-
$ echo "ジョブは失敗した" |
|
|
297
|
-
$ echo "ジョブは失敗した" |
|
|
367
|
+
$ echo "ジョブは失敗した" | sys1grep -e "ジョブは成功しましたか?"
|
|
368
|
+
$ echo "ジョブは失敗した" | sys1grep -Q "ジョブは成功しましたか?"
|
|
298
369
|
ジョブは失敗した
|
|
299
370
|
```
|
|
300
371
|
|
|
@@ -304,7 +375,7 @@ $ echo "ジョブは失敗した" | ./sys1grep -Q "ジョブは成功しまし
|
|
|
304
375
|
なる:
|
|
305
376
|
|
|
306
377
|
```sh
|
|
307
|
-
$
|
|
378
|
+
$ sys1grep -n -Q "whether the server is down" tests/intent.txt
|
|
308
379
|
5:The server is down.
|
|
309
380
|
6:The server is healthy and responding normally.
|
|
310
381
|
2 of 17 lines matched; 17 sent to Jev in 1 request, 1087 input tokens, ~$0.000046
|
|
@@ -321,12 +392,12 @@ down?` は尋ねているだけで答えていないので一致しない。`-Q
|
|
|
321
392
|
### OR で 2 つの意味。`-p` で確率も見る
|
|
322
393
|
|
|
323
394
|
```sh
|
|
324
|
-
$
|
|
395
|
+
$ sys1grep -n -p -e "返金の要求" -e "配送先の変更依頼" tests/corpus.txt
|
|
325
396
|
14:ユーザー山田さんからの問い合わせ: 返金してほしい、商品が壊れていた [0.97 0.02]
|
|
326
397
|
17:ユーザー高橋さんからの問い合わせ: 配送先の住所を変更したいのですが [0.01 0.96]
|
|
327
398
|
18:I want my money back. The item arrived broken and customer service ignored me. [0.96 0.01]
|
|
328
399
|
22:Can I change the delivery address for order #8821? [0.02 0.96]
|
|
329
|
-
4 of 51 lines matched; 51 sent to Jev in 2 requests, 4602 input tokens
|
|
400
|
+
4 of 51 lines matched; 51 sent to Jev in 2 requests, 4602 input tokens, ~$0.000193
|
|
330
401
|
```
|
|
331
402
|
|
|
332
403
|
末尾の括弧が、指定した順に各意味の確率です。閾値を決めるときの目安になります。
|
|
@@ -339,7 +410,7 @@ $ ./sys1grep -n -p -e "返金の要求" -e "配送先の変更依頼" tests/corp
|
|
|
339
410
|
### AND NOT。ネットワーク障害のうちリトライ中のものを除く
|
|
340
411
|
|
|
341
412
|
```sh
|
|
342
|
-
$
|
|
413
|
+
$ sys1grep -n -e "ネットワークやリモート接続の障害" -v "a retry is happening or was attempted" tests/corpus.txt
|
|
343
414
|
4:2026-09-19 08:02:30 ERROR connection reset by peer while calling payment-gateway
|
|
344
415
|
6:2026-09-19 08:02:35 ERROR timeout after 5000ms waiting for payment-gateway
|
|
345
416
|
9:2026-09-19 08:10:44 ERROR DNS lookup failed for api.example.com
|
|
@@ -347,7 +418,7 @@ $ ./sys1grep -n -e "ネットワークやリモート接続の障害" -v "a retr
|
|
|
347
418
|
13:network unreachable: no route to host 10.0.0.5
|
|
348
419
|
30:except ConnectionError as e:
|
|
349
420
|
31: logger.error("upstream unreachable: %s", e)
|
|
350
|
-
7 of 51 lines matched; 51 sent to Jev in 2 requests, 5112 input tokens
|
|
421
|
+
7 of 51 lines matched; 51 sent to Jev in 2 requests, 5112 input tokens, ~$0.000215
|
|
351
422
|
```
|
|
352
423
|
|
|
353
424
|
5 行目の `retrying payment-gateway request (attempt 2/3)` はネットワーク障害ですが、`-v` で落ちています。
|
|
@@ -355,11 +426,11 @@ $ ./sys1grep -n -e "ネットワークやリモート接続の障害" -v "a retr
|
|
|
355
426
|
### 混合。(金融 AND 悪いニュース) OR 天気
|
|
356
427
|
|
|
357
428
|
```sh
|
|
358
|
-
$
|
|
429
|
+
$ sys1grep -n -e "about economy, finance or markets" -a "the news is negative or a decline" -e "about weather" tests/corpus.txt
|
|
359
430
|
36:今日の天気は晴れ、最高気温は28度です
|
|
360
431
|
43:Stock prices fell 3% after the earnings report missed expectations.
|
|
361
432
|
48:明日は雨の予報なので傘を持っていきます
|
|
362
|
-
3 of 51 lines matched; 51 sent to Jev in 2 requests, 5673 input tokens
|
|
433
|
+
3 of 51 lines matched; 51 sent to Jev in 2 requests, 5673 input tokens, ~$0.000238
|
|
363
434
|
```
|
|
364
435
|
|
|
365
436
|
`The central bank raised interest rates` は金融の話ですが下落ではないので外れています。
|
|
@@ -367,11 +438,11 @@ $ ./sys1grep -n -e "about economy, finance or markets" -a "the news is negative
|
|
|
367
438
|
### 厳しさのプリセット
|
|
368
439
|
|
|
369
440
|
```sh
|
|
370
|
-
$
|
|
441
|
+
$ sys1grep --level strict -n -e "a security risk or dangerous destructive operation" tests/corpus.txt
|
|
371
442
|
33:DROP TABLE sessions;
|
|
372
443
|
49:API keys must never be committed to the repository.
|
|
373
444
|
|
|
374
|
-
$
|
|
445
|
+
$ sys1grep --level loose -n -e "a security risk or dangerous destructive operation" tests/corpus.txt
|
|
375
446
|
11:2026-09-19 09:00:00 ERROR SSL handshake failed: certificate expired
|
|
376
447
|
16:ユーザー佐藤さんからの問い合わせ: 注文した覚えのない請求が来ています。至急確認してください
|
|
377
448
|
33:DROP TABLE sessions;
|
|
@@ -383,11 +454,11 @@ $ ./sys1grep --level loose -n -e "a security risk or dangerous destructive opera
|
|
|
383
454
|
### ディレクトリを再帰検索、ファイル名だけ表示
|
|
384
455
|
|
|
385
456
|
```sh
|
|
386
|
-
$
|
|
457
|
+
$ sys1grep -r -n -e "customer is asking for a refund" tests/tickets/
|
|
387
458
|
tests/tickets/a.txt:7:Ticket #16: I want a refund, the item was broken.
|
|
388
459
|
tests/tickets/sub/b.txt:1:The customer wants a refund for the broken lamp.
|
|
389
460
|
|
|
390
|
-
$
|
|
461
|
+
$ sys1grep -rl -e "customer is asking for a refund" tests/tickets/
|
|
391
462
|
tests/tickets/a.txt
|
|
392
463
|
tests/tickets/sub/b.txt
|
|
393
464
|
```
|
|
@@ -397,8 +468,8 @@ tests/tickets/sub/b.txt
|
|
|
397
468
|
秘密情報になりがちなファイル(`.env*`、`.netrc`、`.npmrc`、`.pypirc`、`.pgpass`、`.git-credentials`、`*.pem`、
|
|
398
469
|
`*.key`、`*.p12`、`*.pfx`、`*.jks`、`*.keystore`、`id_rsa*` など。大文字小文字は区別しない)、
|
|
399
470
|
生成されたファイル(`*.map`、`*.min.js`、`*.min.css`、`package-lock.json`、`yarn.lock`、`pnpm-lock.yaml`、
|
|
400
|
-
`Cargo.lock`、`poetry.lock`、`composer.lock`、`Gemfile.lock`、`go.sum
|
|
401
|
-
**検索対象の行はすべて TypeSafe の API
|
|
471
|
+
`Cargo.lock`、`poetry.lock`、`composer.lock`、`Gemfile.lock`、`go.sum`)、シンボリックリンク、`~/.config/sys1grep/settings.json` 自身を飛ばします。
|
|
472
|
+
**検索対象の行はすべて TypeSafe の API(または `SYS1GREP_URL` の指す先)に送られる**ので、スキャンするつもりのディレクトリだけを指定してください。
|
|
402
473
|
git リポジトリの中では、git が無視するもの(`.gitignore`、`.git/info/exclude`、グローバルの除外ファイル)も `-r` で
|
|
403
474
|
飛ばすので、ビルド成果物や手元だけのファイルは送られません。追跡中のファイルは、無視パターンに当たっても検索します。
|
|
404
475
|
コマンドラインで明示したファイルは、除外リストに該当しても、git が無視していても検索します。git が無視している
|
|
@@ -420,7 +491,7 @@ $ sys1grep -r -e 'Python でリトライ処理を書いている箇所' .
|
|
|
420
491
|
sys1grep: scope: *.py *.pyi *.pyw (from "Python files: 0.94")
|
|
421
492
|
sys1grep: scope: 12 of 340 files
|
|
422
493
|
$ sys1grep -r -e '昨日変えた箇所で認証を扱っている' src/
|
|
423
|
-
sys1grep: scope:
|
|
494
|
+
sys1grep: scope: changed since 2026-09-25 00:00 (git commits; the mtime for files git does not have committed) (from "what was changed yesterday: 0.91")
|
|
424
495
|
sys1grep: scope: 3 of 120 files
|
|
425
496
|
```
|
|
426
497
|
|
|
@@ -489,12 +560,25 @@ v0.3.1:src/job.py:40: retry(job)
|
|
|
489
560
|
**古い `<tree>` には、後で削除された秘密情報が普通のファイルとして残っていることがあります**。スキップ対象は
|
|
490
561
|
名前で判定するだけで、変更履歴では判定しません。
|
|
491
562
|
|
|
563
|
+
### ファイルではなくコミットを探す (`-g`)
|
|
564
|
+
|
|
565
|
+
`-g`(`--gitlog`)はファイルではなく `git log` のコミットを、1 コミット 1 レコード(ハッシュ、日付、件名、本文)で探します:
|
|
566
|
+
|
|
567
|
+
```sh
|
|
568
|
+
$ sys1grep -g -e '今日、.mjs のファイルに行った性能向上の修正'
|
|
569
|
+
```
|
|
570
|
+
|
|
571
|
+
項が 1 つなら、意味からの絞り込みを `git log` 自身の引数にして stderr に出します: 時期は `--since-as-filter`
|
|
572
|
+
(2.37 より前の git では `--since`。昨日・先週・先月のように終わりがある時期は `--until` も)、言語は pathspec、
|
|
573
|
+
作者と「自分」は `--author`、「このブランチ」と「未プッシュ」は範囲です。FILE は pathspec です。
|
|
574
|
+
コミットは `-z` と同じくレコードなので、`-M` の既定は 8000 です。`-r`・`git sys1grep` とは併用できません。
|
|
575
|
+
|
|
492
576
|
### 「〜でない」行を全部
|
|
493
577
|
|
|
494
578
|
```sh
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
cat app.log |
|
|
579
|
+
sys1grep -v "a timestamped server log line" mixed.txt # grep -v 相当
|
|
580
|
+
sys1grep -e "source code or SQL" -v "SQL" src.txt # コードだが SQL ではない
|
|
581
|
+
cat app.log | sys1grep -e "デプロイが失敗した、またはロールバックされた"
|
|
498
582
|
```
|
|
499
583
|
|
|
500
584
|
### 複数行にまたがるレコード (`-z`)
|
|
@@ -507,9 +591,9 @@ cat app.log | ./sys1grep -e "デプロイが失敗した、またはロールバ
|
|
|
507
591
|
その中のどの 1 行についてでもありません。
|
|
508
592
|
|
|
509
593
|
```sh
|
|
510
|
-
$ git log -z --format='%h %s %b' |
|
|
511
|
-
7:21120e9 Revert "feat: ship the /
|
|
512
|
-
8:51ae333 feat: ship the /
|
|
594
|
+
$ git log -z --format='%h %s %b' | sys1grep -z -n -e "ユーザーに見える振る舞いを変えている" -v "ドキュメントだけの変更"
|
|
595
|
+
7:21120e9 Revert "feat: ship the /semgrep Claude Code skill" ...
|
|
596
|
+
8:51ae333 feat: ship the /semgrep Claude Code skill
|
|
513
597
|
```
|
|
514
598
|
|
|
515
599
|
一致したレコードも NUL 終端で出力されるので、読むときは `tr '\0' '\n'` に通してください。
|
|
@@ -524,7 +608,7 @@ $ git log -z --format='%h %s %b' | ./sys1grep -z -n -e "ユーザーに見える
|
|
|
524
608
|
段落が入っています。
|
|
525
609
|
|
|
526
610
|
```sh
|
|
527
|
-
$
|
|
611
|
+
$ sys1grep -n --unit=sentence-by-jev -e "the author admits they made a mistake" tests/prose.txt
|
|
528
612
|
1:I should have checked the input
|
|
529
613
|
2:before shipping, and that was my
|
|
530
614
|
3:mistake. Next time I will add a test
|
|
@@ -543,7 +627,7 @@ $ ./sys1grep -n --unit=sentence-by-jev -e "the author admits they made a mistake
|
|
|
543
627
|
中国語・タイ語・ラオ語・クメール語・ミャンマー語・チベット語も同様です。
|
|
544
628
|
|
|
545
629
|
```sh
|
|
546
|
-
$
|
|
630
|
+
$ 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
|
|
547
631
|
1:I should have checked the input before shipping, and that was my mistake.
|
|
548
632
|
8:先週買った掃除機が初日から動かないので返金してほしいです。
|
|
549
633
|
```
|
|
@@ -578,7 +662,7 @@ Jev は長い行の中からでも当たる文を自分で見つけるので、
|
|
|
578
662
|
そうと分かりません。`--unit=function` は関数ごとに判定し、当たった関数の行を出します。`-n` はファイルの行番号です。
|
|
579
663
|
|
|
580
664
|
```sh
|
|
581
|
-
$
|
|
665
|
+
$ sys1grep -H -n --unit=function -e "ネットワーク障害で再試行している" src/net.js
|
|
582
666
|
src/net.js:3:async function fetchWithRetry(url) {
|
|
583
667
|
src/net.js:4: for (let i = 0; i < 5; i++) {
|
|
584
668
|
src/net.js:5: try { return await fetch(url); }
|
|
@@ -602,14 +686,75 @@ $ git config diff.golang.xfuncname '^(func|type)[[:space:]]'
|
|
|
602
686
|
`-M` の既定は `-z` と同じ 8000 文字で、それより長い関数は先頭 8000 文字で判定します。`--chunk` は関数の数、
|
|
603
687
|
`-A`/`-B`/`-C` と `-c` は文の単位と同じく行の数を数えます。`-z`・`-g`・`-o` とは併用できません。
|
|
604
688
|
|
|
689
|
+
### 関数から関数へたどる (`--step-to`)
|
|
690
|
+
|
|
691
|
+
コードについての問いは、2 段になることがよくあります。`--summarize` はどこで行をツールに渡しているか。そして、
|
|
692
|
+
それが失敗したらどうなるか。2 段目の「それ」は 1 段目で見つけたものです。多段階マッチングは両方を 1 回で
|
|
693
|
+
答えます。`--step-to` の前の式で開始点を探し、そこから呼び出しをたどり、たどり着いた関数のうち `--step-to` の
|
|
694
|
+
後ろの式に当たるものを選びます。2 つの式は Jev が判定します。どの呼び出しをたどるかはスコアで決めません。
|
|
695
|
+
|
|
696
|
+
```sh
|
|
697
|
+
$ sys1grep -e "--summarize が行をツールに渡している" --step-to "ツールの起動や応答が失敗したときの処理" sys1grep.mjs
|
|
698
|
+
```
|
|
699
|
+
|
|
700
|
+
意味は、最初の例のようにダッシュで始めてもかまいません。`-e`・`-a`・`-v`・`-Q` のどの検索でも同じです。`-` で始まる値は、オプションでなければ意味として扱います(オプションには空白が入りません)。
|
|
701
|
+
|
|
702
|
+
パスは木の形で出ます。ホップ数 (開始点からの呼び出しの数)、`file:line`、関数名の順で、終点の後ろは `:`、途中の
|
|
703
|
+
関数の後ろは `-` です (grep が一致行と文脈行を分けるのと同じ)。開始と終点の式が正規表現だけなら何も送らないので、
|
|
704
|
+
無料で到達可能性を調べられます。Python 3.6 の `json` で、`load` からたどり着き `raise` を含む関数:
|
|
705
|
+
|
|
706
|
+
```
|
|
707
|
+
$ cd /usr/lib64/python3.6/json && sys1grep -P '/^\s*def load\b/' --step-to -P '/\braise\b/' *.py
|
|
708
|
+
sys1grep: walk: 1 at hop 0, 1 at hop 1, 3 at hop 2, 1 at hop 3, 1 at hop 4, 1 at hop 5; stopped: no new unit
|
|
709
|
+
0 __init__.py-274-load
|
|
710
|
+
1 __init__.py:302:loads
|
|
711
|
+
2 decoder.py:334:decode
|
|
712
|
+
3 decoder.py:345:raw_decode
|
|
713
|
+
4 scanner.py-65-scan_once
|
|
714
|
+
5 scanner.py:28:_scan_once
|
|
715
|
+
```
|
|
716
|
+
|
|
717
|
+
- **式。** `--step-to` の前の式が開始の式で、普通の検索と同じです。後ろの `-e` / `-P` / `-a` / `-v` / `-Q` はすべて終点の式です。
|
|
718
|
+
`--step-to 意味` は `--step-to -e 意味` と同じで、`--step-to '/RE/'` は形から正規表現と判定されて
|
|
719
|
+
`--step-to -P '/RE/'` と同じになります。ファイル名はその後に置きます。正規表現の終点は、上の例のように
|
|
720
|
+
`-P` を明示する書き方のほうが分かりやすいので、ドキュメントではそちらを使います。step はホップではなく
|
|
721
|
+
検索の段です。間に何ホップあっても、`--step-to` 1 つで 2 段です。
|
|
722
|
+
- **辺。** `--edges` が無ければ単位は関数 (`--unit=function`) で、辺は呼び出しです。関数本体 (コメント・docstring・
|
|
723
|
+
文字列は除く) の `名前(` が、その名前の関数すべてにつながります。名前は関数名の行 (デコレータの下の `def`) から
|
|
724
|
+
取ります。`--edges=FILE` は別の関係をたどります。1 行 1 本で `FROM_FILE:LINE<TAB>FROM_NAME<TAB>TO_FILE:LINE<TAB>TO_NAME`、
|
|
725
|
+
行はそれを含む単位を指します。`--step-to` の代わりに `--step-reverse-to` を使うと辺を逆にたどります (呼ばれる側から呼ぶ側へ)。
|
|
726
|
+
引数は同じで、`--hops`・`--edges` と併用でき、`--step-to` とは併用できません。
|
|
727
|
+
- **歩き方。** すべての開始点から同時に幅優先でたどります。関数のホップ数は、どれかの開始点からの最短距離です。
|
|
728
|
+
各関数には 1 度しか着かないので、循環しても止まります。`--hops=N`・`--hops=M..N`・`--hops=M..` で終点のホップ数を
|
|
729
|
+
選びます (既定 `0..`。終点の式に当たる開始点はホップ 0 の終点)。終点に着かないパスは出しません。stderr には
|
|
730
|
+
ホップごとにたどり着いた関数の数と、止まった理由 (新しいユニットが無い、または `--hops`) を出します。
|
|
731
|
+
- **費用。** Jev はまずすべての関数を開始の式と 1 回のバッチで照らし、次に `--hops` の範囲でたどり着いた関数を
|
|
732
|
+
終点の式ともう 1 回のバッチで照らします。`--max-cost` は 2 回目の前にも、1 回目の分を含めて確かめます。
|
|
733
|
+
`--dry-run` はどの問いにも 0 と答えるので、開始の式が当たりうる関数すべてから歩き、その上限を見せます。
|
|
734
|
+
- **併用できない**のは `-z`・`-g`・`-o`・`-c`・`-l`・`-A`/`-B`/`-C`・`--rank`・`--summarize`・`--dedup` です。
|
|
735
|
+
`-p` は終点の式と照らした関数にその確率を足し、`-q` は何も出さず、終点があれば終了コード 0 にします。
|
|
736
|
+
|
|
605
737
|
### テンプレートごとに 1 行だけ判定する (`--dedup`)
|
|
606
738
|
|
|
607
739
|
費用は送るテキストの量に比例します。機械が吐くログの大半は、ID や数値だけが違う同じ骨格の繰り返しです。
|
|
608
740
|
`--dedup` は ID・ハッシュ・数値・日付と時刻・パス・URL をマスクして行をまとめ、グループごとに 1 行だけ送って、
|
|
609
741
|
その答えを残りの行にも使います。送るのはその行の原文で、出力も各行がそのまま出ます。
|
|
610
742
|
|
|
743
|
+
`--dedup` は `auto`・`always`・`never` を取り、裸の `--dedup` は `--dedup=always` です。**当面の既定は
|
|
744
|
+
`never`**(#143)。`auto` は、実運用の統計が既定にしてよいと言うまで見送ります。それでも毎回、送る前に
|
|
745
|
+
ローカルで、全種類を縮めた場合(最良のケース)にどれだけ浮くかを見積もり、それが `--dedup` 自身の質問の
|
|
746
|
+
費用の 2 倍以上なら stderr に一行ヒントを出します。
|
|
747
|
+
|
|
748
|
+
```
|
|
749
|
+
$ sys1grep -e "a request failed" app.log
|
|
750
|
+
sys1grep: 2040 units fold to at most 31 templates; --dedup=auto would save ~68 requests (~44k tokens)
|
|
751
|
+
```
|
|
752
|
+
|
|
753
|
+
`--dedup=auto` はその見積もりが割に合うときだけまとめます。ほとんど縮まないファイルは、追加のリクエスト
|
|
754
|
+
なしに全行を送ります。`--verbose`・`--dry-run` はどの値でもこの判定と数字を表示します。
|
|
755
|
+
|
|
611
756
|
```sh
|
|
612
|
-
$
|
|
757
|
+
$ sys1grep --dedup -n -e "a request failed" app.log
|
|
613
758
|
1:worker request 3fa9c1e27b failed: connection reset
|
|
614
759
|
2:worker request 88d0e41a5c failed: connection reset
|
|
615
760
|
4:worker request 0b7f2a9e13 failed: connection reset
|
|
@@ -617,10 +762,21 @@ $ ./sys1grep --dedup -n -e "a request failed" app.log
|
|
|
617
762
|
```
|
|
618
763
|
|
|
619
764
|
どの値をまとめてよいかは意味によります。「ディスク使用率が 90% を超えている」なら数値が、「夜間に起きた」なら
|
|
620
|
-
|
|
621
|
-
Jev に聞き、その種類はまとめません(上の 2 リクエストのうち 1 つ)。同じファイルに
|
|
765
|
+
時刻が答えを決めます。そこで `--dedup=always`(と裸の `--dedup`)は先に、意味ごとに小さなリクエストを 1 つ送って、
|
|
766
|
+
どの種類の値が判定を変えうるかを Jev に聞き、その種類はまとめません(上の 2 リクエストのうち 1 つ)。同じファイルに
|
|
622
767
|
`-e "disk usage is above 90%"` で聞くと、`95%` と `12%` は別々に判定され、`5:disk usage 95%` だけが出ます。
|
|
623
768
|
|
|
769
|
+
`--dedup=auto` はこの問いを送りません(#152)。全種類をまとめ、代わりに各テンプレートから標本を判定します。
|
|
770
|
+
値の違う最大 5 行で、変わる値ごとに、その値が最小の行・最大の行・中央の行を選びます。標本の判定がすべて同じなら、
|
|
771
|
+
標本でない行は最初の標本の答えを共有し、標本はそれぞれ自分の答えを保ちます(`-p` は各標本の確率をそのまま出します)。
|
|
772
|
+
判定が分かれたら残りの行を 2 回目として送り、その前に `--max-cost` をもう一度確かめます。分かれたときは
|
|
773
|
+
`never` より少しだけ高くつきます。最悪でも回の境目ごとにリクエスト 1 つ、数パーセントで、600 行の
|
|
774
|
+
テンプレート 1 つでは `never` の 20 リクエストに対して 21 リクエストでした。標本のあいだにしか無い値は見落とします。
|
|
775
|
+
`usage 1` から `usage 120` の中で意味 `usage 50` はどの標本にも一致しないので、`never` が 50 行目を出すところで
|
|
776
|
+
`auto` は何も出しません。`--verbose` は、判定が揃ったテンプレートの数と、もう一度送った行の数を表示します。
|
|
777
|
+
`--dry-run` はすべての標本の判定が揃うと仮定するので、その数は下限です。6 行のテンプレート 100 個では
|
|
778
|
+
10 リクエスト・600 行中 300 行と出ますが、すべてのテンプレートで判定が分かれると 600 行すべてを 20 リクエストで送ります。
|
|
779
|
+
|
|
624
780
|
値を何も残さずにまとめた場合の実測では、43,071 行のシステムログが 550 テンプレート(バイト数で 1.2%)に、
|
|
625
781
|
`install.log` が 21.1% に縮みました。Claude Code のトランスクリプト(jsonl)は 56.8% までしか縮みません。
|
|
626
782
|
機械が吐くログ向けの機能で、散文には共通の骨格がなく、時刻を読む意味ではほとんど縮みません。
|
|
@@ -656,9 +812,11 @@ $ sys1grep -r -n --summarize -e "API キーをファイルから読んでいる"
|
|
|
656
812
|
- `-n`・`-A/-B/-C`・`-p`・ファイル名は表示どおりに渡し、色は付けません。一致がなければ何も渡しません(終了コード 1)。
|
|
657
813
|
- `SYS1GREP_SUMMARIZER` は値を付けない `--summarize` の TOOL を、`SYS1GREP_SUMMARIZER_MODEL` はそのモデルを決めます。
|
|
658
814
|
- `-q`・`-l`・`-c` は行を出さないので、一緒には使えません。
|
|
815
|
+
- `SYS1GREP_OPTS` に書くとすべての検索を要約するので、一致した行は毎回 TOOL の提供元へも送られます。
|
|
816
|
+
1 回だけ止めるには `--no-summarize` を付けます。
|
|
659
817
|
- 答えはプレーンテキストです。何も言わなければ LLM は Markdown で書き、端末では雑音になるので、plain を頼みます。
|
|
660
|
-
`--
|
|
661
|
-
答えは確かめずにそのまま表示します。`SYS1GREP_OPTS` に書けば常用の設定になり、`--summarize`
|
|
818
|
+
`--format=markdown` か `=html` でそれらを頼めます(`… --format=html … > summary.html`)。
|
|
819
|
+
答えは確かめずにそのまま表示します。`SYS1GREP_OPTS` に書けば常用の設定になり、`--summarize` も `--rank` も無いときは無視します。
|
|
662
820
|
- `--dedup` では、Jev に送ったものと同じく、テンプレートごとの代表を 1 回だけ `(×N like it)` を付けて渡します。
|
|
663
821
|
答えを使い回したすべての行は渡しません。
|
|
664
822
|
- 200 KB(約 5 万トークン)を超えるときは何も渡さず、大きさを示して終了コード 2 で止まります。TOOL の費用がかかる前です。
|
|
@@ -671,7 +829,17 @@ $ sys1grep -r -n --summarize --summarize-prompt="3 行以内で。どのファ
|
|
|
671
829
|
-e "API キーをファイルから読んでいる" .
|
|
672
830
|
```
|
|
673
831
|
|
|
674
|
-
`--summarize` が要ります。空の TEXT は指定しないのと同じです。`--
|
|
832
|
+
`--summarize` が要ります。空の TEXT は指定しないのと同じです。`--format` の文より後に置くので、TEXT で書式を上書きできます。
|
|
833
|
+
|
|
834
|
+
行を見てから決めたいときは `--summarize=ask` です。行をいつもどおり出し、続けて端末で
|
|
835
|
+
`Summarize these matches? [y/N]` と聞きます。`y` なら、いま出した行を値なしの `--summarize` の TOOL に渡します。
|
|
836
|
+
検索はやり直さず、Jev にも何も送りません。Enter やそれ以外ならそこで終わります。
|
|
837
|
+
|
|
838
|
+
- 問いは `/dev/tty` で行うので、標準入力をターゲットにしても使えます。端末が無いとき、標準出力が端末でないとき
|
|
839
|
+
(パイプ・`$(...)`・スクリプト) は聞かず、止まりません。
|
|
840
|
+
- `-y` は聞かずに要約します。`SYS1GREP_OPTS` に `-y` があると毎回要約します。`-q` と `--dry-run` は聞きません。
|
|
841
|
+
- `--dedup` では一致した行はすべて出し、TOOL には `--summarize` と同じく各テンプレートの代表を渡します。
|
|
842
|
+
- 終了コードは要約の成否によらず検索のものです。200 KB を超えるときは、`y` でも送らずにそう伝えます。
|
|
675
843
|
|
|
676
844
|
他の TOOL:
|
|
677
845
|
|
|
@@ -690,6 +858,220 @@ OpenAI 互換サーバ全般です。3 つとも `SYS1GREP_SUMMARIZER_MODEL` が
|
|
|
690
858
|
(Jev 用の `SYS1GREP_API_KEY` は送りません)。`OLLAMA_HOST` で ollama 側のホストを変えられます
|
|
691
859
|
(`ollama` CLI 自体と同じ)。
|
|
692
860
|
|
|
861
|
+
### 検索ページ (`--serve`)
|
|
862
|
+
|
|
863
|
+
`--rank --format=html` は 1 回の実行で 1 つの問いに答えます。`--serve` はそうしたページ(`--template` を指定しなければ `search` テンプレート)を検索ボックス付きで開くので、
|
|
864
|
+
コマンドを打ち直さずに言い換えたり絞り込んだりできます:
|
|
865
|
+
|
|
866
|
+
```
|
|
867
|
+
$ sys1grep --serve -r src/
|
|
868
|
+
http://127.0.0.1:51234/?k=3f9e...
|
|
869
|
+
$ sys1grep --serve=8080 -y --level=strict -r src/ # ポートを固定。ここで渡したオプションがページの初期値になる
|
|
870
|
+
```
|
|
871
|
+
|
|
872
|
+
クローンからは `npm run serve -- -r src/` でも同じです(`--` は npm にオプションを読ませないため。ポートを固定するなら
|
|
873
|
+
`npm run serve -- --serve=8080 -r src/`)。ターゲットがないと、`--serve` は空の stdin を読む代わりにパッケージ同梱の
|
|
874
|
+
サンプル(`examples/`、#237)を探すので、どの例ボタンにも見つかるものがあります。ターゲットを指定すればそちらを探します。`-r` なしでフォルダを指定すると、`-r` を足したコマンドを示して起動時に拒否します(`--serve: src is a directory: add -r to search it (sys1grep --serve -r src)`、#222)。
|
|
875
|
+
|
|
876
|
+
表示される URL には起動のたびに作るトークン(`?k=...`)が付きます。ページ自身を含むすべての経路でこれが要り、
|
|
877
|
+
なければ(クエリにも、ページ自身のリクエストが使うヘッダにもなければ)サーバは何に対しても 404 を返します。
|
|
878
|
+
ポート番号を知っているだけの別のローカルアカウントやプロセスは、ページもトークンも検索結果も読めません。
|
|
879
|
+
|
|
880
|
+
タイトルバーの `EN` / `日本語` でページ全体の言語(見出し・ラベル・ボタン・ヒント・Settings ダイアログ・ページ自身の
|
|
881
|
+
メッセージ)を切り替えられ、ブラウザに記憶されます。既定は、保存済みの選択、なければ `--lang` / `SYS1GREP_LANG` /
|
|
882
|
+
settings.json の `lang`(後述)、それもなければブラウザの言語、最後に英語です。sys1grep 自身が出すもの(検索結果、
|
|
883
|
+
`--dry-run` の見積もり、エラー)、コマンドライン、オプション名は翻訳されません。
|
|
884
|
+
|
|
885
|
+
ページは 4 つのセクションに分かれています(#216)。**Target** はどの検索も読むものを示します: 起動時に渡した
|
|
886
|
+
ファイルとフォルダ(`npm run serve -- src docs/a.md`)、渡さなければ sys1grep が代わりに読むもの、つまり `-r` なら `.`、
|
|
887
|
+
`git sys1grep` なら git が追跡しているファイル全部、どちらでもなければ同梱のサンプル(`demo corpus (bundled): examples/`、#237)
|
|
888
|
+
です。(Details の)`-g` がオンの間は、代わりに git log のコミットと出ます。表示だけで、ページからは変えられず、
|
|
889
|
+
リクエストに含まれたターゲットは無視されます。**Search conditions** には意味の欄と multi-step があり、
|
|
890
|
+
**Options** には `rank` と `summarize`、**Details** にはそれ以外のオプションがあり、
|
|
891
|
+
結果はその下に出ます。Search ボタン(Estimate cost と Stop はその下)は Search conditions の右に大きく置かれ、
|
|
892
|
+
例とオプションはその下に並び(スマホ幅では 1 列)、続いてコマンドラインと Details が出ます。中身は次のとおりです: 意味の欄(`+` で増やせ、それぞれ `-e`、`-P`、`-a`、`-v`、`-Q` のどれか)、
|
|
893
|
+
`rank`、`summarize`、**multi-step** スイッチ(オンにすると終点の欄、つまり `--step-to` と 1 つ以上の意味、および辺の
|
|
894
|
+
設定である `--hops` と、それを `--step-reverse-to` にする reverse スイッチが出ます。オフにするとそれらはコマンドと検索から
|
|
895
|
+
外れ、値は保たれます)、例ボタン(この README と [docs/use-cases.md](docs/use-cases.md) の検索、続いて多段階の
|
|
896
|
+
たどり。押すと欄と必要なコントロールが埋まり、それ以外は起動時の値に戻り、Search を待ちます)、その他のオプションを畳んだ **Details**
|
|
897
|
+
(`--level`、`-t`/`-T`、`-C`、`-A`/`-B`、`--auto-scope`、`-n`、`-p`、`--dedup`、`--unit`、`-o`(文単位のときだけ表示)、
|
|
898
|
+
`-j`、`--max-cost`、`--include`、`--exclude`、`--changed-within`、`-g`)、そして今のコントロールに対応する
|
|
899
|
+
**コマンドライン**と Copy ボタンです。ターミナルに貼れば同じ検索が走ります。起動時の値のままのオプションは、
|
|
900
|
+
コントロールが足す分に含めません。`rank` がオフなら一致をファイル順のテキストで、オンなら順位付きのカードで出します。
|
|
901
|
+
`summarize` は右の列を足します: Search は 1 回だけ走り、結果が画面に出たら、その結果を要約します(表示中のテキストを、
|
|
902
|
+
rank のカードも含めて要約器に POST します。2 回目の検索はなく、Jev に追加で送るものもなく、`--summarize` と同じく
|
|
903
|
+
200 KB まで)。結果が画面に出ている状態で `summarize` にチェックを入れると、その結果をそのまま要約するかをページ内で
|
|
904
|
+
尋ねます(#227)。OK なら同じようにテキストを送り返し、Not now ならチェックを入れたまま次の Search を待ちます。
|
|
905
|
+
結果が出た後に欄やオプションを変えていれば、問いがそう告げます。画面に結果がないとき、multi-step がオンのときは
|
|
906
|
+
尋ねません。Estimate cost は `--dry-run` です。最初の欄は既定で質問(`-Q`)です。`--suggest=Q:TEXT` /
|
|
907
|
+
`--suggest=e:TEXT`(または `--suggest TEXT`。繰り返せる。TEXT だけなら質問)は、例の行の先頭に質問の候補ボタンを
|
|
908
|
+
置きます。押すとページが埋まり、Search で実行されます。Details の各オプションには、何をするかを示す「?」の
|
|
909
|
+
ヒントがあります。検索中は Search と Estimate が押せなくなり、**Stop** で止められます(子プロセスを kill します)。
|
|
910
|
+
一致は `--color=always` と同じ色(ファイル名、行番号、正規表現の一致)で、カードでは `<mark>` で示します。
|
|
911
|
+
|
|
912
|
+
どの検索も sys1grep 自身を実行する(起動時のオプションの後にコントロールの分を足す)ので、ページにできることは
|
|
913
|
+
コマンドラインにできることと同じで、それ以上ではありません。サーバは `127.0.0.1` だけで待ち受け、そのホスト名に
|
|
914
|
+
しか答えず、ページが API キーを見ることはありません。ターゲット、`--chunk`、`-M`、`--max-filesize`、`-y`、`--edges`、
|
|
915
|
+
`--template`、API の設定、`--summarize` の TOOL は起動時に決まります: ページは与えられたものを絞り込めても
|
|
916
|
+
広げられません(`--chunk`、`-M`、`--max-filesize` は Settings ダイアログの既定のオプションからは変えられます)。
|
|
917
|
+
`--max-cost` を超える検索はすぐに拒否されます(`--serve` には `-y` の問いを出す `/dev/tty` がありません。問わずに
|
|
918
|
+
通すなら `-y` を付けて起動します)。エラーには `--dry-run` と同じ見積もりが載り、横のボタンでその検索だけを 1 回、
|
|
919
|
+
見積もりを少し上回る `--max-cost` で実行し直せます(Details の欄は変えません)。
|
|
920
|
+
意味はページから来るので、`-e -P -a -v -Q --step-to --step-reverse-to` と `-l -c -q -o -z --unit=zero -H -i --format --color --dry-run --verbose` は起動時に拒否されます。
|
|
921
|
+
|
|
922
|
+
**Settings** は `~/.config/sys1grep/settings.json`([インストール](#インストール)を参照)を編集します: `url`、`model`、
|
|
923
|
+
キー、`opts`(1 行に引数 1 つ)、要約器の 3 つ、`lang`(ページ自身の既定言語)です。Save でファイルに書き、次の検索から使われます。以後の `sys1grep`
|
|
924
|
+
の実行でも同じです。各欄の横には、検索が使う値がどこから来るかが出ます。環境変数や起動時のオプションがファイルより
|
|
925
|
+
優先されるときはそう告げます。その場合、保存しても検索は変わらないからです。キーは保存済み / 未保存としか返りません。
|
|
926
|
+
置き換えるなら新しいキーを入力し、消すなら remove にチェックを入れます。`opts` の中の `--sys1-api-key` と `url` の
|
|
927
|
+
userinfo は、`--verbose` と同じく `***` に伏せて返ります。`opts` はターゲット、ページ自身が起動時に拒否するフラグ、
|
|
928
|
+
`--sys1-url` / `--sys1-api-key`(専用の欄があります)を受け付けず、`url` と URL の要約器は `http(s)` でなければ
|
|
929
|
+
なりません。保存はページのトークンを付けた `POST` で、そのリクエスト自身の Host を `Origin` として要求します。
|
|
930
|
+
ファイルは丸ごと書いて(0600、作るときはディレクトリを 0700)置き換えるので、読み手が書きかけを見ることはありません。
|
|
931
|
+
|
|
932
|
+
### 良いものから順に出す (`--rank`)
|
|
933
|
+
|
|
934
|
+
一致は grep と同じくファイル順に出ます。多いときは `--rank` で、結果を良いものから順に、番号付きの見出しの下に
|
|
935
|
+
出せます。結果とは一致とその `-A/-B/-C` の行で、文脈が接する一致は 1 つの結果になります。
|
|
936
|
+
|
|
937
|
+
```sh
|
|
938
|
+
$ sys1grep -n -C1 --rank -e "返金を断られた" tickets/
|
|
939
|
+
1. tickets/b.txt
|
|
940
|
+
tickets/b.txt-2-注文番号 1234、2026-08-01 注文。
|
|
941
|
+
tickets/b.txt:3:注文から 30 日を過ぎているため、返金はお受けできません。
|
|
942
|
+
tickets/b.txt-4-サポートまでご連絡ください。
|
|
943
|
+
|
|
944
|
+
2. tickets/a.txt
|
|
945
|
+
tickets/a.txt-11-注文番号 88 が届きました。
|
|
946
|
+
tickets/a.txt:12:返金のご依頼を受け付けました。
|
|
947
|
+
tickets/a.txt-13-確認いたします。
|
|
948
|
+
```
|
|
949
|
+
|
|
950
|
+
- `--rank` は `--rank=jev` です。検索の後、各結果(行と文脈をまとめて)が否定でない意味に関係するかを Jev に
|
|
951
|
+
聞きます。結果ごとに質問が 1 つ増え、1 リクエストに `--chunk` 個(64 個まで)まとめます。どんな結果があるかは検索の後で
|
|
952
|
+
しか分からないので、`--dry-run` / `-i` は上限を出します。
|
|
953
|
+
- `--rank=match` は結果の中で最も高い一致の確率で並べ、リクエストを送りません。1 行ずつの yes/no の答えなので、
|
|
954
|
+
はっきりした一致どうしは近い値になり、文脈も読みません。
|
|
955
|
+
- `-p` は見出しに点数を付けます(`1. [0.96] tickets/b.txt`)。`-l` は最良の結果の順にファイル名を出します。
|
|
956
|
+
- `--format=markdown` は結果ごとに `## 1. tickets/b.txt` の見出しとコードブロックを、`--format=html` はテンプレート
|
|
957
|
+
(下記)から 1 つの自己完結した HTML 文書を書きます。ライトとダークに対応し、結果ごとに関連度のバーが付きます。
|
|
958
|
+
行は表示どおりでエスケープし、一致した部分を `<mark>` で囲みます(正規表現の一致、なければ一致した文、
|
|
959
|
+
なければ一致した行全体。文脈の行には付けず、`--color=never` で付けなくなります)。
|
|
960
|
+
- `--summarize` には順位どおりに渡します。`--dedup` では代表 1 つが 1 つの結果です。
|
|
961
|
+
- 意味が要ります(正規表現・`!`・`-v` だけでは並べられない)。`-c`・`-o`・`-q` とは併用できません。
|
|
962
|
+
`--no-rank` はそれより前の `--rank`(`SYS1GREP_OPTS` のものなど)を取り消します。
|
|
963
|
+
|
|
964
|
+
### 失敗したコマンドの原因を探す
|
|
965
|
+
|
|
966
|
+
失敗したジョブの最後のエラーはたいてい症状だけを言い(`214 accounts out of balance ... day-close aborted`)、
|
|
967
|
+
ほかの `ERROR` / `WARN` はリトライで回復したものです。原因はずっと上の、目立たない `INFO` や `DEBUG` の 1 行である
|
|
968
|
+
ことがよくあります。症状や `-Q "why did the job fail"` で聞くと、そのノイズが見つかります。#156 の 30,000 行の
|
|
969
|
+
ログでは、回復した `ERROR` 行しか返りませんでした。代わりに原因の種類で聞き、結果を並べます。
|
|
970
|
+
|
|
971
|
+
```sh
|
|
972
|
+
$ sys1grep -n --dedup --level strict --rank \
|
|
973
|
+
-e "a component, writer, job or feature was paused, disabled, skipped or put on hold" \
|
|
974
|
+
-e "a configuration, endpoint, region, credential or data source was changed or switched" \
|
|
975
|
+
-e "an input, file or table was empty, missing, or had fewer records or columns than expected" \
|
|
976
|
+
-e "a fallback or default value was used instead of the real one" \
|
|
977
|
+
job.log
|
|
978
|
+
```
|
|
979
|
+
|
|
980
|
+
この 4 つの意味で、生成した失敗ジョブのログ 24 本(原因の種類ごとに 6 本、各 10,008 行)を測りました
|
|
981
|
+
(`npm run cause-eval`、各行は `tests/cause-results.tsv`。24 行は旧版のスクリプトの出力で、`top 2 jev` 列は
|
|
982
|
+
再実行の 2 行にだけあります)。結果は 1 本あたり 366〜464 件です。`--rank=match` の列は別の走行ではなく、
|
|
983
|
+
`--rank` の走行の `-p` 列から再計算したものです(`--rank=match` は結果をその最大値で並べるため)。この再計算と
|
|
984
|
+
実際の `--rank=match` の走行との突き合わせは、原因が結果に入らなかった config-5 の 1 本だけです。「一致せず」は、
|
|
985
|
+
`strict` 未満と判定されたのか、`--dedup` で似た行に畳まれたのかを区別しません。
|
|
986
|
+
|
|
987
|
+
| 原因 | 原因が 1 位、`--rank` | 原因が 1 位、`--rank=match` | それ以外 |
|
|
988
|
+
|---|---|---|---|
|
|
989
|
+
| 設定・接続先・認証情報が切り替わった | 6 本中 5 | 6 本中 5 | 1 本は一致せず |
|
|
990
|
+
| 入力が空、または少ない | 6 本中 2 | 6 本中 2 | 2 本は 62 位(`match` では 343〜371 位)と 81 位(同 191〜219 位)、2 本は一致せず |
|
|
991
|
+
| 本来の値の代わりに既定値を使った | 6 本中 6 | 6 本中 5 | `match` で 2〜9 位(上に 1 件、0.90 で並ぶものが 7 件) |
|
|
992
|
+
| 来なかった行(開始したが終了がない) | 6 本中 0 | 6 本中 0 | 開始の行は一度も結果に入らず |
|
|
993
|
+
|
|
994
|
+
1 本あたり約 $0.088(入力 210 万トークン、643〜646 リクエスト)、16〜17 秒でした。`--rank`(`jev`)は結果ごとに
|
|
995
|
+
質問を 1 つ足し、入力トークンは `--rank=match` より約 3% 多くなります(1 本を両方で走らせた値。TSV には未記録)。
|
|
996
|
+
`--rank=match` より原因を上に置いたログが 3 本、下に置いたログは 0 本です。
|
|
997
|
+
|
|
998
|
+
上位の結果が関係なさそうに見えるとき(ローテーション、リフレッシュ、最後のエラーそのもの)は、原因はおそらく次のどれかです。
|
|
999
|
+
|
|
1000
|
+
- **値だけを述べる行**: `stock snapshot downloaded: 1204 bytes`、`input directory ... holds 2 files`、
|
|
1001
|
+
`resolved db-primary.internal to 10.0.4.22 (replica-2)`。行のどこにもおかしいとは書いていないので、どの仮説も
|
|
1002
|
+
当たりません。最後のエラーから書いた意味
|
|
1003
|
+
(`-e "the job connected to a read-only replica instead of the primary database"`)でも当たりませんでした。
|
|
1004
|
+
エラーが名指すもので探し(`-P '/snapshot|replica/'`)、数値を読んでください。
|
|
1005
|
+
- **来なかった行**: シャードを取ったまま終えなかったワーカー、始まって終わらなかったステップやマイグレーション。
|
|
1006
|
+
この 6 本ではどれも開始の行が結果に入りませんでした。1 位は日常の行か最後のエラー、1 本は前回の実行の
|
|
1007
|
+
`alias products switched to products-20260927` で、09-28 のそれは来ていません。これを狙った意味
|
|
1008
|
+
(`-e "a worker, step or upload started but never reported that it finished"`)でも、1 位は開始の行ではなく最後の
|
|
1009
|
+
エラーでした。`--dedup` は開始の行を似た開始の行に畳むことがあります。開始の行は互いに似ていて、違うのは終了が
|
|
1010
|
+
来ないことだけだからです。開始と終了は目か grep で突き合わせてください。
|
|
1011
|
+
- **点数では分からない**: 原因が 1 位だったログでは `--rank` で 0.93〜0.97、一度も一致しなかったログ 2 本では
|
|
1012
|
+
1 位が 0.88 と 0.91 でした。
|
|
1013
|
+
|
|
1014
|
+
最初の 2 点の裏付けにした追試(原因の行を 31 行の窓で単独に判定させたもの、エラーから書いた意味、来なかった終了を
|
|
1015
|
+
狙った意味)は PR #192 の説明にあります。`tests` には再現の手段がありません。
|
|
1016
|
+
|
|
1017
|
+
検索する行はすべて Jev(TypeSafe、または `SYS1GREP_URL` の先)に送られ、`--summarize` では一致した行が TOOL の
|
|
1018
|
+
提供元にも送られます。ビルドやジョブのログにはトークン・パスワード・顧客データがよく入っています。
|
|
1019
|
+
|
|
1020
|
+
### HTML のテンプレート (`--template`)
|
|
1021
|
+
|
|
1022
|
+
`--rank --format=html` と `--summarize --format=html` はテンプレートを埋めて書きます。同梱は 4 つで、`default`、`print`(白地に黒の明朝系、
|
|
1023
|
+
紙と PDF 向け)、`search`(Web 検索エンジン風の結果ページ)、`terminal`(暗い背景の等幅)です。`--template=NAME` で選び、環境変数か
|
|
1024
|
+
`~/.config/sys1grep/.env` の `SYS1GREP_TEMPLATE` で既定を決められます。
|
|
1025
|
+
|
|
1026
|
+
```sh
|
|
1027
|
+
$ sys1grep -r -n -C1 --rank -p --format=html --template=print -e "返金を断られた" tickets/ > refunds.html
|
|
1028
|
+
```
|
|
1029
|
+
|
|
1030
|
+
テンプレートは 1 つの HTML ファイルです。`<!--result-->` と `<!--/result-->` の間を結果ごとに繰り返し、
|
|
1031
|
+
その前と後は 1 回だけ書きます。次の文字列をエスケープした値に置き換え、それ以外の `{{…}}` はそのまま残します。
|
|
1032
|
+
|
|
1033
|
+
| 置き換える文字列 | 使える場所 | 値 |
|
|
1034
|
+
|---|---|---|
|
|
1035
|
+
| `{{title}}` | どこでも | `sys1grep: ` と意味 |
|
|
1036
|
+
| `{{query}}` | どこでも | 意味。`"refund" and not "policy"` の形 |
|
|
1037
|
+
| `{{count}}` | どこでも | 結果の数(`--summarize` では一致した行の数) |
|
|
1038
|
+
| `{{answer}}` | どこでも | `--summarize` の答え。`--rank` では空 |
|
|
1039
|
+
| `{{rank}}` | 結果ごと | 1, 2, … |
|
|
1040
|
+
| `{{score}}` | 結果ごと | `-p` が出す形の点数(`0.96`)。`-p` が無ければ空 |
|
|
1041
|
+
| `{{score_pct}}` | 結果ごと | 点数を 0〜100 の整数にしたもの。`-p` が無くても入る(バーには `style="--s:{{score_pct}}"`) |
|
|
1042
|
+
| `{{file}}` | 結果ごと | ファイル名。1 ファイルだけを探したときは空 |
|
|
1043
|
+
| `{{lines}}` | 結果ごと | 結果の行。表示どおり |
|
|
1044
|
+
|
|
1045
|
+
`--template=NAME` は `~/.config/sys1grep/templates/NAME.html` があればそれを、無ければ同梱のものを読みます。
|
|
1046
|
+
なので自分の `default` を置けば同梱のものに代わります。`/` を含むか `.html` で終わる値はファイルのパスです。
|
|
1047
|
+
自分のものを作るには、同梱のものをコピーして編集します。
|
|
1048
|
+
|
|
1049
|
+
```sh
|
|
1050
|
+
$ sys1grep --install-templates # ファイルごとに "copied PATH"
|
|
1051
|
+
$ cp ~/.config/sys1grep/templates/default.html ~/.config/sys1grep/templates/team.html
|
|
1052
|
+
$ sys1grep -r --rank --format=html --template=team -e "..." src/ > out.html
|
|
1053
|
+
$ sys1grep --template=list # 1 行に 1 つの名前。~/.config のものには "(user)"
|
|
1054
|
+
```
|
|
1055
|
+
|
|
1056
|
+
`{{score_pct}}` は `-p` が無くても入るので、数字を出さずに関連度をバーで見せられます。
|
|
1057
|
+
|
|
1058
|
+
`--summarize --format=html` では TOOL に平文を書かせ、その答えを、終わってからエスケープして `{{answer}}` に入れます。
|
|
1059
|
+
`<!--result-->` と `<!--/result-->` の間は書きません。`--summarize` で使うテンプレートには、その外に `{{answer}}`
|
|
1060
|
+
が要ります(同梱のものにはあります。`--rank` のときは空)。
|
|
1061
|
+
|
|
1062
|
+
```sh
|
|
1063
|
+
$ sys1grep -r --summarize --format=html --template=print -e "返金を断った理由" tickets/ > why.html
|
|
1064
|
+
```
|
|
1065
|
+
|
|
1066
|
+
テンプレートは信頼したローカルの入力として扱います。指定したパスやテンプレートのディレクトリにあるシンボリック
|
|
1067
|
+
リンクはそのまま読み、エスケープするのは埋め込む結果だけです。
|
|
1068
|
+
|
|
1069
|
+
`--install-templates` は既にあるファイルを上書きしません(そのファイルには `kept` と出します)。テンプレートが
|
|
1070
|
+
見つからない、あるいは `<!--result-->` 1 つの後に `<!--/result-->` 1 つ、になっていないときは、そのファイルを
|
|
1071
|
+
示して終了コード 2 です。コマンドラインの `--template` には、`--rank` か `--summarize` と `--format=html` が要ります(`-l` とは併用不可)。
|
|
1072
|
+
`SYS1GREP_TEMPLATE` はそれ以外では使われないだけです。`--template=list` と `--install-templates` は他の引数と
|
|
1073
|
+
併用できず、`SYS1GREP_OPTS` には書けません。
|
|
1074
|
+
|
|
693
1075
|
## Claude Code から使う
|
|
694
1076
|
|
|
695
1077
|
sys1grep を代わりに走らせてくれる Claude Code のスキルがあります。探したいものを言葉で書くと、式を組み立てて
|
|
@@ -701,8 +1083,8 @@ claude plugin marketplace add uehaj/uehaj-marketplace
|
|
|
701
1083
|
claude plugin install uehaj@uehaj-marketplace
|
|
702
1084
|
```
|
|
703
1085
|
|
|
704
|
-
コマンドラインツールを別途インストールする必要はありません。スキルは PATH
|
|
705
|
-
|
|
1086
|
+
コマンドラインツールを別途インストールする必要はありません。スキルは PATH の `sys1grep` ではなく、
|
|
1087
|
+
スキルが固定した版を `npx -y @uehaj/sys1grep@VERSION` で動かします。必要なのは API キーの設定だけです([インストール](#インストール) を参照)。
|
|
706
1088
|
|
|
707
1089
|
あとは Claude Code の中で次のように打ちます。
|
|
708
1090
|
|
|
@@ -718,22 +1100,27 @@ Claude Code のインストール単位はプラグインで、スキル単体
|
|
|
718
1100
|
npx skills add uehaj/uehaj-marketplace --skill sys1grep -a claude-code -g
|
|
719
1101
|
```
|
|
720
1102
|
|
|
721
|
-
スキルは意味を英語で書き、
|
|
1103
|
+
スキルは意味を英語で書き、OR / AND / NOT を `-e` / `-a` / `-v` に振り分け、`-n` を付け、大きなディレクトリは
|
|
722
1104
|
課金に見合うファイルに絞り、最初の結果が怪しければ `--level loose` や `strict` で引き直します。
|
|
723
|
-
API キーとエンドポイントの読み方はコマンドラインと同じです(`SYS1GREP_API_KEY`、`~/.config/sys1grep/.env`)。
|
|
1105
|
+
API キーとエンドポイントの読み方はコマンドラインと同じです(`SYS1GREP_API_KEY`、`~/.config/sys1grep/settings.json`、`~/.config/sys1grep/.env`)。
|
|
724
1106
|
|
|
725
1107
|
## 使い方
|
|
726
1108
|
|
|
727
1109
|
```
|
|
728
|
-
usage: sys1grep [OPTION]... -e MEANING|-Q QUESTION [-a MEANING] [-v MEANING]... [FILE...]
|
|
729
|
-
|
|
730
|
-
|
|
1110
|
+
usage: sys1grep [OPTION]... -e MEANING|-Q QUESTION|-P /RE/FLAGS [-a MEANING] [-v MEANING]... [FILE...]
|
|
1111
|
+
sys1grep [OPTION]... -e START1 [-e START2]... --step-to END1 [-e END2]... [FILE...]
|
|
1112
|
+
|
|
1113
|
+
-e MEANING この意味に合う行 (複数指定は OR)。MEANING は常に Jev へ送る意味で、正規表現として読むこと
|
|
1114
|
+
はない。/RE/flags の形の値は拒否し、-P を使うよう促す。本当に / で始まり / で終わる意味は、
|
|
1115
|
+
先頭にスペースを置けば通る (-e ' /cat/')
|
|
1116
|
+
-P '/RE/FLAGS' 正規表現項。-e と同じく OR で、ローカルで判定しリクエストは発生しない。直後の -a/-v は
|
|
1117
|
+
-e のときと同じく AND/AND NOT で連結。-P '!/RE/' は使えない。否定は -v '/RE/' で行う
|
|
731
1118
|
-Q, --question QUESTION QUESTION に答えている行 (尋ねている行ではない)。-e "the line answers: QUESTION"
|
|
732
1119
|
と同じ (上の「問いに答えている行を探す」参照)
|
|
733
|
-
-a MEANING 直前の -e/-Q 項に AND で連結。-e A -a B -e C は (A and B) or C
|
|
734
|
-
-v MEANING 直前の -e/-Q 項に AND NOT で連結。-e A -v B は A and not B
|
|
1120
|
+
-a MEANING 直前の -e/-Q/-P 項に AND で連結。-e A -a B -e C は (A and B) or C
|
|
1121
|
+
-v MEANING 直前の -e/-Q/-P 項に AND NOT で連結。-e A -v B は A and not B
|
|
735
1122
|
先頭に置けば単独の否定。-v B は not B (grep -v 相当)
|
|
736
|
-
!MEANING -e / -Q / -a / -v のどこでも、先頭に ! を付けるとその意味だけ否定
|
|
1123
|
+
!MEANING -e / -Q / -a / -v のどこでも、先頭に ! を付けるとその意味だけ否定 (-P では不可)
|
|
737
1124
|
-e A -e '!B' は A or not B。-a '!C' は -v C と同じ
|
|
738
1125
|
--level=LEVEL 厳しさ。肯定と否定の閾値をまとめて決める (既定 normal)
|
|
739
1126
|
loose : -t 0.3 -T 0.7 多少あやしくても拾う
|
|
@@ -753,6 +1140,8 @@ usage: sys1grep [OPTION]... -e MEANING|-Q QUESTION [-a MEANING] [-v MEANING]...
|
|
|
753
1140
|
--changed-within=WHEN -r と git sys1grep で、30m / 2h / 7d / 2w 以内、日付か日時以降、today / this-week /
|
|
754
1141
|
this-month に更新したファイルだけを探す
|
|
755
1142
|
--no-auto-scope 意味の文面からファイルを絞り込まない (意味からの絞り込みを参照)。--auto-scope で戻す
|
|
1143
|
+
-g, --gitlog ファイルではなく git log のコミットを 1 件 1 レコードとして探す。FILE は pathspec
|
|
1144
|
+
(意味からの絞り込みを参照)。-r・git sys1grep とは併用不可
|
|
756
1145
|
-l 一致した行ではなくファイル名だけを表示
|
|
757
1146
|
-H, --with-filename 1 ファイルでもファイル名を付ける。--no-filename は常に付けない
|
|
758
1147
|
-A NUM 一致行の後ろ NUM 行も表示 (grep と同じ。文脈行の区切りは - )
|
|
@@ -760,24 +1149,31 @@ usage: sys1grep [OPTION]... -e MEANING|-Q QUESTION [-a MEANING] [-v MEANING]...
|
|
|
760
1149
|
-C NUM 前後 NUM 行を表示 (-A NUM -B NUM)
|
|
761
1150
|
-c 一致した行数だけをファイルごとに表示 (grep -c 相当)
|
|
762
1151
|
-q, --quiet 何も表示せず、最初の一致で止まる。一致があればエラーがあっても終了コード 0 (grep -q 相当)
|
|
763
|
-
--chunk=LINES 1 リクエストにまとめる行数 (既定 30
|
|
1152
|
+
--chunk=LINES 1 リクエストにまとめる行数 (既定 30。質問も 1 リクエストに 64 個までなので、意味が 3 つ以上
|
|
1153
|
+
なら行数はそれより少なくなる)
|
|
764
1154
|
同じリクエストの行は互いの文脈になるので、小さくすると速さだけでなく曖昧な行の
|
|
765
1155
|
判定も変わる
|
|
766
|
-
-j N 同時リクエスト数 (既定 8)
|
|
1156
|
+
-j N 同時リクエスト数 (既定 8。ローカル URL (localhost・127.0.0.1・[::1]) では 1)
|
|
767
1157
|
-n 行番号を付ける
|
|
768
1158
|
--unit=UNIT 判定の単位: line (既定)、zero、sentence-by-jev、sentence-by-rule、function
|
|
769
1159
|
-z, --null-data --unit=zero。行ではなく NUL 終端のレコードごとに判定し、NUL 終端で出力する (前述の「複数行にまたがるレコード」を参照)。
|
|
770
1160
|
--unit=sentence-by-* と併用すると、レコードごとに文に分ける
|
|
771
1161
|
--unit=sentence-by-jev|sentence-by-rule 行ではなく文ごとに判定する (前述の「1 文ずつ判定する」を参照)
|
|
772
1162
|
--unit=function 関数ごとに判定し、当たった関数の行を出す (前述の「関数ごとに判定する」を参照)
|
|
773
|
-
|
|
1163
|
+
--step-to 式 前の式に当たる関数から呼び出しをたどり、後ろの式に当たる関数までのパスを出す
|
|
1164
|
+
(前述の「関数から関数へたどる」を参照)
|
|
1165
|
+
--step-reverse-to 式 --step-to と同じだが、辺を逆向きに (呼ばれる側から呼ぶ側へ) たどる
|
|
1166
|
+
--edges=FILE 呼び出しの代わりに FILE の辺をたどる
|
|
1167
|
+
--hops=N|M..N|M.. 終点のホップ数 (既定 0..)
|
|
1168
|
+
-o 正規表現の一致だけを grep -o のように 1 行ずつ出す (意味だけで当たった行は行全体)。
|
|
1169
|
+
--unit=sentence-by-* では当たった文だけを出す
|
|
774
1170
|
-p 各意味の確率を行末に表示 (閾値調整用)
|
|
775
1171
|
--dry-run 何も送らず、この検索が使う設定 (コマンドラインでなければその出どころも)・検索するファイル・
|
|
776
1172
|
各リクエストとその質問を表示
|
|
777
1173
|
--verbose 同じ表示を検索しながら stderr に出す
|
|
778
1174
|
-i, --interactive --dry-run と同じ内容を見せ、端末で y と答えたときだけ検索する
|
|
779
1175
|
-M NUM, --max-columns=NUM 行 (-z ならレコード) の先頭 NUM 文字までを送る。判定はそれでもされる
|
|
780
|
-
(NUM より先にしか無い一致だけ見つからない)。既定 2000、-z なら 8000
|
|
1176
|
+
(NUM より先にしか無い一致だけ見つからない)。既定 2000、-z と --unit=function なら 8000
|
|
781
1177
|
--max-filesize=SIZE 対象を先に計測 (K/M/G、既定 10M)。超えるものは rg の --max-filesize と同じく
|
|
782
1178
|
無条件に飛ばす (-y は効かない)。標準入力は読んでから計測し、超えていれば同じく飛ばす。
|
|
783
1179
|
--cached / <tree>: の対象は blob で、その内容から計測する。-g のコミットはここに
|
|
@@ -785,23 +1181,48 @@ usage: sys1grep [OPTION]... -e MEANING|-Q QUESTION [-a MEANING] [-v MEANING]...
|
|
|
785
1181
|
--max-cost=USD 送る予定の入力を見積もって値段を出す。超えれば (既定 1) 端末で続けるか聞く。
|
|
786
1182
|
-y は聞かずに yes と答える。端末が無く超えていれば終了コード 2、-q でも変わらない
|
|
787
1183
|
(スクリプトからは -y)。-i は無条件かつこれより前に聞くので二重には聞かない
|
|
788
|
-
--
|
|
1184
|
+
-y, --yes その問いに聞かずに yes と答える
|
|
1185
|
+
--dedup[=auto|always|never] テンプレートごとに 1 行だけ判定し、その答えを残りにも使う (当面の既定は never。
|
|
1186
|
+
前述の「テンプレートごとに 1 行だけ判定する」を参照)
|
|
1187
|
+
--cache[=on|off|only] 前に送ったリクエストは ~/.config/sys1grep/cache から無料で答える。only は送らず、
|
|
1188
|
+
キャッシュに無ければ終了コード 2 (-q が先に一致を見つけていれば 0。既定 off、SYS1GREP_CACHE。
|
|
1189
|
+
前述の「送る量を減らす」を参照)。
|
|
1190
|
+
--cache=clear (単独で) で空にする
|
|
1191
|
+
--rank[=jev|match] 結果 (一致とその文脈) を良いものから順に番号付きの見出しの下に出す。jev (値なしの
|
|
1192
|
+
--rank) は各結果を Jev に聞き、match は最も高い一致の確率で並べる (前述の「良いものから順に出す」を参照)。--no-rank でファイル順
|
|
1193
|
+
--summarize[=TOOL] 表示するはずの内容を TOOL (既定 claude、または SYS1GREP_SUMMARIZER) に渡し、行の代わりに
|
|
1194
|
+
その要約を出す。--summarize=ask は行を出してから端末で聞く。--no-summarize で取り消す
|
|
1195
|
+
(前述の「行の代わりに要約を出す」を参照)
|
|
1196
|
+
--summarize-prompt=TEXT 固定の指示の後ろに足す自分の指示。--summarize が要る
|
|
1197
|
+
--format=FORMAT plain (既定) / markdown / html。--rank の出力、または --summarize の TOOL に求める形式
|
|
1198
|
+
--serve[=PORT] 検索せず、127.0.0.1 で検索ページを開く。--suggest=Q:TEXT / e:TEXT で質問の候補ボタンを足す
|
|
1199
|
+
(前述の「検索ページ」を参照)
|
|
1200
|
+
--template=NAME --rank か --summarize の --format=html が書く文書。~/.config/sys1grep/templates/NAME.html、無ければ同梱のもの
|
|
1201
|
+
(default, print, search, terminal)、またはファイル。既定は SYS1GREP_TEMPLATE、無ければ default。
|
|
1202
|
+
--template=list は名前を出す (前述の「HTML のテンプレート」を参照)
|
|
1203
|
+
--install-templates 同梱のテンプレートを ~/.config/sys1grep/templates へコピーする。既にあるファイルは残す
|
|
789
1204
|
--color[=WHEN] 色付け。auto (端末なら付ける、既定) / always / never。=WHEN 省略時は auto
|
|
790
1205
|
ファイル名・行番号は grep と同じ配色。-p の確率は閾値以上を緑、
|
|
791
1206
|
否定側の閾値未満を赤、あいだを黄で表示。NO_COLOR にも従う
|
|
792
1207
|
--sys1-model=ID, --sys1-url=URL, --sys1-api-key=KEY
|
|
793
1208
|
API の設定。SYS1GREP_MODEL / SYS1GREP_URL / SYS1GREP_API_KEY より優先
|
|
794
|
-
|
|
1209
|
+
--lang=en|ja このヘルプの言語、および --serve のページの既定言語。SYS1GREP_LANG より優先
|
|
1210
|
+
-h, --help このヘルプ (--lang / SYS1GREP_LANG が設定されていればそれ、無ければ LC_ALL / LC_MESSAGES /
|
|
1211
|
+
LANG のうち最初に設定されたものが ja 以外なら英語)
|
|
795
1212
|
-V, --version バージョンを表示して終了
|
|
796
1213
|
```
|
|
797
1214
|
|
|
798
1215
|
FILE を省略すると stdin を読みます。複数ファイルなら `file:` を前置きします。
|
|
799
1216
|
終了コードは grep と同じで、一致あり 0、なし 1、エラー 2(引数エラー、読めないファイル、API 障害)です。
|
|
1217
|
+
行を送ったうえで終了コード 1 になるときは、最も高かった確率とその行、閾値を緩めるオプション (緩めても届かないときは出さない)、全行の確率を見る `-p -t 0` (否定があれば `-T 1` も) を stderr に 1 行出します
|
|
1218
|
+
(`sys1grep: no line reached 0.5 for "…"; the highest was 0.42 (app.log:118). ...`)。`-q`・`--step-to`・`--step-reverse-to` のときと、否定の意味だけで行が落ちたときは出しません。
|
|
800
1219
|
|
|
801
1220
|
### 式の書き方
|
|
802
1221
|
|
|
803
|
-
`-e`
|
|
1222
|
+
`-e` と `-P` がそれぞれ OR の項を始めます。前者は常に意味、後者は常に正規表現です。`-a` / `-v` は
|
|
1223
|
+
直前の項に AND / AND NOT で連結します。
|
|
804
1224
|
意味の先頭に `!` を付けるとその意味だけを否定できます(シェルの履歴展開を避けるためシングルクォートで囲んでください)。
|
|
1225
|
+
`-P` の値の先頭に `!` を付けることはできません。正規表現の否定は `-v '/RE/'` で行います。
|
|
805
1226
|
|
|
806
1227
|
| コマンド | 意味 |
|
|
807
1228
|
|---|---|
|
|
@@ -814,10 +1235,10 @@ FILE を省略すると stdin を読みます。複数ファイルなら `file:`
|
|
|
814
1235
|
|
|
815
1236
|
## 仕組み
|
|
816
1237
|
|
|
817
|
-
1. 空行を除いた行を 30
|
|
1238
|
+
1. 空行を除いた行を 30 行ずつ(文字数上限と、1 リクエスト 64 質問までの上限つき)のチャンクに分ける
|
|
818
1239
|
2. チャンクを `{"L000": "行1", "L001": "行2", ...}` という object として `state` に入れ、
|
|
819
1240
|
行 × 意味 の数だけ `noul`(yes/no 確率)質問を 1 リクエストにまとめて送る
|
|
820
|
-
3. 8
|
|
1241
|
+
3. 8 本まで並列にリクエストし(`-j`。ローカル URL では 1 本)、結果はファイル順に出力する
|
|
821
1242
|
4. 各行について、意味ごとの確率を閾値で真偽に変え、AND / OR / NOT の式を評価する
|
|
822
1243
|
|
|
823
1244
|
一緒に送った行は互いの文脈になります。Jev はチャンクのほかの行から、そのファイルで何が普通かを読み取って
|
|
@@ -840,19 +1261,24 @@ FILE を省略すると stdin を読みます。複数ファイルなら `file:`
|
|
|
840
1261
|
precision / recall を出します。あわせて `-t` × `-T` を 0.05 刻みで総当たりし、最良の閾値を報告します。
|
|
841
1262
|
|
|
842
1263
|
```sh
|
|
843
|
-
|
|
1264
|
+
npm run judge [-- --model sonnet] [--rejudge] # tests/judge.mts を動かす。.mts には Node 23.6 以降が要る
|
|
844
1265
|
```
|
|
845
1266
|
|
|
846
1267
|
ジャッジの判定は `tests/verdicts.json` にキャッシュされ、2 回目以降はジャッジを呼びません。
|
|
847
1268
|
結果は `tests/report.md` に書き出されます。直近の結果は precision 0.94、recall 0.98 です。
|
|
848
1269
|
|
|
1270
|
+
テストの入口はこれだけではありません。`npm run test:offline` は偽の Jev(`tests/fake-jev.mjs`)を相手に sys1grep 自身を
|
|
1271
|
+
確かめます。キーもネットワークも要らず、毎回同じ結果になります(`OFFLINE_ONLY=PATTERN` で一致する節だけ走らせられます)。
|
|
1272
|
+
`npm test` はそれに本物の Jev に対する `tests/check.sh` を足します。入口の一覧と、それぞれが何を確かめ何を要するかは
|
|
1273
|
+
[CLAUDE.md](CLAUDE.md) にあります。
|
|
1274
|
+
|
|
849
1275
|
## 制約
|
|
850
1276
|
|
|
851
|
-
- 検索した行はすべて api.typesafe.ai
|
|
1277
|
+
- 検索した行はすべて api.typesafe.ai(または `SYS1GREP_URL` の指す先)に送られます。そこにアップロードしたくないファイルには使わないでください。
|
|
852
1278
|
- 空行は送らず、全意味の確率 0 として扱います。`-v X` には当たり、`-e X` には当たりません。
|
|
853
|
-
- 1 行は 2,000
|
|
854
|
-
- 1 リクエストの質問数上限は公式に書かれていませんが、420 質問は通っています。
|
|
855
|
-
- 429
|
|
1279
|
+
- 1 行は 2,000 文字で切って送ります(`-z` と `--unit=function` では 8,000 文字。`-M` で変えられます)。
|
|
1280
|
+
- 1 リクエストの質問数上限は公式に書かれていませんが、420 質問は通っています。sys1grep 自身は 1 リクエスト 64 質問で分けます(Clef の上限)。超えるのは 1 単位に 65 以上の意味を聞くときだけです。
|
|
1281
|
+
- 429・529 などの 5xx、接続エラー、タイムアウトは指数バックオフで 6 回まで再試行します。
|
|
856
1282
|
- 精度は英語がもっとも高く、日本語も使えますがぶれは大きめです。
|
|
857
1283
|
|
|
858
1284
|
## よくある質問
|