together 1.5.35__py3-none-any.whl → 2.0.0a6__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.
Files changed (208) hide show
  1. together/__init__.py +101 -114
  2. together/_base_client.py +1995 -0
  3. together/_client.py +1033 -0
  4. together/_compat.py +219 -0
  5. together/_constants.py +14 -0
  6. together/_exceptions.py +108 -0
  7. together/_files.py +123 -0
  8. together/_models.py +857 -0
  9. together/_qs.py +150 -0
  10. together/_resource.py +43 -0
  11. together/_response.py +830 -0
  12. together/_streaming.py +370 -0
  13. together/_types.py +260 -0
  14. together/_utils/__init__.py +64 -0
  15. together/_utils/_compat.py +45 -0
  16. together/_utils/_datetime_parse.py +136 -0
  17. together/_utils/_logs.py +25 -0
  18. together/_utils/_proxy.py +65 -0
  19. together/_utils/_reflection.py +42 -0
  20. together/_utils/_resources_proxy.py +24 -0
  21. together/_utils/_streams.py +12 -0
  22. together/_utils/_sync.py +58 -0
  23. together/_utils/_transform.py +457 -0
  24. together/_utils/_typing.py +156 -0
  25. together/_utils/_utils.py +421 -0
  26. together/_version.py +4 -0
  27. together/lib/.keep +4 -0
  28. together/lib/__init__.py +23 -0
  29. together/{cli → lib/cli}/api/endpoints.py +66 -84
  30. together/{cli/api/evaluation.py → lib/cli/api/evals.py} +152 -43
  31. together/{cli → lib/cli}/api/files.py +20 -17
  32. together/{cli/api/finetune.py → lib/cli/api/fine_tuning.py} +116 -172
  33. together/{cli → lib/cli}/api/models.py +34 -27
  34. together/lib/cli/api/utils.py +50 -0
  35. together/{cli → lib/cli}/cli.py +16 -26
  36. together/{constants.py → lib/constants.py} +11 -24
  37. together/lib/resources/__init__.py +11 -0
  38. together/lib/resources/files.py +999 -0
  39. together/lib/resources/fine_tuning.py +280 -0
  40. together/lib/resources/models.py +35 -0
  41. together/lib/types/__init__.py +13 -0
  42. together/lib/types/error.py +9 -0
  43. together/lib/types/fine_tuning.py +397 -0
  44. together/{utils → lib/utils}/__init__.py +6 -14
  45. together/{utils → lib/utils}/_log.py +11 -16
  46. together/{utils → lib/utils}/files.py +90 -288
  47. together/lib/utils/serializer.py +10 -0
  48. together/{utils → lib/utils}/tools.py +19 -55
  49. together/resources/__init__.py +225 -39
  50. together/resources/audio/__init__.py +72 -48
  51. together/resources/audio/audio.py +198 -0
  52. together/resources/audio/speech.py +574 -128
  53. together/resources/audio/transcriptions.py +247 -261
  54. together/resources/audio/translations.py +221 -241
  55. together/resources/audio/voices.py +111 -41
  56. together/resources/batches.py +417 -0
  57. together/resources/chat/__init__.py +30 -21
  58. together/resources/chat/chat.py +102 -0
  59. together/resources/chat/completions.py +1063 -263
  60. together/resources/code_interpreter/__init__.py +33 -0
  61. together/resources/code_interpreter/code_interpreter.py +258 -0
  62. together/resources/code_interpreter/sessions.py +135 -0
  63. together/resources/completions.py +884 -225
  64. together/resources/embeddings.py +172 -68
  65. together/resources/endpoints.py +589 -490
  66. together/resources/evals.py +452 -0
  67. together/resources/files.py +397 -129
  68. together/resources/fine_tuning.py +1033 -0
  69. together/resources/hardware.py +181 -0
  70. together/resources/images.py +258 -104
  71. together/resources/jobs.py +214 -0
  72. together/resources/models.py +223 -193
  73. together/resources/rerank.py +190 -92
  74. together/resources/videos.py +286 -214
  75. together/types/__init__.py +66 -167
  76. together/types/audio/__init__.py +10 -0
  77. together/types/audio/speech_create_params.py +75 -0
  78. together/types/audio/transcription_create_params.py +54 -0
  79. together/types/audio/transcription_create_response.py +111 -0
  80. together/types/audio/translation_create_params.py +40 -0
  81. together/types/audio/translation_create_response.py +70 -0
  82. together/types/audio/voice_list_response.py +23 -0
  83. together/types/audio_speech_stream_chunk.py +16 -0
  84. together/types/autoscaling.py +13 -0
  85. together/types/autoscaling_param.py +15 -0
  86. together/types/batch_create_params.py +24 -0
  87. together/types/batch_create_response.py +14 -0
  88. together/types/batch_job.py +45 -0
  89. together/types/batch_list_response.py +10 -0
  90. together/types/chat/__init__.py +18 -0
  91. together/types/chat/chat_completion.py +60 -0
  92. together/types/chat/chat_completion_chunk.py +61 -0
  93. together/types/chat/chat_completion_structured_message_image_url_param.py +18 -0
  94. together/types/chat/chat_completion_structured_message_text_param.py +13 -0
  95. together/types/chat/chat_completion_structured_message_video_url_param.py +18 -0
  96. together/types/chat/chat_completion_usage.py +13 -0
  97. together/types/chat/chat_completion_warning.py +9 -0
  98. together/types/chat/completion_create_params.py +329 -0
  99. together/types/code_interpreter/__init__.py +5 -0
  100. together/types/code_interpreter/session_list_response.py +31 -0
  101. together/types/code_interpreter_execute_params.py +45 -0
  102. together/types/completion.py +42 -0
  103. together/types/completion_chunk.py +66 -0
  104. together/types/completion_create_params.py +138 -0
  105. together/types/dedicated_endpoint.py +44 -0
  106. together/types/embedding.py +24 -0
  107. together/types/embedding_create_params.py +31 -0
  108. together/types/endpoint_create_params.py +43 -0
  109. together/types/endpoint_list_avzones_response.py +11 -0
  110. together/types/endpoint_list_params.py +18 -0
  111. together/types/endpoint_list_response.py +41 -0
  112. together/types/endpoint_update_params.py +27 -0
  113. together/types/eval_create_params.py +263 -0
  114. together/types/eval_create_response.py +16 -0
  115. together/types/eval_list_params.py +21 -0
  116. together/types/eval_list_response.py +10 -0
  117. together/types/eval_status_response.py +100 -0
  118. together/types/evaluation_job.py +139 -0
  119. together/types/execute_response.py +108 -0
  120. together/types/file_delete_response.py +13 -0
  121. together/types/file_list.py +12 -0
  122. together/types/file_purpose.py +9 -0
  123. together/types/file_response.py +31 -0
  124. together/types/file_type.py +7 -0
  125. together/types/fine_tuning_cancel_response.py +194 -0
  126. together/types/fine_tuning_content_params.py +24 -0
  127. together/types/fine_tuning_delete_params.py +11 -0
  128. together/types/fine_tuning_delete_response.py +12 -0
  129. together/types/fine_tuning_list_checkpoints_response.py +21 -0
  130. together/types/fine_tuning_list_events_response.py +12 -0
  131. together/types/fine_tuning_list_response.py +199 -0
  132. together/types/finetune_event.py +41 -0
  133. together/types/finetune_event_type.py +33 -0
  134. together/types/finetune_response.py +177 -0
  135. together/types/hardware_list_params.py +16 -0
  136. together/types/hardware_list_response.py +58 -0
  137. together/types/image_data_b64.py +15 -0
  138. together/types/image_data_url.py +15 -0
  139. together/types/image_file.py +23 -0
  140. together/types/image_generate_params.py +85 -0
  141. together/types/job_list_response.py +47 -0
  142. together/types/job_retrieve_response.py +43 -0
  143. together/types/log_probs.py +18 -0
  144. together/types/model_list_response.py +10 -0
  145. together/types/model_object.py +42 -0
  146. together/types/model_upload_params.py +36 -0
  147. together/types/model_upload_response.py +23 -0
  148. together/types/rerank_create_params.py +36 -0
  149. together/types/rerank_create_response.py +36 -0
  150. together/types/tool_choice.py +23 -0
  151. together/types/tool_choice_param.py +23 -0
  152. together/types/tools_param.py +23 -0
  153. together/types/training_method_dpo.py +22 -0
  154. together/types/training_method_sft.py +18 -0
  155. together/types/video_create_params.py +86 -0
  156. together/types/video_create_response.py +10 -0
  157. together/types/video_job.py +57 -0
  158. together-2.0.0a6.dist-info/METADATA +729 -0
  159. together-2.0.0a6.dist-info/RECORD +165 -0
  160. {together-1.5.35.dist-info → together-2.0.0a6.dist-info}/WHEEL +1 -1
  161. together-2.0.0a6.dist-info/entry_points.txt +2 -0
  162. {together-1.5.35.dist-info → together-2.0.0a6.dist-info}/licenses/LICENSE +1 -1
  163. together/abstract/api_requestor.py +0 -770
  164. together/cli/api/chat.py +0 -298
  165. together/cli/api/completions.py +0 -119
  166. together/cli/api/images.py +0 -93
  167. together/cli/api/utils.py +0 -139
  168. together/client.py +0 -186
  169. together/error.py +0 -194
  170. together/filemanager.py +0 -635
  171. together/legacy/__init__.py +0 -0
  172. together/legacy/base.py +0 -27
  173. together/legacy/complete.py +0 -93
  174. together/legacy/embeddings.py +0 -27
  175. together/legacy/files.py +0 -146
  176. together/legacy/finetune.py +0 -177
  177. together/legacy/images.py +0 -27
  178. together/legacy/models.py +0 -44
  179. together/resources/batch.py +0 -165
  180. together/resources/code_interpreter.py +0 -82
  181. together/resources/evaluation.py +0 -808
  182. together/resources/finetune.py +0 -1388
  183. together/together_response.py +0 -50
  184. together/types/abstract.py +0 -26
  185. together/types/audio_speech.py +0 -311
  186. together/types/batch.py +0 -54
  187. together/types/chat_completions.py +0 -210
  188. together/types/code_interpreter.py +0 -57
  189. together/types/common.py +0 -67
  190. together/types/completions.py +0 -107
  191. together/types/embeddings.py +0 -35
  192. together/types/endpoints.py +0 -123
  193. together/types/error.py +0 -16
  194. together/types/evaluation.py +0 -93
  195. together/types/files.py +0 -93
  196. together/types/finetune.py +0 -465
  197. together/types/images.py +0 -42
  198. together/types/models.py +0 -96
  199. together/types/rerank.py +0 -43
  200. together/types/videos.py +0 -69
  201. together/utils/api_helpers.py +0 -124
  202. together/version.py +0 -6
  203. together-1.5.35.dist-info/METADATA +0 -583
  204. together-1.5.35.dist-info/RECORD +0 -77
  205. together-1.5.35.dist-info/entry_points.txt +0 -3
  206. /together/{abstract → lib/cli}/__init__.py +0 -0
  207. /together/{cli → lib/cli/api}/__init__.py +0 -0
  208. /together/{cli/api/__init__.py → py.typed} +0 -0
