
1. プロジェクト概要
A2A (Agent2Agent) .NET SDK は、Google の A2A Protocol v0.2.1 を実装する .NET ライブラリで、.NET アプリケーションでエージェント間通信を可能にします。この SDK は ASP.NET Core アプリケーションと連携するよう設計されており、エージェントに A2A サポートを追加する簡単な方法を提供します。
主要機能
- プロトコル互換性: A2A Protocol v0.2.1 のほとんどの機能を実装
- マルチフレームワークサポート: .NET 9.0、.NET 8.0、.NET Standard 2.0 をサポート
- ASP.NET Core 統合: シンプルな統合方法を提供
- タスク管理: 標準化されたタスク管理と実行サポート
- ストリーミング: リアルタイムストリーミングレスポンスをサポート
- OpenTelemetry: 組み込みテレメトリと可観測性サポート
プロジェクトステータス
ライブラリはプロトコル機能のほとんどを実装していますが、一部のシナリオはまだ不完全な場合があります。最大の欠落機能は、プッシュ通知を使用したクライアントコールバックです。
2. A2A .NET Core アーキテクチャ
2.1 プロジェクト構造
src/
├── A2A/ # コア A2A プロトコル実装
│ ├── Client/ # クライアントコンポーネント
│ ├── JsonRpc/ # JSON-RPC 実装
│ ├── Models/ # データモデル
│ ├── Server/ # サーバーサイドコンポーネント
│ └── openapi.yaml # API 仕様
└── A2A.AspNetCore/ # ASP.NET Core 統合
2.2 コアコンポーネント
- A2A Core Library: コアプロトコル実装を含む
- A2A.AspNetCore: ASP.NET Core 統合を提供
- Sample Projects: さまざまな使用シナリオを示すサンプルコード
3. A2A .NET クライアント実装
3.1 A2AClient クラス
A2AClient クラスは、エージェントとの通信のためのメインクライアントインターフェースで、IA2AClient インターフェースを実装します。
主要機能:
public class A2AClient : IA2AClient
{
// メッセージ送信
public Task<A2AResponse> SendMessageAsync(MessageSendParams taskSendParams)
// タスク取得
public Task<AgentTask> GetTaskAsync(string taskId)
// タスクキャンセル
public Task<AgentTask> CancelTaskAsync(TaskIdParams taskIdParams)
// ストリームメッセージ送信
public async IAsyncEnumerable<SseItem<A2AEvent>> SendMessageStreamAsync(MessageSendParams taskSendParams)
// タスク再購読
public async IAsyncEnumerable<SseItem<A2AEvent>> ResubscribeToTaskAsync(string taskId)
}
主要特徴:
- JSON-RPC 通信: すべての通信は JSON-RPC プロトコルを通じて実行
- ストリーミングレスポンス: リアルタイムストリーミングのための Server-Sent Events (SSE) をサポート
- シリアライゼーション最適化: 高性能シリアライゼーションのために System.Text.Json ソースジェネレーターを使用
- エラーハンドリング: 完全なエラーハンドリングと状態管理
3.2 JsonRpcContent クラス
JSON-RPC リクエスト専用の HTTP コンテンツクラス:
public class JsonRpcContent : HttpContent
{
public JsonRpcContent(JsonRpcRequest request)
{
_request = request;
Headers.ContentType = new MediaTypeHeaderValue("application/json");
}
}
3.3 A2ACardResolver クラス
エージェントカード情報の解析と取得に使用:
public class A2ACardResolver
{
public async Task<AgentCard> GetAgentCardAsync(Uri agentUri)
public async Task<AgentCard> GetAgentCardAsync(string agentUrl)
}
4. A2A .NET サーバー実装
4.1 TaskManager クラス
TaskManager は、タスクライフサイクル管理を担当するコアサーバーサイドコンポーネントです。
主要責任:
- タスクライフサイクル管理: タスクの作成、更新、キャンセル
- メッセージ処理: 受信メッセージとタスク更新の処理
- イベント配信: タスク状態変更イベントの管理
- ストレージ抽象化:
ITaskStoreインターフェースを通じたタスク永続化
コアメソッド:
public class TaskManager : ITaskManager
{
// イベントハンドラー
public Func<MessageSendParams, Task<Message>>? OnMessageReceived { get; set; }
public Func<AgentTask, Task> OnTaskCreated { get; set; }
public Func<AgentTask, Task> OnTaskCancelled { get; set; }
public Func<AgentTask, Task> OnTaskUpdated { get; set; }
public Func<string, AgentCard> OnAgentCardQuery { get; set; }
// コア操作
public async Task<AgentTask> CreateTaskAsync(string? contextId = null)
public async Task<AgentTask?> CancelTaskAsync(TaskIdParams? taskIdParams)
public async Task<A2AResponse?> SendMessageAsync(MessageSendParams messageSendParams)
public async Task<IAsyncEnumerable<A2AEvent>> SendMessageStreamAsync(MessageSendParams messageSendParams)
public async Task UpdateStatusAsync(string taskId, TaskState status, Message? message = null, bool final = false)
public async Task ReturnArtifactAsync(string taskId, Artifact artifact)
}
4.2 ITaskStore インターフェース
タスクストレージのための抽象インターフェース:
public interface ITaskStore
{
Task<AgentTask?> GetTaskAsync(string taskId);
Task SetTaskAsync(AgentTask task);
Task UpdateStatusAsync(string taskId, TaskState status);
}
4.3 ASP.NET Core 統合
A2A.AspNetCore ライブラリが提供する拡張メソッドを通じて:
// JSON-RPC A2A サポートを追加
app.MapA2A(taskManager, "/echo");
// HTTP A2A サポートを追加
app.MapHttpA2A(taskManager, "/echo");
5. A2A .NET データモデル
5.1 コアモデルクラス
AgentCard - エージェントカード
public class AgentCard
{
public string Name { get; set; } // エージェント名
public string Description { get; set; } // エージェント説明
public string Url { get; set; } // エージェント URL
public AgentProvider? Provider { get; set; } // プロバイダー情報
public string Version { get; set; } // バージョン情報
public AgentCapabilities Capabilities { get; set; } // エージェント機能
public List<AgentSkill> Skills { get; set; } // エージェントスキル
public List<string> DefaultInputModes { get; set; } // デフォルト入力モード
public List<string> DefaultOutputModes { get; set; }// デフォルト出力モード
}
AgentTask - エージェントタスク
public class AgentTask : A2AResponse
{
public string Id { get; set; } // タスク ID
public string? ContextId { get; set; } // コンテキスト ID
public AgentTaskStatus Status { get; set; } // タスクステータス
public List<Artifact>? Artifacts { get; set; } // タスクアーティファクト
public List<Message>? History { get; set; } // メッセージ履歴
public Dictionary<string, JsonElement>? Metadata { get; set; } // メタデータ
}
Message - メッセージ
public class Message : A2AResponse
{
public MessageRole Role { get; set; } // メッセージロール (User/Agent)
public List<Part> Parts { get; set; } // メッセージパーツ
public string? MessageId { get; set; } // メッセージ ID
public string? TaskId { get; set; } // 関連タスク ID
public string? ContextId { get; set; } // コンテキスト ID
public Dictionary<string, JsonElement>? Metadata { get; set; } // メタデータ
}
5.2 タスク状態
public enum TaskState
{
Submitted, // 送信済み
Working, // 作業中
InputRequired, // 入力必要
Completed, // 完了
Canceled, // キャンセル済み
Failed, // 失敗
Rejected // 拒否
}
5.3 メッセージパートタイプ
複数のメッセージパートタイプをサポート:
TextPart: テキストコンテンツFilePart: ファイルコンテンツDataPart: データコンテンツ
6. A2A .NET AgentServer サンプル詳細分析
6.1 プロジェクト概要
AgentServer サンプルは、以下を含む複数の異なるタイプのエージェントを作成・デプロイする方法を示します:
- EchoAgent: シンプルなエコーエージェント
- EchoAgentWithTasks: タスクサポート付きエコーエージェント
- HostedClientAgent: ホストされたクライアントエージェント
- ResearcherAgent: リサーチャーエージェント(ステートマシン実装)
6.2 EchoAgent 実装
public class EchoAgent
{
private ITaskManager? _taskManager;
public void Attach(TaskManager taskManager)
{
_taskManager = taskManager;
taskManager.OnMessageReceived = ProcessMessage;
taskManager.OnAgentCardQuery = GetAgentCard;
}
public Task<Message> ProcessMessage(MessageSendParams messageSendParams)
{
var messageText = messageSendParams.Message.Parts.OfType<TextPart>().First().Text;
var message = new Message()
{
Role = MessageRole.Agent,
MessageId = Guid.NewGuid().ToString(),
ContextId = messageSendParams.Message.ContextId,
Parts = [new TextPart() { Text = $"Echo: {messageText}" }]
};
return Task.FromResult(message);
}
}
6.3 ResearcherAgent 実装
ResearcherAgent はより複雑なステートマシン実装を示します:
public class ResearcherAgent
{
private enum AgentState
{
Planning, // 計画フェーズ
WaitingForFeedbackOnPlan, // 計画フィードバック待ち
Researching // 研究フェーズ
}
public async Task Invoke(string taskId, string message)
{
switch (_agentStates[taskId])
{
case AgentState.Planning:
await DoPlanning(taskId, message);
break;
case AgentState.WaitingForFeedbackOnPlan:
if (message == "go ahead")
await DoResearch(taskId, message);
else
await DoPlanning(taskId, message);
break;
case AgentState.Researching:
await DoResearch(taskId, message);
break;
}
}
}
7. AgentServer サンプルの実行方法
7.1 環境要件
- .NET 9.0 SDK 以上
- オプション: OpenTelemetry Collector(テレメトリデータ用)
7.2 実行手順
-
プロジェクトのクローン:
git clone https://github.com/a2aproject/a2a-dotnet cd a2a-dotnet -
サンプルディレクトリに移動:
cd samples/AgentServer -
プロジェクトの実行:
dotnet run -
サービス実行の確認: サービスは以下のポートで開始されます:
- HTTP: http://localhost:5048
- HTTPS: https://localhost:7014
7.3 利用可能なエンドポイント
/echo- シンプルなエコーエージェント/echotasks- タスクサポート付きエコーエージェント/hostedclient- ホストされたクライアントエージェント/researcher- リサーチャーエージェント
7.4 API 呼び出しのテスト
エージェントカードの取得
curl -X GET http://localhost:5048/echo/.well-known/agent.json
エコーエージェントへのメッセージ送信
curl -X POST http://localhost:5048/echo \
-H "Content-Type: application/json" \
-d '{
"id": "1",
"jsonrpc": "2.0",
"method": "message/send",
"params": {
"message": {
"messageId": "12345",
"role": "user",
"parts": [
{
"kind": "text",
"text": "Hello, world!"
}
]
}
}
}'
リサーチャーエージェントタスクの作成
curl -X POST http://localhost:5048/researcher \
-H "Content-Type: application/json" \
-d '{
"id": "1",
"jsonrpc": "2.0",
"method": "message/send",
"params": {
"message": {
"messageId": "research-1",
"role": "user",
"parts": [
{
"kind": "text",
"text": "Research the current price of butter"
}
]
}
}
}'
8. シーケンス図
8.1 シンプルなメッセージ処理シーケンス図
sequenceDiagram
participant Client as Client
participant Server as A2A Server
participant Agent as Agent Implementation
participant TaskMgr as TaskManager
Client->>Server: POST /echo (JSON-RPC message/send)
Server->>TaskMgr: SendMessageAsync()
TaskMgr->>Agent: OnMessageReceived()
Agent->>Agent: ProcessMessage()
Agent-->>TaskMgr: Return Message
TaskMgr-->>Server: Return A2AResponse
Server-->>Client: JSON-RPC Response
8.2 タスク処理シーケンス図
sequenceDiagram
participant Client as Client
participant Server as A2A Server
participant TaskMgr as TaskManager
participant Agent as Agent Implementation
participant Store as TaskStore
Client->>Server: POST /researcher (message/send)
Server->>TaskMgr: SendMessageAsync()
TaskMgr->>TaskMgr: CreateTaskAsync()
TaskMgr->>Store: SetTaskAsync()
TaskMgr->>Agent: OnTaskCreated()
Agent->>Agent: State Change (Planning)
Agent->>TaskMgr: UpdateStatusAsync(Working)
TaskMgr->>Store: UpdateStatusAsync()
Agent->>TaskMgr: ReturnArtifactAsync()
Agent->>TaskMgr: UpdateStatusAsync(InputRequired)
TaskMgr-->>Server: Return AgentTask
Server-->>Client: JSON-RPC Response
Note over Client,Store: Client sends follow-up message
Client->>Server: POST /researcher (message/send, taskId)
Server->>TaskMgr: SendMessageAsync()
TaskMgr->>Store: GetTaskAsync()
TaskMgr->>Agent: OnTaskUpdated()
Agent->>Agent: State processing logic
Agent->>TaskMgr: UpdateStatusAsync(Completed)
TaskMgr-->>Server: Return AgentTask
Server-->>Client: JSON-RPC Response
8.3 ストリーミング処理シーケンス図
sequenceDiagram
participant Client as Client
participant Server as A2A Server
participant TaskMgr as TaskManager
participant Agent as Agent Implementation
Client->>Server: POST /echo (JSON-RPC message/stream)
Server->>TaskMgr: SendMessageStreamAsync()
TaskMgr->>Agent: OnMessageReceived()
loop Streaming Response
Agent->>TaskMgr: Generate Event
TaskMgr->>Server: A2AEvent
Server->>Client: Server-Sent Event
end
Agent->>TaskMgr: Complete Processing
TaskMgr->>Server: End Stream
Server->>Client: Close Connection
9. A2A .NET 主要設計パターン
9.1 イベント駆動アーキテクチャ
TaskManager はイベント駆動パターンを使用:
OnMessageReceived: 受信メッセージの処理OnTaskCreated: タスク作成イベントOnTaskUpdated: タスク更新イベントOnTaskCancelled: タスクキャンセルイベント
9.2 ストラテジーパターン
異なるエージェント実装は異なる処理戦略を持つことができます:
- ステートレス処理 (EchoAgent)
- ステートフル処理 (ResearcherAgent)
- タスク指向処理 (EchoAgentWithTasks)
9.3 ストレージ抽象化
ITaskStore インターフェースを通じたタスクストレージの抽象化:
InMemoryTaskStore: インメモリストレージ実装- データベースストレージ実装に拡張可能
10. A2A .NET パフォーマンスと可観測性
10.1 パフォーマンス最適化
- ソース生成シリアライゼーション: System.Text.Json ソースジェネレーターを使用
- AOT 互換性: Native AOT コンパイルをサポート
- 非同期処理: async/await パターンの包括的使用
- ストリーミング処理: 大容量データストリーミングをサポート
10.2 可観測性
統合された OpenTelemetry サポート:
- 分散トレーシング: ActivitySource 統合
- メトリクス収集: タスクステータスとパフォーマンスメトリクス
- ログ: 構造化ログサポート
// OpenTelemetry 設定例
builder.Services.AddOpenTelemetry()
.WithTracing(tracing => tracing
.AddSource(TaskManager.ActivitySource.Name)
.AddSource(A2AJsonRpcProcessor.ActivitySource.Name)
.AddConsoleExporter()
.AddOtlpExporter());
11. A2A .NET まとめ
A2A .NET SDK は、.NET アプリケーションでエージェント間通信を実装するための完全で本番対応のソリューションを提供します。
11.1 主な利点
- 標準化されたプロトコル: Google の A2A Protocol 標準に基づく
- 簡単な統合: シンプルな ASP.NET Core 統合
- 柔軟なアーキテクチャ: 複数のエージェント実装パターンをサポート
- 高性能: 最適化されたシリアライゼーションと非同期処理
- 可観測性: 組み込みテレメトリとモニタリングサポート
- 拡張性: 抽象インターフェースがカスタム実装をサポート
11.2 使用例
- AI エージェントシステム: インテリジェントエージェント相互作用システムの構築
- マイクロサービスアーキテクチャ: サービス間のインテリジェント通信
- ワークフローエンジン: 複雑なビジネスプロセスのエージェントベース処理
- チャットボット: マルチエージェント協調対話システム
11.3 今後の開発
- プッシュ通知: 完全なクライアントコールバックサポート
- より多くのストレージバックエンド: データベースと分散ストレージサポート
- セキュリティ強化: より包括的な認証と認可メカニズム
- プロトコル更新: A2A Protocol の最新バージョンとの歩調合わせ
11.4 開発推奨事項
- シンプルに始める: 基本概念を理解するために EchoAgent を使用
- 状態管理の理解: ResearcherAgent のステートマシン実装を研究
- エラーハンドリングの重視: 包括的なエラーハンドリングと回復メカニズムの実装
- モニタリングとデバッグ: システムモニタリングのために OpenTelemetry を活用
- テスト駆動: 包括的な単体テストと統合テストの作成
この SDK は、.NET 開発者に次世代インテリジェントエージェントシステムを構築するための強力で柔軟なプラットフォームを提供します。明確なアーキテクチャと豊富なサンプルを通じて、開発者は迅速に開始し、複雑なエージェント間通信アプリケーションを構築できます。
Related Articles
Explore more content related to this topic
A2UI Introduction - Declarative UI Protocol for Agent-Driven Interfaces
Discover A2UI, the declarative UI protocol that enables AI agents to generate rich, interactive user interfaces. Learn how A2UI works, who it's for, how to use it, and see real-world examples from Google Opal, Gemini Enterprise, and Flutter GenUI SDK.
Agent Gateway Protocol (AGP): Practical Tutorial and Specification
Learn the Agent Gateway Protocol (AGP): what it is, problems it solves, core spec (capability announcements, intent payloads, routing and error codes), routing algorithm, and how to run a working simulation.
Integrating A2A Protocol - Intelligent Agent Communication Solution for BeeAI Framework
Using A2A protocol instead of ACP is a better choice for BeeAI, reducing protocol fragmentation and improving ecosystem integration.
A2A vs ACP Protocol Comparison Analysis Report
A2A (Agent2Agent Protocol) and ACP (Agent Communication Protocol) represent two mainstream technical approaches in AI multi-agent system communication: 'cross-platform interoperability' and 'local/edge autonomy' respectively. A2A, with its powerful cross-vendor interconnection capabilities and rich task collaboration mechanisms, has become the preferred choice for cloud-based and distributed multi-agent scenarios; while ACP, with its low-latency, local-first, cloud-independent characteristics, is suitable for privacy-sensitive, bandwidth-constrained, or edge computing environments. Both protocols have their own focus in protocol design, ecosystem construction, and standardization governance, and are expected to further converge in openness in the future. Developers are advised to choose the most suitable protocol stack based on actual business needs.
Building an A2A Currency Agent with LangGraph
This guide provides a detailed explanation of how to build an A2A-compliant agent using LangGraph and the Google Gemini model. We'll walk through the Currency Agent example from the A2A Python SDK, explaining each component, the flow of data, and how the A2A protocol facilitates agent interactions.