together 1.5.5__tar.gz → 1.5.7__tar.gz

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.
Files changed (66) hide show
  1. {together-1.5.5 → together-1.5.7}/PKG-INFO +26 -2
  2. {together-1.5.5 → together-1.5.7}/README.md +24 -0
  3. {together-1.5.5 → together-1.5.7}/pyproject.toml +4 -4
  4. {together-1.5.5 → together-1.5.7}/src/together/cli/api/finetune.py +11 -3
  5. {together-1.5.5 → together-1.5.7}/src/together/resources/code_interpreter.py +28 -4
  6. {together-1.5.5 → together-1.5.7}/src/together/resources/finetune.py +19 -7
  7. {together-1.5.5 → together-1.5.7}/src/together/types/code_interpreter.py +11 -0
  8. {together-1.5.5 → together-1.5.7}/src/together/types/finetune.py +9 -1
  9. {together-1.5.5 → together-1.5.7}/LICENSE +0 -0
  10. {together-1.5.5 → together-1.5.7}/src/together/__init__.py +0 -0
  11. {together-1.5.5 → together-1.5.7}/src/together/abstract/__init__.py +0 -0
  12. {together-1.5.5 → together-1.5.7}/src/together/abstract/api_requestor.py +0 -0
  13. {together-1.5.5 → together-1.5.7}/src/together/cli/__init__.py +0 -0
  14. {together-1.5.5 → together-1.5.7}/src/together/cli/api/__init__.py +0 -0
  15. {together-1.5.5 → together-1.5.7}/src/together/cli/api/chat.py +0 -0
  16. {together-1.5.5 → together-1.5.7}/src/together/cli/api/completions.py +0 -0
  17. {together-1.5.5 → together-1.5.7}/src/together/cli/api/endpoints.py +0 -0
  18. {together-1.5.5 → together-1.5.7}/src/together/cli/api/files.py +0 -0
  19. {together-1.5.5 → together-1.5.7}/src/together/cli/api/images.py +0 -0
  20. {together-1.5.5 → together-1.5.7}/src/together/cli/api/models.py +0 -0
  21. {together-1.5.5 → together-1.5.7}/src/together/cli/api/utils.py +0 -0
  22. {together-1.5.5 → together-1.5.7}/src/together/cli/cli.py +0 -0
  23. {together-1.5.5 → together-1.5.7}/src/together/client.py +0 -0
  24. {together-1.5.5 → together-1.5.7}/src/together/constants.py +0 -0
  25. {together-1.5.5 → together-1.5.7}/src/together/error.py +0 -0
  26. {together-1.5.5 → together-1.5.7}/src/together/filemanager.py +0 -0
  27. {together-1.5.5 → together-1.5.7}/src/together/legacy/__init__.py +0 -0
  28. {together-1.5.5 → together-1.5.7}/src/together/legacy/base.py +0 -0
  29. {together-1.5.5 → together-1.5.7}/src/together/legacy/complete.py +0 -0
  30. {together-1.5.5 → together-1.5.7}/src/together/legacy/embeddings.py +0 -0
  31. {together-1.5.5 → together-1.5.7}/src/together/legacy/files.py +0 -0
  32. {together-1.5.5 → together-1.5.7}/src/together/legacy/finetune.py +0 -0
  33. {together-1.5.5 → together-1.5.7}/src/together/legacy/images.py +0 -0
  34. {together-1.5.5 → together-1.5.7}/src/together/legacy/models.py +0 -0
  35. {together-1.5.5 → together-1.5.7}/src/together/resources/__init__.py +0 -0
  36. {together-1.5.5 → together-1.5.7}/src/together/resources/audio/__init__.py +0 -0
  37. {together-1.5.5 → together-1.5.7}/src/together/resources/audio/speech.py +0 -0
  38. {together-1.5.5 → together-1.5.7}/src/together/resources/chat/__init__.py +0 -0
  39. {together-1.5.5 → together-1.5.7}/src/together/resources/chat/completions.py +0 -0
  40. {together-1.5.5 → together-1.5.7}/src/together/resources/completions.py +0 -0
  41. {together-1.5.5 → together-1.5.7}/src/together/resources/embeddings.py +0 -0
  42. {together-1.5.5 → together-1.5.7}/src/together/resources/endpoints.py +0 -0
  43. {together-1.5.5 → together-1.5.7}/src/together/resources/files.py +0 -0
  44. {together-1.5.5 → together-1.5.7}/src/together/resources/images.py +0 -0
  45. {together-1.5.5 → together-1.5.7}/src/together/resources/models.py +0 -0
  46. {together-1.5.5 → together-1.5.7}/src/together/resources/rerank.py +0 -0
  47. {together-1.5.5 → together-1.5.7}/src/together/together_response.py +0 -0
  48. {together-1.5.5 → together-1.5.7}/src/together/types/__init__.py +0 -0
  49. {together-1.5.5 → together-1.5.7}/src/together/types/abstract.py +0 -0
  50. {together-1.5.5 → together-1.5.7}/src/together/types/audio_speech.py +0 -0
  51. {together-1.5.5 → together-1.5.7}/src/together/types/chat_completions.py +0 -0
  52. {together-1.5.5 → together-1.5.7}/src/together/types/common.py +0 -0
  53. {together-1.5.5 → together-1.5.7}/src/together/types/completions.py +0 -0
  54. {together-1.5.5 → together-1.5.7}/src/together/types/embeddings.py +0 -0
  55. {together-1.5.5 → together-1.5.7}/src/together/types/endpoints.py +0 -0
  56. {together-1.5.5 → together-1.5.7}/src/together/types/error.py +0 -0
  57. {together-1.5.5 → together-1.5.7}/src/together/types/files.py +0 -0
  58. {together-1.5.5 → together-1.5.7}/src/together/types/images.py +0 -0
  59. {together-1.5.5 → together-1.5.7}/src/together/types/models.py +0 -0
  60. {together-1.5.5 → together-1.5.7}/src/together/types/rerank.py +0 -0
  61. {together-1.5.5 → together-1.5.7}/src/together/utils/__init__.py +0 -0
  62. {together-1.5.5 → together-1.5.7}/src/together/utils/_log.py +0 -0
  63. {together-1.5.5 → together-1.5.7}/src/together/utils/api_helpers.py +0 -0
  64. {together-1.5.5 → together-1.5.7}/src/together/utils/files.py +0 -0
  65. {together-1.5.5 → together-1.5.7}/src/together/utils/tools.py +0 -0
  66. {together-1.5.5 → together-1.5.7}/src/together/version.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: together
