agentic-fabric 1.2.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_fabric-1.2.0/.gitignore +15 -0
- agentic_fabric-1.2.0/CHANGELOG.md +54 -0
- agentic_fabric-1.2.0/PKG-INFO +292 -0
- agentic_fabric-1.2.0/README.md +224 -0
- agentic_fabric-1.2.0/examples/README.md +18 -0
- agentic_fabric-1.2.0/examples/__init__.py +1 -0
- agentic_fabric-1.2.0/examples/discovery_workflow.py +49 -0
- agentic_fabric-1.2.0/examples/mcp_adapters.py +45 -0
- agentic_fabric-1.2.0/examples/runtime_context.py +27 -0
- agentic_fabric-1.2.0/examples/sample_workspace/packages/review/.fabric/fabric_agents/implementation_review/agents.yaml +9 -0
- agentic_fabric-1.2.0/examples/sample_workspace/packages/review/.fabric/fabric_agents/implementation_review/tasks.yaml +9 -0
- agentic_fabric-1.2.0/examples/sample_workspace/packages/review/.fabric/manifest.yaml +7 -0
- agentic_fabric-1.2.0/examples/tool_registry.py +29 -0
- agentic_fabric-1.2.0/pyproject.toml +183 -0
- agentic_fabric-1.2.0/src/agentic_fabric/__init__.py +90 -0
- agentic_fabric-1.2.0/src/agentic_fabric/__main__.py +9 -0
- agentic_fabric-1.2.0/src/agentic_fabric/agentic_data.py +284 -0
- agentic_fabric-1.2.0/src/agentic_fabric/base/__init__.py +150 -0
- agentic_fabric-1.2.0/src/agentic_fabric/base/archetypes.yaml +75 -0
- agentic_fabric-1.2.0/src/agentic_fabric/capabilities.py +130 -0
- agentic_fabric-1.2.0/src/agentic_fabric/config/__init__.py +10 -0
- agentic_fabric-1.2.0/src/agentic_fabric/config/agents.yaml +101 -0
- agentic_fabric-1.2.0/src/agentic_fabric/config/llm.py +285 -0
- agentic_fabric-1.2.0/src/agentic_fabric/config/tasks.yaml +177 -0
- agentic_fabric-1.2.0/src/agentic_fabric/core/__init__.py +17 -0
- agentic_fabric-1.2.0/src/agentic_fabric/core/decomposer.py +278 -0
- agentic_fabric-1.2.0/src/agentic_fabric/core/discovery.py +359 -0
- agentic_fabric-1.2.0/src/agentic_fabric/core/loader.py +207 -0
- agentic_fabric-1.2.0/src/agentic_fabric/core/manager.py +296 -0
- agentic_fabric-1.2.0/src/agentic_fabric/core/runner.py +70 -0
- agentic_fabric-1.2.0/src/agentic_fabric/fabric_agents/__init__.py +1 -0
- agentic_fabric-1.2.0/src/agentic_fabric/fabric_agents/connector_builder/__init__.py +1 -0
- agentic_fabric-1.2.0/src/agentic_fabric/fabric_agents/connector_builder/config/agents.yaml +16 -0
- agentic_fabric-1.2.0/src/agentic_fabric/fabric_agents/connector_builder/config/tasks.yaml +14 -0
- agentic_fabric-1.2.0/src/agentic_fabric/fabric_agents/connector_builder/connector_builder_fabric.py +103 -0
- agentic_fabric-1.2.0/src/agentic_fabric/main.py +591 -0
- agentic_fabric-1.2.0/src/agentic_fabric/runners/__init__.py +32 -0
- agentic_fabric-1.2.0/src/agentic_fabric/runners/base.py +369 -0
- agentic_fabric-1.2.0/src/agentic_fabric/runners/crewai_runner.py +206 -0
- agentic_fabric-1.2.0/src/agentic_fabric/runners/langgraph_runner.py +199 -0
- agentic_fabric-1.2.0/src/agentic_fabric/runners/local_cli_profiles.yaml +169 -0
- agentic_fabric-1.2.0/src/agentic_fabric/runners/local_cli_runner.py +491 -0
- agentic_fabric-1.2.0/src/agentic_fabric/runners/registry.py +165 -0
- agentic_fabric-1.2.0/src/agentic_fabric/runners/single_agent_runner.py +77 -0
- agentic_fabric-1.2.0/src/agentic_fabric/runners/strands_runner.py +214 -0
- agentic_fabric-1.2.0/src/agentic_fabric/tools/__init__.py +76 -0
- agentic_fabric-1.2.0/src/agentic_fabric/tools/adapters.py +128 -0
- agentic_fabric-1.2.0/src/agentic_fabric/tools/file_tools.py +391 -0
- agentic_fabric-1.2.0/src/agentic_fabric/tools/meshy_mcp.py +214 -0
- agentic_fabric-1.2.0/src/agentic_fabric/tools/registry.py +169 -0
- agentic_fabric-1.2.0/src/agentic_fabric/tools/scraping_tools.py +148 -0
- agentic_fabric-1.2.0/src/agentic_fabric/tools/vendor.py +110 -0
- agentic_fabric-1.2.0/src/agentic_fabric/tools/vendor_mcp.py +338 -0
- agentic_fabric-1.2.0/src/agentic_fabric/utils/__init__.py +6 -0
- agentic_fabric-1.2.0/src/agentic_fabric/utils/files.py +25 -0
- agentic_fabric-1.2.0/tests/__init__.py +3 -0
- agentic_fabric-1.2.0/tests/conftest.py +150 -0
- agentic_fabric-1.2.0/tests/e2e/README.md +215 -0
- agentic_fabric-1.2.0/tests/e2e/__init__.py +7 -0
- agentic_fabric-1.2.0/tests/e2e/conftest.py +14 -0
- agentic_fabric-1.2.0/tests/e2e/test_crewai_e2e.py +216 -0
- agentic_fabric-1.2.0/tests/e2e/test_langgraph_e2e.py +227 -0
- agentic_fabric-1.2.0/tests/e2e/test_strands_e2e.py +266 -0
- agentic_fabric-1.2.0/tests/test_agentic_data.py +319 -0
- agentic_fabric-1.2.0/tests/test_archetypes.py +256 -0
- agentic_fabric-1.2.0/tests/test_capabilities.py +100 -0
- agentic_fabric-1.2.0/tests/test_cli_commands.py +673 -0
- agentic_fabric-1.2.0/tests/test_cli_smoke.py +131 -0
- agentic_fabric-1.2.0/tests/test_connector_builder_fabric.py +149 -0
- agentic_fabric-1.2.0/tests/test_core_runner.py +103 -0
- agentic_fabric-1.2.0/tests/test_decomposer_edge_cases.py +324 -0
- agentic_fabric-1.2.0/tests/test_discovery.py +574 -0
- agentic_fabric-1.2.0/tests/test_discovery_nested.py +195 -0
- agentic_fabric-1.2.0/tests/test_examples.py +107 -0
- agentic_fabric-1.2.0/tests/test_fabric_mocker.py +73 -0
- agentic_fabric-1.2.0/tests/test_file_tool_paths.py +204 -0
- agentic_fabric-1.2.0/tests/test_file_tools.py +311 -0
- agentic_fabric-1.2.0/tests/test_import_surfaces.py +146 -0
- agentic_fabric-1.2.0/tests/test_llm_config.py +235 -0
- agentic_fabric-1.2.0/tests/test_loader_unit.py +279 -0
- agentic_fabric-1.2.0/tests/test_manager.py +448 -0
- agentic_fabric-1.2.0/tests/test_mcp_adapters.py +508 -0
- agentic_fabric-1.2.0/tests/test_runners.py +1209 -0
- agentic_fabric-1.2.0/tests/test_runtime_registry.py +115 -0
- agentic_fabric-1.2.0/tests/test_scraping_tool_crawler.py +161 -0
- agentic_fabric-1.2.0/tests/test_scraping_tools.py +31 -0
- agentic_fabric-1.2.0/tests/test_single_agent_runners.py +656 -0
- agentic_fabric-1.2.0/tests/test_tool_adapters.py +269 -0
- agentic_fabric-1.2.0/tests/test_tool_registry.py +281 -0
- agentic_fabric-1.2.0/tests/test_tools_init.py +92 -0
- agentic_fabric-1.2.0/tests/test_utils_files.py +26 -0
- agentic_fabric-1.2.0/tests/test_workflow_contracts.py +50 -0
- agentic_fabric-1.2.0/tests/test_yaml_config_errors.py +398 -0
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# CHANGELOG
|
|
2
|
+
|
|
3
|
+
<!-- version list -->
|
|
4
|
+
|
|
5
|
+
## [1.2.0](https://github.com/jbcom/agentic-fabric/compare/agentic-fabric-v1.1.0...agentic-fabric-v1.2.0) (2026-06-27)
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
### Features
|
|
9
|
+
|
|
10
|
+
* fix all assessment findings + add Ollama E2E support ([#4](https://github.com/jbcom/agentic-fabric/issues/4)) ([37cc3b6](https://github.com/jbcom/agentic-fabric/commit/37cc3b6b62de867676d37a7959dab955ac1d331c))
|
|
11
|
+
|
|
12
|
+
## [1.1.0](https://github.com/jbcom/agentic-fabric/compare/agentic-fabric-v1.0.0...agentic-fabric-v1.1.0) (2026-06-27)
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
### Features
|
|
16
|
+
|
|
17
|
+
* bootstrap agentic fabric workspace ([#1](https://github.com/jbcom/agentic-fabric/issues/1)) ([2704e67](https://github.com/jbcom/agentic-fabric/commit/2704e6758a77661477c01678073a1b78ca1abcbc))
|
|
18
|
+
|
|
19
|
+
## v1.0.0 (2025-12-25)
|
|
20
|
+
|
|
21
|
+
### Initial Stable Release
|
|
22
|
+
|
|
23
|
+
Framework-agnostic AI fabric agent orchestration is now production-ready!
|
|
24
|
+
|
|
25
|
+
### Features
|
|
26
|
+
|
|
27
|
+
- **Multi-Framework Support**: Run fabric agents on CrewAI, LangGraph, or Strands
|
|
28
|
+
- **Auto-Detection**: Automatically selects best available framework
|
|
29
|
+
- **Universal YAML Format**: Define once, run anywhere
|
|
30
|
+
- **Single-Agent CLI Runners**: Support for aider, claude-code, ollama, and more
|
|
31
|
+
- **MCP Adapters**: Expose vendor-fabric catalog/data methods and Meshy capability metadata over MCP
|
|
32
|
+
- **Knowledge Base Integration**: Load domain knowledge from markdown files
|
|
33
|
+
- **Agent Archetypes**: Reusable agent templates
|
|
34
|
+
- **Comprehensive Testing**: 122+ unit tests, E2E test suite
|
|
35
|
+
|
|
36
|
+
### Breaking Changes
|
|
37
|
+
|
|
38
|
+
- **Minimum Python version increased from 3.10 to 3.11**
|
|
39
|
+
- Required for CrewAI 1.5.0+ compatibility
|
|
40
|
+
- Python 3.11, 3.12, 3.13, 3.14 now supported
|
|
41
|
+
|
|
42
|
+
### Documentation
|
|
43
|
+
|
|
44
|
+
- Complete API documentation with Sphinx
|
|
45
|
+
- Quick start guide and architecture overview
|
|
46
|
+
- jbcom dark theme branding applied
|
|
47
|
+
- Integration guides for vendor-fabric
|
|
48
|
+
|
|
49
|
+
### Internal
|
|
50
|
+
|
|
51
|
+
- Full test coverage across all runners
|
|
52
|
+
- Ruff linting and formatting
|
|
53
|
+
- Type hints with mypy
|
|
54
|
+
- Tox for multi-version testing
|
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: agentic-fabric
|
|
3
|
+
Version: 1.2.0
|
|
4
|
+
Summary: Framework-agnostic agent fabric orchestration for CrewAI, LangGraph, Strands, local CLI runners, and vendor-fabric tools
|
|
5
|
+
Project-URL: Documentation, https://jonbogaty.com/agentic-fabric/
|
|
6
|
+
Project-URL: Issues, https://github.com/jbcom/agentic-fabric/issues
|
|
7
|
+
Project-URL: Source, https://github.com/jbcom/agentic-fabric
|
|
8
|
+
Project-URL: Changelog, https://github.com/jbcom/agentic-fabric/blob/main/CHANGELOG.md
|
|
9
|
+
Author-email: Jon Bogaty <jon@jonbogaty.com>
|
|
10
|
+
Maintainer-email: Jon Bogaty <jon@jonbogaty.com>
|
|
11
|
+
License: MIT
|
|
12
|
+
Keywords: ai-agents,crewai,langgraph,multi-agent,orchestration,strands,vendor-fabric
|
|
13
|
+
Classifier: Development Status :: 4 - Beta
|
|
14
|
+
Classifier: Intended Audience :: Developers
|
|
15
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
16
|
+
Classifier: Programming Language :: Python :: 3
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
21
|
+
Classifier: Typing :: Typed
|
|
22
|
+
Requires-Python: >=3.11
|
|
23
|
+
Requires-Dist: pyyaml>=6.0.3
|
|
24
|
+
Provides-Extra: dev
|
|
25
|
+
Requires-Dist: coverage[toml]>=7.14.3; extra == 'dev'
|
|
26
|
+
Requires-Dist: mypy>=2.1.0; extra == 'dev'
|
|
27
|
+
Requires-Dist: pytest-agentic-fabric[tests]; extra == 'dev'
|
|
28
|
+
Requires-Dist: pytest-asyncio>=1.4.0; extra == 'dev'
|
|
29
|
+
Requires-Dist: pytest-cov>=7.1.0; extra == 'dev'
|
|
30
|
+
Requires-Dist: pytest-mock>=3.15.1; extra == 'dev'
|
|
31
|
+
Requires-Dist: pytest-timeout>=2.4.0; extra == 'dev'
|
|
32
|
+
Requires-Dist: pytest-xdist>=3.8.0; extra == 'dev'
|
|
33
|
+
Requires-Dist: pytest>=9.1.1; extra == 'dev'
|
|
34
|
+
Requires-Dist: ruff>=0.15.20; extra == 'dev'
|
|
35
|
+
Requires-Dist: types-pyyaml>=6.0.12.20260518; extra == 'dev'
|
|
36
|
+
Requires-Dist: types-requests>=2.33.0.20260518; extra == 'dev'
|
|
37
|
+
Provides-Extra: docs
|
|
38
|
+
Requires-Dist: furo>=2025.12.19; extra == 'docs'
|
|
39
|
+
Requires-Dist: myst-parser<6.0.0,>=5.1.0; extra == 'docs'
|
|
40
|
+
Requires-Dist: sphinx-autodoc2>=0.5.0; extra == 'docs'
|
|
41
|
+
Requires-Dist: sphinx-copybutton>=0.5.2; extra == 'docs'
|
|
42
|
+
Requires-Dist: sphinx<10.0.0,>=8.2.3; extra == 'docs'
|
|
43
|
+
Provides-Extra: langgraph
|
|
44
|
+
Requires-Dist: langchain-anthropic>=0.3.0; extra == 'langgraph'
|
|
45
|
+
Requires-Dist: langchain-ollama>=0.3.0; extra == 'langgraph'
|
|
46
|
+
Requires-Dist: langgraph>=0.2.0; extra == 'langgraph'
|
|
47
|
+
Provides-Extra: mcp
|
|
48
|
+
Requires-Dist: mcp>=1.0.0; extra == 'mcp'
|
|
49
|
+
Provides-Extra: scraping
|
|
50
|
+
Requires-Dist: beautifulsoup4>=4.12.0; extra == 'scraping'
|
|
51
|
+
Requires-Dist: requests>=2.31.0; extra == 'scraping'
|
|
52
|
+
Provides-Extra: strands
|
|
53
|
+
Requires-Dist: strands-agents[ollama]>=0.1.0; extra == 'strands'
|
|
54
|
+
Provides-Extra: tests
|
|
55
|
+
Requires-Dist: coverage[toml]>=7.14.3; extra == 'tests'
|
|
56
|
+
Requires-Dist: pytest-agentic-fabric[tests]; extra == 'tests'
|
|
57
|
+
Requires-Dist: pytest-asyncio>=1.4.0; extra == 'tests'
|
|
58
|
+
Requires-Dist: pytest-cov>=7.1.0; extra == 'tests'
|
|
59
|
+
Requires-Dist: pytest-mock>=3.15.1; extra == 'tests'
|
|
60
|
+
Requires-Dist: pytest-timeout>=2.4.0; extra == 'tests'
|
|
61
|
+
Requires-Dist: pytest-xdist>=3.8.0; extra == 'tests'
|
|
62
|
+
Requires-Dist: pytest>=9.1.1; extra == 'tests'
|
|
63
|
+
Provides-Extra: typing
|
|
64
|
+
Requires-Dist: mypy>=2.1.0; extra == 'typing'
|
|
65
|
+
Requires-Dist: types-pyyaml>=6.0.12.20260518; extra == 'typing'
|
|
66
|
+
Requires-Dist: types-requests>=2.33.0.20260518; extra == 'typing'
|
|
67
|
+
Description-Content-Type: text/markdown
|
|
68
|
+
|
|
69
|
+
# agentic-fabric
|
|
70
|
+
|
|
71
|
+
[](https://pypi.org/project/agentic-fabric/)
|
|
72
|
+
[](https://github.com/jbcom/agentic-fabric/actions/workflows/ci.yml)
|
|
73
|
+
[](https://opensource.org/licenses/MIT)
|
|
74
|
+
[](https://pypi.org/project/agentic-fabric/)
|
|
75
|
+
|
|
76
|
+
Framework-agnostic agent fabric orchestration. Declare fabric agents once in YAML, then
|
|
77
|
+
run them on CrewAI, LangGraph, Strands, or local CLI runners without changing a
|
|
78
|
+
single fabric agent definition. Runtime frameworks are optional and are detected lazily
|
|
79
|
+
from what is installed.
|
|
80
|
+
|
|
81
|
+
[Documentation](https://jonbogaty.com/agentic-fabric/) | [Source](https://github.com/jbcom/agentic-fabric) | [Issues](https://github.com/jbcom/agentic-fabric/issues)
|
|
82
|
+
|
|
83
|
+
## Installation
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
# Core discovery, loading, runner selection, local CLI, and neutral file tools
|
|
87
|
+
pip install agentic-fabric
|
|
88
|
+
|
|
89
|
+
# With a specific framework
|
|
90
|
+
pip install "agentic-fabric[langgraph]"
|
|
91
|
+
pip install "agentic-fabric[strands]"
|
|
92
|
+
|
|
93
|
+
# Non-framework optional surfaces
|
|
94
|
+
pip install "agentic-fabric[mcp]"
|
|
95
|
+
pip install "agentic-fabric[scraping]"
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
Local CLI runners do not require a Python extra. Install the external CLI
|
|
99
|
+
(`aider`, `claude`, `codex`, `ollama`, or a custom executable) and inspect
|
|
100
|
+
profiles with `agentic-fabric list-runners --json`.
|
|
101
|
+
|
|
102
|
+
Vendor-backed passthrough extras will be added after the upstream
|
|
103
|
+
`vendor-fabric` optional-extra contract is published and stable. Until then,
|
|
104
|
+
vendor references stay lazy and report install guidance at use time.
|
|
105
|
+
|
|
106
|
+
There is no aggregate AI extra. Install exactly the framework or provider path
|
|
107
|
+
you use. The CrewAI adapter remains lazy, but `agentic-fabric` does not publish
|
|
108
|
+
a CrewAI extra while CrewAI depends on ChromaDB releases covered by an upstream
|
|
109
|
+
critical advisory with no patched version. Install CrewAI separately only after
|
|
110
|
+
reviewing that advisory state. Core, local-CLI, and first-party scraping
|
|
111
|
+
installs are unaffected.
|
|
112
|
+
|
|
113
|
+
## Quick Start
|
|
114
|
+
|
|
115
|
+
### 1. Define a Fabric Agent (YAML)
|
|
116
|
+
|
|
117
|
+
```yaml
|
|
118
|
+
# .fabric/fabric_agents/analyzer/agents.yaml
|
|
119
|
+
code_reviewer:
|
|
120
|
+
role: Senior Code Reviewer
|
|
121
|
+
goal: Find bugs and improvements
|
|
122
|
+
backstory: Expert at code analysis
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
```yaml
|
|
126
|
+
# .fabric/fabric_agents/analyzer/tasks.yaml
|
|
127
|
+
review_code:
|
|
128
|
+
description: Review the provided code for issues
|
|
129
|
+
expected_output: List of findings with severity
|
|
130
|
+
agent: code_reviewer
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
### 2. Run It
|
|
134
|
+
|
|
135
|
+
```python
|
|
136
|
+
from pathlib import Path
|
|
137
|
+
|
|
138
|
+
from agentic_fabric import detect_framework, get_fabric_agent_config, run_fabric_agent_auto
|
|
139
|
+
|
|
140
|
+
# See what framework is available
|
|
141
|
+
framework = detect_framework()
|
|
142
|
+
|
|
143
|
+
# Load a fabric agent manifest discovered in a package or workspace
|
|
144
|
+
config = get_fabric_agent_config(Path(".fabric"), "analyzer")
|
|
145
|
+
|
|
146
|
+
# Auto-detect best framework and run
|
|
147
|
+
result = run_fabric_agent_auto(config, inputs={"code": "..."})
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
Or from the CLI:
|
|
151
|
+
|
|
152
|
+
```bash
|
|
153
|
+
agentic-fabric run my-package analyzer --input "Review this code: ..."
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
### 3. Use a Specific Runner
|
|
157
|
+
|
|
158
|
+
```python
|
|
159
|
+
from agentic_fabric import get_runner
|
|
160
|
+
|
|
161
|
+
runner = get_runner("langgraph") # Force LangGraph
|
|
162
|
+
fabric_agent = runner.build_fabric_agent(config)
|
|
163
|
+
result = runner.run(fabric_agent, inputs)
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
### 4. Carry Runtime Context with Data
|
|
167
|
+
|
|
168
|
+
```python
|
|
169
|
+
from agentic_fabric import AgenticData, get_framework_info
|
|
170
|
+
|
|
171
|
+
print(get_framework_info())
|
|
172
|
+
|
|
173
|
+
session = AgenticData({"repo": "jbcom/agentic-fabric"})
|
|
174
|
+
session.register_fabric_agent("reviewer", config)
|
|
175
|
+
result = session.run_fabric_agent("reviewer", runtime="crewai")
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
## Key Features
|
|
179
|
+
|
|
180
|
+
- Framework agnostic: one fabric agent definition, multiple runtime backends.
|
|
181
|
+
- Lazy imports: core package import does not require CrewAI, LangGraph,
|
|
182
|
+
Strands, or vendor SDKs.
|
|
183
|
+
- Framework-neutral file tools: built-in filesystem tools can be resolved
|
|
184
|
+
without installing CrewAI or Pydantic; framework adapters add schema wrappers
|
|
185
|
+
only when their optional dependencies are present.
|
|
186
|
+
- Focused extras: `langgraph`, `strands`, `mcp`, `scraping`,
|
|
187
|
+
`tests`, `typing`, `docs`, and `dev`.
|
|
188
|
+
- `AgenticData`: carries data, registered fabric agents, active runtime selection, and
|
|
189
|
+
vendor-layer context together.
|
|
190
|
+
- Capability decorators: runners and tools expose declared capabilities through
|
|
191
|
+
read-only metadata and deterministic dispatch.
|
|
192
|
+
- Tool resolution: built-in, vendor URI, and registered factories are preferred;
|
|
193
|
+
external dynamic imports require `AGENTIC_FABRIC_TOOL_IMPORT_ALLOWLIST`.
|
|
194
|
+
- Vendor tool catalogs: `AgenticData.vendor_tools()` adapts inherited
|
|
195
|
+
`VendorData` capability metadata into agent-facing tools without importing
|
|
196
|
+
provider SDKs directly.
|
|
197
|
+
- YAML-first: fabric agent configuration in YAML, not Python boilerplate.
|
|
198
|
+
- Hierarchical orchestration: `ManagerAgent` delegates across fabric agents.
|
|
199
|
+
- Package discovery: finds `.fabric/`, `.crewai/`, `.langgraph/`, and
|
|
200
|
+
`.strands/` directories.
|
|
201
|
+
- Vendor passthrough extras are deferred until `vendor-fabric` is published
|
|
202
|
+
with a stable optional-extra contract.
|
|
203
|
+
- CLI and library: use from the command line or import as a module.
|
|
204
|
+
|
|
205
|
+
## Framework Priority
|
|
206
|
+
|
|
207
|
+
1. CrewAI, if installed.
|
|
208
|
+
2. LangGraph, if CrewAI is unavailable.
|
|
209
|
+
3. Strands, if neither CrewAI nor LangGraph is available.
|
|
210
|
+
|
|
211
|
+
You can always force a specific runner with `get_runner("langgraph")` or
|
|
212
|
+
`agentic-fabric run --framework langgraph`.
|
|
213
|
+
|
|
214
|
+
If the selected runtime is not installed, errors point to the matching
|
|
215
|
+
`agentic-fabric[...]` extra. Framework-specific config directories also enforce
|
|
216
|
+
their runtime: a fabric agent in `.langgraph/` will not silently run on CrewAI.
|
|
217
|
+
|
|
218
|
+
## Local CLI Runners
|
|
219
|
+
|
|
220
|
+
For single-agent coding tools, use the `--runner` CLI path:
|
|
221
|
+
|
|
222
|
+
```bash
|
|
223
|
+
agentic-fabric list-runners --json
|
|
224
|
+
agentic-fabric run --runner aider --input "Add validation to auth.py"
|
|
225
|
+
agentic-fabric run --runner ollama --model deepseek-coder --input "Explain this module"
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
Profiles are loaded from the packaged `local_cli_profiles.yaml`, validated
|
|
229
|
+
before use, and rejected on POSIX systems if the profiles file is group- or
|
|
230
|
+
world-writable.
|
|
231
|
+
|
|
232
|
+
## MCP Adapters
|
|
233
|
+
|
|
234
|
+
The `mcp` extra installs the MCP transport dependency and enables two console
|
|
235
|
+
entry points:
|
|
236
|
+
|
|
237
|
+
```bash
|
|
238
|
+
agentic-fabric-vendor-mcp
|
|
239
|
+
agentic-fabric-meshy-mcp
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
`agentic-fabric-vendor-mcp` exposes credential-free vendor catalog tools and
|
|
243
|
+
public `vendor-fabric` data methods. `agentic-fabric-meshy-mcp` converts
|
|
244
|
+
Meshy capability metadata from `vendor-fabric[meshy]` into MCP tools. Both
|
|
245
|
+
servers import provider code lazily; install the matching `vendor-fabric`
|
|
246
|
+
package/extras in the same environment before running provider-backed tools.
|
|
247
|
+
If provider startup fails, the adapter error includes the `agentic-fabric[mcp]`
|
|
248
|
+
or `vendor-fabric[...]` install guidance plus the original import failure so
|
|
249
|
+
missing provider extras are visible.
|
|
250
|
+
|
|
251
|
+
## Repository Boundary
|
|
252
|
+
|
|
253
|
+
- `extended-data` owns base data containers, logging, input handling, files,
|
|
254
|
+
redaction, and generic workflows.
|
|
255
|
+
- `vendor-fabric` owns vendor connectors, provider-backed sync, the SecretSync
|
|
256
|
+
Python facade/capability surfaces, provider capability metadata, and provider
|
|
257
|
+
dispatch.
|
|
258
|
+
- `agentic-fabric` owns fabric agent discovery, runner selection, framework adapters,
|
|
259
|
+
agent-facing tool wrappers, and orchestration.
|
|
260
|
+
|
|
261
|
+
Full guides and API documentation are published at
|
|
262
|
+
[jonbogaty.com/agentic-fabric](https://jonbogaty.com/agentic-fabric/).
|
|
263
|
+
`AGENTS.md` contains durable repository guidance for Codex sessions.
|
|
264
|
+
|
|
265
|
+
## Documentation
|
|
266
|
+
|
|
267
|
+
The docs are built with Sphinx, Furo, and sphinx-autodoc2:
|
|
268
|
+
|
|
269
|
+
```bash
|
|
270
|
+
tox -e docs
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
Local validation:
|
|
274
|
+
|
|
275
|
+
```bash
|
|
276
|
+
uv sync --all-packages --all-extras --dev
|
|
277
|
+
tox -e lint
|
|
278
|
+
tox -e typecheck
|
|
279
|
+
tox -e audit
|
|
280
|
+
tox -e py311
|
|
281
|
+
tox -e py312
|
|
282
|
+
tox -e py313
|
|
283
|
+
tox -e py314
|
|
284
|
+
tox -e coverage
|
|
285
|
+
tox -e plugin
|
|
286
|
+
tox -e examples
|
|
287
|
+
tox -e build
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
## License
|
|
291
|
+
|
|
292
|
+
MIT
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
# agentic-fabric
|
|
2
|
+
|
|
3
|
+
[](https://pypi.org/project/agentic-fabric/)
|
|
4
|
+
[](https://github.com/jbcom/agentic-fabric/actions/workflows/ci.yml)
|
|
5
|
+
[](https://opensource.org/licenses/MIT)
|
|
6
|
+
[](https://pypi.org/project/agentic-fabric/)
|
|
7
|
+
|
|
8
|
+
Framework-agnostic agent fabric orchestration. Declare fabric agents once in YAML, then
|
|
9
|
+
run them on CrewAI, LangGraph, Strands, or local CLI runners without changing a
|
|
10
|
+
single fabric agent definition. Runtime frameworks are optional and are detected lazily
|
|
11
|
+
from what is installed.
|
|
12
|
+
|
|
13
|
+
[Documentation](https://jonbogaty.com/agentic-fabric/) | [Source](https://github.com/jbcom/agentic-fabric) | [Issues](https://github.com/jbcom/agentic-fabric/issues)
|
|
14
|
+
|
|
15
|
+
## Installation
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
# Core discovery, loading, runner selection, local CLI, and neutral file tools
|
|
19
|
+
pip install agentic-fabric
|
|
20
|
+
|
|
21
|
+
# With a specific framework
|
|
22
|
+
pip install "agentic-fabric[langgraph]"
|
|
23
|
+
pip install "agentic-fabric[strands]"
|
|
24
|
+
|
|
25
|
+
# Non-framework optional surfaces
|
|
26
|
+
pip install "agentic-fabric[mcp]"
|
|
27
|
+
pip install "agentic-fabric[scraping]"
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
Local CLI runners do not require a Python extra. Install the external CLI
|
|
31
|
+
(`aider`, `claude`, `codex`, `ollama`, or a custom executable) and inspect
|
|
32
|
+
profiles with `agentic-fabric list-runners --json`.
|
|
33
|
+
|
|
34
|
+
Vendor-backed passthrough extras will be added after the upstream
|
|
35
|
+
`vendor-fabric` optional-extra contract is published and stable. Until then,
|
|
36
|
+
vendor references stay lazy and report install guidance at use time.
|
|
37
|
+
|
|
38
|
+
There is no aggregate AI extra. Install exactly the framework or provider path
|
|
39
|
+
you use. The CrewAI adapter remains lazy, but `agentic-fabric` does not publish
|
|
40
|
+
a CrewAI extra while CrewAI depends on ChromaDB releases covered by an upstream
|
|
41
|
+
critical advisory with no patched version. Install CrewAI separately only after
|
|
42
|
+
reviewing that advisory state. Core, local-CLI, and first-party scraping
|
|
43
|
+
installs are unaffected.
|
|
44
|
+
|
|
45
|
+
## Quick Start
|
|
46
|
+
|
|
47
|
+
### 1. Define a Fabric Agent (YAML)
|
|
48
|
+
|
|
49
|
+
```yaml
|
|
50
|
+
# .fabric/fabric_agents/analyzer/agents.yaml
|
|
51
|
+
code_reviewer:
|
|
52
|
+
role: Senior Code Reviewer
|
|
53
|
+
goal: Find bugs and improvements
|
|
54
|
+
backstory: Expert at code analysis
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
```yaml
|
|
58
|
+
# .fabric/fabric_agents/analyzer/tasks.yaml
|
|
59
|
+
review_code:
|
|
60
|
+
description: Review the provided code for issues
|
|
61
|
+
expected_output: List of findings with severity
|
|
62
|
+
agent: code_reviewer
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
### 2. Run It
|
|
66
|
+
|
|
67
|
+
```python
|
|
68
|
+
from pathlib import Path
|
|
69
|
+
|
|
70
|
+
from agentic_fabric import detect_framework, get_fabric_agent_config, run_fabric_agent_auto
|
|
71
|
+
|
|
72
|
+
# See what framework is available
|
|
73
|
+
framework = detect_framework()
|
|
74
|
+
|
|
75
|
+
# Load a fabric agent manifest discovered in a package or workspace
|
|
76
|
+
config = get_fabric_agent_config(Path(".fabric"), "analyzer")
|
|
77
|
+
|
|
78
|
+
# Auto-detect best framework and run
|
|
79
|
+
result = run_fabric_agent_auto(config, inputs={"code": "..."})
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
Or from the CLI:
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
agentic-fabric run my-package analyzer --input "Review this code: ..."
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### 3. Use a Specific Runner
|
|
89
|
+
|
|
90
|
+
```python
|
|
91
|
+
from agentic_fabric import get_runner
|
|
92
|
+
|
|
93
|
+
runner = get_runner("langgraph") # Force LangGraph
|
|
94
|
+
fabric_agent = runner.build_fabric_agent(config)
|
|
95
|
+
result = runner.run(fabric_agent, inputs)
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### 4. Carry Runtime Context with Data
|
|
99
|
+
|
|
100
|
+
```python
|
|
101
|
+
from agentic_fabric import AgenticData, get_framework_info
|
|
102
|
+
|
|
103
|
+
print(get_framework_info())
|
|
104
|
+
|
|
105
|
+
session = AgenticData({"repo": "jbcom/agentic-fabric"})
|
|
106
|
+
session.register_fabric_agent("reviewer", config)
|
|
107
|
+
result = session.run_fabric_agent("reviewer", runtime="crewai")
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
## Key Features
|
|
111
|
+
|
|
112
|
+
- Framework agnostic: one fabric agent definition, multiple runtime backends.
|
|
113
|
+
- Lazy imports: core package import does not require CrewAI, LangGraph,
|
|
114
|
+
Strands, or vendor SDKs.
|
|
115
|
+
- Framework-neutral file tools: built-in filesystem tools can be resolved
|
|
116
|
+
without installing CrewAI or Pydantic; framework adapters add schema wrappers
|
|
117
|
+
only when their optional dependencies are present.
|
|
118
|
+
- Focused extras: `langgraph`, `strands`, `mcp`, `scraping`,
|
|
119
|
+
`tests`, `typing`, `docs`, and `dev`.
|
|
120
|
+
- `AgenticData`: carries data, registered fabric agents, active runtime selection, and
|
|
121
|
+
vendor-layer context together.
|
|
122
|
+
- Capability decorators: runners and tools expose declared capabilities through
|
|
123
|
+
read-only metadata and deterministic dispatch.
|
|
124
|
+
- Tool resolution: built-in, vendor URI, and registered factories are preferred;
|
|
125
|
+
external dynamic imports require `AGENTIC_FABRIC_TOOL_IMPORT_ALLOWLIST`.
|
|
126
|
+
- Vendor tool catalogs: `AgenticData.vendor_tools()` adapts inherited
|
|
127
|
+
`VendorData` capability metadata into agent-facing tools without importing
|
|
128
|
+
provider SDKs directly.
|
|
129
|
+
- YAML-first: fabric agent configuration in YAML, not Python boilerplate.
|
|
130
|
+
- Hierarchical orchestration: `ManagerAgent` delegates across fabric agents.
|
|
131
|
+
- Package discovery: finds `.fabric/`, `.crewai/`, `.langgraph/`, and
|
|
132
|
+
`.strands/` directories.
|
|
133
|
+
- Vendor passthrough extras are deferred until `vendor-fabric` is published
|
|
134
|
+
with a stable optional-extra contract.
|
|
135
|
+
- CLI and library: use from the command line or import as a module.
|
|
136
|
+
|
|
137
|
+
## Framework Priority
|
|
138
|
+
|
|
139
|
+
1. CrewAI, if installed.
|
|
140
|
+
2. LangGraph, if CrewAI is unavailable.
|
|
141
|
+
3. Strands, if neither CrewAI nor LangGraph is available.
|
|
142
|
+
|
|
143
|
+
You can always force a specific runner with `get_runner("langgraph")` or
|
|
144
|
+
`agentic-fabric run --framework langgraph`.
|
|
145
|
+
|
|
146
|
+
If the selected runtime is not installed, errors point to the matching
|
|
147
|
+
`agentic-fabric[...]` extra. Framework-specific config directories also enforce
|
|
148
|
+
their runtime: a fabric agent in `.langgraph/` will not silently run on CrewAI.
|
|
149
|
+
|
|
150
|
+
## Local CLI Runners
|
|
151
|
+
|
|
152
|
+
For single-agent coding tools, use the `--runner` CLI path:
|
|
153
|
+
|
|
154
|
+
```bash
|
|
155
|
+
agentic-fabric list-runners --json
|
|
156
|
+
agentic-fabric run --runner aider --input "Add validation to auth.py"
|
|
157
|
+
agentic-fabric run --runner ollama --model deepseek-coder --input "Explain this module"
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
Profiles are loaded from the packaged `local_cli_profiles.yaml`, validated
|
|
161
|
+
before use, and rejected on POSIX systems if the profiles file is group- or
|
|
162
|
+
world-writable.
|
|
163
|
+
|
|
164
|
+
## MCP Adapters
|
|
165
|
+
|
|
166
|
+
The `mcp` extra installs the MCP transport dependency and enables two console
|
|
167
|
+
entry points:
|
|
168
|
+
|
|
169
|
+
```bash
|
|
170
|
+
agentic-fabric-vendor-mcp
|
|
171
|
+
agentic-fabric-meshy-mcp
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
`agentic-fabric-vendor-mcp` exposes credential-free vendor catalog tools and
|
|
175
|
+
public `vendor-fabric` data methods. `agentic-fabric-meshy-mcp` converts
|
|
176
|
+
Meshy capability metadata from `vendor-fabric[meshy]` into MCP tools. Both
|
|
177
|
+
servers import provider code lazily; install the matching `vendor-fabric`
|
|
178
|
+
package/extras in the same environment before running provider-backed tools.
|
|
179
|
+
If provider startup fails, the adapter error includes the `agentic-fabric[mcp]`
|
|
180
|
+
or `vendor-fabric[...]` install guidance plus the original import failure so
|
|
181
|
+
missing provider extras are visible.
|
|
182
|
+
|
|
183
|
+
## Repository Boundary
|
|
184
|
+
|
|
185
|
+
- `extended-data` owns base data containers, logging, input handling, files,
|
|
186
|
+
redaction, and generic workflows.
|
|
187
|
+
- `vendor-fabric` owns vendor connectors, provider-backed sync, the SecretSync
|
|
188
|
+
Python facade/capability surfaces, provider capability metadata, and provider
|
|
189
|
+
dispatch.
|
|
190
|
+
- `agentic-fabric` owns fabric agent discovery, runner selection, framework adapters,
|
|
191
|
+
agent-facing tool wrappers, and orchestration.
|
|
192
|
+
|
|
193
|
+
Full guides and API documentation are published at
|
|
194
|
+
[jonbogaty.com/agentic-fabric](https://jonbogaty.com/agentic-fabric/).
|
|
195
|
+
`AGENTS.md` contains durable repository guidance for Codex sessions.
|
|
196
|
+
|
|
197
|
+
## Documentation
|
|
198
|
+
|
|
199
|
+
The docs are built with Sphinx, Furo, and sphinx-autodoc2:
|
|
200
|
+
|
|
201
|
+
```bash
|
|
202
|
+
tox -e docs
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
Local validation:
|
|
206
|
+
|
|
207
|
+
```bash
|
|
208
|
+
uv sync --all-packages --all-extras --dev
|
|
209
|
+
tox -e lint
|
|
210
|
+
tox -e typecheck
|
|
211
|
+
tox -e audit
|
|
212
|
+
tox -e py311
|
|
213
|
+
tox -e py312
|
|
214
|
+
tox -e py313
|
|
215
|
+
tox -e py314
|
|
216
|
+
tox -e coverage
|
|
217
|
+
tox -e plugin
|
|
218
|
+
tox -e examples
|
|
219
|
+
tox -e build
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
## License
|
|
223
|
+
|
|
224
|
+
MIT
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# Examples
|
|
2
|
+
|
|
3
|
+
These examples are intentionally executable in CI. They avoid live LLM calls
|
|
4
|
+
and optional framework imports unless explicitly noted, so they also serve as
|
|
5
|
+
integration checks for the public API.
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
python examples/discovery_workflow.py
|
|
9
|
+
python examples/tool_registry.py
|
|
10
|
+
python examples/runtime_context.py
|
|
11
|
+
python examples/mcp_adapters.py
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
The bundled `sample_workspace/` directory demonstrates a framework-agnostic
|
|
15
|
+
`.fabric/` layout.
|
|
16
|
+
|
|
17
|
+
`mcp_adapters.py` shows the agentic-fabric-owned MCP entry points and a
|
|
18
|
+
client configuration shape without importing the MCP SDK or provider packages.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""Runnable agentic-fabric examples."""
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"""Discover and inspect a framework-agnostic fabric workspace."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import json
|
|
6
|
+
import sys
|
|
7
|
+
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
from typing import Any
|
|
10
|
+
|
|
11
|
+
from agentic_fabric.core.discovery import discover_packages, get_fabric_agent_config, load_manifest
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
DEFAULT_WORKSPACE = Path(__file__).parent / "sample_workspace"
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def summarize_workspace(workspace_root: Path = DEFAULT_WORKSPACE) -> dict[str, Any]:
|
|
18
|
+
"""Return a deterministic summary of fabric agents in a workspace."""
|
|
19
|
+
packages = discover_packages(workspace_root=workspace_root)
|
|
20
|
+
summary: dict[str, Any] = {"workspace": str(workspace_root), "packages": {}}
|
|
21
|
+
|
|
22
|
+
for package_name, config_dir in sorted(packages.items()):
|
|
23
|
+
manifest = load_manifest(config_dir)
|
|
24
|
+
fabric_agent_summaries = {}
|
|
25
|
+
for fabric_agent_name in sorted(manifest.get("fabric_agents", {})):
|
|
26
|
+
fabric_agent_config = get_fabric_agent_config(config_dir, fabric_agent_name)
|
|
27
|
+
fabric_agent_summaries[fabric_agent_name] = {
|
|
28
|
+
"description": fabric_agent_config.get("description", ""),
|
|
29
|
+
"required_framework": fabric_agent_config.get("required_framework"),
|
|
30
|
+
"agents": sorted(fabric_agent_config.get("agents", {})),
|
|
31
|
+
"tasks": sorted(fabric_agent_config.get("tasks", {})),
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
summary["packages"][package_name] = {
|
|
35
|
+
"config_dir": config_dir.name,
|
|
36
|
+
"fabric_agents": fabric_agent_summaries,
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
return summary
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def main() -> None:
|
|
43
|
+
"""Print the sample workspace summary as JSON."""
|
|
44
|
+
sys.stdout.write(json.dumps(summarize_workspace(), indent=2, sort_keys=True))
|
|
45
|
+
sys.stdout.write("\n")
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
if __name__ == "__main__":
|
|
49
|
+
main()
|