From b1fb4de68fde9dae3d8a89a9ed816b83051f8659 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Wed, 20 May 2026 16:46:59 +0000 Subject: [PATCH 1/3] Fix fine-tuning metrics CLI zero filters Co-authored-by: Blaine Kasten --- .../lib/cli/api/fine_tuning/list_metrics.py | 10 ++-- tests/cli/test_fine_tuning.py | 50 +++++++++++++++++++ 2 files changed, 55 insertions(+), 5 deletions(-) diff --git a/src/together/lib/cli/api/fine_tuning/list_metrics.py b/src/together/lib/cli/api/fine_tuning/list_metrics.py index fa804fc0..c3072856 100644 --- a/src/together/lib/cli/api/fine_tuning/list_metrics.py +++ b/src/together/lib/cli/api/fine_tuning/list_metrics.py @@ -37,11 +37,11 @@ async def list_metrics( "Fetching metrics...", config.client.fine_tuning.list_metrics( fine_tune_id, - global_step_from=global_step_from or omit, - global_step_to=global_step_to or omit, - logged_at_from=logged_at_from or omit, - logged_at_to=logged_at_to or omit, - resolution=resolution or omit, + global_step_from=global_step_from if global_step_from is not None else omit, + global_step_to=global_step_to if global_step_to is not None else omit, + logged_at_from=logged_at_from if logged_at_from is not None else omit, + logged_at_to=logged_at_to if logged_at_to is not None else omit, + resolution=resolution if resolution is not None else omit, ), ) diff --git a/tests/cli/test_fine_tuning.py b/tests/cli/test_fine_tuning.py index 08d1b3d1..1291115d 100644 --- a/tests/cli/test_fine_tuning.py +++ b/tests/cli/test_fine_tuning.py @@ -3,12 +3,14 @@ import os import json import importlib +from typing import cast from pathlib import Path from unittest.mock import patch import httpx import pytest from respx import MockRouter +from respx.models import Call from tests.cli.utils import CliRunner @@ -70,6 +72,16 @@ "step": 5, } +_FT_METRICS_BODY = { + "metrics": [ + { + "global_step": 0, + "train_loss": 1.25, + "logged_at": "2024-01-01T00:00:00Z", + } + ] +} + class TestFineTuningList: @pytest.mark.respx(base_url=base_url) @@ -197,6 +209,44 @@ def test_list_checkpoints_empty_message(self, respx_mock: MockRouter, cli_runner assert "No checkpoints found" in result.output +class TestFineTuningListMetrics: + @pytest.mark.respx(base_url=base_url) + def test_list_metrics_json_includes_zero_step_filters( + self, respx_mock: MockRouter, cli_runner: CliRunner + ) -> None: + route = respx_mock.get("/fine-tunes/ft-1/metrics").mock( + return_value=httpx.Response(200, json=_FT_METRICS_BODY) + ) + + result = cli_runner.invoke( + [ + "fine-tuning", + "list-metrics", + "ft-1", + "--global-step-from", + "0", + "--global-step-to", + "0", + "--logged-at-from", + "2024-01-01T00:00:00Z", + "--logged-at-to", + "2024-01-02T00:00:00Z", + "--resolution", + "50", + "--json", + ] + ) + + assert result.exit_code == 0 + params = cast(Call, route.calls[0]).request.url.params + assert params["global_step_from"] == "0" + assert params["global_step_to"] == "0" + assert params["logged_at_from"] == "2024-01-01T00:00:00+00:00" + assert params["logged_at_to"] == "2024-01-02T00:00:00+00:00" + assert params["resolution"] == "50" + assert json.loads(result.output) == _FT_METRICS_BODY["metrics"] + + class TestFineTuningDownload: @pytest.mark.respx(base_url=base_url) def test_download_invokes_download_manager( From 490dff12c4c5b7d06a330fa6f84b235d3c49830f Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Wed, 20 May 2026 17:15:24 +0000 Subject: [PATCH 2/3] Fix metrics CLI test datetime input Co-authored-by: Blaine Kasten --- tests/cli/test_fine_tuning.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/cli/test_fine_tuning.py b/tests/cli/test_fine_tuning.py index 1291115d..36adf9d8 100644 --- a/tests/cli/test_fine_tuning.py +++ b/tests/cli/test_fine_tuning.py @@ -228,9 +228,9 @@ def test_list_metrics_json_includes_zero_step_filters( "--global-step-to", "0", "--logged-at-from", - "2024-01-01T00:00:00Z", + "2024-01-01T00:00:00+00:00", "--logged-at-to", - "2024-01-02T00:00:00Z", + "2024-01-02T00:00:00+00:00", "--resolution", "50", "--json", From a3464b5796e3c4f30f0e41070e558c51bfa8f1f5 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Wed, 20 May 2026 17:27:52 +0000 Subject: [PATCH 3/3] Format fine tuning CLI test Co-authored-by: Blaine Kasten --- tests/cli/test_fine_tuning.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/tests/cli/test_fine_tuning.py b/tests/cli/test_fine_tuning.py index 36adf9d8..f10c2269 100644 --- a/tests/cli/test_fine_tuning.py +++ b/tests/cli/test_fine_tuning.py @@ -211,12 +211,8 @@ def test_list_checkpoints_empty_message(self, respx_mock: MockRouter, cli_runner class TestFineTuningListMetrics: @pytest.mark.respx(base_url=base_url) - def test_list_metrics_json_includes_zero_step_filters( - self, respx_mock: MockRouter, cli_runner: CliRunner - ) -> None: - route = respx_mock.get("/fine-tunes/ft-1/metrics").mock( - return_value=httpx.Response(200, json=_FT_METRICS_BODY) - ) + def test_list_metrics_json_includes_zero_step_filters(self, respx_mock: MockRouter, cli_runner: CliRunner) -> None: + route = respx_mock.get("/fine-tunes/ft-1/metrics").mock(return_value=httpx.Response(200, json=_FT_METRICS_BODY)) result = cli_runner.invoke( [