@rex0220/llm-task-router 0.1.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/.env.example +6 -0
- package/LICENSE +21 -0
- package/README.ja.md +147 -0
- package/README.md +147 -0
- package/config/criteria/default.md +43 -0
- package/config/criteria/note.md +32 -0
- package/config/models.yaml +111 -0
- package/config/profiles/blog.yaml +9 -0
- package/config/profiles/note.yaml +11 -0
- package/config/profiles/qiita.yaml +13 -0
- package/config/profiles/zenn.yaml +9 -0
- package/dist/llm-task-router.js +1465 -0
- package/docs/api-smoke-test.md +291 -0
- package/docs/thin-model-router-design.md +1069 -0
- package/docs/thin-model-router-implementation-plan.md +479 -0
- package/package.json +74 -0
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
# 実API疎通手順
|
|
2
|
+
|
|
3
|
+
作成日: 2026-06-16
|
|
4
|
+
|
|
5
|
+
この手順は、`llm-task-router` を最小トピックで実APIに接続し、Qiita記事ワークフローが最後まで動くか確認するためのものです。
|
|
6
|
+
|
|
7
|
+
## 1. 前提
|
|
8
|
+
|
|
9
|
+
- `npm install` が完了している
|
|
10
|
+
- `npm run build` が成功する
|
|
11
|
+
- `npm test` が成功する
|
|
12
|
+
- OpenAI または Anthropic のAPIキーを少なくとも1つ持っている
|
|
13
|
+
|
|
14
|
+
確認:
|
|
15
|
+
|
|
16
|
+
```powershell
|
|
17
|
+
npm run build
|
|
18
|
+
npm test
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## 2. APIキーを設定する
|
|
22
|
+
|
|
23
|
+
`.env.example` を元に `.env` を作成し、使うProviderのキーだけ設定する。
|
|
24
|
+
|
|
25
|
+
```powershell
|
|
26
|
+
Copy-Item .env.example .env
|
|
27
|
+
notepad .env
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
OpenAIだけで疎通する場合:
|
|
31
|
+
|
|
32
|
+
```env
|
|
33
|
+
OPENAI_API_KEY_ARTICLE=sk-...
|
|
34
|
+
ANTHROPIC_API_KEY_ARTICLE=
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
`config/models.yaml` の `providers.*.api_key_env` を未設定にする場合は、標準名 `OPENAI_API_KEY` / `ANTHROPIC_API_KEY` でも読み込まれる(`api_key_env` が空のときのフォールバック)。
|
|
38
|
+
|
|
39
|
+
Anthropicだけで疎通する場合:
|
|
40
|
+
|
|
41
|
+
```env
|
|
42
|
+
OPENAI_API_KEY_ARTICLE=
|
|
43
|
+
ANTHROPIC_API_KEY_ARTICLE=sk-ant-...
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
両方ある場合:
|
|
47
|
+
|
|
48
|
+
```env
|
|
49
|
+
OPENAI_API_KEY_ARTICLE=sk-...
|
|
50
|
+
ANTHROPIC_API_KEY_ARTICLE=sk-ant-...
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
`.env` はGit管理しない。
|
|
54
|
+
|
|
55
|
+
## 3. モデル名を確認する
|
|
56
|
+
|
|
57
|
+
`config/models.yaml` の初期値にはプレースホルダが含まれるため、実行前に現在利用できるモデルIDへ差し替える。
|
|
58
|
+
|
|
59
|
+
公式ドキュメント:
|
|
60
|
+
|
|
61
|
+
- [OpenAI Models](https://platform.openai.com/docs/models)
|
|
62
|
+
- [Anthropic Models overview](https://docs.anthropic.com/en/docs/about-claude/models/overview)
|
|
63
|
+
|
|
64
|
+
OpenAIだけで最小疎通する場合は、まず全タスクをOpenAIの同一モデルに寄せると切り分けしやすい。
|
|
65
|
+
キー未設定のProviderは実行時に自動でスキップされるため、anthropic の fallback 行は無理に消さなくてもよい(キーが無ければ候補から外れ、primary が使われる)。
|
|
66
|
+
|
|
67
|
+
例(`tasks` ブロックのみの抜粋。`providers` / `prices` / `defaults` は既存のまま残す。ワークフローが使わない `markdown_format` / `title_suggestions` は省略可):
|
|
68
|
+
|
|
69
|
+
```yaml
|
|
70
|
+
tasks:
|
|
71
|
+
article_brief:
|
|
72
|
+
primary:
|
|
73
|
+
provider: openai
|
|
74
|
+
model: <openai-model-id>
|
|
75
|
+
temperature: 0.2
|
|
76
|
+
max_tokens: 1200
|
|
77
|
+
|
|
78
|
+
outline:
|
|
79
|
+
primary:
|
|
80
|
+
provider: openai
|
|
81
|
+
model: <openai-model-id>
|
|
82
|
+
temperature: 0.2
|
|
83
|
+
max_tokens: 1200
|
|
84
|
+
|
|
85
|
+
draft_markdown:
|
|
86
|
+
primary:
|
|
87
|
+
provider: openai
|
|
88
|
+
model: <openai-model-id>
|
|
89
|
+
temperature: 0.3
|
|
90
|
+
max_tokens: 2000
|
|
91
|
+
|
|
92
|
+
technical_review:
|
|
93
|
+
primary:
|
|
94
|
+
provider: openai
|
|
95
|
+
model: <openai-model-id>
|
|
96
|
+
temperature: 0.2
|
|
97
|
+
max_tokens: 1200
|
|
98
|
+
|
|
99
|
+
rewrite:
|
|
100
|
+
primary:
|
|
101
|
+
provider: openai
|
|
102
|
+
model: <openai-model-id>
|
|
103
|
+
temperature: 0.3
|
|
104
|
+
max_tokens: 2000
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
推論系モデルなど、`temperature` を受け付けないモデルではProvider側が送信を抑制する。ただし、モデル名は必ず実行時点の公式ドキュメントやダッシュボードで確認する。
|
|
108
|
+
|
|
109
|
+
## 4. 最小トピックで実行する
|
|
110
|
+
|
|
111
|
+
短いテーマで `article:create` を実行する。
|
|
112
|
+
|
|
113
|
+
```powershell
|
|
114
|
+
llm-task-router article:create --topic "TypeScriptでJSONを安全に読む"
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
長文の指示(対象読者・論点・制約など)を渡す場合はテキストファイルを使う。
|
|
118
|
+
|
|
119
|
+
```powershell
|
|
120
|
+
llm-task-router article:create --topic-file topics/json-safe.txt
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
`--topic` と `--topic-file` はどちらか一方を指定する(両方指定するとエラー)。`--topic-file` のときの `runId` はファイル名から生成される(例: `json-safe.txt` → `2026-06-16-json-safe`)。なお `.env` などの秘密ファイルは指示ファイルとして読み込めない。
|
|
124
|
+
|
|
125
|
+
実行中は各工程の進捗が stderr に表示される(`runId` / `final` パスは stdout)。使用provider/model・所要時間・概算コストが出るため、フォールバックの有無やおおよその費用をここで確認できる。
|
|
126
|
+
|
|
127
|
+
```text
|
|
128
|
+
[1/5] brief (article_brief) ...
|
|
129
|
+
[1/5] brief - done via openai/gpt-5.4 (2310ms, ~$0.0123)
|
|
130
|
+
...
|
|
131
|
+
total: ~$0.1240 (estimate)
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
コストは `models.yaml` の `prices` に基づくローカル概算で、表示のための追加APIコールは無い。単価は価格改定で変わるため、`prices` は定期的に確認する。
|
|
135
|
+
|
|
136
|
+
成功すると次のような出力になる。
|
|
137
|
+
|
|
138
|
+
```text
|
|
139
|
+
runId: 2026-06-16-typescript-json
|
|
140
|
+
final: runs/2026-06-16-typescript-json/final.md
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
## 5. 成果物を確認する
|
|
144
|
+
|
|
145
|
+
表示された `runId` に合わせて、生成物を確認する。
|
|
146
|
+
|
|
147
|
+
```powershell
|
|
148
|
+
Get-ChildItem runs\<runId>
|
|
149
|
+
Get-Content runs\<runId>\meta.json
|
|
150
|
+
Get-Content runs\<runId>\final.md
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
期待されるファイル:
|
|
154
|
+
|
|
155
|
+
- `brief.json`
|
|
156
|
+
- `outline.json`
|
|
157
|
+
- `draft.md`
|
|
158
|
+
- `review.json`
|
|
159
|
+
- `final.md`
|
|
160
|
+
- `meta.json`
|
|
161
|
+
|
|
162
|
+
`meta.json` の各stepが `done` になっていれば、ワークフロー完走。
|
|
163
|
+
|
|
164
|
+
## 6. ログを確認する
|
|
165
|
+
|
|
166
|
+
Routerログを確認する。
|
|
167
|
+
|
|
168
|
+
```powershell
|
|
169
|
+
Get-Content runs\router.log
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
確認ポイント:
|
|
173
|
+
|
|
174
|
+
- `status` が `success` になっている
|
|
175
|
+
- `input_hash` はあるが、全文プロンプトは保存されていない
|
|
176
|
+
- APIキーが保存されていない
|
|
177
|
+
- fallbackが起きた場合、失敗行の `error_kind` を確認できる
|
|
178
|
+
|
|
179
|
+
## 7. 途中で失敗した場合
|
|
180
|
+
|
|
181
|
+
途中成果物がある場合は、同じ `runId` で再開する。
|
|
182
|
+
|
|
183
|
+
```powershell
|
|
184
|
+
llm-task-router article:resume --run <runId>
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
レビュー工程以降だけ再実行する場合:
|
|
188
|
+
|
|
189
|
+
```powershell
|
|
190
|
+
llm-task-router article:review --run <runId>
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
`final.md` に自由な修正指示を反映する場合:
|
|
194
|
+
|
|
195
|
+
```powershell
|
|
196
|
+
llm-task-router article:revise --run <runId> --instruction "前半を簡潔に。専門用語は初出で1行説明"
|
|
197
|
+
# 長文の指示はファイルでも渡せる
|
|
198
|
+
llm-task-router article:revise --run <runId> --instruction-file work/revise.md
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
`article:revise` は現在の `final.md` を `final.bak.md` に退避してから上書きする。
|
|
202
|
+
|
|
203
|
+
`final.md` を評価し、修正指示の草案を生成する場合(標準は評価観点テンプレを渡す):
|
|
204
|
+
|
|
205
|
+
```powershell
|
|
206
|
+
llm-task-router article:evaluate --run <runId> --min-severity minor
|
|
207
|
+
# 評価観点は run の profile(meta.json)から自動解決される(config/criteria/*.md)
|
|
208
|
+
# -> runs/<runId>/final-review.json, runs/<runId>/final-review.md, runs/<runId>/revise-instruction.md
|
|
209
|
+
llm-task-router article:revise --run <runId> --instruction-file runs/<runId>/revise-instruction.md
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
評価は審査役(本文と別系統のモデル)で行う。観点は profile の `criteria_file`(`config/criteria/*.md`)で対象ごとに固定され、比較可能になる。一回限り別観点で見たいときは `--criteria-file <path>` で上書きする。
|
|
213
|
+
|
|
214
|
+
## 8. よくある失敗
|
|
215
|
+
|
|
216
|
+
### APIキー未設定
|
|
217
|
+
|
|
218
|
+
症状:
|
|
219
|
+
|
|
220
|
+
キーが無いProviderは未登録としてスキップされ、候補を使い切ると次のメッセージで終了する。
|
|
221
|
+
|
|
222
|
+
```text
|
|
223
|
+
All model candidates failed: Provider is not registered: openai
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
確認:
|
|
227
|
+
|
|
228
|
+
- `.env` に `OPENAI_API_KEY_ARTICLE` または `ANTHROPIC_API_KEY_ARTICLE` が入っているか
|
|
229
|
+
- `config/models.yaml` の `providers.*.api_key_env` と `.env` の名前が一致しているか
|
|
230
|
+
|
|
231
|
+
### モデル名が不正
|
|
232
|
+
|
|
233
|
+
症状:
|
|
234
|
+
|
|
235
|
+
CLI標準出力には次の形で出る。
|
|
236
|
+
|
|
237
|
+
```text
|
|
238
|
+
All model candidates failed: <SDKのエラーメッセージ>
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
`runs/router.log` の `error_kind` は、多くの場合 404 のため `unknown`、400 を返すProviderでは `bad_request` になる。いずれもfallbackせず即停止する。
|
|
242
|
+
|
|
243
|
+
対応:
|
|
244
|
+
|
|
245
|
+
- 公式モデル一覧でモデルIDを確認する
|
|
246
|
+
- `config/models.yaml` の全タスクの `model` を修正する
|
|
247
|
+
|
|
248
|
+
### 課金枠不足
|
|
249
|
+
|
|
250
|
+
症状:
|
|
251
|
+
|
|
252
|
+
`runs/router.log` に以下のような行が出る。
|
|
253
|
+
|
|
254
|
+
```json
|
|
255
|
+
{"error_kind":"billing_quota"}
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
対応:
|
|
259
|
+
|
|
260
|
+
- 課金設定、利用上限、プロジェクト上限を確認する
|
|
261
|
+
- このエラーは安全のためfallbackしない
|
|
262
|
+
|
|
263
|
+
### rate limit または timeout
|
|
264
|
+
|
|
265
|
+
症状:
|
|
266
|
+
|
|
267
|
+
`runs/router.log` に以下のような `error_kind` が出る。
|
|
268
|
+
|
|
269
|
+
```text
|
|
270
|
+
rate_limit
|
|
271
|
+
timeout
|
|
272
|
+
overloaded
|
|
273
|
+
service_unavailable
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
対応:
|
|
277
|
+
|
|
278
|
+
- fallback候補が設定されていれば次candidateへ進む
|
|
279
|
+
- 片方のProviderキーしかない場合は、同Provider内の別モデルをfallbackに設定すると切り分けしやすい
|
|
280
|
+
- `defaults.timeout_ms` またはタスク別 `timeout_ms` を一時的に伸ばす
|
|
281
|
+
|
|
282
|
+
## 9. 疎通完了の判断
|
|
283
|
+
|
|
284
|
+
以下を満たせば最小疎通は完了。
|
|
285
|
+
|
|
286
|
+
- `llm-task-router article:create --topic "TypeScriptでJSONを安全に読む"` が終了する
|
|
287
|
+
- `runs/<runId>/final.md` が生成される
|
|
288
|
+
- `runs/<runId>/meta.json` の全stepが `done`
|
|
289
|
+
- `runs/router.log` にAPIキーや全文プロンプトが含まれていない
|
|
290
|
+
|
|
291
|
+
疎通後、必要に応じて `config/models.yaml` のタスク別primary/fallback、`max_tokens`、単価設定 `prices` を調整する。
|