admina-framework 0.9.2__tar.gz → 0.9.4__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.2/admina_framework.egg-info → admina_framework-0.9.4}/PKG-INFO +316 -161
- {admina_framework-0.9.2 → admina_framework-0.9.4}/README.md +313 -160
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/__init__.py +1 -1
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/cli/main.py +132 -17
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/domains/compliance/forensic.py +108 -4
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/proxy/engine_bridge.py +5 -60
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/sdk/governed_model.py +3 -1
- {admina_framework-0.9.2 → admina_framework-0.9.4/admina_framework.egg-info}/PKG-INFO +316 -161
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina_framework.egg-info/SOURCES.txt +2 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina_framework.egg-info/requires.txt +3 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/pyproject.toml +34 -2
- {admina_framework-0.9.2 → admina_framework-0.9.4}/tests/test_benchmark_14us.py +9 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/tests/test_domains.py +3 -26
- admina_framework-0.9.4/tests/test_firewall_parity.py +176 -0
- admina_framework-0.9.4/tests/test_forensic_blackbox.py +266 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/LICENSE +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/NOTICE +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/cli/__init__.py +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/cli/commands/__init__.py +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/cli/templates/admina.yaml.j2 +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/cli/templates/docker-compose.yml.j2 +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/cli/templates/env.j2 +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/cli/templates/main.py.j2 +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/cli/templates/plugin.py.j2 +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/cli/templates/plugin_pyproject.toml.j2 +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/cli/templates/plugin_readme.md.j2 +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/cli/templates/plugin_test.py.j2 +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/core/__init__.py +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/core/config.py +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/core/event_bus.py +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/core/secrets.py +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/core/types.py +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/dashboard/__init__.py +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/dashboard/static/heimdall.png +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/dashboard/static/index.html +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/dashboard/static/vendor/alpinejs.min.js +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/domains/__init__.py +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/domains/agent_security/__init__.py +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/domains/agent_security/firewall.py +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/domains/agent_security/loop_breaker.py +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/domains/ai_infra/__init__.py +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/domains/ai_infra/llm_engine.py +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/domains/ai_infra/rag.py +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/domains/ai_infra/webui.py +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/domains/compliance/__init__.py +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/domains/compliance/cross_regulation.py +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/domains/compliance/eu_ai_act.py +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/domains/compliance/gdpr.py +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/domains/compliance/nis2.py +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/domains/compliance/oisg.py +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/domains/compliance/otel.py +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/domains/data_sovereignty/__init__.py +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/domains/data_sovereignty/classification.py +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/domains/data_sovereignty/pii.py +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/domains/data_sovereignty/residency.py +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/integrations/__init__.py +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/integrations/_engines.py +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/integrations/cheshirecat/__init__.py +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/integrations/cheshirecat/admina-plugin/admina_governance.py +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/integrations/crewai/__init__.py +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/integrations/crewai/callbacks.py +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/integrations/langchain/__init__.py +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/integrations/langchain/callbacks.py +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/integrations/n8n/__init__.py +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/integrations/openclaw/__init__.py +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/plugins/__init__.py +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/plugins/base.py +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/plugins/builtin/__init__.py +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/plugins/builtin/adapters/__init__.py +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/plugins/builtin/adapters/ollama.py +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/plugins/builtin/adapters/openai.py +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/plugins/builtin/alerts/__init__.py +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/plugins/builtin/alerts/log.py +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/plugins/builtin/alerts/webhook.py +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/plugins/builtin/auth/__init__.py +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/plugins/builtin/auth/apikey.py +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/plugins/builtin/compliance/__init__.py +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/plugins/builtin/compliance/eu_ai_act.py +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/plugins/builtin/connectors/__init__.py +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/plugins/builtin/connectors/chromadb.py +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/plugins/builtin/connectors/filesystem.py +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/plugins/builtin/forensic/__init__.py +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/plugins/builtin/forensic/filesystem.py +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/plugins/builtin/forensic/minio.py +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/plugins/builtin/guards/__init__.py +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/plugins/builtin/guards/guardrailsai_guard.py +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/plugins/builtin/pii/__init__.py +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/plugins/builtin/pii/spacy_regex.py +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/plugins/builtin/transports/__init__.py +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/plugins/builtin/transports/http_rest.py +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/plugins/builtin/transports/mcp.py +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/plugins/registry.py +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/proxy/__init__.py +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/proxy/api/__init__.py +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/proxy/api/dashboard.py +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/proxy/api/integration.py +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/proxy/config.py +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/proxy/governance.py +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/proxy/main.py +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/proxy/multi_upstream.py +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/proxy/state.py +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/py.typed +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/sdk/__init__.py +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/sdk/_compat.py +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/sdk/compliance_kit.py +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/sdk/governed_agent.py +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/sdk/governed_data.py +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina_framework.egg-info/dependency_links.txt +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina_framework.egg-info/entry_points.txt +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/admina_framework.egg-info/top_level.txt +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/setup.cfg +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/tests/test_core_config.py +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/tests/test_governance_pipeline.py +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/tests/test_mcp_transport.py +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/tests/test_proxy_security.py +0 -0
- {admina_framework-0.9.2 → admina_framework-0.9.4}/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.4
|
|
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>
|
|
@@ -52,43 +52,109 @@ Requires-Dist: opentelemetry-api<2,>=1.20; extra == "telemetry"
|
|
|
52
52
|
Requires-Dist: opentelemetry-sdk<2,>=1.20; extra == "telemetry"
|
|
53
53
|
Requires-Dist: opentelemetry-exporter-otlp-proto-grpc<2,>=1.20; extra == "telemetry"
|
|
54
54
|
Requires-Dist: opentelemetry-instrumentation-fastapi<1,>=0.40b0; extra == "telemetry"
|
|
55
|
+
Provides-Extra: rust
|
|
56
|
+
Requires-Dist: admina-core<0.10,>=0.9.3; extra == "rust"
|
|
55
57
|
Provides-Extra: full
|
|
56
58
|
Requires-Dist: admina-framework[nlp,proxy,telemetry]; extra == "full"
|
|
57
59
|
Dynamic: license-file
|
|
58
60
|
|
|
59
|
-
|
|
61
|
+
<!--
|
|
62
|
+
<p align="center">
|
|
63
|
+
<img src="resources/banner.png" alt="Admina — Governed AI by Default" width="100%">
|
|
64
|
+
</p>
|
|
65
|
+
-->
|
|
60
66
|
|
|
61
|
-
|
|
67
|
+
<p align="center">
|
|
68
|
+
<strong>Install once, get governed AI.</strong><br>
|
|
69
|
+
<em>PII redacted · Injections blocked · Loops broken · Actions audited · EU AI Act tracked</em>
|
|
70
|
+
</p>
|
|
62
71
|
|
|
63
|
-
|
|
72
|
+
<p align="center">
|
|
73
|
+
<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>
|
|
75
|
+
<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/badge/platform-Linux%20%7C%20macOS-6C757D?style=flat-square" alt="Platform">
|
|
77
|
+
</p>
|
|
64
78
|
|
|
65
|
-
>
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
>
|
|
71
|
-
|
|
72
|
-
>
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
>
|
|
77
|
-
|
|
78
|
-
>
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
79
|
+
<p align="center">
|
|
80
|
+
<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>
|
|
81
|
+
<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>
|
|
82
|
+
<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>
|
|
83
|
+
<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>
|
|
84
|
+
</p>
|
|
85
|
+
|
|
86
|
+
<p align="center">
|
|
87
|
+
<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
|
+
<a href="https://admina.org/docs"><img src="https://img.shields.io/badge/docs-admina.org-blue?style=flat-square" alt="Docs"></a>
|
|
90
|
+
</p>
|
|
91
|
+
|
|
92
|
+
<p align="center">
|
|
93
|
+
<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>
|
|
94
|
+
<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>
|
|
95
|
+
<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>
|
|
96
|
+
<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
|
+
</p>
|
|
98
|
+
|
|
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
|
+
---
|
|
107
|
+
|
|
108
|
+
## See it in action
|
|
109
|
+
|
|
110
|
+
**Scaffold a project and boot the governed proxy + dashboard — no Docker:**
|
|
82
111
|
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
112
|
+
<p align="center">
|
|
113
|
+
<img src="resources/admina-init-dev.gif" alt="admina init → admina dev → Ready on localhost:3000" width="900">
|
|
114
|
+
</p>
|
|
115
|
+
|
|
116
|
+
**Wrap any model in a few lines — PII is stripped before the model ever sees it:**
|
|
117
|
+
|
|
118
|
+
<p align="center">
|
|
119
|
+
<img src="resources/sdk-3lines.gif" alt="GovernedModel redacts PERSON, EMAIL and credit card before the LLM call" width="900">
|
|
120
|
+
</p>
|
|
121
|
+
|
|
122
|
+
**The governance dashboard, before and after simulated traffic — Admina Score 40 → 60:**
|
|
123
|
+
|
|
124
|
+
<table>
|
|
125
|
+
<tr>
|
|
126
|
+
<td align="center" width="50%">
|
|
127
|
+
<img src="resources/dashboard-firstuser.png" alt="Dashboard at first boot — score 40/100" width="100%"><br>
|
|
128
|
+
<em>First boot — Admina Score <strong>40/100</strong></em>
|
|
129
|
+
</td>
|
|
130
|
+
<td align="center" width="50%">
|
|
131
|
+
<img src="resources/dashboard-traffic.png" alt="Dashboard after simulated traffic — score 60/100" width="100%"><br>
|
|
132
|
+
<em>After <code>python scripts/simulate.py</code> — <strong>60/100</strong></em>
|
|
133
|
+
</td>
|
|
134
|
+
</tr>
|
|
135
|
+
</table>
|
|
136
|
+
|
|
137
|
+
---
|
|
138
|
+
|
|
139
|
+
## Why Admina?
|
|
140
|
+
|
|
141
|
+
| | Plain LLM / RAG app | **With Admina** |
|
|
142
|
+
| :----------------------------- | :----------------------------------- | :----------------------------------------------------------------------- |
|
|
143
|
+
| PII in prompts/responses | leaks unless you build redaction | **Redacted by default** — email, SSN, IBAN, phone, IP, names |
|
|
144
|
+
| Prompt injections | reach the model | **Blocked at the proxy** — 15 regex + Rust heuristic scoring |
|
|
145
|
+
| Agent tool calls | unaudited | **Validated pre-action + logged post-action** (forensic chain) |
|
|
146
|
+
| Loop / runaway agents | burn tokens / budget | **Broken** — TF-IDF cosine similarity over the action stream |
|
|
147
|
+
| EU AI Act readiness | manual | **Gap analysis + risk classification** built-in |
|
|
148
|
+
| Audit trail | logs you hope nobody deletes | **SHA-256 hash chain** — tamper-evident by design |
|
|
149
|
+
| Adding governance to existing code | rewrite the call sites | **Zero code changes** via proxy, or 3 lines via SDK |
|
|
150
|
+
| Performance overhead | unknown | **~6 µs per pipeline** (Rust engine), in-process or networked |
|
|
151
|
+
| License | varies | **Apache 2.0**, open core |
|
|
152
|
+
|
|
153
|
+
> Admina is **decision-support and defense-in-depth**, not legal advice. See [Compliance scope](#compliance-scope) for the full disclaimer and limitations.
|
|
154
|
+
|
|
155
|
+
---
|
|
156
|
+
|
|
157
|
+
## 30-second example
|
|
92
158
|
|
|
93
159
|
```python
|
|
94
160
|
from admina import GovernedModel, GovernedData, GovernedAgent, ComplianceKit
|
|
@@ -120,30 +186,40 @@ report = kit.gap_analysis(risk_category="high", current_compliance={...})
|
|
|
120
186
|
### Install from PyPI
|
|
121
187
|
|
|
122
188
|
```bash
|
|
123
|
-
# SDK
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
# Proxy + infrastructure deps
|
|
189
|
+
# Recommended for new users: SDK + proxy + dashboard.
|
|
190
|
+
# Lets you run `admina dev` and see the dashboard out of the box.
|
|
127
191
|
pip install "admina-framework[proxy]"
|
|
128
192
|
|
|
129
|
-
# Everything (proxy + NLP + telemetry)
|
|
193
|
+
# Everything (proxy + NLP + telemetry). Use this if you also want
|
|
194
|
+
# spaCy-based NER for PII detection or OpenTelemetry export.
|
|
130
195
|
pip install "admina-framework[full]"
|
|
196
|
+
python -m spacy download en_core_web_sm # for [full] only
|
|
131
197
|
|
|
132
|
-
#
|
|
133
|
-
|
|
198
|
+
# Optional: Rust-accelerated engine (auto-detected at runtime).
|
|
199
|
+
# Opt-in extra — pulls in the admina-core wheel from PyPI.
|
|
200
|
+
pip install "admina-framework[rust]"
|
|
134
201
|
|
|
135
|
-
#
|
|
136
|
-
|
|
202
|
+
# Advanced: SDK only (no proxy, no dashboard, no `admina dev`).
|
|
203
|
+
# Use this when embedding the SDK into another service and you don't
|
|
204
|
+
# need the local dev server.
|
|
205
|
+
pip install admina-framework
|
|
137
206
|
```
|
|
138
207
|
|
|
139
208
|
> The PyPI distribution name is `admina-framework`; the Python import
|
|
140
209
|
> name is `admina` (e.g. `from admina import GovernedModel`). This is
|
|
141
210
|
> a normal Python pattern — same as `python-dateutil` → `import dateutil`.
|
|
142
211
|
|
|
143
|
-
> The Rust engine is an optional accelerator.
|
|
144
|
-
> ships only the pure-Python implementation;
|
|
145
|
-
>
|
|
146
|
-
> if it's
|
|
212
|
+
> The Rust engine is an **optional, opt-in** accelerator. The default
|
|
213
|
+
> `pip install admina-framework` ships only the pure-Python implementation;
|
|
214
|
+
> `admina-framework[rust]` adds the `admina-core` wheel, which Admina
|
|
215
|
+
> auto-detects at runtime (falling back to pure Python if it's absent).
|
|
216
|
+
>
|
|
217
|
+
> The default is pure Python on purpose: the Python injection firewall
|
|
218
|
+
> currently has **broader detection coverage** than the Rust one (it adds
|
|
219
|
+
> obfuscation-normalisation — homoglyph, leetspeak, base64, ROT13 — and a
|
|
220
|
+
> wider multilingual pattern set). Enable `[rust]` when per-request latency
|
|
221
|
+
> matters more than that extra coverage. See
|
|
222
|
+
> [Performance](#performance--hybrid-python--rust-engine) for the trade-off.
|
|
147
223
|
|
|
148
224
|
### Or install from source
|
|
149
225
|
|
|
@@ -151,56 +227,48 @@ pip install admina-core
|
|
|
151
227
|
git clone https://github.com/admina-org/admina.git
|
|
152
228
|
cd admina
|
|
153
229
|
|
|
154
|
-
#
|
|
155
|
-
pip install -e .
|
|
156
|
-
python -c "from admina import GovernedModel; print('SDK ready')"
|
|
157
|
-
|
|
158
|
-
# Note: To use the OllamaAdapter, install Ollama (https://ollama.ai)
|
|
159
|
-
# and pull a model first: ollama pull llama3.1:8b
|
|
160
|
-
|
|
161
|
-
# Option 2: Proxy + infra deps
|
|
230
|
+
# Recommended: proxy + dashboard + infra deps (enables `admina dev`)
|
|
162
231
|
pip install -e ".[proxy]"
|
|
163
232
|
|
|
164
|
-
#
|
|
233
|
+
# Everything (proxy + NLP + telemetry)
|
|
165
234
|
pip install -e ".[full]"
|
|
166
235
|
|
|
167
|
-
#
|
|
236
|
+
# CLI workflow
|
|
237
|
+
admina init my-project # Scaffold a governed AI project
|
|
238
|
+
cd my-project # admina dev runs from the project directory
|
|
239
|
+
admina dev # Start the local proxy + dashboard
|
|
240
|
+
|
|
241
|
+
# Full stack via Docker (no [proxy] extra required)
|
|
168
242
|
./scripts/bootstrap-secrets.sh # Auto-generate .env with random credentials
|
|
169
243
|
docker compose up --build # Credentials printed at bootstrap
|
|
170
244
|
|
|
171
|
-
#
|
|
245
|
+
# Note: To use the OllamaAdapter, install Ollama (https://ollama.ai)
|
|
246
|
+
# and pull a model first: ollama pull llama3.1:8b
|
|
247
|
+
|
|
248
|
+
# Advanced: SDK only (no proxy, no dashboard)
|
|
172
249
|
pip install -e .
|
|
173
|
-
|
|
174
|
-
cd my-project # admina dev runs from the project directory
|
|
175
|
-
admina dev # Start local dev stack
|
|
250
|
+
python -c "from admina import GovernedModel; print('SDK ready')"
|
|
176
251
|
```
|
|
177
252
|
|
|
178
253
|
Dashboard: [http://localhost:3000](http://localhost:3000) | API docs: [http://localhost:8080/docs](http://localhost:8080/docs)
|
|
179
254
|
|
|
180
255
|
## Architecture
|
|
181
256
|
|
|
182
|
-
Admina
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
```
|
|
194
|
-
SDK Mode: Proxy Mode:
|
|
195
|
-
your code AI Agent
|
|
196
|
-
| |
|
|
197
|
-
GovernedModel.ask() POST /mcp
|
|
198
|
-
| |
|
|
199
|
-
[governance pipeline] [governance pipeline]
|
|
200
|
-
| |
|
|
201
|
-
Ollama / OpenAI MCP Server / LLM
|
|
257
|
+
Admina runs in **dual mode** — in-process via SDK or networked via proxy — but both modes feed the **same governance pipeline**.
|
|
258
|
+
|
|
259
|
+
```mermaid
|
|
260
|
+
flowchart LR
|
|
261
|
+
A1["your code → GovernedModel.ask()"] --> P
|
|
262
|
+
A2["AI agent → POST /mcp"] --> P
|
|
263
|
+
P["governance pipeline"]
|
|
264
|
+
P --> U1["Ollama / OpenAI"]
|
|
265
|
+
P --> U2["MCP server / LLM"]
|
|
266
|
+
classDef pipe fill:#0ea5e9,stroke:#0369a1,color:#fff;
|
|
267
|
+
class P pipe;
|
|
202
268
|
```
|
|
203
269
|
|
|
270
|
+
Pipeline (identical in both modes): `PII redaction → firewall → loop-breaker → audit → forensic chain (SHA-256) → OTEL`
|
|
271
|
+
|
|
204
272
|
## The 4 Governance Domains
|
|
205
273
|
|
|
206
274
|
| Domain | Capabilities | Engine |
|
|
@@ -266,49 +334,6 @@ dependency: one uvicorn serves the proxy API and the dashboard SPA on the
|
|
|
266
334
|
same port. Use `--stack` for the production-like Docker compose, or
|
|
267
335
|
`--with-llm` to also boot local LLM services.
|
|
268
336
|
|
|
269
|
-
## Forensic backend — choose deliberately
|
|
270
|
-
|
|
271
|
-
The forensic blackbox (the SHA-256 hash chain that makes the audit trail
|
|
272
|
-
tamper-evident) supports four backends. Read this before picking one for
|
|
273
|
-
production.
|
|
274
|
-
|
|
275
|
-
| Backend | License | When to use | Caveats |
|
|
276
|
-
|---------|---------|-------------|---------|
|
|
277
|
-
| **`memory`** *(default)* | n/a | Local development, tests, demos | Records are LOST on restart — no audit persistence. Loud warning at startup. |
|
|
278
|
-
| **`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`. |
|
|
279
|
-
| **`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. |
|
|
280
|
-
| **`minio`** *(legacy)* | see below ⚠️ | Backwards compatibility with existing MinIO clusters | Two distinct concerns; read the disclaimer. |
|
|
281
|
-
|
|
282
|
-
> ⚠️ **MinIO disclaimer — what users of Admina need to know.**
|
|
283
|
-
>
|
|
284
|
-
> MinIO has two separate licensing/maintenance issues that can affect
|
|
285
|
-
> downstream users of Admina, even though Admina itself is Apache 2.0:
|
|
286
|
-
>
|
|
287
|
-
> 1. **MinIO Server is AGPLv3.** If you deploy MinIO Server as part of a
|
|
288
|
-
> network-accessible service (e.g. a SaaS that exposes Admina's
|
|
289
|
-
> dashboard or API to the public Internet), AGPLv3's network clause
|
|
290
|
-
> can be read to require you to publish the source code of the
|
|
291
|
-
> *combined* application that interacts with MinIO over the network.
|
|
292
|
-
> The MinIO commercial license removes this obligation, but is paid.
|
|
293
|
-
> This is **not** an Admina obligation — Apache 2.0 is permissive —
|
|
294
|
-
> but it is an obligation MinIO Server itself imposes on whoever
|
|
295
|
-
> runs it.
|
|
296
|
-
> 2. **The MinIO Python SDK has been archived.** No more security
|
|
297
|
-
> patches, no support for new Python releases. Continuing to depend
|
|
298
|
-
> on it is a supply-chain risk.
|
|
299
|
-
>
|
|
300
|
-
> **Recommendation:** for new deployments, use `FORENSIC_BACKEND=s3`.
|
|
301
|
-
> The `boto3` client is Apache 2.0 and works against any S3-compatible
|
|
302
|
-
> service. Two open-source FOSS-friendly options that don't trigger the
|
|
303
|
-
> AGPL network clause for typical Admina deployments:
|
|
304
|
-
> - **SeaweedFS** (Apache 2.0, S3 gateway, lightweight, single binary)
|
|
305
|
-
> - **Garage** (AGPLv3, but as a backend — Garage's AGPL applies to
|
|
306
|
-
> Garage itself, not to applications that connect to it via S3 API)
|
|
307
|
-
>
|
|
308
|
-
> Existing MinIO deployments keep working through `FORENSIC_BACKEND=minio`,
|
|
309
|
-
> but plan a migration. The `minio` backend will be removed in a future
|
|
310
|
-
> release.
|
|
311
|
-
|
|
312
337
|
## Dashboard
|
|
313
338
|
|
|
314
339
|
Real-time governance dashboard on port 3000:
|
|
@@ -330,19 +355,38 @@ cp admina.yaml.example admina.yaml # Copy and customize
|
|
|
330
355
|
|
|
331
356
|
See [`admina.yaml.example`](admina.yaml.example) for all options including domains, AI infra, plugins, dashboard, forensic storage, alert channels, and integrations.
|
|
332
357
|
|
|
333
|
-
|
|
358
|
+
<a id="compliance-scope"></a>
|
|
334
359
|
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
360
|
+
<details open>
|
|
361
|
+
<summary><strong>⚖️ Compliance scope & legal disclaimer</strong> — what Admina does and does not do legally</summary>
|
|
362
|
+
|
|
363
|
+
<br>
|
|
364
|
+
|
|
365
|
+
> Admina is a self-assessment and defense-in-depth tool. The EU AI Act
|
|
366
|
+
> gap-analysis and risk classification features are **decision-support
|
|
367
|
+
> aids, not legal advice**. They do not replace the conformity assessment
|
|
368
|
+
> required under EU AI Act Art. 43 for high-risk systems, nor the
|
|
369
|
+
> involvement of a notified body where the regulation requires one.
|
|
370
|
+
>
|
|
371
|
+
> **EU AI Act timeline (after the Omnibus VII agreement of 7 May 2026):**
|
|
372
|
+
> Art. 5 prohibitions in force since 2 February 2025; GPAI obligations
|
|
373
|
+
> in force since 2 August 2025; Art. 50 transparency for synthetic
|
|
374
|
+
> content and the new NCII / synthetic-CSAM prohibition apply from
|
|
375
|
+
> 2 December 2026; **Annex III high-risk obligations from 2 December
|
|
376
|
+
> 2027** (postponed from 2 Aug 2026); Annex I high-risk from 2 August
|
|
377
|
+
> 2028 (postponed from 2 Aug 2027). The full machine-readable timeline
|
|
378
|
+
> 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,
|
|
380
|
+
> and known failure modes of every Admina component.
|
|
381
|
+
|
|
382
|
+
</details>
|
|
342
383
|
|
|
343
384
|
## Integrations
|
|
344
385
|
|
|
345
|
-
|
|
386
|
+
<details>
|
|
387
|
+
<summary><strong>GuardrailsAI</strong> — ML-based content validation as a governance plugin</summary>
|
|
388
|
+
|
|
389
|
+
<br>
|
|
346
390
|
|
|
347
391
|
ML-based content validation (toxic language, jailbreak, bias, PII via Presidio) as a governance domain plugin:
|
|
348
392
|
|
|
@@ -356,7 +400,12 @@ pip install <your-guardrails-ai-wheel>
|
|
|
356
400
|
|
|
357
401
|
Enable in `admina.yaml` under `agent_security.domains.guardrailsai`. All inference runs locally by default — no data leaves the deployment perimeter.
|
|
358
402
|
|
|
359
|
-
|
|
403
|
+
</details>
|
|
404
|
+
|
|
405
|
+
<details>
|
|
406
|
+
<summary><strong>OpenClaw</strong> — govern OpenClaw agent actions via pre/post-action hooks</summary>
|
|
407
|
+
|
|
408
|
+
<br>
|
|
360
409
|
|
|
361
410
|
Govern OpenClaw agent actions through the Admina proxy. Every tool call, shell command, and API request is validated before execution:
|
|
362
411
|
|
|
@@ -367,9 +416,12 @@ chmod +x setup.sh && ./setup.sh
|
|
|
367
416
|
|
|
368
417
|
The skill uses `POST /api/v1/validate` (pre-action) and `POST /api/v1/audit` (post-action) endpoints.
|
|
369
418
|
|
|
370
|
-
|
|
419
|
+
</details>
|
|
420
|
+
|
|
421
|
+
<details>
|
|
422
|
+
<summary><strong>n8n</strong> — community nodes for n8n workflow automation</summary>
|
|
371
423
|
|
|
372
|
-
|
|
424
|
+
<br>
|
|
373
425
|
|
|
374
426
|
| Node | Purpose |
|
|
375
427
|
|------|---------|
|
|
@@ -379,9 +431,14 @@ Community nodes for n8n workflow automation:
|
|
|
379
431
|
|
|
380
432
|
Install: `npm install n8n-nodes-admina` in your n8n instance.
|
|
381
433
|
|
|
382
|
-
|
|
434
|
+
</details>
|
|
435
|
+
|
|
436
|
+
<details>
|
|
437
|
+
<summary><strong>Cheshire Cat AI</strong> — govern all Cheshire Cat interactions via Python hooks</summary>
|
|
438
|
+
|
|
439
|
+
<br>
|
|
383
440
|
|
|
384
|
-
|
|
441
|
+
Three Python hooks (`agent_fast_reply`, `before_cat_sends_message`, `before_cat_recalls_memories`):
|
|
385
442
|
|
|
386
443
|
```bash
|
|
387
444
|
cd integrations/cheshirecat/admina-plugin
|
|
@@ -389,9 +446,14 @@ cd integrations/cheshirecat/admina-plugin
|
|
|
389
446
|
# Copy plugin into Cheshire Cat plugins/ directory
|
|
390
447
|
```
|
|
391
448
|
|
|
392
|
-
|
|
449
|
+
</details>
|
|
450
|
+
|
|
451
|
+
<details>
|
|
452
|
+
<summary><strong>LangChain</strong> — drop-in callback handler</summary>
|
|
453
|
+
|
|
454
|
+
<br>
|
|
393
455
|
|
|
394
|
-
|
|
456
|
+
Governs every LLM call and tool invocation in-process:
|
|
395
457
|
|
|
396
458
|
```python
|
|
397
459
|
from admina.integrations.langchain.callbacks import AdminaCallbackHandler
|
|
@@ -400,9 +462,12 @@ handler = AdminaCallbackHandler()
|
|
|
400
462
|
llm = ChatOpenAI(callbacks=[handler])
|
|
401
463
|
```
|
|
402
464
|
|
|
403
|
-
|
|
465
|
+
</details>
|
|
466
|
+
|
|
467
|
+
<details>
|
|
468
|
+
<summary><strong>CrewAI</strong> — step and task callbacks for multi-agent governance</summary>
|
|
404
469
|
|
|
405
|
-
|
|
470
|
+
<br>
|
|
406
471
|
|
|
407
472
|
```python
|
|
408
473
|
from admina.integrations.crewai.callbacks import admina_step_callback, admina_task_callback
|
|
@@ -411,16 +476,32 @@ agent = Agent(role="Researcher", step_callback=admina_step_callback)
|
|
|
411
476
|
crew = Crew(agents=[agent], tasks=[task], task_callback=admina_task_callback)
|
|
412
477
|
```
|
|
413
478
|
|
|
414
|
-
|
|
479
|
+
</details>
|
|
415
480
|
|
|
416
|
-
|
|
481
|
+
See [full integration docs](docs/guides/integrations.md) for details.
|
|
417
482
|
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
483
|
+
## Performance — Hybrid Python + Rust engine
|
|
484
|
+
|
|
485
|
+
The Rust core engine is an optional accelerator. The default
|
|
486
|
+
`pip install admina-framework` ships only the pure-Python implementation;
|
|
487
|
+
enable the Rust engine with the opt-in extra `pip install
|
|
488
|
+
"admina-framework[rust]"` (or build from source for local development —
|
|
489
|
+
`maturin develop --release --manifest-path core-rust/Cargo.toml`, see
|
|
490
|
+
[CONTRIBUTING.md](CONTRIBUTING.md)). At runtime Admina auto-detects
|
|
491
|
+
whichever is available and falls back transparently to Python if the Rust
|
|
492
|
+
extension is not installed.
|
|
493
|
+
|
|
494
|
+
> **Detection trade-off (why Rust is opt-in, not the default).** The Rust
|
|
495
|
+
> firewall is faster but currently detects a narrower set of attacks than
|
|
496
|
+
> the pure-Python firewall. The Python engine normalises common evasions
|
|
497
|
+
> before matching (homoglyph, leetspeak, char-by-char hyphenation, base64,
|
|
498
|
+
> ROT13) and carries a wider multilingual pattern set; the Rust engine does
|
|
499
|
+
> not yet. On an internal 14-attack evasion corpus the Python firewall
|
|
500
|
+
> blocks all 14 while the Rust firewall blocks 7 (the plain-text and
|
|
501
|
+
> multilingual-keyword attacks), with no false positives on either side.
|
|
502
|
+
> Full Rust↔Python detection parity is tracked for 0.10. Until then, keep
|
|
503
|
+
> the default (pure Python) when detection breadth matters; opt into
|
|
504
|
+
> `[rust]` when latency dominates.
|
|
424
505
|
|
|
425
506
|
Measured numbers below assume the Rust engine is loaded:
|
|
426
507
|
|
|
@@ -468,7 +549,87 @@ python scripts/simulate.py --duration 300 --rate 10
|
|
|
468
549
|
|
|
469
550
|
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.
|
|
470
551
|
|
|
471
|
-
##
|
|
552
|
+
## Infrastructure & Services
|
|
553
|
+
|
|
554
|
+
The full stack (`docker compose up`) runs 9 containers:
|
|
555
|
+
|
|
556
|
+
| Port | Service | Description |
|
|
557
|
+
|------|---------|-------------|
|
|
558
|
+
| `8080` | Proxy | MCP proxy + REST API + OpenAPI docs |
|
|
559
|
+
| `3000` | Dashboard | Real-time governance web UI |
|
|
560
|
+
| `3001` | Grafana | Metrics dashboards |
|
|
561
|
+
| `9090` | MinIO Console | Forensic storage browser |
|
|
562
|
+
| `4317` | OTEL Collector | OTLP gRPC ingestion |
|
|
563
|
+
|
|
564
|
+
ClickHouse and Redis are internal only (not exposed to host).
|
|
565
|
+
|
|
566
|
+
<details>
|
|
567
|
+
<summary><strong>🗄️ Forensic backends (4 options) — choose deliberately</strong></summary>
|
|
568
|
+
|
|
569
|
+
<br>
|
|
570
|
+
|
|
571
|
+
The forensic blackbox (the SHA-256 hash chain that makes the audit trail
|
|
572
|
+
tamper-evident) supports four backends. Read this before picking one for
|
|
573
|
+
production.
|
|
574
|
+
|
|
575
|
+
| Backend | License | When to use | Caveats |
|
|
576
|
+
|---------|---------|-------------|---------|
|
|
577
|
+
| **`memory`** *(default)* | n/a | Local development, tests, demos | Records are LOST on restart — no audit persistence. Loud warning at startup. |
|
|
578
|
+
| **`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). Recommended new default. |
|
|
580
|
+
| **`minio`** *(legacy)* | see below ⚠️ | Backwards compatibility with existing MinIO clusters | Two distinct concerns; read the disclaimer. |
|
|
581
|
+
|
|
582
|
+
> ⚠️ **MinIO disclaimer — what users of Admina need to know.**
|
|
583
|
+
>
|
|
584
|
+
> MinIO has two separate licensing/maintenance issues that can affect
|
|
585
|
+
> downstream users of Admina, even though Admina itself is Apache 2.0:
|
|
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.
|
|
611
|
+
|
|
612
|
+
</details>
|
|
613
|
+
|
|
614
|
+
<details>
|
|
615
|
+
<summary><strong>⚙️ Environment variables (Docker / .env)</strong></summary>
|
|
616
|
+
|
|
617
|
+
<br>
|
|
618
|
+
|
|
619
|
+
| Variable | Default | Description |
|
|
620
|
+
|----------|---------|-------------|
|
|
621
|
+
| `ADMINA_API_KEY` | *(empty)* | API key for all endpoints |
|
|
622
|
+
| `UPSTREAM_MCP_URL` | `http://localhost:9000` | Default upstream MCP server |
|
|
623
|
+
| `REDIS_URL` | `redis://localhost:6379/0` | Session state + rate limiting |
|
|
624
|
+
| `MINIO_SECRET_KEY` | *(required)* | MinIO secret key for forensic storage |
|
|
625
|
+
| `LOG_LEVEL` | `INFO` | Logging verbosity |
|
|
626
|
+
|
|
627
|
+
</details>
|
|
628
|
+
|
|
629
|
+
<details>
|
|
630
|
+
<summary><strong>📁 Full project structure</strong></summary>
|
|
631
|
+
|
|
632
|
+
<br>
|
|
472
633
|
|
|
473
634
|
```
|
|
474
635
|
admina/
|
|
@@ -502,7 +663,12 @@ admina/
|
|
|
502
663
|
+-- docker-compose.yml Full stack deployment (9 containers)
|
|
503
664
|
```
|
|
504
665
|
|
|
505
|
-
|
|
666
|
+
</details>
|
|
667
|
+
|
|
668
|
+
<details>
|
|
669
|
+
<summary><strong>🔌 API examples (curl)</strong></summary>
|
|
670
|
+
|
|
671
|
+
<br>
|
|
506
672
|
|
|
507
673
|
```bash
|
|
508
674
|
# Health check (always public)
|
|
@@ -535,19 +701,7 @@ curl -X POST http://localhost:8080/api/compliance/classify \
|
|
|
535
701
|
curl http://localhost:8080/api/dashboard/score
|
|
536
702
|
```
|
|
537
703
|
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
The full stack (`docker compose up`) runs 9 containers:
|
|
541
|
-
|
|
542
|
-
| Port | Service | Description |
|
|
543
|
-
|------|---------|-------------|
|
|
544
|
-
| `8080` | Proxy | MCP proxy + REST API + OpenAPI docs |
|
|
545
|
-
| `3000` | Dashboard | Real-time governance web UI |
|
|
546
|
-
| `3001` | Grafana | Metrics dashboards |
|
|
547
|
-
| `9090` | MinIO Console | Forensic storage browser |
|
|
548
|
-
| `4317` | OTEL Collector | OTLP gRPC ingestion |
|
|
549
|
-
|
|
550
|
-
ClickHouse and Redis are internal only (not exposed to host).
|
|
704
|
+
</details>
|
|
551
705
|
|
|
552
706
|
## Project documents
|
|
553
707
|
|
|
@@ -557,6 +711,7 @@ ClickHouse and Redis are internal only (not exposed to host).
|
|
|
557
711
|
- [CHANGELOG.md](CHANGELOG.md) — release notes
|
|
558
712
|
- [SECURITY.md](SECURITY.md) — coordinated disclosure policy
|
|
559
713
|
- [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md) — Contributor Covenant 2.1
|
|
714
|
+
- **Browse the AI-generated wiki** → [deepwiki.com/admina-org/admina](https://deepwiki.com/admina-org/admina)
|
|
560
715
|
|
|
561
716
|
Admina is Apache 2.0. Contributions are welcome.
|
|
562
717
|
|