admina-framework 0.9.3__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.3/admina_framework.egg-info → admina_framework-0.9.5}/PKG-INFO +272 -153
- {admina_framework-0.9.3 → admina_framework-0.9.5}/README.md +269 -151
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina/__init__.py +1 -1
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina/cli/main.py +6 -7
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina/cli/templates/admina.yaml.j2 +2 -2
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina/cli/templates/docker-compose.yml.j2 +2 -27
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina/cli/templates/env.j2 +0 -2
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina/core/config.py +5 -15
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina/core/secrets.py +0 -4
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina/dashboard/static/index.html +0 -4
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina/domains/compliance/__init__.py +3 -3
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina/domains/compliance/forensic.py +109 -82
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina/plugins/base.py +4 -2
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina/proxy/api/dashboard.py +9 -21
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina/proxy/api/integration.py +1 -1
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina/proxy/config.py +14 -22
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina/proxy/engine_bridge.py +5 -60
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina/proxy/main.py +5 -25
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina/proxy/state.py +0 -2
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina/sdk/governed_model.py +3 -1
- {admina_framework-0.9.3 → admina_framework-0.9.5/admina_framework.egg-info}/PKG-INFO +272 -153
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina_framework.egg-info/SOURCES.txt +2 -1
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina_framework.egg-info/requires.txt +3 -1
- {admina_framework-0.9.3 → admina_framework-0.9.5}/pyproject.toml +46 -7
- {admina_framework-0.9.3 → admina_framework-0.9.5}/tests/test_benchmark_14us.py +9 -0
- {admina_framework-0.9.3 → admina_framework-0.9.5}/tests/test_core_config.py +1 -1
- {admina_framework-0.9.3 → admina_framework-0.9.5}/tests/test_domains.py +3 -26
- admina_framework-0.9.5/tests/test_firewall_parity.py +176 -0
- admina_framework-0.9.5/tests/test_forensic_blackbox.py +266 -0
- {admina_framework-0.9.3 → admina_framework-0.9.5}/tests/test_proxy_security.py +0 -9
- admina_framework-0.9.3/admina/plugins/builtin/forensic/minio.py +0 -180
- {admina_framework-0.9.3 → admina_framework-0.9.5}/LICENSE +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.5}/NOTICE +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina/cli/__init__.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina/cli/commands/__init__.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina/cli/templates/main.py.j2 +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina/cli/templates/plugin.py.j2 +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina/cli/templates/plugin_pyproject.toml.j2 +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina/cli/templates/plugin_readme.md.j2 +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina/cli/templates/plugin_test.py.j2 +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina/core/__init__.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina/core/event_bus.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina/core/types.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina/dashboard/__init__.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina/dashboard/static/heimdall.png +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina/dashboard/static/vendor/alpinejs.min.js +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina/domains/__init__.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina/domains/agent_security/__init__.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina/domains/agent_security/firewall.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina/domains/agent_security/loop_breaker.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina/domains/ai_infra/__init__.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina/domains/ai_infra/llm_engine.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina/domains/ai_infra/rag.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina/domains/ai_infra/webui.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina/domains/compliance/cross_regulation.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina/domains/compliance/eu_ai_act.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina/domains/compliance/gdpr.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina/domains/compliance/nis2.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina/domains/compliance/oisg.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina/domains/compliance/otel.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina/domains/data_sovereignty/__init__.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina/domains/data_sovereignty/classification.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina/domains/data_sovereignty/pii.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina/domains/data_sovereignty/residency.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina/integrations/__init__.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina/integrations/_engines.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina/integrations/cheshirecat/__init__.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina/integrations/cheshirecat/admina-plugin/admina_governance.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina/integrations/crewai/__init__.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina/integrations/crewai/callbacks.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina/integrations/langchain/__init__.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina/integrations/langchain/callbacks.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina/integrations/n8n/__init__.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina/integrations/openclaw/__init__.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina/plugins/__init__.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina/plugins/builtin/__init__.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina/plugins/builtin/adapters/__init__.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina/plugins/builtin/adapters/ollama.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina/plugins/builtin/adapters/openai.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina/plugins/builtin/alerts/__init__.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina/plugins/builtin/alerts/log.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina/plugins/builtin/alerts/webhook.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina/plugins/builtin/auth/__init__.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina/plugins/builtin/auth/apikey.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina/plugins/builtin/compliance/__init__.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina/plugins/builtin/compliance/eu_ai_act.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina/plugins/builtin/connectors/__init__.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina/plugins/builtin/connectors/chromadb.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina/plugins/builtin/connectors/filesystem.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina/plugins/builtin/forensic/__init__.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina/plugins/builtin/forensic/filesystem.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina/plugins/builtin/guards/__init__.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina/plugins/builtin/guards/guardrailsai_guard.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina/plugins/builtin/pii/__init__.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina/plugins/builtin/pii/spacy_regex.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina/plugins/builtin/transports/__init__.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina/plugins/builtin/transports/http_rest.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina/plugins/builtin/transports/mcp.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina/plugins/registry.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina/proxy/__init__.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina/proxy/api/__init__.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina/proxy/governance.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina/proxy/multi_upstream.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina/py.typed +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina/sdk/__init__.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina/sdk/_compat.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina/sdk/compliance_kit.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina/sdk/governed_agent.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina/sdk/governed_data.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina_framework.egg-info/dependency_links.txt +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina_framework.egg-info/entry_points.txt +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.5}/admina_framework.egg-info/top_level.txt +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.5}/setup.cfg +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.5}/tests/test_governance_pipeline.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.5}/tests/test_mcp_transport.py +0 -0
- {admina_framework-0.9.3 → 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"
|
|
@@ -52,43 +51,101 @@ Requires-Dist: opentelemetry-api<2,>=1.20; extra == "telemetry"
|
|
|
52
51
|
Requires-Dist: opentelemetry-sdk<2,>=1.20; extra == "telemetry"
|
|
53
52
|
Requires-Dist: opentelemetry-exporter-otlp-proto-grpc<2,>=1.20; extra == "telemetry"
|
|
54
53
|
Requires-Dist: opentelemetry-instrumentation-fastapi<1,>=0.40b0; extra == "telemetry"
|
|
54
|
+
Provides-Extra: rust
|
|
55
|
+
Requires-Dist: admina-core<0.10,>=0.9.3; extra == "rust"
|
|
55
56
|
Provides-Extra: full
|
|
56
57
|
Requires-Dist: admina-framework[nlp,proxy,telemetry]; extra == "full"
|
|
57
58
|
Dynamic: license-file
|
|
58
59
|
|
|
59
|
-
|
|
60
|
+
<!--
|
|
61
|
+
<p align="center">
|
|
62
|
+
<img src="https://raw.githubusercontent.com/admina-org/admina/main/resources/banner.png" alt="Admina — Governed AI by Default" width="100%">
|
|
63
|
+
</p>
|
|
64
|
+
-->
|
|
60
65
|
|
|
61
|
-
|
|
66
|
+
<p align="center">
|
|
67
|
+
<strong>Install once, get governed AI.</strong><br>
|
|
68
|
+
<em>PII redacted · Injections blocked · Loops broken · Actions audited · EU AI Act tracked</em>
|
|
69
|
+
</p>
|
|
62
70
|
|
|
63
|
-
|
|
71
|
+
<p align="center">
|
|
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>
|
|
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>
|
|
74
|
+
<img src="https://img.shields.io/badge/python-3.11%2B-32CD32?style=flat-square&logo=python&logoColor=white" alt="Python 3.11+">
|
|
75
|
+
<img src="https://img.shields.io/github/last-commit/admina-org/admina?style=flat-square" alt="Last commit">
|
|
76
|
+
</p>
|
|
64
77
|
|
|
65
|
-
>
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
>
|
|
71
|
-
|
|
72
|
-
>
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
>
|
|
76
|
-
|
|
77
|
-
>
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
78
|
+
<p align="center">
|
|
79
|
+
<a href="https://github.com/admina-org/admina/actions/workflows/ci.yml"><img src="https://img.shields.io/github/actions/workflow/status/admina-org/admina/ci.yml?style=flat-square&label=CI&logo=githubactions&logoColor=white" alt="CI"></a>
|
|
80
|
+
<a href="https://github.com/admina-org/admina/actions/workflows/release.yml"><img src="https://img.shields.io/github/actions/workflow/status/admina-org/admina/release.yml?style=flat-square&label=release" alt="Release"></a>
|
|
81
|
+
<a href="https://github.com/admina-org/admina/actions/workflows/security.yml"><img src="https://img.shields.io/github/actions/workflow/status/admina-org/admina/security.yml?style=flat-square&label=security%20scan&logo=shield&logoColor=white" alt="Security scan"></a>
|
|
82
|
+
<a href="https://pypi.org/project/admina-framework/"><img src="https://img.shields.io/pypi/dm/admina-framework?style=flat-square&label=downloads" alt="PyPI downloads"></a>
|
|
83
|
+
</p>
|
|
84
|
+
|
|
85
|
+
<p align="center">
|
|
86
|
+
<a href="https://deepwiki.com/admina-org/admina"><img src="https://deepwiki.com/badge.svg" alt="Ask DeepWiki"></a>
|
|
87
|
+
<a href="https://admina.org/docs"><img src="https://img.shields.io/badge/docs-admina.org-blue?style=flat-square" alt="Docs"></a>
|
|
88
|
+
</p>
|
|
89
|
+
|
|
90
|
+
<p align="center">
|
|
91
|
+
<a href="#quick-start"><img src="https://img.shields.io/badge/⚡%20Quick%20Start-2%20min-32CD32?style=for-the-badge" alt="Quick Start" height="40"></a>
|
|
92
|
+
<a href="#see-it-in-action"><img src="https://img.shields.io/badge/▶%20Live%20Demo-Dashboard-3B82F6?style=for-the-badge" alt="Live Demo" height="40"></a>
|
|
93
|
+
<a href="https://admina.org/docs"><img src="https://img.shields.io/badge/📖%20Read%20the%20Docs-admina.org-6C757D?style=for-the-badge" alt="Docs" height="40"></a>
|
|
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>
|
|
95
|
+
</p>
|
|
96
|
+
|
|
97
|
+
---
|
|
98
|
+
|
|
99
|
+
## See it in action
|
|
100
|
+
|
|
101
|
+
**Scaffold a project and boot the governed proxy + dashboard — no Docker:**
|
|
102
|
+
|
|
103
|
+
<p align="center">
|
|
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">
|
|
105
|
+
</p>
|
|
106
|
+
|
|
107
|
+
**Wrap any model in a few lines — PII is stripped before the model ever sees it:**
|
|
108
|
+
|
|
109
|
+
<p align="center">
|
|
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">
|
|
111
|
+
</p>
|
|
112
|
+
|
|
113
|
+
**The governance dashboard, before and after simulated traffic — Admina Score 40 → 60:**
|
|
114
|
+
|
|
115
|
+
<table>
|
|
116
|
+
<tr>
|
|
117
|
+
<td align="center" width="50%">
|
|
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>
|
|
119
|
+
<em>First boot — Admina Score <strong>40/100</strong></em>
|
|
120
|
+
</td>
|
|
121
|
+
<td align="center" width="50%">
|
|
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>
|
|
123
|
+
<em>After <code>python scripts/simulate.py</code> — <strong>60/100</strong></em>
|
|
124
|
+
</td>
|
|
125
|
+
</tr>
|
|
126
|
+
</table>
|
|
127
|
+
|
|
128
|
+
---
|
|
129
|
+
|
|
130
|
+
## Why Admina?
|
|
131
|
+
|
|
132
|
+
| | Plain LLM / RAG app | **With Admina** |
|
|
133
|
+
| :----------------------------- | :----------------------------------- | :----------------------------------------------------------------------- |
|
|
134
|
+
| PII in prompts/responses | leaks unless you build redaction | **Redacted by default** — email, SSN, IBAN, phone, IP, names |
|
|
135
|
+
| Prompt injections | reach the model | **Blocked at the proxy** — 15 regex + Rust heuristic scoring |
|
|
136
|
+
| Agent tool calls | unaudited | **Validated pre-action + logged post-action** (forensic chain) |
|
|
137
|
+
| Loop / runaway agents | burn tokens / budget | **Broken** — TF-IDF cosine similarity over the action stream |
|
|
138
|
+
| EU AI Act readiness | manual | **Gap analysis + risk classification** built-in |
|
|
139
|
+
| Audit trail | logs you hope nobody deletes | **SHA-256 hash chain** — tamper-evident by design |
|
|
140
|
+
| Adding governance to existing code | rewrite the call sites | **Zero code changes** via proxy, or 3 lines via SDK |
|
|
141
|
+
| Performance overhead | unknown | **~6 µs per pipeline** (Rust engine), in-process or networked |
|
|
142
|
+
| License | varies | **Apache 2.0**, open core |
|
|
143
|
+
|
|
144
|
+
> Admina is **decision-support and defense-in-depth**, not legal advice. See [Compliance scope](#compliance-scope) for the full disclaimer and limitations.
|
|
82
145
|
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
[](https://python.org)
|
|
87
|
-
[](core-rust/)
|
|
88
|
-
[](https://github.com/admina-org/admina/actions/workflows/ci.yml)
|
|
89
|
-
[](https://admina.org/docs)
|
|
90
|
-
[](CHANGELOG.md)
|
|
91
|
-
[](CONTRIBUTING.md#supported-platforms)
|
|
146
|
+
---
|
|
147
|
+
|
|
148
|
+
## 30-second example
|
|
92
149
|
|
|
93
150
|
```python
|
|
94
151
|
from admina import GovernedModel, GovernedData, GovernedAgent, ComplianceKit
|
|
@@ -130,7 +187,8 @@ pip install "admina-framework[full]"
|
|
|
130
187
|
python -m spacy download en_core_web_sm # for [full] only
|
|
131
188
|
|
|
132
189
|
# Optional: Rust-accelerated engine (auto-detected at runtime).
|
|
133
|
-
|
|
190
|
+
# Opt-in extra — pulls in the admina-core wheel from PyPI.
|
|
191
|
+
pip install "admina-framework[rust]"
|
|
134
192
|
|
|
135
193
|
# Advanced: SDK only (no proxy, no dashboard, no `admina dev`).
|
|
136
194
|
# Use this when embedding the SDK into another service and you don't
|
|
@@ -142,10 +200,17 @@ pip install admina-framework
|
|
|
142
200
|
> name is `admina` (e.g. `from admina import GovernedModel`). This is
|
|
143
201
|
> a normal Python pattern — same as `python-dateutil` → `import dateutil`.
|
|
144
202
|
|
|
145
|
-
> The Rust engine is an optional accelerator.
|
|
146
|
-
> ships only the pure-Python implementation;
|
|
147
|
-
>
|
|
148
|
-
> if it's
|
|
203
|
+
> The Rust engine is an **optional, opt-in** accelerator. The default
|
|
204
|
+
> `pip install admina-framework` ships only the pure-Python implementation;
|
|
205
|
+
> `admina-framework[rust]` adds the `admina-core` wheel, which Admina
|
|
206
|
+
> auto-detects at runtime (falling back to pure Python if it's absent).
|
|
207
|
+
>
|
|
208
|
+
> The default is pure Python on purpose: the Python injection firewall
|
|
209
|
+
> currently has **broader detection coverage** than the Rust one (it adds
|
|
210
|
+
> obfuscation-normalisation — homoglyph, leetspeak, base64, ROT13 — and a
|
|
211
|
+
> wider multilingual pattern set). Enable `[rust]` when per-request latency
|
|
212
|
+
> matters more than that extra coverage. See
|
|
213
|
+
> [Performance](#performance--hybrid-python--rust-engine) for the trade-off.
|
|
149
214
|
|
|
150
215
|
### Or install from source
|
|
151
216
|
|
|
@@ -180,28 +245,21 @@ Dashboard: [http://localhost:3000](http://localhost:3000) | API docs: [http://lo
|
|
|
180
245
|
|
|
181
246
|
## Architecture
|
|
182
247
|
|
|
183
|
-
Admina
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
```
|
|
195
|
-
SDK Mode: Proxy Mode:
|
|
196
|
-
your code AI Agent
|
|
197
|
-
| |
|
|
198
|
-
GovernedModel.ask() POST /mcp
|
|
199
|
-
| |
|
|
200
|
-
[governance pipeline] [governance pipeline]
|
|
201
|
-
| |
|
|
202
|
-
Ollama / OpenAI MCP Server / LLM
|
|
248
|
+
Admina runs in **dual mode** — in-process via SDK or networked via proxy — but both modes feed the **same governance pipeline**.
|
|
249
|
+
|
|
250
|
+
```mermaid
|
|
251
|
+
flowchart LR
|
|
252
|
+
A1["your code → GovernedModel.ask()"] --> P
|
|
253
|
+
A2["AI agent → POST /mcp"] --> P
|
|
254
|
+
P["governance pipeline"]
|
|
255
|
+
P --> U1["Ollama / OpenAI"]
|
|
256
|
+
P --> U2["MCP server / LLM"]
|
|
257
|
+
classDef pipe fill:#0ea5e9,stroke:#0369a1,color:#fff;
|
|
258
|
+
class P pipe;
|
|
203
259
|
```
|
|
204
260
|
|
|
261
|
+
Pipeline (identical in both modes): `PII redaction → firewall → loop-breaker → audit → forensic chain (SHA-256) → OTEL`
|
|
262
|
+
|
|
205
263
|
## The 4 Governance Domains
|
|
206
264
|
|
|
207
265
|
| Domain | Capabilities | Engine |
|
|
@@ -239,7 +297,7 @@ from admina import GovernedModel, GovernedData, GovernedAgent, ComplianceKit
|
|
|
239
297
|
| Governance Domain | GuardrailsAI (toxic, jailbreak, bias, PII) |
|
|
240
298
|
| Compliance Template | EU AI Act |
|
|
241
299
|
| Transport Adapter | MCP, HTTP REST |
|
|
242
|
-
| Forensic Store | Filesystem, S3-compatible (boto3
|
|
300
|
+
| Forensic Store | Filesystem, S3-compatible (boto3 — AWS S3, MinIO, R2, …) |
|
|
243
301
|
| Auth Provider | API Key |
|
|
244
302
|
| PII Engine | spaCy + Regex |
|
|
245
303
|
| Alert Channel | Log, Webhook |
|
|
@@ -255,7 +313,7 @@ admina plugin create my-domain # Scaffold a new plugin
|
|
|
255
313
|
```bash
|
|
256
314
|
admina init my-project # Scaffold project with admina.yaml + docker-compose.yml
|
|
257
315
|
admina dev # Local mode: proxy + dashboard on :3000 (no Docker)
|
|
258
|
-
admina dev --stack # Docker stack: + redis + clickhouse +
|
|
316
|
+
admina dev --stack # Docker stack: + redis + clickhouse + grafana
|
|
259
317
|
admina dev --with-llm # --stack + ollama + chromadb + open-webui
|
|
260
318
|
admina plugin list # List all registered plugins
|
|
261
319
|
admina plugin install X # Install a plugin from path or registry
|
|
@@ -267,49 +325,6 @@ dependency: one uvicorn serves the proxy API and the dashboard SPA on the
|
|
|
267
325
|
same port. Use `--stack` for the production-like Docker compose, or
|
|
268
326
|
`--with-llm` to also boot local LLM services.
|
|
269
327
|
|
|
270
|
-
## Forensic backend — choose deliberately
|
|
271
|
-
|
|
272
|
-
The forensic blackbox (the SHA-256 hash chain that makes the audit trail
|
|
273
|
-
tamper-evident) supports four backends. Read this before picking one for
|
|
274
|
-
production.
|
|
275
|
-
|
|
276
|
-
| Backend | License | When to use | Caveats |
|
|
277
|
-
|---------|---------|-------------|---------|
|
|
278
|
-
| **`memory`** *(default)* | n/a | Local development, tests, demos | Records are LOST on restart — no audit persistence. Loud warning at startup. |
|
|
279
|
-
| **`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`. |
|
|
280
|
-
| **`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). Recommended new default. |
|
|
281
|
-
| **`minio`** *(legacy)* | see below ⚠️ | Backwards compatibility with existing MinIO clusters | Two distinct concerns; read the disclaimer. |
|
|
282
|
-
|
|
283
|
-
> ⚠️ **MinIO disclaimer — what users of Admina need to know.**
|
|
284
|
-
>
|
|
285
|
-
> MinIO has two separate licensing/maintenance issues that can affect
|
|
286
|
-
> downstream users of Admina, even though Admina itself is Apache 2.0:
|
|
287
|
-
>
|
|
288
|
-
> 1. **MinIO Server is AGPLv3.** If you deploy MinIO Server as part of a
|
|
289
|
-
> network-accessible service (e.g. a SaaS that exposes Admina's
|
|
290
|
-
> dashboard or API to the public Internet), AGPLv3's network clause
|
|
291
|
-
> can be read to require you to publish the source code of the
|
|
292
|
-
> *combined* application that interacts with MinIO over the network.
|
|
293
|
-
> The MinIO commercial license removes this obligation, but is paid.
|
|
294
|
-
> This is **not** an Admina obligation — Apache 2.0 is permissive —
|
|
295
|
-
> but it is an obligation MinIO Server itself imposes on whoever
|
|
296
|
-
> runs it.
|
|
297
|
-
> 2. **The MinIO Python SDK has been archived.** No more security
|
|
298
|
-
> patches, no support for new Python releases. Continuing to depend
|
|
299
|
-
> on it is a supply-chain risk.
|
|
300
|
-
>
|
|
301
|
-
> **Recommendation:** for new deployments, use `FORENSIC_BACKEND=s3`.
|
|
302
|
-
> The `boto3` client is Apache 2.0 and works against any S3-compatible
|
|
303
|
-
> service. Two open-source FOSS-friendly options that don't trigger the
|
|
304
|
-
> AGPL network clause for typical Admina deployments:
|
|
305
|
-
> - **SeaweedFS** (Apache 2.0, S3 gateway, lightweight, single binary)
|
|
306
|
-
> - **Garage** (AGPLv3, but as a backend — Garage's AGPL applies to
|
|
307
|
-
> Garage itself, not to applications that connect to it via S3 API)
|
|
308
|
-
>
|
|
309
|
-
> Existing MinIO deployments keep working through `FORENSIC_BACKEND=minio`,
|
|
310
|
-
> but plan a migration. The `minio` backend will be removed in a future
|
|
311
|
-
> release.
|
|
312
|
-
|
|
313
328
|
## Dashboard
|
|
314
329
|
|
|
315
330
|
Real-time governance dashboard on port 3000:
|
|
@@ -317,7 +332,7 @@ Real-time governance dashboard on port 3000:
|
|
|
317
332
|
- **Governance Score** — 0-100 composite metric (data residency, audit coverage, attack rate, forensic integrity, EU AI Act compliance)
|
|
318
333
|
- **Live Feed** — streaming governance events via WebSocket
|
|
319
334
|
- **Compliance Gaps** — EU AI Act gap analysis with article-level detail
|
|
320
|
-
- **Infrastructure Health** — proxy, Redis,
|
|
335
|
+
- **Infrastructure Health** — proxy, Redis, forensic store, ClickHouse, OTEL status
|
|
321
336
|
|
|
322
337
|
API backend: `GET /api/dashboard/score`, `/feed`, `/compliance`, `/sovereignty`, `/infra`, `/models`
|
|
323
338
|
|
|
@@ -329,21 +344,40 @@ Admina uses `admina.yaml` as the primary config file (with `.env` fallback for b
|
|
|
329
344
|
cp admina.yaml.example admina.yaml # Copy and customize
|
|
330
345
|
```
|
|
331
346
|
|
|
332
|
-
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.
|
|
333
348
|
|
|
334
|
-
|
|
349
|
+
<a id="compliance-scope"></a>
|
|
335
350
|
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
351
|
+
<details open>
|
|
352
|
+
<summary><strong>⚖️ Compliance scope & legal disclaimer</strong> — what Admina does and does not do legally</summary>
|
|
353
|
+
|
|
354
|
+
<br>
|
|
355
|
+
|
|
356
|
+
> Admina is a self-assessment and defense-in-depth tool. The EU AI Act
|
|
357
|
+
> gap-analysis and risk classification features are **decision-support
|
|
358
|
+
> aids, not legal advice**. They do not replace the conformity assessment
|
|
359
|
+
> required under EU AI Act Art. 43 for high-risk systems, nor the
|
|
360
|
+
> involvement of a notified body where the regulation requires one.
|
|
361
|
+
>
|
|
362
|
+
> **EU AI Act timeline (after the Omnibus VII agreement of 7 May 2026):**
|
|
363
|
+
> Art. 5 prohibitions in force since 2 February 2025; GPAI obligations
|
|
364
|
+
> in force since 2 August 2025; Art. 50 transparency for synthetic
|
|
365
|
+
> content and the new NCII / synthetic-CSAM prohibition apply from
|
|
366
|
+
> 2 December 2026; **Annex III high-risk obligations from 2 December
|
|
367
|
+
> 2027** (postponed from 2 Aug 2026); Annex I high-risk from 2 August
|
|
368
|
+
> 2028 (postponed from 2 Aug 2027). The full machine-readable timeline
|
|
369
|
+
> ships with Admina as `admina.domains.compliance.eu_ai_act.EU_AI_ACT_DEADLINES`.
|
|
370
|
+
> See [`MODEL_CARD.md`](https://github.com/admina-org/admina/blob/main/MODEL_CARD.md) for the full scope, limitations,
|
|
371
|
+
> and known failure modes of every Admina component.
|
|
372
|
+
|
|
373
|
+
</details>
|
|
343
374
|
|
|
344
375
|
## Integrations
|
|
345
376
|
|
|
346
|
-
|
|
377
|
+
<details>
|
|
378
|
+
<summary><strong>GuardrailsAI</strong> — ML-based content validation as a governance plugin</summary>
|
|
379
|
+
|
|
380
|
+
<br>
|
|
347
381
|
|
|
348
382
|
ML-based content validation (toxic language, jailbreak, bias, PII via Presidio) as a governance domain plugin:
|
|
349
383
|
|
|
@@ -357,7 +391,12 @@ pip install <your-guardrails-ai-wheel>
|
|
|
357
391
|
|
|
358
392
|
Enable in `admina.yaml` under `agent_security.domains.guardrailsai`. All inference runs locally by default — no data leaves the deployment perimeter.
|
|
359
393
|
|
|
360
|
-
|
|
394
|
+
</details>
|
|
395
|
+
|
|
396
|
+
<details>
|
|
397
|
+
<summary><strong>OpenClaw</strong> — govern OpenClaw agent actions via pre/post-action hooks</summary>
|
|
398
|
+
|
|
399
|
+
<br>
|
|
361
400
|
|
|
362
401
|
Govern OpenClaw agent actions through the Admina proxy. Every tool call, shell command, and API request is validated before execution:
|
|
363
402
|
|
|
@@ -368,9 +407,12 @@ chmod +x setup.sh && ./setup.sh
|
|
|
368
407
|
|
|
369
408
|
The skill uses `POST /api/v1/validate` (pre-action) and `POST /api/v1/audit` (post-action) endpoints.
|
|
370
409
|
|
|
371
|
-
|
|
410
|
+
</details>
|
|
372
411
|
|
|
373
|
-
|
|
412
|
+
<details>
|
|
413
|
+
<summary><strong>n8n</strong> — community nodes for n8n workflow automation</summary>
|
|
414
|
+
|
|
415
|
+
<br>
|
|
374
416
|
|
|
375
417
|
| Node | Purpose |
|
|
376
418
|
|------|---------|
|
|
@@ -380,9 +422,14 @@ Community nodes for n8n workflow automation:
|
|
|
380
422
|
|
|
381
423
|
Install: `npm install n8n-nodes-admina` in your n8n instance.
|
|
382
424
|
|
|
383
|
-
|
|
425
|
+
</details>
|
|
384
426
|
|
|
385
|
-
|
|
427
|
+
<details>
|
|
428
|
+
<summary><strong>Cheshire Cat AI</strong> — govern all Cheshire Cat interactions via Python hooks</summary>
|
|
429
|
+
|
|
430
|
+
<br>
|
|
431
|
+
|
|
432
|
+
Three Python hooks (`agent_fast_reply`, `before_cat_sends_message`, `before_cat_recalls_memories`):
|
|
386
433
|
|
|
387
434
|
```bash
|
|
388
435
|
cd integrations/cheshirecat/admina-plugin
|
|
@@ -390,9 +437,14 @@ cd integrations/cheshirecat/admina-plugin
|
|
|
390
437
|
# Copy plugin into Cheshire Cat plugins/ directory
|
|
391
438
|
```
|
|
392
439
|
|
|
393
|
-
|
|
440
|
+
</details>
|
|
441
|
+
|
|
442
|
+
<details>
|
|
443
|
+
<summary><strong>LangChain</strong> — drop-in callback handler</summary>
|
|
444
|
+
|
|
445
|
+
<br>
|
|
394
446
|
|
|
395
|
-
|
|
447
|
+
Governs every LLM call and tool invocation in-process:
|
|
396
448
|
|
|
397
449
|
```python
|
|
398
450
|
from admina.integrations.langchain.callbacks import AdminaCallbackHandler
|
|
@@ -401,9 +453,12 @@ handler = AdminaCallbackHandler()
|
|
|
401
453
|
llm = ChatOpenAI(callbacks=[handler])
|
|
402
454
|
```
|
|
403
455
|
|
|
404
|
-
|
|
456
|
+
</details>
|
|
457
|
+
|
|
458
|
+
<details>
|
|
459
|
+
<summary><strong>CrewAI</strong> — step and task callbacks for multi-agent governance</summary>
|
|
405
460
|
|
|
406
|
-
|
|
461
|
+
<br>
|
|
407
462
|
|
|
408
463
|
```python
|
|
409
464
|
from admina.integrations.crewai.callbacks import admina_step_callback, admina_task_callback
|
|
@@ -412,16 +467,32 @@ agent = Agent(role="Researcher", step_callback=admina_step_callback)
|
|
|
412
467
|
crew = Crew(agents=[agent], tasks=[task], task_callback=admina_task_callback)
|
|
413
468
|
```
|
|
414
469
|
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
## Hybrid Python + Rust Engine
|
|
470
|
+
</details>
|
|
418
471
|
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
472
|
+
See [full integration docs](https://github.com/admina-org/admina/blob/main/docs/guides/integrations.md) for details.
|
|
473
|
+
|
|
474
|
+
## Performance — Hybrid Python + Rust engine
|
|
475
|
+
|
|
476
|
+
The Rust core engine is an optional accelerator. The default
|
|
477
|
+
`pip install admina-framework` ships only the pure-Python implementation;
|
|
478
|
+
enable the Rust engine with the opt-in extra `pip install
|
|
479
|
+
"admina-framework[rust]"` (or build from source for local development —
|
|
480
|
+
`maturin develop --release --manifest-path core-rust/Cargo.toml`, see
|
|
481
|
+
[CONTRIBUTING.md](https://github.com/admina-org/admina/blob/main/CONTRIBUTING.md)). At runtime Admina auto-detects
|
|
482
|
+
whichever is available and falls back transparently to Python if the Rust
|
|
483
|
+
extension is not installed.
|
|
484
|
+
|
|
485
|
+
> **Detection trade-off (why Rust is opt-in, not the default).** The Rust
|
|
486
|
+
> firewall is faster but currently detects a narrower set of attacks than
|
|
487
|
+
> the pure-Python firewall. The Python engine normalises common evasions
|
|
488
|
+
> before matching (homoglyph, leetspeak, char-by-char hyphenation, base64,
|
|
489
|
+
> ROT13) and carries a wider multilingual pattern set; the Rust engine does
|
|
490
|
+
> not yet. On an internal 14-attack evasion corpus the Python firewall
|
|
491
|
+
> blocks all 14 while the Rust firewall blocks 7 (the plain-text and
|
|
492
|
+
> multilingual-keyword attacks), with no false positives on either side.
|
|
493
|
+
> Full Rust↔Python detection parity is tracked for 0.10. Until then, keep
|
|
494
|
+
> the default (pure Python) when detection breadth matters; opt into
|
|
495
|
+
> `[rust]` when latency dominates.
|
|
425
496
|
|
|
426
497
|
Measured numbers below assume the Rust engine is loaded:
|
|
427
498
|
|
|
@@ -469,7 +540,61 @@ python scripts/simulate.py --duration 300 --rate 10
|
|
|
469
540
|
|
|
470
541
|
Generates a weighted mix of: clean MCP requests, injection attempts, PII content, loop triggers, REST validate/audit calls, EU AI Act classifications, and dashboard reads. Colored terminal output with per-event action and summary counters.
|
|
471
542
|
|
|
472
|
-
##
|
|
543
|
+
## Infrastructure & Services
|
|
544
|
+
|
|
545
|
+
The full stack (`docker compose up`) runs 9 containers:
|
|
546
|
+
|
|
547
|
+
| Port | Service | Description |
|
|
548
|
+
|------|---------|-------------|
|
|
549
|
+
| `8080` | Proxy | MCP proxy + REST API + OpenAPI docs |
|
|
550
|
+
| `3000` | Dashboard | Real-time governance web UI |
|
|
551
|
+
| `3001` | Grafana | Metrics dashboards |
|
|
552
|
+
| `4317` | OTEL Collector | OTLP gRPC ingestion |
|
|
553
|
+
|
|
554
|
+
ClickHouse and Redis are internal only (not exposed to host).
|
|
555
|
+
|
|
556
|
+
<details>
|
|
557
|
+
<summary><strong>🗄️ Forensic backends (4 options) — choose deliberately</strong></summary>
|
|
558
|
+
|
|
559
|
+
<br>
|
|
560
|
+
|
|
561
|
+
The forensic blackbox (the SHA-256 hash chain that makes the audit trail
|
|
562
|
+
tamper-evident) supports three backends. Read this before picking one for
|
|
563
|
+
production.
|
|
564
|
+
|
|
565
|
+
| Backend | License | When to use | Caveats |
|
|
566
|
+
|---------|---------|-------------|---------|
|
|
567
|
+
| **`memory`** *(default)* | n/a | Local development, tests, demos | Records are LOST on restart — no audit persistence. Loud warning at startup. |
|
|
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`. |
|
|
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. |
|
|
570
|
+
|
|
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.
|
|
576
|
+
|
|
577
|
+
</details>
|
|
578
|
+
|
|
579
|
+
<details>
|
|
580
|
+
<summary><strong>⚙️ Environment variables (Docker / .env)</strong></summary>
|
|
581
|
+
|
|
582
|
+
<br>
|
|
583
|
+
|
|
584
|
+
| Variable | Default | Description |
|
|
585
|
+
|----------|---------|-------------|
|
|
586
|
+
| `ADMINA_API_KEY` | *(empty)* | API key for all endpoints |
|
|
587
|
+
| `UPSTREAM_MCP_URL` | `http://localhost:9000` | Default upstream MCP server |
|
|
588
|
+
| `REDIS_URL` | `redis://localhost:6379/0` | Session state + rate limiting |
|
|
589
|
+
| `FORENSIC_BACKEND` | `memory` | Forensic store: `memory` \| `filesystem` \| `s3` |
|
|
590
|
+
| `LOG_LEVEL` | `INFO` | Logging verbosity |
|
|
591
|
+
|
|
592
|
+
</details>
|
|
593
|
+
|
|
594
|
+
<details>
|
|
595
|
+
<summary><strong>📁 Full project structure</strong></summary>
|
|
596
|
+
|
|
597
|
+
<br>
|
|
473
598
|
|
|
474
599
|
```
|
|
475
600
|
admina/
|
|
@@ -486,7 +611,7 @@ admina/
|
|
|
486
611
|
| +-- domains/ GuardrailsAI
|
|
487
612
|
| +-- compliance/ EU AI Act template
|
|
488
613
|
| +-- transports/ MCP, HTTP REST
|
|
489
|
-
| +-- forensic/
|
|
614
|
+
| +-- forensic/ Filesystem
|
|
490
615
|
| +-- auth/ API Key
|
|
491
616
|
| +-- pii/ spaCy + Regex
|
|
492
617
|
| +-- alerts/ Log, Webhook
|
|
@@ -503,7 +628,12 @@ admina/
|
|
|
503
628
|
+-- docker-compose.yml Full stack deployment (9 containers)
|
|
504
629
|
```
|
|
505
630
|
|
|
506
|
-
|
|
631
|
+
</details>
|
|
632
|
+
|
|
633
|
+
<details>
|
|
634
|
+
<summary><strong>🔌 API examples (curl)</strong></summary>
|
|
635
|
+
|
|
636
|
+
<br>
|
|
507
637
|
|
|
508
638
|
```bash
|
|
509
639
|
# Health check (always public)
|
|
@@ -536,28 +666,17 @@ curl -X POST http://localhost:8080/api/compliance/classify \
|
|
|
536
666
|
curl http://localhost:8080/api/dashboard/score
|
|
537
667
|
```
|
|
538
668
|
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
The full stack (`docker compose up`) runs 9 containers:
|
|
542
|
-
|
|
543
|
-
| Port | Service | Description |
|
|
544
|
-
|------|---------|-------------|
|
|
545
|
-
| `8080` | Proxy | MCP proxy + REST API + OpenAPI docs |
|
|
546
|
-
| `3000` | Dashboard | Real-time governance web UI |
|
|
547
|
-
| `3001` | Grafana | Metrics dashboards |
|
|
548
|
-
| `9090` | MinIO Console | Forensic storage browser |
|
|
549
|
-
| `4317` | OTEL Collector | OTLP gRPC ingestion |
|
|
550
|
-
|
|
551
|
-
ClickHouse and Redis are internal only (not exposed to host).
|
|
669
|
+
</details>
|
|
552
670
|
|
|
553
671
|
## Project documents
|
|
554
672
|
|
|
555
|
-
- [CONTRIBUTING.md](CONTRIBUTING.md) — development setup, testing, and pull request workflow
|
|
556
|
-
- [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
|
|
557
|
-
- [ROADMAP.md](ROADMAP.md) — planned milestones from 0.9.x to 1.0 and beyond
|
|
558
|
-
- [CHANGELOG.md](CHANGELOG.md) — release notes
|
|
559
|
-
- [SECURITY.md](SECURITY.md) — coordinated disclosure policy
|
|
560
|
-
- [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
|
|
679
|
+
- **Browse the AI-generated wiki** → [deepwiki.com/admina-org/admina](https://deepwiki.com/admina-org/admina)
|
|
561
680
|
|
|
562
681
|
Admina is Apache 2.0. Contributions are welcome.
|
|
563
682
|
|
|
@@ -565,7 +684,7 @@ Admina is Apache 2.0. Contributions are welcome.
|
|
|
565
684
|
|
|
566
685
|
Copyright © 2025–2026 [Stefano Noferi](https://github.com/stefanoferi) & Admina contributors
|
|
567
686
|
|
|
568
|
-
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.
|
|
569
688
|
|
|
570
689
|
---
|
|
571
690
|
|