agent-gatewayの全レイヤー整理
agent-gatewayの4ドメイン、infra、transportをClean Architectureに沿って整理しました。AIシステム開発での責務分離と、変更後のテスト修正を紹介します。
変更の範囲
agent-gateway の knowledge / llm / obsidian / pipeline の4ドメインと、infra、transport 層を Clean Architecture に沿って整理しました。v3 リデザインでのドメイン分割を引き継いだ変更です。3月17日から23日の5セッション、ctree rev 0007 から 0032 の約25リビジョンで進めました。
前提
- v3 リデザインで
pipeline.knowledge.*をllm/obsidian/mlflowの3ドメインに分割済み
llm domainの依存分離
3月17日、knowledge domain の整理を終え、llm domain に着手しました。
開始時の ctree check では Go の最新リビジョンは 0007 でした。serena の5つのプロジェクトメモリで設計方針を確認しました。
llm domain は knowledge domain と同じ構成にしました。domain 層にビジネスロジックを置き、外部依存を infra 層に分ける方針です。
obsidian domainとイベント名
同日 15:05、obsidian domain を整理しました。
確認した点は、vault の差し替えとイベント名の重複です。
obsidian domain の設計
複数の Obsidian vault を差し替えられる repo 構成を採用しました。internal/domain/obsidian/service.go(L18-25)の振る舞いを、ctree の依存情報で確認しました。
重複イベント名の問題
internal/domain/knowledge/service.go(L42-44)には重複したイベント名がありました。NATS トピックへの publish に同じ名前を使っていたため、Dagster 側でメッセージを区別しにくくなっていました。
ctree rev 0018 から 0019 では、context_enricher.go に RerankRequest、RerankItem、RerankResult の3つの型が追加されました。
obsidian domain を複数 vault に対応するリポジトリ構成に変え、イベント名の重複を解消しました。
pipelineの状態管理とinfra
同日 15:38 の ctree check では、Go の rev 0020 から 0021 に次の変更がありました。
internal/domain/pipeline/entity.goからtype Task、type JobStatus、type Jobの3シンボルが削除
pipeline domain からこれらの型を削除し、状態管理を NATS JetStream / Dagster に委譲しました。この変更に合わせて infra 層も修正しました。
@infra ディレクトリを対象に、実装を確認して整理しました。
HTTP transportの境界
同日 17:07、rev 10 から進めた domain と infra の整理を終え、transport layer に移りました。
開始時の ctree check は Go 0032 で、変更はありませんでした。対象は internal/transport/http/ 以下の Gin ルーティング、ハンドラー、ミドルウェアです。
pkg/anthropic/ の型定義(ContentBlock、ImageSource、Tool、ToolChoice、Usage、Metadata)を確認し、ハンドラーから domain 層のインターフェースを呼ぶ構成を整理しました。
transport layer では次の3点を変更しました。
- ハンドラーが domain サービスのインターフェースに対して依存するよう修正
- リクエスト / レスポンスの DTO 変換を transport 層に閉じ込める
- ミドルウェアのコンテキスト伝播(CorrelationID)が domain 層まで届かないよう境界を明確化
変更に合わせたテスト修正
3月23日、複数セッションの変更が conflict を起こし、テストと実装に不一致が見つかりました。
変更したドメイン型やインターフェースがテストに反映されておらず、複数箇所でコンパイルエラーやテスト失敗が発生しました。
serena の find_symbol / find_referencing_symbols で参照を探し、次の修正を行いました。
- 削除 / 改名されたシンボルへの参照をテストファイルで更新
- リファクタで変わったインターフェースシグネチャにテストのモックを合わせる
- infra 層の変更に追随していなかった統合テストの修正
結果
4ドメイン、infra、transport の整理を完了しました。AIシステム開発で外部サービスを差し替える際も、domain の責務を保つ構成です。
| レイヤー | 変更内容 |
|---|---|
| knowledge domain | リランク型の整理(RerankRequest / RerankItem / RerankResult) |
| llm domain | Clean Architecture に沿った依存整理 |
| obsidian domain | 複数 vault 差し替え可能な設計に再構成 |
| pipeline domain | Task / JobStatus / Job 型の削除(外部サービスへの委譲) |
| infra | domain 変更に追随した adapter 更新 |
| transport | ハンドラーの domain インターフェース依存への整理 |
ctree の rev 0007 から 0032 で、各セッションの変更を追跡しました。
