@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.
@@ -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` を調整する。