together 1.5.2__tar.gz → 1.5.4__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.2 → together-1.5.4}/PKG-INFO +1 -1
  2. {together-1.5.2 → together-1.5.4}/pyproject.toml +3 -4
  3. {together-1.5.2 → together-1.5.4}/src/together/client.py +5 -0
  4. together-1.5.4/src/together/resources/code_interpreter.py +58 -0
  5. {together-1.5.2 → together-1.5.4}/src/together/resources/finetune.py +22 -15
  6. together-1.5.4/src/together/types/code_interpreter.py +46 -0
  7. {together-1.5.2 → together-1.5.4}/src/together/types/finetune.py +1 -1
  8. {together-1.5.2 → together-1.5.4}/LICENSE +0 -0
  9. {together-1.5.2 → together-1.5.4}/README.md +0 -0
  10. {together-1.5.2 → together-1.5.4}/src/together/__init__.py +0 -0
  11. {together-1.5.2 → together-1.5.4}/src/together/abstract/__init__.py +0 -0
  12. {together-1.5.2 → together-1.5.4}/src/together/abstract/api_requestor.py +0 -0
  13. {together-1.5.2 → together-1.5.4}/src/together/cli/__init__.py +0 -0
  14. {together-1.5.2 → together-1.5.4}/src/together/cli/api/__init__.py +0 -0
  15. {together-1.5.2 → together-1.5.4}/src/together/cli/api/chat.py +0 -0
  16. {together-1.5.2 → together-1.5.4}/src/together/cli/api/completions.py +0 -0
  17. {together-1.5.2 → together-1.5.4}/src/together/cli/api/endpoints.py +0 -0
  18. {together-1.5.2 → together-1.5.4}/src/together/cli/api/files.py +0 -0
  19. {together-1.5.2 → together-1.5.4}/src/together/cli/api/finetune.py +0 -0
  20. {together-1.5.2 → together-1.5.4}/src/together/cli/api/images.py +0 -0
  21. {together-1.5.2 → together-1.5.4}/src/together/cli/api/models.py +0 -0
  22. {together-1.5.2 → together-1.5.4}/src/together/cli/api/utils.py +0 -0
  23. {together-1.5.2 → together-1.5.4}/src/together/cli/cli.py +0 -0
  24. {together-1.5.2 → together-1.5.4}/src/together/constants.py +0 -0
  25. {together-1.5.2 → together-1.5.4}/src/together/error.py +0 -0
  26. {together-1.5.2 → together-1.5.4}/src/together/filemanager.py +0 -0
  27. {together-1.5.2 → together-1.5.4}/src/together/legacy/__init__.py +0 -0
  28. {together-1.5.2 → together-1.5.4}/src/together/legacy/base.py +0 -0
  29. {together-1.5.2 → together-1.5.4}/src/together/legacy/complete.py +0 -0
  30. {together-1.5.2 → together-1.5.4}/src/together/legacy/embeddings.py +0 -0
  31. {together-1.5.2 → together-1.5.4}/src/together/legacy/files.py +0 -0
  32. {together-1.5.2 → together-1.5.4}/src/together/legacy/finetune.py +0 -0
  33. {together-1.5.2 → together-1.5.4}/src/together/legacy/images.py +0 -0
  34. {together-1.5.2 → together-1.5.4}/src/together/legacy/models.py +0 -0
  35. {together-1.5.2 → together-1.5.4}/src/together/resources/__init__.py +0 -0
  36. {together-1.5.2 → together-1.5.4}/src/together/resources/audio/__init__.py +0 -0
  37. {together-1.5.2 → together-1.5.4}/src/together/resources/audio/speech.py +0 -0
  38. {together-1.5.2 → together-1.5.4}/src/together/resources/chat/__init__.py +0 -0
  39. {together-1.5.2 → together-1.5.4}/src/together/resources/chat/completions.py +0 -0
  40. {together-1.5.2 → together-1.5.4}/src/together/resources/completions.py +0 -0
  41. {together-1.5.2 → together-1.5.4}/src/together/resources/embeddings.py +0 -0
  42. {together-1.5.2 → together-1.5.4}/src/together/resources/endpoints.py +0 -0
  43. {together-1.5.2 → together-1.5.4}/src/together/resources/files.py +0 -0
  44. {together-1.5.2 → together-1.5.4}/src/together/resources/images.py +0 -0
  45. {together-1.5.2 → together-1.5.4}/src/together/resources/models.py +0 -0
  46. {together-1.5.2 → together-1.5.4}/src/together/resources/rerank.py +0 -0
  47. {together-1.5.2 → together-1.5.4}/src/together/together_response.py +0 -0
  48. {together-1.5.2 → together-1.5.4}/src/together/types/__init__.py +0 -0
  49. {together-1.5.2 → together-1.5.4}/src/together/types/abstract.py +0 -0
  50. {together-1.5.2 → together-1.5.4}/src/together/types/audio_speech.py +0 -0
  51. {together-1.5.2 → together-1.5.4}/src/together/types/chat_completions.py +0 -0
  52. {together-1.5.2 → together-1.5.4}/src/together/types/common.py +0 -0
  53. {together-1.5.2 → together-1.5.4}/src/together/types/completions.py +0 -0
  54. {together-1.5.2 → together-1.5.4}/src/together/types/embeddings.py +0 -0
  55. {together-1.5.2 → together-1.5.4}/src/together/types/endpoints.py +0 -0
  56. {together-1.5.2 → together-1.5.4}/src/together/types/error.py +0 -0
  57. {together-1.5.2 → together-1.5.4}/src/together/types/files.py +0 -0
  58. {together-1.5.2 → together-1.5.4}/src/together/types/images.py +0 -0
  59. {together-1.5.2 → together-1.5.4}/src/together/types/models.py +0 -0
  60. {together-1.5.2 → together-1.5.4}/src/together/types/rerank.py +0 -0
  61. {together-1.5.2 → together-1.5.4}/src/together/utils/__init__.py +0 -0
  62. {together-1.5.2 → together-1.5.4}/src/together/utils/_log.py +0 -0
  63. {together-1.5.2 → together-1.5.4}/src/together/utils/api_helpers.py +0 -0
  64. {together-1.5.2 → together-1.5.4}/src/together/utils/files.py +0 -0
  65. {together-1.5.2 → together-1.5.4}/src/together/utils/tools.py +0 -0
  66. {together-1.5.2 → together-1.5.4}/src/together/version.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: together
