admina-framework 0.9.4__tar.gz → 0.9.5__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.
- {admina_framework-0.9.4/admina_framework.egg-info → admina_framework-0.9.5}/PKG-INFO +31 -66
- {admina_framework-0.9.4 → admina_framework-0.9.5}/README.md +30 -64
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina/__init__.py +1 -1
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina/cli/main.py +6 -7
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina/cli/templates/admina.yaml.j2 +2 -2
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina/cli/templates/docker-compose.yml.j2 +2 -27
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina/cli/templates/env.j2 +0 -2
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina/core/config.py +5 -15
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina/core/secrets.py +0 -4
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina/dashboard/static/index.html +0 -4
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina/domains/compliance/__init__.py +3 -3
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina/domains/compliance/forensic.py +12 -89
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina/plugins/base.py +4 -2
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina/proxy/api/dashboard.py +9 -21
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina/proxy/api/integration.py +1 -1
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina/proxy/config.py +14 -22
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina/proxy/main.py +5 -25
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina/proxy/state.py +0 -2
- {admina_framework-0.9.4 → admina_framework-0.9.5/admina_framework.egg-info}/PKG-INFO +31 -66
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina_framework.egg-info/SOURCES.txt +0 -1
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina_framework.egg-info/requires.txt +0 -1
- {admina_framework-0.9.4 → admina_framework-0.9.5}/pyproject.toml +13 -6
- {admina_framework-0.9.4 → admina_framework-0.9.5}/tests/test_core_config.py +1 -1
- {admina_framework-0.9.4 → admina_framework-0.9.5}/tests/test_proxy_security.py +0 -9
- admina_framework-0.9.4/admina/plugins/builtin/forensic/minio.py +0 -180
- {admina_framework-0.9.4 → admina_framework-0.9.5}/LICENSE +0 -0
- {admina_framework-0.9.4 → admina_framework-0.9.5}/NOTICE +0 -0
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina/cli/__init__.py +0 -0
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina/cli/commands/__init__.py +0 -0
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina/cli/templates/main.py.j2 +0 -0
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina/cli/templates/plugin.py.j2 +0 -0
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina/cli/templates/plugin_pyproject.toml.j2 +0 -0
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina/cli/templates/plugin_readme.md.j2 +0 -0
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina/cli/templates/plugin_test.py.j2 +0 -0
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina/core/__init__.py +0 -0
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina/core/event_bus.py +0 -0
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina/core/types.py +0 -0
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina/dashboard/__init__.py +0 -0
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina/dashboard/static/heimdall.png +0 -0
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina/dashboard/static/vendor/alpinejs.min.js +0 -0
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina/domains/__init__.py +0 -0
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina/domains/agent_security/__init__.py +0 -0
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina/domains/agent_security/firewall.py +0 -0
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina/domains/agent_security/loop_breaker.py +0 -0
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina/domains/ai_infra/__init__.py +0 -0
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina/domains/ai_infra/llm_engine.py +0 -0
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina/domains/ai_infra/rag.py +0 -0
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina/domains/ai_infra/webui.py +0 -0
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina/domains/compliance/cross_regulation.py +0 -0
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina/domains/compliance/eu_ai_act.py +0 -0
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina/domains/compliance/gdpr.py +0 -0
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina/domains/compliance/nis2.py +0 -0
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina/domains/compliance/oisg.py +0 -0
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina/domains/compliance/otel.py +0 -0
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina/domains/data_sovereignty/__init__.py +0 -0
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina/domains/data_sovereignty/classification.py +0 -0
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina/domains/data_sovereignty/pii.py +0 -0
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina/domains/data_sovereignty/residency.py +0 -0
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina/integrations/__init__.py +0 -0
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina/integrations/_engines.py +0 -0
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina/integrations/cheshirecat/__init__.py +0 -0
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina/integrations/cheshirecat/admina-plugin/admina_governance.py +0 -0
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina/integrations/crewai/__init__.py +0 -0
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina/integrations/crewai/callbacks.py +0 -0
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina/integrations/langchain/__init__.py +0 -0
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina/integrations/langchain/callbacks.py +0 -0
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina/integrations/n8n/__init__.py +0 -0
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina/integrations/openclaw/__init__.py +0 -0
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina/plugins/__init__.py +0 -0
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina/plugins/builtin/__init__.py +0 -0
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina/plugins/builtin/adapters/__init__.py +0 -0
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina/plugins/builtin/adapters/ollama.py +0 -0
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina/plugins/builtin/adapters/openai.py +0 -0
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina/plugins/builtin/alerts/__init__.py +0 -0
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina/plugins/builtin/alerts/log.py +0 -0
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina/plugins/builtin/alerts/webhook.py +0 -0
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina/plugins/builtin/auth/__init__.py +0 -0
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina/plugins/builtin/auth/apikey.py +0 -0
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina/plugins/builtin/compliance/__init__.py +0 -0
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina/plugins/builtin/compliance/eu_ai_act.py +0 -0
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina/plugins/builtin/connectors/__init__.py +0 -0
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina/plugins/builtin/connectors/chromadb.py +0 -0
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina/plugins/builtin/connectors/filesystem.py +0 -0
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina/plugins/builtin/forensic/__init__.py +0 -0
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina/plugins/builtin/forensic/filesystem.py +0 -0
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina/plugins/builtin/guards/__init__.py +0 -0
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina/plugins/builtin/guards/guardrailsai_guard.py +0 -0
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina/plugins/builtin/pii/__init__.py +0 -0
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina/plugins/builtin/pii/spacy_regex.py +0 -0
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina/plugins/builtin/transports/__init__.py +0 -0
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina/plugins/builtin/transports/http_rest.py +0 -0
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina/plugins/builtin/transports/mcp.py +0 -0
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina/plugins/registry.py +0 -0
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina/proxy/__init__.py +0 -0
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina/proxy/api/__init__.py +0 -0
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina/proxy/engine_bridge.py +0 -0
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina/proxy/governance.py +0 -0
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina/proxy/multi_upstream.py +0 -0
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina/py.typed +0 -0
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina/sdk/__init__.py +0 -0
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina/sdk/_compat.py +0 -0
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina/sdk/compliance_kit.py +0 -0
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina/sdk/governed_agent.py +0 -0
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina/sdk/governed_data.py +0 -0
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina/sdk/governed_model.py +0 -0
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina_framework.egg-info/dependency_links.txt +0 -0
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina_framework.egg-info/entry_points.txt +0 -0
- {admina_framework-0.9.4 → admina_framework-0.9.5}/admina_framework.egg-info/top_level.txt +0 -0
- {admina_framework-0.9.4 → admina_framework-0.9.5}/setup.cfg +0 -0
- {admina_framework-0.9.4 → admina_framework-0.9.5}/tests/test_benchmark_14us.py +0 -0
- {admina_framework-0.9.4 → admina_framework-0.9.5}/tests/test_domains.py +0 -0
- {admina_framework-0.9.4 → admina_framework-0.9.5}/tests/test_firewall_parity.py +0 -0
- {admina_framework-0.9.4 → admina_framework-0.9.5}/tests/test_forensic_blackbox.py +0 -0
- {admina_framework-0.9.4 → admina_framework-0.9.5}/tests/test_governance_pipeline.py +0 -0
- {admina_framework-0.9.4 → admina_framework-0.9.5}/tests/test_mcp_transport.py +0 -0
- {admina_framework-0.9.4 → admina_framework-0.9.5}/tests/test_version.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: admina-framework
|
|
3
|
-
Version: 0.9.
|
|
3
|
+
Version: 0.9.5
|
|
4
4
|
Summary: Admina — governed AI development framework
|
|
5
5
|
Author-email: Stefano Noferi <info@admina.org>
|
|
6
6
|
Maintainer-email: Stefano Noferi <info@admina.org>
|
|
@@ -40,7 +40,6 @@ Requires-Dist: pydantic-settings<3,>=2.3; extra == "proxy"
|
|
|
40
40
|
Requires-Dist: python-dotenv<2,>=1.0; extra == "proxy"
|
|
41
41
|
Requires-Dist: redis<6,>=5.0; extra == "proxy"
|
|
42
42
|
Requires-Dist: boto3<2,>=1.34; extra == "proxy"
|
|
43
|
-
Requires-Dist: minio<8,>=7.2; extra == "proxy"
|
|
44
43
|
Requires-Dist: clickhouse-connect<1,>=0.7; extra == "proxy"
|
|
45
44
|
Requires-Dist: typer<1,>=0.9; extra == "proxy"
|
|
46
45
|
Requires-Dist: numpy<2,>=1.24; extra == "proxy"
|
|
@@ -60,7 +59,7 @@ Dynamic: license-file
|
|
|
60
59
|
|
|
61
60
|
<!--
|
|
62
61
|
<p align="center">
|
|
63
|
-
<img src="resources/banner.png" alt="Admina — Governed AI by Default" width="100%">
|
|
62
|
+
<img src="https://raw.githubusercontent.com/admina-org/admina/main/resources/banner.png" alt="Admina — Governed AI by Default" width="100%">
|
|
64
63
|
</p>
|
|
65
64
|
-->
|
|
66
65
|
|
|
@@ -71,9 +70,9 @@ Dynamic: license-file
|
|
|
71
70
|
|
|
72
71
|
<p align="center">
|
|
73
72
|
<a href="https://pypi.org/project/admina-framework/"><img src="https://img.shields.io/pypi/v/admina-framework?style=flat-square&color=32CD32" alt="PyPI version"></a>
|
|
74
|
-
<a href="LICENSE"><img src="https://img.shields.io/badge/license-Apache--2.0-32CD32?style=flat-square" alt="License"></a>
|
|
73
|
+
<a href="https://github.com/admina-org/admina/blob/main/LICENSE"><img src="https://img.shields.io/badge/license-Apache--2.0-32CD32?style=flat-square" alt="License"></a>
|
|
75
74
|
<img src="https://img.shields.io/badge/python-3.11%2B-32CD32?style=flat-square&logo=python&logoColor=white" alt="Python 3.11+">
|
|
76
|
-
<img src="https://img.shields.io/
|
|
75
|
+
<img src="https://img.shields.io/github/last-commit/admina-org/admina?style=flat-square" alt="Last commit">
|
|
77
76
|
</p>
|
|
78
77
|
|
|
79
78
|
<p align="center">
|
|
@@ -85,7 +84,6 @@ Dynamic: license-file
|
|
|
85
84
|
|
|
86
85
|
<p align="center">
|
|
87
86
|
<a href="https://deepwiki.com/admina-org/admina"><img src="https://deepwiki.com/badge.svg" alt="Ask DeepWiki"></a>
|
|
88
|
-
<a href="https://github.com/admina-org/admina/discussions"><img src="https://img.shields.io/github/discussions/admina-org/admina?style=flat-square&logo=github" alt="Discussions"></a>
|
|
89
87
|
<a href="https://admina.org/docs"><img src="https://img.shields.io/badge/docs-admina.org-blue?style=flat-square" alt="Docs"></a>
|
|
90
88
|
</p>
|
|
91
89
|
|
|
@@ -96,13 +94,6 @@ Dynamic: license-file
|
|
|
96
94
|
<a href="https://deepwiki.com/admina-org/admina"><img src="https://img.shields.io/badge/🤖%20Ask%20DeepWiki-AI%20wiki-7C3AED?style=for-the-badge" alt="DeepWiki" height="40"></a>
|
|
97
95
|
</p>
|
|
98
96
|
|
|
99
|
-
<p align="center">
|
|
100
|
-
<a href="https://github.com/admina-org/admina/stargazers"><img src="https://img.shields.io/github/stars/admina-org/admina?style=social" alt="Stars"></a>
|
|
101
|
-
<a href="https://github.com/admina-org/admina/network/members"><img src="https://img.shields.io/github/forks/admina-org/admina?style=social" alt="Forks"></a>
|
|
102
|
-
<a href="https://github.com/admina-org/admina/graphs/contributors"><img src="https://img.shields.io/github/contributors/admina-org/admina?style=flat-square&label=contributors" alt="Contributors"></a>
|
|
103
|
-
<img src="https://img.shields.io/github/last-commit/admina-org/admina?style=flat-square" alt="Last commit">
|
|
104
|
-
</p>
|
|
105
|
-
|
|
106
97
|
---
|
|
107
98
|
|
|
108
99
|
## See it in action
|
|
@@ -110,13 +101,13 @@ Dynamic: license-file
|
|
|
110
101
|
**Scaffold a project and boot the governed proxy + dashboard — no Docker:**
|
|
111
102
|
|
|
112
103
|
<p align="center">
|
|
113
|
-
<img src="resources/admina-init-dev.gif" alt="admina init → admina dev → Ready on localhost:3000" width="900">
|
|
104
|
+
<img src="https://raw.githubusercontent.com/admina-org/admina/main/resources/admina-init-dev.gif" alt="admina init → admina dev → Ready on localhost:3000" width="900">
|
|
114
105
|
</p>
|
|
115
106
|
|
|
116
107
|
**Wrap any model in a few lines — PII is stripped before the model ever sees it:**
|
|
117
108
|
|
|
118
109
|
<p align="center">
|
|
119
|
-
<img src="resources/sdk-3lines.gif" alt="GovernedModel redacts PERSON, EMAIL and credit card before the LLM call" width="900">
|
|
110
|
+
<img src="https://raw.githubusercontent.com/admina-org/admina/main/resources/sdk-3lines.gif" alt="GovernedModel redacts PERSON, EMAIL and credit card before the LLM call" width="900">
|
|
120
111
|
</p>
|
|
121
112
|
|
|
122
113
|
**The governance dashboard, before and after simulated traffic — Admina Score 40 → 60:**
|
|
@@ -124,11 +115,11 @@ Dynamic: license-file
|
|
|
124
115
|
<table>
|
|
125
116
|
<tr>
|
|
126
117
|
<td align="center" width="50%">
|
|
127
|
-
<img src="resources/dashboard-firstuser.png" alt="Dashboard at first boot — score 40/100" width="100%"><br>
|
|
118
|
+
<img src="https://raw.githubusercontent.com/admina-org/admina/main/resources/dashboard-firstuser.png" alt="Dashboard at first boot — score 40/100" width="100%"><br>
|
|
128
119
|
<em>First boot — Admina Score <strong>40/100</strong></em>
|
|
129
120
|
</td>
|
|
130
121
|
<td align="center" width="50%">
|
|
131
|
-
<img src="resources/dashboard-traffic.png" alt="Dashboard after simulated traffic — score 60/100" width="100%"><br>
|
|
122
|
+
<img src="https://raw.githubusercontent.com/admina-org/admina/main/resources/dashboard-traffic.png" alt="Dashboard after simulated traffic — score 60/100" width="100%"><br>
|
|
132
123
|
<em>After <code>python scripts/simulate.py</code> — <strong>60/100</strong></em>
|
|
133
124
|
</td>
|
|
134
125
|
</tr>
|
|
@@ -306,7 +297,7 @@ from admina import GovernedModel, GovernedData, GovernedAgent, ComplianceKit
|
|
|
306
297
|
| Governance Domain | GuardrailsAI (toxic, jailbreak, bias, PII) |
|
|
307
298
|
| Compliance Template | EU AI Act |
|
|
308
299
|
| Transport Adapter | MCP, HTTP REST |
|
|
309
|
-
| Forensic Store | Filesystem, S3-compatible (boto3
|
|
300
|
+
| Forensic Store | Filesystem, S3-compatible (boto3 — AWS S3, MinIO, R2, …) |
|
|
310
301
|
| Auth Provider | API Key |
|
|
311
302
|
| PII Engine | spaCy + Regex |
|
|
312
303
|
| Alert Channel | Log, Webhook |
|
|
@@ -322,7 +313,7 @@ admina plugin create my-domain # Scaffold a new plugin
|
|
|
322
313
|
```bash
|
|
323
314
|
admina init my-project # Scaffold project with admina.yaml + docker-compose.yml
|
|
324
315
|
admina dev # Local mode: proxy + dashboard on :3000 (no Docker)
|
|
325
|
-
admina dev --stack # Docker stack: + redis + clickhouse +
|
|
316
|
+
admina dev --stack # Docker stack: + redis + clickhouse + grafana
|
|
326
317
|
admina dev --with-llm # --stack + ollama + chromadb + open-webui
|
|
327
318
|
admina plugin list # List all registered plugins
|
|
328
319
|
admina plugin install X # Install a plugin from path or registry
|
|
@@ -341,7 +332,7 @@ Real-time governance dashboard on port 3000:
|
|
|
341
332
|
- **Governance Score** — 0-100 composite metric (data residency, audit coverage, attack rate, forensic integrity, EU AI Act compliance)
|
|
342
333
|
- **Live Feed** — streaming governance events via WebSocket
|
|
343
334
|
- **Compliance Gaps** — EU AI Act gap analysis with article-level detail
|
|
344
|
-
- **Infrastructure Health** — proxy, Redis,
|
|
335
|
+
- **Infrastructure Health** — proxy, Redis, forensic store, ClickHouse, OTEL status
|
|
345
336
|
|
|
346
337
|
API backend: `GET /api/dashboard/score`, `/feed`, `/compliance`, `/sovereignty`, `/infra`, `/models`
|
|
347
338
|
|
|
@@ -353,7 +344,7 @@ Admina uses `admina.yaml` as the primary config file (with `.env` fallback for b
|
|
|
353
344
|
cp admina.yaml.example admina.yaml # Copy and customize
|
|
354
345
|
```
|
|
355
346
|
|
|
356
|
-
See [`admina.yaml.example`](admina.yaml.example) for all options including domains, AI infra, plugins, dashboard, forensic storage, alert channels, and integrations.
|
|
347
|
+
See [`admina.yaml.example`](https://github.com/admina-org/admina/blob/main/admina.yaml.example) for all options including domains, AI infra, plugins, dashboard, forensic storage, alert channels, and integrations.
|
|
357
348
|
|
|
358
349
|
<a id="compliance-scope"></a>
|
|
359
350
|
|
|
@@ -376,7 +367,7 @@ See [`admina.yaml.example`](admina.yaml.example) for all options including domai
|
|
|
376
367
|
> 2027** (postponed from 2 Aug 2026); Annex I high-risk from 2 August
|
|
377
368
|
> 2028 (postponed from 2 Aug 2027). The full machine-readable timeline
|
|
378
369
|
> ships with Admina as `admina.domains.compliance.eu_ai_act.EU_AI_ACT_DEADLINES`.
|
|
379
|
-
> See [`MODEL_CARD.md`](MODEL_CARD.md) for the full scope, limitations,
|
|
370
|
+
> See [`MODEL_CARD.md`](https://github.com/admina-org/admina/blob/main/MODEL_CARD.md) for the full scope, limitations,
|
|
380
371
|
> and known failure modes of every Admina component.
|
|
381
372
|
|
|
382
373
|
</details>
|
|
@@ -478,7 +469,7 @@ crew = Crew(agents=[agent], tasks=[task], task_callback=admina_task_callback)
|
|
|
478
469
|
|
|
479
470
|
</details>
|
|
480
471
|
|
|
481
|
-
See [full integration docs](docs/guides/integrations.md) for details.
|
|
472
|
+
See [full integration docs](https://github.com/admina-org/admina/blob/main/docs/guides/integrations.md) for details.
|
|
482
473
|
|
|
483
474
|
## Performance — Hybrid Python + Rust engine
|
|
484
475
|
|
|
@@ -487,7 +478,7 @@ The Rust core engine is an optional accelerator. The default
|
|
|
487
478
|
enable the Rust engine with the opt-in extra `pip install
|
|
488
479
|
"admina-framework[rust]"` (or build from source for local development —
|
|
489
480
|
`maturin develop --release --manifest-path core-rust/Cargo.toml`, see
|
|
490
|
-
[CONTRIBUTING.md](CONTRIBUTING.md)). At runtime Admina auto-detects
|
|
481
|
+
[CONTRIBUTING.md](https://github.com/admina-org/admina/blob/main/CONTRIBUTING.md)). At runtime Admina auto-detects
|
|
491
482
|
whichever is available and falls back transparently to Python if the Rust
|
|
492
483
|
extension is not installed.
|
|
493
484
|
|
|
@@ -558,7 +549,6 @@ The full stack (`docker compose up`) runs 9 containers:
|
|
|
558
549
|
| `8080` | Proxy | MCP proxy + REST API + OpenAPI docs |
|
|
559
550
|
| `3000` | Dashboard | Real-time governance web UI |
|
|
560
551
|
| `3001` | Grafana | Metrics dashboards |
|
|
561
|
-
| `9090` | MinIO Console | Forensic storage browser |
|
|
562
552
|
| `4317` | OTEL Collector | OTLP gRPC ingestion |
|
|
563
553
|
|
|
564
554
|
ClickHouse and Redis are internal only (not exposed to host).
|
|
@@ -569,45 +559,20 @@ ClickHouse and Redis are internal only (not exposed to host).
|
|
|
569
559
|
<br>
|
|
570
560
|
|
|
571
561
|
The forensic blackbox (the SHA-256 hash chain that makes the audit trail
|
|
572
|
-
tamper-evident) supports
|
|
562
|
+
tamper-evident) supports three backends. Read this before picking one for
|
|
573
563
|
production.
|
|
574
564
|
|
|
575
565
|
| Backend | License | When to use | Caveats |
|
|
576
566
|
|---------|---------|-------------|---------|
|
|
577
567
|
| **`memory`** *(default)* | n/a | Local development, tests, demos | Records are LOST on restart — no audit persistence. Loud warning at startup. |
|
|
578
568
|
| **`filesystem`** | n/a | Single-host on-prem, air-gapped, smaller deployments | Persistence depends on the host filesystem; not ideal for HA. Requires `FORENSIC_BASE_DIR`. |
|
|
579
|
-
| **`s3`** *(boto3)* | Apache 2.0 (boto3) | Production / HA / multi-region | Works with **any S3-compatible service** — AWS S3, Cloudflare R2, Backblaze B2, **SeaweedFS** (Apache 2.0), **Garage** (AGPLv3), **Ceph RGW** (LGPLv2).
|
|
580
|
-
| **`minio`** *(legacy)* | see below ⚠️ | Backwards compatibility with existing MinIO clusters | Two distinct concerns; read the disclaimer. |
|
|
569
|
+
| **`s3`** *(boto3)* | Apache 2.0 (boto3) | Production / HA / multi-region | Works with **any S3-compatible service** — AWS S3, **MinIO** servers, Cloudflare R2, Backblaze B2, **SeaweedFS** (Apache 2.0), **Garage** (AGPLv3), **Ceph RGW** (LGPLv2). Supports WORM Object Lock. |
|
|
581
570
|
|
|
582
|
-
>
|
|
583
|
-
>
|
|
584
|
-
>
|
|
585
|
-
>
|
|
586
|
-
>
|
|
587
|
-
> 1. **MinIO Server is AGPLv3.** If you deploy MinIO Server as part of a
|
|
588
|
-
> network-accessible service (e.g. a SaaS that exposes Admina's
|
|
589
|
-
> dashboard or API to the public Internet), AGPLv3's network clause
|
|
590
|
-
> can be read to require you to publish the source code of the
|
|
591
|
-
> *combined* application that interacts with MinIO over the network.
|
|
592
|
-
> The MinIO commercial license removes this obligation, but is paid.
|
|
593
|
-
> This is **not** an Admina obligation — Apache 2.0 is permissive —
|
|
594
|
-
> but it is an obligation MinIO Server itself imposes on whoever
|
|
595
|
-
> runs it.
|
|
596
|
-
> 2. **The MinIO Python SDK has been archived.** No more security
|
|
597
|
-
> patches, no support for new Python releases. Continuing to depend
|
|
598
|
-
> on it is a supply-chain risk.
|
|
599
|
-
>
|
|
600
|
-
> **Recommendation:** for new deployments, use `FORENSIC_BACKEND=s3`.
|
|
601
|
-
> The `boto3` client is Apache 2.0 and works against any S3-compatible
|
|
602
|
-
> service. Two open-source FOSS-friendly options that don't trigger the
|
|
603
|
-
> AGPL network clause for typical Admina deployments:
|
|
604
|
-
> - **SeaweedFS** (Apache 2.0, S3 gateway, lightweight, single binary)
|
|
605
|
-
> - **Garage** (AGPLv3, but as a backend — Garage's AGPL applies to
|
|
606
|
-
> Garage itself, not to applications that connect to it via S3 API)
|
|
607
|
-
>
|
|
608
|
-
> Existing MinIO deployments keep working through `FORENSIC_BACKEND=minio`,
|
|
609
|
-
> but plan a migration. The `minio` backend will be removed in a future
|
|
610
|
-
> release.
|
|
571
|
+
> **Using MinIO?** Point the `s3` backend at your MinIO server via
|
|
572
|
+
> `FORENSIC_S3_ENDPOINT` — MinIO speaks the S3 API, so no MinIO-specific
|
|
573
|
+
> client is needed. The legacy `minio`-SDK backend was removed in 0.9.5
|
|
574
|
+
> (the MinIO Python SDK is archived); `FORENSIC_BACKEND=minio` now
|
|
575
|
+
> transparently routes to the `s3` backend with a migration warning.
|
|
611
576
|
|
|
612
577
|
</details>
|
|
613
578
|
|
|
@@ -621,7 +586,7 @@ production.
|
|
|
621
586
|
| `ADMINA_API_KEY` | *(empty)* | API key for all endpoints |
|
|
622
587
|
| `UPSTREAM_MCP_URL` | `http://localhost:9000` | Default upstream MCP server |
|
|
623
588
|
| `REDIS_URL` | `redis://localhost:6379/0` | Session state + rate limiting |
|
|
624
|
-
| `
|
|
589
|
+
| `FORENSIC_BACKEND` | `memory` | Forensic store: `memory` \| `filesystem` \| `s3` |
|
|
625
590
|
| `LOG_LEVEL` | `INFO` | Logging verbosity |
|
|
626
591
|
|
|
627
592
|
</details>
|
|
@@ -646,7 +611,7 @@ admina/
|
|
|
646
611
|
| +-- domains/ GuardrailsAI
|
|
647
612
|
| +-- compliance/ EU AI Act template
|
|
648
613
|
| +-- transports/ MCP, HTTP REST
|
|
649
|
-
| +-- forensic/
|
|
614
|
+
| +-- forensic/ Filesystem
|
|
650
615
|
| +-- auth/ API Key
|
|
651
616
|
| +-- pii/ spaCy + Regex
|
|
652
617
|
| +-- alerts/ Log, Webhook
|
|
@@ -705,12 +670,12 @@ curl http://localhost:8080/api/dashboard/score
|
|
|
705
670
|
|
|
706
671
|
## Project documents
|
|
707
672
|
|
|
708
|
-
- [CONTRIBUTING.md](CONTRIBUTING.md) — development setup, testing, and pull request workflow
|
|
709
|
-
- [MODEL_CARD.md](MODEL_CARD.md) — transparency artifact for every Admina governance component (intended use, scope, limitations, known failure modes), aligned with EU AI Act Art. 13 and NIST AI RMF
|
|
710
|
-
- [ROADMAP.md](ROADMAP.md) — planned milestones from 0.9.x to 1.0 and beyond
|
|
711
|
-
- [CHANGELOG.md](CHANGELOG.md) — release notes
|
|
712
|
-
- [SECURITY.md](SECURITY.md) — coordinated disclosure policy
|
|
713
|
-
- [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md) — Contributor Covenant 2.1
|
|
673
|
+
- [CONTRIBUTING.md](https://github.com/admina-org/admina/blob/main/CONTRIBUTING.md) — development setup, testing, and pull request workflow
|
|
674
|
+
- [MODEL_CARD.md](https://github.com/admina-org/admina/blob/main/MODEL_CARD.md) — transparency artifact for every Admina governance component (intended use, scope, limitations, known failure modes), aligned with EU AI Act Art. 13 and NIST AI RMF
|
|
675
|
+
- [ROADMAP.md](https://github.com/admina-org/admina/blob/main/ROADMAP.md) — planned milestones from 0.9.x to 1.0 and beyond
|
|
676
|
+
- [CHANGELOG.md](https://github.com/admina-org/admina/blob/main/CHANGELOG.md) — release notes
|
|
677
|
+
- [SECURITY.md](https://github.com/admina-org/admina/blob/main/SECURITY.md) — coordinated disclosure policy
|
|
678
|
+
- [CODE_OF_CONDUCT.md](https://github.com/admina-org/admina/blob/main/CODE_OF_CONDUCT.md) — Contributor Covenant 2.1
|
|
714
679
|
- **Browse the AI-generated wiki** → [deepwiki.com/admina-org/admina](https://deepwiki.com/admina-org/admina)
|
|
715
680
|
|
|
716
681
|
Admina is Apache 2.0. Contributions are welcome.
|
|
@@ -719,7 +684,7 @@ Admina is Apache 2.0. Contributions are welcome.
|
|
|
719
684
|
|
|
720
685
|
Copyright © 2025–2026 [Stefano Noferi](https://github.com/stefanoferi) & Admina contributors
|
|
721
686
|
|
|
722
|
-
Licensed under the Apache License, Version 2.0. See [LICENSE](LICENSE) for the full text.
|
|
687
|
+
Licensed under the Apache License, Version 2.0. See [LICENSE](https://github.com/admina-org/admina/blob/main/LICENSE) for the full text.
|
|
723
688
|
|
|
724
689
|
---
|
|
725
690
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<!--
|
|
2
2
|
<p align="center">
|
|
3
|
-
<img src="resources/banner.png" alt="Admina — Governed AI by Default" width="100%">
|
|
3
|
+
<img src="https://raw.githubusercontent.com/admina-org/admina/main/resources/banner.png" alt="Admina — Governed AI by Default" width="100%">
|
|
4
4
|
</p>
|
|
5
5
|
-->
|
|
6
6
|
|
|
@@ -11,9 +11,9 @@
|
|
|
11
11
|
|
|
12
12
|
<p align="center">
|
|
13
13
|
<a href="https://pypi.org/project/admina-framework/"><img src="https://img.shields.io/pypi/v/admina-framework?style=flat-square&color=32CD32" alt="PyPI version"></a>
|
|
14
|
-
<a href="LICENSE"><img src="https://img.shields.io/badge/license-Apache--2.0-32CD32?style=flat-square" alt="License"></a>
|
|
14
|
+
<a href="https://github.com/admina-org/admina/blob/main/LICENSE"><img src="https://img.shields.io/badge/license-Apache--2.0-32CD32?style=flat-square" alt="License"></a>
|
|
15
15
|
<img src="https://img.shields.io/badge/python-3.11%2B-32CD32?style=flat-square&logo=python&logoColor=white" alt="Python 3.11+">
|
|
16
|
-
<img src="https://img.shields.io/
|
|
16
|
+
<img src="https://img.shields.io/github/last-commit/admina-org/admina?style=flat-square" alt="Last commit">
|
|
17
17
|
</p>
|
|
18
18
|
|
|
19
19
|
<p align="center">
|
|
@@ -25,7 +25,6 @@
|
|
|
25
25
|
|
|
26
26
|
<p align="center">
|
|
27
27
|
<a href="https://deepwiki.com/admina-org/admina"><img src="https://deepwiki.com/badge.svg" alt="Ask DeepWiki"></a>
|
|
28
|
-
<a href="https://github.com/admina-org/admina/discussions"><img src="https://img.shields.io/github/discussions/admina-org/admina?style=flat-square&logo=github" alt="Discussions"></a>
|
|
29
28
|
<a href="https://admina.org/docs"><img src="https://img.shields.io/badge/docs-admina.org-blue?style=flat-square" alt="Docs"></a>
|
|
30
29
|
</p>
|
|
31
30
|
|
|
@@ -36,13 +35,6 @@
|
|
|
36
35
|
<a href="https://deepwiki.com/admina-org/admina"><img src="https://img.shields.io/badge/🤖%20Ask%20DeepWiki-AI%20wiki-7C3AED?style=for-the-badge" alt="DeepWiki" height="40"></a>
|
|
37
36
|
</p>
|
|
38
37
|
|
|
39
|
-
<p align="center">
|
|
40
|
-
<a href="https://github.com/admina-org/admina/stargazers"><img src="https://img.shields.io/github/stars/admina-org/admina?style=social" alt="Stars"></a>
|
|
41
|
-
<a href="https://github.com/admina-org/admina/network/members"><img src="https://img.shields.io/github/forks/admina-org/admina?style=social" alt="Forks"></a>
|
|
42
|
-
<a href="https://github.com/admina-org/admina/graphs/contributors"><img src="https://img.shields.io/github/contributors/admina-org/admina?style=flat-square&label=contributors" alt="Contributors"></a>
|
|
43
|
-
<img src="https://img.shields.io/github/last-commit/admina-org/admina?style=flat-square" alt="Last commit">
|
|
44
|
-
</p>
|
|
45
|
-
|
|
46
38
|
---
|
|
47
39
|
|
|
48
40
|
## See it in action
|
|
@@ -50,13 +42,13 @@
|
|
|
50
42
|
**Scaffold a project and boot the governed proxy + dashboard — no Docker:**
|
|
51
43
|
|
|
52
44
|
<p align="center">
|
|
53
|
-
<img src="resources/admina-init-dev.gif" alt="admina init → admina dev → Ready on localhost:3000" width="900">
|
|
45
|
+
<img src="https://raw.githubusercontent.com/admina-org/admina/main/resources/admina-init-dev.gif" alt="admina init → admina dev → Ready on localhost:3000" width="900">
|
|
54
46
|
</p>
|
|
55
47
|
|
|
56
48
|
**Wrap any model in a few lines — PII is stripped before the model ever sees it:**
|
|
57
49
|
|
|
58
50
|
<p align="center">
|
|
59
|
-
<img src="resources/sdk-3lines.gif" alt="GovernedModel redacts PERSON, EMAIL and credit card before the LLM call" width="900">
|
|
51
|
+
<img src="https://raw.githubusercontent.com/admina-org/admina/main/resources/sdk-3lines.gif" alt="GovernedModel redacts PERSON, EMAIL and credit card before the LLM call" width="900">
|
|
60
52
|
</p>
|
|
61
53
|
|
|
62
54
|
**The governance dashboard, before and after simulated traffic — Admina Score 40 → 60:**
|
|
@@ -64,11 +56,11 @@
|
|
|
64
56
|
<table>
|
|
65
57
|
<tr>
|
|
66
58
|
<td align="center" width="50%">
|
|
67
|
-
<img src="resources/dashboard-firstuser.png" alt="Dashboard at first boot — score 40/100" width="100%"><br>
|
|
59
|
+
<img src="https://raw.githubusercontent.com/admina-org/admina/main/resources/dashboard-firstuser.png" alt="Dashboard at first boot — score 40/100" width="100%"><br>
|
|
68
60
|
<em>First boot — Admina Score <strong>40/100</strong></em>
|
|
69
61
|
</td>
|
|
70
62
|
<td align="center" width="50%">
|
|
71
|
-
<img src="resources/dashboard-traffic.png" alt="Dashboard after simulated traffic — score 60/100" width="100%"><br>
|
|
63
|
+
<img src="https://raw.githubusercontent.com/admina-org/admina/main/resources/dashboard-traffic.png" alt="Dashboard after simulated traffic — score 60/100" width="100%"><br>
|
|
72
64
|
<em>After <code>python scripts/simulate.py</code> — <strong>60/100</strong></em>
|
|
73
65
|
</td>
|
|
74
66
|
</tr>
|
|
@@ -246,7 +238,7 @@ from admina import GovernedModel, GovernedData, GovernedAgent, ComplianceKit
|
|
|
246
238
|
| Governance Domain | GuardrailsAI (toxic, jailbreak, bias, PII) |
|
|
247
239
|
| Compliance Template | EU AI Act |
|
|
248
240
|
| Transport Adapter | MCP, HTTP REST |
|
|
249
|
-
| Forensic Store | Filesystem, S3-compatible (boto3
|
|
241
|
+
| Forensic Store | Filesystem, S3-compatible (boto3 — AWS S3, MinIO, R2, …) |
|
|
250
242
|
| Auth Provider | API Key |
|
|
251
243
|
| PII Engine | spaCy + Regex |
|
|
252
244
|
| Alert Channel | Log, Webhook |
|
|
@@ -262,7 +254,7 @@ admina plugin create my-domain # Scaffold a new plugin
|
|
|
262
254
|
```bash
|
|
263
255
|
admina init my-project # Scaffold project with admina.yaml + docker-compose.yml
|
|
264
256
|
admina dev # Local mode: proxy + dashboard on :3000 (no Docker)
|
|
265
|
-
admina dev --stack # Docker stack: + redis + clickhouse +
|
|
257
|
+
admina dev --stack # Docker stack: + redis + clickhouse + grafana
|
|
266
258
|
admina dev --with-llm # --stack + ollama + chromadb + open-webui
|
|
267
259
|
admina plugin list # List all registered plugins
|
|
268
260
|
admina plugin install X # Install a plugin from path or registry
|
|
@@ -281,7 +273,7 @@ Real-time governance dashboard on port 3000:
|
|
|
281
273
|
- **Governance Score** — 0-100 composite metric (data residency, audit coverage, attack rate, forensic integrity, EU AI Act compliance)
|
|
282
274
|
- **Live Feed** — streaming governance events via WebSocket
|
|
283
275
|
- **Compliance Gaps** — EU AI Act gap analysis with article-level detail
|
|
284
|
-
- **Infrastructure Health** — proxy, Redis,
|
|
276
|
+
- **Infrastructure Health** — proxy, Redis, forensic store, ClickHouse, OTEL status
|
|
285
277
|
|
|
286
278
|
API backend: `GET /api/dashboard/score`, `/feed`, `/compliance`, `/sovereignty`, `/infra`, `/models`
|
|
287
279
|
|
|
@@ -293,7 +285,7 @@ Admina uses `admina.yaml` as the primary config file (with `.env` fallback for b
|
|
|
293
285
|
cp admina.yaml.example admina.yaml # Copy and customize
|
|
294
286
|
```
|
|
295
287
|
|
|
296
|
-
See [`admina.yaml.example`](admina.yaml.example) for all options including domains, AI infra, plugins, dashboard, forensic storage, alert channels, and integrations.
|
|
288
|
+
See [`admina.yaml.example`](https://github.com/admina-org/admina/blob/main/admina.yaml.example) for all options including domains, AI infra, plugins, dashboard, forensic storage, alert channels, and integrations.
|
|
297
289
|
|
|
298
290
|
<a id="compliance-scope"></a>
|
|
299
291
|
|
|
@@ -316,7 +308,7 @@ See [`admina.yaml.example`](admina.yaml.example) for all options including domai
|
|
|
316
308
|
> 2027** (postponed from 2 Aug 2026); Annex I high-risk from 2 August
|
|
317
309
|
> 2028 (postponed from 2 Aug 2027). The full machine-readable timeline
|
|
318
310
|
> ships with Admina as `admina.domains.compliance.eu_ai_act.EU_AI_ACT_DEADLINES`.
|
|
319
|
-
> See [`MODEL_CARD.md`](MODEL_CARD.md) for the full scope, limitations,
|
|
311
|
+
> See [`MODEL_CARD.md`](https://github.com/admina-org/admina/blob/main/MODEL_CARD.md) for the full scope, limitations,
|
|
320
312
|
> and known failure modes of every Admina component.
|
|
321
313
|
|
|
322
314
|
</details>
|
|
@@ -418,7 +410,7 @@ crew = Crew(agents=[agent], tasks=[task], task_callback=admina_task_callback)
|
|
|
418
410
|
|
|
419
411
|
</details>
|
|
420
412
|
|
|
421
|
-
See [full integration docs](docs/guides/integrations.md) for details.
|
|
413
|
+
See [full integration docs](https://github.com/admina-org/admina/blob/main/docs/guides/integrations.md) for details.
|
|
422
414
|
|
|
423
415
|
## Performance — Hybrid Python + Rust engine
|
|
424
416
|
|
|
@@ -427,7 +419,7 @@ The Rust core engine is an optional accelerator. The default
|
|
|
427
419
|
enable the Rust engine with the opt-in extra `pip install
|
|
428
420
|
"admina-framework[rust]"` (or build from source for local development —
|
|
429
421
|
`maturin develop --release --manifest-path core-rust/Cargo.toml`, see
|
|
430
|
-
[CONTRIBUTING.md](CONTRIBUTING.md)). At runtime Admina auto-detects
|
|
422
|
+
[CONTRIBUTING.md](https://github.com/admina-org/admina/blob/main/CONTRIBUTING.md)). At runtime Admina auto-detects
|
|
431
423
|
whichever is available and falls back transparently to Python if the Rust
|
|
432
424
|
extension is not installed.
|
|
433
425
|
|
|
@@ -498,7 +490,6 @@ The full stack (`docker compose up`) runs 9 containers:
|
|
|
498
490
|
| `8080` | Proxy | MCP proxy + REST API + OpenAPI docs |
|
|
499
491
|
| `3000` | Dashboard | Real-time governance web UI |
|
|
500
492
|
| `3001` | Grafana | Metrics dashboards |
|
|
501
|
-
| `9090` | MinIO Console | Forensic storage browser |
|
|
502
493
|
| `4317` | OTEL Collector | OTLP gRPC ingestion |
|
|
503
494
|
|
|
504
495
|
ClickHouse and Redis are internal only (not exposed to host).
|
|
@@ -509,45 +500,20 @@ ClickHouse and Redis are internal only (not exposed to host).
|
|
|
509
500
|
<br>
|
|
510
501
|
|
|
511
502
|
The forensic blackbox (the SHA-256 hash chain that makes the audit trail
|
|
512
|
-
tamper-evident) supports
|
|
503
|
+
tamper-evident) supports three backends. Read this before picking one for
|
|
513
504
|
production.
|
|
514
505
|
|
|
515
506
|
| Backend | License | When to use | Caveats |
|
|
516
507
|
|---------|---------|-------------|---------|
|
|
517
508
|
| **`memory`** *(default)* | n/a | Local development, tests, demos | Records are LOST on restart — no audit persistence. Loud warning at startup. |
|
|
518
509
|
| **`filesystem`** | n/a | Single-host on-prem, air-gapped, smaller deployments | Persistence depends on the host filesystem; not ideal for HA. Requires `FORENSIC_BASE_DIR`. |
|
|
519
|
-
| **`s3`** *(boto3)* | Apache 2.0 (boto3) | Production / HA / multi-region | Works with **any S3-compatible service** — AWS S3, Cloudflare R2, Backblaze B2, **SeaweedFS** (Apache 2.0), **Garage** (AGPLv3), **Ceph RGW** (LGPLv2).
|
|
520
|
-
| **`minio`** *(legacy)* | see below ⚠️ | Backwards compatibility with existing MinIO clusters | Two distinct concerns; read the disclaimer. |
|
|
510
|
+
| **`s3`** *(boto3)* | Apache 2.0 (boto3) | Production / HA / multi-region | Works with **any S3-compatible service** — AWS S3, **MinIO** servers, Cloudflare R2, Backblaze B2, **SeaweedFS** (Apache 2.0), **Garage** (AGPLv3), **Ceph RGW** (LGPLv2). Supports WORM Object Lock. |
|
|
521
511
|
|
|
522
|
-
>
|
|
523
|
-
>
|
|
524
|
-
>
|
|
525
|
-
>
|
|
526
|
-
>
|
|
527
|
-
> 1. **MinIO Server is AGPLv3.** If you deploy MinIO Server as part of a
|
|
528
|
-
> network-accessible service (e.g. a SaaS that exposes Admina's
|
|
529
|
-
> dashboard or API to the public Internet), AGPLv3's network clause
|
|
530
|
-
> can be read to require you to publish the source code of the
|
|
531
|
-
> *combined* application that interacts with MinIO over the network.
|
|
532
|
-
> The MinIO commercial license removes this obligation, but is paid.
|
|
533
|
-
> This is **not** an Admina obligation — Apache 2.0 is permissive —
|
|
534
|
-
> but it is an obligation MinIO Server itself imposes on whoever
|
|
535
|
-
> runs it.
|
|
536
|
-
> 2. **The MinIO Python SDK has been archived.** No more security
|
|
537
|
-
> patches, no support for new Python releases. Continuing to depend
|
|
538
|
-
> on it is a supply-chain risk.
|
|
539
|
-
>
|
|
540
|
-
> **Recommendation:** for new deployments, use `FORENSIC_BACKEND=s3`.
|
|
541
|
-
> The `boto3` client is Apache 2.0 and works against any S3-compatible
|
|
542
|
-
> service. Two open-source FOSS-friendly options that don't trigger the
|
|
543
|
-
> AGPL network clause for typical Admina deployments:
|
|
544
|
-
> - **SeaweedFS** (Apache 2.0, S3 gateway, lightweight, single binary)
|
|
545
|
-
> - **Garage** (AGPLv3, but as a backend — Garage's AGPL applies to
|
|
546
|
-
> Garage itself, not to applications that connect to it via S3 API)
|
|
547
|
-
>
|
|
548
|
-
> Existing MinIO deployments keep working through `FORENSIC_BACKEND=minio`,
|
|
549
|
-
> but plan a migration. The `minio` backend will be removed in a future
|
|
550
|
-
> release.
|
|
512
|
+
> **Using MinIO?** Point the `s3` backend at your MinIO server via
|
|
513
|
+
> `FORENSIC_S3_ENDPOINT` — MinIO speaks the S3 API, so no MinIO-specific
|
|
514
|
+
> client is needed. The legacy `minio`-SDK backend was removed in 0.9.5
|
|
515
|
+
> (the MinIO Python SDK is archived); `FORENSIC_BACKEND=minio` now
|
|
516
|
+
> transparently routes to the `s3` backend with a migration warning.
|
|
551
517
|
|
|
552
518
|
</details>
|
|
553
519
|
|
|
@@ -561,7 +527,7 @@ production.
|
|
|
561
527
|
| `ADMINA_API_KEY` | *(empty)* | API key for all endpoints |
|
|
562
528
|
| `UPSTREAM_MCP_URL` | `http://localhost:9000` | Default upstream MCP server |
|
|
563
529
|
| `REDIS_URL` | `redis://localhost:6379/0` | Session state + rate limiting |
|
|
564
|
-
| `
|
|
530
|
+
| `FORENSIC_BACKEND` | `memory` | Forensic store: `memory` \| `filesystem` \| `s3` |
|
|
565
531
|
| `LOG_LEVEL` | `INFO` | Logging verbosity |
|
|
566
532
|
|
|
567
533
|
</details>
|
|
@@ -586,7 +552,7 @@ admina/
|
|
|
586
552
|
| +-- domains/ GuardrailsAI
|
|
587
553
|
| +-- compliance/ EU AI Act template
|
|
588
554
|
| +-- transports/ MCP, HTTP REST
|
|
589
|
-
| +-- forensic/
|
|
555
|
+
| +-- forensic/ Filesystem
|
|
590
556
|
| +-- auth/ API Key
|
|
591
557
|
| +-- pii/ spaCy + Regex
|
|
592
558
|
| +-- alerts/ Log, Webhook
|
|
@@ -645,12 +611,12 @@ curl http://localhost:8080/api/dashboard/score
|
|
|
645
611
|
|
|
646
612
|
## Project documents
|
|
647
613
|
|
|
648
|
-
- [CONTRIBUTING.md](CONTRIBUTING.md) — development setup, testing, and pull request workflow
|
|
649
|
-
- [MODEL_CARD.md](MODEL_CARD.md) — transparency artifact for every Admina governance component (intended use, scope, limitations, known failure modes), aligned with EU AI Act Art. 13 and NIST AI RMF
|
|
650
|
-
- [ROADMAP.md](ROADMAP.md) — planned milestones from 0.9.x to 1.0 and beyond
|
|
651
|
-
- [CHANGELOG.md](CHANGELOG.md) — release notes
|
|
652
|
-
- [SECURITY.md](SECURITY.md) — coordinated disclosure policy
|
|
653
|
-
- [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md) — Contributor Covenant 2.1
|
|
614
|
+
- [CONTRIBUTING.md](https://github.com/admina-org/admina/blob/main/CONTRIBUTING.md) — development setup, testing, and pull request workflow
|
|
615
|
+
- [MODEL_CARD.md](https://github.com/admina-org/admina/blob/main/MODEL_CARD.md) — transparency artifact for every Admina governance component (intended use, scope, limitations, known failure modes), aligned with EU AI Act Art. 13 and NIST AI RMF
|
|
616
|
+
- [ROADMAP.md](https://github.com/admina-org/admina/blob/main/ROADMAP.md) — planned milestones from 0.9.x to 1.0 and beyond
|
|
617
|
+
- [CHANGELOG.md](https://github.com/admina-org/admina/blob/main/CHANGELOG.md) — release notes
|
|
618
|
+
- [SECURITY.md](https://github.com/admina-org/admina/blob/main/SECURITY.md) — coordinated disclosure policy
|
|
619
|
+
- [CODE_OF_CONDUCT.md](https://github.com/admina-org/admina/blob/main/CODE_OF_CONDUCT.md) — Contributor Covenant 2.1
|
|
654
620
|
- **Browse the AI-generated wiki** → [deepwiki.com/admina-org/admina](https://deepwiki.com/admina-org/admina)
|
|
655
621
|
|
|
656
622
|
Admina is Apache 2.0. Contributions are welcome.
|
|
@@ -659,7 +625,7 @@ Admina is Apache 2.0. Contributions are welcome.
|
|
|
659
625
|
|
|
660
626
|
Copyright © 2025–2026 [Stefano Noferi](https://github.com/stefanoferi) & Admina contributors
|
|
661
627
|
|
|
662
|
-
Licensed under the Apache License, Version 2.0. See [LICENSE](LICENSE) for the full text.
|
|
628
|
+
Licensed under the Apache License, Version 2.0. See [LICENSE](https://github.com/admina-org/admina/blob/main/LICENSE) for the full text.
|
|
663
629
|
|
|
664
630
|
---
|
|
665
631
|
|
|
@@ -74,7 +74,7 @@ def _bootstrap_secrets(project_dir: Path, *, force: bool = False) -> dict[str, s
|
|
|
74
74
|
click.echo()
|
|
75
75
|
click.echo(f" API Key: {generated['ADMINA_API_KEY']}")
|
|
76
76
|
click.echo(f" Password: {generated['ADMINA_DASHBOARD_PASSWORD']}")
|
|
77
|
-
click.echo(" (dashboard, Grafana,
|
|
77
|
+
click.echo(" (dashboard, Grafana, ClickHouse)")
|
|
78
78
|
click.echo()
|
|
79
79
|
click.echo(" Save these now — they will NOT be shown again.")
|
|
80
80
|
click.echo(" View: admina password show")
|
|
@@ -298,7 +298,7 @@ def _format_next_steps(project_name: str) -> str:
|
|
|
298
298
|
if docker_ok:
|
|
299
299
|
lines.append(
|
|
300
300
|
" admina dev --stack # full Docker stack "
|
|
301
|
-
"(proxy + redis + clickhouse +
|
|
301
|
+
"(proxy + redis + clickhouse + grafana)"
|
|
302
302
|
)
|
|
303
303
|
else:
|
|
304
304
|
lines.extend(
|
|
@@ -592,7 +592,6 @@ def _run_local(
|
|
|
592
592
|
env.setdefault("OTEL_ENDPOINT", "")
|
|
593
593
|
env.setdefault("REDIS_URL", "")
|
|
594
594
|
env.setdefault("CLICKHOUSE_HOST", "")
|
|
595
|
-
env.setdefault("MINIO_ENDPOINT", "")
|
|
596
595
|
env.setdefault("UPSTREAM_MCP_URL", "")
|
|
597
596
|
env.setdefault("LOG_LEVEL", "INFO")
|
|
598
597
|
|
|
@@ -751,7 +750,7 @@ def _run_compose(
|
|
|
751
750
|
"--stack",
|
|
752
751
|
is_flag=True,
|
|
753
752
|
default=False,
|
|
754
|
-
help="Run the full Docker stack (proxy + dashboard + redis + clickhouse +
|
|
753
|
+
help="Run the full Docker stack (proxy + dashboard + redis + clickhouse + otel + grafana).",
|
|
755
754
|
)
|
|
756
755
|
@click.option(
|
|
757
756
|
"--with-llm",
|
|
@@ -801,7 +800,7 @@ def dev(
|
|
|
801
800
|
admina dev Local mode (default): one uvicorn process,
|
|
802
801
|
dashboard served on the same port. No Docker.
|
|
803
802
|
admina dev --stack Docker compose: proxy + dashboard + redis +
|
|
804
|
-
clickhouse +
|
|
803
|
+
clickhouse + otel + grafana.
|
|
805
804
|
admina dev --with-llm --stack plus local LLM services
|
|
806
805
|
(ollama + chromadb + open-webui).
|
|
807
806
|
|
|
@@ -1125,7 +1124,7 @@ def doctor() -> None:
|
|
|
1125
1124
|
("httpx", "httpx"),
|
|
1126
1125
|
("pydantic", "pydantic"),
|
|
1127
1126
|
("redis", "redis"),
|
|
1128
|
-
("
|
|
1127
|
+
("boto3", "boto3"),
|
|
1129
1128
|
("clickhouse_connect", "clickhouse-connect"),
|
|
1130
1129
|
("numpy", "numpy"),
|
|
1131
1130
|
("sklearn", "scikit-learn"),
|
|
@@ -1366,7 +1365,7 @@ def password_show() -> None:
|
|
|
1366
1365
|
click.echo()
|
|
1367
1366
|
click.echo(f" API Key: {data.get('ADMINA_API_KEY', '(not set)')}")
|
|
1368
1367
|
click.echo(f" Password: {data.get('ADMINA_DASHBOARD_PASSWORD', '(not set)')}")
|
|
1369
|
-
click.echo(" (shared across dashboard, Grafana,
|
|
1368
|
+
click.echo(" (shared across dashboard, Grafana, ClickHouse)")
|
|
1370
1369
|
click.echo()
|
|
1371
1370
|
|
|
1372
1371
|
|
|
@@ -56,7 +56,7 @@ domains:
|
|
|
56
56
|
enabled: {{ domains.compliance | lower }}
|
|
57
57
|
{% if domains.compliance %}
|
|
58
58
|
forensic:
|
|
59
|
-
storage:
|
|
59
|
+
storage: filesystem
|
|
60
60
|
bucket: forensic-blackbox
|
|
61
61
|
eu_ai_act:
|
|
62
62
|
enabled: true
|
|
@@ -68,7 +68,7 @@ dashboard:
|
|
|
68
68
|
enabled: true
|
|
69
69
|
port: 3000
|
|
70
70
|
|
|
71
|
-
forensic_store:
|
|
71
|
+
forensic_store: filesystem
|
|
72
72
|
auth_provider: apikey
|
|
73
73
|
pii_engine: spacy-regex
|
|
74
74
|
alert_channels:
|
{admina_framework-0.9.4 → admina_framework-0.9.5}/admina/cli/templates/docker-compose.yml.j2
RENAMED
|
@@ -20,8 +20,8 @@ services:
|
|
|
20
20
|
- CLICKHOUSE_HOST=clickhouse
|
|
21
21
|
- CLICKHOUSE_PORT=8123
|
|
22
22
|
- CLICKHOUSE_DB=admina
|
|
23
|
-
-
|
|
24
|
-
-
|
|
23
|
+
- FORENSIC_BACKEND=filesystem
|
|
24
|
+
- FORENSIC_BASE_DIR=/app/.admina/forensic
|
|
25
25
|
- OTEL_ENDPOINT=http://otel-collector:4317
|
|
26
26
|
- LOG_LEVEL=INFO
|
|
27
27
|
depends_on:
|
|
@@ -29,8 +29,6 @@ services:
|
|
|
29
29
|
condition: service_healthy
|
|
30
30
|
clickhouse:
|
|
31
31
|
condition: service_healthy
|
|
32
|
-
minio:
|
|
33
|
-
condition: service_healthy
|
|
34
32
|
healthcheck:
|
|
35
33
|
test: ["CMD", "curl", "-f", "http://localhost:8080/health"]
|
|
36
34
|
interval: 10s
|
|
@@ -79,28 +77,6 @@ services:
|
|
|
79
77
|
- admina
|
|
80
78
|
{% endif %}
|
|
81
79
|
|
|
82
|
-
# ── Storage: MinIO (Forensic Black Box) ─────────────────
|
|
83
|
-
{% if domains.compliance %}
|
|
84
|
-
minio:
|
|
85
|
-
image: minio/minio:RELEASE.2024-11-07T00-52-20Z
|
|
86
|
-
container_name: {{ project_name }}-minio
|
|
87
|
-
command: server /data --console-address ":9090"
|
|
88
|
-
ports:
|
|
89
|
-
- "127.0.0.1:9090:9090"
|
|
90
|
-
environment:
|
|
91
|
-
- MINIO_ROOT_USER=${MINIO_ACCESS_KEY:-admina}
|
|
92
|
-
- MINIO_ROOT_PASSWORD=${MINIO_SECRET_KEY:-changeme}
|
|
93
|
-
volumes:
|
|
94
|
-
- minio-data:/data
|
|
95
|
-
healthcheck:
|
|
96
|
-
test: ["CMD", "mc", "ready", "local"]
|
|
97
|
-
interval: 5s
|
|
98
|
-
timeout: 3s
|
|
99
|
-
retries: 10
|
|
100
|
-
networks:
|
|
101
|
-
- admina
|
|
102
|
-
{% endif %}
|
|
103
|
-
|
|
104
80
|
# ── AI Infra: Ollama LLM ──────────────────────────────────
|
|
105
81
|
{% if with_llm | default(true) and domains.ai_infra and ai_infra_llm_enabled | default(true) %}
|
|
106
82
|
ollama:
|
|
@@ -243,7 +219,6 @@ volumes:
|
|
|
243
219
|
{% endif %}
|
|
244
220
|
{% if domains.compliance %}
|
|
245
221
|
clickhouse-data:
|
|
246
|
-
minio-data:
|
|
247
222
|
grafana-data:
|
|
248
223
|
{% elif not ((domains.ai_infra and ai_infra_llm_enabled | default(true)) or (domains.ai_infra and ai_infra_rag_enabled | default(true)) or (domains.ai_infra and ai_infra_webui_enabled | default(true))) %}
|
|
249
224
|
{}
|