admina-framework 0.9.0__py3-none-any.whl

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.
Files changed (102) hide show
  1. admina/__init__.py +34 -0
  2. admina/cli/__init__.py +14 -0
  3. admina/cli/commands/__init__.py +14 -0
  4. admina/cli/main.py +1522 -0
  5. admina/cli/templates/admina.yaml.j2 +77 -0
  6. admina/cli/templates/docker-compose.yml.j2 +254 -0
  7. admina/cli/templates/env.j2 +10 -0
  8. admina/cli/templates/main.py.j2 +95 -0
  9. admina/cli/templates/plugin.py.j2 +145 -0
  10. admina/cli/templates/plugin_pyproject.toml.j2 +15 -0
  11. admina/cli/templates/plugin_readme.md.j2 +27 -0
  12. admina/cli/templates/plugin_test.py.j2 +48 -0
  13. admina/core/__init__.py +14 -0
  14. admina/core/config.py +497 -0
  15. admina/core/event_bus.py +112 -0
  16. admina/core/secrets.py +257 -0
  17. admina/core/types.py +146 -0
  18. admina/dashboard/__init__.py +8 -0
  19. admina/dashboard/static/heimdall.png +0 -0
  20. admina/dashboard/static/index.html +1045 -0
  21. admina/dashboard/static/vendor/alpinejs.min.js +5 -0
  22. admina/domains/__init__.py +14 -0
  23. admina/domains/agent_security/__init__.py +41 -0
  24. admina/domains/agent_security/firewall.py +634 -0
  25. admina/domains/agent_security/loop_breaker.py +176 -0
  26. admina/domains/ai_infra/__init__.py +79 -0
  27. admina/domains/ai_infra/llm_engine.py +477 -0
  28. admina/domains/ai_infra/rag.py +817 -0
  29. admina/domains/ai_infra/webui.py +292 -0
  30. admina/domains/compliance/__init__.py +109 -0
  31. admina/domains/compliance/cross_regulation.py +314 -0
  32. admina/domains/compliance/eu_ai_act.py +367 -0
  33. admina/domains/compliance/forensic.py +380 -0
  34. admina/domains/compliance/gdpr.py +331 -0
  35. admina/domains/compliance/nis2.py +258 -0
  36. admina/domains/compliance/oisg.py +658 -0
  37. admina/domains/compliance/otel.py +101 -0
  38. admina/domains/data_sovereignty/__init__.py +42 -0
  39. admina/domains/data_sovereignty/classification.py +102 -0
  40. admina/domains/data_sovereignty/pii.py +260 -0
  41. admina/domains/data_sovereignty/residency.py +121 -0
  42. admina/integrations/__init__.py +14 -0
  43. admina/integrations/_engines.py +63 -0
  44. admina/integrations/cheshirecat/__init__.py +13 -0
  45. admina/integrations/cheshirecat/admina-plugin/admina_governance.py +207 -0
  46. admina/integrations/crewai/__init__.py +13 -0
  47. admina/integrations/crewai/callbacks.py +347 -0
  48. admina/integrations/langchain/__init__.py +13 -0
  49. admina/integrations/langchain/callbacks.py +341 -0
  50. admina/integrations/n8n/__init__.py +14 -0
  51. admina/integrations/openclaw/__init__.py +14 -0
  52. admina/plugins/__init__.py +49 -0
  53. admina/plugins/base.py +633 -0
  54. admina/plugins/builtin/__init__.py +14 -0
  55. admina/plugins/builtin/adapters/__init__.py +14 -0
  56. admina/plugins/builtin/adapters/ollama.py +120 -0
  57. admina/plugins/builtin/adapters/openai.py +138 -0
  58. admina/plugins/builtin/alerts/__init__.py +14 -0
  59. admina/plugins/builtin/alerts/log.py +66 -0
  60. admina/plugins/builtin/alerts/webhook.py +102 -0
  61. admina/plugins/builtin/auth/__init__.py +14 -0
  62. admina/plugins/builtin/auth/apikey.py +138 -0
  63. admina/plugins/builtin/compliance/__init__.py +14 -0
  64. admina/plugins/builtin/compliance/eu_ai_act.py +202 -0
  65. admina/plugins/builtin/connectors/__init__.py +14 -0
  66. admina/plugins/builtin/connectors/chromadb.py +137 -0
  67. admina/plugins/builtin/connectors/filesystem.py +111 -0
  68. admina/plugins/builtin/forensic/__init__.py +14 -0
  69. admina/plugins/builtin/forensic/filesystem.py +163 -0
  70. admina/plugins/builtin/forensic/minio.py +180 -0
  71. admina/plugins/builtin/guards/__init__.py +0 -0
  72. admina/plugins/builtin/guards/guardrailsai_guard.py +172 -0
  73. admina/plugins/builtin/pii/__init__.py +14 -0
  74. admina/plugins/builtin/pii/spacy_regex.py +160 -0
  75. admina/plugins/builtin/transports/__init__.py +14 -0
  76. admina/plugins/builtin/transports/http_rest.py +97 -0
  77. admina/plugins/builtin/transports/mcp.py +173 -0
  78. admina/plugins/registry.py +356 -0
  79. admina/proxy/__init__.py +15 -0
  80. admina/proxy/api/__init__.py +17 -0
  81. admina/proxy/api/dashboard.py +925 -0
  82. admina/proxy/api/integration.py +153 -0
  83. admina/proxy/config.py +214 -0
  84. admina/proxy/engine_bridge.py +306 -0
  85. admina/proxy/governance.py +232 -0
  86. admina/proxy/main.py +1484 -0
  87. admina/proxy/multi_upstream.py +156 -0
  88. admina/proxy/state.py +97 -0
  89. admina/py.typed +0 -0
  90. admina/sdk/__init__.py +34 -0
  91. admina/sdk/_compat.py +43 -0
  92. admina/sdk/compliance_kit.py +359 -0
  93. admina/sdk/governed_agent.py +391 -0
  94. admina/sdk/governed_data.py +434 -0
  95. admina/sdk/governed_model.py +241 -0
  96. admina_framework-0.9.0.dist-info/METADATA +575 -0
  97. admina_framework-0.9.0.dist-info/RECORD +102 -0
  98. admina_framework-0.9.0.dist-info/WHEEL +5 -0
  99. admina_framework-0.9.0.dist-info/entry_points.txt +2 -0
  100. admina_framework-0.9.0.dist-info/licenses/LICENSE +191 -0
  101. admina_framework-0.9.0.dist-info/licenses/NOTICE +16 -0
  102. admina_framework-0.9.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,575 @@
