状態と処理を分ける
エージェントを単一の Worker に閉じ込めると、再試行、待機、同時実行の境界が曖昧になります。Wazaly では役割を次のように分けます。
| 機能 | 担当 | 理由 |
|---|---|---|
| 会話と現在状態 | Durable Object | entity単位の強整合性 |
| 長時間の調査 | Workflow | stepごとの再試行と永続化 |
| 大量の収集 | Queue | backpressureと失敗隔離 |
| 生データ | R2 | 安価なimmutable snapshot |
Diagram loading…
実装の要点
Queue consumer ではメッセージ単位に失敗を扱い、外部 API へのアクセスは必ず timeout と idempotency key を持たせます。
export async function normalizeSource(input: SourceSnapshot) {
return {
id: input.canonicalUrl,
fetchedAt: new Date().toISOString(),
checksum: await sha256(input.body),
} satisfies NormalizedSource;
}
この分離により、公開サイトは収集処理の遅延や Vertex AI の一時障害から独立できます。