From 2ac829f7e7eccef861ef979ac4f57bdc16d0c658 Mon Sep 17 00:00:00 2001 From: Artem Chumachenko Date: Thu, 8 Jan 2026 16:56:19 +0100 Subject: [PATCH 1/4] Fix progress bar estimation --- src/together/cli/api/utils.py | 10 +++++----- src/together/types/finetune.py | 1 + 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/together/cli/api/utils.py b/src/together/cli/api/utils.py index 3bd2844..6b58994 100644 --- a/src/together/cli/api/utils.py +++ b/src/together/cli/api/utils.py @@ -103,13 +103,13 @@ def generate_progress_bar( progress = "Progress: [bold red]unavailable[/bold red]" if finetune_job.status in COMPLETED_STATUSES: progress = "Progress: [bold green]completed[/bold green]" - elif finetune_job.updated_at is not None: + elif finetune_job.started_at is not None: # Replace 'Z' with '+00:00' for Python 3.10 compatibility - updated_at_str = finetune_job.updated_at.replace("Z", "+00:00") - update_at = datetime.fromisoformat(updated_at_str).astimezone() + started_at_str = finetune_job.started_at.replace("Z", "+00:00") + started_at = datetime.fromisoformat(started_at_str).astimezone() if finetune_job.progress is not None: - if current_time < update_at: + if current_time < started_at: return progress if not finetune_job.progress.estimate_available: @@ -118,7 +118,7 @@ def generate_progress_bar( if finetune_job.progress.seconds_remaining <= 0: return progress - elapsed_time = (current_time - update_at).total_seconds() + elapsed_time = (current_time - started_at).total_seconds() ratio_filled = min( elapsed_time / finetune_job.progress.seconds_remaining, 1.0 ) diff --git a/src/together/types/finetune.py b/src/together/types/finetune.py index 95d48e5..faaaac0 100644 --- a/src/together/types/finetune.py +++ b/src/together/types/finetune.py @@ -286,6 +286,7 @@ class FinetuneResponse(BaseModel): # created/updated datetime stamps created_at: str | None = None updated_at: str | None = None + started_at: str | None = None # job status status: FinetuneJobStatus | None = None # job id From 50168d6d4e140cb4502e537fcaf11b8a412af305 Mon Sep 17 00:00:00 2001 From: Artem Chumachenko Date: Thu, 8 Jan 2026 18:52:08 +0100 Subject: [PATCH 2/4] fix tests --- tests/unit/test_cli_utils.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/unit/test_cli_utils.py b/tests/unit/test_cli_utils.py index 02e6182..d842a59 100644 --- a/tests/unit/test_cli_utils.py +++ b/tests/unit/test_cli_utils.py @@ -12,7 +12,7 @@ def create_finetune_response( status: FinetuneJobStatus = FinetuneJobStatus.STATUS_RUNNING, - updated_at: str = "2024-01-01T12:00:00Z", + created_at: str = "2024-01-01T12:00:00Z", progress: FinetuneProgress | None = None, job_id: str = "ft-test-123", ) -> FinetuneResponse: @@ -30,7 +30,7 @@ def create_finetune_response( return FinetuneResponse( id=job_id, progress=progress, - updated_at=updated_at, + created_at=created_at, status=status, ) @@ -359,7 +359,7 @@ def test_timezone_aware_datetime(self): """Test with different timezone for updated_at.""" current_time = datetime(2024, 1, 1, 12, 0, 30, tzinfo=timezone.utc) finetune_job = create_finetune_response( - updated_at="2024-01-01T07:00:00-05:00", # Same as 12:00:00 UTC (EST = UTC-5) + created_at="2024-01-01T07:00:00-05:00", # Same as 12:00:00 UTC (EST = UTC-5) progress=FinetuneProgress(estimate_available=True, seconds_remaining=60.0), ) @@ -385,7 +385,7 @@ def test_negative_elapsed_time_scenario(self): """Test unusual case where current time appears before updated_at.""" current_time = datetime(2024, 1, 1, 12, 0, 0, tzinfo=timezone.utc) finetune_job = create_finetune_response( - updated_at="2024-01-01T12:00:30Z", # In the "future" + created_at="2024-01-01T12:00:30Z", # In the "future" progress=FinetuneProgress(estimate_available=True, seconds_remaining=100.0), ) From 98b5122bdaf4f28181073bb4391e407806db957c Mon Sep 17 00:00:00 2001 From: Artem Chumachenko Date: Thu, 8 Jan 2026 18:54:20 +0100 Subject: [PATCH 3/4] proper fix --- tests/unit/test_cli_utils.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tests/unit/test_cli_utils.py b/tests/unit/test_cli_utils.py index d842a59..af674c5 100644 --- a/tests/unit/test_cli_utils.py +++ b/tests/unit/test_cli_utils.py @@ -12,7 +12,7 @@ def create_finetune_response( status: FinetuneJobStatus = FinetuneJobStatus.STATUS_RUNNING, - created_at: str = "2024-01-01T12:00:00Z", + started_at: str = "2024-01-01T12:00:00Z", progress: FinetuneProgress | None = None, job_id: str = "ft-test-123", ) -> FinetuneResponse: @@ -30,7 +30,8 @@ def create_finetune_response( return FinetuneResponse( id=job_id, progress=progress, - created_at=created_at, + updated_at=started_at, + started_at=started_at, status=status, ) From 101aefc752735a6f5f8498d8ac1847f5e80326f1 Mon Sep 17 00:00:00 2001 From: Artem Chumachenko Date: Thu, 8 Jan 2026 18:55:56 +0100 Subject: [PATCH 4/4] rm --- tests/unit/test_cli_utils.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/unit/test_cli_utils.py b/tests/unit/test_cli_utils.py index af674c5..b5cef3c 100644 --- a/tests/unit/test_cli_utils.py +++ b/tests/unit/test_cli_utils.py @@ -360,7 +360,7 @@ def test_timezone_aware_datetime(self): """Test with different timezone for updated_at.""" current_time = datetime(2024, 1, 1, 12, 0, 30, tzinfo=timezone.utc) finetune_job = create_finetune_response( - created_at="2024-01-01T07:00:00-05:00", # Same as 12:00:00 UTC (EST = UTC-5) + started_at="2024-01-01T07:00:00-05:00", # Same as 12:00:00 UTC (EST = UTC-5) progress=FinetuneProgress(estimate_available=True, seconds_remaining=60.0), ) @@ -386,7 +386,7 @@ def test_negative_elapsed_time_scenario(self): """Test unusual case where current time appears before updated_at.""" current_time = datetime(2024, 1, 1, 12, 0, 0, tzinfo=timezone.utc) finetune_job = create_finetune_response( - created_at="2024-01-01T12:00:30Z", # In the "future" + started_at="2024-01-01T12:00:30Z", # In the "future" progress=FinetuneProgress(estimate_available=True, seconds_remaining=100.0), )