Skip to main content
We’ve created a Neptune Scale compatibility layer that enables dual-logging to both Neptune Scale and Pluto simultaneously. This allows you to gradually migrate your experiment tracking without disrupting existing workflows.
The compatibility layer targets Neptune Scale (neptune-scale package), not the legacy Neptune client (neptune package). If you are still on the legacy Neptune client, you will need to migrate to Neptune Scale first.
We are working on a tool to migrate your existing runs from Neptune to Pluto. Interested? Please contact us at founders@trainy.ai

Quick Start

Enable dual-logging by adding a single import to your existing Neptune Scale scripts:
import pluto.compat.neptune  # Add this line
from neptune_scale import Run  # Your existing Neptune Scale import

# Your existing Neptune Scale code works unchanged
run = Run(experiment_name="my-experiment")
run.log_configs({"lr": 0.001, "batch_size": 32})
run.log_metrics({"train/loss": 0.5}, step=0)
run.close()
That’s it. Your metrics will now log to both Neptune Scale and Pluto.

Configuration

Required Environment Variable

VariableDescription
PLUTO_PROJECTMaster switch that enables dual-logging. Set to your Pluto project name.
export PLUTO_PROJECT="my-pluto-project"

Optional Environment Variables

VariableDescription
PLUTO_API_KEYAuthentication credentials. Falls back to keyring if not set.
PLUTO_URL_APPApp endpoint for self-hosted instances
PLUTO_URL_APIAPI endpoint for self-hosted instances
PLUTO_URL_INGESTIngest endpoint for self-hosted instances
DISABLE_NEPTUNE_LOGGINGSet to true to disable Neptune logging entirely (post-sunset mode)

Supported Operations

The compatibility layer wraps Neptune Scale API calls and translates them to the equivalent pluto calls. Below are the Neptune Scale Run APIs and the corresponding pluto API we monkeypatch against.
import pluto.compat.neptune should be sufficient for sending data to both Neptune Scale and Pluto. The information below is purely informational about which APIs we have wrapped.
The compatibility layer is tested against Neptune Scale 3 (neptune-scale>=0.30.0).

Initialization

Neptune Scalepluto
Run(experiment_name="my-experiment")pluto.init(name="my-experiment")

Configs

Neptune Scalepluto
run.log_configs({"lr": 0.001})run.update_config({"lr": 0.001})

Metric Logging

Neptune Scalepluto
run.log_metrics({"train/loss": 0.5}, step=0)run.log({"train/loss": 0.5}, step=0)
run.log_metrics({"train/loss": 0.5}, step=100)run.log({"train/loss": 0.5}, step=100)

File and Image Logging

Neptune Scalepluto
run.assign_files({"images": File("path/to/image.png")})run.log({"images": pluto.Image("path/to/image.png")})
run.log_files({"artifacts": File("path/to/file")}, step=0)run.log({"artifacts": pluto.Artifact("path/to/file")})

Tags

Neptune Scalepluto
run.add_tags(tags=["experiment-v1"])run.add_tags(["experiment-v1"])
Tags are synchronized to the Pluto server and can be used to filter and organize runs in the dashboard.

Histograms

Neptune Scalepluto
run.log_histograms({"distributions/weights": Histogram(...)}, step=0)run.log({"distributions/weights": pluto.Histogram(...)})

Post-Sunset Mode

When you’re ready to stop sending data to Neptune Scale, set the kill switch:
export DISABLE_NEPTUNE_LOGGING=true
This converts your code to Pluto-only mode without requiring any code changes. All Neptune Scale API calls will be intercepted and redirected to Pluto.