@@ -1,276 +1,256 @@
1
+ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2
+
1
3
  from __future__ import annotations
2
4
 
3
- from typing import Any, Union, BinaryIO, Optional, Dict, Tuple
4
- from pathlib import Path
5
-
6
- from together.abstract import api_requestor
7
- from together.together_response import TogetherResponse
8
- from together.types import (
9
- AudioTranslationRequest,
10
- AudioTranslationResponse,
11
- AudioTranslationVerboseResponse,
12
- AudioTranscriptionResponseFormat,
13
- AudioTimestampGranularities,
14
- TogetherClient,
15
- TogetherRequest,
5
+ from typing import Any, List, Union, Mapping, cast
6
+ from typing_extensions import Literal
7
+
8
+ import httpx
9
+
10
+ from ..._types import Body, Omit, Query, Headers, NotGiven, FileTypes, omit, not_given
11
+ from ..._utils import extract_files, maybe_transform, deepcopy_minimal, async_maybe_transform
12
+ from ..._compat import cached_property
13
+ from ..._resource import SyncAPIResource, AsyncAPIResource
14
+ from ..._response import (
15
+ to_raw_response_wrapper,
16
+ to_streamed_response_wrapper,
17
+ async_to_raw_response_wrapper,
18
+ async_to_streamed_response_wrapper,
16
19
  )
20
+ from ...types.audio import translation_create_params
21
+ from ..._base_client import make_request_options
22
+ from ...types.audio.translation_create_response import TranslationCreateResponse
23
+
24
+ __all__ = ["TranslationsResource", "AsyncTranslationsResource"]
25
+
26
+
27
+ class TranslationsResource(SyncAPIResource):
28
+ @cached_property
29
+ def with_raw_response(self) -> TranslationsResourceWithRawResponse:
30
+ """
31
+ This property can be used as a prefix for any HTTP method call to return
32
+ the raw response object instead of the parsed content.
33
+
34
+ For more information, see https://www.github.com/togethercomputer/together-py#accessing-raw-response-data-eg-headers
35
+ """
36
+ return TranslationsResourceWithRawResponse(self)
17
37
 
38
+ @cached_property
39
+ def with_streaming_response(self) -> TranslationsResourceWithStreamingResponse:
40
+ """
41
+ An alternative to `.with_raw_response` that doesn't eagerly read the response body.
18
42
 
19
- class Translations:
20
- def __init__(self, client: TogetherClient) -> None:
21
- self._client = client
43
+ For more information, see https://www.github.com/togethercomputer/together-py#with_streaming_response
44
+ """
45
+ return TranslationsResourceWithStreamingResponse(self)
22
46
 
23
47
  def create(
24
48
  self,
25
49
  *,
26
- file: Union[str, BinaryIO, Path],
27
- model: str = "openai/whisper-large-v3",
28
- language: Optional[str] = None,
29
- prompt: Optional[str] = None,
30
- response_format: Union[str, AudioTranscriptionResponseFormat] = "json",
31
- temperature: float = 0.0,
32
- timestamp_granularities: Optional[
33
- Union[str, AudioTimestampGranularities]
34
- ] = None,
35
- **kwargs: Any,
36
- ) -> Union[AudioTranslationResponse, AudioTranslationVerboseResponse]:
50
+ file: FileTypes,
51
+ language: str | Omit = omit,
52
+ model: Literal["openai/whisper-large-v3"] | Omit = omit,
53
+ prompt: str | Omit = omit,
54
+ response_format: Literal["json", "verbose_json"] | Omit = omit,
55
+ temperature: float | Omit = omit,
56
+ timestamp_granularities: Union[Literal["segment", "word"], List[Literal["segment", "word"]]] | Omit = omit,
57
+ # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
58
+ # The extra values given here take precedence over values defined on the client or passed to this method.
59
+ extra_headers: Headers | None = None,
60
+ extra_query: Query | None = None,
61
+ extra_body: Body | None = None,
62
+ timeout: float | httpx.Timeout | None | NotGiven = not_given,
63
+ ) -> TranslationCreateResponse:
37
64
  """
38
- Translates audio into English.
65
+ Translates audio into English
39
66
 
40
67
  Args:
41
- file: The audio file object (not file name) to translate, in one of these formats:
42
- flac, mp3, mp4, mpeg, mpga, m4a, ogg, wav, or webm.
43
- Can be a file path (str/Path), file object (BinaryIO), or URL (str).
44
- model: ID of the model to use. Defaults to "openai/whisper-large-v3".
45
- language: The language of the input audio. Optional ISO-639-1 language code.
46
- If omitted, language is set to English.
47
- prompt: An optional text to guide the model's style or continue a previous
48
- audio segment. The prompt should be in English.
49
- response_format: The format of the transcript output, in one of these options:
50
- json, verbose_json.
51
- temperature: The sampling temperature, between 0 and 1. Higher values like 0.8
52
- will make the output more random, while lower values like 0.2 will make it
53
- more focused and deterministic.
54
- timestamp_granularities: The timestamp granularities to populate for this
55
- translation. response_format must be set verbose_json to use timestamp
56
- granularities. Either or both of these options are supported: word, or segment.
57
-
58
- Returns:
59
- The translated text in the requested format.
60
- """
68
+ file: Audio file to translate
61
69
 