1
+ Metadata-Version: 2.4
2
+ Name: admina-framework
3
+ Version: 0.9.0
4
+ Summary: Admina — governed AI development framework
5
+ Author-email: Stefano Noferi <info@admina.org>
6
+ Maintainer-email: Stefano Noferi <info@admina.org>
7
+ License-Expression: Apache-2.0
8
+ Project-URL: Homepage, https://admina.org
9
+ Project-URL: Repository, https://github.com/admina-org/admina
10
+ Project-URL: Documentation, https://github.com/admina-org/admina#readme
11
+ Project-URL: Issues, https://github.com/admina-org/admina/issues
12
+ Project-URL: Changelog, https://github.com/admina-org/admina/blob/main/CHANGELOG.md
13
+ Project-URL: Security, https://github.com/admina-org/admina/blob/main/SECURITY.md
14
+ Keywords: ai,governance,compliance,eu-ai-act,pii,llm,mcp,proxy,agent-security,injection-firewall,sdk
15
+ Classifier: Development Status :: 4 - Beta
16
+ Classifier: Intended Audience :: Developers
17
+ Classifier: Operating System :: OS Independent
18
+ Classifier: Programming Language :: Python :: 3
19
+ Classifier: Programming Language :: Python :: 3.11
20
+ Classifier: Programming Language :: Python :: 3.12
21
+ Classifier: Programming Language :: Python :: 3.13
22
+ Classifier: Programming Language :: Rust
23
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
24
+ Classifier: Topic :: Security
25
+ Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
26
+ Requires-Python: >=3.11
27
+ Description-Content-Type: text/markdown
28
+ License-File: LICENSE
29
+ License-File: NOTICE
30
+ Requires-Dist: pyyaml<7,>=6.0
31
+ Requires-Dist: click<9,>=8.1
32
+ Requires-Dist: jinja2<4,>=3.1
33
+ Requires-Dist: cryptography<48,>=41.0
34
+ Provides-Extra: proxy
35
+ Requires-Dist: fastapi<1,>=0.104; extra == "proxy"
36
+ Requires-Dist: uvicorn[standard]<1,>=0.24; extra == "proxy"
37
+ Requires-Dist: httpx<1,>=0.25; extra == "proxy"
38
+ Requires-Dist: pydantic<3,>=2.5; extra == "proxy"
39
+ Requires-Dist: pydantic-settings<3,>=2.3; extra == "proxy"
40
+ Requires-Dist: python-dotenv<2,>=1.0; extra == "proxy"
41
+ Requires-Dist: redis<6,>=5.0; extra == "proxy"
42
+ Requires-Dist: boto3<2,>=1.34; extra == "proxy"
43
+ Requires-Dist: minio<8,>=7.2; extra == "proxy"
44
+ Requires-Dist: clickhouse-connect<1,>=0.7; extra == "proxy"
45
+ Requires-Dist: typer<1,>=0.9; extra == "proxy"
46
+ Provides-Extra: nlp
47
+ Requires-Dist: spacy<4,>=3.8; extra == "nlp"
48
+ Requires-Dist: scikit-learn<2,>=1.3; extra == "nlp"
49
+ Requires-Dist: numpy<2,>=1.24; extra == "nlp"
50
+ Provides-Extra: telemetry
51
+ Requires-Dist: opentelemetry-api<2,>=1.20; extra == "telemetry"
52
+ Requires-Dist: opentelemetry-sdk<2,>=1.20; extra == "telemetry"
53
+ Requires-Dist: opentelemetry-exporter-otlp-proto-grpc<2,>=1.20; extra == "telemetry"
54
+ Requires-Dist: opentelemetry-instrumentation-fastapi<1,>=0.40b0; extra == "telemetry"
55
+ Provides-Extra: full
56
+ Requires-Dist: admina-framework[nlp,proxy,telemetry]; extra == "full"
57
+ Dynamic: license-file
58
+
59
+ # Admina — Governed AI Development Framework
60
+
61
+ **Install once, get governed AI. The open framework for building AI applications that are governed by design.**
62
+
63
+ Admina gives you an SDK, a transparent proxy, a plugin system, a CLI, and a dashboard — all in one install. Every AI interaction is governed: PII redacted, injections blocked, loops broken, actions audited, EU AI Act compliance tracked. Works in-process (SDK) and over the network (proxy). Zero code changes to add governance to existing applications.
64
+
65
+ > ⚖️ **Compliance disclaimer.** Admina is a self-assessment and
66
+ > defense-in-depth tool. The EU AI Act gap-analysis and risk
67
+ > classification features are **decision-support aids, not legal
68
+ > advice**. They do not replace the conformity assessment required
69
+ > under EU AI Act Art. 43 for high-risk systems, nor the involvement
70
+ > of a notified body where the regulation requires one.
71
+ >
72
+ > **EU AI Act timeline (after the Omnibus VII agreement of 7 May 2026):**
73
+ > Art. 5 prohibitions in force since 2 February 2025; GPAI obligations
74
+ > in force since 2 August 2025; Art. 50 transparency for synthetic
75
+ > content and the new NCII / synthetic-CSAM prohibition apply from
76
+ > 2 December 2026; **Annex III high-risk obligations from 2 December
77
+ > 2027** (postponed from 2 Aug 2026); Annex I high-risk from 2 August
78
+ > 2028 (postponed from 2 Aug 2027). The full machine-readable timeline
79
+ > ships with Admina as `admina.domains.compliance.eu_ai_act.EU_AI_ACT_DEADLINES`.
80
+ > See [`MODEL_CARD.md`](MODEL_CARD.md) for the full scope, limitations,
81
+ > and known failure modes of every Admina component.
82
+
83
+ [![PyPI version](https://img.shields.io/pypi/v/admina-framework.svg)](https://pypi.org/project/admina-framework/)
84
+ [![PyPI downloads](https://img.shields.io/pypi/dm/admina-framework.svg)](https://pypi.org/project/admina-framework/)
85
+ [![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](LICENSE)
86
+ [![Python](https://img.shields.io/badge/Python-3.11+-green.svg)](https://python.org)
87
+ [![Rust](https://img.shields.io/badge/Rust-Engine-orange.svg)](core-rust/)
88
+ [![CI](https://github.com/admina-org/admina/actions/workflows/ci.yml/badge.svg)](https://github.com/admina-org/admina/actions/workflows/ci.yml)
89
+ [![Docs](https://img.shields.io/badge/docs-admina.org-blue.svg)](https://admina.org/docs)
90
+ [![Version](https://img.shields.io/badge/version-0.9.0-blue.svg)](CHANGELOG.md)
91
+ [![Platforms](https://img.shields.io/badge/platforms-Linux%20%7C%20macOS-lightgrey.svg)](CONTRIBUTING.md#supported-platforms)
92
+
93
+ ```python
94
+ from admina import GovernedModel, GovernedData, GovernedAgent, ComplianceKit
95
+ from admina.plugins.builtin.adapters.ollama import OllamaAdapter
96
+ from admina.plugins.builtin.connectors.chromadb import ChromaDBConnector
97
+
98
+ # Every call is governed: PII redacted, injections blocked, audited
99
+ adapter = OllamaAdapter(host="http://localhost:11434")
100
+ model = GovernedModel(model_name="llama3.1:8b", adapter=adapter)
101
+ response = await model.ask("Summarize this document")
102
+
103
+ # Data governance: residency enforcement, PII classification
104
+ connector = ChromaDBConnector(host="localhost", port=8000)
105
+ data = GovernedData(connector=connector, residency_zone="eu")
106
+ await data.ingest(documents)
107
+
108
+ # Agent governance: validate every tool call before execution
109
+ async def my_upstream(method, params, **kw): ... # your MCP/HTTP client
110
+ agent = GovernedAgent(upstream=my_upstream)
111
+ result = await agent.call("tools/call", {"name": "read_file", "arguments": {}})
112
+
113
+ # Compliance: EU AI Act gap analysis and risk classification
114
+ kit = ComplianceKit()
115
+ report = kit.gap_analysis(risk_category="high", current_compliance={...})
116
+ ```
117
+
118
+ ## Quick Start
119
+
120
+ ### Install from PyPI
121
+
122
+ ```bash
123
+ # SDK only (lightweight, pure Python)
124
+ pip install admina-framework
125
+
126
+ # Proxy + infrastructure deps
127
+ pip install "admina-framework[proxy]"
128
+
129
+ # Everything (proxy + NLP + telemetry)
130
+ pip install "admina-framework[full]"
131
+
132
+ # After [nlp] / [full] install: download the spaCy NER model
133
+ python -m spacy download en_core_web_sm
134
+
135
+ # Optional: Rust-accelerated engine (auto-detected at runtime)
136
+ pip install admina-core
137
+ ```
138
+
139
+ > The PyPI distribution name is `admina-framework`; the Python import
140
+ > name is `admina` (e.g. `from admina import GovernedModel`). This is
141
+ > a normal Python pattern — same as `python-dateutil` → `import dateutil`.
142
+
143
+ > The Rust engine is an optional accelerator. `pip install admina-framework`
144
+ > ships only the pure-Python implementation; Admina auto-detects the
145
+ > Rust engine at runtime and falls back to the Python implementation
146
+ > if it's not installed.
147
+
148
+ ### Or install from source
149
+
150
+ ```bash
151
+ git clone https://github.com/admina-org/admina.git
152
+ cd admina
153
+
154
+ # Option 1: SDK only (lightweight)
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
162
+ pip install -e ".[proxy]"
163
+
164
+ # Option 3: Everything (proxy + NLP + telemetry)
165
+ pip install -e ".[full]"
166
+
167
+ # Option 4: Full stack (proxy + dashboard + infra via Docker)
168
+ ./scripts/bootstrap-secrets.sh # Auto-generate .env with random credentials
169
+ docker compose up --build # Credentials printed at bootstrap
170
+
171
+ # Option 5: CLI
172
+ pip install -e .
173
+ admina init my-project # Scaffold a governed AI project
174
+ cd my-project # admina dev runs from the project directory
175
+ admina dev # Start local dev stack
176
+ ```
177
+
178
+ Dashboard: [http://localhost:3000](http://localhost:3000) | API docs: [http://localhost:8080/docs](http://localhost:8080/docs)
179
+
180
+ ## Architecture
181
+
182
+ Admina is organized into 4 governance domains:
183
+
184
+ | Domain | What it governs | Key features |
185
+ |--------|----------------|--------------|
186
+ | **Data Sovereignty** | Where data lives and how it's protected | PII redaction (spaCy + regex), residency zones, data classification |
187
+ | **AI Infrastructure** | LLM and RAG stack | Ollama backend, ChromaDB vectors, Open WebUI, GPU auto-detect |
188
+ | **Agent Security** | What agents can do | Injection firewall (Rust), loop breaker, proxy governance |
189
+ | **Compliance** | Regulatory obligations | EU AI Act (Art. 6-15), forensic black box (SHA-256 chain), OTEL |
190
+
191
+ Every governance feature works in **dual mode** — both via SDK (in-process) and proxy (network):
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
202
+ ```
203
+
204
+ ## The 4 Governance Domains
205
+
206
+ | Domain | Capabilities | Engine |
207
+ |--------|-------------|--------|
208
+ | **Agent Security** | Anti-injection firewall (15 regex + heuristic scoring), loop breaker (TF-IDF cosine similarity) | Rust + Python |
209
+ | **Data Sovereignty** | PII redaction (email, SSN, credit cards, IBAN, phone, IP), residency enforcement, data classification | Rust + spaCy NER |
210
+ | **Compliance** | EU AI Act risk classification (Art. 6) and gap analysis (Art. 9-15), forensic black box (SHA-256 hash chain), OTEL native spans | Rust + Python |
211
+ | **AI Infrastructure** | LLM engine (Ollama, OpenAI), RAG pipeline (ChromaDB), Open WebUI | Python |
212
+
213
+ All governance domains operate **bidirectionally** — scanning both outbound requests and inbound responses.
214
+
215
+ ## SDK
216
+
217
+ Four governed primitives, each with async + sync interfaces:
218
+
219
+ ```python
220
+ from admina import GovernedModel, GovernedData, GovernedAgent, ComplianceKit
221
+ ```
222
+
223
+ | Primitive | Purpose | Governance applied |
224
+ |-----------|---------|-------------------|
225
+ | `GovernedModel` | LLM calls (Ollama, OpenAI) | PII redaction on prompts and responses, event audit |
226
+ | `GovernedData` | Data ingestion and queries | PII classification, residency enforcement, access audit |
227
+ | `GovernedAgent` | MCP/A2A agent calls | Firewall, PII, loop breaker — full proxy pipeline in-process |
228
+ | `ComplianceKit` | Regulatory compliance | EU AI Act risk classification, gap analysis, report generation |
229
+
230
+ ## Plugin System
231
+
232
+ 9 plugin interfaces, auto-discovered from `plugins/builtin/` or installed via CLI:
233
+
234
+ | Interface | Builtin implementations |
235
+ |-----------|------------------------|
236
+ | Model Adapter | Ollama, OpenAI |
237
+ | Data Connector | ChromaDB, Filesystem |
238
+ | Governance Domain | GuardrailsAI (toxic, jailbreak, bias, PII) |
239
+ | Compliance Template | EU AI Act |
240
+ | Transport Adapter | MCP, HTTP REST |
241
+ | Forensic Store | Filesystem, S3-compatible (boto3), MinIO (legacy) |
242
+ | Auth Provider | API Key |
243
+ | PII Engine | spaCy + Regex |
244
+ | Alert Channel | Log, Webhook |
245
+
246
+ ```bash
247
+ admina plugin list # List registered plugins
248
+ admina plugin install ./my-plugin # Install a custom plugin
249
+ admina plugin create my-domain # Scaffold a new plugin
250
+ ```
251
+
252
+ ## CLI
253
+
254
+ ```bash
255
+ admina init my-project # Scaffold project with admina.yaml + docker-compose.yml
256
+ admina dev # Local mode: proxy + dashboard on :3000 (no Docker)
257
+ admina dev --stack # Docker stack: + redis + clickhouse + minio + grafana
258
+ admina dev --with-llm # --stack + ollama + chromadb + open-webui
259
+ admina plugin list # List all registered plugins
260
+ admina plugin install X # Install a plugin from path or registry
261
+ admina plugin create X # Scaffold a new plugin from template
262
+ ```
263
+
264
+ `admina dev` defaults to a **single-process local mode** with zero Docker
265
+ dependency: one uvicorn serves the proxy API and the dashboard SPA on the
266
+ same port. Use `--stack` for the production-like Docker compose, or
267
+ `--with-llm` to also boot local LLM services.
268
+
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
+ ## Dashboard
313
+
314
+ Real-time governance dashboard on port 3000:
315
+
316
+ - **Governance Score** — 0-100 composite metric (data residency, audit coverage, attack rate, forensic integrity, EU AI Act compliance)
317
+ - **Live Feed** — streaming governance events via WebSocket
318
+ - **Compliance Gaps** — EU AI Act gap analysis with article-level detail
319
+ - **Infrastructure Health** — proxy, Redis, MinIO, ClickHouse, OTEL status
320
+
321
+ API backend: `GET /api/dashboard/score`, `/feed`, `/compliance`, `/sovereignty`, `/infra`, `/models`
322
+
323
+ ## Configuration
324
+
325
+ Admina uses `admina.yaml` as the primary config file (with `.env` fallback for backward compatibility):
326
+
327
+ ```bash
328
+ cp admina.yaml.example admina.yaml # Copy and customize
329
+ ```
330
+
331
+ See [`admina.yaml.example`](admina.yaml.example) for all options including domains, AI infra, plugins, dashboard, forensic storage, alert channels, and integrations.
332
+
333
+ ### Environment variables (Docker / .env)
334
+
335
+ | Variable | Default | Description |
336
+ |----------|---------|-------------|
337
+ | `ADMINA_API_KEY` | *(empty)* | API key for all endpoints |
338
+ | `UPSTREAM_MCP_URL` | `http://localhost:9000` | Default upstream MCP server |
339
+ | `REDIS_URL` | `redis://localhost:6379/0` | Session state + rate limiting |
340
+ | `MINIO_SECRET_KEY` | *(required)* | MinIO secret key for forensic storage |
341
+ | `LOG_LEVEL` | `INFO` | Logging verbosity |
342
+
343
+ ## Integrations
344
+
345
+ ### GuardrailsAI
346
+
347
+ ML-based content validation (toxic language, jailbreak, bias, PII via Presidio) as a governance domain plugin:
348
+
349
+ ```bash
350
+ # Upstream guardrails-ai is currently in PyPI quarantine. Install it
351
+ # manually from your local mirror or wheel cache; once available, the
352
+ # plugin in admina/plugins/builtin/guards/guardrailsai_guard.py will
353
+ # detect it automatically.
354
+ pip install <your-guardrails-ai-wheel>
355
+ ```
356
+
357
+ Enable in `admina.yaml` under `agent_security.domains.guardrailsai`. All inference runs locally by default — no data leaves the deployment perimeter.
358
+
359
+ ### OpenClaw
360
+
361
+ Govern OpenClaw agent actions through the Admina proxy. Every tool call, shell command, and API request is validated before execution:
362
+
363
+ ```bash
364
+ cd integrations/openclaw/admina-governance
365
+ chmod +x setup.sh && ./setup.sh
366
+ ```
367
+
368
+ The skill uses `POST /api/v1/validate` (pre-action) and `POST /api/v1/audit` (post-action) endpoints.
369
+
370
+ ### n8n
371
+
372
+ Community nodes for n8n workflow automation:
373
+
374
+ | Node | Purpose |
375
+ |------|---------|
376
+ | **Admina Govern** | Inline governance check — validates workflow data, blocks injections, redacts PII |
377
+ | **Admina Audit** | Logs workflow events to forensic black box with EU AI Act risk classification |
378
+ | **Admina Dashboard** | Trigger node — fires on governance events via WebSocket |
379
+
380
+ Install: `npm install n8n-nodes-admina` in your n8n instance.
381
+
382
+ ### Cheshire Cat AI
383
+
384
+ Govern all Cheshire Cat interactions via three Python hooks (`agent_fast_reply`, `before_cat_sends_message`, `before_cat_recalls_memories`):
385
+
386
+ ```bash
387
+ cd integrations/cheshirecat/admina-plugin
388
+ ./setup.sh # Start Admina sidecar
389
+ # Copy plugin into Cheshire Cat plugins/ directory
390
+ ```
391
+
392
+ ### LangChain
393
+
394
+ Drop-in callback handler — governs every LLM call and tool invocation in-process:
395
+
396
+ ```python
397
+ from admina.integrations.langchain.callbacks import AdminaCallbackHandler
398
+
399
+ handler = AdminaCallbackHandler()
400
+ llm = ChatOpenAI(callbacks=[handler])
401
+ ```
402
+
403
+ ### CrewAI
404
+
405
+ Step and task callbacks for multi-agent governance:
406
+
407
+ ```python
408
+ from admina.integrations.crewai.callbacks import admina_step_callback, admina_task_callback
409
+
410
+ agent = Agent(role="Researcher", step_callback=admina_step_callback)
411
+ crew = Crew(agents=[agent], tasks=[task], task_callback=admina_task_callback)
412
+ ```
413
+
414
+ See [full integration docs](docs/guides/integrations.md) for details.
415
+
416
+ ## Hybrid Python + Rust Engine
417
+
418
+ The Rust core engine is an optional accelerator. `pip install admina-framework`
419
+ ships only the pure-Python implementation; to enable the Rust engine
420
+ build `admina_core` separately (`maturin develop --release
421
+ --manifest-path core-rust/Cargo.toml`, see [CONTRIBUTING.md](CONTRIBUTING.md)).
422
+ At runtime Admina auto-detects whichever is available and falls back
423
+ transparently to Python if the Rust extension is not installed.
424
+
425
+ Measured numbers below assume the Rust engine is loaded:
426
+
427
+ ```
428
+ Component Rust (median) P95 P99
429
+ ----------------- ------------- --------- ---------
430
+ Firewall (regex) 2.08us 2.33us 2.50us
431
+ PII Scanner 0.62us 0.67us 0.71us
432
+ Loop Breaker 2.38us 2.67us 2.75us
433
+ Hash Chain 1.00us 1.12us 1.25us
434
+ ----------------- ------------- --------- ---------
435
+ 4-Domain pipeline 6.25us 7.04us 7.29us
436
+ ```
437
+
438
+ <details>
439
+ <summary>Rust vs Python comparison (click to expand)</summary>
440
+
441
+ ```
442
+ Component Python (median) Rust (median) Speedup
443
+ ----------------- --------------- ------------- --------
444
+ Firewall 7.79us 2.08us 3.7x
445
+ PII (regex-only) 8.21us 0.62us 13.2x
446
+ PII (with spaCy) 1 992us 0.62us 3 213x
447
+ Loop (sklearn) 505us 2.38us 212x
448
+ ----------------- --------------- ------------- --------
449
+ Full pipeline 2 261us 5.21us 434x
450
+ ```
451
+
452
+ </details>
453
+
454
+ ## Traffic Simulator
455
+
456
+ Generate realistic governance traffic to test and demo the platform:
457
+
458
+ ```bash
459
+ # Start the proxy
460
+ docker compose up -d
461
+
462
+ # Default: 60s at 2 req/s
463
+ python scripts/simulate.py
464
+
465
+ # Intense: 5 minutes at 10 req/s
466
+ python scripts/simulate.py --duration 300 --rate 10
467
+ ```
468
+
469
+ 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
+
471
+ ## Project Structure
472
+
473
+ ```
474
+ admina/
475
+ +-- admina/ SDK package (GovernedModel, GovernedData, GovernedAgent, ComplianceKit)
476
+ | +-- plugins/ Plugin base classes + registry
477
+ +-- domains/ 4 governance domains
478
+ | +-- data_sovereignty/ PII, residency, classification
479
+ | +-- ai_infra/ LLM engine, RAG pipeline, Web UI
480
+ | +-- agent_security/ Firewall, loop breaker, proxy
481
+ | +-- compliance/ EU AI Act, forensic, OTEL
482
+ +-- plugins/builtin/ Reference plugin implementations
483
+ | +-- adapters/ Ollama, OpenAI
484
+ | +-- connectors/ ChromaDB, Filesystem
485
+ | +-- domains/ GuardrailsAI
486
+ | +-- compliance/ EU AI Act template
487
+ | +-- transports/ MCP, HTTP REST
488
+ | +-- forensic/ MinIO, Filesystem
489
+ | +-- auth/ API Key
490
+ | +-- pii/ spaCy + Regex
491
+ | +-- alerts/ Log, Webhook
492
+ +-- proxy/ FastAPI proxy + Rust engine bridge
493
+ | +-- api/ Dashboard + integration REST endpoints
494
+ +-- cli/ CLI commands (init, dev, plugin)
495
+ +-- core/ Config, types, event bus
496
+ +-- core-rust/ Rust governance engines (PyO3)
497
+ +-- dashboard/ Real-time governance web UI
498
+ +-- integrations/
499
+ | +-- openclaw/ OpenClaw governance skill
500
+ | +-- n8n/ n8n community nodes
501
+ +-- tests/ 800+ tests (pytest)
502
+ +-- docker-compose.yml Full stack deployment (9 containers)
503
+ ```
504
+
505
+ ## API
506
+
507
+ ```bash
508
+ # Health check (always public)
509
+ curl http://localhost:8080/health
510
+
511
+ # Governance stats
512
+ curl http://localhost:8080/api/stats -H "X-API-Key: $ADMINA_API_KEY"
513
+
514
+ # Proxy an MCP call (all governance domains applied)
515
+ curl -X POST http://localhost:8080/mcp \
516
+ -H "Content-Type: application/json" \
517
+ -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{...}}'
518
+
519
+ # Validate content (REST API for integrations)
520
+ curl -X POST http://localhost:8080/api/v1/validate \
521
+ -H "Content-Type: application/json" \
522
+ -d '{"content": "Check this text for governance issues"}'
523
+
524
+ # Audit an action (forensic logging)
525
+ curl -X POST http://localhost:8080/api/v1/audit \
526
+ -H "Content-Type: application/json" \
527
+ -d '{"event": {"action": "llm_call", "status": "success"}}'
528
+
529
+ # EU AI Act risk classification
530
+ curl -X POST http://localhost:8080/api/compliance/classify \
531
+ -H "Content-Type: application/json" \
532
+ -d '{"description":"AI credit scoring","use_case":"lending","data_types":["financial"]}'
533
+
534
+ # Dashboard governance score
535
+ curl http://localhost:8080/api/dashboard/score
536
+ ```
537
+
538
+ ## Infrastructure & Services
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).
551
+
552
+ ## Project documents
553
+
554
+ - [CONTRIBUTING.md](CONTRIBUTING.md) — development setup, testing, and pull request workflow
555
+ - [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
556
+ - [ROADMAP.md](ROADMAP.md) — planned milestones from 0.9.x to 1.0 and beyond
557
+ - [CHANGELOG.md](CHANGELOG.md) — release notes
558
+ - [SECURITY.md](SECURITY.md) — coordinated disclosure policy
559
+ - [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md) — Contributor Covenant 2.1
560
+
561
+ Admina is Apache 2.0. Contributions are welcome.
562
+
563
+ ## License
564
+
565
+ Copyright © 2025–2026 [Stefano Noferi](https://github.com/stefanoferi) & Admina contributors
566
+
567
+ Licensed under the Apache License, Version 2.0. See [LICENSE](LICENSE) for the full text.
568
+
569
+ ---
570
+
571
+ <p align="center">
572
+ <img src="https://admina.org/admina-heimdall-the-governance-owl.png" alt="Heimdall — the Governance Owl" width="80" /><br/>
573
+ <em>Heimdall — the Governance Owl</em><br/><br/>
574
+ <strong>admina.org</strong> · Created by Stefano Noferi · Pisa, Italy
575
+ </p>
@@ -0,0 +1,102 @@
1
+ admina/__init__.py,sha256=zgqAKo06cFkYLaOlzKZDuDd6_XL6AYHeDeAqYsgMt-Y,1038
2
+ admina/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
+ admina/cli/__init__.py,sha256=zPw-YCDoFboSrXedS07rXp6Bzv20VHzhuZOf2kq0gsE,611
4
+ admina/cli/main.py,sha256=01GE__NcYktINn1CvdzUEfZZhwM1wxpTOMkCpqxp0HU,51853
5
+ admina/cli/commands/__init__.py,sha256=zPw-YCDoFboSrXedS07rXp6Bzv20VHzhuZOf2kq0gsE,611
6
+ admina/cli/templates/admina.yaml.j2,sha256=sSUrySnbze7_GMtTaN47Cy429bDt3_XpNHO9uniaKSo,1601
7
+ admina/cli/templates/docker-compose.yml.j2,sha256=XDgmhYGx-DO3bVlmsG-6eAAOoyxyYdH7cm5nDdbkk3o,7728
8
+ admina/cli/templates/env.j2,sha256=E2Xcoe6V6-pI1x-JPiFfRjDqhB5SraN59ExqzUG1F5k,285
9
+ admina/cli/templates/main.py.j2,sha256=DEcxkUTE-sj6r4UF0nmXZaTCDTJk4kT9ZPkMSJnANrw,3330
10
+ admina/cli/templates/plugin.py.j2,sha256=pXOPsjH20VJ8tmm-vcLuKAhzJs18DBctB34Ie9HSUpo,5250
11
+ admina/cli/templates/plugin_pyproject.toml.j2,sha256=7VDmvJTa1b78kS5y8tv10BviySZbwRnie2LQng3x1uM,350
12
+ admina/cli/templates/plugin_readme.md.j2,sha256=4x-M-q2WC26mNFaUfa9Sqp2JtVESr1L-sLXPKxA9ZJQ,337
13
+ admina/cli/templates/plugin_test.py.j2,sha256=gIwDmuFOihf7oxLIhAYt66soskP3ItZh7i6XskuAoMk,1581
14
+ admina/core/__init__.py,sha256=zPw-YCDoFboSrXedS07rXp6Bzv20VHzhuZOf2kq0gsE,611
15
+ admina/core/config.py,sha256=6tdYBuQDDuPvSav1sPj_K-SVsDZO_NE_SZ-aMJGDbGE,15547
16
+ admina/core/event_bus.py,sha256=tvNagefrKI-vgPD4dj_Quzz3bFcKfEEXBEfInzDGrRg,3810
17
+ admina/core/secrets.py,sha256=AiGhydwGuWBq8wliuMZgE24fdyDzcBs8nWr1tDFnqaQ,9155
18
+ admina/core/types.py,sha256=ywe--Xj3i7ev-5G2Y3LtznhL7HvwfB9UwEqnolRFK1s,4431
19
+ admina/dashboard/__init__.py,sha256=MPJURW2eIHULmz7xxOk5lT49w80NjzCU4hq5-h7hqqE,332
20
+ admina/dashboard/static/heimdall.png,sha256=0eoSHBV1YAu3JxgVuR63zYSG8HLHOZExloeEu0YG5pQ,421783
21
+ admina/dashboard/static/index.html,sha256=l26hqcLD2PAoG59LNS9szWOloQPOobNL9W65aYLCW9k,52134
22
+ admina/dashboard/static/vendor/alpinejs.min.js,sha256=tgDjY9mdlURNtUrL-y3v_smueSqpmgkim82geOW1VkM,44758
23
+ admina/domains/__init__.py,sha256=zPw-YCDoFboSrXedS07rXp6Bzv20VHzhuZOf2kq0gsE,611
24
+ admina/domains/agent_security/__init__.py,sha256=_x8VhK9mGrJsS6SLjEsVPYVD3WPr_gsVXurZX7MoQqU,1437
25
+ admina/domains/agent_security/firewall.py,sha256=3m674SS2r_rRGtDStOMwsMs46ntvyvwYQelA5QAlts4,23733
26
+ admina/domains/agent_security/loop_breaker.py,sha256=xAJRLQ1QwHWH2ZFxCxKpcgq4ed1FRIO5ubnhqERo3pc,6482
27
+ admina/domains/ai_infra/__init__.py,sha256=aRrrpZnHQbH8mA8T-eGFBcT2AXms6dg8H8dP8wyFnVI,1793
28
+ admina/domains/ai_infra/llm_engine.py,sha256=ARJ1CDJ8HwIBheT5kGAwciXEhDb1m8wuv3er-30hpJE,15296
29
+ admina/domains/ai_infra/rag.py,sha256=cyuRPJwZVpV064fa-HqucAdepk3GHAAIL4EOGhIJnbQ,26610
30
+ admina/domains/ai_infra/webui.py,sha256=B8cZJk99hw9yphAeZ2mHgdlljQcKvQX34O_K_SUNgPQ,9731
31
+ admina/domains/compliance/__init__.py,sha256=hAfBmxlv3RmsiMLVq5Ha7t0kwz65HzIRwslOEpmUet0,3292
32
+ admina/domains/compliance/cross_regulation.py,sha256=oBhkQ48oO9vRbqbj7fLa7xDP9VAOcrhTMTyFVxUFmWw,11971
33
+ admina/domains/compliance/eu_ai_act.py,sha256=3qmCsiYB088_8iLMfL_c3imWLQKFfA7o3L5K6EJ5Wrs,13433
34
+ admina/domains/compliance/forensic.py,sha256=-NXLyEOUHaPU_5HhqLC11oVXKOPirJRgAltS3cewAas,15699
35
+ admina/domains/compliance/gdpr.py,sha256=dHZ2zHVxuIKvVMd3cTUOEmf8NcNqBK8b4i6fyMRk-SA,12471
36
+ admina/domains/compliance/nis2.py,sha256=GBIBAuMk8GWNtzdHUsqY_HCXxZv-XS_gqOSd6-89F38,9555
37
+ admina/domains/compliance/oisg.py,sha256=BfKEIdTVnJs9CwyZ1ixn_XDpqAVF75M5Woh7UG2hYPE,21799
38
+ admina/domains/compliance/otel.py,sha256=Xykos-gd-UKgSWJhI1f2zPErjy9F7YyZ8saRaVnfO70,3719
39
+ admina/domains/data_sovereignty/__init__.py,sha256=-FlrmIhJCWyZV1MgGEdsiXvz8OsI9KLshKcvuD4V14c,1527
40
+ admina/domains/data_sovereignty/classification.py,sha256=HzKGRVyY35C1Rhlpg_xTCRnMrFya-TdeM9fgqX4fvgY,3408
41
+ admina/domains/data_sovereignty/pii.py,sha256=10kpXncjEt046EEXwUmyUijNm-NY2svZdt2Wpz8FfBg,10322
42
+ admina/domains/data_sovereignty/residency.py,sha256=sJe5eFmDrLC38wcyZAA5IPjnMPzjjyW24fnWR4knTM0,3998
43
+ admina/integrations/__init__.py,sha256=zPw-YCDoFboSrXedS07rXp6Bzv20VHzhuZOf2kq0gsE,611
44
+ admina/integrations/_engines.py,sha256=8M03Ml8RIcD34S7nYOWgMa4ycxUxCfu-Jp9cG3vtTT0,1912
45
+ admina/integrations/cheshirecat/__init__.py,sha256=plfElOZSwS_udaeU_kpsf3Q6pkl1Rsc8l0y1cBEsdS0,610
46
+ admina/integrations/cheshirecat/admina-plugin/admina_governance.py,sha256=sJ2kLZ97hvaPXcWgsxymVxUakdTmyJDxB9Sr54g3qgI,6967
47
+ admina/integrations/crewai/__init__.py,sha256=plfElOZSwS_udaeU_kpsf3Q6pkl1Rsc8l0y1cBEsdS0,610
48
+ admina/integrations/crewai/callbacks.py,sha256=IcAr-ZGb55dsTs-jiIphFnNNArPFzVBbOsvqIos-Cds,11011
49
+ admina/integrations/langchain/__init__.py,sha256=plfElOZSwS_udaeU_kpsf3Q6pkl1Rsc8l0y1cBEsdS0,610
50
+ admina/integrations/langchain/callbacks.py,sha256=rNatIShLzJsoDIwwzmmUNNrTnDV-b_NKd2Zxh-_VHq0,11435
51
+ admina/integrations/n8n/__init__.py,sha256=zPw-YCDoFboSrXedS07rXp6Bzv20VHzhuZOf2kq0gsE,611
52
+ admina/integrations/openclaw/__init__.py,sha256=zPw-YCDoFboSrXedS07rXp6Bzv20VHzhuZOf2kq0gsE,611
53
+ admina/plugins/__init__.py,sha256=wZt7kaNCvvyby7Di54ye6cLjQHkZpr-qoNoUr6GygR8,1441
54
+ admina/plugins/base.py,sha256=RYKYYBCx5B6JaHXzMzMJcXOyxx-_0fRjBJrF-O6TDkg,20309
55
+ admina/plugins/registry.py,sha256=8e7DeRZEfh_RtuSfz02pnFh8bdfNGKYG7ZREMXgrXQw,12951
56
+ admina/plugins/builtin/__init__.py,sha256=zPw-YCDoFboSrXedS07rXp6Bzv20VHzhuZOf2kq0gsE,611
57
+ admina/plugins/builtin/adapters/__init__.py,sha256=zPw-YCDoFboSrXedS07rXp6Bzv20VHzhuZOf2kq0gsE,611
58
+ admina/plugins/builtin/adapters/ollama.py,sha256=3VvVs8ZY1rMJtHSYitZo0e6rIC1ZJMLBah4RqTJ-S1g,4200
59
+ admina/plugins/builtin/adapters/openai.py,sha256=3N9I4fV77u1TU6TMe0hcctyfQ3IlN7ok5b7jS-vSpF4,4942
60
+ admina/plugins/builtin/alerts/__init__.py,sha256=zPw-YCDoFboSrXedS07rXp6Bzv20VHzhuZOf2kq0gsE,611
61
+ admina/plugins/builtin/alerts/log.py,sha256=sHPLKm6cqlJvo85OxXWKtpXFNURvP6CDY0Q-0fzxRi4,1939
62
+ admina/plugins/builtin/alerts/webhook.py,sha256=2uvuiY-yig-SM5tuhhgb1-AwGy3i8AIDcyRDZ1kZha8,3556
63
+ admina/plugins/builtin/auth/__init__.py,sha256=zPw-YCDoFboSrXedS07rXp6Bzv20VHzhuZOf2kq0gsE,611
64
+ admina/plugins/builtin/auth/apikey.py,sha256=-O1-Aoqtvo8UBAUUHjnDWd5OpjolSdoOC1SU9ztVHDE,4934
65
+ admina/plugins/builtin/compliance/__init__.py,sha256=zPw-YCDoFboSrXedS07rXp6Bzv20VHzhuZOf2kq0gsE,611
66
+ admina/plugins/builtin/compliance/eu_ai_act.py,sha256=kxDNVrb6KlL2OlfJL5dakwTdtGF9xfeXeqstSgqylCs,6326
67
+ admina/plugins/builtin/connectors/__init__.py,sha256=zPw-YCDoFboSrXedS07rXp6Bzv20VHzhuZOf2kq0gsE,611
68
+ admina/plugins/builtin/connectors/chromadb.py,sha256=yDzXfLqt5uH7CY7f44k6ZsKcUu6-wEWy4x7JdPBBstc,4679
69
+ admina/plugins/builtin/connectors/filesystem.py,sha256=C_1R7y8GoWuv8UQ86xDpQZeTV1ZnB1-JEUr8vovo0ug,3498
70
+ admina/plugins/builtin/forensic/__init__.py,sha256=zPw-YCDoFboSrXedS07rXp6Bzv20VHzhuZOf2kq0gsE,611
71
+ admina/plugins/builtin/forensic/filesystem.py,sha256=KR8Y0SXrtbDKZZizk-1HhUoBT3RTkd7pxWisCPD_sF4,5690
72
+ admina/plugins/builtin/forensic/minio.py,sha256=Q4Hvzrh-thyBSE34Qzq80QoMkHrNZuavZJN6PqECOcI,6021
73
+ admina/plugins/builtin/guards/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
74
+ admina/plugins/builtin/guards/guardrailsai_guard.py,sha256=gwsuvD11QU78P6fITCb0BVISXaifPvrfLkNXghHjMYg,6361
75
+ admina/plugins/builtin/pii/__init__.py,sha256=zPw-YCDoFboSrXedS07rXp6Bzv20VHzhuZOf2kq0gsE,611
76
+ admina/plugins/builtin/pii/spacy_regex.py,sha256=zLnWCgw5WpRfPBmPk8PHFRMrP15qTSI1hJh9CRH5ve0,5422
77
+ admina/plugins/builtin/transports/__init__.py,sha256=zPw-YCDoFboSrXedS07rXp6Bzv20VHzhuZOf2kq0gsE,611
78
+ admina/plugins/builtin/transports/http_rest.py,sha256=OnIDDKRKWZXN6ixh9FxvftyiE1j7UK2GL2vOIUBu37A,3274
79
+ admina/plugins/builtin/transports/mcp.py,sha256=TB_X-yEVKmCKYFLJ8v5pufKp2LiuCB9m0PN68NcVtBA,5297
80
+ admina/proxy/__init__.py,sha256=VTZK_hqAR0Xkjm4i5VcXAEHMMCsZouZL5ywkr_uBJTI,637
81
+ admina/proxy/config.py,sha256=Q-q5QL27lokIh2sQhMLau8E8fOA5Eoj4KpVPwl5tGnA,8670
82
+ admina/proxy/engine_bridge.py,sha256=gMmz_iOuclKEMdl1-411KG2D0bM9yJiDEhk1fLQQnQY,10063
83
+ admina/proxy/governance.py,sha256=092-KHvmQ1Bo3_Wauk_wbMnkkynFnHAOlBXC_odJjSw,8233
84
+ admina/proxy/main.py,sha256=S_lpeKGelr2GoFWPT23VJcljAzgK80_qvcrshfPfCw4,58046
85
+ admina/proxy/multi_upstream.py,sha256=BeDjubYAt-_FBacCOFKWBpIiWn5bYxzUOoH5Vg0XMHc,5620
86
+ admina/proxy/state.py,sha256=bM2I2eg4GlrjtPxh8Yip60_8ThH3PieN5NByEbC3WF0,3418
87
+ admina/proxy/api/__init__.py,sha256=iUfA2ZbFFqFm5OtBqP4KLOAcYVXyNtJXddm0GQ029Yo,723
88
+ admina/proxy/api/dashboard.py,sha256=jIXUjCHp3XvZHdGH1BIRNcSxc6NhwIxSZmBYAfpgz5c,38775
89
+ admina/proxy/api/integration.py,sha256=XgGKxW3GdPPHjvo4Jqy4Upxi47CWINrpBG-AhDVJ0A4,5052
90
+ admina/sdk/__init__.py,sha256=nSsohr6iPt5iw3bEkm735UxQph3GfE_mVoV6JIcZX-Y,1093
91
+ admina/sdk/_compat.py,sha256=5_M9gSpEHKdX-hfTV1wBMqg5jDiAr_RNMBFQ8vMWhVw,1472
92
+ admina/sdk/compliance_kit.py,sha256=4OfR8miYh9-n5_yraj6X9k6lh9FGf9aZganFiQxig9Q,11780
93
+ admina/sdk/governed_agent.py,sha256=AoL8oBeGEiwAt0jc-u-BRcHKr8CJpDjfnPY7AO_WpCM,12373
94
+ admina/sdk/governed_data.py,sha256=3ZwgE6si0czfFvSW8yzEITHsjzxK95ho5x-zUdc56xg,14533
95
+ admina/sdk/governed_model.py,sha256=4l5IuuQwbqfNFBbfCVra1k_YMLjoSpsNfe9fhMB-VKs,8051
96
+ admina_framework-0.9.0.dist-info/licenses/LICENSE,sha256=89WG7dTGIbOGDHpfhHBV90HTgc6Og03pCsbhmnAttyc,10798
97
+ admina_framework-0.9.0.dist-info/licenses/NOTICE,sha256=49HL9ZdvC0wJlwS2hI0zLrLNfqjWVGPoKzm99xN1LOU,631
98
+ admina_framework-0.9.0.dist-info/METADATA,sha256=9hzgO7z5DystSZdevJvCpLALEHzuOdej5P4r90YZml8,24916
99
+ admina_framework-0.9.0.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
100
+ admina_framework-0.9.0.dist-info/entry_points.txt,sha256=Sf1t52Q-gi1LvznRHag4oYdFOWOlLv3H_ywHC-O0vv4,47
101
+ admina_framework-0.9.0.dist-info/top_level.txt,sha256=Ome4T3fbY7vR9rof7oSNpag8IDD3hU1pb7KJmycNTc8,7
102
+ admina_framework-0.9.0.dist-info/RECORD,,