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; httpx is 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/docs on 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 text

CLI

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 sync

OpenTelemetry, 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-demo

Sign in as demo@euvyra.local. For Kubernetes, install deploy/helm/euvyra with an existing secret; the operations guide in the repository lists every setting.