62
- requestor = api_requestor.APIRequestor(
63
- client=self._client,
64
- )
70
+ language: Target output language. Optional ISO 639-1 language code. If omitted, language
71
+ is set to English.
72
+
73
+ model: Model to use for translation
74
+
75
+ prompt: Optional text to bias decoding.
76
+
77
+ response_format: The format of the response
65
78
 
66
- # Handle file input - could be a path, URL, or file object
67
- files_data: Dict[str, Union[Tuple[None, str], BinaryIO]] = {}
68
- params_data = {}
69
-
70
- if isinstance(file, (str, Path)):
71
- if isinstance(file, str) and file.startswith(("http://", "https://")):
72
- # URL string - send as multipart field
73
- files_data["file"] = (None, file)
74
- else:
75
- # Local file path
76
- file_path = Path(file)
77
- files_data["file"] = open(file_path, "rb")
78
- else:
79
- # File object
80
- files_data["file"] = file
81
-
82
- # Build request parameters
83
- params_data.update(
79
+ temperature: Sampling temperature between 0.0 and 1.0
80
+
81
+ timestamp_granularities: Controls level of timestamp detail in verbose_json. Only used when
82
+ response_format is verbose_json. Can be a single granularity or an array to get
83
+ multiple levels.
84
+
85
+ extra_headers: Send extra headers
86
+
87
+ extra_query: Add additional query parameters to the request
88
+
89
+ extra_body: Add additional JSON properties to the request
90
+
91
+ timeout: Override the client-level default timeout for this request, in seconds
92
+ """
93
+ body = deepcopy_minimal(
84
94
  {
95
+ "file": file,
96
+ "language": language,
85
97
  "model": model,
86
- "response_format": (
87
- response_format
88
- if isinstance(response_format, str)
89
- else (
90
- response_format.value
91
- if hasattr(response_format, "value")
92
- else response_format
93
- )
94
- ),
98
+ "prompt": prompt,
99
+ "response_format": response_format,
95
100
  "temperature": temperature,
101
+ "timestamp_granularities": timestamp_granularities,
96
102
  }
97
103
  )
98
-
99
- if language is not None:
100
- params_data["language"] = language
101
-
102
- if prompt is not None:
103
- params_data["prompt"] = prompt
104
-
105
- if timestamp_granularities is not None:
106
- params_data["timestamp_granularities"] = (
107
- timestamp_granularities
108
- if isinstance(timestamp_granularities, str)
109
- else (
110
- timestamp_granularities.value
111
- if hasattr(timestamp_granularities, "value")
112
- else timestamp_granularities
113
- )
114
- )
115
-
116
- # Add any additional kwargs
117
- params_data.update(kwargs)
118
-
119
- try:
120
- response, _, _ = requestor.request(
121
- options=TogetherRequest(
122
- method="POST",
123
- url="audio/translations",
124
- params=params_data,
125
- files=files_data,
104
+ files = extract_files(cast(Mapping[str, object], body), paths=[["file"]])
105
+ # It should be noted that the actual Content-Type header that will be
106
+ # sent to the server will contain a `boundary` parameter, e.g.
107
+ # multipart/form-data; boundary=---abc--
108
+ extra_headers = {"Content-Type": "multipart/form-data", **(extra_headers or {})}
109
+ return cast(
110
+ TranslationCreateResponse,
111
+ self._post(
112
+ "/audio/translations",
113
+ body=maybe_transform(body, translation_create_params.TranslationCreateParams),
114
+ files=files,
115
+ options=make_request_options(
116
+ extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
126
117
  ),
127
- )
128
- finally:
129
- # Close file if we opened it
130
- if files_data and "file" in files_data:
131
- try:
132
- # Only close if it's a file object (not a tuple for URL)
133
- file_obj = files_data["file"]
134
- if hasattr(file_obj, "close") and not isinstance(file_obj, tuple):
135
- file_obj.close()
136
- except:
137
- pass
138
-
139
- # Parse response based on format
140
- if (
141
- response_format == "verbose_json"
142
- or response_format == AudioTranscriptionResponseFormat.VERBOSE_JSON
143
- ):
144
- return AudioTranslationVerboseResponse(**response.data)
145
- else:
146
- return AudioTranslationResponse(**response.data)
147
-
148
-
149
- class AsyncTranslations:
150
- def __init__(self, client: TogetherClient) -> None:
151
- self._client = client
118
+ cast_to=cast(
119
+ Any, TranslationCreateResponse
120
+ ), # Union types cannot be passed in as arguments in the type system
121
+ ),
122
+ )
123
+
124
+
125
+ class AsyncTranslationsResource(AsyncAPIResource):
126
+ @cached_property
127
+ def with_raw_response(self) -> AsyncTranslationsResourceWithRawResponse:
128
+ """
129
+ This property can be used as a prefix for any HTTP method call to return
130
+ the raw response object instead of the parsed content.
131
+
132
+ For more information, see https://www.github.com/togethercomputer/together-py#accessing-raw-response-data-eg-headers
133
+ """
134
+ return AsyncTranslationsResourceWithRawResponse(self)
135
+
136
+ @cached_property
137
+ def with_streaming_response(self) -> AsyncTranslationsResourceWithStreamingResponse:
138
+ """
139
+ An alternative to `.with_raw_response` that doesn't eagerly read the response body.
140
+
141
+ For more information, see https://www.github.com/togethercomputer/together-py#with_streaming_response
142
+ """
143
+ return AsyncTranslationsResourceWithStreamingResponse(self)
152
144
 
153
145
  async def create(
154
146
  self,
155
147
  *,
156
- file: Union[str, BinaryIO, Path],
157
- model: str = "openai/whisper-large-v3",
158
- language: Optional[str] = None,
159
- prompt: Optional[str] = None,
160
- response_format: Union[str, AudioTranscriptionResponseFormat] = "json",
161
- temperature: float = 0.0,
162
- timestamp_granularities: Optional[
163
- Union[str, AudioTimestampGranularities]
164
- ] = None,
165
- **kwargs: Any,
166
- ) -> Union[AudioTranslationResponse, AudioTranslationVerboseResponse]:
148
+ file: FileTypes,
149
+ language: str | Omit = omit,
150
+ model: Literal["openai/whisper-large-v3"] | Omit = omit,
151
+ prompt: str | Omit = omit,
152
+ response_format: Literal["json", "verbose_json"] | Omit = omit,
153
+ temperature: float | Omit = omit,
154
+ timestamp_granularities: Union[Literal["segment", "word"], List[Literal["segment", "word"]]] | Omit = omit,
155
+ # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
156
+ # The extra values given here take precedence over values defined on the client or passed to this method.
157
+ extra_headers: Headers | None = None,
158
+ extra_query: Query | None = None,
159
+ extra_body: Body | None = None,
160
+ timeout: float | httpx.Timeout | None | NotGiven = not_given,
161
+ ) -> TranslationCreateResponse:
167
162
  """
168
- Async version of translate audio into English.
163
+ Translates audio into English
169
164
 
170
165
  Args:
171
- file: The audio file object (not file name) to translate, in one of these formats:
172
- flac, mp3, mp4, mpeg, mpga, m4a, ogg, wav, or webm.
173
- Can be a file path (str/Path), file object (BinaryIO), or URL (str).
174
- model: ID of the model to use. Defaults to "openai/whisper-large-v3".
175
- language: The language of the input audio. Optional ISO-639-1 language code.
176
- If omitted, language is set to English.
177
- prompt: An optional text to guide the model's style or continue a previous
178
- audio segment. The prompt should be in English.
179
- response_format: The format of the transcript output, in one of these options:
180
- json, verbose_json.
181
- temperature: The sampling temperature, between 0 and 1. Higher values like 0.8
182
- will make the output more random, while lower values like 0.2 will make it
183
- more focused and deterministic.
184
- timestamp_granularities: The timestamp granularities to populate for this
185
- translation. response_format must be set verbose_json to use timestamp
186
- granularities. Either or both of these options are supported: word, or segment.
187
-
188
- Returns:
189
- The translated text in the requested format.
190
- """
166
+ file: Audio file to translate
191
167
 
192
- requestor = api_requestor.APIRequestor(
193
- client=self._client,
194
- )
168
+ language: Target output language. Optional ISO 639-1 language code. If omitted, language
169
+ is set to English.
170
+
171
+ model: Model to use for translation
172
+
173
+ prompt: Optional text to bias decoding.
174
+
175
+ response_format: The format of the response
176
+
177
+ temperature: Sampling temperature between 0.0 and 1.0
195
178
 
196
- # Handle file input - could be a path, URL, or file object
197
- files_data: Dict[str, Union[Tuple[None, str], BinaryIO]] = {}
198
- params_data = {}
199
-
200
- if isinstance(file, (str, Path)):
201
- if isinstance(file, str) and file.startswith(("http://", "https://")):
202
- # URL string - send as multipart field
203
- files_data["file"] = (None, file)
204
- else:
205
- # Local file path
206
- file_path = Path(file)
207
- files_data["file"] = open(file_path, "rb")
208
- else:
209
- # File object
210
- files_data["file"] = file
211
-
212
- # Build request parameters
213
- params_data.update(
179
+ timestamp_granularities: Controls level of timestamp detail in verbose_json. Only used when
180
+ response_format is verbose_json. Can be a single granularity or an array to get
181
+ multiple levels.
182
+
183
+ extra_headers: Send extra headers
184
+
185
+ extra_query: Add additional query parameters to the request
186
+
187
+ extra_body: Add additional JSON properties to the request
188
+
189
+ timeout: Override the client-level default timeout for this request, in seconds
190
+ """
191
+ body = deepcopy_minimal(
214
192
  {
193
+ "file": file,
194
+ "language": language,
215
195
  "model": model,
216
- "response_format": (
217
- response_format
218
- if isinstance(response_format, str)
219
- else (
220
- response_format.value
221
- if hasattr(response_format, "value")
222
- else response_format
223
- )
224
- ),
196
+ "prompt": prompt,
197
+ "response_format": response_format,
225
198
  "temperature": temperature,
199
+ "timestamp_granularities": timestamp_granularities,
226
200
  }
227
201
  )
228
-
229
- if language is not None:
230
- params_data["language"] = language
231
-
232
- if prompt is not None:
233
- params_data["prompt"] = prompt
234
-
235
- if timestamp_granularities is not None:
236
- params_data["timestamp_granularities"] = (
237
- timestamp_granularities
238
- if isinstance(timestamp_granularities, str)
239
- else (
240
- timestamp_granularities.value
241
- if hasattr(timestamp_granularities, "value")
242
- else timestamp_granularities
243
- )
244
- )
245
-
246
- # Add any additional kwargs
247
- params_data.update(kwargs)
248
-
249
- try:
250
- response, _, _ = await requestor.arequest(
251
- options=TogetherRequest(
252
- method="POST",
253
- url="audio/translations",
254
- params=params_data,
255
- files=files_data,
202
+ files = extract_files(cast(Mapping[str, object], body), paths=[["file"]])
203
+ # It should be noted that the actual Content-Type header that will be
204
+ # sent to the server will contain a `boundary` parameter, e.g.
205
+ # multipart/form-data; boundary=---abc--
206
+ extra_headers = {"Content-Type": "multipart/form-data", **(extra_headers or {})}
207
+ return cast(
208
+ TranslationCreateResponse,
209
+ await self._post(
210
+ "/audio/translations",
211
+ body=await async_maybe_transform(body, translation_create_params.TranslationCreateParams),
212
+ files=files,
213
+ options=make_request_options(
214
+ extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
256
215
  ),
257
- )
258
- finally:
259
- # Close file if we opened it
260
- if files_data and "file" in files_data:
261
- try:
262
- # Only close if it's a file object (not a tuple for URL)
263
- file_obj = files_data["file"]
264
- if hasattr(file_obj, "close") and not isinstance(file_obj, tuple):
265
- file_obj.close()
266
- except:
267
- pass
268
-
269
- # Parse response based on format
270
- if (
271
- response_format == "verbose_json"
272
- or response_format == AudioTranscriptionResponseFormat.VERBOSE_JSON
273
- ):
274
- return AudioTranslationVerboseResponse(**response.data)
275
- else:
276
- return AudioTranslationResponse(**response.data)
216
+ cast_to=cast(
217
+ Any, TranslationCreateResponse
218
+ ), # Union types cannot be passed in as arguments in the type system
219
+ ),
220
+ )
221
+
222
+
223
+ class TranslationsResourceWithRawResponse:
224
+ def __init__(self, translations: TranslationsResource) -> None:
225
+ self._translations = translations
226
+
227
+ self.create = to_raw_response_wrapper(
228
+ translations.create,
229
+ )
230
+
231
+
232
+ class AsyncTranslationsResourceWithRawResponse:
233
+ def __init__(self, translations: AsyncTranslationsResource) -> None:
234
+ self._translations = translations
235
+
236
+ self.create = async_to_raw_response_wrapper(
237
+ translations.create,
238
+ )
239
+
240
+
241
+ class TranslationsResourceWithStreamingResponse:
242
+ def __init__(self, translations: TranslationsResource) -> None:
243
+ self._translations = translations
244
+
245
+ self.create = to_streamed_response_wrapper(
246
+ translations.create,
247
+ )
248
+
249
+
250
+ class AsyncTranslationsResourceWithStreamingResponse:
251
+ def __init__(self, translations: AsyncTranslationsResource) -> None:
252
+ self._translations = translations
253
+
254
+ self.create = async_to_streamed_response_wrapper(
255
+ translations.create,
256
+ )