From d01ad96120d8d8227da8414203fb67959b02ca8c Mon Sep 17 00:00:00 2001 From: Bohdan Date: Mon, 14 Sep 2026 15:50:57 -0700 Subject: [PATCH 1/2] Use the Forge endpoint by default for Serverless Training --- src/art/serverless/client.py | 2 +- tests/unit/test_serverless_client.py | 37 ++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 tests/unit/test_serverless_client.py diff --git a/src/art/serverless/client.py b/src/art/serverless/client.py index 5d92d88cc..686b500e2 100644 --- a/src/art/serverless/client.py +++ b/src/art/serverless/client.py @@ -285,7 +285,7 @@ def __init__( self.api_key = api_key super().__init__( version=__version__, - base_url=base_url or "https://api.training.wandb.ai/v1", + base_url=base_url or "https://forge.coreweave.com/api/training/v1", _strict_response_validation=False, max_retries=3, ) diff --git a/tests/unit/test_serverless_client.py b/tests/unit/test_serverless_client.py new file mode 100644 index 000000000..8e936acda --- /dev/null +++ b/tests/unit/test_serverless_client.py @@ -0,0 +1,37 @@ +import httpx +import pytest + +from art.serverless.client import Client + + +@pytest.mark.parametrize( + "base_url, expected_base", + [ + (None, "https://forge.coreweave.com/api/training/v1"), + ("https://training.example/custom/v1", "https://training.example/custom/v1"), + ], +) +async def test_training_requests_preserve_base_path( + base_url: str | None, expected_base: str +) -> None: + requests: list[httpx.Request] = [] + + def respond(request: httpx.Request) -> httpx.Response: + requests.append(request) + return httpx.Response(200, json={"id": "job-id"}) + + async with Client(api_key="test-key", base_url=base_url) as client: + await client._client.aclose() + client._client = httpx.AsyncClient(transport=httpx.MockTransport(respond)) + await client.training_jobs.create(model_id="model-id", trajectory_groups=[]) + await client.sft_training_jobs.create( + model_id="model-id", training_data_url="https://data.example/train.jsonl" + ) + + assert [str(request.url) for request in requests] == [ + f"{expected_base}/preview/training-jobs", + f"{expected_base}/preview/sft-training-jobs", + ] + assert all( + request.headers["authorization"] == "Bearer test-key" for request in requests + ) From 0b1d15b750947ecc1ac1c03f50fee284e71a52df Mon Sep 17 00:00:00 2001 From: Bohdan Date: Mon, 14 Sep 2026 16:12:04 -0700 Subject: [PATCH 2/2] Keep Forge endpoint PR limited to the default URL change --- tests/unit/test_serverless_client.py | 37 ---------------------------- 1 file changed, 37 deletions(-) delete mode 100644 tests/unit/test_serverless_client.py diff --git a/tests/unit/test_serverless_client.py b/tests/unit/test_serverless_client.py deleted file mode 100644 index 8e936acda..000000000 --- a/tests/unit/test_serverless_client.py +++ /dev/null @@ -1,37 +0,0 @@ -import httpx -import pytest - -from art.serverless.client import Client - - -@pytest.mark.parametrize( - "base_url, expected_base", - [ - (None, "https://forge.coreweave.com/api/training/v1"), - ("https://training.example/custom/v1", "https://training.example/custom/v1"), - ], -) -async def test_training_requests_preserve_base_path( - base_url: str | None, expected_base: str -) -> None: - requests: list[httpx.Request] = [] - - def respond(request: httpx.Request) -> httpx.Response: - requests.append(request) - return httpx.Response(200, json={"id": "job-id"}) - - async with Client(api_key="test-key", base_url=base_url) as client: - await client._client.aclose() - client._client = httpx.AsyncClient(transport=httpx.MockTransport(respond)) - await client.training_jobs.create(model_id="model-id", trajectory_groups=[]) - await client.sft_training_jobs.create( - model_id="model-id", training_data_url="https://data.example/train.jsonl" - ) - - assert [str(request.url) for request in requests] == [ - f"{expected_base}/preview/training-jobs", - f"{expected_base}/preview/sft-training-jobs", - ] - assert all( - request.headers["authorization"] == "Bearer test-key" for request in requests - )