From bdab58b3ad647057b7211a26e0be236f7634a63e Mon Sep 17 00:00:00 2001 From: nicoowr Date: Wed, 25 Feb 2026 16:51:46 +0100 Subject: [PATCH] refactor: standardize by renaming PLUTO_API_TOKEN to PLUTO_API_KEY --- .github/workflows/k8s-multinode-test.yml | 2 +- .github/workflows/neptune-compat.yml | 4 ++-- CLAUDE.md | 4 ++-- docs/SYNC_PROCESS_V2_ARCHITECTURE.md | 2 +- pluto/query.py | 10 +++++----- pluto/sets.py | 4 ++-- tests/k8s/README.md | 2 +- tests/k8s/multinode_worker.py | 6 +++--- tests/k8s/run_multinode_test.sh | 6 +++--- tests/test_query.py | 16 ++++++++-------- 10 files changed, 28 insertions(+), 28 deletions(-) diff --git a/.github/workflows/k8s-multinode-test.yml b/.github/workflows/k8s-multinode-test.yml index ff3ed3c..0b6828e 100644 --- a/.github/workflows/k8s-multinode-test.yml +++ b/.github/workflows/k8s-multinode-test.yml @@ -49,7 +49,7 @@ jobs: - name: Run k8s multinode E2E test env: - PLUTO_API_TOKEN: ${{ secrets.MLOP_API_TOKEN }} + PLUTO_API_KEY: ${{ secrets.MLOP_API_TOKEN }} PLUTO_DEBUG_LEVEL: DEBUG run: | set -euox pipefail diff --git a/.github/workflows/neptune-compat.yml b/.github/workflows/neptune-compat.yml index 8a7f25d..449e8cb 100644 --- a/.github/workflows/neptune-compat.yml +++ b/.github/workflows/neptune-compat.yml @@ -83,10 +83,10 @@ jobs: - name: Setup pluto credentials for dual-logging tests env: - PLUTO_API_TOKEN: ${{ secrets.MLOP_API_TOKEN }} + PLUTO_API_KEY: ${{ secrets.MLOP_API_TOKEN }} run: | set -euox pipefail - poetry run pluto login "${PLUTO_API_TOKEN}" + poetry run pluto login "${PLUTO_API_KEY}" - name: Run Neptune dual-logging integration tests env: diff --git a/CLAUDE.md b/CLAUDE.md index 6582bbb..8b59ac0 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -291,7 +291,7 @@ Settings can be provided via: Environment variables use the `PLUTO_*` prefix. The old `MLOP_*` prefix is supported with deprecation warnings. **Authentication & Project:** -- `PLUTO_API_TOKEN` - API token for authentication (alternative to `pluto login`) +- `PLUTO_API_KEY` - API token for authentication (alternative to `pluto login`) - `PLUTO_PROJECT` - Default project name (alternative to `pluto.init(project="...")`) **Configuration:** @@ -303,7 +303,7 @@ Environment variables use the `PLUTO_*` prefix. The old `MLOP_*` prefix is suppo ### Testing Notes - Tests run against production server by default -- Requires authentication via `PLUTO_API_TOKEN` environment variable +- Requires authentication via `PLUTO_API_KEY` environment variable - Tests marked with `@pytest.mark.distributed` require multi-rank torch setup - Use `HAS_TORCH`, `HAS_MATPLOTLIB` flags for optional dependency tests diff --git a/docs/SYNC_PROCESS_V2_ARCHITECTURE.md b/docs/SYNC_PROCESS_V2_ARCHITECTURE.md index aeface0..5309c69 100644 --- a/docs/SYNC_PROCESS_V2_ARCHITECTURE.md +++ b/docs/SYNC_PROCESS_V2_ARCHITECTURE.md @@ -376,7 +376,7 @@ $ pluto finish my-experiment-20240115 --force ```python # Environment variables (for containerized training) PLUTO_PROJECT=my-project -PLUTO_API_TOKEN=xxx +PLUTO_API_KEY=xxx PLUTO_RUN_DIR=/tmp/pluto-runs # Where to store local data PLUTO_SYNC_MODE=process # process | thread | offline diff --git a/pluto/query.py b/pluto/query.py index ee2a47a..25d0aee 100644 --- a/pluto/query.py +++ b/pluto/query.py @@ -8,7 +8,7 @@ import pluto.query as pq - # Uses PLUTO_API_TOKEN env var and default server + # Uses PLUTO_API_KEY env var and default server runs = pq.list_runs("my-project") run = pq.get_run("my-project", "MMP-42") metrics = pq.get_metrics("my-project", run["id"], metric_names=["val/loss"]) @@ -49,7 +49,7 @@ class Client: """HTTP client for reading data from the Pluto server. Args: - api_token: API token for authentication. Defaults to ``PLUTO_API_TOKEN`` + api_token: API token for authentication. Defaults to ``PLUTO_API_KEY`` environment variable. host: Server URL (e.g. ``https://pluto.trainy.ai`` or ``https://pluto-api.trainy.ai``). When a bare hostname or @@ -68,7 +68,7 @@ def __init__( self._api_token = api_token or _resolve_api_token() if not self._api_token: raise QueryError( - 'No API token provided. Set PLUTO_API_TOKEN environment variable ' + 'No API token provided. Set PLUTO_API_KEY environment variable ' 'or pass api_token to Client().' ) @@ -637,7 +637,7 @@ def get_logs( def _resolve_api_token() -> Optional[str]: """Resolve API token from environment or keyring.""" - token = os.environ.get('PLUTO_API_TOKEN') + token = os.environ.get('PLUTO_API_KEY') if token: return token @@ -645,7 +645,7 @@ def _resolve_api_token() -> Optional[str]: token = os.environ.get('MLOP_API_TOKEN') if token: warnings.warn( - 'MLOP_API_TOKEN is deprecated. Use PLUTO_API_TOKEN instead.', + 'MLOP_API_TOKEN is deprecated. Use PLUTO_API_KEY instead.', DeprecationWarning, stacklevel=3, ) diff --git a/pluto/sets.py b/pluto/sets.py index f5861d3..a23db81 100644 --- a/pluto/sets.py +++ b/pluto/sets.py @@ -258,9 +258,9 @@ def setup(settings: Union[Settings, Dict[str, Any], None] = None) -> Settings: env_value if env_value is not None else default_value ) - # Read PLUTO_API_TOKEN environment variable (with MLOP_API_TOKEN fallback) + # Read PLUTO_API_KEY environment variable (with MLOP_API_TOKEN fallback) # Only apply if not already set via function parameters - env_api_token = _get_env_with_deprecation('PLUTO_API_TOKEN', 'MLOP_API_TOKEN') + env_api_token = _get_env_with_deprecation('PLUTO_API_KEY', 'MLOP_API_TOKEN') if env_api_token is not None and '_auth' not in settings_dict: new_settings._auth = env_api_token diff --git a/tests/k8s/README.md b/tests/k8s/README.md index 478a327..1b65f39 100644 --- a/tests/k8s/README.md +++ b/tests/k8s/README.md @@ -9,7 +9,7 @@ Verifies that multiple nodes in a konduktor job can log to the same Pluto run vi ## Running ```bash -export PLUTO_API_TOKEN="your-token" +export PLUTO_API_KEY="your-token" ./tests/k8s/run_multinode_test.sh ``` diff --git a/tests/k8s/multinode_worker.py b/tests/k8s/multinode_worker.py index f318af9..e54b7d3 100644 --- a/tests/k8s/multinode_worker.py +++ b/tests/k8s/multinode_worker.py @@ -6,7 +6,7 @@ Environment variables (set by konduktor): - PLUTO_RUN_ID: Shared run ID for all nodes -- PLUTO_API_TOKEN: API token for authentication +- PLUTO_API_KEY: API token for authentication - MASTER_ADDR: Address of the master node - NUM_NODES: Total number of nodes - RANK: Global rank of this node (0, 1, 2, ...) @@ -47,8 +47,8 @@ def main(): print(f'[Node {rank}] ERROR: PLUTO_RUN_ID not set!') sys.exit(1) - if not os.environ.get('PLUTO_API_TOKEN'): - print(f'[Node {rank}] ERROR: PLUTO_API_TOKEN not set!') + if not os.environ.get('PLUTO_API_KEY'): + print(f'[Node {rank}] ERROR: PLUTO_API_KEY not set!') sys.exit(1) # Initialize Pluto with shared run_id diff --git a/tests/k8s/run_multinode_test.sh b/tests/k8s/run_multinode_test.sh index 298af45..635f1b8 100755 --- a/tests/k8s/run_multinode_test.sh +++ b/tests/k8s/run_multinode_test.sh @@ -5,7 +5,7 @@ # # Prerequisites: # - docker, kind, kubectl -# - PLUTO_API_TOKEN environment variable +# - PLUTO_API_KEY environment variable # # Options: # - KEEP_CLUSTER=true to keep cluster after test @@ -83,7 +83,7 @@ check_prerequisites() { command -v docker &>/dev/null || error "docker not installed" command -v kind &>/dev/null || error "kind not installed" command -v kubectl &>/dev/null || error "kubectl not installed" - [[ -n "${PLUTO_API_TOKEN:-}" ]] || error "PLUTO_API_TOKEN not set" + [[ -n "${PLUTO_API_KEY:-}" ]] || error "PLUTO_API_KEY not set" log "Prerequisites OK" } @@ -150,7 +150,7 @@ run_test() { log "Launching job with konduktor..." konduktor launch --name "${JOB_NAME}" -y "${SCRIPT_DIR}/multinode-job.yaml" \ --env "PLUTO_RUN_ID=${run_id}" \ - --env "PLUTO_API_TOKEN=${PLUTO_API_TOKEN}" \ + --env "PLUTO_API_KEY=${PLUTO_API_KEY}" \ --env "PLUTO_PROJECT=testing-ci" log "Job launched. Checking initial status..." diff --git a/tests/test_query.py b/tests/test_query.py index 1acf94d..dc3d99a 100644 --- a/tests/test_query.py +++ b/tests/test_query.py @@ -17,7 +17,7 @@ def _clean_env(monkeypatch): """Remove query-related env vars for test isolation.""" for key in ( - 'PLUTO_API_TOKEN', + 'PLUTO_API_KEY', 'MLOP_API_TOKEN', 'PLUTO_URL_API', 'MLOP_URL_API', @@ -42,7 +42,7 @@ def _make(status_code=200, json_data=None, text=''): @pytest.fixture() def client(monkeypatch): """A Client with a mocked httpx.Client.""" - monkeypatch.setenv('PLUTO_API_TOKEN', 'test-token-123') + monkeypatch.setenv('PLUTO_API_KEY', 'test-token-123') c = Client() c._client = MagicMock(spec=httpx.Client) return c @@ -55,7 +55,7 @@ def client(monkeypatch): class TestResolveApiToken: def test_from_pluto_env(self, monkeypatch): - monkeypatch.setenv('PLUTO_API_TOKEN', 'plt_abc') + monkeypatch.setenv('PLUTO_API_KEY', 'plt_abc') assert _resolve_api_token() == 'plt_abc' def test_from_deprecated_mlop_env(self, monkeypatch): @@ -69,7 +69,7 @@ def test_from_deprecated_mlop_env(self, monkeypatch): assert any('MLOP_API_TOKEN' in str(x.message) for x in w) def test_pluto_takes_precedence(self, monkeypatch): - monkeypatch.setenv('PLUTO_API_TOKEN', 'new_token') + monkeypatch.setenv('PLUTO_API_KEY', 'new_token') monkeypatch.setenv('MLOP_API_TOKEN', 'old_token') assert _resolve_api_token() == 'new_token' @@ -138,7 +138,7 @@ def test_requires_token(self): Client() def test_from_env(self, monkeypatch): - monkeypatch.setenv('PLUTO_API_TOKEN', 'plt_abc') + monkeypatch.setenv('PLUTO_API_KEY', 'plt_abc') c = Client() assert c._api_token == 'plt_abc' c.close() @@ -149,12 +149,12 @@ def test_explicit_token(self, monkeypatch): c.close() def test_context_manager(self, monkeypatch): - monkeypatch.setenv('PLUTO_API_TOKEN', 'plt_abc') + monkeypatch.setenv('PLUTO_API_KEY', 'plt_abc') with Client() as c: assert c._api_token == 'plt_abc' def test_custom_host(self, monkeypatch): - monkeypatch.setenv('PLUTO_API_TOKEN', 'plt_abc') + monkeypatch.setenv('PLUTO_API_KEY', 'plt_abc') c = Client(host='10.0.0.1') assert c._url_api == 'http://10.0.0.1:3001' c.close() @@ -463,7 +463,7 @@ def test_connection_error_retries(self, client): class TestModuleFunctions: def test_list_runs_creates_default_client(self, monkeypatch, mock_response): - monkeypatch.setenv('PLUTO_API_TOKEN', 'test-token') + monkeypatch.setenv('PLUTO_API_KEY', 'test-token') import pluto.query as pq