3
- Version: 1.5.5
3
+ Version: 1.5.7
4
4
  Summary: Python client for Together's Cloud Platform!
5
5
  License: Apache-2.0
6
6
  Author: Together AI
@@ -23,7 +23,7 @@ Requires-Dist: pillow (>=11.1.0,<12.0.0)
23
23
  Requires-Dist: pyarrow (>=10.0.1)
24
24
  Requires-Dist: pydantic (>=2.6.3,<3.0.0)
25
25
  Requires-Dist: requests (>=2.31.0,<3.0.0)
26
- Requires-Dist: rich (>=13.8.1,<14.0.0)
26
+ Requires-Dist: rich (>=13.8.1,<15.0.0)
27
27
  Requires-Dist: tabulate (>=0.9.0,<0.10.0)
28
28
  Requires-Dist: tqdm (>=4.66.2,<5.0.0)
29
29
  Requires-Dist: typer (>=0.9,<0.16)
@@ -220,6 +220,30 @@ async def async_chat_completion(messages):
220
220
  asyncio.run(async_chat_completion(messages))
221
221
  ```
222
222
 
223
+ #### Fetching logprobs
224
+
225
+ Logprobs are logarithms of token-level generation probabilities that indicate the likelihood of the generated token based on the previous tokens in the context. Logprobs allow us to estimate the model's confidence in its outputs, which can be used to decide how to optimally consume the model's output (e.g. rejecting low confidence outputs, retrying or ensembling model outputs etc).
226
+
227
+ ```python
228
+ from together import Together
229
+
230
+ client = Together()
231
+
232
+ response = client.chat.completions.create(
233
+ model="mistralai/Mixtral-8x7B-Instruct-v0.1",
234
+ messages=[{"role": "user", "content": "tell me about new york"}],
235
+ logprobs=1
236
+ )
237
+
238
+ response_lobprobs = response.choices[0].logprobs
239
+
240
+ print(dict(zip(response_lobprobs.tokens, response_lobprobs.token_logprobs)))
241
+ # {'New': -2.384e-07, ' York': 0.0, ',': 0.0, ' also': -0.20703125, ' known': -0.20214844, ' as': -8.34465e-07, ... }
242
+ ```
243
+
244
+ More details about using logprobs in Together's API can be found [here](https://docs.together.ai/docs/logprobs).
245
+
246
+
223
247
  ### Completions
224
248
 
225
249
  Completions are for code and language models shown [here](https://docs.together.ai/docs/inference-models). Below, a code model example is shown.
@@ -186,6 +186,30 @@ async def async_chat_completion(messages):
186
186
  asyncio.run(async_chat_completion(messages))
187
187
  ```
