@@ -72,7 +72,7 @@ def start_file(self, file_type: ModelFileType, target: str) -> None:
7272 file_type = file_type ,
7373 target_path = target ,
7474 downloaded_bytes = 0 ,
75- speed_mbps = 0.0 ,
75+ speed_bytes_per_sec = 0.0 ,
7676 )
7777
7878 @with_state_lock
@@ -87,15 +87,15 @@ def finish_download(self) -> None:
8787 self .state .downloading_session = None
8888
8989 @with_state_lock
90- def update_file_progress (self , file_type : ModelFileType , downloaded : int , speed_mbps : float ) -> None :
90+ def update_file_progress (self , file_type : ModelFileType , downloaded : int , speed_bytes_per_sec : float ) -> None :
9191 session = self .state .downloading_session
9292 if session is None :
9393 return
9494 rf = session .current_running_file
9595 if rf is None or rf .file_type != file_type :
9696 return
9797 rf .downloaded_bytes = downloaded
98- rf .speed_mbps = speed_mbps
98+ rf .speed_bytes_per_sec = speed_bytes_per_sec
9999
100100 @with_state_lock
101101 def fail_download (self , error : str ) -> None :
@@ -106,12 +106,25 @@ def fail_download(self, error: str) -> None:
106106 self .state .downloading_session = None
107107
108108 def _make_progress_callback (self , file_type : ModelFileType ) -> Callable [[int ], None ]:
109- start_time = time .monotonic ()
109+ last_sample_time = time .monotonic ()
110+ last_sample_bytes = 0
111+ smoothed_speed = 0.0
110112
111113 def on_progress (downloaded : int ) -> None :
112- elapsed = time .monotonic () - start_time
113- speed_mbps = (downloaded / elapsed / (1024 * 1024 )) if elapsed > 0 else 0.0
114- self .update_file_progress (file_type , downloaded , speed_mbps )
114+ nonlocal last_sample_time , last_sample_bytes , smoothed_speed
115+ now = time .monotonic ()
116+ elapsed = now - last_sample_time
117+ if elapsed >= 1.0 :
118+ instant_speed = (downloaded - last_sample_bytes ) / elapsed
119+ # EWMA: weight new sample at 30%, keep 70% of previous.
120+ # On first sample (smoothed_speed == 0) use instant value.
121+ if smoothed_speed == 0.0 :
122+ smoothed_speed = instant_speed
123+ else :
124+ smoothed_speed = 0.3 * instant_speed + 0.7 * smoothed_speed
125+ last_sample_time = now
126+ last_sample_bytes = downloaded
127+ self .update_file_progress (file_type , downloaded , smoothed_speed )
115128
116129 return on_progress
117130
@@ -130,15 +143,15 @@ def get_download_progress(self, session_id: str) -> DownloadProgressResponse:
130143 self .config .spec_for (ft ).expected_size_bytes for ft in session .files_to_download
131144 )
132145
133- current_file_progress = 0
146+ current_file_progress = 0.0
134147 if rf is not None :
135148 spec = self .config .spec_for (rf .file_type )
136149 if spec .expected_size_bytes > 0 :
137- current_file_progress = min (99 , int ( rf .downloaded_bytes / spec .expected_size_bytes * 100 ) )
150+ current_file_progress = min (99.0 , rf .downloaded_bytes / spec .expected_size_bytes * 100 )
138151
139- total_progress = 0
152+ total_progress = 0.0
140153 if expected_total_bytes > 0 :
141- total_progress = min (99 , int ( total_downloaded / expected_total_bytes * 100 ) )
154+ total_progress = min (99.0 , total_downloaded / expected_total_bytes * 100 )
142155
143156 return DownloadProgressResponse (
144157 status = "downloading" ,
@@ -149,7 +162,7 @@ def get_download_progress(self, session_id: str) -> DownloadProgressResponse:
149162 expected_total_bytes = expected_total_bytes ,
150163 completed_files = set (session .completed_files ),
151164 all_files = set (session .files_to_download ),
152- speed_mbps = int ( rf .speed_mbps ) if rf else 0 ,
165+ speed_bytes_per_sec = rf .speed_bytes_per_sec if rf else 0. 0 ,
153166 error = None ,
154167 )
155168
@@ -159,26 +172,26 @@ def get_download_progress(self, session_id: str) -> DownloadProgressResponse:
159172 return DownloadProgressResponse (
160173 status = "complete" ,
161174 current_downloading_file = None ,
162- current_file_progress = 100 ,
163- total_progress = 100 ,
175+ current_file_progress = 100.0 ,
176+ total_progress = 100.0 ,
164177 total_downloaded_bytes = 0 ,
165178 expected_total_bytes = 0 ,
166179 completed_files = set (),
167180 all_files = set (),
168- speed_mbps = 0 ,
181+ speed_bytes_per_sec = 0. 0 ,
169182 error = None ,
170183 )
171184 else :
172185 return DownloadProgressResponse (
173186 status = "error" ,
174187 current_downloading_file = None ,
175- current_file_progress = 0 ,
176- total_progress = 0 ,
188+ current_file_progress = 0.0 ,
189+ total_progress = 0.0 ,
177190 total_downloaded_bytes = 0 ,
178191 expected_total_bytes = 0 ,
179192 completed_files = set (),
180193 all_files = set (),
181- speed_mbps = 0 ,
194+ speed_bytes_per_sec = 0. 0 ,
182195 error = result ,
183196 )
184197
0 commit comments