Developers
Built to be driven from code.
A Python SDK with one required dependency, a CLI for jobs, sweeps, evaluations and evidence, an OTLP endpoint for the instrumentation you already have, an MCP server for AI assistants, and a REST API for everything else.
Ways in
Python SDK
pip install euvyra: experiment tracking, tracing, evaluations, prompts, datasets and sweeps. Python 3.9 or newer;httpxis the only required dependency.CLI
Jobs, sweeps and agents, evaluation gates for CI, offline evidence verification, importers for W&B and MLflow, and sync for offline runs.
OpenTelemetry
OTLP/HTTP in protobuf or JSON. GenAI semantic conventions and OpenInference attributes map to span kinds, models, tokens and content.
OpenAI-compatible gateway
Chat, completions and embeddings for approved releases at
/v1, plus the Anthropic Messages format. Existing clients change their base URL.MCP server
Claude, ChatGPT, Cursor, VS Code and other clients sign in with OAuth and work as the person who connected them.
REST API and webhooks
About 200 operations with an OpenAPI reference at
/api/docson every installation, and signed webhooks for runs, evaluations, releases, incidents and endpoints.
Python SDK
Wrap a training loop in euvyra.init() and the SDK records configuration, metrics, git state, system load and the model file, batched in a background thread. Decorate functions with @euvyra.observe to trace agents and pipelines, sync or async.
Evaluations run your model or agent locally on every test case and leave the scoring to the server, so every number a release gate depends on comes from the same evaluator code. result.raise_for_gate() fails the build.
Callbacks for Hugging Face Transformers, PyTorch Lightning, Keras 3, XGBoost, LightGBM and scikit-learn are tested against the real libraries. OpenAI-compatible clients, including vLLM and Mistral, are traced with one instrument() call.
import euvyra
euvyra.configure(project="support-bot", environment="production")
@euvyra.observe(kind="retrieval")
def retrieve(query): ...
@euvyra.observe(name="support-agent", kind="agent")
def answer(question):
docs = retrieve(question)
with euvyra.generation("chat", model="eu-large-2", input=docs) as g:
text = call_model(docs)
g.update(output=text, usage={"input_tokens": 812, "output_tokens": 95})
return textCLI
The euvyra command ships with the SDK. It stores the host and API key in a config file readable only by you, or reads EUVYRA_HOST and EUVYRA_API_KEY.
euvyra eval run scores a file of precomputed outputs against a test suite and exits non-zero when the gate fails, which is all a CI pipeline needs to block a merge. The repository has a GitHub Actions example.
euvyra launch --wait streams the job's log and exits with the job's result, so a training job behaves like a local command in scripts.
pip install euvyra
euvyra login --host https://euvyra.example.eu --api-key euv_...
euvyra launch --project medical-ai --image registry.example.eu/ml/train:1.4 \
--gpus 1 --nodes 2 --wait -- python train.py
euvyra sweep create sweep.yaml --project medical-ai
euvyra agent swp_... --count 10 -- python train.py
euvyra eval run --project support-bot --suite support-regression --outputs outputs.jsonl
euvyra evidence verify package.zip --public-key installation.pem
euvyra import wandb acme/chest-xray --project medical-ai
euvyra import mlflow ./mlruns --project medical-ai
euvyra syncOpenTelemetry, no SDK needed
Services that already emit OpenTelemetry point their exporter at /api/otlp/v1/traces and send a project API key as a bearer token. The server applies the project's privacy policy, prices tokens from your price list and rolls spans up into traces, exactly as for SDK spans.
An organization-wide key can name the project with an x-euvyra-project header.
export OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=https://euvyra.example.eu/api/otlp/v1/traces
export OTEL_EXPORTER_OTLP_TRACES_HEADERS=Authorization=Bearer%20euv_...AI assistants over MCP
The MCP endpoint is the console's address followed by /mcp. Signing in opens a consent page that names the client and asks for read-only or read-and-change access, and the connection can be ended at any time.
Forty-eight tools cover orientation, experiments, compute, cloud, serving, LLM applications and governance; three generic tools reach the rest of the API. Approvals, incident classification, erasure, access changes and anything that spends money are refused and handed back to a person.
Clients that can only start a command run euvyra mcp with an API key instead.
claude mcp add --transport http euvyra https://euvyra.example.eu/mcp
# Cursor, VS Code and other clients:
# {"mcpServers": {"euvyra": {"url": "https://euvyra.example.eu/mcp"}}}Run it yourself
Docker Compose starts PostgreSQL, S3-compatible storage, the API, the worker and the console. The demo seed fills an organization with realistic runs, traces, evaluations, releases, approvals and an incident.
# fill in the secrets first
cp deploy/.env.example deploy/.env
docker compose -f deploy/docker-compose.yml up -d --build
docker compose -f deploy/docker-compose.yml exec api euvyra-server seed-demoSign in as demo@euvyra.local. For Kubernetes, install deploy/helm/euvyra with an existing secret; the operations guide in the repository lists every setting.