Documentation Index
Fetch the complete documentation index at: https://docs.arkor.ai/llms.txt
Use this file to discover all available pages before exploring further.
ライフサイクルコールバック
コールバックはcreateTrainer({ callbacks: { ... } }) の下に渡します。5 つすべてオプションで、SDK 上の型は Partial<TrainerCallbacks> です。バックエンドの SSE イベントストリームから trainer.wait() 内でディスパッチされて動きます。
それぞれのコールバックがいつ発火するか
start() を呼んで wait() を呼ばないと、コールバックは決して動きません。arkor start は両方呼んでくれます。プログラムから呼び出す側も同じことをしてください。
onStarted({ job })
SSE ストリームが training.started を報告したときに発火します。ログ行や「学習開始しました」通知に使ってください。
onLog({ step, loss, evalLoss, learningRate, epoch, samplesPerSecond, job })
学習が進むにつれて繰り返し発火します。各数値フィールドは number | null: バックエンドはあるステップで持っているフィールドだけ埋めます(なので evalLoss は eval 以外のステップで null、learningRate は LR スケジューラ更新の合間に null、等)。
abortSignal の abort はあなたのローカル wait() を止めるだけだと忘れずに。バックエンドの GPU を実際に止めるには、その後 trainer.cancel() を呼んでください。
onCheckpoint({ step, adapter, job, infer, artifacts })
学習中にバックエンドでアダプタチェックポイントが保存されたときに発火します。adapter は { kind: "checkpoint", jobId, step }。infer の詳細は infer ページにあります。要するにチャット形式のリクエストを取り、生の Response を返す関数です。
onCompleted({ job, artifacts })
成功時に 1 回発火。artifacts は unknown[]: バックエンドが送った生の artifact リスト。スキーマは進化するため SDK で絞り込みません。
onFailed({ job, error })
バックエンド報告の失敗で 1 回発火。error は string(バックエンドが送ったメッセージ)であり、Error インスタンスではありません。
onFailed は バックエンド側の 失敗専用です。あなたの他のコールバック内で投げられた例外は onFailed には届きません。何が起きるかは下記。
順序
各コールバックは次のイベントがディスパッチされる前に await されます。Promise を返してよく(DB への書き込み、Slack への投稿、infer の呼び出し等)、SDK は次のフレーム処理前にそれを待ちます。同一トレーナーに対する並行ディスパッチはありません。
例外ハンドリング(よく読んでください)
コールバック内で throw しても通常の Promise reject のようには 振る舞いません。SDK のイベントループは dispatch を try/catch で包み、throw を SSE 再接続ハンドラ(packages/arkor/src/core/trainer.ts:335-364、続いて :307-320 の handleFailure)にルートします:
abortSignal.abortedが立っていれば、エラーは再 throw されwait()は reject。- それ以外で
maxReconnectAttemptsが設定されカウンタ超過なら、wait()はラップされたエラーで reject。 - それ以外なら、SDK は遅延を入れて SSE ストリームを再オープン。
maxReconnectAttempts のデフォルトは undefined(無制限)です。TrainerInput から設定はできず、createTrainer の第 2 引数 context(@internal 注釈付きで予告なく変わり得る)でしか設定できません。実用上、デフォルト設定では throw されたコールバックは catch されてリトライ され、無期限に続く可能性があります。Last-Event-ID がリトライ間で進めば、元の失敗イベント自体もスキップされます。
決定的なエラーハンドリングが必要ならコールバック内で catch してください:
型のスケッチ
TrainingLogContext と CheckpointContext は arkor から名前付きでエクスポートされていません。自分のコードで型付きコールバックパラメータが欲しいならインラインで形をミラーしてください。