3
- Version: 1.5.2
3
+ Version: 1.5.4
4
4
  Summary: Python client for Together's Cloud Platform!
5
5
  License: Apache-2.0
6
6
  Author: Together AI
@@ -12,10 +12,8 @@ build-backend = "poetry.masonry.api"
12
12
 
13
13
  [tool.poetry]
14
14
  name = "together"
15
- version = "1.5.2"
16
- authors = [
17
- "Together AI <support@together.ai>"
18
- ]
15
+ version = "1.5.4"
16
+ authors = ["Together AI <support@together.ai>"]
19
17
  description = "Python client for Together's Cloud Platform!"
20
18
  readme = "README.md"
21
19
  license = "Apache-2.0"
@@ -65,6 +63,7 @@ optional = true
65
63
  [tool.poetry.group.tests.dependencies]
66
64
  pytest = ">=7.4.2,<9.0.0"
67
65
  pytest-watch = "^4.2.0"
66
+ pytest-mock = "^3.14.0"
68
67
  tox = "^4.14.1"
69
68
 
70
69
  [tool.poetry.group.examples]
@@ -7,6 +7,7 @@ from typing import Dict, TYPE_CHECKING
7
7
  from together import resources
8
8
  from together.constants import BASE_URL, MAX_RETRIES, TIMEOUT_SECS
9
9
  from together.error import AuthenticationError
10
+ from together.resources.code_interpreter import CodeInterpreter
10
11
  from together.types import TogetherClient
11
12
  from together.utils import enforce_trailing_slash
12
13
  from together.utils.api_helpers import get_google_colab_secret
@@ -22,6 +23,7 @@ class Together:
22
23
  fine_tuning: resources.FineTuning
