agentmesh-py 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.
- agentmesh_py-0.1.5.dist-info/METADATA +438 -0
- agentmesh_py-0.1.5.dist-info/RECORD +55 -0
- agentmesh_py-0.1.5.dist-info/WHEEL +5 -0
- agentmesh_py-0.1.5.dist-info/licenses/LICENSE +21 -0
- agentmesh_py-0.1.5.dist-info/top_level.txt +1 -0
- mesh/__init__.py +192 -0
- mesh/backends/__init__.py +11 -0
- mesh/backends/base.py +147 -0
- mesh/backends/memory.py +173 -0
- mesh/backends/sqlite.py +382 -0
- mesh/builders/__init__.py +7 -0
- mesh/builders/state_graph.py +638 -0
- mesh/checkpoints.py +260 -0
- mesh/core/__init__.py +19 -0
- mesh/core/events.py +504 -0
- mesh/core/executor.py +1851 -0
- mesh/core/graph.py +418 -0
- mesh/core/state.py +248 -0
- mesh/input_collection.py +555 -0
- mesh/interrupts.py +179 -0
- mesh/nodes/__init__.py +45 -0
- mesh/nodes/agent.py +1496 -0
- mesh/nodes/approval.py +254 -0
- mesh/nodes/base.py +177 -0
- mesh/nodes/condition.py +698 -0
- mesh/nodes/conversation.py +766 -0
- mesh/nodes/data_handler.py +395 -0
- mesh/nodes/dynamic_tool_selector.py +338 -0
- mesh/nodes/end.py +55 -0
- mesh/nodes/llm.py +925 -0
- mesh/nodes/loop.py +367 -0
- mesh/nodes/orchestrator.py +459 -0
- mesh/nodes/rag.py +361 -0
- mesh/nodes/start.py +91 -0
- mesh/nodes/sub_agent.py +95 -0
- mesh/nodes/subgraph.py +115 -0
- mesh/nodes/tool.py +235 -0
- mesh/parallel.py +427 -0
- mesh/parsers/__init__.py +10 -0
- mesh/parsers/react_flow.py +1411 -0
- mesh/parsers/validation.py +52 -0
- mesh/py.typed +1 -0
- mesh/streaming/__init__.py +9 -0
- mesh/streaming/iterator.py +65 -0
- mesh/streaming/modes.py +334 -0
- mesh/streaming/sse.py +171 -0
- mesh/subgraph.py +320 -0
- mesh/utils/__init__.py +31 -0
- mesh/utils/config.py +79 -0
- mesh/utils/errors.py +42 -0
- mesh/utils/input_parser.py +136 -0
- mesh/utils/mermaid.py +235 -0
- mesh/utils/registry.py +210 -0
- mesh/utils/translator_orchestrator.py +313 -0
- mesh/utils/variables.py +261 -0
|
@@ -0,0 +1,438 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: agentmesh-py
|
|
3
|
+
Version: 0.1.5
|
|
4
|
+
Summary: Python Agent Graph Orchestration Engine - Build multi-agent workflows as executable graphs
|
|
5
|
+
Author-email: Richard Scheiwe <rscheiwe@users.noreply.github.com>
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/rscheiwe/mesh
|
|
8
|
+
Project-URL: Documentation, https://github.com/rscheiwe/mesh#readme
|
|
9
|
+
Project-URL: Repository, https://github.com/rscheiwe/mesh
|
|
10
|
+
Project-URL: Issues, https://github.com/rscheiwe/mesh/issues
|
|
11
|
+
Keywords: agents,graph,orchestration,workflow,llm,ai,streaming
|
|
12
|
+
Classifier: Development Status :: 3 - Alpha
|
|
13
|
+
Classifier: Intended Audience :: Developers
|
|
14
|
+
Classifier: Programming Language :: Python :: 3
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
17
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
18
|
+
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
|
19
|
+
Requires-Python: >=3.11
|
|
20
|
+
Description-Content-Type: text/markdown
|
|
21
|
+
License-File: LICENSE
|
|
22
|
+
Requires-Dist: pydantic>=2.0.0
|
|
23
|
+
Requires-Dist: aiosqlite>=0.19.0
|
|
24
|
+
Requires-Dist: openai>=1.0.0
|
|
25
|
+
Requires-Dist: httpx>=0.24.0
|
|
26
|
+
Requires-Dist: jsonpath-ng>=1.6.0
|
|
27
|
+
Requires-Dist: python-dotenv>=1.0.0
|
|
28
|
+
Provides-Extra: dev
|
|
29
|
+
Requires-Dist: pytest>=7.4.0; extra == "dev"
|
|
30
|
+
Requires-Dist: pytest-asyncio>=0.21.0; extra == "dev"
|
|
31
|
+
Requires-Dist: pytest-cov>=4.1.0; extra == "dev"
|
|
32
|
+
Requires-Dist: black>=23.0.0; extra == "dev"
|
|
33
|
+
Requires-Dist: ruff>=0.1.0; extra == "dev"
|
|
34
|
+
Requires-Dist: mypy>=1.5.0; extra == "dev"
|
|
35
|
+
Provides-Extra: server
|
|
36
|
+
Requires-Dist: fastapi>=0.104.0; extra == "server"
|
|
37
|
+
Requires-Dist: sse-starlette>=1.8.0; extra == "server"
|
|
38
|
+
Requires-Dist: uvicorn>=0.24.0; extra == "server"
|
|
39
|
+
Provides-Extra: agents
|
|
40
|
+
Requires-Dist: openai-agents>=0.1.0; extra == "agents"
|
|
41
|
+
Provides-Extra: all
|
|
42
|
+
Requires-Dist: agentmesh-py[agents,dev,server]; extra == "all"
|
|
43
|
+
Dynamic: license-file
|
|
44
|
+
|
|
45
|
+
<div align="center">
|
|
46
|
+
|
|
47
|
+
<img src="assets/mesh-network.png" alt="Mesh Logo" width="400"/>
|
|
48
|
+
|
|
49
|
+
# Mesh: Python Agent Graph Orchestration Engine
|
|
50
|
+
|
|
51
|
+
**Build agent and multi-agent workflows as executable graphs**
|
|
52
|
+
|
|
53
|
+
[](https://opensource.org/licenses/MIT)
|
|
54
|
+
[](https://www.python.org/downloads/)
|
|
55
|
+
|
|
56
|
+
</div>
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
**Mesh** is a lightweight Python library for orchestrating multi-agent workflows as executable graphs. Build complex agent systems with token-by-token streaming, state management, and seamless integration with Vel and OpenAI Agents SDK.
|
|
61
|
+
|
|
62
|
+
## Documentation
|
|
63
|
+
|
|
64
|
+
📚 **[View Full Documentation →](https://rscheiwe.github.io/mesh)**
|
|
65
|
+
|
|
66
|
+
Comprehensive guides and API reference:
|
|
67
|
+
|
|
68
|
+
- **[Getting Started](https://rscheiwe.github.io/mesh/getting-started)** - Installation and configuration
|
|
69
|
+
- **[Quick Start](https://rscheiwe.github.io/mesh/quick-start)** - Build your first graph in 5 minutes
|
|
70
|
+
- **[Core Concepts](https://rscheiwe.github.io/mesh/concepts/graphs)** - Graphs, nodes, execution, events
|
|
71
|
+
- **[Guides](https://rscheiwe.github.io/mesh/guides/streaming)** - Streaming, loops, state management, variables
|
|
72
|
+
- **[Integrations](https://rscheiwe.github.io/mesh/integrations/vel)** - Vel, OpenAI Agents SDK
|
|
73
|
+
- **[API Reference](https://rscheiwe.github.io/mesh/api-reference)** - Complete API documentation
|
|
74
|
+
- **[Examples](https://rscheiwe.github.io/mesh/examples)** - Working code examples
|
|
75
|
+
|
|
76
|
+
## Features
|
|
77
|
+
|
|
78
|
+
- **Graph-Based Workflows**: Build agent workflows as directed graphs with controlled cycles
|
|
79
|
+
- **Dual API**: Programmatic (LangGraph-style) and declarative (React Flow JSON) interfaces
|
|
80
|
+
- **Graph Visualization**: Generate Mermaid diagrams with color-coded node types
|
|
81
|
+
- **Token-by-Token Streaming**: Real-time streaming with provider-agnostic events
|
|
82
|
+
- **Advanced Event Types**: Reasoning (o1/o3), usage tracking, citations, multi-modal files, custom events
|
|
83
|
+
- **Event Translation**: Use Vel's standardized events or provider-native events
|
|
84
|
+
- **Multiple Agent Frameworks**: Auto-detection for Vel and OpenAI Agents SDK
|
|
85
|
+
- **Multi-Provider Support**: OpenAI, Anthropic, Google via Vel translation
|
|
86
|
+
- **7 Core Node Types**: Start, End, Agent, LLM, Tool, Condition, Loop
|
|
87
|
+
- **State Persistence**: Pluggable backends (SQLite, in-memory, custom)
|
|
88
|
+
- **Variable Resolution**: Template variables for dynamic workflows
|
|
89
|
+
- **Production Ready**: Error handling, retries, and structured logging
|
|
90
|
+
|
|
91
|
+
## Installation
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
# Basic installation
|
|
95
|
+
pip install agentmesh-py
|
|
96
|
+
|
|
97
|
+
# With OpenAI Agents SDK support
|
|
98
|
+
pip install agentmesh-py[agents]
|
|
99
|
+
|
|
100
|
+
# With FastAPI server support
|
|
101
|
+
pip install agentmesh-py[server]
|
|
102
|
+
|
|
103
|
+
# Development installation
|
|
104
|
+
pip install agentmesh-py[dev]
|
|
105
|
+
|
|
106
|
+
# All features
|
|
107
|
+
pip install agentmesh-py[all]
|
|
108
|
+
|
|
109
|
+
# With Vel SDK support (install separately)
|
|
110
|
+
pip install agentmesh-py
|
|
111
|
+
pip install git+https://github.com/rscheiwe/vel.git
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
## Configuration
|
|
115
|
+
|
|
116
|
+
Create a `.env` file in your project root:
|
|
117
|
+
|
|
118
|
+
```bash
|
|
119
|
+
cp .env.example .env
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
Add your OpenAI API key:
|
|
123
|
+
|
|
124
|
+
```bash
|
|
125
|
+
OPENAI_API_KEY=sk-your-key-here
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
Load it in your code:
|
|
129
|
+
|
|
130
|
+
```python
|
|
131
|
+
from mesh.utils import load_env
|
|
132
|
+
load_env() # Loads variables from .env
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
## Quick Start
|
|
136
|
+
|
|
137
|
+
### Programmatic API (LangGraph-style)
|
|
138
|
+
|
|
139
|
+
```python
|
|
140
|
+
import asyncio
|
|
141
|
+
from mesh import StateGraph, Executor, ExecutionContext, MemoryBackend
|
|
142
|
+
from mesh.nodes import LLMNode
|
|
143
|
+
|
|
144
|
+
async def main():
|
|
145
|
+
# Build graph
|
|
146
|
+
graph = StateGraph()
|
|
147
|
+
graph.add_node("llm", None, node_type="llm", model="gpt-4")
|
|
148
|
+
graph.add_edge("START", "llm")
|
|
149
|
+
graph.set_entry_point("llm")
|
|
150
|
+
|
|
151
|
+
# Compile and execute
|
|
152
|
+
compiled = graph.compile()
|
|
153
|
+
executor = Executor(compiled, MemoryBackend())
|
|
154
|
+
context = ExecutionContext(
|
|
155
|
+
graph_id="my-graph",
|
|
156
|
+
session_id="session-1",
|
|
157
|
+
chat_history=[],
|
|
158
|
+
variables={},
|
|
159
|
+
state={}
|
|
160
|
+
)
|
|
161
|
+
|
|
162
|
+
# Stream results
|
|
163
|
+
async for event in executor.execute("What is 2+2?", context):
|
|
164
|
+
if event.type == "token":
|
|
165
|
+
print(event.content, end="", flush=True)
|
|
166
|
+
|
|
167
|
+
asyncio.run(main())
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
### React Flow JSON (Flowise-compatible)
|
|
171
|
+
|
|
172
|
+
```python
|
|
173
|
+
from mesh import ReactFlowParser, NodeRegistry, Executor
|
|
174
|
+
|
|
175
|
+
# Parse Flowise JSON
|
|
176
|
+
registry = NodeRegistry()
|
|
177
|
+
parser = ReactFlowParser(registry)
|
|
178
|
+
graph = parser.parse(flow_json)
|
|
179
|
+
|
|
180
|
+
# Execute
|
|
181
|
+
executor = Executor(graph, backend)
|
|
182
|
+
async for event in executor.execute(input_data, context):
|
|
183
|
+
print(event)
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
### FastAPI Server
|
|
187
|
+
|
|
188
|
+
```python
|
|
189
|
+
from fastapi import FastAPI
|
|
190
|
+
from mesh import Executor, ExecutionContext
|
|
191
|
+
from mesh.streaming import SSEAdapter
|
|
192
|
+
|
|
193
|
+
app = FastAPI()
|
|
194
|
+
|
|
195
|
+
@app.post("/execute/stream")
|
|
196
|
+
async def execute_stream(request: ExecuteRequest):
|
|
197
|
+
executor = Executor(graph, backend)
|
|
198
|
+
context = ExecutionContext(...)
|
|
199
|
+
|
|
200
|
+
adapter = SSEAdapter()
|
|
201
|
+
return adapter.to_streaming_response(
|
|
202
|
+
executor.execute(request.input, context)
|
|
203
|
+
)
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
## Core Concepts
|
|
207
|
+
|
|
208
|
+
### Node Types
|
|
209
|
+
|
|
210
|
+
1. **StartNode**: Entry point to the graph
|
|
211
|
+
2. **EndNode**: Exit point from the graph
|
|
212
|
+
3. **AgentNode**: Wraps Vel or OpenAI agents with auto-detection
|
|
213
|
+
4. **LLMNode**: Direct LLM calls with streaming
|
|
214
|
+
5. **ToolNode**: Execute Python functions
|
|
215
|
+
6. **ConditionNode**: Conditional branching
|
|
216
|
+
7. **LoopNode**: Iterate over arrays
|
|
217
|
+
|
|
218
|
+
### Variable Resolution
|
|
219
|
+
|
|
220
|
+
Mesh supports template variables in node configurations:
|
|
221
|
+
|
|
222
|
+
- `{{$question}}` - User input
|
|
223
|
+
- `{{node_id}}` - Reference node output
|
|
224
|
+
- `{{node_id.field}}` - Access nested fields
|
|
225
|
+
- `{{$vars.key}}` - Global variables
|
|
226
|
+
- `{{$chat_history}}` - Formatted chat history
|
|
227
|
+
- `{{$iteration}}` - Current iteration value (in loops)
|
|
228
|
+
|
|
229
|
+
### State Management
|
|
230
|
+
|
|
231
|
+
```python
|
|
232
|
+
# In-memory (for development)
|
|
233
|
+
from mesh.backends import MemoryBackend
|
|
234
|
+
backend = MemoryBackend()
|
|
235
|
+
|
|
236
|
+
# SQLite (for production)
|
|
237
|
+
from mesh.backends import SQLiteBackend
|
|
238
|
+
backend = SQLiteBackend("mesh_state.db")
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
## Advanced Usage
|
|
242
|
+
|
|
243
|
+
### Conditional Branching
|
|
244
|
+
|
|
245
|
+
```python
|
|
246
|
+
from mesh.nodes import Condition
|
|
247
|
+
|
|
248
|
+
def check_success(output):
|
|
249
|
+
return "success" in str(output).lower()
|
|
250
|
+
|
|
251
|
+
graph.add_node("condition", [
|
|
252
|
+
Condition("success", check_success, "success_handler"),
|
|
253
|
+
Condition("failure", lambda x: not check_success(x), "error_handler"),
|
|
254
|
+
], node_type="condition")
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
### Loop Processing
|
|
258
|
+
|
|
259
|
+
```python
|
|
260
|
+
graph.add_node("loop", None, node_type="loop",
|
|
261
|
+
array_path="$.items", max_iterations=100)
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
### Custom Tools
|
|
265
|
+
|
|
266
|
+
```python
|
|
267
|
+
def my_tool(input: str, multiplier: int = 2) -> str:
|
|
268
|
+
return input * multiplier
|
|
269
|
+
|
|
270
|
+
graph.add_node("tool", my_tool, node_type="tool",
|
|
271
|
+
config={"bindings": {"multiplier": 3}})
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
### Agent Integration
|
|
275
|
+
|
|
276
|
+
```python
|
|
277
|
+
# Vel Agent (with streaming)
|
|
278
|
+
from vel import Agent as VelAgent
|
|
279
|
+
vel_agent = VelAgent(
|
|
280
|
+
id="assistant",
|
|
281
|
+
model={
|
|
282
|
+
"provider": "openai",
|
|
283
|
+
"name": "gpt-4",
|
|
284
|
+
"temperature": 0.7,
|
|
285
|
+
},
|
|
286
|
+
)
|
|
287
|
+
graph.add_node("agent", vel_agent, node_type="agent")
|
|
288
|
+
|
|
289
|
+
# Stream the output
|
|
290
|
+
async for event in executor.execute("Hello!", context):
|
|
291
|
+
if event.type == "token":
|
|
292
|
+
print(event.content, end="", flush=True)
|
|
293
|
+
|
|
294
|
+
# OpenAI Agents SDK (with Vel translation by default)
|
|
295
|
+
from agents import Agent
|
|
296
|
+
openai_agent = Agent(
|
|
297
|
+
name="Assistant",
|
|
298
|
+
instructions="You are a helpful assistant"
|
|
299
|
+
)
|
|
300
|
+
graph.add_node("agent", openai_agent, node_type="agent", config={"model": "gpt-4"})
|
|
301
|
+
|
|
302
|
+
# Or use native events
|
|
303
|
+
graph.add_node("agent", openai_agent, node_type="agent",
|
|
304
|
+
use_native_events=True, config={"model": "gpt-4"})
|
|
305
|
+
```
|
|
306
|
+
|
|
307
|
+
### Event Translation
|
|
308
|
+
|
|
309
|
+
By default, Mesh uses Vel's event translation for consistent event handling across providers:
|
|
310
|
+
|
|
311
|
+
```python
|
|
312
|
+
# Default: Vel-translated events (consistent across providers)
|
|
313
|
+
graph.add_node("agent", agent, node_type="agent")
|
|
314
|
+
|
|
315
|
+
# All providers emit the same event types
|
|
316
|
+
async for event in executor.execute(input, context):
|
|
317
|
+
if event.type == "token": # Same for OpenAI, Anthropic, Google
|
|
318
|
+
print(event.content, end="", flush=True)
|
|
319
|
+
|
|
320
|
+
# Optional: Use provider's native events
|
|
321
|
+
graph.add_node("agent", agent, node_type="agent", use_native_events=True)
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
See [Event Translation Guide](examples/EVENT_TRANSLATION.md) for details.
|
|
325
|
+
|
|
326
|
+
## Architecture
|
|
327
|
+
|
|
328
|
+
```
|
|
329
|
+
┌─────────────────────────────────────────────┐
|
|
330
|
+
│ User Application │
|
|
331
|
+
│ (FastAPI/Flask/Django) │
|
|
332
|
+
└────────────────┬────────────────────────────┘
|
|
333
|
+
│
|
|
334
|
+
▼
|
|
335
|
+
┌─────────────────────────────────────────────┐
|
|
336
|
+
│ MESH LIBRARY │
|
|
337
|
+
├─────────────────────────────────────────────┤
|
|
338
|
+
│ ┌──────────────┐ ┌──────────────┐ │
|
|
339
|
+
│ │ Parsers │ │ Builders │ │
|
|
340
|
+
│ │ - ReactFlow │ │ - StateGraph│ │
|
|
341
|
+
│ └──────┬───────┘ └──────┬───────┘ │
|
|
342
|
+
│ └──────────┬─────────┘ │
|
|
343
|
+
│ ▼ │
|
|
344
|
+
│ ┌──────────────────┐ │
|
|
345
|
+
│ │ Graph Compiler │ │
|
|
346
|
+
│ └────────┬─────────┘ │
|
|
347
|
+
│ ▼ │
|
|
348
|
+
│ ┌──────────────────┐ │
|
|
349
|
+
│ │ Execution Engine │ │
|
|
350
|
+
│ │ - Queue-based │ │
|
|
351
|
+
│ │ - Streaming │ │
|
|
352
|
+
│ └────────┬─────────┘ │
|
|
353
|
+
│ ▼ │
|
|
354
|
+
│ ┌───────────────────────┐ │
|
|
355
|
+
│ │ Node Implementations│ │
|
|
356
|
+
│ │ Agent│LLM│Tool│... │ │
|
|
357
|
+
│ └───────────────────────┘ │
|
|
358
|
+
└─────────────────────────────────────────────┘
|
|
359
|
+
```
|
|
360
|
+
|
|
361
|
+
## Examples
|
|
362
|
+
|
|
363
|
+
See the **[examples/](examples/)** directory:
|
|
364
|
+
|
|
365
|
+
- **[simple_agent.py](examples/simple_agent.py)** - Basic LLM usage with streaming
|
|
366
|
+
- **[vel_agent_streaming.py](examples/vel_agent_streaming.py)** - Vel agent with token-by-token streaming
|
|
367
|
+
- **[openai_agent_streaming.py](examples/openai_agent_streaming.py)** - OpenAI Agents SDK with streaming
|
|
368
|
+
- **[event_translation_comparison.py](examples/event_translation_comparison.py)** - Compare Vel vs native events
|
|
369
|
+
- **[react_flow_parse.py](examples/react_flow_parse.py)** - Parse Flowise JSON
|
|
370
|
+
- **[fastapi_server.py](examples/fastapi_server.py)** - Full API server with streaming
|
|
371
|
+
|
|
372
|
+
**Guides:**
|
|
373
|
+
|
|
374
|
+
- **[Event Translation Guide](examples/EVENT_TRANSLATION.md)** - Detailed event translation documentation
|
|
375
|
+
- **[Vel Integration Guide](examples/VEL_INTEGRATION.md)** - Vel-specific integration
|
|
376
|
+
- **[OpenAI Agents Integration](examples/OPENAI_AGENTS_INTEGRATION.md)** - OpenAI SDK integration
|
|
377
|
+
- **[Native Events Implementation](NATIVE_EVENTS_IMPLEMENTATION.md)** - use_native_events flag details
|
|
378
|
+
|
|
379
|
+
## Development
|
|
380
|
+
|
|
381
|
+
```bash
|
|
382
|
+
# Clone repository
|
|
383
|
+
git clone https://github.com/rscheiwe/mesh.git
|
|
384
|
+
cd mesh
|
|
385
|
+
|
|
386
|
+
# Create virtual environment
|
|
387
|
+
python -m venv venv
|
|
388
|
+
source venv/bin/activate # On Windows: venv\Scripts\activate
|
|
389
|
+
|
|
390
|
+
# Install development dependencies
|
|
391
|
+
pip install -e ".[all]"
|
|
392
|
+
|
|
393
|
+
# Run tests
|
|
394
|
+
pytest
|
|
395
|
+
|
|
396
|
+
# Run tests with coverage
|
|
397
|
+
pytest --cov=mesh --cov-report=html
|
|
398
|
+
|
|
399
|
+
# Format code
|
|
400
|
+
black mesh/
|
|
401
|
+
ruff check mesh/
|
|
402
|
+
|
|
403
|
+
# Type checking
|
|
404
|
+
mypy mesh/
|
|
405
|
+
```
|
|
406
|
+
|
|
407
|
+
**For AI Assistants:** See [CLAUDE.md](CLAUDE.md) for comprehensive development context and architecture details.
|
|
408
|
+
|
|
409
|
+
## Roadmap
|
|
410
|
+
|
|
411
|
+
- [ ] WebSocket streaming support
|
|
412
|
+
- [ ] Distributed execution
|
|
413
|
+
- [ ] Visual graph editor
|
|
414
|
+
- [ ] LangChain/LlamaIndex integration
|
|
415
|
+
- [ ] Human-in-the-loop approval nodes
|
|
416
|
+
- [ ] Sub-graph composition
|
|
417
|
+
|
|
418
|
+
## Contributing
|
|
419
|
+
|
|
420
|
+
Contributions welcome! Please read our contributing guidelines and submit PRs.
|
|
421
|
+
|
|
422
|
+
## License
|
|
423
|
+
|
|
424
|
+
MIT License - see LICENSE file for details.
|
|
425
|
+
|
|
426
|
+
## Credits
|
|
427
|
+
|
|
428
|
+
Inspired by:
|
|
429
|
+
|
|
430
|
+
- [Flowise](https://github.com/FlowiseAI/Flowise) - React Flow execution patterns
|
|
431
|
+
- [LangGraph](https://github.com/langchain-ai/langgraph) - StateGraph API design
|
|
432
|
+
- [Vel](https://github.com/rscheiwe/vel) - Event translation layer
|
|
433
|
+
|
|
434
|
+
## Support
|
|
435
|
+
|
|
436
|
+
- **Documentation:** https://rscheiwe.github.io/mesh
|
|
437
|
+
- **GitHub Issues:** https://github.com/rscheiwe/mesh/issues
|
|
438
|
+
- **GitHub Repository:** https://github.com/rscheiwe/mesh
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
agentmesh_py-0.1.5.dist-info/licenses/LICENSE,sha256=ImWemWnmzT_Z_xxO2LxpR0o5Q8SqDdtRtXPtDosSmow,1072
|
|
2
|
+
mesh/__init__.py,sha256=yVe5A93kYDx2OuJkI9e-PCcZM8tZRHMKj3lrvnCr_kU,4719
|
|
3
|
+
mesh/checkpoints.py,sha256=6w4eNRHKDUiKpO3KwBSlClor2UOko43QLP_ZeXFf5dY,9420
|
|
4
|
+
mesh/input_collection.py,sha256=N0rn-yoCKmsgn_wJpkau_qPD4aqMoNhEs47ADa1l_eU,20139
|
|
5
|
+
mesh/interrupts.py,sha256=11iD4KE6jSwyW9KDKEQE-5Vpf6JVsyXkoIeSwcta-is,6223
|
|
6
|
+
mesh/parallel.py,sha256=-oP5FPDWE9ywl3Cm7A3Kd1yPVq9LSkiXE0gG2AQrv0A,14578
|
|
7
|
+
mesh/py.typed,sha256=cZhjU4bgcfkAJgWW8rlBPwh-6sWO56Oixl8mV1RlwjI,74
|
|
8
|
+
mesh/subgraph.py,sha256=K3J51NYqR6f2b_9MEjDXXGe-WEKYejZUgztp7TljkYo,11443
|
|
9
|
+
mesh/backends/__init__.py,sha256=8NunjV1c-rIL0IB9xTpFYc6yPSHHMZAmcJZAhQch8Oo,250
|
|
10
|
+
mesh/backends/base.py,sha256=zg9cSYKlB7JK3XCPX0303yPgcecySQpUUU3o2FHQVWo,3674
|
|
11
|
+
mesh/backends/memory.py,sha256=ADpHARTDUr0gskJQEUgrCN5JKjnZ9J8NEv_NrgxlVwo,5164
|
|
12
|
+
mesh/backends/sqlite.py,sha256=0MNf-NHyRwSOIJAKopLwyNHgNjccFtF5eRo5_sF8EA8,12391
|
|
13
|
+
mesh/builders/__init__.py,sha256=0HWZVaLjiXJpS4x_MIzCZ7osvp4kvQLAXSPTVhHS61A,145
|
|
14
|
+
mesh/builders/state_graph.py,sha256=xEyHQAjatlYpghLq-jn7RYQVApMJkGmWnpM1UBypej8,23593
|
|
15
|
+
mesh/core/__init__.py,sha256=6GMPzloHitJh9wh7Kkf4j2vR4JZdr5i-BtDVY0KXLXA,496
|
|
16
|
+
mesh/core/events.py,sha256=Pfo8qbvhyVNtsGnpQF9aW9H_GM-QU_CIcIAcDLbyFpU,18083
|
|
17
|
+
mesh/core/executor.py,sha256=unxhWSPNOrd9RWDISqxfjVzNFZmzIzYgha1qH3z0Yew,74479
|
|
18
|
+
mesh/core/graph.py,sha256=7cFAOoNfDpgkAG3J28A_R0htNSfofdBx69GiG2lVDHI,16010
|
|
19
|
+
mesh/core/state.py,sha256=2G83MN_l1VgvRQQTv6sCqeI1pB6xKBljvcHm3_pwheo,8029
|
|
20
|
+
mesh/nodes/__init__.py,sha256=iGF4o3yyk5nbKUjffpkK4n7n9CWiG_LuPVfVXdlTBdg,1331
|
|
21
|
+
mesh/nodes/agent.py,sha256=X6JWnxv6-x9A414FAHvF_mXt_yf0zMBoPKUjOwRppnM,65399
|
|
22
|
+
mesh/nodes/approval.py,sha256=ydx2iOtCFLhvHufgtVyuX6I9lWUStBwebfcLsyiFFCk,8797
|
|
23
|
+
mesh/nodes/base.py,sha256=RbikpWV_Vv7EGZwwdgDhLaaJJor7mUGJV4c30nK_FIg,5132
|
|
24
|
+
mesh/nodes/condition.py,sha256=tzp21BUgw-cp6T16s66G_uBMhqXq1SwCIC1bKs2N4CE,25487
|
|
25
|
+
mesh/nodes/conversation.py,sha256=Vdcgu05b0CtGox-Uy3P9IyhlAssgbllQypI3fUlMHOs,32334
|
|
26
|
+
mesh/nodes/data_handler.py,sha256=V6mPIWukxP0q44_piHcIbMEzaaK-Xp1QTeIB7YcncNA,14650
|
|
27
|
+
mesh/nodes/dynamic_tool_selector.py,sha256=K0b-6quvqnmmm_3se46dwS_JjERmXEjkuvOIT95R_34,11967
|
|
28
|
+
mesh/nodes/end.py,sha256=2weo6pmIDkCVXrUDPFAgpgMQ2fseog0-WJRFUTxFKv0,1521
|
|
29
|
+
mesh/nodes/llm.py,sha256=BBXDV7uTd__7TLjJ08f-6sgSQ6t81W-4akPuLYQVaQY,35139
|
|
30
|
+
mesh/nodes/loop.py,sha256=1dzLmDu46Fgyo8Rx4jaLBg6iU7EhaLK9Qt_XFpXntCo,12166
|
|
31
|
+
mesh/nodes/orchestrator.py,sha256=t_dd7Q9Ch2-b-7pkb8EP5gUhTJCf3-BsNwW1egBz58E,17532
|
|
32
|
+
mesh/nodes/rag.py,sha256=1IHiB7Hw8b3MoAlpTTjHkdXRu59q11K4KPMORASo4OY,12342
|
|
33
|
+
mesh/nodes/start.py,sha256=NoEfvBVGBua2LbHSnhHbaxXz0ccXqtOniN-WFKyGV_U,3066
|
|
34
|
+
mesh/nodes/sub_agent.py,sha256=RdtwKbyNQKOvpOi3t64aeWxxXJ3hukdadHU0846bHEw,3106
|
|
35
|
+
mesh/nodes/subgraph.py,sha256=ycEhelmnEt4DA7IvQCAxAV99pkJa3h-Q7r3NgJ8b2ew,3540
|
|
36
|
+
mesh/nodes/tool.py,sha256=WhUwj5qqZmoH0ixXDvobeXj1W5Cva52jqSOahqQTLdY,8350
|
|
37
|
+
mesh/parsers/__init__.py,sha256=TxZr4PZzing35Z4dyQG_qq81HKwU_xjDHUbbAfdHJpc,262
|
|
38
|
+
mesh/parsers/react_flow.py,sha256=bmIci2865sIaaE-ksW_1SdSNU6QPsYICiOSR2cD2XgY,54632
|
|
39
|
+
mesh/parsers/validation.py,sha256=KfKyqNCeybpOUL039MWes_NgB-QQ9LL7yQS0jcml5_M,1469
|
|
40
|
+
mesh/streaming/__init__.py,sha256=iPiCdk0czqV_TYZdWrcmmxWc18AEW586Ee60h4u-Tqc,196
|
|
41
|
+
mesh/streaming/iterator.py,sha256=C-da64qZQ4TXpta2V7TXgkDy_WvRduEbabFJIvULFSM,1906
|
|
42
|
+
mesh/streaming/modes.py,sha256=ZnRAKS-KpDnc35kG4ekz3RMZdL2hg3gtp13uGQ6XNt0,12180
|
|
43
|
+
mesh/streaming/sse.py,sha256=9dCbwtrtynB6wi_k90xDMR5Y2jbEAskiaD56uk5U7kY,5007
|
|
44
|
+
mesh/utils/__init__.py,sha256=fxoFVNQZsY8Ia45ljmb1ggGRa2niLwc7KK_7VySdYRQ,774
|
|
45
|
+
mesh/utils/config.py,sha256=P59uSRd5B4YYYr5lzstMV2ZvJkmNAe4wzsmXJvuUedk,2026
|
|
46
|
+
mesh/utils/errors.py,sha256=BsF5QCuT55pKdRhxqWH4UF2tv1Lb2vcG38bngR7XYt8,1026
|
|
47
|
+
mesh/utils/input_parser.py,sha256=HNyWTMToU89R48bcuVALL1Ro5_hazbTtc4OCFKLEziQ,4056
|
|
48
|
+
mesh/utils/mermaid.py,sha256=tF3PZoj9mswDhRD0YAgoVOAhBf211D_qBeq9Maq5l9c,8197
|
|
49
|
+
mesh/utils/registry.py,sha256=vZzUdzmSjEiBa06aybZ8FdWr1t9SlL8krfic7gWKv7M,6458
|
|
50
|
+
mesh/utils/translator_orchestrator.py,sha256=RAk1PezgeZwU-ofQWDBSMvBtAa7S1NH1DMygN6WCcK0,11738
|
|
51
|
+
mesh/utils/variables.py,sha256=hX01QJzVcyI0TYW7COvxBVl_9zp4wQV9HULQr--FKaI,8885
|
|
52
|
+
agentmesh_py-0.1.5.dist-info/METADATA,sha256=tRl1eSk-PzluXCeeR4FQqGXMMRr925LnF6kvSyx_l_I,14733
|
|
53
|
+
agentmesh_py-0.1.5.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
|
|
54
|
+
agentmesh_py-0.1.5.dist-info/top_level.txt,sha256=9TJpknW1CazBq5sbZ4N1q-DzUDPVdHuu5ygt1fbLK0s,5
|
|
55
|
+
agentmesh_py-0.1.5.dist-info/RECORD,,
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Richard Scheiwe
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
mesh
|