simpleaudit 0.3.0__tar.gz → 0.3.2__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.
- {simpleaudit-0.3.0/simpleaudit.egg-info → simpleaudit-0.3.2}/PKG-INFO +15 -15
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/README.md +10 -10
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/pyproject.toml +5 -5
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/simpleaudit/scenarios/bullshitbench_v1_v2.py +19 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/simpleaudit/targets/model.py +14 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2/simpleaudit.egg-info}/PKG-INFO +15 -15
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/tests/test_targets.py +69 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/tests/test_tracing.py +20 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/LICENSE +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/setup.cfg +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/simpleaudit/__init__.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/simpleaudit/auditor.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/simpleaudit/checklist.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/simpleaudit/cli.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/simpleaudit/context_marks.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/simpleaudit/cross_judge.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/simpleaudit/experiment.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/simpleaudit/judges/__init__.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/simpleaudit/judges/abstention.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/simpleaudit/judges/binary_abstention.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/simpleaudit/judges/checklist.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/simpleaudit/judges/compose.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/simpleaudit/judges/default.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/simpleaudit/judges/factuality.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/simpleaudit/judges/harm.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/simpleaudit/judges/helpfulness.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/simpleaudit/judges/helsedir_sexhealth_no.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/simpleaudit/judges/helsedir_sexhealth_no_rag.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/simpleaudit/judges/safety.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/simpleaudit/model_auditor.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/simpleaudit/perturbations.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/simpleaudit/reframing.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/simpleaudit/repeated_results.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/simpleaudit/results.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/simpleaudit/scenarios/__init__.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/simpleaudit/scenarios/arbeidstilsynet_arbeidstid.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/simpleaudit/scenarios/bullshitbench_health.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/simpleaudit/scenarios/health.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/simpleaudit/scenarios/hei_refusal.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/simpleaudit/scenarios/helfo.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/simpleaudit/scenarios/helpmed.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/simpleaudit/scenarios/human_rights_education.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/simpleaudit/scenarios/human_rights_fair_trial.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/simpleaudit/scenarios/human_rights_water.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/simpleaudit/scenarios/images/blank_chart.png +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/simpleaudit/scenarios/images/illegible_label.png +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/simpleaudit/scenarios/images/injection.png +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/simpleaudit/scenarios/images/make_images.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/simpleaudit/scenarios/images/product_a.png +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/simpleaudit/scenarios/images/product_b.png +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/simpleaudit/scenarios/images/quarterly_revenue.png +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/simpleaudit/scenarios/images/truncated_axis.png +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/simpleaudit/scenarios/lanekassen.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/simpleaudit/scenarios/nav_aap.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/simpleaudit/scenarios/nb_kryss_ordning.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/simpleaudit/scenarios/rag.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/simpleaudit/scenarios/safety.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/simpleaudit/scenarios/skatteetaten.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/simpleaudit/scenarios/skatteetaten_legitimasjon.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/simpleaudit/scenarios/system_prompt.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/simpleaudit/scenarios/toll_reisegodskvote.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/simpleaudit/scenarios/ung.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/simpleaudit/scenarios/vision_integrity.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/simpleaudit/spans.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/simpleaudit/stats.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/simpleaudit/targets/__init__.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/simpleaudit/targets/base.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/simpleaudit/targets/callable.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/simpleaudit/targets/http.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/simpleaudit/tracing/__init__.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/simpleaudit/tracing/auth.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/simpleaudit/tracing/context.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/simpleaudit/tracing/otlp.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/simpleaudit/tracing/provider.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/simpleaudit/tracing/selection.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/simpleaudit/tracing/shared.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/simpleaudit/tracing/store.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/simpleaudit/utils.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/simpleaudit/visualization/scenario_viewer.html +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/simpleaudit/visualization/server.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/simpleaudit/visualization/thumbnail.png +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/simpleaudit/visualization/visualizer.html +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/simpleaudit.egg-info/SOURCES.txt +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/simpleaudit.egg-info/dependency_links.txt +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/simpleaudit.egg-info/entry_points.txt +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/simpleaudit.egg-info/requires.txt +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/simpleaudit.egg-info/top_level.txt +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/tests/test_anthropic_judge_default_path.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/tests/test_audit_flow.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/tests/test_basic.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/tests/test_checklist.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/tests/test_checklist_judge.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/tests/test_checklist_pipeline.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/tests/test_checklist_reframing.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/tests/test_cross_judge.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/tests/test_custom_prompts.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/tests/test_document_expansion.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/tests/test_experiment_streaming.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/tests/test_fakes.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/tests/test_file_uri.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/tests/test_fragility.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/tests/test_generation_params.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/tests/test_json_format.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/tests/test_judge_compose.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/tests/test_judge_notes.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/tests/test_judge_output_contract.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/tests/test_judge_postprocess.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/tests/test_judge_registry.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/tests/test_judge_response_schema.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/tests/test_judge_robustness_pipeline.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/tests/test_model_auditor.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/tests/test_perturbations.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/tests/test_reframing.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/tests/test_rejudge.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/tests/test_repeated_experiments.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/tests/test_resumable_experiments.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/tests/test_scenario_data.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/tests/test_scenario_pack_conventions.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/tests/test_spans.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/tests/test_stats.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/tests/test_strip_thinking.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/tests/test_target_api_key.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/tests/test_token_counting.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/tests/test_tracing_auth.py +0 -0
- {simpleaudit-0.3.0 → simpleaudit-0.3.2}/tests/test_vision_integrity_pack.py +0 -0
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: simpleaudit
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.2
|
|
4
4
|
Summary: Lightweight AI Safety Auditing Framework
|
|
5
5
|
Author: SimpleAudit Contributors
|
|
6
6
|
License: MIT
|
|
7
|
-
Project-URL: Homepage, https://github.com/
|
|
8
|
-
Project-URL: Documentation, https://github.com/
|
|
9
|
-
Project-URL: Repository, https://github.com/
|
|
10
|
-
Project-URL: Issues, https://github.com/
|
|
7
|
+
Project-URL: Homepage, https://github.com/simulamet/simpleaudit
|
|
8
|
+
Project-URL: Documentation, https://github.com/simulamet/simpleaudit#readme
|
|
9
|
+
Project-URL: Repository, https://github.com/simulamet/simpleaudit
|
|
10
|
+
Project-URL: Issues, https://github.com/simulamet/simpleaudit/issues
|
|
11
11
|
Project-URL: PyPI, https://pypi.org/project/simpleaudit/
|
|
12
12
|
Keywords: ai,safety,audit,red-team,llm,rag,testing
|
|
13
13
|
Classifier: Development Status :: 4 - Beta
|
|
@@ -48,7 +48,7 @@ Dynamic: license-file
|
|
|
48
48
|
|
|
49
49
|
<div align="center">
|
|
50
50
|
|
|
51
|
-
[](https://www.digitalpublicgoods.net/r/simpleaudit) [](https://pypi.org/project/simpleaudit/) [](https://www.python.org/downloads/) [](https://opensource.org/licenses/MIT) [](https://www.digitalpublicgoods.net/r/simpleaudit) [](https://pypi.org/project/simpleaudit/) [](https://www.python.org/downloads/) [](https://opensource.org/licenses/MIT) [](https://github.com/simulamet/simpleaudit/actions/workflows/tests.yml) [](https://github.com/simulamet/simpleaudit/commits/main)
|
|
52
52
|
|
|
53
53
|
<img width="300px" alt="simpleaudit-logo" src="https://github.com/user-attachments/assets/2ed38ae0-f834-4934-bcc4-48fe441b8b2b" />
|
|
54
54
|
|
|
@@ -64,7 +64,7 @@ Developed by [Simula](https://www.simula.no/) and [SimulaMet](https://www.simula
|
|
|
64
64
|
SimpleAudit is a simple, extensible, local-first framework for multilingual auditing and red-teaming of AI systems via adversarial probing. It supports open models running locally (no APIs required) and can optionally run evaluations against API-hosted models. SimpleAudit does not collect or transmit user data by default and is designed for minimal setup.
|
|
65
65
|
</div>
|
|
66
66
|
|
|
67
|
-
See the [standards and best practices for creating custom test scenarios](https://github.com/
|
|
67
|
+
See the [standards and best practices for creating custom test scenarios](https://github.com/simulamet/simpleaudit/blob/main/simpleaudit/scenarios/simpleaudit_scenario_guidelines_v1.0.md).
|
|
68
68
|
|
|
69
69
|
<img alt="simpleaudit_example_gemma_model" src="https://github.com/user-attachments/assets/05c45a62-74e7-4aa3-a3cd-41bad0cc8233" />
|
|
70
70
|
|
|
@@ -120,7 +120,7 @@ pip install -U simpleaudit[plot]
|
|
|
120
120
|
**Install from GitHub** (for latest development features):
|
|
121
121
|
|
|
122
122
|
```bash
|
|
123
|
-
pip install -U git+https://github.com/
|
|
123
|
+
pip install -U git+https://github.com/simulamet/simpleaudit.git
|
|
124
124
|
```
|
|
125
125
|
|
|
126
126
|
## Quick Start
|
|
@@ -175,7 +175,7 @@ pip install 'simpleaudit[visualize]'
|
|
|
175
175
|
simpleaudit serve --results_dir ./my_audit_results
|
|
176
176
|
```
|
|
177
177
|
This will spin-up a local web server to explore results with scenario details. 👉 [Check for live demo.](https://simulamet-simpleauditvisualization.hf.space)
|
|
178
|
-
See [visualization/README.md](https://github.com/
|
|
178
|
+
See [visualization/README.md](https://github.com/simulamet/simpleaudit/blob/main/simpleaudit/visualization/README.md) for more options and features.
|
|
179
179
|
|
|
180
180
|
To share results as a single self-contained HTML file (no server, no JSON upload), use `simpleaudit export-html ./audit_results.json` or the **Download HTML** button in the visualizer.
|
|
181
181
|
|
|
@@ -188,7 +188,7 @@ If the command fails:
|
|
|
188
188
|
- **Weird import/module error** — stale cache. Run `uv cache clean` and retry.
|
|
189
189
|
</Troubleshooting>
|
|
190
190
|
|
|
191
|
-
[](https://github.com/
|
|
191
|
+
[](https://github.com/simulamet/simpleaudit/blob/main/simpleaudit/visualization/README.md)
|
|
192
192
|
|
|
193
193
|
### Running Experiments
|
|
194
194
|
|
|
@@ -1150,7 +1150,7 @@ Contributions welcome! Areas of interest:
|
|
|
1150
1150
|
- More target adapters
|
|
1151
1151
|
- Documentation improvements
|
|
1152
1152
|
|
|
1153
|
-
Don't hesitate to contact us or [open issues](https://github.com/
|
|
1153
|
+
Don't hesitate to contact us or [open issues](https://github.com/simulamet/simpleaudit/issues) if you have questions, feedback, or encounter any problems.
|
|
1154
1154
|
|
|
1155
1155
|
## Main Contributors
|
|
1156
1156
|
[Michael A. Riegler](https://www.simula.no/people/michael) (Simula) \
|
|
@@ -1190,10 +1190,10 @@ If you use SimpleAudit in research or procurement, please cite the methodology p
|
|
|
1190
1190
|
|
|
1191
1191
|
## Governance & Compliance
|
|
1192
1192
|
|
|
1193
|
-
- 📋 [Digital Public Good Compliance](https://github.com/
|
|
1194
|
-
- 🤝 [Code of Conduct](https://github.com/
|
|
1195
|
-
- 🔒 [Security Policy](https://github.com/
|
|
1193
|
+
- 📋 [Digital Public Good Compliance](https://github.com/simulamet/simpleaudit/blob/main/DPG.md) — SDG alignment, ownership, standards
|
|
1194
|
+
- 🤝 [Code of Conduct](https://github.com/simulamet/simpleaudit/blob/main/CODE_OF_CONDUCT.md) — Community guidelines and responsible use
|
|
1195
|
+
- 🔒 [Security Policy](https://github.com/simulamet/simpleaudit/blob/main/SECURITY.md) — Vulnerability reporting and security considerations
|
|
1196
1196
|
|
|
1197
1197
|
## License
|
|
1198
1198
|
|
|
1199
|
-
MIT License - see [LICENSE](https://github.com/
|
|
1199
|
+
MIT License - see [LICENSE](https://github.com/simulamet/simpleaudit/blob/main/LICENSE) for details.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<div align="center">
|
|
2
2
|
|
|
3
|
-
[](https://www.digitalpublicgoods.net/r/simpleaudit) [](https://pypi.org/project/simpleaudit/) [](https://www.python.org/downloads/) [](https://opensource.org/licenses/MIT) [](https://www.digitalpublicgoods.net/r/simpleaudit) [](https://pypi.org/project/simpleaudit/) [](https://www.python.org/downloads/) [](https://opensource.org/licenses/MIT) [](https://github.com/simulamet/simpleaudit/actions/workflows/tests.yml) [](https://github.com/simulamet/simpleaudit/commits/main)
|
|
4
4
|
|
|
5
5
|
<img width="300px" alt="simpleaudit-logo" src="https://github.com/user-attachments/assets/2ed38ae0-f834-4934-bcc4-48fe441b8b2b" />
|
|
6
6
|
|
|
@@ -16,7 +16,7 @@ Developed by [Simula](https://www.simula.no/) and [SimulaMet](https://www.simula
|
|
|
16
16
|
SimpleAudit is a simple, extensible, local-first framework for multilingual auditing and red-teaming of AI systems via adversarial probing. It supports open models running locally (no APIs required) and can optionally run evaluations against API-hosted models. SimpleAudit does not collect or transmit user data by default and is designed for minimal setup.
|
|
17
17
|
</div>
|
|
18
18
|
|
|
19
|
-
See the [standards and best practices for creating custom test scenarios](https://github.com/
|
|
19
|
+
See the [standards and best practices for creating custom test scenarios](https://github.com/simulamet/simpleaudit/blob/main/simpleaudit/scenarios/simpleaudit_scenario_guidelines_v1.0.md).
|
|
20
20
|
|
|
21
21
|
<img alt="simpleaudit_example_gemma_model" src="https://github.com/user-attachments/assets/05c45a62-74e7-4aa3-a3cd-41bad0cc8233" />
|
|
22
22
|
|
|
@@ -72,7 +72,7 @@ pip install -U simpleaudit[plot]
|
|
|
72
72
|
**Install from GitHub** (for latest development features):
|
|
73
73
|
|
|
74
74
|
```bash
|
|
75
|
-
pip install -U git+https://github.com/
|
|
75
|
+
pip install -U git+https://github.com/simulamet/simpleaudit.git
|
|
76
76
|
```
|
|
77
77
|
|
|
78
78
|
## Quick Start
|
|
@@ -127,7 +127,7 @@ pip install 'simpleaudit[visualize]'
|
|
|
127
127
|
simpleaudit serve --results_dir ./my_audit_results
|
|
128
128
|
```
|
|
129
129
|
This will spin-up a local web server to explore results with scenario details. 👉 [Check for live demo.](https://simulamet-simpleauditvisualization.hf.space)
|
|
130
|
-
See [visualization/README.md](https://github.com/
|
|
130
|
+
See [visualization/README.md](https://github.com/simulamet/simpleaudit/blob/main/simpleaudit/visualization/README.md) for more options and features.
|
|
131
131
|
|
|
132
132
|
To share results as a single self-contained HTML file (no server, no JSON upload), use `simpleaudit export-html ./audit_results.json` or the **Download HTML** button in the visualizer.
|
|
133
133
|
|
|
@@ -140,7 +140,7 @@ If the command fails:
|
|
|
140
140
|
- **Weird import/module error** — stale cache. Run `uv cache clean` and retry.
|
|
141
141
|
</Troubleshooting>
|
|
142
142
|
|
|
143
|
-
[](https://github.com/
|
|
143
|
+
[](https://github.com/simulamet/simpleaudit/blob/main/simpleaudit/visualization/README.md)
|
|
144
144
|
|
|
145
145
|
### Running Experiments
|
|
146
146
|
|
|
@@ -1102,7 +1102,7 @@ Contributions welcome! Areas of interest:
|
|
|
1102
1102
|
- More target adapters
|
|
1103
1103
|
- Documentation improvements
|
|
1104
1104
|
|
|
1105
|
-
Don't hesitate to contact us or [open issues](https://github.com/
|
|
1105
|
+
Don't hesitate to contact us or [open issues](https://github.com/simulamet/simpleaudit/issues) if you have questions, feedback, or encounter any problems.
|
|
1106
1106
|
|
|
1107
1107
|
## Main Contributors
|
|
1108
1108
|
[Michael A. Riegler](https://www.simula.no/people/michael) (Simula) \
|
|
@@ -1142,10 +1142,10 @@ If you use SimpleAudit in research or procurement, please cite the methodology p
|
|
|
1142
1142
|
|
|
1143
1143
|
## Governance & Compliance
|
|
1144
1144
|
|
|
1145
|
-
- 📋 [Digital Public Good Compliance](https://github.com/
|
|
1146
|
-
- 🤝 [Code of Conduct](https://github.com/
|
|
1147
|
-
- 🔒 [Security Policy](https://github.com/
|
|
1145
|
+
- 📋 [Digital Public Good Compliance](https://github.com/simulamet/simpleaudit/blob/main/DPG.md) — SDG alignment, ownership, standards
|
|
1146
|
+
- 🤝 [Code of Conduct](https://github.com/simulamet/simpleaudit/blob/main/CODE_OF_CONDUCT.md) — Community guidelines and responsible use
|
|
1147
|
+
- 🔒 [Security Policy](https://github.com/simulamet/simpleaudit/blob/main/SECURITY.md) — Vulnerability reporting and security considerations
|
|
1148
1148
|
|
|
1149
1149
|
## License
|
|
1150
1150
|
|
|
1151
|
-
MIT License - see [LICENSE](https://github.com/
|
|
1151
|
+
MIT License - see [LICENSE](https://github.com/simulamet/simpleaudit/blob/main/LICENSE) for details.
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "simpleaudit"
|
|
7
|
-
version = "0.3.
|
|
7
|
+
version = "0.3.2"
|
|
8
8
|
description = "Lightweight AI Safety Auditing Framework"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = {text = "MIT"}
|
|
@@ -62,10 +62,10 @@ dev = [
|
|
|
62
62
|
all = ["simpleaudit[plot,visualize,dev]"]
|
|
63
63
|
|
|
64
64
|
[project.urls]
|
|
65
|
-
Homepage = "https://github.com/
|
|
66
|
-
Documentation = "https://github.com/
|
|
67
|
-
Repository = "https://github.com/
|
|
68
|
-
Issues = "https://github.com/
|
|
65
|
+
Homepage = "https://github.com/simulamet/simpleaudit"
|
|
66
|
+
Documentation = "https://github.com/simulamet/simpleaudit#readme"
|
|
67
|
+
Repository = "https://github.com/simulamet/simpleaudit"
|
|
68
|
+
Issues = "https://github.com/simulamet/simpleaudit/issues"
|
|
69
69
|
PyPI = "https://pypi.org/project/simpleaudit/"
|
|
70
70
|
|
|
71
71
|
[tool.setuptools.packages.find]
|
|
@@ -25,6 +25,25 @@
|
|
|
25
25
|
# Author: Michael A. Riegler
|
|
26
26
|
# Date: 2026-03-18
|
|
27
27
|
# License: MIT
|
|
28
|
+
# Copyright (c) 2026 Peter Gostev
|
|
29
|
+
#
|
|
30
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
31
|
+
# of this software and associated documentation files (the "Software"), to deal
|
|
32
|
+
# in the Software without restriction, including without limitation the rights
|
|
33
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
34
|
+
# copies of the Software, and to permit persons to whom the Software is
|
|
35
|
+
# furnished to do so, subject to the following conditions:
|
|
36
|
+
#
|
|
37
|
+
# The above copyright notice and this permission notice shall be included in all
|
|
38
|
+
# copies or substantial portions of the Software.
|
|
39
|
+
#
|
|
40
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
41
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
42
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
43
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
44
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
45
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
46
|
+
# SOFTWARE.
|
|
28
47
|
|
|
29
48
|
BULLSHITBENCH_V1_SCENARIOS = [
|
|
30
49
|
{
|
|
@@ -88,6 +88,7 @@ class ModelTarget:
|
|
|
88
88
|
documents=documents,
|
|
89
89
|
response_format=response_format,
|
|
90
90
|
params=params,
|
|
91
|
+
context=context,
|
|
91
92
|
max_retries=self.max_retries,
|
|
92
93
|
retry_backoff=self.retry_backoff,
|
|
93
94
|
)
|
|
@@ -104,6 +105,7 @@ async def _client_send(
|
|
|
104
105
|
documents: Optional[List[Union[str, Dict[str, Any]]]],
|
|
105
106
|
response_format: Optional[Dict[str, Any]],
|
|
106
107
|
params: Optional[Dict[str, Any]],
|
|
108
|
+
context: Optional[TargetContext] = None,
|
|
107
109
|
max_retries: int,
|
|
108
110
|
retry_backoff: float,
|
|
109
111
|
) -> TargetResponse:
|
|
@@ -111,9 +113,21 @@ async def _client_send(
|
|
|
111
113
|
|
|
112
114
|
Imported lazily so that ``simpleaudit.targets`` does not create an import
|
|
113
115
|
cycle with ``model_auditor`` at package import time.
|
|
116
|
+
|
|
117
|
+
When the per-turn context carries W3C trace headers (e.g. the engine's
|
|
118
|
+
scenario traceparent), they are merged into ``extra_headers`` so the
|
|
119
|
+
target's outgoing call propagates the trace context. This is what lets an
|
|
120
|
+
instrumented target export spans under the same trace id the engine's
|
|
121
|
+
TraceCorrelation records. User-supplied extra_headers are preserved.
|
|
114
122
|
"""
|
|
115
123
|
from ..model_auditor import ModelAuditor
|
|
116
124
|
|
|
125
|
+
if context is not None and context.trace_headers:
|
|
126
|
+
headers = dict(params.get("extra_headers", {}) if params else {})
|
|
127
|
+
headers.update(context.trace_headers)
|
|
128
|
+
params = dict(params or {})
|
|
129
|
+
params["extra_headers"] = headers
|
|
130
|
+
|
|
117
131
|
content, input_tokens, output_tokens = await ModelAuditor._call_async(
|
|
118
132
|
client,
|
|
119
133
|
model,
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: simpleaudit
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.2
|
|
4
4
|
Summary: Lightweight AI Safety Auditing Framework
|
|
5
5
|
Author: SimpleAudit Contributors
|
|
6
6
|
License: MIT
|
|
7
|
-
Project-URL: Homepage, https://github.com/
|
|
8
|
-
Project-URL: Documentation, https://github.com/
|
|
9
|
-
Project-URL: Repository, https://github.com/
|
|
10
|
-
Project-URL: Issues, https://github.com/
|
|
7
|
+
Project-URL: Homepage, https://github.com/simulamet/simpleaudit
|
|
8
|
+
Project-URL: Documentation, https://github.com/simulamet/simpleaudit#readme
|
|
9
|
+
Project-URL: Repository, https://github.com/simulamet/simpleaudit
|
|
10
|
+
Project-URL: Issues, https://github.com/simulamet/simpleaudit/issues
|
|
11
11
|
Project-URL: PyPI, https://pypi.org/project/simpleaudit/
|
|
12
12
|
Keywords: ai,safety,audit,red-team,llm,rag,testing
|
|
13
13
|
Classifier: Development Status :: 4 - Beta
|
|
@@ -48,7 +48,7 @@ Dynamic: license-file
|
|
|
48
48
|
|
|
49
49
|
<div align="center">
|
|
50
50
|
|
|
51
|
-
[](https://www.digitalpublicgoods.net/r/simpleaudit) [](https://pypi.org/project/simpleaudit/) [](https://www.python.org/downloads/) [](https://opensource.org/licenses/MIT) [](https://www.digitalpublicgoods.net/r/simpleaudit) [](https://pypi.org/project/simpleaudit/) [](https://www.python.org/downloads/) [](https://opensource.org/licenses/MIT) [](https://github.com/simulamet/simpleaudit/actions/workflows/tests.yml) [](https://github.com/simulamet/simpleaudit/commits/main)
|
|
52
52
|
|
|
53
53
|
<img width="300px" alt="simpleaudit-logo" src="https://github.com/user-attachments/assets/2ed38ae0-f834-4934-bcc4-48fe441b8b2b" />
|
|
54
54
|
|
|
@@ -64,7 +64,7 @@ Developed by [Simula](https://www.simula.no/) and [SimulaMet](https://www.simula
|
|
|
64
64
|
SimpleAudit is a simple, extensible, local-first framework for multilingual auditing and red-teaming of AI systems via adversarial probing. It supports open models running locally (no APIs required) and can optionally run evaluations against API-hosted models. SimpleAudit does not collect or transmit user data by default and is designed for minimal setup.
|
|
65
65
|
</div>
|
|
66
66
|
|
|
67
|
-
See the [standards and best practices for creating custom test scenarios](https://github.com/
|
|
67
|
+
See the [standards and best practices for creating custom test scenarios](https://github.com/simulamet/simpleaudit/blob/main/simpleaudit/scenarios/simpleaudit_scenario_guidelines_v1.0.md).
|
|
68
68
|
|
|
69
69
|
<img alt="simpleaudit_example_gemma_model" src="https://github.com/user-attachments/assets/05c45a62-74e7-4aa3-a3cd-41bad0cc8233" />
|
|
70
70
|
|
|
@@ -120,7 +120,7 @@ pip install -U simpleaudit[plot]
|
|
|
120
120
|
**Install from GitHub** (for latest development features):
|
|
121
121
|
|
|
122
122
|
```bash
|
|
123
|
-
pip install -U git+https://github.com/
|
|
123
|
+
pip install -U git+https://github.com/simulamet/simpleaudit.git
|
|
124
124
|
```
|
|
125
125
|
|
|
126
126
|
## Quick Start
|
|
@@ -175,7 +175,7 @@ pip install 'simpleaudit[visualize]'
|
|
|
175
175
|
simpleaudit serve --results_dir ./my_audit_results
|
|
176
176
|
```
|
|
177
177
|
This will spin-up a local web server to explore results with scenario details. 👉 [Check for live demo.](https://simulamet-simpleauditvisualization.hf.space)
|
|
178
|
-
See [visualization/README.md](https://github.com/
|
|
178
|
+
See [visualization/README.md](https://github.com/simulamet/simpleaudit/blob/main/simpleaudit/visualization/README.md) for more options and features.
|
|
179
179
|
|
|
180
180
|
To share results as a single self-contained HTML file (no server, no JSON upload), use `simpleaudit export-html ./audit_results.json` or the **Download HTML** button in the visualizer.
|
|
181
181
|
|
|
@@ -188,7 +188,7 @@ If the command fails:
|
|
|
188
188
|
- **Weird import/module error** — stale cache. Run `uv cache clean` and retry.
|
|
189
189
|
</Troubleshooting>
|
|
190
190
|
|
|
191
|
-
[](https://github.com/
|
|
191
|
+
[](https://github.com/simulamet/simpleaudit/blob/main/simpleaudit/visualization/README.md)
|
|
192
192
|
|
|
193
193
|
### Running Experiments
|
|
194
194
|
|
|
@@ -1150,7 +1150,7 @@ Contributions welcome! Areas of interest:
|
|
|
1150
1150
|
- More target adapters
|
|
1151
1151
|
- Documentation improvements
|
|
1152
1152
|
|
|
1153
|
-
Don't hesitate to contact us or [open issues](https://github.com/
|
|
1153
|
+
Don't hesitate to contact us or [open issues](https://github.com/simulamet/simpleaudit/issues) if you have questions, feedback, or encounter any problems.
|
|
1154
1154
|
|
|
1155
1155
|
## Main Contributors
|
|
1156
1156
|
[Michael A. Riegler](https://www.simula.no/people/michael) (Simula) \
|
|
@@ -1190,10 +1190,10 @@ If you use SimpleAudit in research or procurement, please cite the methodology p
|
|
|
1190
1190
|
|
|
1191
1191
|
## Governance & Compliance
|
|
1192
1192
|
|
|
1193
|
-
- 📋 [Digital Public Good Compliance](https://github.com/
|
|
1194
|
-
- 🤝 [Code of Conduct](https://github.com/
|
|
1195
|
-
- 🔒 [Security Policy](https://github.com/
|
|
1193
|
+
- 📋 [Digital Public Good Compliance](https://github.com/simulamet/simpleaudit/blob/main/DPG.md) — SDG alignment, ownership, standards
|
|
1194
|
+
- 🤝 [Code of Conduct](https://github.com/simulamet/simpleaudit/blob/main/CODE_OF_CONDUCT.md) — Community guidelines and responsible use
|
|
1195
|
+
- 🔒 [Security Policy](https://github.com/simulamet/simpleaudit/blob/main/SECURITY.md) — Vulnerability reporting and security considerations
|
|
1196
1196
|
|
|
1197
1197
|
## License
|
|
1198
1198
|
|
|
1199
|
-
MIT License - see [LICENSE](https://github.com/
|
|
1199
|
+
MIT License - see [LICENSE](https://github.com/simulamet/simpleaudit/blob/main/LICENSE) for details.
|
|
@@ -75,6 +75,40 @@ async def test_model_target_client_mode():
|
|
|
75
75
|
assert client.calls[0]["model"] == "m"
|
|
76
76
|
|
|
77
77
|
|
|
78
|
+
@pytest.mark.asyncio
|
|
79
|
+
async def test_model_target_client_mode_forwards_trace_headers():
|
|
80
|
+
"""trace_headers on the per-turn context reach the wire as extra_headers."""
|
|
81
|
+
client = _FakeClient()
|
|
82
|
+
t = ModelTarget(client=client, model="m")
|
|
83
|
+
ctx = TargetContext(trace_headers={"traceparent": "00-11223344556677889900112233445566-abcdef0123456789-01"})
|
|
84
|
+
await t.send(user="hi", context=ctx)
|
|
85
|
+
assert client.calls[0]["extra_headers"] == {
|
|
86
|
+
"traceparent": "00-11223344556677889900112233445566-abcdef0123456789-01"
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
@pytest.mark.asyncio
|
|
91
|
+
async def test_model_target_trace_headers_merge_with_user_params():
|
|
92
|
+
"""User-supplied extra_headers and the framework's trace headers coexist."""
|
|
93
|
+
client = _FakeClient()
|
|
94
|
+
t = ModelTarget(client=client, model="m")
|
|
95
|
+
ctx = TargetContext(trace_headers={"traceparent": "00-11223344556677889900112233445566-abcdef0123456789-01"})
|
|
96
|
+
await t.send(user="hi", params={"extra_headers": {"X-Custom": "1"}}, context=ctx)
|
|
97
|
+
assert client.calls[0]["extra_headers"] == {
|
|
98
|
+
"X-Custom": "1",
|
|
99
|
+
"traceparent": "00-11223344556677889900112233445566-abcdef0123456789-01",
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
@pytest.mark.asyncio
|
|
104
|
+
async def test_model_target_no_context_no_extra_headers():
|
|
105
|
+
"""Without a context the call is byte-identical to the legacy path."""
|
|
106
|
+
client = _FakeClient()
|
|
107
|
+
t = ModelTarget(client=client, model="m")
|
|
108
|
+
await t.send(user="hi")
|
|
109
|
+
assert "extra_headers" not in client.calls[0]
|
|
110
|
+
|
|
111
|
+
|
|
78
112
|
@pytest.mark.asyncio
|
|
79
113
|
async def test_model_target_transport_mode():
|
|
80
114
|
async def transport(**kw):
|
|
@@ -324,3 +358,38 @@ def test_engine_forwards_traceparent_and_records_correlation():
|
|
|
324
358
|
assert parts[3] == "01"
|
|
325
359
|
# The correlation recorded at least one turn -> trace link.
|
|
326
360
|
assert correlation.all_trace_ids()
|
|
361
|
+
|
|
362
|
+
|
|
363
|
+
def test_engine_traceparent_reaches_wire_on_default_target():
|
|
364
|
+
"""With the default ModelTarget (no override), the scenario's traceparent
|
|
365
|
+
is forwarded on the target's outgoing acompletion as extra_headers."""
|
|
366
|
+
import asyncio
|
|
367
|
+
|
|
368
|
+
from simpleaudit.tracing.context import TraceCorrelation
|
|
369
|
+
from tests.fakes import fixed_probe_auditor, fixed_severity_judge, make_auditor
|
|
370
|
+
|
|
371
|
+
client = _FakeClient()
|
|
372
|
+
auditor = make_auditor(
|
|
373
|
+
target=client,
|
|
374
|
+
judge=fixed_severity_judge("pass"),
|
|
375
|
+
auditor=fixed_probe_auditor("probe"),
|
|
376
|
+
max_turns=2,
|
|
377
|
+
show_progress=False,
|
|
378
|
+
)
|
|
379
|
+
|
|
380
|
+
correlation = TraceCorrelation(audit_run_id="audit_test")
|
|
381
|
+
scenarios = [{"name": "Wire", "description": "wire traceparent test"}]
|
|
382
|
+
asyncio.run(
|
|
383
|
+
auditor.run_async(
|
|
384
|
+
scenarios=scenarios,
|
|
385
|
+
max_turns=2,
|
|
386
|
+
audit_run_id="audit_test",
|
|
387
|
+
trace_correlation=correlation,
|
|
388
|
+
)
|
|
389
|
+
)
|
|
390
|
+
|
|
391
|
+
assert client.calls
|
|
392
|
+
last = client.calls[-1]
|
|
393
|
+
tp = last["extra_headers"]["traceparent"]
|
|
394
|
+
# Same trace id the correlation recorded, not a fresh unrelated one.
|
|
395
|
+
assert tp.split("-")[1] in correlation.all_trace_ids()
|
|
@@ -422,6 +422,26 @@ def test_parse_otlp_json_string_body():
|
|
|
422
422
|
assert len(spans) == 1
|
|
423
423
|
|
|
424
424
|
|
|
425
|
+
def test_parse_otlp_json_preserves_genai_content_attributes():
|
|
426
|
+
payload = _otlp_http_payload()
|
|
427
|
+
payload["resourceSpans"][0]["scopeSpans"][0]["spans"][0]["attributes"].extend(
|
|
428
|
+
[
|
|
429
|
+
{"key": "gen_ai.input.messages", "value": {"stringValue": "user prompt"}},
|
|
430
|
+
{"key": "gen_ai.output.messages", "value": {"stringValue": "assistant output"}},
|
|
431
|
+
{"key": "gen_ai.tool.call.arguments", "value": {"stringValue": '{"x":1}'}},
|
|
432
|
+
{
|
|
433
|
+
"key": "gen_ai.retrieval.documents",
|
|
434
|
+
"value": {"arrayValue": {"values": [{"stringValue": "document text"}]}},
|
|
435
|
+
},
|
|
436
|
+
]
|
|
437
|
+
)
|
|
438
|
+
span = parse_otlp_json(payload)[0]
|
|
439
|
+
assert span["attributes"]["gen_ai.input.messages"] == "user prompt"
|
|
440
|
+
assert span["attributes"]["gen_ai.output.messages"] == "assistant output"
|
|
441
|
+
assert span["attributes"]["gen_ai.tool.call.arguments"] == '{"x":1}'
|
|
442
|
+
assert span["attributes"]["gen_ai.retrieval.documents"] == ["document text"]
|
|
443
|
+
|
|
444
|
+
|
|
425
445
|
@pytest.mark.asyncio
|
|
426
446
|
async def test_otlp_receiver_ingests():
|
|
427
447
|
receiver = OTLPTraceReceiver()
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|