agentic-workflow-orchestrator 1.0.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.
- agentic_workflow_orchestrator-1.0.0/CHANGELOG.md +51 -0
- agentic_workflow_orchestrator-1.0.0/MANIFEST.in +11 -0
- agentic_workflow_orchestrator-1.0.0/PKG-INFO +125 -0
- agentic_workflow_orchestrator-1.0.0/README.md +70 -0
- agentic_workflow_orchestrator-1.0.0/agentic_workflow_orchestrator.egg-info/PKG-INFO +125 -0
- agentic_workflow_orchestrator-1.0.0/agentic_workflow_orchestrator.egg-info/SOURCES.txt +31 -0
- agentic_workflow_orchestrator-1.0.0/agentic_workflow_orchestrator.egg-info/dependency_links.txt +1 -0
- agentic_workflow_orchestrator-1.0.0/agentic_workflow_orchestrator.egg-info/requires.txt +35 -0
- agentic_workflow_orchestrator-1.0.0/agentic_workflow_orchestrator.egg-info/top_level.txt +1 -0
- agentic_workflow_orchestrator-1.0.0/orchestrator/__init__.py +63 -0
- agentic_workflow_orchestrator-1.0.0/orchestrator/engine.py +245 -0
- agentic_workflow_orchestrator-1.0.0/orchestrator/llm.py +390 -0
- agentic_workflow_orchestrator-1.0.0/orchestrator/mcp_integration.py +283 -0
- agentic_workflow_orchestrator-1.0.0/orchestrator/py.typed +0 -0
- agentic_workflow_orchestrator-1.0.0/orchestrator/ratelimit.py +65 -0
- agentic_workflow_orchestrator-1.0.0/orchestrator/registry.py +104 -0
- agentic_workflow_orchestrator-1.0.0/orchestrator/report.py +121 -0
- agentic_workflow_orchestrator-1.0.0/orchestrator/spec.py +233 -0
- agentic_workflow_orchestrator-1.0.0/pyproject.toml +114 -0
- agentic_workflow_orchestrator-1.0.0/setup.cfg +4 -0
- agentic_workflow_orchestrator-1.0.0/setup.py +65 -0
- agentic_workflow_orchestrator-1.0.0/tests/test_engine.py +170 -0
- agentic_workflow_orchestrator-1.0.0/tests/test_go_engine.py +382 -0
- agentic_workflow_orchestrator-1.0.0/tests/test_mcp_integration.py +275 -0
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to the Orchestrator SDK will be documented in this file.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
+
|
|
8
|
+
## [0.1.0] - 2026-06-18
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
- Core orchestration engine: DAG scheduler, worker pool, rate limiting
|
|
12
|
+
- Skill and tool registration system
|
|
13
|
+
- LLM integration with Anthropic (Claude) support and MockLLM for testing
|
|
14
|
+
- MCP (Model Context Protocol) support with three levels of abstraction:
|
|
15
|
+
- Level 1: Direct tool calls (stateless)
|
|
16
|
+
- Level 2: Pre-wrapped MCP skills (semantic)
|
|
17
|
+
- Level 3: Managed MCP servers (cached, lifecycle-managed)
|
|
18
|
+
- Workflow templating: `${input.x}`, `${taskId.output}` references
|
|
19
|
+
- Retry policies: exponential backoff, jitter support
|
|
20
|
+
- Per-task and per-provider rate limiting
|
|
21
|
+
- Comprehensive reporting: timing, LLM token usage, critical path, decisions
|
|
22
|
+
- Python SDK with async-ready API
|
|
23
|
+
- Go reference engine (gRPC + stdio transport)
|
|
24
|
+
- Full test suite (unit + integration + end-to-end)
|
|
25
|
+
- Four runnable examples (hello world, parallel pipeline, LLM review, MCP flexible)
|
|
26
|
+
|
|
27
|
+
### Documentation
|
|
28
|
+
- Design document (DESIGN.md)
|
|
29
|
+
- Quick start guide (QUICKSTART.md)
|
|
30
|
+
- Testing guide (TESTING.md)
|
|
31
|
+
- MCP integration reference (MCP_INTEGRATION.md)
|
|
32
|
+
- Full API reference in docstrings
|
|
33
|
+
|
|
34
|
+
## Roadmap
|
|
35
|
+
|
|
36
|
+
### v0.2.0 (planned)
|
|
37
|
+
- [ ] Dynamic fan-out (foreach loops spawning N parallel children)
|
|
38
|
+
- [ ] Sub-workflows (nested workflow execution)
|
|
39
|
+
- [ ] Durable state persistence (Redis/Postgres backend)
|
|
40
|
+
- [ ] Multi-tenant service mode with resumable runs
|
|
41
|
+
- [ ] Human-in-the-loop approval tasks
|
|
42
|
+
- [ ] Automatic reconnect for failed MCP servers
|
|
43
|
+
|
|
44
|
+
### v1.0.0 (planned)
|
|
45
|
+
- [ ] JavaScript/TypeScript SDK
|
|
46
|
+
- [ ] Java SDK
|
|
47
|
+
- [ ] Native Go client library
|
|
48
|
+
- [ ] Distributed workflow execution across multiple machines
|
|
49
|
+
- [ ] Advanced observability: distributed tracing, metrics export
|
|
50
|
+
- [ ] Workflow visualization dashboard
|
|
51
|
+
- [ ] Policy engine for compliance checks
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
include README.md
|
|
2
|
+
include LICENSE
|
|
3
|
+
include CHANGELOG.md
|
|
4
|
+
recursive-include orchestrator py.typed
|
|
5
|
+
|
|
6
|
+
# Exclude test and example files from distributions
|
|
7
|
+
exclude tests/
|
|
8
|
+
exclude examples/
|
|
9
|
+
recursive-exclude . __pycache__
|
|
10
|
+
recursive-exclude . *.pyc
|
|
11
|
+
recursive-exclude . .pytest_cache
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: agentic-workflow-orchestrator
|
|
3
|
+
Version: 1.0.0
|
|
4
|
+
Summary: Orchestrate multi-agent workflows with autonomous reasoning, parallelism, rate limiting, and LLM integration
|
|
5
|
+
Home-page: https://github.com/org/orchestrator
|
|
6
|
+
Author: Manikandan Kasi
|
|
7
|
+
Author-email: Orchestrator Team <info@orchestrator.dev>
|
|
8
|
+
License: Apache License 2.0
|
|
9
|
+
Project-URL: Homepage, https://github.com/org/orchestrator
|
|
10
|
+
Project-URL: Documentation, https://github.com/org/orchestrator/blob/main/QUICKSTART.md
|
|
11
|
+
Project-URL: Repository, https://github.com/org/orchestrator
|
|
12
|
+
Project-URL: Issues, https://github.com/org/orchestrator/issues
|
|
13
|
+
Keywords: orchestration,workflow,multi-agent,agent,concurrency,rate-limiting,llm,mcp,asyncio
|
|
14
|
+
Classifier: Development Status :: 4 - Beta
|
|
15
|
+
Classifier: Intended Audience :: Developers
|
|
16
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
17
|
+
Classifier: License :: OSI Approved :: Apache Software License
|
|
18
|
+
Classifier: Programming Language :: Python :: 3
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
22
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
23
|
+
Classifier: Operating System :: OS Independent
|
|
24
|
+
Requires-Python: >=3.9
|
|
25
|
+
Description-Content-Type: text/markdown
|
|
26
|
+
Provides-Extra: llm-anthropic
|
|
27
|
+
Requires-Dist: anthropic>=0.7.0; extra == "llm-anthropic"
|
|
28
|
+
Provides-Extra: llm-openai
|
|
29
|
+
Requires-Dist: openai>=1.0.0; extra == "llm-openai"
|
|
30
|
+
Provides-Extra: llm-gemini
|
|
31
|
+
Requires-Dist: google-generativeai>=0.3.0; extra == "llm-gemini"
|
|
32
|
+
Provides-Extra: llm-xai
|
|
33
|
+
Requires-Dist: openai>=1.0.0; extra == "llm-xai"
|
|
34
|
+
Provides-Extra: llm-huggingface
|
|
35
|
+
Requires-Dist: transformers>=4.30.0; extra == "llm-huggingface"
|
|
36
|
+
Requires-Dist: torch>=2.0.0; extra == "llm-huggingface"
|
|
37
|
+
Provides-Extra: llm-azure
|
|
38
|
+
Requires-Dist: openai>=1.0.0; extra == "llm-azure"
|
|
39
|
+
Provides-Extra: llm
|
|
40
|
+
Requires-Dist: anthropic>=0.7.0; extra == "llm"
|
|
41
|
+
Requires-Dist: openai>=1.0.0; extra == "llm"
|
|
42
|
+
Requires-Dist: google-generativeai>=0.3.0; extra == "llm"
|
|
43
|
+
Requires-Dist: transformers>=4.30.0; extra == "llm"
|
|
44
|
+
Requires-Dist: torch>=2.0.0; extra == "llm"
|
|
45
|
+
Provides-Extra: engine
|
|
46
|
+
Provides-Extra: dev
|
|
47
|
+
Requires-Dist: pytest>=7.0; extra == "dev"
|
|
48
|
+
Requires-Dist: pytest-cov>=4.0; extra == "dev"
|
|
49
|
+
Requires-Dist: black>=23.0; extra == "dev"
|
|
50
|
+
Requires-Dist: isort>=5.12; extra == "dev"
|
|
51
|
+
Requires-Dist: mypy>=1.0; extra == "dev"
|
|
52
|
+
Dynamic: author
|
|
53
|
+
Dynamic: home-page
|
|
54
|
+
Dynamic: requires-python
|
|
55
|
+
|
|
56
|
+
# orchestrator (Python reference SDK)
|
|
57
|
+
|
|
58
|
+
In-process workflow orchestration engine + authoring API. Zero required dependencies
|
|
59
|
+
(stdlib `asyncio`); `pyyaml` is optional (for `.yaml` specs), `anthropic` optional (for the
|
|
60
|
+
real LLM adapter).
|
|
61
|
+
|
|
62
|
+
## Concepts
|
|
63
|
+
|
|
64
|
+
- **Workflow** — a DAG of tasks loaded from a template (`Workflow.from_file/from_dict/from_json`).
|
|
65
|
+
- **Skill** — a registered handler `(ctx, inputs) -> output`, sync or `async`.
|
|
66
|
+
- **Tool** — a registered callable a skill invokes via `ctx.call_tool(...)`.
|
|
67
|
+
- **Orchestrator** — runs a workflow, enforcing concurrency + rate limits, and returns a `Report`.
|
|
68
|
+
|
|
69
|
+
## Minimal usage
|
|
70
|
+
|
|
71
|
+
```python
|
|
72
|
+
from orchestrator import Workflow, Orchestrator, Registry, MockLLM
|
|
73
|
+
|
|
74
|
+
reg = Registry()
|
|
75
|
+
|
|
76
|
+
@reg.tool("http.get")
|
|
77
|
+
def http_get(url):
|
|
78
|
+
return {"url": url, "ok": True}
|
|
79
|
+
|
|
80
|
+
@reg.skill("market.fetch")
|
|
81
|
+
def fetch(ctx, inputs):
|
|
82
|
+
ctx.call_tool("http.get", url=f"/prices/{inputs['ticker']}")
|
|
83
|
+
ctx.record_decision("selected primary feed", rationale="lowest latency")
|
|
84
|
+
return {"ticker": inputs["ticker"], "last": 199.4}
|
|
85
|
+
|
|
86
|
+
@reg.skill("llm.classify")
|
|
87
|
+
def classify(ctx, inputs):
|
|
88
|
+
r = ctx.llm(messages=[{"role": "user", "content": inputs["text"]}], model="claude-opus-4-8")
|
|
89
|
+
return r.text
|
|
90
|
+
|
|
91
|
+
wf = Workflow.from_file("../spec/examples/market-analysis.json")
|
|
92
|
+
report = Orchestrator(reg, llm=MockLLM()).run_sync(wf, inputs={"ticker": "AAPL"})
|
|
93
|
+
print(report.to_json())
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
## The `ctx` (SkillContext) API
|
|
97
|
+
|
|
98
|
+
| Member | Purpose |
|
|
99
|
+
|---|---|
|
|
100
|
+
| `ctx.inputs` | resolved task inputs |
|
|
101
|
+
| `ctx.call_tool(name, **kwargs)` | invoke a registered tool |
|
|
102
|
+
| `ctx.llm(messages, tools=, model=, **opts)` | call the configured LLM provider; usage is recorded |
|
|
103
|
+
| `ctx.record_decision(summary, rationale=, data=)` | append a critical decision to the trace |
|
|
104
|
+
| `ctx.log(msg)`, `ctx.attempt`, `ctx.cancelled` | logging / retry attempt / cooperative cancel flag |
|
|
105
|
+
|
|
106
|
+
## Report
|
|
107
|
+
|
|
108
|
+
`report.to_dict()` / `report.to_json()` give: `status`, `duration_ms`, per-task
|
|
109
|
+
`{status, duration_ms, attempts, llm, decisions, error}`, `critical_path` (bottleneck chain),
|
|
110
|
+
`totals` (llm tokens, tool calls, retries), `errors`, and the resolved `output`.
|
|
111
|
+
|
|
112
|
+
## Run
|
|
113
|
+
|
|
114
|
+
```bash
|
|
115
|
+
python3 examples/run_market.py
|
|
116
|
+
python3 tests/test_engine.py
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
## Using a real LLM
|
|
120
|
+
|
|
121
|
+
```python
|
|
122
|
+
from orchestrator import AnthropicProvider, Orchestrator
|
|
123
|
+
orch = Orchestrator(reg, llm=AnthropicProvider(model="claude-opus-4-8")) # needs ANTHROPIC_API_KEY + `pip install anthropic`
|
|
124
|
+
```
|
|
125
|
+
Confirm current Claude model IDs/limits from the Claude API reference before pinning them.
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# orchestrator (Python reference SDK)
|
|
2
|
+
|
|
3
|
+
In-process workflow orchestration engine + authoring API. Zero required dependencies
|
|
4
|
+
(stdlib `asyncio`); `pyyaml` is optional (for `.yaml` specs), `anthropic` optional (for the
|
|
5
|
+
real LLM adapter).
|
|
6
|
+
|
|
7
|
+
## Concepts
|
|
8
|
+
|
|
9
|
+
- **Workflow** — a DAG of tasks loaded from a template (`Workflow.from_file/from_dict/from_json`).
|
|
10
|
+
- **Skill** — a registered handler `(ctx, inputs) -> output`, sync or `async`.
|
|
11
|
+
- **Tool** — a registered callable a skill invokes via `ctx.call_tool(...)`.
|
|
12
|
+
- **Orchestrator** — runs a workflow, enforcing concurrency + rate limits, and returns a `Report`.
|
|
13
|
+
|
|
14
|
+
## Minimal usage
|
|
15
|
+
|
|
16
|
+
```python
|
|
17
|
+
from orchestrator import Workflow, Orchestrator, Registry, MockLLM
|
|
18
|
+
|
|
19
|
+
reg = Registry()
|
|
20
|
+
|
|
21
|
+
@reg.tool("http.get")
|
|
22
|
+
def http_get(url):
|
|
23
|
+
return {"url": url, "ok": True}
|
|
24
|
+
|
|
25
|
+
@reg.skill("market.fetch")
|
|
26
|
+
def fetch(ctx, inputs):
|
|
27
|
+
ctx.call_tool("http.get", url=f"/prices/{inputs['ticker']}")
|
|
28
|
+
ctx.record_decision("selected primary feed", rationale="lowest latency")
|
|
29
|
+
return {"ticker": inputs["ticker"], "last": 199.4}
|
|
30
|
+
|
|
31
|
+
@reg.skill("llm.classify")
|
|
32
|
+
def classify(ctx, inputs):
|
|
33
|
+
r = ctx.llm(messages=[{"role": "user", "content": inputs["text"]}], model="claude-opus-4-8")
|
|
34
|
+
return r.text
|
|
35
|
+
|
|
36
|
+
wf = Workflow.from_file("../spec/examples/market-analysis.json")
|
|
37
|
+
report = Orchestrator(reg, llm=MockLLM()).run_sync(wf, inputs={"ticker": "AAPL"})
|
|
38
|
+
print(report.to_json())
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## The `ctx` (SkillContext) API
|
|
42
|
+
|
|
43
|
+
| Member | Purpose |
|
|
44
|
+
|---|---|
|
|
45
|
+
| `ctx.inputs` | resolved task inputs |
|
|
46
|
+
| `ctx.call_tool(name, **kwargs)` | invoke a registered tool |
|
|
47
|
+
| `ctx.llm(messages, tools=, model=, **opts)` | call the configured LLM provider; usage is recorded |
|
|
48
|
+
| `ctx.record_decision(summary, rationale=, data=)` | append a critical decision to the trace |
|
|
49
|
+
| `ctx.log(msg)`, `ctx.attempt`, `ctx.cancelled` | logging / retry attempt / cooperative cancel flag |
|
|
50
|
+
|
|
51
|
+
## Report
|
|
52
|
+
|
|
53
|
+
`report.to_dict()` / `report.to_json()` give: `status`, `duration_ms`, per-task
|
|
54
|
+
`{status, duration_ms, attempts, llm, decisions, error}`, `critical_path` (bottleneck chain),
|
|
55
|
+
`totals` (llm tokens, tool calls, retries), `errors`, and the resolved `output`.
|
|
56
|
+
|
|
57
|
+
## Run
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
python3 examples/run_market.py
|
|
61
|
+
python3 tests/test_engine.py
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## Using a real LLM
|
|
65
|
+
|
|
66
|
+
```python
|
|
67
|
+
from orchestrator import AnthropicProvider, Orchestrator
|
|
68
|
+
orch = Orchestrator(reg, llm=AnthropicProvider(model="claude-opus-4-8")) # needs ANTHROPIC_API_KEY + `pip install anthropic`
|
|
69
|
+
```
|
|
70
|
+
Confirm current Claude model IDs/limits from the Claude API reference before pinning them.
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: agentic-workflow-orchestrator
|
|
3
|
+
Version: 1.0.0
|
|
4
|
+
Summary: Orchestrate multi-agent workflows with autonomous reasoning, parallelism, rate limiting, and LLM integration
|
|
5
|
+
Home-page: https://github.com/org/orchestrator
|
|
6
|
+
Author: Manikandan Kasi
|
|
7
|
+
Author-email: Orchestrator Team <info@orchestrator.dev>
|
|
8
|
+
License: Apache License 2.0
|
|
9
|
+
Project-URL: Homepage, https://github.com/org/orchestrator
|
|
10
|
+
Project-URL: Documentation, https://github.com/org/orchestrator/blob/main/QUICKSTART.md
|
|
11
|
+
Project-URL: Repository, https://github.com/org/orchestrator
|
|
12
|
+
Project-URL: Issues, https://github.com/org/orchestrator/issues
|
|
13
|
+
Keywords: orchestration,workflow,multi-agent,agent,concurrency,rate-limiting,llm,mcp,asyncio
|
|
14
|
+
Classifier: Development Status :: 4 - Beta
|
|
15
|
+
Classifier: Intended Audience :: Developers
|
|
16
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
17
|
+
Classifier: License :: OSI Approved :: Apache Software License
|
|
18
|
+
Classifier: Programming Language :: Python :: 3
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
22
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
23
|
+
Classifier: Operating System :: OS Independent
|
|
24
|
+
Requires-Python: >=3.9
|
|
25
|
+
Description-Content-Type: text/markdown
|
|
26
|
+
Provides-Extra: llm-anthropic
|
|
27
|
+
Requires-Dist: anthropic>=0.7.0; extra == "llm-anthropic"
|
|
28
|
+
Provides-Extra: llm-openai
|
|
29
|
+
Requires-Dist: openai>=1.0.0; extra == "llm-openai"
|
|
30
|
+
Provides-Extra: llm-gemini
|
|
31
|
+
Requires-Dist: google-generativeai>=0.3.0; extra == "llm-gemini"
|
|
32
|
+
Provides-Extra: llm-xai
|
|
33
|
+
Requires-Dist: openai>=1.0.0; extra == "llm-xai"
|
|
34
|
+
Provides-Extra: llm-huggingface
|
|
35
|
+
Requires-Dist: transformers>=4.30.0; extra == "llm-huggingface"
|
|
36
|
+
Requires-Dist: torch>=2.0.0; extra == "llm-huggingface"
|
|
37
|
+
Provides-Extra: llm-azure
|
|
38
|
+
Requires-Dist: openai>=1.0.0; extra == "llm-azure"
|
|
39
|
+
Provides-Extra: llm
|
|
40
|
+
Requires-Dist: anthropic>=0.7.0; extra == "llm"
|
|
41
|
+
Requires-Dist: openai>=1.0.0; extra == "llm"
|
|
42
|
+
Requires-Dist: google-generativeai>=0.3.0; extra == "llm"
|
|
43
|
+
Requires-Dist: transformers>=4.30.0; extra == "llm"
|
|
44
|
+
Requires-Dist: torch>=2.0.0; extra == "llm"
|
|
45
|
+
Provides-Extra: engine
|
|
46
|
+
Provides-Extra: dev
|
|
47
|
+
Requires-Dist: pytest>=7.0; extra == "dev"
|
|
48
|
+
Requires-Dist: pytest-cov>=4.0; extra == "dev"
|
|
49
|
+
Requires-Dist: black>=23.0; extra == "dev"
|
|
50
|
+
Requires-Dist: isort>=5.12; extra == "dev"
|
|
51
|
+
Requires-Dist: mypy>=1.0; extra == "dev"
|
|
52
|
+
Dynamic: author
|
|
53
|
+
Dynamic: home-page
|
|
54
|
+
Dynamic: requires-python
|
|
55
|
+
|
|
56
|
+
# orchestrator (Python reference SDK)
|
|
57
|
+
|
|
58
|
+
In-process workflow orchestration engine + authoring API. Zero required dependencies
|
|
59
|
+
(stdlib `asyncio`); `pyyaml` is optional (for `.yaml` specs), `anthropic` optional (for the
|
|
60
|
+
real LLM adapter).
|
|
61
|
+
|
|
62
|
+
## Concepts
|
|
63
|
+
|
|
64
|
+
- **Workflow** — a DAG of tasks loaded from a template (`Workflow.from_file/from_dict/from_json`).
|
|
65
|
+
- **Skill** — a registered handler `(ctx, inputs) -> output`, sync or `async`.
|
|
66
|
+
- **Tool** — a registered callable a skill invokes via `ctx.call_tool(...)`.
|
|
67
|
+
- **Orchestrator** — runs a workflow, enforcing concurrency + rate limits, and returns a `Report`.
|
|
68
|
+
|
|
69
|
+
## Minimal usage
|
|
70
|
+
|
|
71
|
+
```python
|
|
72
|
+
from orchestrator import Workflow, Orchestrator, Registry, MockLLM
|
|
73
|
+
|
|
74
|
+
reg = Registry()
|
|
75
|
+
|
|
76
|
+
@reg.tool("http.get")
|
|
77
|
+
def http_get(url):
|
|
78
|
+
return {"url": url, "ok": True}
|
|
79
|
+
|
|
80
|
+
@reg.skill("market.fetch")
|
|
81
|
+
def fetch(ctx, inputs):
|
|
82
|
+
ctx.call_tool("http.get", url=f"/prices/{inputs['ticker']}")
|
|
83
|
+
ctx.record_decision("selected primary feed", rationale="lowest latency")
|
|
84
|
+
return {"ticker": inputs["ticker"], "last": 199.4}
|
|
85
|
+
|
|
86
|
+
@reg.skill("llm.classify")
|
|
87
|
+
def classify(ctx, inputs):
|
|
88
|
+
r = ctx.llm(messages=[{"role": "user", "content": inputs["text"]}], model="claude-opus-4-8")
|
|
89
|
+
return r.text
|
|
90
|
+
|
|
91
|
+
wf = Workflow.from_file("../spec/examples/market-analysis.json")
|
|
92
|
+
report = Orchestrator(reg, llm=MockLLM()).run_sync(wf, inputs={"ticker": "AAPL"})
|
|
93
|
+
print(report.to_json())
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
## The `ctx` (SkillContext) API
|
|
97
|
+
|
|
98
|
+
| Member | Purpose |
|
|
99
|
+
|---|---|
|
|
100
|
+
| `ctx.inputs` | resolved task inputs |
|
|
101
|
+
| `ctx.call_tool(name, **kwargs)` | invoke a registered tool |
|
|
102
|
+
| `ctx.llm(messages, tools=, model=, **opts)` | call the configured LLM provider; usage is recorded |
|
|
103
|
+
| `ctx.record_decision(summary, rationale=, data=)` | append a critical decision to the trace |
|
|
104
|
+
| `ctx.log(msg)`, `ctx.attempt`, `ctx.cancelled` | logging / retry attempt / cooperative cancel flag |
|
|
105
|
+
|
|
106
|
+
## Report
|
|
107
|
+
|
|
108
|
+
`report.to_dict()` / `report.to_json()` give: `status`, `duration_ms`, per-task
|
|
109
|
+
`{status, duration_ms, attempts, llm, decisions, error}`, `critical_path` (bottleneck chain),
|
|
110
|
+
`totals` (llm tokens, tool calls, retries), `errors`, and the resolved `output`.
|
|
111
|
+
|
|
112
|
+
## Run
|
|
113
|
+
|
|
114
|
+
```bash
|
|
115
|
+
python3 examples/run_market.py
|
|
116
|
+
python3 tests/test_engine.py
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
## Using a real LLM
|
|
120
|
+
|
|
121
|
+
```python
|
|
122
|
+
from orchestrator import AnthropicProvider, Orchestrator
|
|
123
|
+
orch = Orchestrator(reg, llm=AnthropicProvider(model="claude-opus-4-8")) # needs ANTHROPIC_API_KEY + `pip install anthropic`
|
|
124
|
+
```
|
|
125
|
+
Confirm current Claude model IDs/limits from the Claude API reference before pinning them.
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
CHANGELOG.md
|
|
2
|
+
MANIFEST.in
|
|
3
|
+
README.md
|
|
4
|
+
pyproject.toml
|
|
5
|
+
setup.py
|
|
6
|
+
./orchestrator/__init__.py
|
|
7
|
+
./orchestrator/engine.py
|
|
8
|
+
./orchestrator/llm.py
|
|
9
|
+
./orchestrator/mcp_integration.py
|
|
10
|
+
./orchestrator/py.typed
|
|
11
|
+
./orchestrator/ratelimit.py
|
|
12
|
+
./orchestrator/registry.py
|
|
13
|
+
./orchestrator/report.py
|
|
14
|
+
./orchestrator/spec.py
|
|
15
|
+
agentic_workflow_orchestrator.egg-info/PKG-INFO
|
|
16
|
+
agentic_workflow_orchestrator.egg-info/SOURCES.txt
|
|
17
|
+
agentic_workflow_orchestrator.egg-info/dependency_links.txt
|
|
18
|
+
agentic_workflow_orchestrator.egg-info/requires.txt
|
|
19
|
+
agentic_workflow_orchestrator.egg-info/top_level.txt
|
|
20
|
+
orchestrator/__init__.py
|
|
21
|
+
orchestrator/engine.py
|
|
22
|
+
orchestrator/llm.py
|
|
23
|
+
orchestrator/mcp_integration.py
|
|
24
|
+
orchestrator/py.typed
|
|
25
|
+
orchestrator/ratelimit.py
|
|
26
|
+
orchestrator/registry.py
|
|
27
|
+
orchestrator/report.py
|
|
28
|
+
orchestrator/spec.py
|
|
29
|
+
tests/test_engine.py
|
|
30
|
+
tests/test_go_engine.py
|
|
31
|
+
tests/test_mcp_integration.py
|
agentic_workflow_orchestrator-1.0.0/agentic_workflow_orchestrator.egg-info/dependency_links.txt
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
|
|
2
|
+
[dev]
|
|
3
|
+
pytest>=7.0
|
|
4
|
+
pytest-cov>=4.0
|
|
5
|
+
black>=23.0
|
|
6
|
+
isort>=5.12
|
|
7
|
+
mypy>=1.0
|
|
8
|
+
|
|
9
|
+
[engine]
|
|
10
|
+
|
|
11
|
+
[llm]
|
|
12
|
+
anthropic>=0.7.0
|
|
13
|
+
openai>=1.0.0
|
|
14
|
+
google-generativeai>=0.3.0
|
|
15
|
+
transformers>=4.30.0
|
|
16
|
+
torch>=2.0.0
|
|
17
|
+
|
|
18
|
+
[llm-anthropic]
|
|
19
|
+
anthropic>=0.7.0
|
|
20
|
+
|
|
21
|
+
[llm-azure]
|
|
22
|
+
openai>=1.0.0
|
|
23
|
+
|
|
24
|
+
[llm-gemini]
|
|
25
|
+
google-generativeai>=0.3.0
|
|
26
|
+
|
|
27
|
+
[llm-huggingface]
|
|
28
|
+
transformers>=4.30.0
|
|
29
|
+
torch>=2.0.0
|
|
30
|
+
|
|
31
|
+
[llm-openai]
|
|
32
|
+
openai>=1.0.0
|
|
33
|
+
|
|
34
|
+
[llm-xai]
|
|
35
|
+
openai>=1.0.0
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
orchestrator
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"""Multi-agent workflow orchestration SDK — Python reference implementation.
|
|
2
|
+
|
|
3
|
+
Quick start:
|
|
4
|
+
|
|
5
|
+
from orchestrator import Workflow, Orchestrator, Registry, MockLLM
|
|
6
|
+
|
|
7
|
+
reg = Registry()
|
|
8
|
+
|
|
9
|
+
@reg.skill("market.fetch")
|
|
10
|
+
def fetch(ctx, inputs):
|
|
11
|
+
ctx.record_decision("selected primary feed", rationale="lowest latency")
|
|
12
|
+
return {"ticker": inputs["ticker"], "last": 199.4}
|
|
13
|
+
|
|
14
|
+
wf = Workflow.from_file("spec/examples/market-analysis.json")
|
|
15
|
+
report = Orchestrator(reg, llm=MockLLM()).run_sync(wf, {"ticker": "AAPL"})
|
|
16
|
+
print(report.to_json())
|
|
17
|
+
"""
|
|
18
|
+
from .engine import Orchestrator, TaskFailed
|
|
19
|
+
from .llm import (
|
|
20
|
+
AnthropicProvider,
|
|
21
|
+
AzureOpenAIProvider,
|
|
22
|
+
GeminiProvider,
|
|
23
|
+
HuggingFaceProvider,
|
|
24
|
+
LlmProvider,
|
|
25
|
+
LlmResult,
|
|
26
|
+
MockLLM,
|
|
27
|
+
OpenAIProvider,
|
|
28
|
+
XAIProvider,
|
|
29
|
+
)
|
|
30
|
+
from .ratelimit import TokenBucket
|
|
31
|
+
from .registry import Registry, SkillContext
|
|
32
|
+
from .report import Decision, LlmUsage, Report, TaskSpan, Totals
|
|
33
|
+
from .spec import RateLimit, Retry, SpecError, Task, Workflow, resolve_template
|
|
34
|
+
|
|
35
|
+
__all__ = [
|
|
36
|
+
"Orchestrator",
|
|
37
|
+
"TaskFailed",
|
|
38
|
+
"Registry",
|
|
39
|
+
"SkillContext",
|
|
40
|
+
"Workflow",
|
|
41
|
+
"Task",
|
|
42
|
+
"RateLimit",
|
|
43
|
+
"Retry",
|
|
44
|
+
"SpecError",
|
|
45
|
+
"resolve_template",
|
|
46
|
+
"Report",
|
|
47
|
+
"TaskSpan",
|
|
48
|
+
"Decision",
|
|
49
|
+
"LlmUsage",
|
|
50
|
+
"Totals",
|
|
51
|
+
"LlmProvider",
|
|
52
|
+
"LlmResult",
|
|
53
|
+
"MockLLM",
|
|
54
|
+
"AnthropicProvider",
|
|
55
|
+
"OpenAIProvider",
|
|
56
|
+
"GeminiProvider",
|
|
57
|
+
"XAIProvider",
|
|
58
|
+
"HuggingFaceProvider",
|
|
59
|
+
"AzureOpenAIProvider",
|
|
60
|
+
"TokenBucket",
|
|
61
|
+
]
|
|
62
|
+
|
|
63
|
+
__version__ = "0.1.0"
|