synapse-a2a 0.1.0__tar.gz
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.
- synapse_a2a-0.1.0/PKG-INFO +627 -0
- synapse_a2a-0.1.0/README.md +610 -0
- synapse_a2a-0.1.0/pyproject.toml +35 -0
- synapse_a2a-0.1.0/setup.cfg +4 -0
- synapse_a2a-0.1.0/synapse/__init__.py +0 -0
- synapse_a2a-0.1.0/synapse/a2a_client.py +439 -0
- synapse_a2a-0.1.0/synapse/a2a_compat.py +611 -0
- synapse_a2a-0.1.0/synapse/agent_context.py +169 -0
- synapse_a2a-0.1.0/synapse/cli.py +563 -0
- synapse_a2a-0.1.0/synapse/controller.py +353 -0
- synapse_a2a-0.1.0/synapse/input_router.py +373 -0
- synapse_a2a-0.1.0/synapse/port_manager.py +180 -0
- synapse_a2a-0.1.0/synapse/registry.py +141 -0
- synapse_a2a-0.1.0/synapse/server.py +312 -0
- synapse_a2a-0.1.0/synapse/shell.py +190 -0
- synapse_a2a-0.1.0/synapse/shell_hook.py +106 -0
- synapse_a2a-0.1.0/synapse/tools/a2a.py +207 -0
- synapse_a2a-0.1.0/synapse_a2a.egg-info/PKG-INFO +627 -0
- synapse_a2a-0.1.0/synapse_a2a.egg-info/SOURCES.txt +31 -0
- synapse_a2a-0.1.0/synapse_a2a.egg-info/dependency_links.txt +1 -0
- synapse_a2a-0.1.0/synapse_a2a.egg-info/entry_points.txt +4 -0
- synapse_a2a-0.1.0/synapse_a2a.egg-info/requires.txt +9 -0
- synapse_a2a-0.1.0/synapse_a2a.egg-info/top_level.txt +1 -0
- synapse_a2a-0.1.0/tests/test_a2a_client.py +323 -0
- synapse_a2a-0.1.0/tests/test_a2a_compat.py +544 -0
- synapse_a2a-0.1.0/tests/test_agent_context.py +343 -0
- synapse_a2a-0.1.0/tests/test_cli_args.py +189 -0
- synapse_a2a-0.1.0/tests/test_controller.py +528 -0
- synapse_a2a-0.1.0/tests/test_input_router.py +583 -0
- synapse_a2a-0.1.0/tests/test_port_manager.py +212 -0
- synapse_a2a-0.1.0/tests/test_registry.py +195 -0
- synapse_a2a-0.1.0/tests/test_sender_identification.py +290 -0
- synapse_a2a-0.1.0/tests/test_server.py +271 -0
|
@@ -0,0 +1,627 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: synapse-a2a
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Agent-to-Agent communication protocol for CLI agents
|
|
5
|
+
Author: Synapse A2A Team
|
|
6
|
+
License: MIT
|
|
7
|
+
Requires-Python: >=3.10
|
|
8
|
+
Description-Content-Type: text/markdown
|
|
9
|
+
Requires-Dist: fastapi>=0.100.0
|
|
10
|
+
Requires-Dist: uvicorn>=0.23.0
|
|
11
|
+
Requires-Dist: pyyaml>=6.0
|
|
12
|
+
Requires-Dist: requests>=2.31.0
|
|
13
|
+
Requires-Dist: types-pyyaml>=6.0.12.20250915
|
|
14
|
+
Requires-Dist: types-requests>=2.32.4.20250913
|
|
15
|
+
Provides-Extra: dev
|
|
16
|
+
Requires-Dist: pytest>=7.0.0; extra == "dev"
|
|
17
|
+
|
|
18
|
+
# Synapse A2A
|
|
19
|
+
|
|
20
|
+
**Google A2A プロトコル準拠の CLI エージェント間通信フレームワーク**
|
|
21
|
+
|
|
22
|
+
[](https://www.python.org/downloads/)
|
|
23
|
+
[](LICENSE)
|
|
24
|
+
[](#テスト)
|
|
25
|
+
|
|
26
|
+
> Claude Code / Codex / Gemini などの CLI エージェントを PTY でラップし、Google A2A プロトコルで相互通信を可能にするフレームワーク
|
|
27
|
+
|
|
28
|
+
```mermaid
|
|
29
|
+
flowchart LR
|
|
30
|
+
subgraph Terminal1["Terminal 1"]
|
|
31
|
+
subgraph Agent1["synapse claude :8100"]
|
|
32
|
+
Server1["A2A Server"]
|
|
33
|
+
PTY1["PTY + Claude CLI"]
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
subgraph Terminal2["Terminal 2"]
|
|
37
|
+
subgraph Agent2["synapse codex :8120"]
|
|
38
|
+
Server2["A2A Server"]
|
|
39
|
+
PTY2["PTY + Codex CLI"]
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
subgraph External["外部"]
|
|
43
|
+
ExtAgent["Google A2A Agent"]
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
Server1 <-->|"POST /tasks/send"| Server2
|
|
47
|
+
Server1 <-->|"A2A Protocol"| ExtAgent
|
|
48
|
+
Server2 <-->|"A2A Protocol"| ExtAgent
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
## 目次
|
|
54
|
+
|
|
55
|
+
- [主な特徴](#主な特徴)
|
|
56
|
+
- [クイックスタート](#クイックスタート)
|
|
57
|
+
- [アーキテクチャ](#アーキテクチャ)
|
|
58
|
+
- [CLI コマンド](#cli-コマンド)
|
|
59
|
+
- [API エンドポイント](#api-エンドポイント)
|
|
60
|
+
- [Task 構造](#task-構造)
|
|
61
|
+
- [送信元識別](#送信元識別)
|
|
62
|
+
- [Priority(優先度)](#priority優先度)
|
|
63
|
+
- [Agent Card](#agent-card)
|
|
64
|
+
- [レジストリとポート管理](#レジストリとポート管理)
|
|
65
|
+
- [テスト](#テスト)
|
|
66
|
+
- [開発・リリース](#開発リリース)
|
|
67
|
+
|
|
68
|
+
---
|
|
69
|
+
|
|
70
|
+
## 主な特徴
|
|
71
|
+
|
|
72
|
+
| カテゴリ | 機能 |
|
|
73
|
+
|---------|------|
|
|
74
|
+
| **A2A 準拠** | 全通信が Message/Part + Task 形式、Agent Card による発見 |
|
|
75
|
+
| **CLI 連携** | 既存の CLI ツールを改造せずに A2A エージェント化 |
|
|
76
|
+
| **@Agent 記法** | `@claude`, `@codex-8120` で直接メッセージ送信 |
|
|
77
|
+
| **送信元識別** | `metadata.sender` + PID マッチングで送信元を自動識別 |
|
|
78
|
+
| **Priority Interrupt** | Priority 5 で SIGINT 送信後にメッセージ送信(緊急停止) |
|
|
79
|
+
| **マルチインスタンス** | 同じエージェントタイプを複数同時起動(ポート自動割当) |
|
|
80
|
+
| **外部連携** | 他の Google A2A エージェントとの通信 |
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
## クイックスタート
|
|
85
|
+
|
|
86
|
+
### 1. インストール
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
# uv でインストール(推奨)
|
|
90
|
+
uv sync
|
|
91
|
+
|
|
92
|
+
# または pip
|
|
93
|
+
pip install -e .
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
### 2. エージェントを起動
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
# Terminal 1: Claude
|
|
100
|
+
synapse claude
|
|
101
|
+
|
|
102
|
+
# Terminal 2: Codex
|
|
103
|
+
synapse codex
|
|
104
|
+
|
|
105
|
+
# Terminal 3: Gemini
|
|
106
|
+
synapse gemini
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
ポートは自動割当されます:
|
|
110
|
+
|
|
111
|
+
| エージェント | ポート範囲 |
|
|
112
|
+
|-------------|-----------|
|
|
113
|
+
| Claude | 8100-8109 |
|
|
114
|
+
| Gemini | 8110-8119 |
|
|
115
|
+
| Codex | 8120-8129 |
|
|
116
|
+
|
|
117
|
+
### 3. エージェント間通信
|
|
118
|
+
|
|
119
|
+
端末内で `@Agent` を使ってメッセージ送信:
|
|
120
|
+
|
|
121
|
+
```text
|
|
122
|
+
@codex この設計をレビューして
|
|
123
|
+
@gemini APIの改善案を出して
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
複数インスタンスがある場合は `@type-port` 形式で指定:
|
|
127
|
+
|
|
128
|
+
```text
|
|
129
|
+
@codex-8120 こちらを担当して
|
|
130
|
+
@codex-8121 こちらを担当して
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
### 4. HTTP API
|
|
134
|
+
|
|
135
|
+
```bash
|
|
136
|
+
# メッセージ送信
|
|
137
|
+
curl -X POST http://localhost:8100/tasks/send \
|
|
138
|
+
-H "Content-Type: application/json" \
|
|
139
|
+
-d '{"message": {"role": "user", "parts": [{"type": "text", "text": "Hello!"}]}}'
|
|
140
|
+
|
|
141
|
+
# 緊急停止(Priority 5)
|
|
142
|
+
curl -X POST "http://localhost:8100/tasks/send-priority?priority=5" \
|
|
143
|
+
-H "Content-Type: application/json" \
|
|
144
|
+
-d '{"message": {"role": "user", "parts": [{"type": "text", "text": "Stop!"}]}}'
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
---
|
|
148
|
+
|
|
149
|
+
## アーキテクチャ
|
|
150
|
+
|
|
151
|
+
### A2A サーバー / クライアント構成
|
|
152
|
+
|
|
153
|
+
Synapse では **各エージェントが A2A サーバーとして動作** します。中央サーバーは存在せず、P2P 構成です。
|
|
154
|
+
|
|
155
|
+
```
|
|
156
|
+
┌─────────────────────────────────────┐ ┌─────────────────────────────────────┐
|
|
157
|
+
│ synapse claude (port 8100) │ │ synapse codex (port 8120) │
|
|
158
|
+
│ ┌───────────────────────────────┐ │ │ ┌───────────────────────────────┐ │
|
|
159
|
+
│ │ FastAPI Server (A2A Server) │ │ │ │ FastAPI Server (A2A Server) │ │
|
|
160
|
+
│ │ /.well-known/agent.json │ │ │ │ /.well-known/agent.json │ │
|
|
161
|
+
│ │ /tasks/send │◄─┼────┼──│ A2AClient │ │
|
|
162
|
+
│ │ /tasks/{id} │ │ │ └───────────────────────────────┘ │
|
|
163
|
+
│ └───────────────────────────────┘ │ │ ┌───────────────────────────────┐ │
|
|
164
|
+
│ ┌───────────────────────────────┐ │ │ │ PTY + Codex CLI │ │
|
|
165
|
+
│ │ PTY + Claude CLI │ │ │ └───────────────────────────────┘ │
|
|
166
|
+
│ └───────────────────────────────┘ │ └─────────────────────────────────────┘
|
|
167
|
+
└─────────────────────────────────────┘
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
各エージェントは:
|
|
171
|
+
- **A2A サーバー**: 他のエージェントからのリクエストを受け付ける
|
|
172
|
+
- **A2A クライアント**: 他のエージェントにリクエストを送信する
|
|
173
|
+
|
|
174
|
+
### 主要コンポーネント
|
|
175
|
+
|
|
176
|
+
| コンポーネント | ファイル | 役割 |
|
|
177
|
+
|---------------|---------|------|
|
|
178
|
+
| FastAPI Server | `synapse/server.py` | A2A エンドポイント提供 |
|
|
179
|
+
| A2A Router | `synapse/a2a_compat.py` | A2A プロトコル実装 |
|
|
180
|
+
| A2A Client | `synapse/a2a_client.py` | 他エージェントへの通信 |
|
|
181
|
+
| TerminalController | `synapse/controller.py` | PTY 管理、IDLE/BUSY 検出 |
|
|
182
|
+
| InputRouter | `synapse/input_router.py` | @Agent パターン検出 |
|
|
183
|
+
| AgentRegistry | `synapse/registry.py` | エージェント登録・検索 |
|
|
184
|
+
|
|
185
|
+
### 起動シーケンス
|
|
186
|
+
|
|
187
|
+
```mermaid
|
|
188
|
+
sequenceDiagram
|
|
189
|
+
participant Synapse as Synapse Server
|
|
190
|
+
participant Registry as AgentRegistry
|
|
191
|
+
participant PTY as TerminalController
|
|
192
|
+
participant CLI as CLI Agent
|
|
193
|
+
|
|
194
|
+
Synapse->>Registry: 1. エージェント登録 (agent_id, pid, port)
|
|
195
|
+
Synapse->>PTY: 2. PTY 起動
|
|
196
|
+
PTY->>CLI: 3. CLI エージェント起動
|
|
197
|
+
Synapse->>PTY: 4. 初期指示送信 (sender: synapse-system)
|
|
198
|
+
PTY->>CLI: 5. AI が初期指示を受信
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
### 通信フロー
|
|
202
|
+
|
|
203
|
+
```mermaid
|
|
204
|
+
sequenceDiagram
|
|
205
|
+
participant User as ユーザー
|
|
206
|
+
participant Claude as Claude (8100)
|
|
207
|
+
participant Client as A2AClient
|
|
208
|
+
participant Codex as Codex (8120)
|
|
209
|
+
|
|
210
|
+
User->>Claude: @codex 設計をレビューして
|
|
211
|
+
Claude->>Client: send_to_local()
|
|
212
|
+
Client->>Codex: POST /tasks/send-priority
|
|
213
|
+
Codex->>Codex: Task 作成 → PTY に書き込み
|
|
214
|
+
Codex-->>Client: {"task": {"id": "...", "status": "working"}}
|
|
215
|
+
Client-->>Claude: [→ codex] 送信完了
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
---
|
|
219
|
+
|
|
220
|
+
## CLI コマンド
|
|
221
|
+
|
|
222
|
+
### 基本操作
|
|
223
|
+
|
|
224
|
+
```bash
|
|
225
|
+
# エージェント起動(フォアグラウンド)
|
|
226
|
+
synapse claude
|
|
227
|
+
synapse codex
|
|
228
|
+
synapse gemini
|
|
229
|
+
|
|
230
|
+
# ポート指定
|
|
231
|
+
synapse claude --port 8105
|
|
232
|
+
|
|
233
|
+
# CLI ツールに引数を渡す
|
|
234
|
+
synapse claude -- --resume
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
### コマンド一覧
|
|
238
|
+
|
|
239
|
+
| コマンド | 説明 |
|
|
240
|
+
|---------|------|
|
|
241
|
+
| `synapse <profile>` | フォアグラウンドで起動 |
|
|
242
|
+
| `synapse start <profile>` | バックグラウンドで起動 |
|
|
243
|
+
| `synapse stop <profile>` | エージェント停止 |
|
|
244
|
+
| `synapse list` | 実行中エージェント一覧 |
|
|
245
|
+
| `synapse logs <profile>` | ログ表示 |
|
|
246
|
+
| `synapse send <target> <message>` | メッセージ送信 |
|
|
247
|
+
|
|
248
|
+
### 外部エージェント管理
|
|
249
|
+
|
|
250
|
+
```bash
|
|
251
|
+
# 外部エージェント登録
|
|
252
|
+
synapse external add http://other-agent:9000 --alias other
|
|
253
|
+
|
|
254
|
+
# 一覧表示
|
|
255
|
+
synapse external list
|
|
256
|
+
|
|
257
|
+
# メッセージ送信
|
|
258
|
+
synapse external send other "タスクを処理して"
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
### A2A CLI ツール
|
|
262
|
+
|
|
263
|
+
低レベル操作用:
|
|
264
|
+
|
|
265
|
+
```bash
|
|
266
|
+
# エージェント一覧
|
|
267
|
+
python3 synapse/tools/a2a.py list
|
|
268
|
+
|
|
269
|
+
# メッセージ送信
|
|
270
|
+
python3 synapse/tools/a2a.py send --target claude --priority 1 "Hello"
|
|
271
|
+
|
|
272
|
+
# 緊急停止
|
|
273
|
+
python3 synapse/tools/a2a.py send --target claude --priority 5 "Stop!"
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
---
|
|
277
|
+
|
|
278
|
+
## API エンドポイント
|
|
279
|
+
|
|
280
|
+
### A2A 準拠
|
|
281
|
+
|
|
282
|
+
| エンドポイント | メソッド | 説明 |
|
|
283
|
+
|---------------|---------|------|
|
|
284
|
+
| `/.well-known/agent.json` | GET | Agent Card |
|
|
285
|
+
| `/tasks/send` | POST | メッセージ送信 |
|
|
286
|
+
| `/tasks/send-priority` | POST | Priority 付き送信 |
|
|
287
|
+
| `/tasks/{id}` | GET | タスク状態取得 |
|
|
288
|
+
| `/tasks` | GET | タスク一覧 |
|
|
289
|
+
| `/tasks/{id}/cancel` | POST | タスクキャンセル |
|
|
290
|
+
| `/status` | GET | IDLE/BUSY 状態 |
|
|
291
|
+
|
|
292
|
+
### 外部エージェント
|
|
293
|
+
|
|
294
|
+
| エンドポイント | メソッド | 説明 |
|
|
295
|
+
|---------------|---------|------|
|
|
296
|
+
| `/external/discover` | POST | 外部エージェント登録 |
|
|
297
|
+
| `/external/agents` | GET | 一覧 |
|
|
298
|
+
| `/external/agents/{alias}` | DELETE | 削除 |
|
|
299
|
+
| `/external/agents/{alias}/send` | POST | 送信 |
|
|
300
|
+
|
|
301
|
+
---
|
|
302
|
+
|
|
303
|
+
## Task 構造
|
|
304
|
+
|
|
305
|
+
A2A プロトコルでは、全ての通信が **Task** として管理されます。
|
|
306
|
+
|
|
307
|
+
### Task ライフサイクル
|
|
308
|
+
|
|
309
|
+
```mermaid
|
|
310
|
+
stateDiagram-v2
|
|
311
|
+
[*] --> submitted: POST /tasks/send
|
|
312
|
+
submitted --> working: 処理開始
|
|
313
|
+
working --> completed: 正常終了
|
|
314
|
+
working --> failed: エラー
|
|
315
|
+
working --> input_required: 追加入力待ち
|
|
316
|
+
input_required --> working: 入力受信
|
|
317
|
+
completed --> [*]
|
|
318
|
+
failed --> [*]
|
|
319
|
+
```
|
|
320
|
+
|
|
321
|
+
### Task オブジェクト
|
|
322
|
+
|
|
323
|
+
```json
|
|
324
|
+
{
|
|
325
|
+
"id": "550e8400-e29b-41d4-a716-446655440000",
|
|
326
|
+
"context_id": "conversation-123",
|
|
327
|
+
"status": "working",
|
|
328
|
+
"message": {
|
|
329
|
+
"role": "user",
|
|
330
|
+
"parts": [
|
|
331
|
+
{"type": "text", "text": "この設計をレビューして"}
|
|
332
|
+
]
|
|
333
|
+
},
|
|
334
|
+
"artifacts": [],
|
|
335
|
+
"metadata": {
|
|
336
|
+
"sender": {
|
|
337
|
+
"sender_id": "synapse-claude-8100",
|
|
338
|
+
"sender_type": "claude",
|
|
339
|
+
"sender_endpoint": "http://localhost:8100"
|
|
340
|
+
}
|
|
341
|
+
},
|
|
342
|
+
"created_at": "2024-01-15T10:30:00Z",
|
|
343
|
+
"updated_at": "2024-01-15T10:30:05Z"
|
|
344
|
+
}
|
|
345
|
+
```
|
|
346
|
+
|
|
347
|
+
### フィールド説明
|
|
348
|
+
|
|
349
|
+
| フィールド | 型 | 説明 |
|
|
350
|
+
|-----------|-----|------|
|
|
351
|
+
| `id` | string | タスクの一意識別子(UUID) |
|
|
352
|
+
| `context_id` | string? | 会話コンテキスト ID(マルチターン用) |
|
|
353
|
+
| `status` | string | `submitted` / `working` / `completed` / `failed` / `input_required` |
|
|
354
|
+
| `message` | Message | 送信されたメッセージ |
|
|
355
|
+
| `artifacts` | Artifact[] | タスク完了時の成果物 |
|
|
356
|
+
| `metadata` | object | 送信元情報など(`metadata.sender`) |
|
|
357
|
+
| `created_at` | string | 作成日時(ISO 8601) |
|
|
358
|
+
| `updated_at` | string | 更新日時(ISO 8601) |
|
|
359
|
+
|
|
360
|
+
### Message 構造
|
|
361
|
+
|
|
362
|
+
```json
|
|
363
|
+
{
|
|
364
|
+
"role": "user",
|
|
365
|
+
"parts": [
|
|
366
|
+
{"type": "text", "text": "メッセージ内容"},
|
|
367
|
+
{"type": "file", "file": {"name": "doc.pdf", "mimeType": "application/pdf", "bytes": "..."}}
|
|
368
|
+
]
|
|
369
|
+
}
|
|
370
|
+
```
|
|
371
|
+
|
|
372
|
+
| Part タイプ | 説明 |
|
|
373
|
+
|------------|------|
|
|
374
|
+
| `text` | テキストメッセージ |
|
|
375
|
+
| `file` | ファイル添付 |
|
|
376
|
+
| `data` | 構造化データ |
|
|
377
|
+
|
|
378
|
+
### 初期指示 Task
|
|
379
|
+
|
|
380
|
+
エージェント起動時、Synapse は A2A Task として初期指示を送信します。
|
|
381
|
+
|
|
382
|
+
```json
|
|
383
|
+
{
|
|
384
|
+
"id": "init-task-id",
|
|
385
|
+
"status": "working",
|
|
386
|
+
"message": {
|
|
387
|
+
"role": "user",
|
|
388
|
+
"parts": [{"type": "text", "text": "[Synapse A2A Protocol Instructions]\n\n..."}]
|
|
389
|
+
},
|
|
390
|
+
"metadata": {
|
|
391
|
+
"sender": {
|
|
392
|
+
"sender_id": "synapse-system",
|
|
393
|
+
"sender_type": "system",
|
|
394
|
+
"sender_endpoint": "http://localhost:8100"
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
```
|
|
399
|
+
|
|
400
|
+
PTY 出力形式:
|
|
401
|
+
```
|
|
402
|
+
[A2A:init1234:synapse-system] [Synapse A2A Protocol Instructions]
|
|
403
|
+
|
|
404
|
+
You are participating in a multi-agent environment connected via the Synapse A2A Protocol.
|
|
405
|
+
|
|
406
|
+
## Your Identity
|
|
407
|
+
- Agent ID: synapse-claude-8100
|
|
408
|
+
- Agent Type: claude
|
|
409
|
+
- Port: 8100
|
|
410
|
+
|
|
411
|
+
## How to Send Messages (@Agent)
|
|
412
|
+
...
|
|
413
|
+
```
|
|
414
|
+
|
|
415
|
+
初期指示には以下が含まれます:
|
|
416
|
+
- エージェントの identity(ID, type, port)
|
|
417
|
+
- @Agent でのメッセージ送信方法
|
|
418
|
+
- 利用可能な他のエージェント一覧
|
|
419
|
+
- 送信元識別と **返信方法**(`[A2A:task_id:sender_id]` から sender_id を抽出して返信)
|
|
420
|
+
|
|
421
|
+
---
|
|
422
|
+
|
|
423
|
+
## 送信元識別
|
|
424
|
+
|
|
425
|
+
A2A メッセージの送信元は `metadata.sender` で識別できます。
|
|
426
|
+
|
|
427
|
+
### PTY 出力形式
|
|
428
|
+
|
|
429
|
+
```
|
|
430
|
+
[A2A:<task_id>:<sender_id>] <message>
|
|
431
|
+
```
|
|
432
|
+
|
|
433
|
+
例:
|
|
434
|
+
```
|
|
435
|
+
[A2A:abc12345:synapse-claude-8100] この設計をレビューしてください
|
|
436
|
+
```
|
|
437
|
+
|
|
438
|
+
### Task API での確認
|
|
439
|
+
|
|
440
|
+
```bash
|
|
441
|
+
curl -s http://localhost:8120/tasks/{task_id} | jq '.metadata.sender'
|
|
442
|
+
```
|
|
443
|
+
|
|
444
|
+
レスポンス:
|
|
445
|
+
```json
|
|
446
|
+
{
|
|
447
|
+
"sender_id": "synapse-claude-8100",
|
|
448
|
+
"sender_type": "claude",
|
|
449
|
+
"sender_endpoint": "http://localhost:8100"
|
|
450
|
+
}
|
|
451
|
+
```
|
|
452
|
+
|
|
453
|
+
### 仕組み
|
|
454
|
+
|
|
455
|
+
1. **送信時**: Registry を参照し、PID マッチングで自身の agent_id を特定
|
|
456
|
+
2. **Task 作成時**: `metadata.sender` に送信元情報を付与
|
|
457
|
+
3. **受信時**: PTY プレフィックスまたは Task API で確認
|
|
458
|
+
|
|
459
|
+
---
|
|
460
|
+
|
|
461
|
+
## Priority(優先度)
|
|
462
|
+
|
|
463
|
+
| Priority | 動作 | 用途 |
|
|
464
|
+
|----------|------|------|
|
|
465
|
+
| 1-4 | 通常の stdin 書き込み | 通常メッセージ |
|
|
466
|
+
| 5 | SIGINT 送信後に書き込み | 緊急停止 |
|
|
467
|
+
|
|
468
|
+
```bash
|
|
469
|
+
# 緊急停止
|
|
470
|
+
synapse send claude "Stop!" --priority 5
|
|
471
|
+
```
|
|
472
|
+
|
|
473
|
+
---
|
|
474
|
+
|
|
475
|
+
## Agent Card
|
|
476
|
+
|
|
477
|
+
各エージェントは `/.well-known/agent.json` で Agent Card を公開します。
|
|
478
|
+
|
|
479
|
+
```bash
|
|
480
|
+
curl http://localhost:8100/.well-known/agent.json
|
|
481
|
+
```
|
|
482
|
+
|
|
483
|
+
```json
|
|
484
|
+
{
|
|
485
|
+
"name": "Synapse Claude",
|
|
486
|
+
"description": "PTY-wrapped claude CLI agent with A2A communication",
|
|
487
|
+
"url": "http://localhost:8100",
|
|
488
|
+
"capabilities": {
|
|
489
|
+
"streaming": false,
|
|
490
|
+
"pushNotifications": false,
|
|
491
|
+
"multiTurn": true
|
|
492
|
+
},
|
|
493
|
+
"skills": [
|
|
494
|
+
{"id": "chat", "name": "Chat", "description": "Send messages to the CLI agent"},
|
|
495
|
+
{"id": "interrupt", "name": "Interrupt", "description": "Interrupt current processing"}
|
|
496
|
+
],
|
|
497
|
+
"extensions": {
|
|
498
|
+
"synapse": {
|
|
499
|
+
"agent_id": "synapse-claude-8100",
|
|
500
|
+
"pty_wrapped": true,
|
|
501
|
+
"priority_interrupt": true,
|
|
502
|
+
"at_agent_syntax": true
|
|
503
|
+
}
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
```
|
|
507
|
+
|
|
508
|
+
### 設計思想
|
|
509
|
+
|
|
510
|
+
Agent Card は「名刺」として他者向け情報のみを含みます:
|
|
511
|
+
- capabilities, skills, endpoint など
|
|
512
|
+
- 内部指示は含まない(起動時に A2A Task で送信)
|
|
513
|
+
|
|
514
|
+
---
|
|
515
|
+
|
|
516
|
+
## レジストリとポート管理
|
|
517
|
+
|
|
518
|
+
### レジストリファイル
|
|
519
|
+
|
|
520
|
+
```
|
|
521
|
+
~/.a2a/registry/
|
|
522
|
+
├── synapse-claude-8100.json
|
|
523
|
+
├── synapse-claude-8101.json
|
|
524
|
+
└── synapse-gemini-8110.json
|
|
525
|
+
```
|
|
526
|
+
|
|
527
|
+
### 自動クリーンアップ
|
|
528
|
+
|
|
529
|
+
stale エントリは以下の操作で自動削除:
|
|
530
|
+
- `synapse list` 実行時
|
|
531
|
+
- メッセージ送信時(対象が死んでいる場合)
|
|
532
|
+
|
|
533
|
+
### ポート範囲
|
|
534
|
+
|
|
535
|
+
```python
|
|
536
|
+
PORT_RANGES = {
|
|
537
|
+
"claude": (8100, 8109),
|
|
538
|
+
"gemini": (8110, 8119),
|
|
539
|
+
"codex": (8120, 8129),
|
|
540
|
+
"dummy": (8190, 8199),
|
|
541
|
+
}
|
|
542
|
+
```
|
|
543
|
+
|
|
544
|
+
---
|
|
545
|
+
|
|
546
|
+
## テスト
|
|
547
|
+
|
|
548
|
+
218 のテストケースで A2A プロトコル準拠を検証:
|
|
549
|
+
|
|
550
|
+
```bash
|
|
551
|
+
# 全テスト
|
|
552
|
+
pytest
|
|
553
|
+
|
|
554
|
+
# 特定カテゴリ
|
|
555
|
+
pytest tests/test_a2a_compat.py -v
|
|
556
|
+
pytest tests/test_sender_identification.py -v
|
|
557
|
+
```
|
|
558
|
+
|
|
559
|
+
---
|
|
560
|
+
|
|
561
|
+
## 開発・リリース
|
|
562
|
+
|
|
563
|
+
### PyPI への公開
|
|
564
|
+
|
|
565
|
+
タグをプッシュすると GitHub Actions で自動的に PyPI へ公開されます。
|
|
566
|
+
|
|
567
|
+
```bash
|
|
568
|
+
# 1. pyproject.toml のバージョンを更新
|
|
569
|
+
# version = "0.2.0"
|
|
570
|
+
|
|
571
|
+
# 2. タグを作成してプッシュ
|
|
572
|
+
git tag v0.2.0
|
|
573
|
+
git push origin v0.2.0
|
|
574
|
+
```
|
|
575
|
+
|
|
576
|
+
### 手動公開
|
|
577
|
+
|
|
578
|
+
```bash
|
|
579
|
+
# uv でビルド・公開
|
|
580
|
+
uv build
|
|
581
|
+
uv publish
|
|
582
|
+
```
|
|
583
|
+
|
|
584
|
+
### ユーザーのインストール方法
|
|
585
|
+
|
|
586
|
+
```bash
|
|
587
|
+
# pipx(推奨)
|
|
588
|
+
pipx install synapse-a2a
|
|
589
|
+
|
|
590
|
+
# または pip
|
|
591
|
+
pip install synapse-a2a
|
|
592
|
+
|
|
593
|
+
# uvx で直接実行
|
|
594
|
+
uvx synapse-a2a claude
|
|
595
|
+
```
|
|
596
|
+
|
|
597
|
+
---
|
|
598
|
+
|
|
599
|
+
## 既知の制約
|
|
600
|
+
|
|
601
|
+
- **TUI 描画**: Ink ベースの CLI で描画が乱れる場合あり
|
|
602
|
+
- **PTY 制限**: 一部の特殊入力シーケンスは未対応
|
|
603
|
+
- **Streaming**: 未対応
|
|
604
|
+
|
|
605
|
+
---
|
|
606
|
+
|
|
607
|
+
## ドキュメント
|
|
608
|
+
|
|
609
|
+
| パス | 内容 |
|
|
610
|
+
|-----|------|
|
|
611
|
+
| [guides/usage.md](guides/usage.md) | 使い方詳細 |
|
|
612
|
+
| [guides/architecture.md](guides/architecture.md) | アーキテクチャ詳細 |
|
|
613
|
+
| [guides/troubleshooting.md](guides/troubleshooting.md) | トラブルシューティング |
|
|
614
|
+
| [docs/project-philosophy.md](docs/project-philosophy.md) | 設計思想 |
|
|
615
|
+
|
|
616
|
+
---
|
|
617
|
+
|
|
618
|
+
## ライセンス
|
|
619
|
+
|
|
620
|
+
MIT License
|
|
621
|
+
|
|
622
|
+
---
|
|
623
|
+
|
|
624
|
+
## 関連リンク
|
|
625
|
+
|
|
626
|
+
- [Claude Code](https://claude.ai/code) - Anthropic の CLI エージェント
|
|
627
|
+
- [Google A2A Protocol](https://github.com/google/A2A) - Agent-to-Agent プロトコル
|