188
188
 
189
+ #### Fetching logprobs
190
+
191
+ Logprobs are logarithms of token-level generation probabilities that indicate the likelihood of the generated token based on the previous tokens in the context. Logprobs allow us to estimate the model's confidence in its outputs, which can be used to decide how to optimally consume the model's output (e.g. rejecting low confidence outputs, retrying or ensembling model outputs etc).
192
+
193
+ ```python
194
+ from together import Together
195
+
196
+ client = Together()
197
+
198
+ response = client.chat.completions.create(
199
+ model="mistralai/Mixtral-8x7B-Instruct-v0.1",
200
+ messages=[{"role": "user", "content": "tell me about new york"}],
201
+ logprobs=1
202
+ )
203
+
204
+ response_lobprobs = response.choices[0].logprobs
205
+
206
+ print(dict(zip(response_lobprobs.tokens, response_lobprobs.token_logprobs)))
207
+ # {'New': -2.384e-07, ' York': 0.0, ',': 0.0, ' also': -0.20703125, ' known': -0.20214844, ' as': -8.34465e-07, ... }
208
+ ```
209
+
210
+ More details about using logprobs in Together's API can be found [here](https://docs.together.ai/docs/logprobs).
211
+
212
+
189
213
  ### Completions
190
214
 
191
215
  Completions are for code and language models shown [here](https://docs.together.ai/docs/inference-models). Below, a code model example is shown.
@@ -12,7 +12,7 @@ build-backend = "poetry.masonry.api"
12
12
 
13
13
  [tool.poetry]
14
14
  name = "together"
15
- version = "1.5.5"
15
+ version = "1.5.7"
16
16
  authors = ["Together AI <support@together.ai>"]
17
17
  description = "Python client for Together's Cloud Platform!"
18
18
  readme = "README.md"
@@ -29,7 +29,7 @@ homepage = "https://github.com/togethercomputer/together-python"
29
29
  python = "^3.10"
30
30
  typer = ">=0.9,<0.16"
31
31
  requests = "^2.31.0"
32
- rich = "^13.8.1"
32
+ rich = ">=13.8.1,<15.0.0"
33
33
  tqdm = "^4.66.2"
34
34
  tabulate = "^0.9.0"
35
35
  pydantic = "^2.6.3"
@@ -49,10 +49,10 @@ optional = true
49
49
 
50
50
  [tool.poetry.group.quality.dependencies]
51
51
  black = ">=23.1,<26.0"
52
- ruff = ">=0.3.2,<0.10.0"
52
+ ruff = ">=0.3.2,<0.12.0"
53
53
  types-tqdm = "^4.65.0.0"
54
54
  types-tabulate = "^0.9.0.3"
55
- pre-commit = "4.1.0"
55
+ pre-commit = "4.2.0"
56
56
  types-requests = "^2.31.0.20240218"
57
57
  pyarrow-stubs = ">=10.0.1.7,<20240831.0.0.0"
58
58
  mypy = "^1.9.0"
@@ -258,10 +258,13 @@ def create(
258
258
  raise click.BadParameter(
259
259
  f"LoRA fine-tuning is not supported for the model `{model}`"
260
260
  )
261
-
261
+ if training_method == "dpo":
262
+ default_batch_size = model_limits.lora_training.max_batch_size_dpo
263
+ else:
264
+ default_batch_size = model_limits.lora_training.max_batch_size
262
265
  default_values = {
263
266
  "lora_r": model_limits.lora_training.max_rank,
264
- "batch_size": model_limits.lora_training.max_batch_size,
267
+ "batch_size": default_batch_size,
265
268
  "learning_rate": 1e-3,
266
269
  }
267
270
 
@@ -288,7 +291,12 @@ def create(
288
291
 
289
292
  batch_size_source = ctx.get_parameter_source("batch_size") # type: ignore[attr-defined]
290
293
  if batch_size_source == ParameterSource.DEFAULT:
291
- training_args["batch_size"] = model_limits.full_training.max_batch_size
294
+ if training_method == "dpo":
295
+ training_args["batch_size"] = (
296
+ model_limits.full_training.max_batch_size_dpo
297
+ )
298
+ else:
299
+ training_args["batch_size"] = model_limits.full_training.max_batch_size
292
300
 
293
301
  if n_evals <= 0 and validation_file:
294
302
  log_warn(
@@ -1,11 +1,12 @@
1
1
  from __future__ import annotations
2
2
 
3
- from typing import Dict, Literal, Optional
3
+ from typing import Any, Dict, List, Literal, Optional
4
+ from pydantic import ValidationError
4
5
 
5
6
  from together.abstract import api_requestor
6
7
  from together.together_response import TogetherResponse
7
8
  from together.types import TogetherClient, TogetherRequest
8
- from together.types.code_interpreter import ExecuteResponse
9
+ from together.types.code_interpreter import ExecuteResponse, FileInput
9
10
 
10
11
 
11
12
  class CodeInterpreter:
@@ -19,22 +20,28 @@ class CodeInterpreter:
19
20
  code: str,
20
21
  language: Literal["python"],
21
22
  session_id: Optional[str] = None,
23
+ files: Optional[List[Dict[str, Any]]] = None,
22
24
  ) -> ExecuteResponse:
23
- """Execute a code snippet.
25
+ """Execute a code snippet, optionally with files.
24
26
 
25
27
  Args:
26
28
  code (str): Code snippet to execute
27
29
  language (str): Programming language for the code to execute. Currently only supports Python.
28
30
  session_id (str, optional): Identifier of the current session. Used to make follow-up calls.
31
+ files (List[Dict], optional): Files to upload to the session before executing the code.
29
32
 
30
33
  Returns:
31
34
  ExecuteResponse: Object containing execution results and outputs
35
+
36
+ Raises:
37
+ ValidationError: If any dictionary in the `files` list does not conform to the
38
+ required structure or types.
32
39
  """
33
40
  requestor = api_requestor.APIRequestor(
34
41
  client=self._client,
35
42
  )
36
43
 
37
- data: Dict[str, str] = {
44
+ data: Dict[str, Any] = {
38
45
  "code": code,
39
46
  "language": language,
40
47
  }
@@ -42,6 +49,23 @@ class CodeInterpreter:
42
49
  if session_id is not None:
43
50
  data["session_id"] = session_id
44
51
 
52
+ if files is not None:
53
+ serialized_files = []
54
+ try:
55
+ for file_dict in files:
56
+ # Validate the dictionary by creating a FileInput instance
57
+ validated_file = FileInput(**file_dict)
58
+ # Serialize the validated model back to a dict for the API call
59
+ serialized_files.append(validated_file.model_dump())
60
+ except ValidationError as e:
61
+ raise ValueError(f"Invalid file input format: {e}") from e
62
+ except TypeError as e:
63
+ raise ValueError(
64
+ f"Invalid file input: Each item in 'files' must be a dictionary. Error: {e}"
65
+ ) from e
66
+
67
+ data["files"] = serialized_files
68
+
45
69
  # Use absolute URL to bypass the /v1 prefix
46
70
  response, _, _ = requestor.request(
47
71
  options=TogetherRequest(
@@ -102,6 +102,7 @@ def create_finetune_request(
102
102
 
103
103
  training_type: TrainingType = FullTrainingType()
104
104
  max_batch_size: int = 0
105
+ max_batch_size_dpo: int = 0
105
106
  min_batch_size: int = 0
106
107
  if lora:
107
108
  if model_limits.lora_training is None:
@@ -119,7 +120,7 @@ def create_finetune_request(
119
120
 
120
121
  max_batch_size = model_limits.lora_training.max_batch_size
121
122
  min_batch_size = model_limits.lora_training.min_batch_size
122
-
123
+ max_batch_size_dpo = model_limits.lora_training.max_batch_size_dpo
123
124
  else:
124
125
  if model_limits.full_training is None:
125
126
  raise ValueError(
@@ -128,13 +129,24 @@ def create_finetune_request(
128
129
 
129
130
  max_batch_size = model_limits.full_training.max_batch_size
130
131
  min_batch_size = model_limits.full_training.min_batch_size
132
+ max_batch_size_dpo = model_limits.full_training.max_batch_size_dpo
131
133
 
132
- batch_size = batch_size if batch_size != "max" else max_batch_size
134
+ if batch_size == "max":
135
+ if training_method == "dpo":
136
+ batch_size = max_batch_size_dpo
137
+ else:
138
+ batch_size = max_batch_size
133
139
 
134
- if batch_size > max_batch_size:
135
- raise ValueError(
136
- f"Requested batch size of {batch_size} is higher that the maximum allowed value of {max_batch_size}."
137
- )
140
+ if training_method == "sft":
141
+ if batch_size > max_batch_size:
142
+ raise ValueError(
143
+ f"Requested batch size of {batch_size} is higher that the maximum allowed value of {max_batch_size}."
144
+ )
145
+ elif training_method == "dpo":
146
+ if batch_size > max_batch_size_dpo:
147
+ raise ValueError(
148
+ f"Requested batch size of {batch_size} is higher that the maximum allowed value of {max_batch_size_dpo}."
149
+ )
138
150
 
139
151
  if batch_size < min_batch_size:
140
152
  raise ValueError(
@@ -600,7 +612,7 @@ class FineTuning:
600
612
  raise ValueError(
601
613
  "Only DEFAULT checkpoint type is allowed for FullTrainingType"
602
614
  )
603
- url += "&checkpoint=modelOutputPath"
615
+ url += "&checkpoint=model_output_path"
604
616
  elif isinstance(ft_job.training_type, LoRATrainingType):
605
617
  if checkpoint_type == DownloadCheckpointType.DEFAULT:
606
618
  checkpoint_type = DownloadCheckpointType.MERGED
@@ -7,6 +7,16 @@ from pydantic import Field
7
7
  from together.types.endpoints import TogetherJSONModel
8
8
 
9
9
 
10
+ class FileInput(TogetherJSONModel):
11
+ """File input to be uploaded to the code interpreter session."""
12
+
13
+ name: str = Field(description="The name of the file.")
14
+ encoding: Literal["string", "base64"] = Field(
15
+ description="Encoding of the file content. Use 'string' for text files and 'base64' for binary files."
16
+ )
17
+ content: str = Field(description="The content of the file, encoded as specified.")
18
+
19
+
10
20
  class InterpreterOutput(TogetherJSONModel):
11
21
  """Base class for interpreter output types."""
12
22
 
@@ -40,6 +50,7 @@ class ExecuteResponse(TogetherJSONModel):
40
50
 
41
51
 
42
52
  __all__ = [
53
+ "FileInput",
43
54
  "InterpreterOutput",
44
55
  "ExecuteResponseData",
45
56
  "ExecuteResponse",
@@ -1,7 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  from enum import Enum
4
- from typing import List, Literal
4
+ from typing import List, Literal, Any
5
5
 
6
6
  from pydantic import StrictBool, Field, field_validator
7
7
 
@@ -329,8 +329,16 @@ class FinetuneDownloadResult(BaseModel):
329
329
 
330
330
  class FinetuneFullTrainingLimits(BaseModel):
331
331
  max_batch_size: int
332
+ max_batch_size_dpo: int = -1
332
333
  min_batch_size: int
333
334
 
335
+ def __init__(self, **data: Any) -> None:
336
+ super().__init__(**data)
337
+ if self.max_batch_size_dpo == -1:
338
+ half_max = self.max_batch_size // 2
339
+ rounded_half_max = (half_max // 8) * 8
340
+ self.max_batch_size_dpo = max(self.min_batch_size, rounded_half_max)
341
+
334
342
 
335
343
  class FinetuneLoraTrainingLimits(FinetuneFullTrainingLimits):
336
344
  max_rank: int
File without changes
File without changes