Contributing to AIDRIN
We welcome your contributions to AIDRIN! This guide outlines the essential steps and rules to follow when contributing.
Quick Start
Fork the repository.
Create a branch from
develop. Do not create branches in the main repo without prior discussion.Work on your changes.
Install and run pre-commit hooks:
pip install pre-commit pre-commit install pre-commit run --all-files
Submit a pull request to
developwith all required items (see below).
Coding Standards
Follow PEP8 style; our CI enforces it.
Run pre-commit to auto-format and lint your code before committing.
Include tests for new features (unit, integration, examples). See Testing for how to run the test suite.
Document your code using proper docstrings:
L1 (mandatory): summary, params, returns, exceptions, TODOs
L2 (optional): algorithms, data structures, complex logic
Pull Request Guidelines
Every PR must:
Be linked to an issue.
Use the default PR template.
Pass all CI checks.
Include tests and documentation if applicable.
Be updated with the latest
develop.
Merging Rules:
developbranch: 1 approval requiredmainbranch: 2 approvals requiredDefault to Squash and Merge
Issues and Labels
Before you begin:
Make sure your issue is labeled properly.
Use the correct issue template (bug, feature, install, usage).
Every change starts with an issue.
OpenTelemetry (Optional)
AIDRIN supports optional OpenTelemetry tracing for monitoring metric evaluation performance.
Installation (from local source):
# From the project root:
pip install -e ".[telemetry]"
# Or with dev tools as well:
pip install -e ".[telemetry,dev]"
When the telemetry packages are not installed (plain pip install -e .), all tracing
is a no-op with zero overhead.
Configuration via environment variables:
OTEL_EXPORTER_OTLP_ENDPOINT— collector endpoint (e.g.,http://localhost:4317). If not set, traces go to console.OTEL_SERVICE_NAME— service name (defaults toaidrin).
What gets traced:
Every HTTP request (automatic via Flask instrumentation)
Each metric evaluation with attributes:
metric.name,metric.pillar,metric.duration_msFile metadata:
file.name,file.type
Quick test (console output):
pip install -e ".[telemetry]"
flask --app 'web:create_app()' run --debug
Run a metric and observe trace spans printed to the terminal.
Test with Jaeger:
# Start Jaeger (Docker)
docker run -d --name jaeger \
-p 16686:16686 -p 4317:4317 \
jaegertracing/all-in-one:latest
# Start AIDRIN with OTLP exporter
OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4317 \
flask --app 'web:create_app()' run --debug
# Open Jaeger UI at http://localhost:16686, select service "aidrin"
Verify installation:
# With OTel installed:
python -c "from web.telemetry import get_tracer; print(type(get_tracer()).__name__)"
# → "Tracer"
# Without OTel:
# → "_NoOpTracer"
Globus Compute (Optional)
AIDRIN supports remote metric execution via Globus Compute, allowing you to evaluate large datasets without transferring files to the AIDRIN server.
Installation:
pip install -e ".[globus]"
Setup:
Register an application at https://developers.globus.org/
Set the environment variable:
export GLOBUS_CLIENT_ID=<your-client-id>
The remote Globus Compute endpoint must have
aidrininstalled:pip install aidrin
Setting up a Globus Compute Endpoint:
On the remote machine where your data is located:
# Install the endpoint software and aidrin
pip install globus-compute-endpoint aidrin
# Configure a new endpoint
globus-compute-endpoint configure aidrin-endpoint
# Start the endpoint
globus-compute-endpoint start aidrin-endpoint
# Get the endpoint UUID (copy this for the inspector)
globus-compute-endpoint list
For local testing, you can run an endpoint on the same machine:
pip install globus-compute-endpoint
globus-compute-endpoint configure test-local
globus-compute-endpoint start test-local
Stop an endpoint with globus-compute-endpoint stop <name>.
Requirements for the remote endpoint:
aidrinmust be installed (pip install aidrin)Network access to authenticate with Globus
The file path entered in the inspector must be accessible from the endpoint machine
Usage:
In the inspector, select the “Remote (Globus)” tab
Click “Sign in with Globus” (redirects to Globus Auth)
Paste the Globus Compute endpoint UUID
Enter the file path as it exists on the remote machine (e.g.,
/home/user/data/adult.csv)Select the file type and click “Load Remote Dataset”
Run metrics as usual — computation happens on the remote endpoint, only results travel back
LLM Explanations (Optional)
AIDRIN supports optional AI-generated explanations of metric results using any OpenAI-compatible API (OpenAI, Azure OpenAI, Ollama, vLLM, etc.).
Installation:
pip install -e ".[llm]"
When the openai package is not installed, the feature is hidden in the UI
with zero overhead.
How it works:
Click the sparkle icon in the top-right toolbar to open the AI settings.
Enter the API base URL, API key, and model name.
Click Test to verify the connection. If successful, click Save.
From that point on, every metric result will show an “AI Explanation” callout below the results with a short LLM-generated interpretation.
Configuration details:
API Base URL — the base URL of the OpenAI-compatible API (default:
https://api.openai.com/v1). For Ollama, usehttp://localhost:11434/v1.API Key — your API key. Stored in the server-side Flask session only; never exposed in client-side JavaScript or logs.
Model — the model identifier (e.g.,
gpt-4o-mini,llama3,claude-3-haiku-20240307).
What gets sent to the LLM:
The metric name and description (context)
The metric scores/values (JSON)
The plot image (base64 PNG), if the model supports vision
If the model does not support vision (returns empty with an image), AIDRIN automatically retries with text-only input. The model name is displayed in the explanation callout for transparency.
Architecture:
web/llm.py— optional dependency detection andexplain_metric()web/routes/llm.py— Flask routes:/llm/configure,/llm/test,/llm/explain,/llm/status,/llm/disconnectweb/templates/_components/llm_settings.html— settings modalLLM calls happen server-side, after the metric result is rendered; the explanation loads asynchronously without blocking results
Testing with Ollama (local, no API key needed):
# Install and start Ollama
ollama serve
ollama pull llama3
# In AIDRIN settings:
# API Base URL: http://localhost:11434/v1
# API Key: ollama (any non-empty string)
# Model: llama3
Debugging the Web Interface
AIDRIN’s inspector UI includes debug logging that is disabled by default to keep the browser console clean. To enable verbose logging during development:
Open the browser’s developer console (F12 → Console).
Run:
localStorage.setItem("aidrin_debug", "true");
Reload the page. All internal log messages will now appear prefixed with
[aidrin].
To disable debug logging again:
localStorage.removeItem("aidrin_debug");
This affects main.js debug output. Errors (console.error) are always shown regardless of this setting.
Thank you for contributing to AIDRIN!