together 1.5.7__py3-none-any.whl → 1.5.8__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -2,7 +2,7 @@ from __future__ import annotations
2
2
 
3
3
  import re
4
4
  from pathlib import Path
5
- from typing import List, Literal
5
+ from typing import Dict, List, Literal
6
6
 
7
7
  from rich import print as rprint
8
8
 
@@ -30,16 +30,8 @@ from together.types import (
30
30
  TrainingMethodSFT,
31
31
  TrainingType,
32
32
  )
33
- from together.types.finetune import (
34
- DownloadCheckpointType,
35
- FinetuneEvent,
36
- FinetuneEventType,
37
- )
38
- from together.utils import (
39
- get_event_step,
40
- log_warn_once,
41
- normalize_key,
42
- )
33
+ from together.types.finetune import DownloadCheckpointType
34
+ from together.utils import log_warn_once, normalize_key
43
35
 
44
36
 
45
37
  _FT_JOB_WITH_STEP_REGEX = r"^ft-[\dabcdef-]+:\d+$"
@@ -222,68 +214,38 @@ def create_finetune_request(
222
214
  return finetune_request
223
215
 
224
216
 
225
- def _process_checkpoints_from_events(
226
- events: List[FinetuneEvent], id: str
217
+ def _parse_raw_checkpoints(
218
+ checkpoints: List[Dict[str, str]], id: str
227
219
  ) -> List[FinetuneCheckpoint]:
228
220
  """
229
- Helper function to process events and create checkpoint list.
221
+ Helper function to process raw checkpoints and create checkpoint list.
230
222
 
231
223
  Args:
232
- events (List[FinetuneEvent]): List of fine-tune events to process
224
+ checkpoints (List[Dict[str, str]]): List of raw checkpoints metadata
233
225
  id (str): Fine-tune job ID
234
226
 
235
227
  Returns:
236
228
  List[FinetuneCheckpoint]: List of available checkpoints
237
229
  """
238
- checkpoints: List[FinetuneCheckpoint] = []
239
-
240
- for event in events:
241
- event_type = event.type
242
-
243
- if event_type == FinetuneEventType.CHECKPOINT_SAVE:
244
- step = get_event_step(event)
245
- checkpoint_name = f"{id}:{step}" if step is not None else id
246
-
247
- checkpoints.append(
248
- FinetuneCheckpoint(
249
- type=(
250
- f"Intermediate (step {step})"
251
- if step is not None
252
- else "Intermediate"
253
- ),
254
- timestamp=event.created_at,
255
- name=checkpoint_name,
256
- )
257
- )
258
- elif event_type == FinetuneEventType.JOB_COMPLETE:
259
- if hasattr(event, "model_path"):
260
- checkpoints.append(
261
- FinetuneCheckpoint(
262
- type=(
263
- "Final Merged"
264
- if hasattr(event, "adapter_path")
265
- else "Final"
266
- ),
267
- timestamp=event.created_at,
268
- name=id,
269
- )
270
- )
271
230
 
272
- if hasattr(event, "adapter_path"):
273
- checkpoints.append(
274
- FinetuneCheckpoint(
275
- type=(
276
- "Final Adapter" if hasattr(event, "model_path") else "Final"
277
- ),
278
- timestamp=event.created_at,
279
- name=id,
280
- )
281
- )
231
+ parsed_checkpoints = []
232
+ for checkpoint in checkpoints:
233
+ step = checkpoint["step"]
234
+ checkpoint_type = checkpoint["checkpoint_type"]
235
+ checkpoint_name = (
236
+ f"{id}:{step}" if "intermediate" in checkpoint_type.lower() else id
237
+ )
282
238
 
283
- # Sort by timestamp (newest first)
284
- checkpoints.sort(key=lambda x: x.timestamp, reverse=True)
239
+ parsed_checkpoints.append(
240
+ FinetuneCheckpoint(
241
+ type=checkpoint_type,
242
+ timestamp=checkpoint["created_at"],
243
+ name=checkpoint_name,
244
+ )
245
+ )
285
246
 
286
- return checkpoints
247
+ parsed_checkpoints.sort(key=lambda x: x.timestamp, reverse=True)
248
+ return parsed_checkpoints
287
249
 
288
250
 
289
251
  class FineTuning:
@@ -561,8 +523,21 @@ class FineTuning:
561
523
  Returns:
562
524
  List[FinetuneCheckpoint]: List of available checkpoints
563
525
  """
564
- events = self.list_events(id).data or []
565
- return _process_checkpoints_from_events(events, id)
526
+ requestor = api_requestor.APIRequestor(
527
+ client=self._client,
528
+ )
529
+
530
+ response, _, _ = requestor.request(
531
+ options=TogetherRequest(
532
+ method="GET",
533
+ url=f"fine-tunes/{id}/checkpoints",
534
+ ),
535
+ stream=False,
536
+ )
537
+ assert isinstance(response, TogetherResponse)
538
+
539
+ raw_checkpoints = response.data["data"]
540
+ return _parse_raw_checkpoints(raw_checkpoints, id)
566
541
 
567
542
  def download(
568
543
  self,
@@ -936,11 +911,9 @@ class AsyncFineTuning:
936
911
  ),
937
912
  stream=False,
938
913
  )
914
+ assert isinstance(events_response, TogetherResponse)
939
915
 
940
- # FIXME: API returns "data" field with no object type (should be "list")
941
- events_list = FinetuneListEvents(object="list", **events_response.data)
942
-
943
- return events_list
916
+ return FinetuneListEvents(**events_response.data)
944
917
 
945
918
  async def list_checkpoints(self, id: str) -> List[FinetuneCheckpoint]:
946
919
  """
@@ -950,11 +923,23 @@ class AsyncFineTuning:
950
923
  id (str): Unique identifier of the fine-tune job to list checkpoints for
951
924
 
952
925
  Returns:
953
- List[FinetuneCheckpoint]: Object containing list of available checkpoints
926
+ List[FinetuneCheckpoint]: List of available checkpoints
954
927
  """
955
- events_list = await self.list_events(id)
956
- events = events_list.data or []
957
- return _process_checkpoints_from_events(events, id)
928
+ requestor = api_requestor.APIRequestor(
929
+ client=self._client,
930
+ )
931
+
932
+ response, _, _ = await requestor.arequest(
933
+ options=TogetherRequest(
934
+ method="GET",
935
+ url=f"fine-tunes/{id}/checkpoints",
936
+ ),
937
+ stream=False,
938
+ )
939
+ assert isinstance(response, TogetherResponse)
940
+
941
+ raw_checkpoints = response.data["data"]
942
+ return _parse_raw_checkpoints(raw_checkpoints, id)
958
943
 
959
944
  async def download(
960
945
  self, id: str, *, output: str | None = None, checkpoint_step: int = -1
@@ -98,6 +98,7 @@ class ToolChoice(BaseModel):
98
98
 
99
99
  class ToolChoiceEnum(str, Enum):
100
100
  Auto = "auto"
101
+ Required = "required"
101
102
 
102
103
 
103
104
  class ChatCompletionRequest(BaseModel):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: together
3
- Version: 1.5.7
3
+ Version: 1.5.8
4
4
  Summary: Python client for Together's Cloud Platform!
5
5
  License: Apache-2.0
6
6
  Author: Together AI
@@ -34,7 +34,7 @@ together/resources/completions.py,sha256=5Wa-ZjPCxRcam6CDe7KgGYlTA7yJZMmd5TrRgGC
34
34
  together/resources/embeddings.py,sha256=PTvLb82yjG_-iQOyuhsilp77Fr7gZ0o6WD2KeRnKoxs,2675
35
35
  together/resources/endpoints.py,sha256=NNjp-wyzOotzlscGGrANhOHxQBjHTN8f5kTQTH_CLvE,17177
36
36
  together/resources/files.py,sha256=bnPbaF25e4InBRPvHwXHXT-oSX1Z1sZRsnQW5wq82U4,4990
37
- together/resources/finetune.py,sha256=7rcGfZqre1szzlh1MwseLlghZ9vRHwHAdeITvP2ohJY,36942
37
+ together/resources/finetune.py,sha256=6Al4QfqNid_1blWShl1RR9uis0xwrGruITc5Uxr_jkA,36367
38
38
  together/resources/images.py,sha256=LQUjKPaFxWTqOAPnyF1Pp7Rz4NLOYhmoKwshpYiprEM,4923
39
39
  together/resources/models.py,sha256=qgmAXv61Cq4oLxytenEZBywA8shldDHYxJ_EAu_4JWQ,3864
40
40
  together/resources/rerank.py,sha256=3Ju_aRSyZ1s_3zCSNZnSnEJErUVmt2xa3M8z1nvejMA,3931
@@ -42,7 +42,7 @@ together/together_response.py,sha256=a3dgKMPDrlfKQwxYENfNt2T4l2vSZxRWMixhHSy-q3E
42
42
  together/types/__init__.py,sha256=VgIbE2AOK9c2TQUzkbRbyRkdia2COXJXl_wxPaoxR-M,2688
43
43
  together/types/abstract.py,sha256=1lFQI_3WjsR_t1128AeKW0aTk6EiM6Gh1J3ZuyLLPao,642
44
44
  together/types/audio_speech.py,sha256=jlj8BZf3dkIDARF1P11fuenVLj4try8Yx4RN-EAkhOU,2609
45
- together/types/chat_completions.py,sha256=ggwt1LlBXTB_hZKbtLsjg8j-gXxO8pUUQfTrxUmRXHU,5078
45
+ together/types/chat_completions.py,sha256=qpBCMXEWtRwW_fmiu6cecm3d4h6mcK8gvr-8JkbAopQ,5104
46
46
  together/types/code_interpreter.py,sha256=cjF8TKgRkJllHS4i24dWQZBGTRsG557eHSewOiip0Kk,1770
47
47
  together/types/common.py,sha256=kxZ-N9xtBsGYZBmbIWnZ0rfT3Pn8PFB7sAbp3iv96pw,1525
48
48
  together/types/completions.py,sha256=o3FR5ixsTUj-a3pmOUzbSQg-hESVhpqrC9UD__VCqr4,2971
@@ -60,8 +60,8 @@ together/utils/api_helpers.py,sha256=2K0O6qeEQ2zVFvi5NBN5m2kjZJaS3-JfKFecQ7SmGaw
60
60
  together/utils/files.py,sha256=rfp10qU0urtWOXXFeasFtO9xp-1KIhM3S43JxcnHmL0,16438
61
61
  together/utils/tools.py,sha256=H2MTJhEqtBllaDvOyZehIO_IVNK3P17rSDeILtJIVag,2964
62
62
  together/version.py,sha256=p03ivHyE0SyWU4jAnRTBi_sOwywVWoZPU4g2gzRgG-Y,126
63
- together-1.5.7.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
64
- together-1.5.7.dist-info/METADATA,sha256=c8znCsq8LslEJ8Y7Kep9Ld_fIUsL2hpKjgZGv21Yrk4,15415
65
- together-1.5.7.dist-info/WHEEL,sha256=fGIA9gx4Qxk2KDKeNJCbOEwSrmLtjWCwzBz351GyrPQ,88
66
- together-1.5.7.dist-info/entry_points.txt,sha256=G-b5NKW6lUUf1V1fH8IPTBb7jXnK7lhbX9H1zTEJXPs,50
67
- together-1.5.7.dist-info/RECORD,,
63
+ together-1.5.8.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
64
+ together-1.5.8.dist-info/METADATA,sha256=lsO8JDj10zXplEJu-tVmwkMXNFLOE6RDQ6GQLYhBCXs,15415
65
+ together-1.5.8.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
66
+ together-1.5.8.dist-info/entry_points.txt,sha256=G-b5NKW6lUUf1V1fH8IPTBb7jXnK7lhbX9H1zTEJXPs,50
67
+ together-1.5.8.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: poetry-core 2.1.2
2
+ Generator: poetry-core 2.1.3
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any