a2a-adapter 0.1.3__py3-none-any.whl → 0.1.5__py3-none-any.whl
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.
- a2a_adapter/__init__.py +1 -1
- a2a_adapter/client.py +57 -13
- a2a_adapter/integrations/__init__.py +10 -1
- a2a_adapter/integrations/callable.py +204 -90
- a2a_adapter/integrations/crewai.py +489 -46
- a2a_adapter/integrations/langchain.py +248 -90
- a2a_adapter/integrations/langgraph.py +756 -0
- a2a_adapter/integrations/openclaw.py +1297 -0
- a2a_adapter/loader.py +101 -28
- {a2a_adapter-0.1.3.dist-info → a2a_adapter-0.1.5.dist-info}/METADATA +108 -28
- a2a_adapter-0.1.5.dist-info/RECORD +16 -0
- {a2a_adapter-0.1.3.dist-info → a2a_adapter-0.1.5.dist-info}/WHEEL +1 -1
- a2a_adapter-0.1.3.dist-info/RECORD +0 -14
- {a2a_adapter-0.1.3.dist-info → a2a_adapter-0.1.5.dist-info}/licenses/LICENSE +0 -0
- {a2a_adapter-0.1.3.dist-info → a2a_adapter-0.1.5.dist-info}/top_level.txt +0 -0
a2a_adapter/loader.py
CHANGED
|
@@ -13,27 +13,35 @@ from .adapter import BaseAgentAdapter
|
|
|
13
13
|
async def load_a2a_agent(config: Dict[str, Any]) -> BaseAgentAdapter:
|
|
14
14
|
"""
|
|
15
15
|
Factory function to load an agent adapter based on configuration.
|
|
16
|
-
|
|
16
|
+
|
|
17
17
|
This function inspects the 'adapter' key in the config dictionary and
|
|
18
18
|
instantiates the appropriate adapter class with the provided configuration.
|
|
19
|
-
|
|
19
|
+
|
|
20
20
|
Args:
|
|
21
21
|
config: Configuration dictionary with at least an 'adapter' key.
|
|
22
22
|
Additional keys depend on the adapter type:
|
|
23
|
-
|
|
23
|
+
|
|
24
24
|
- n8n: requires 'webhook_url', optional 'timeout', 'headers',
|
|
25
|
-
'payload_template', 'message_field'
|
|
26
|
-
- crewai: requires 'crew' (CrewAI Crew instance)
|
|
25
|
+
'payload_template', 'message_field', 'async_mode'
|
|
26
|
+
- crewai: requires 'crew' (CrewAI Crew instance),
|
|
27
|
+
optional 'inputs_key', 'async_mode'
|
|
27
28
|
- langchain: requires 'runnable', optional 'input_key', 'output_key'
|
|
28
|
-
-
|
|
29
|
-
|
|
29
|
+
- langgraph: requires 'graph' (CompiledGraph instance),
|
|
30
|
+
optional 'input_key', 'output_key', 'async_mode'
|
|
31
|
+
- callable: requires 'callable' (async function),
|
|
32
|
+
optional 'supports_streaming'
|
|
33
|
+
- openclaw: optional 'session_id', 'agent_id', 'thinking',
|
|
34
|
+
'timeout', 'openclaw_path', 'working_directory',
|
|
35
|
+
'env_vars', 'async_mode', 'task_store',
|
|
36
|
+
'task_ttl_seconds', 'cleanup_interval_seconds'
|
|
37
|
+
|
|
30
38
|
Returns:
|
|
31
39
|
Configured BaseAgentAdapter instance
|
|
32
|
-
|
|
40
|
+
|
|
33
41
|
Raises:
|
|
34
42
|
ValueError: If adapter type is unknown or required config is missing
|
|
35
43
|
ImportError: If required framework package is not installed
|
|
36
|
-
|
|
44
|
+
|
|
37
45
|
Examples:
|
|
38
46
|
>>> # Load n8n adapter (basic)
|
|
39
47
|
>>> adapter = await load_a2a_agent({
|
|
@@ -41,7 +49,7 @@ async def load_a2a_agent(config: Dict[str, Any]) -> BaseAgentAdapter:
|
|
|
41
49
|
... "webhook_url": "https://n8n.example.com/webhook/agent",
|
|
42
50
|
... "timeout": 30
|
|
43
51
|
... })
|
|
44
|
-
|
|
52
|
+
|
|
45
53
|
>>> # Load n8n adapter with custom payload mapping
|
|
46
54
|
>>> adapter = await load_a2a_agent({
|
|
47
55
|
... "adapter": "n8n",
|
|
@@ -49,7 +57,7 @@ async def load_a2a_agent(config: Dict[str, Any]) -> BaseAgentAdapter:
|
|
|
49
57
|
... "payload_template": {"name": "A2A Agent"}, # Static fields
|
|
50
58
|
... "message_field": "event" # Use "event" instead of "message"
|
|
51
59
|
... })
|
|
52
|
-
|
|
60
|
+
|
|
53
61
|
>>> # Load CrewAI adapter
|
|
54
62
|
>>> from crewai import Crew, Agent, Task
|
|
55
63
|
>>> crew = Crew(agents=[...], tasks=[...])
|
|
@@ -57,7 +65,7 @@ async def load_a2a_agent(config: Dict[str, Any]) -> BaseAgentAdapter:
|
|
|
57
65
|
... "adapter": "crewai",
|
|
58
66
|
... "crew": crew
|
|
59
67
|
... })
|
|
60
|
-
|
|
68
|
+
|
|
61
69
|
>>> # Load LangChain adapter
|
|
62
70
|
>>> from langchain_core.runnables import RunnablePassthrough
|
|
63
71
|
>>> adapter = await load_a2a_agent({
|
|
@@ -65,67 +73,132 @@ async def load_a2a_agent(config: Dict[str, Any]) -> BaseAgentAdapter:
|
|
|
65
73
|
... "runnable": chain,
|
|
66
74
|
... "input_key": "input"
|
|
67
75
|
... })
|
|
76
|
+
|
|
77
|
+
>>> # Load LangGraph adapter
|
|
78
|
+
>>> from langgraph.graph import StateGraph
|
|
79
|
+
>>> graph = builder.compile()
|
|
80
|
+
>>> adapter = await load_a2a_agent({
|
|
81
|
+
... "adapter": "langgraph",
|
|
82
|
+
... "graph": graph,
|
|
83
|
+
... "input_key": "messages"
|
|
84
|
+
... })
|
|
85
|
+
|
|
86
|
+
>>> # Load callable adapter
|
|
87
|
+
>>> async def my_agent(inputs: dict) -> str:
|
|
88
|
+
... return f"Processed: {inputs['message']}"
|
|
89
|
+
>>> adapter = await load_a2a_agent({
|
|
90
|
+
... "adapter": "callable",
|
|
91
|
+
... "callable": my_agent
|
|
92
|
+
... })
|
|
93
|
+
|
|
94
|
+
>>> # Load OpenClaw adapter
|
|
95
|
+
>>> adapter = await load_a2a_agent({
|
|
96
|
+
... "adapter": "openclaw",
|
|
97
|
+
... "session_id": "my-session",
|
|
98
|
+
... "agent_id": "main",
|
|
99
|
+
... "thinking": "low",
|
|
100
|
+
... "timeout": 300,
|
|
101
|
+
... })
|
|
68
102
|
"""
|
|
69
103
|
adapter_type = config.get("adapter")
|
|
70
|
-
|
|
104
|
+
|
|
71
105
|
if not adapter_type:
|
|
72
106
|
raise ValueError("Config must include 'adapter' key specifying adapter type")
|
|
73
|
-
|
|
107
|
+
|
|
74
108
|
if adapter_type == "n8n":
|
|
75
109
|
from .integrations.n8n import N8nAgentAdapter
|
|
76
|
-
|
|
110
|
+
|
|
77
111
|
webhook_url = config.get("webhook_url")
|
|
78
112
|
if not webhook_url:
|
|
79
113
|
raise ValueError("n8n adapter requires 'webhook_url' in config")
|
|
80
|
-
|
|
114
|
+
|
|
81
115
|
return N8nAgentAdapter(
|
|
82
116
|
webhook_url=webhook_url,
|
|
83
117
|
timeout=config.get("timeout", 30),
|
|
84
118
|
headers=config.get("headers"),
|
|
85
119
|
payload_template=config.get("payload_template"),
|
|
86
120
|
message_field=config.get("message_field", "message"),
|
|
121
|
+
async_mode=config.get("async_mode", False),
|
|
122
|
+
task_store=config.get("task_store"),
|
|
123
|
+
async_timeout=config.get("async_timeout", 300),
|
|
87
124
|
)
|
|
88
|
-
|
|
125
|
+
|
|
89
126
|
elif adapter_type == "crewai":
|
|
90
127
|
from .integrations.crewai import CrewAIAgentAdapter
|
|
91
|
-
|
|
128
|
+
|
|
92
129
|
crew = config.get("crew")
|
|
93
130
|
if crew is None:
|
|
94
131
|
raise ValueError("crewai adapter requires 'crew' instance in config")
|
|
95
|
-
|
|
132
|
+
|
|
96
133
|
return CrewAIAgentAdapter(
|
|
97
134
|
crew=crew,
|
|
98
135
|
inputs_key=config.get("inputs_key", "inputs"),
|
|
136
|
+
async_mode=config.get("async_mode", False),
|
|
137
|
+
task_store=config.get("task_store"),
|
|
138
|
+
async_timeout=config.get("async_timeout", 600),
|
|
99
139
|
)
|
|
100
|
-
|
|
140
|
+
|
|
101
141
|
elif adapter_type == "langchain":
|
|
102
142
|
from .integrations.langchain import LangChainAgentAdapter
|
|
103
|
-
|
|
143
|
+
|
|
104
144
|
runnable = config.get("runnable")
|
|
105
145
|
if runnable is None:
|
|
106
146
|
raise ValueError("langchain adapter requires 'runnable' in config")
|
|
107
|
-
|
|
147
|
+
|
|
108
148
|
return LangChainAgentAdapter(
|
|
109
149
|
runnable=runnable,
|
|
110
150
|
input_key=config.get("input_key", "input"),
|
|
111
151
|
output_key=config.get("output_key"),
|
|
112
152
|
)
|
|
113
|
-
|
|
153
|
+
|
|
154
|
+
elif adapter_type == "langgraph":
|
|
155
|
+
from .integrations.langgraph import LangGraphAgentAdapter
|
|
156
|
+
|
|
157
|
+
graph = config.get("graph")
|
|
158
|
+
if graph is None:
|
|
159
|
+
raise ValueError("langgraph adapter requires 'graph' (CompiledGraph) in config")
|
|
160
|
+
|
|
161
|
+
return LangGraphAgentAdapter(
|
|
162
|
+
graph=graph,
|
|
163
|
+
input_key=config.get("input_key", "messages"),
|
|
164
|
+
output_key=config.get("output_key"),
|
|
165
|
+
state_key=config.get("state_key"),
|
|
166
|
+
async_mode=config.get("async_mode", False),
|
|
167
|
+
task_store=config.get("task_store"),
|
|
168
|
+
async_timeout=config.get("async_timeout", 300),
|
|
169
|
+
)
|
|
170
|
+
|
|
114
171
|
elif adapter_type == "callable":
|
|
115
172
|
from .integrations.callable import CallableAgentAdapter
|
|
116
|
-
|
|
173
|
+
|
|
117
174
|
func = config.get("callable")
|
|
118
175
|
if func is None:
|
|
119
176
|
raise ValueError("callable adapter requires 'callable' function in config")
|
|
120
|
-
|
|
177
|
+
|
|
121
178
|
return CallableAgentAdapter(
|
|
122
179
|
func=func,
|
|
123
180
|
supports_streaming=config.get("supports_streaming", False),
|
|
124
181
|
)
|
|
125
|
-
|
|
182
|
+
|
|
183
|
+
elif adapter_type == "openclaw":
|
|
184
|
+
from .integrations.openclaw import OpenClawAgentAdapter
|
|
185
|
+
|
|
186
|
+
return OpenClawAgentAdapter(
|
|
187
|
+
session_id=config.get("session_id"),
|
|
188
|
+
agent_id=config.get("agent_id"),
|
|
189
|
+
thinking=config.get("thinking", "low"),
|
|
190
|
+
timeout=config.get("timeout", 600),
|
|
191
|
+
openclaw_path=config.get("openclaw_path", "openclaw"),
|
|
192
|
+
working_directory=config.get("working_directory"),
|
|
193
|
+
env_vars=config.get("env_vars"),
|
|
194
|
+
async_mode=config.get("async_mode", True),
|
|
195
|
+
task_store=config.get("task_store"),
|
|
196
|
+
task_ttl_seconds=config.get("task_ttl_seconds", 3600),
|
|
197
|
+
cleanup_interval_seconds=config.get("cleanup_interval_seconds", 300),
|
|
198
|
+
)
|
|
199
|
+
|
|
126
200
|
else:
|
|
127
201
|
raise ValueError(
|
|
128
202
|
f"Unknown adapter type: {adapter_type}. "
|
|
129
|
-
f"Supported types: n8n, crewai, langchain, callable"
|
|
203
|
+
f"Supported types: n8n, crewai, langchain, langgraph, callable, openclaw"
|
|
130
204
|
)
|
|
131
|
-
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: a2a-adapter
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.5
|
|
4
4
|
Summary: A2A Protocol Adapter SDK for integrating various agent frameworks
|
|
5
5
|
Author-email: HYBRO AI <info@hybro.ai>
|
|
6
6
|
License: Apache-2.0
|
|
@@ -52,20 +52,24 @@ Dynamic: license-file
|
|
|
52
52
|
|
|
53
53
|
**🚀 Open Source A2A Protocol Adapter SDK - Make Any Agent Framework A2A-Compatible in 3 Lines**
|
|
54
54
|
|
|
55
|
-
A Python SDK that enables seamless integration of various agent frameworks (n8n, CrewAI, LangChain, etc.) with the [A2A (Agent-to-Agent) Protocol](https://github.com/a2aproject/A2A). Build interoperable AI agent systems that can communicate across different platforms and frameworks.
|
|
55
|
+
A Python SDK that enables seamless integration of various agent frameworks (n8n, LangGraph, CrewAI, LangChain, etc.) and personal AI agents (OpenClaw) with the [A2A (Agent-to-Agent) Protocol](https://github.com/a2aproject/A2A). Build interoperable AI agent systems that can communicate across different platforms and frameworks.
|
|
56
56
|
|
|
57
57
|
**✨ Key Benefits:**
|
|
58
58
|
|
|
59
59
|
- 🔌 **3-line setup** - Expose any agent as A2A-compliant
|
|
60
|
-
- 🌐 **Framework agnostic** - Works with n8n, CrewAI, LangChain, and more
|
|
60
|
+
- 🌐 **Framework agnostic** - Works with n8n, LangGraph, CrewAI, LangChain, and more
|
|
61
61
|
- 🌊 **Streaming support** - Built-in streaming for real-time responses
|
|
62
62
|
- 🎯 **Production ready** - Type-safe, well-tested, and actively maintained
|
|
63
63
|
|
|
64
|
+
**▶️ Demo: n8n → A2A Agent**
|
|
65
|
+
|
|
66
|
+
[](https://youtu.be/rHWi7tLQ444)
|
|
67
|
+
|
|
64
68
|
## Features
|
|
65
69
|
|
|
66
|
-
✨ **Framework Agnostic**: Integrate n8n workflows, CrewAI crews, LangChain chains, and more
|
|
70
|
+
✨ **Framework Agnostic**: Integrate n8n workflows, LangGraph workflows, CrewAI crews, LangChain chains, OpenClaw personal agents, and more
|
|
67
71
|
🔌 **Simple API**: 3-line setup to expose any agent as A2A-compliant
|
|
68
|
-
🌊 **Streaming Support**: Built-in streaming for LangChain and custom adapters
|
|
72
|
+
🌊 **Streaming Support**: Built-in streaming for LangGraph, LangChain, and custom adapters
|
|
69
73
|
🎯 **Type Safe**: Leverages official A2A SDK types
|
|
70
74
|
🔧 **Extensible**: Easy to add custom adapters for new frameworks
|
|
71
75
|
📦 **Minimal Dependencies**: Optional dependencies per framework
|
|
@@ -81,14 +85,16 @@ A Python SDK that enables seamless integration of various agent frameworks (n8n,
|
|
|
81
85
|
┌─────────────────┐
|
|
82
86
|
│ A2A Adapter │ (This SDK)
|
|
83
87
|
│ - N8n │
|
|
88
|
+
│ - LangGraph │
|
|
84
89
|
│ - CrewAI │
|
|
85
90
|
│ - LangChain │
|
|
86
|
-
│ -
|
|
91
|
+
│ - OpenClaw │
|
|
92
|
+
│ - Callable │
|
|
87
93
|
└────────┬────────┘
|
|
88
94
|
│
|
|
89
95
|
▼
|
|
90
96
|
┌─────────────────┐
|
|
91
|
-
│ Your Agent │ (n8n workflow / CrewAI crew / Chain)
|
|
97
|
+
│ Your Agent │ (n8n workflow / CrewAI crew / Chain / OpenClaw)
|
|
92
98
|
└─────────────────┘
|
|
93
99
|
```
|
|
94
100
|
|
|
@@ -198,6 +204,17 @@ adapter = await load_a2a_agent({
|
|
|
198
204
|
})
|
|
199
205
|
```
|
|
200
206
|
|
|
207
|
+
### LangGraph Workflow → A2A Agent (with Streaming)
|
|
208
|
+
|
|
209
|
+
```python
|
|
210
|
+
adapter = await load_a2a_agent({
|
|
211
|
+
"adapter": "langgraph",
|
|
212
|
+
"graph": your_compiled_graph,
|
|
213
|
+
"input_key": "messages",
|
|
214
|
+
"output_key": "output"
|
|
215
|
+
})
|
|
216
|
+
```
|
|
217
|
+
|
|
201
218
|
### Custom Function → A2A Agent
|
|
202
219
|
|
|
203
220
|
```python
|
|
@@ -210,6 +227,16 @@ adapter = await load_a2a_agent({
|
|
|
210
227
|
})
|
|
211
228
|
```
|
|
212
229
|
|
|
230
|
+
### OpenClaw Agent → A2A Agent
|
|
231
|
+
|
|
232
|
+
```python
|
|
233
|
+
adapter = await load_a2a_agent({
|
|
234
|
+
"adapter": "openclaw",
|
|
235
|
+
"thinking": "low",
|
|
236
|
+
"async_mode": True
|
|
237
|
+
})
|
|
238
|
+
```
|
|
239
|
+
|
|
213
240
|
📚 **[View all examples →](https://github.com/hybroai/a2a-adapter/tree/main/examples/)**
|
|
214
241
|
|
|
215
242
|
## Advanced Usage
|
|
@@ -271,9 +298,35 @@ class StreamingAdapter(BaseAgentAdapter):
|
|
|
271
298
|
return True
|
|
272
299
|
```
|
|
273
300
|
|
|
274
|
-
###
|
|
301
|
+
### LangGraph Workflow as A2A Server
|
|
275
302
|
|
|
276
|
-
|
|
303
|
+
Expose a LangGraph workflow as an A2A server:
|
|
304
|
+
|
|
305
|
+
```python
|
|
306
|
+
from langgraph.graph import StateGraph, END
|
|
307
|
+
|
|
308
|
+
# Build your workflow
|
|
309
|
+
builder = StateGraph(YourState)
|
|
310
|
+
builder.add_node("process", process_node)
|
|
311
|
+
builder.set_entry_point("process")
|
|
312
|
+
builder.add_edge("process", END)
|
|
313
|
+
graph = builder.compile()
|
|
314
|
+
|
|
315
|
+
# Expose as A2A agent
|
|
316
|
+
adapter = await load_a2a_agent({
|
|
317
|
+
"adapter": "langgraph",
|
|
318
|
+
"graph": graph,
|
|
319
|
+
"input_key": "messages",
|
|
320
|
+
"output_key": "output"
|
|
321
|
+
})
|
|
322
|
+
serve_agent(agent_card=card, adapter=adapter, port=9002)
|
|
323
|
+
```
|
|
324
|
+
|
|
325
|
+
See [examples/07_langgraph_server.py](https://github.com/hybroai/a2a-adapter/blob/main/examples/07_langgraph_server.py) for complete example.
|
|
326
|
+
|
|
327
|
+
### Using A2A Agents from LangGraph
|
|
328
|
+
|
|
329
|
+
Call A2A agents from within a LangGraph workflow:
|
|
277
330
|
|
|
278
331
|
```python
|
|
279
332
|
from langgraph.graph import StateGraph
|
|
@@ -332,6 +385,19 @@ See [examples/06_langgraph_single_agent.py](https://github.com/hybroai/a2a-adapt
|
|
|
332
385
|
}
|
|
333
386
|
```
|
|
334
387
|
|
|
388
|
+
### LangGraph Adapter
|
|
389
|
+
|
|
390
|
+
```python
|
|
391
|
+
{
|
|
392
|
+
"adapter": "langgraph",
|
|
393
|
+
"graph": compiled_graph, # Required: CompiledGraph from StateGraph.compile()
|
|
394
|
+
"input_key": "messages", # Optional, default: "messages" (for chat) or "input"
|
|
395
|
+
"output_key": None, # Optional, extracts specific key from final state
|
|
396
|
+
"async_mode": False, # Optional, enables async task execution
|
|
397
|
+
"async_timeout": 300 # Optional, timeout for async mode (default: 300s)
|
|
398
|
+
}
|
|
399
|
+
```
|
|
400
|
+
|
|
335
401
|
### Callable Adapter
|
|
336
402
|
|
|
337
403
|
```python
|
|
@@ -342,6 +408,19 @@ See [examples/06_langgraph_single_agent.py](https://github.com/hybroai/a2a-adapt
|
|
|
342
408
|
}
|
|
343
409
|
```
|
|
344
410
|
|
|
411
|
+
### OpenClaw Adapter
|
|
412
|
+
|
|
413
|
+
```python
|
|
414
|
+
{
|
|
415
|
+
"adapter": "openclaw",
|
|
416
|
+
"session_id": "my-session", # Optional, auto-generated if not provided
|
|
417
|
+
"agent_id": None, # Optional, use default agent
|
|
418
|
+
"thinking": "low", # Optional: off|minimal|low|medium|high|xhigh
|
|
419
|
+
"timeout": 600, # Optional, command timeout in seconds
|
|
420
|
+
"async_mode": True # Optional, return Task immediately (default: True)
|
|
421
|
+
}
|
|
422
|
+
```
|
|
423
|
+
|
|
345
424
|
## Examples
|
|
346
425
|
|
|
347
426
|
The `examples/` directory contains complete working examples:
|
|
@@ -351,7 +430,9 @@ The `examples/` directory contains complete working examples:
|
|
|
351
430
|
- **03_single_langchain_agent.py** - LangChain streaming agent
|
|
352
431
|
- **04_single_agent_client.py** - A2A client for testing
|
|
353
432
|
- **05_custom_adapter.py** - Custom adapter implementations
|
|
354
|
-
- **06_langgraph_single_agent.py** -
|
|
433
|
+
- **06_langgraph_single_agent.py** - Calling A2A agents from LangGraph
|
|
434
|
+
- **07_langgraph_server.py** - LangGraph workflow as A2A server
|
|
435
|
+
- **08_openclaw_agent.py** - OpenClaw personal AI agent
|
|
355
436
|
|
|
356
437
|
Run any example:
|
|
357
438
|
|
|
@@ -455,13 +536,16 @@ Convert framework output to A2A Message or Task.
|
|
|
455
536
|
|
|
456
537
|
Check if this adapter supports streaming responses.
|
|
457
538
|
|
|
458
|
-
##
|
|
539
|
+
## Adapter Support
|
|
459
540
|
|
|
460
|
-
| Framework
|
|
461
|
-
|
|
|
462
|
-
| **n8n**
|
|
463
|
-
| **
|
|
464
|
-
| **
|
|
541
|
+
| Agent/Framework | Adapter | Non-Streaming | Streaming | Async Tasks | Status |
|
|
542
|
+
| --------------- | ------------------------ | ------------- | --------- | ----------- | --------- |
|
|
543
|
+
| **n8n** | `N8nAgentAdapter` | ✅ | ❌ | ✅ | ✅ Stable |
|
|
544
|
+
| **LangGraph** | `LangGraphAgentAdapter` | ✅ | ✅ | ✅ | ✅ Stable |
|
|
545
|
+
| **CrewAI** | `CrewAIAgentAdapter` | ✅ | ❌ | ✅ | ✅ Stable |
|
|
546
|
+
| **LangChain** | `LangChainAgentAdapter` | ✅ | ✅ | ❌ | ✅ Stable |
|
|
547
|
+
| **OpenClaw** | `OpenClawAgentAdapter` | ✅ | ❌ | ✅ | ✅ Stable |
|
|
548
|
+
| **Callable** | `CallableAgentAdapter` | ✅ | ✅ | ❌ | ✅ Stable |
|
|
465
549
|
|
|
466
550
|
## 🤝 Contributing
|
|
467
551
|
|
|
@@ -488,12 +572,14 @@ We welcome contributions from the community! Whether you're fixing bugs, adding
|
|
|
488
572
|
## Roadmap
|
|
489
573
|
|
|
490
574
|
- [x] Core adapter abstraction
|
|
491
|
-
- [x] N8n adapter
|
|
492
|
-
- [
|
|
493
|
-
- [
|
|
494
|
-
- [
|
|
495
|
-
- [
|
|
496
|
-
- [
|
|
575
|
+
- [x] N8n adapter (with async task support)
|
|
576
|
+
- [x] LangGraph adapter (with streaming and async tasks)
|
|
577
|
+
- [x] CrewAI adapter (with async task support)
|
|
578
|
+
- [x] LangChain adapter (with streaming)
|
|
579
|
+
- [x] Callable adapter (with streaming)
|
|
580
|
+
- [x] OpenClaw adapter (with async tasks)
|
|
581
|
+
- [x] Comprehensive examples
|
|
582
|
+
- [x] Task support (async execution pattern)
|
|
497
583
|
- [ ] Artifact support (file uploads/downloads)
|
|
498
584
|
- [ ] AutoGen adapter
|
|
499
585
|
- [ ] Semantic Kernel adapter
|
|
@@ -528,12 +614,6 @@ We welcome contributions from the community! Whether you're fixing bugs, adding
|
|
|
528
614
|
|
|
529
615
|
Apache-2.0 License - see [LICENSE](https://github.com/hybroai/a2a-adapter/blob/main/LICENSE) file for details.
|
|
530
616
|
|
|
531
|
-
## Credits
|
|
532
|
-
|
|
533
|
-
Built with ❤️ by [HYBRO AI](https://hybro.ai)
|
|
534
|
-
|
|
535
|
-
Powered by the [A2A Protocol](https://github.com/a2aproject/A2A)
|
|
536
|
-
|
|
537
617
|
## 💬 Community & Support
|
|
538
618
|
|
|
539
619
|
- 📚 **[Full Documentation](https://github.com/hybroai/a2a-adapter/blob/main/README.md)** - Complete API reference and guides
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
a2a_adapter/__init__.py,sha256=rGARy2mP88R-gM0A-0ZxUAGIbZaF9Kzp-Gfg1tO8cZ8,1252
|
|
2
|
+
a2a_adapter/adapter.py,sha256=xCHmNNi5C_71A8OlIf_UZ1gUcvAFAIMrq8vGV_tYuTM,6098
|
|
3
|
+
a2a_adapter/client.py,sha256=YvKgeMS7bPFsnIKhkzUv9wZ0QmBG8UJGsz_AdIn-SNA,9468
|
|
4
|
+
a2a_adapter/loader.py,sha256=HxUYzmD_BOZy4L_fVcl6lq8n3xvhytZqEP0wbO-deiw,7759
|
|
5
|
+
a2a_adapter/integrations/__init__.py,sha256=vhBLCVHqqN_YVdZGw55TMuKU1YcC_RLbGtcrQhGHEGA,1518
|
|
6
|
+
a2a_adapter/integrations/callable.py,sha256=TLtHtFwYr3vPmYWCcCvYGqSEAPV3QZxm8DnYAsy92KM,9404
|
|
7
|
+
a2a_adapter/integrations/crewai.py,sha256=YjTR-qU5m5XK0ojkngVRB6vWicfi6c6ZkGBoHBxrbR8,20410
|
|
8
|
+
a2a_adapter/integrations/langchain.py,sha256=0zpjd2vTTAEBdywsG-3rc04hVGl7Wsw-7mwJfPyc2ZM,11118
|
|
9
|
+
a2a_adapter/integrations/langgraph.py,sha256=euOpSXmgsqEw-mYzn_fmMxX3INaFI7gYqiNULvplTDw,27035
|
|
10
|
+
a2a_adapter/integrations/n8n.py,sha256=d9RqAS7y4eJZPWBaSOHBnT-wqFvTuJtmbE4rsvu5V2o,30171
|
|
11
|
+
a2a_adapter/integrations/openclaw.py,sha256=5qE9MdDQeCV0zwlPYAEySe0Piejz9tq7R83GW0OoRcc,48298
|
|
12
|
+
a2a_adapter-0.1.5.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
|
|
13
|
+
a2a_adapter-0.1.5.dist-info/METADATA,sha256=9MhhgcTByuH_VqKStSIxuNWJkABbLIwZsK4Lb_yIdSo,20405
|
|
14
|
+
a2a_adapter-0.1.5.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
|
|
15
|
+
a2a_adapter-0.1.5.dist-info/top_level.txt,sha256=b1O1dTJ2AoPEB2x-r5IHEsS2x1fczOzTrpR2DgF3LgE,12
|
|
16
|
+
a2a_adapter-0.1.5.dist-info/RECORD,,
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
a2a_adapter/__init__.py,sha256=PZu--DO6e7lo5gr8OEmP8F64uJKrhG8_SCAF-kpGZyg,1252
|
|
2
|
-
a2a_adapter/adapter.py,sha256=xCHmNNi5C_71A8OlIf_UZ1gUcvAFAIMrq8vGV_tYuTM,6098
|
|
3
|
-
a2a_adapter/client.py,sha256=TLkYBGQitZdrw_FY_ov9EjHicJX0dqqXaQ-dwfkUv2I,7397
|
|
4
|
-
a2a_adapter/loader.py,sha256=QEhozlS0dOu4qXoWpqglV1J2x2FN-CtWq4_ueq5Pr7o,4692
|
|
5
|
-
a2a_adapter/integrations/__init__.py,sha256=vDYdcveV_U-nr39fvSnpIif2QgDF_AS6CPlElpBDrDs,1099
|
|
6
|
-
a2a_adapter/integrations/callable.py,sha256=GsKZO5TyJVMOAS21cr7JNVKqjg7Z2CSc9Q9vhzgkapY,5917
|
|
7
|
-
a2a_adapter/integrations/crewai.py,sha256=S4mF1mJeTAfMdif-su1E7jUjWgxAeFKlgz9WXlZEKN0,4813
|
|
8
|
-
a2a_adapter/integrations/langchain.py,sha256=raaaJA_FS3qBsURbCbBq2bcfsRMdKgpVbKEUN3rWA4s,5866
|
|
9
|
-
a2a_adapter/integrations/n8n.py,sha256=d9RqAS7y4eJZPWBaSOHBnT-wqFvTuJtmbE4rsvu5V2o,30171
|
|
10
|
-
a2a_adapter-0.1.3.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
|
|
11
|
-
a2a_adapter-0.1.3.dist-info/METADATA,sha256=PDtE_QDY4006UYYEbSt_9FKOom9eXuXvPyHdszf6Gow,17499
|
|
12
|
-
a2a_adapter-0.1.3.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
13
|
-
a2a_adapter-0.1.3.dist-info/top_level.txt,sha256=b1O1dTJ2AoPEB2x-r5IHEsS2x1fczOzTrpR2DgF3LgE,12
|
|
14
|
-
a2a_adapter-0.1.3.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|