23
24
  rerank: resources.Rerank
24
25
  audio: resources.Audio
26
+ code_interpreter: CodeInterpreter
25
27
 
26
28
  # client options
27
29
  client: TogetherClient
@@ -87,6 +89,7 @@ class Together:
87
89
  self.rerank = resources.Rerank(self.client)
88
90
  self.audio = resources.Audio(self.client)
89
91
  self.endpoints = resources.Endpoints(self.client)
92
+ self.code_interpreter = CodeInterpreter(self.client)
90
93
 
91
94
 
92
95
  class AsyncTogether:
@@ -98,6 +101,7 @@ class AsyncTogether:
98
101
  models: resources.AsyncModels
99
102
  fine_tuning: resources.AsyncFineTuning
100
103
  rerank: resources.AsyncRerank
104
+ code_interpreter: CodeInterpreter
101
105
 
102
106
  # client options
103
107
  client: TogetherClient
@@ -161,6 +165,7 @@ class AsyncTogether:
161
165
  self.models = resources.AsyncModels(self.client)
162
166
  self.fine_tuning = resources.AsyncFineTuning(self.client)
163
167
  self.rerank = resources.AsyncRerank(self.client)
168
+ self.code_interpreter = CodeInterpreter(self.client)
164
169
 
165
170
 
166
171
  Client = Together
@@ -0,0 +1,58 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import Dict, Literal, Optional
4
+
5
+ from together.abstract import api_requestor
6
+ from together.together_response import TogetherResponse
7
+ from together.types import TogetherClient, TogetherRequest
8
+ from together.types.code_interpreter import ExecuteResponse
9
+
10
+
11
+ class CodeInterpreter:
12
+ """Code Interpreter resource for executing code snippets."""
13
+
14
+ def __init__(self, client: TogetherClient) -> None:
15
+ self._client = client
16
+
17
+ def run(
18
+ self,
19
+ code: str,
20
+ language: Literal["python"],
21
+ session_id: Optional[str] = None,
22
+ ) -> ExecuteResponse:
23
+ """Execute a code snippet.
24
+
25
+ Args:
26
+ code (str): Code snippet to execute
27
+ language (str): Programming language for the code to execute. Currently only supports Python.
28
+ session_id (str, optional): Identifier of the current session. Used to make follow-up calls.
29
+
30
+ Returns:
31
+ ExecuteResponse: Object containing execution results and outputs
32
+ """
33
+ requestor = api_requestor.APIRequestor(
34
+ client=self._client,
35
+ )
36
+
37
+ data: Dict[str, str] = {
38
+ "code": code,
39
+ "language": language,
40
+ }
41
+
42
+ if session_id is not None:
43
+ data["session_id"] = session_id
44
+
45
+ # Use absolute URL to bypass the /v1 prefix
46
+ response, _, _ = requestor.request(
47
+ options=TogetherRequest(
48
+ method="POST",
49
+ url="/tci/execute",
50
+ params=data,
51
+ ),
52
+ stream=False,
53
+ )
54
+
55
+ assert isinstance(response, TogetherResponse)
56
+
57
+ # Return the response data directly since our types match the API structure
58
+ return ExecuteResponse(**response.data)
@@ -87,6 +87,9 @@ def createFinetuneRequest(
87
87
  "You must specify either a model or a checkpoint to start a job from, not both"
88
88
  )
89
89
 
90
+ if model is None and from_checkpoint is None:
91
+ raise ValueError("You must specify either a model or a checkpoint")
92
+
90
93
  if batch_size == "max":
