together 1.5.29__py3-none-any.whl → 1.5.31__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.
together/utils/files.py CHANGED
@@ -7,6 +7,7 @@ from pathlib import Path
7
7
  from traceback import format_exc
8
8
  from typing import Any, Dict, List
9
9
 
10
+ from tqdm import tqdm
10
11
 
11
12
  from together.constants import (
12
13
  MAX_FILE_SIZE_GB,
@@ -102,81 +103,163 @@ def check_file(
102
103
  return report_dict
103
104
 
104
105
 
105
- def validate_messages(messages: List[Dict[str, str | bool]], idx: int) -> None:
106
- """Validate the messages column."""
106
+ def _check_conversation_type(messages: List[Dict[str, str | bool]], idx: int) -> None:
107
+ """Check that the conversation has correct type.
108
+
109
+ Args:
110
+ messages: The messages in the conversation.
111
+ Can be any type, this function ensures that the messages are a list of dictionaries.
112
+ idx: Line number in the file.
113
+
114
+ Raises:
115
+ InvalidFileFormatError: If the conversation type is invalid.
116
+ """
107
117
  if not isinstance(messages, list):
108
118
  raise InvalidFileFormatError(
109
119
  message=f"Invalid format on line {idx + 1} of the input file. "
110
- f"Expected a list of messages. Found {type(messages)}",
120
+ f"The `messages` column must be a list. Found {type(messages)}",
111
121
  line_number=idx + 1,
112
122
  error_source="key_value",
113
123
  )
114
- if not messages:
124
+ if len(messages) == 0:
115
125
  raise InvalidFileFormatError(
116
126
  message=f"Invalid format on line {idx + 1} of the input file. "
117
- f"Expected a non-empty list of messages. Found empty list",
127
+ f"The `messages` column must not be empty.",
118
128
  line_number=idx + 1,
119
129
  error_source="key_value",
120
130
  )
121
131
 
122
- has_weights = any("weight" in message for message in messages)
123
-
124
- previous_role = None
125
132
  for message in messages:
126
133
  if not isinstance(message, dict):
127
134
  raise InvalidFileFormatError(
128
135
  message=f"Invalid format on line {idx + 1} of the input file. "
129
- f"Expected a dictionary in the messages list. Found {type(message)}",
136
+ f"The `messages` column must be a list of dicts. Found {type(message)}",
130
137
  line_number=idx + 1,
131
138
  error_source="key_value",
132
139
  )
140
+
133
141
  for column in REQUIRED_COLUMNS_MESSAGE:
134
142
  if column not in message:
135
143
  raise InvalidFileFormatError(
136
- message=f"Field `{column}` is missing for a turn `{message}` on line {idx + 1} "
137
- "of the the input file.",
144
+ message=f"Missing required column `{column}` in message on line {idx + 1}.",
138
145
  line_number=idx + 1,
139
146
  error_source="key_value",
140
147
  )
141
- else:
142
- if not isinstance(message[column], str):
143
- raise InvalidFileFormatError(
144
- message=f"Invalid format on line {idx + 1} in the column {column} for turn `{message}` "
145
- f"of the input file. Expected string. Found {type(message[column])}",
146
- line_number=idx + 1,
147
- error_source="text_field",
148
- )
149
-
150
- if has_weights and "weight" in message:
151
- weight = message["weight"]
152
- if not isinstance(weight, int):
153
- raise InvalidFileFormatError(
154
- message="Weight must be an integer",
155
- line_number=idx + 1,
156
- error_source="key_value",
157
- )
158
- if weight not in {0, 1}:
148
+ if not isinstance(message[column], str):
159
149
  raise InvalidFileFormatError(
160
- message="Weight must be either 0 or 1",
150
+ message=f"Column `{column}` is not a string on line {idx + 1}. Found {type(message[column])}",
161
151
  line_number=idx + 1,
162
- error_source="key_value",
152
+ error_source="text_field",
163
153
  )
164
- if message["role"] not in POSSIBLE_ROLES_CONVERSATION:
154
+
155
+
156
+ def _check_conversation_roles(
157
+ require_assistant_role: bool, assistant_role_exists: bool, idx: int
158
+ ) -> None:
159
+ """Check that the conversation has correct roles.
160
+
161
+ Args:
162
+ require_assistant_role: Whether to require at least one assistant role.
163
+ assistant_role_exists: Whether an assistant role exists in the conversation.
164
+ idx: Line number in the file.
165
+
166
+ Raises:
167
+ InvalidFileFormatError: If the conversation roles are invalid.
168
+ """
169
+ if require_assistant_role and not assistant_role_exists:
170
+ raise InvalidFileFormatError(
171
+ message=f"Invalid format on line {idx + 1} of the input file. "
172
+ "At least one message with the assistant role must be present in the example.",
173
+ line_number=idx + 1,
174
+ error_source="key_value",
175
+ )
176
+
177
+
178
+ def _check_message_weight(message: Dict[str, str | bool], idx: int) -> None:
179
+ """Check that the message has a weight with the correct type and value.
180
+
181
+ Args:
182
+ message: The message to check.
183
+ idx: Line number in the file.
184
+
185
+ Raises:
186
+ InvalidFileFormatError: If the message weight is invalid.
187
+ """
188
+ if "weight" in message:
189
+ weight = message["weight"]
190
+ if not isinstance(weight, int):
165
191
  raise InvalidFileFormatError(
166
- message=f"Found invalid role `{message['role']}` in the messages on the line {idx + 1}. "
167
- f"Possible roles in the conversation are: {POSSIBLE_ROLES_CONVERSATION}",
192
+ message=f"Weight must be an integer on line {idx + 1}.",
168
193
  line_number=idx + 1,
169
194
  error_source="key_value",
170
195
  )
171
-
172
- if previous_role == message["role"]:
196
+ if weight not in {0, 1}:
173
197
  raise InvalidFileFormatError(
174
- message=f"Invalid role turns on line {idx + 1} of the input file. "
175
- "`user` and `assistant` roles must alternate user/assistant/user/assistant/...",
198
+ message=f"Weight must be either 0 or 1 on line {idx + 1}.",
176
199
  line_number=idx + 1,
177
200
  error_source="key_value",
178
201
  )
179
- previous_role = message["role"]
202
+
203
+
204
+ def _check_message_role(
205
+ message: Dict[str, str | bool], previous_role: str | None, idx: int
206
+ ) -> str | bool:
207
+ """Check that the message has correct roles.
208
+
209
+ Args:
210
+ message: The message to check.
211
+ previous_role: The role of the previous message.
212
+ idx: Line number in the file.
213
+
214
+ Returns:
215
+ str: The role of the current message.
216
+
217
+ Raises:
218
+ InvalidFileFormatError: If the message role is invalid.
219
+ """
220
+ if message["role"] not in POSSIBLE_ROLES_CONVERSATION:
221
+ raise InvalidFileFormatError(
222
+ message=f"Invalid role `{message['role']}` in conversation on line {idx + 1}. "
223
+ f"Possible roles: {', '.join(POSSIBLE_ROLES_CONVERSATION)}",
224
+ line_number=idx + 1,
225
+ error_source="key_value",
226
+ )
227
+ if previous_role is not None and message["role"] == previous_role:
228
+ raise InvalidFileFormatError(
229
+ message=f"Invalid role turns on line {idx + 1} of the input file. "
230
+ "After the optional system message, conversation roles must alternate between user/assistant/user/assistant.",
231
+ line_number=idx + 1,
232
+ error_source="key_value",
233
+ )
234
+ return message["role"]
235
+
236
+
237
+ def validate_messages(
238
+ messages: List[Dict[str, str | bool]], idx: int, require_assistant_role: bool = True
239
+ ) -> None:
240
+ """Validate the messages column.
241
+
242
+ Args:
243
+ messages: List of message dictionaries to validate.
244
+ idx: Line number in the file.
245
+ require_assistant_role: Whether to require at least one assistant role.
246
+
247
+ Raises:
248
+ InvalidFileFormatError: If the messages are invalid.
249
+ """
250
+ _check_conversation_type(messages, idx)
251
+
252
+ has_weights = any("weight" in message for message in messages)
253
+ previous_role = None
254
+ assistant_role_exists = False
255
+
256
+ for message in messages:
257
+ if has_weights:
258
+ _check_message_weight(message, idx)
259
+ previous_role = _check_message_role(message, previous_role, idx)
260
+ assistant_role_exists |= previous_role == "assistant"
261
+
262
+ _check_conversation_roles(require_assistant_role, assistant_role_exists, idx)
180
263
 
181
264
 
182
265
  def validate_preference_openai(example: Dict[str, Any], idx: int = 0) -> None:
@@ -203,37 +286,73 @@ def validate_preference_openai(example: Dict[str, Any], idx: int = 0) -> None:
203
286
  error_source="key_value",
204
287
  )
205
288
 
206
- validate_messages(example["input"]["messages"], idx)
289
+ validate_messages(example["input"]["messages"], idx, require_assistant_role=False)
290
+
291
+ if example["input"]["messages"][-1]["role"] == "assistant":
292
+ raise InvalidFileFormatError(
293
+ message=f"The last message in the input conversation must not be from the assistant on line {idx + 1}.",
294
+ line_number=idx + 1,
295
+ error_source="key_value",
296
+ )
297
+
298
+ keys = ["preferred_output", "non_preferred_output"]
207
299
 
208
- for output_field in ["preferred_output", "non_preferred_output"]:
209
- if not isinstance(example[output_field], list):
300
+ for key in keys:
301
+ if key not in example:
210
302
  raise InvalidFileFormatError(
211
- message=f"The dataset is malformed, the `{output_field}` field must be a list.",
303
+ message=f"The dataset is malformed, the `{key}` field must be present in the input dictionary on line {idx + 1}.",
212
304
  line_number=idx + 1,
213
305
  error_source="key_value",
214
306
  )
215
307
 
216
- if len(example[output_field]) != 1:
308
+ if not isinstance(example[key], list):
217
309
  raise InvalidFileFormatError(
218
- message=f"The dataset is malformed, the `{output_field}` list must contain exactly one message.",
310
+ message=f"The dataset is malformed, the `{key}` field must be a list on line {idx + 1}.",
219
311
  line_number=idx + 1,
220
312
  error_source="key_value",
221
313
  )
222
- if "role" not in example[output_field][0]:
314
+
315
+ if len(example[key]) != 1:
223
316
  raise InvalidFileFormatError(
224
- message=f"The dataset is malformed, the `{output_field}` message is missing the `role` field.",
317
+ message=f"The dataset is malformed, the `{key}` list must contain exactly one message on line {idx + 1}.",
225
318
  line_number=idx + 1,
226
319
  error_source="key_value",
227
320
  )
228
- elif example[output_field][0]["role"] != "assistant":
321
+
322
+ if not isinstance(example[key][0], dict):
229
323
  raise InvalidFileFormatError(
230
- message=f"The dataset is malformed, the `{output_field}` must contain an assistant message.",
324
+ message=f"The dataset is malformed, the first element of `{key}` must be a dictionary on line {idx + 1}.",
231
325
  line_number=idx + 1,
232
326
  error_source="key_value",
233
327
  )
234
328
 
235
- validate_messages(example["preferred_output"], idx)
236
- validate_messages(example["non_preferred_output"], idx)
329
+ if "role" not in example[key][0]:
330
+ raise InvalidFileFormatError(
331
+ message=f"The dataset is malformed, the first element of `{key}` must have a 'role' field on line {idx + 1}.",
332
+ line_number=idx + 1,
333
+ error_source="key_value",
334
+ )
335
+
336
+ if example[key][0]["role"] != "assistant":
337
+ raise InvalidFileFormatError(
338
+ message=f"The dataset is malformed, the first element of `{key}` must have the 'assistant' role on line {idx + 1}.",
339
+ line_number=idx + 1,
340
+ error_source="key_value",
341
+ )
342
+
343
+ if "content" not in example[key][0]:
344
+ raise InvalidFileFormatError(
345
+ message=f"The dataset is malformed, the first element of `{key}` must have a 'content' field on line {idx + 1}.",
346
+ line_number=idx + 1,
347
+ error_source="key_value",
348
+ )
349
+
350
+ if not isinstance(example[key][0]["content"], str):
351
+ raise InvalidFileFormatError(
352
+ message=f"The dataset is malformed, the 'content' field in `{key}` must be a string on line {idx + 1}.",
353
+ line_number=idx + 1,
354
+ error_source="key_value",
355
+ )
237
356
 
238
357
 
239
358
  def _check_utf8(file: Path) -> Dict[str, Any]:
@@ -245,14 +364,19 @@ def _check_utf8(file: Path) -> Dict[str, Any]:
245
364
  Dict[str, Any]: A dictionary with the results of the check.
246
365
  """
247
366
  report_dict: Dict[str, Any] = {}
367
+
248
368
  try:
369
+ # Dry-run UTF-8 decode: iterate through file to validate encoding
249
370
  with file.open(encoding="utf-8") as f:
250
- f.read()
371
+ for _ in f:
372
+ pass
373
+
251
374
  report_dict["utf8"] = True
252
375
  except UnicodeDecodeError as e:
253
376
  report_dict["utf8"] = False
254
377
  report_dict["message"] = f"File is not UTF-8 encoded. Error raised: {e}."
255
378
  report_dict["is_check_passed"] = False
379
+
256
380
  return report_dict
257
381
 
258
382
 
@@ -352,7 +476,7 @@ def _check_jsonl(file: Path, purpose: FilePurpose | str) -> Dict[str, Any]:
352
476
  with file.open() as f:
353
477
  idx = -1
354
478
  try:
355
- for idx, line in enumerate(f):
479
+ for idx, line in tqdm(enumerate(f), desc="Validating file", unit=" lines"):
356
480
  json_line = json.loads(line)
357
481
 
358
482
  if not isinstance(json_line, dict):
@@ -410,7 +534,12 @@ def _check_jsonl(file: Path, purpose: FilePurpose | str) -> Dict[str, Any]:
410
534
  message_column = JSONL_REQUIRED_COLUMNS_MAP[
411
535
  DatasetFormat.CONVERSATION
412
536
  ][0]
413
- validate_messages(json_line[message_column], idx)
537
+ require_assistant = purpose != FilePurpose.Eval
538
+ validate_messages(
539
+ json_line[message_column],
540
+ idx,
541
+ require_assistant_role=require_assistant,
542
+ )
414
543
  else:
415
544
  for column in JSONL_REQUIRED_COLUMNS_MAP[current_format]:
416
545
  if not isinstance(json_line[column], str):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: together
3
- Version: 1.5.29
3
+ Version: 1.5.31
4
4
  Summary: Python client for Together's Cloud Platform!
5
5
  License: Apache-2.0
6
6
  License-File: LICENSE
@@ -17,6 +17,7 @@ Classifier: Programming Language :: Python :: 3.13
17
17
  Classifier: Programming Language :: Python :: 3.14
18
18
  Provides-Extra: pyarrow
19
19
  Requires-Dist: aiohttp (>=3.9.3,<4.0.0)
20
+ Requires-Dist: black (>=25.9.0,<26.0.0)
20
21
  Requires-Dist: click (>=8.1.7,<9.0.0)
21
22
  Requires-Dist: eval-type-backport (>=0.1.3,<0.3.0)
22
23
  Requires-Dist: filelock (>=3.13.1,<4.0.0)
@@ -1,11 +1,11 @@
1
1
  together/__init__.py,sha256=B8T7ybZ7D6jJNRTuFDVjOFlImCNag8tNZXpZdXz7xNM,1530
2
2
  together/abstract/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
- together/abstract/api_requestor.py,sha256=kKVxkJqpd1CQ4t9Ky4kngkvlzZh1xoDN0PBAM8mGW_Q,25948
3
+ together/abstract/api_requestor.py,sha256=CPFsQXEqIoXDcqxlDQyumbTMtGmL7CQYtSYrkb3binU,27556
4
4
  together/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
5
  together/cli/api/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
- together/cli/api/chat.py,sha256=2PHRb-9T-lUEKhUJFtc7SxJv3shCVx40gq_8pzfsewM,9234
6
+ together/cli/api/chat.py,sha256=auJh0WZwpY16vFLJojkzLJYnjU1IgNz_ybf7sQtKga0,9941
7
7
  together/cli/api/completions.py,sha256=l-Zw5t7hojL3w8xd_mitS2NRB72i5Z0xwkzH0rT5XMc,4263
8
- together/cli/api/endpoints.py,sha256=f6KafWZvRF6n_ThWdr3y9uhE6wPF37PcD45w_EtgXmY,13289
8
+ together/cli/api/endpoints.py,sha256=S3px19iGTKy5KS1nuKrvUUMoqc_KtrZHyIwjwjqX7uQ,14624
9
9
  together/cli/api/evaluation.py,sha256=36SsujC5qicf-8l8GA8wqRtEC8NKzsAjL-_nYhePpQM,14691
10
10
  together/cli/api/files.py,sha256=QLYEXRkY8J2Gg1SbTCtzGfoTMvosoeACNK83L_oLubs,3397
11
11
  together/cli/api/finetune.py,sha256=zG8Peg7DuptMpT5coqqGbRdaxM5SxQgte9tIv7tMJbM,18437
@@ -14,9 +14,9 @@ together/cli/api/models.py,sha256=BRWRiguuJ8OwAD8crajpZ7RyCHA35tyOZvi3iLWQ7k4,36
14
14
  together/cli/api/utils.py,sha256=IuqYWPnLI38_Bqd7lj8V_SnGdYc59pRmMbQmciS4FsM,1326
15
15
  together/cli/cli.py,sha256=PVahUjOfAQIjo209FoPKljcCA_OIpOYQ9MAsCjfEMu0,2134
16
16
  together/client.py,sha256=KD33kAPkWTcnXjge4rLK_L3UsJYsxNUkvL6b9SgTEf0,6324
17
- together/constants.py,sha256=yloKFcO6sIt-Vpk2tDIanJrFiXQUg5Vm0vmU5Cl703U,1999
17
+ together/constants.py,sha256=IaKMIamFia9nyq8jPrmqu5y0YL5mC_474AAIUXYFsdk,1964
18
18
  together/error.py,sha256=HU6247CyzCFjaxL9A0XYbXZ6fY_ebRg0FEYjI4Skogs,5515
19
- together/filemanager.py,sha256=ebVjksV676Kzvd9iDgraWTjatD8ZLfLT44rjcXveRZo,18326
19
+ together/filemanager.py,sha256=bynQp2yGoFMZcgVtgFlkYxTbnk6n_GxdiEpY0q50kbk,19448
20
20
  together/legacy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
21
21
  together/legacy/base.py,sha256=ehrX1SCfRbK5OA83wL1q7-tfF-yuZOUxzjxYfFtdvvQ,727
22
22
  together/legacy/complete.py,sha256=NRJX-vjnkg4HrgDo9LS3jFfhwfXpeGxcl24dcrLPK3A,2439
@@ -26,17 +26,18 @@ together/legacy/finetune.py,sha256=nL2Ytt8FOVtGbcMumnn1gyf4aEFrRok8GolWJJaHQAg,5
26
26
  together/legacy/images.py,sha256=bJJRs-6C7-NexPyaeyHiYlHOU51yls5-QAiqtO4xrZU,626
27
27
  together/legacy/models.py,sha256=85ZN9Ids_FjdYNDRv5k7sgrtVWPKPHqkDplORtVUGHg,1087
28
28
  together/resources/__init__.py,sha256=iOo8bNF8J7EKgShrEZSWpeULTgyHnuxmRrwmVHyGy4Y,1280
29
- together/resources/audio/__init__.py,sha256=S6gV6aEPAHL9kskoA38Uq_Ju7uM1Xcfl0doO-DtQLbo,1185
30
- together/resources/audio/speech.py,sha256=81ib_gIo-Rxoaipx2Pi9ZsKnOTjeFPwSlBrcUkyX5xk,5211
31
- together/resources/audio/transcriptions.py,sha256=dtKRVqrmJsTufAxbDMvTzco7E3iW5qbP3oEvcjGhvUY,10883
29
+ together/resources/audio/__init__.py,sha256=S8moxi0iEOw3NZMtXN0TPDP37k1q9tNZx-qH4SV72hQ,1439
30
+ together/resources/audio/speech.py,sha256=3lVxJPQM1bbStkAJWym3eJua-AxuYSP9jBZy0jLls_M,5446
31
+ together/resources/audio/transcriptions.py,sha256=99EF-Kyt-oySF887U4Wtzg49jTf6L_ln8AZVhvrl1HA,12377
32
32
  together/resources/audio/translations.py,sha256=_2VeYEthYzPIflDD_hlVmoXk-OCgLgnvva2vMPpaU_Q,10508
33
+ together/resources/audio/voices.py,sha256=Xyjv_jI5hFTvRouiryT0m4pre9_SoZOa8r5agVmoFSU,1699
33
34
  together/resources/batch.py,sha256=dBXgh264AQPsO3pCff1vT1PAewnX9yroxa8UZQUJAqE,4584
34
35
  together/resources/chat/__init__.py,sha256=RsTptdP8MeGjcdIjze896-J27cRvCbUoMft0X2BVlQ8,617
35
36
  together/resources/chat/completions.py,sha256=cBsSFWi9qToQCn4V_3qJ0gwRqORjF6NFDXmHcHfIhOY,14442
36
37
  together/resources/code_interpreter.py,sha256=vbN8Mh5MG6HQvqra7p61leIyfebgbgJTM_q2A_Fylhw,2948
37
38
  together/resources/completions.py,sha256=5Wa-ZjPCxRcam6CDe7KgGYlTA7yJZMmd5TrRgGCL_ug,11726
38
39
  together/resources/embeddings.py,sha256=PTvLb82yjG_-iQOyuhsilp77Fr7gZ0o6WD2KeRnKoxs,2675
39
- together/resources/endpoints.py,sha256=_UoNSknG7aK0jOcxBPcq21KYpWsNFCfNePUWGMOUjmc,17173
40
+ together/resources/endpoints.py,sha256=BP75wUEcOtpiUbfLAQH5GX2RL8_RnM522-D8Iz7_LUU,20378
40
41
  together/resources/evaluation.py,sha256=eYSs9HUpW51XZjX-yNlFZlLapsuEDINJ8BjxJoYa4U0,31443
41
42
  together/resources/files.py,sha256=_uK5xzriXNOGNw3tQGuTbCaxBRo6Az6_cXOUtBNFzDk,5434
42
43
  together/resources/finetune.py,sha256=VeMyPG-PA16d2UAzqNTQEAKBgMvVApj97lTAHEuR0kc,44890
@@ -45,19 +46,19 @@ together/resources/models.py,sha256=WpP-x25AXYpmu-VKu_X4Up-zHwpWBBvPRpbV4FsWQrU,
45
46
  together/resources/rerank.py,sha256=3Ju_aRSyZ1s_3zCSNZnSnEJErUVmt2xa3M8z1nvejMA,3931
46
47
  together/resources/videos.py,sha256=Dn7vslH1pZVw4WYvH-69fjzqLZdKHkTK-lIbFkxh0w0,11144
47
48
  together/together_response.py,sha256=a3dgKMPDrlfKQwxYENfNt2T4l2vSZxRWMixhHSy-q3E,1308
48
- together/types/__init__.py,sha256=QTGi5Y7MAQv9ik1gFwReFZ3tN7-M-mYo_J3M41-L2FU,4258
49
+ together/types/__init__.py,sha256=eK8DXMzHp78kieDv7JpXNbcS2k3aWvyQrgLdYUtL_qM,4342
49
50
  together/types/abstract.py,sha256=1lFQI_3WjsR_t1128AeKW0aTk6EiM6Gh1J3ZuyLLPao,642
50
- together/types/audio_speech.py,sha256=iGFUawdzPoRjLFatkSl5S-liAzhJaye6raZwaSdUrSg,5012
51
+ together/types/audio_speech.py,sha256=pUzqpx7NCjtPIq91xO2k0psetzLz29NTHHm6DS0k8Xg,9682
51
52
  together/types/batch.py,sha256=KiI5i1En7cyIUxHhVIGoQk6Wlw19c0PXSqDWwc2KZ2c,1140
52
- together/types/chat_completions.py,sha256=NxJ7tFlWynxoLsRtQHzM7Ka3QxKVjRs6EvtOTYZ79bM,5340
53
+ together/types/chat_completions.py,sha256=OkEk4_Z5cf36Ae775epG_lIQ6dkKPSSKujc9wQ-tzQs,5504
53
54
  together/types/code_interpreter.py,sha256=cjF8TKgRkJllHS4i24dWQZBGTRsG557eHSewOiip0Kk,1770
54
- together/types/common.py,sha256=kxZ-N9xtBsGYZBmbIWnZ0rfT3Pn8PFB7sAbp3iv96pw,1525
55
+ together/types/common.py,sha256=c2_CeyjOBWbJ0RIAsWB13DG8j6N3ATU-6yH-CnFitVY,1564
55
56
  together/types/completions.py,sha256=o3FR5ixsTUj-a3pmOUzbSQg-hESVhpqrC9UD__VCqr4,2971
56
57
  together/types/embeddings.py,sha256=J7grkYYn7xhqeKaBO2T-8XQRtHhkzYzymovtGdIUK5A,751
57
58
  together/types/endpoints.py,sha256=EzNhHOoQ_D9fUdNQtxQPeSWiFzdFLqpNodN0YLmv_h0,4393
58
59
  together/types/error.py,sha256=OVlCs3cx_2WhZK4JzHT8SQyRIIqKOP1AZQ4y1PydjAE,370
59
60
  together/types/evaluation.py,sha256=9gCAgzAwFD95MWnSgvxnSYFF27wKOTqIGn-wSOpFt2M,2385
60
- together/types/files.py,sha256=XCimmKDaSEEfavOtp0UH-ZrRxrmHoCTYLlmmhshbr7A,1994
61
+ together/types/files.py,sha256=_pB_q8kU5QH7WE3Y8Uro6LGsgK_5zrGYzJREZL9cRH0,2025
61
62
  together/types/finetune.py,sha256=EQAJVXqK1Ne2V2dCfUiJgOwK9_x_7TwQRrjWavap698,11396
62
63
  together/types/images.py,sha256=IsrmIM2FVeG-kP4vhZUx5fG5EhOJ-d8fefrAmOVKNDs,926
63
64
  together/types/models.py,sha256=V8bcy1c3uTmqwnTVphbYLF2AJ6l2P2724njl36TzfHQ,2878
@@ -66,11 +67,11 @@ together/types/videos.py,sha256=KCLk8CF0kbA_51qnHOzAWg5VA6HTlwnY-sTZ2lUR0Eo,1861
66
67
  together/utils/__init__.py,sha256=5fqvj4KT2rHxKSQot2TSyV_HcvkvkGiqAiaYuJwqtm0,786
67
68
  together/utils/_log.py,sha256=5IYNI-jYzxyIS-pUvhb0vE_Muo3MA7GgBhsu66TKP2w,1951
68
69
  together/utils/api_helpers.py,sha256=2K0O6qeEQ2zVFvi5NBN5m2kjZJaS3-JfKFecQ7SmGaw,3746
69
- together/utils/files.py,sha256=Zqw1MA0CbnpkiGWSMk0DtRUFzf7-kWDE1OgzGWinbV4,20671
70
+ together/utils/files.py,sha256=mWFFpsgVPDQg1ZCb-oTrDUFv3aXg1AItgtwXvDsFegI,25047
70
71
  together/utils/tools.py,sha256=H2MTJhEqtBllaDvOyZehIO_IVNK3P17rSDeILtJIVag,2964
71
72
  together/version.py,sha256=p03ivHyE0SyWU4jAnRTBi_sOwywVWoZPU4g2gzRgG-Y,126
72
- together-1.5.29.dist-info/METADATA,sha256=yLeO8uZwv8i_NRwE5JggFgN-OdpWvLMsAqj2OiB16JQ,16543
73
- together-1.5.29.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
74
- together-1.5.29.dist-info/entry_points.txt,sha256=G-b5NKW6lUUf1V1fH8IPTBb7jXnK7lhbX9H1zTEJXPs,50
75
- together-1.5.29.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
76
- together-1.5.29.dist-info/RECORD,,
73
+ together-1.5.31.dist-info/METADATA,sha256=VXwb3-wFmS-Zika1_4B1i9aHy3F3AD7-zeSiSQJYiTQ,16583
74
+ together-1.5.31.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
75
+ together-1.5.31.dist-info/entry_points.txt,sha256=G-b5NKW6lUUf1V1fH8IPTBb7jXnK7lhbX9H1zTEJXPs,50
76
+ together-1.5.31.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
77
+ together-1.5.31.dist-info/RECORD,,