91
94
  log_warn_once(
92
95
  "Starting from together>=1.3.0, "
@@ -96,6 +99,8 @@ def createFinetuneRequest(
96
99
  warmup_ratio = 0.0
97
100
 
98
101
  training_type: TrainingType = FullTrainingType()
102
+ max_batch_size: int = 0
103
+ min_batch_size: int = 0
99
104
  if lora:
100
105
  if model_limits.lora_training is None:
101
106
  raise ValueError("LoRA adapters are not supported for the selected model.")
@@ -108,18 +113,26 @@ def createFinetuneRequest(
108
113
  lora_trainable_modules=lora_trainable_modules,
109
114
  )
110
115
 
111
- batch_size = (
112
- batch_size
113
- if batch_size != "max"
114
- else model_limits.lora_training.max_batch_size
115
- )
116
+ max_batch_size = model_limits.lora_training.max_batch_size
117
+ min_batch_size = model_limits.lora_training.min_batch_size
118
+
116
119
  else:
117
120
  if model_limits.full_training is None:
118
121
  raise ValueError("Full training is not supported for the selected model.")
119
- batch_size = (
120
- batch_size
121
- if batch_size != "max"
122
- else model_limits.full_training.max_batch_size
122
+
123
+ max_batch_size = model_limits.full_training.max_batch_size
124
+ min_batch_size = model_limits.full_training.min_batch_size
125
+
126
+ batch_size = batch_size if batch_size != "max" else max_batch_size
127
+
128
+ if batch_size > max_batch_size:
129
+ raise ValueError(
130
+ "Requested batch size is higher that the maximum allowed value."
131
+ )
132
+
133
+ if batch_size < min_batch_size:
134
+ raise ValueError(
135
+ "Requested batch size is lower that the minimum allowed value."
123
136
  )
124
137
 
125
138
  if warmup_ratio > 1 or warmup_ratio < 0:
@@ -346,9 +359,6 @@ class FineTuning:
346
359
  FinetuneResponse: Object containing information about fine-tuning job.
347
360
  """
348
361
 
349
- if model is None and from_checkpoint is None:
350
- raise ValueError("You must specify either a model or a checkpoint")
351
-
352
362
  requestor = api_requestor.APIRequestor(
353
363
  client=self._client,
354
364
  )
@@ -737,9 +747,6 @@ class AsyncFineTuning:
737
747
  FinetuneResponse: Object containing information about fine-tuning job.
738
748
  """
739
749
 
740
- if model is None and from_checkpoint is None:
741
- raise ValueError("You must specify either a model or a checkpoint")
742
-
743
750
  requestor = api_requestor.APIRequestor(
744
751
  client=self._client,
745
752
  )
@@ -0,0 +1,46 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import Any, Dict, Literal, Union
4
+
5
+ from pydantic import Field
6
+
7
+ from together.types.endpoints import TogetherJSONModel
8
+
9
+
10
+ class InterpreterOutput(TogetherJSONModel):
11
+ """Base class for interpreter output types."""
12
+
13
+ type: Literal["stdout", "stderr", "error", "display_data", "execute_result"] = (
14
+ Field(description="The type of output")
15
+ )
16
+ data: Union[str, Dict[str, Any]] = Field(description="The output data")
17
+
18
+
19
+ class ExecuteResponseData(TogetherJSONModel):
20
+ """Data from code execution response."""
21
+
22
+ outputs: list[InterpreterOutput] = Field(
23
+ description="List of outputs from execution", default_factory=list
24
+ )
25
+ errors: Union[str, None] = Field(
26
+ description="Any errors that occurred during execution", default=None
27
+ )
28
+ session_id: str = Field(
29
+ description="Identifier of the current session. Used to make follow-up calls."
30
+ )
31
+ status: str = Field(description="Status of the execution", default="completed")
32
+
33
+
34
+ class ExecuteResponse(TogetherJSONModel):
35
+ """Response from code execution."""
36
+
37
+ data: ExecuteResponseData = Field(
38
+ description="The response data containing outputs and session information"
39
+ )
40
+
41
+
42
+ __all__ = [
43
+ "InterpreterOutput",
44
+ "ExecuteResponseData",
45
+ "ExecuteResponse",
46
+ ]
@@ -170,7 +170,7 @@ class FinetuneRequest(BaseModel):
170
170
  # validation file id
171
171
  validation_file: str | None = None
172
172
  # base model string
173
- model: str
173
+ model: str | None = None
174
174
  # number of epochs to train for
175
175
  n_epochs: int
176
176
  # training learning rate
File without changes
File without changes
File without changes