together 1.5.34__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 +65 -81
  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 -477
  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.34.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.34.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 -464
  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.34.dist-info/METADATA +0 -583
  204. together-1.5.34.dist-info/RECORD +0 -77
  205. together-1.5.34.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,296 +1,282 @@
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 pathlib import Path
4
- from typing import Any, BinaryIO, Dict, Optional, Tuple, Union
5
-
6
- from together.abstract import api_requestor
7
- from together.types import (
8
- AudioTimestampGranularities,
9
- AudioTranscriptionResponse,
10
- AudioTranscriptionResponseFormat,
11
- AudioTranscriptionVerboseResponse,
12
- TogetherClient,
13
- 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,
14
19
  )
20
+ from ...types.audio import transcription_create_params
21
+ from ..._base_client import make_request_options
22
+ from ...types.audio.transcription_create_response import TranscriptionCreateResponse
15
23
 
24
+ __all__ = ["TranscriptionsResource", "AsyncTranscriptionsResource"]
16
25
 
17
- class Transcriptions:
18
- def __init__(self, client: TogetherClient) -> None:
19
- self._client = client
26
+
27
+ class TranscriptionsResource(SyncAPIResource):
28
+ @cached_property
29
+ def with_raw_response(self) -> TranscriptionsResourceWithRawResponse:
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 TranscriptionsResourceWithRawResponse(self)
37
+
38
+ @cached_property
39
+ def with_streaming_response(self) -> TranscriptionsResourceWithStreamingResponse:
40
+ """
41
+ An alternative to `.with_raw_response` that doesn't eagerly read the response body.
42
+
43
+ For more information, see https://www.github.com/togethercomputer/together-py#with_streaming_response
44
+ """
45
+ return TranscriptionsResourceWithStreamingResponse(self)
20
46
 
21
47
  def create(
22
48
  self,
23
49
  *,
24
- file: Union[str, BinaryIO, Path],
25
- model: str = "openai/whisper-large-v3",
26
- language: Optional[str] = None,
27
- prompt: Optional[str] = None,
28
- response_format: Union[str, AudioTranscriptionResponseFormat] = "json",
29
- temperature: float = 0.0,
30
- timestamp_granularities: Optional[
31
- Union[str, AudioTimestampGranularities]
32
- ] = None,
33
- diarize: bool = False,
34
- **kwargs: Any,
35
- ) -> Union[AudioTranscriptionResponse, AudioTranscriptionVerboseResponse]:
50
+ file: FileTypes,
51
+ diarize: bool | Omit = omit,
52
+ language: str | Omit = omit,
53
+ model: Literal["openai/whisper-large-v3"] | Omit = omit,
54
+ prompt: str | Omit = omit,
55
+ response_format: Literal["json", "verbose_json"] | Omit = omit,
56
+ temperature: float | Omit = omit,
57
+ timestamp_granularities: Union[Literal["segment", "word"], List[Literal["segment", "word"]]] | Omit = omit,
58
+ # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
59
+ # The extra values given here take precedence over values defined on the client or passed to this method.
60
+ extra_headers: Headers | None = None,
61
+ extra_query: Query | None = None,
62
+ extra_body: Body | None = None,
63
+ timeout: float | httpx.Timeout | None | NotGiven = not_given,
64
+ ) -> TranscriptionCreateResponse:
36
65
  """
37
- Transcribes audio into the input language.
66
+ Transcribes audio into text
38
67
 
39
68
  Args:
40
- file: The audio file object (not file name) to transcribe, in one of these formats:
41
- flac, mp3, mp4, mpeg, mpga, m4a, ogg, wav, or webm.
42
- Can be a file path (str/Path), file object (BinaryIO), or URL (str).
43
- model: ID of the model to use. Defaults to "openai/whisper-large-v3".
44
- language: The language of the input audio. Supplying the input language in
45
- ISO-639-1 format will improve accuracy and latency.
46
- prompt: An optional text to guide the model's style or continue a previous
47
- audio segment. The prompt should match the audio language.
48
- response_format: The format of the transcript output, in one of these options:
49
- json, verbose_json.
50
- temperature: The sampling temperature, between 0 and 1. Higher values like 0.8
51
- will make the output more random, while lower values like 0.2 will make it
52
- more focused and deterministic.
53
- timestamp_granularities: The timestamp granularities to populate for this
54
- transcription. response_format must be set verbose_json to use timestamp
55
- granularities. Either or both of these options are supported: word, or segment.
56
- diarize: Whether to enable speaker diarization. When enabled, you will get the speaker id for each word in the transcription.
57
- In the response, in the words array, you will get the speaker id for each word.
58
- In addition, we also return the speaker_segments array which contains the speaker id for each speaker segment along with the start and end time of the segment along with all the words in the segment.
59
- You can use the speaker_id to group the words by speaker.
60
- You can use the speaker_segments to get the start and end time of each speaker segment.
61
- Returns:
62
- The transcribed text in the requested format.
63
- """
69
+ file: Audio file to transcribe
64
70
 
65
- requestor = api_requestor.APIRequestor(
66
- client=self._client,
67
- )
71
+ diarize: Whether to enable speaker diarization. When enabled, you will get the speaker id
72
+ for each word in the transcription. In the response, in the words array, you
73
+ will get the speaker id for each word. In addition, we also return the
74
+ speaker_segments array which contains the speaker id for each speaker segment
75
+ along with the start and end time of the segment along with all the words in the
76
+ segment.
77
+
78
+ For eg - ... "speaker_segments": [ "speaker_id": "SPEAKER_00", "start": 0,
79
+ "end": 30.02, "words": [ { "id": 0, "word": "Tijana", "start": 0, "end": 11.475,
80
+ "speaker_id": "SPEAKER_00" }, ...
81
+
82
+ language: Optional ISO 639-1 language code. If `auto` is provided, language is
83
+ auto-detected.
84
+
85
+ model: Model to use for transcription
86
+
87
+ prompt: Optional text to bias decoding.
68
88
 
69
- # Handle file input - could be a path, URL, or file object
70
- files_data: Dict[str, Union[Tuple[None, str], BinaryIO]] = {}
71
- params_data = {}
72
-
73
- if isinstance(file, (str, Path)):
74
- if isinstance(file, str) and file.startswith(("http://", "https://")):
75
- # URL string - send as multipart field
76
- files_data["file"] = (None, file)
77
- else:
78
- # Local file path
79
- file_path = Path(file)
80
- files_data["file"] = open(file_path, "rb")
81
- else:
82
- # File object
83
- files_data["file"] = file
84
-
85
- # Build request parameters
86
- params_data.update(
89
+ response_format: The format of the response
90
+
91
+ temperature: Sampling temperature between 0.0 and 1.0
92
+
93
+ timestamp_granularities: Controls level of timestamp detail in verbose_json. Only used when
94
+ response_format is verbose_json. Can be a single granularity or an array to get
95
+ multiple levels.
96
+
97
+ extra_headers: Send extra headers
98
+
99
+ extra_query: Add additional query parameters to the request
100
+
101
+ extra_body: Add additional JSON properties to the request
102
+
103
+ timeout: Override the client-level default timeout for this request, in seconds
104
+ """
105
+ body = deepcopy_minimal(
87
106
  {
107
+ "file": file,
108
+ "diarize": diarize,
109
+ "language": language,
88
110
  "model": model,
89
- "response_format": (
90
- response_format.value
91
- if hasattr(response_format, "value")
92
- else response_format
93
- ),
111
+ "prompt": prompt,
112
+ "response_format": response_format,
94
113
  "temperature": temperature,
114
+ "timestamp_granularities": timestamp_granularities,
95
115
  }
96
116
  )
97
-
98
- if language is not None:
99
- params_data["language"] = language
100
-
101
- if prompt is not None:
102
- params_data["prompt"] = prompt
103
-
104
- if timestamp_granularities is not None:
105
- params_data["timestamp_granularities"] = (
106
- timestamp_granularities.value
107
- if hasattr(timestamp_granularities, "value")
108
- else timestamp_granularities
109
- )
110
-
111
- if diarize:
112
- params_data["diarize"] = diarize
113
-
114
- # Add any additional kwargs
115
- # Convert boolean values to lowercase strings for proper form encoding
116
- for key, value in kwargs.items():
117
- if isinstance(value, bool):
118
- params_data[key] = str(value).lower()
119
- else:
120
- params_data[key] = value
121
-
122
- try:
123
- response, _, _ = requestor.request(
124
- options=TogetherRequest(
125
- method="POST",
126
- url="audio/transcriptions",
127
- params=params_data,
128
- files=files_data,
117
+ files = extract_files(cast(Mapping[str, object], body), paths=[["file"]])
118
+ # It should be noted that the actual Content-Type header that will be
119
+ # sent to the server will contain a `boundary` parameter, e.g.
120
+ # multipart/form-data; boundary=---abc--
121
+ extra_headers = {"Content-Type": "multipart/form-data", **(extra_headers or {})}
122
+ return cast(
123
+ TranscriptionCreateResponse,
124
+ self._post(
125
+ "/audio/transcriptions",
126
+ body=maybe_transform(body, transcription_create_params.TranscriptionCreateParams),
127
+ files=files,
128
+ options=make_request_options(
129
+ extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
129
130
  ),
130
- )
131
- finally:
132
- # Close file if we opened it
133
- if files_data and "file" in files_data:
134
- try:
135
- # Only close if it's a file object (not a tuple for URL)
136
- file_obj = files_data["file"]
137
- if hasattr(file_obj, "close") and not isinstance(file_obj, tuple):
138
- file_obj.close()
139
- except:
140
- pass
141
-
142
- # Parse response based on format
143
- if (
144
- response_format == "verbose_json"
145
- or response_format == AudioTranscriptionResponseFormat.VERBOSE_JSON
146
- or diarize
147
- ):
148
- # Create response with model validation that preserves extra fields
149
- return AudioTranscriptionVerboseResponse.model_validate(response.data)
150
- else:
151
- return AudioTranscriptionResponse(**response.data)
152
-
153
-
154
- class AsyncTranscriptions:
155
- def __init__(self, client: TogetherClient) -> None:
156
- self._client = client
131
+ cast_to=cast(
132
+ Any, TranscriptionCreateResponse
133
+ ), # Union types cannot be passed in as arguments in the type system
134
+ ),
135
+ )
136
+
137
+
138
+ class AsyncTranscriptionsResource(AsyncAPIResource):
139
+ @cached_property
140
+ def with_raw_response(self) -> AsyncTranscriptionsResourceWithRawResponse:
141
+ """
142
+ This property can be used as a prefix for any HTTP method call to return
143
+ the raw response object instead of the parsed content.
144
+
145
+ For more information, see https://www.github.com/togethercomputer/together-py#accessing-raw-response-data-eg-headers
146
+ """
147
+ return AsyncTranscriptionsResourceWithRawResponse(self)
148
+
149
+ @cached_property
150
+ def with_streaming_response(self) -> AsyncTranscriptionsResourceWithStreamingResponse:
151
+ """
152
+ An alternative to `.with_raw_response` that doesn't eagerly read the response body.
153
+
154
+ For more information, see https://www.github.com/togethercomputer/together-py#with_streaming_response
155
+ """
156
+ return AsyncTranscriptionsResourceWithStreamingResponse(self)
157
157
 
158
158
  async def create(
159
159
  self,
160
160
  *,
161
- file: Union[str, BinaryIO, Path],
162
- model: str = "openai/whisper-large-v3",
163
- language: Optional[str] = None,
164
- prompt: Optional[str] = None,
165
- response_format: Union[str, AudioTranscriptionResponseFormat] = "json",
166
- temperature: float = 0.0,
167
- timestamp_granularities: Optional[
168
- Union[str, AudioTimestampGranularities]
169
- ] = None,
170
- diarize: bool = False,
171
- **kwargs: Any,
172
- ) -> Union[AudioTranscriptionResponse, AudioTranscriptionVerboseResponse]:
161
+ file: FileTypes,
162
+ diarize: bool | Omit = omit,
163
+ language: str | Omit = omit,
164
+ model: Literal["openai/whisper-large-v3"] | Omit = omit,
165
+ prompt: str | Omit = omit,
166
+ response_format: Literal["json", "verbose_json"] | Omit = omit,
167
+ temperature: float | Omit = omit,
168
+ timestamp_granularities: Union[Literal["segment", "word"], List[Literal["segment", "word"]]] | Omit = omit,
169
+ # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
170
+ # The extra values given here take precedence over values defined on the client or passed to this method.
171
+ extra_headers: Headers | None = None,
172
+ extra_query: Query | None = None,
173
+ extra_body: Body | None = None,
174
+ timeout: float | httpx.Timeout | None | NotGiven = not_given,
175
+ ) -> TranscriptionCreateResponse:
173
176
  """
174
- Async version of transcribe audio into the input language.
177
+ Transcribes audio into text
175
178
 
176
179
  Args:
177
- file: The audio file object (not file name) to transcribe, in one of these formats:
178
- flac, mp3, mp4, mpeg, mpga, m4a, ogg, wav, or webm.
179
- Can be a file path (str/Path), file object (BinaryIO), or URL (str).
180
- model: ID of the model to use. Defaults to "openai/whisper-large-v3".
181
- language: The language of the input audio. Supplying the input language in
182
- ISO-639-1 format will improve accuracy and latency.
183
- prompt: An optional text to guide the model's style or continue a previous
184
- audio segment. The prompt should match the audio language.
185
- response_format: The format of the transcript output, in one of these options:
186
- json, verbose_json.
187
- temperature: The sampling temperature, between 0 and 1. Higher values like 0.8
188
- will make the output more random, while lower values like 0.2 will make it
189
- more focused and deterministic.
190
- timestamp_granularities: The timestamp granularities to populate for this
191
- transcription. response_format must be set verbose_json to use timestamp
192
- granularities. Either or both of these options are supported: word, or segment.
193
- diarize: Whether to enable speaker diarization. When enabled, you will get the speaker id for each word in the transcription.
194
- In the response, in the words array, you will get the speaker id for each word.
195
- In addition, we also return the speaker_segments array which contains the speaker id for each speaker segment along with the start and end time of the segment along with all the words in the segment.
196
- You can use the speaker_id to group the words by speaker.
197
- You can use the speaker_segments to get the start and end time of each speaker segment.
198
- Returns:
199
- The transcribed text in the requested format.
200
- """
180
+ file: Audio file to transcribe
201
181
 
202
- requestor = api_requestor.APIRequestor(
203
- client=self._client,
204
- )
182
+ diarize: Whether to enable speaker diarization. When enabled, you will get the speaker id
183
+ for each word in the transcription. In the response, in the words array, you
184
+ will get the speaker id for each word. In addition, we also return the
185
+ speaker_segments array which contains the speaker id for each speaker segment
186
+ along with the start and end time of the segment along with all the words in the
187
+ segment.
188
+
189
+ For eg - ... "speaker_segments": [ "speaker_id": "SPEAKER_00", "start": 0,
190
+ "end": 30.02, "words": [ { "id": 0, "word": "Tijana", "start": 0, "end": 11.475,
191
+ "speaker_id": "SPEAKER_00" }, ...
192
+
193
+ language: Optional ISO 639-1 language code. If `auto` is provided, language is
194
+ auto-detected.
195
+
196
+ model: Model to use for transcription
197
+
198
+ prompt: Optional text to bias decoding.
199
+
200
+ response_format: The format of the response
205
201
 
206
- # Handle file input - could be a path, URL, or file object
207
- files_data: Dict[str, Union[Tuple[None, str], BinaryIO]] = {}
208
- params_data = {}
209
-
210
- if isinstance(file, (str, Path)):
211
- if isinstance(file, str) and file.startswith(("http://", "https://")):
212
- # URL string - send as multipart field
213
- files_data["file"] = (None, file)
214
- else:
215
- # Local file path
216
- file_path = Path(file)
217
- files_data["file"] = open(file_path, "rb")
218
- else:
219
- # File object
220
- files_data["file"] = file
221
-
222
- # Build request parameters
223
- params_data.update(
202
+ temperature: Sampling temperature between 0.0 and 1.0
203
+
204
+ timestamp_granularities: Controls level of timestamp detail in verbose_json. Only used when
205
+ response_format is verbose_json. Can be a single granularity or an array to get
206
+ multiple levels.
207
+
208
+ extra_headers: Send extra headers
209
+
210
+ extra_query: Add additional query parameters to the request
211
+
212
+ extra_body: Add additional JSON properties to the request
213
+
214
+ timeout: Override the client-level default timeout for this request, in seconds
215
+ """
216
+ body = deepcopy_minimal(
224
217
  {
218
+ "file": file,
219
+ "diarize": diarize,
220
+ "language": language,
225
221
  "model": model,
226
- "response_format": (
227
- response_format
228
- if isinstance(response_format, str)
229
- else (
230
- response_format.value
231
- if hasattr(response_format, "value")
232
- else response_format
233
- )
234
- ),
222
+ "prompt": prompt,
223
+ "response_format": response_format,
235
224
  "temperature": temperature,
225
+ "timestamp_granularities": timestamp_granularities,
236
226
  }
237
227
  )
238
-
239
- if language is not None:
240
- params_data["language"] = language
241
-
242
- if prompt is not None:
243
- params_data["prompt"] = prompt
244
-
245
- if timestamp_granularities is not None:
246
- params_data["timestamp_granularities"] = (
247
- timestamp_granularities
248
- if isinstance(timestamp_granularities, str)
249
- else (
250
- timestamp_granularities.value
251
- if hasattr(timestamp_granularities, "value")
252
- else timestamp_granularities
253
- )
254
- )
255
-
256
- if diarize:
257
- params_data["diarize"] = diarize
258
-
259
- # Add any additional kwargs
260
- # Convert boolean values to lowercase strings for proper form encoding
261
- for key, value in kwargs.items():
262
- if isinstance(value, bool):
263
- params_data[key] = str(value).lower()
264
- else:
265
- params_data[key] = value
266
-
267
- try:
268
- response, _, _ = await requestor.arequest(
269
- options=TogetherRequest(
270
- method="POST",
271
- url="audio/transcriptions",
272
- params=params_data,
273
- files=files_data,
228
+ files = extract_files(cast(Mapping[str, object], body), paths=[["file"]])
229
+ # It should be noted that the actual Content-Type header that will be
230
+ # sent to the server will contain a `boundary` parameter, e.g.
231
+ # multipart/form-data; boundary=---abc--
232
+ extra_headers = {"Content-Type": "multipart/form-data", **(extra_headers or {})}
233
+ return cast(
234
+ TranscriptionCreateResponse,
235
+ await self._post(
236
+ "/audio/transcriptions",
237
+ body=await async_maybe_transform(body, transcription_create_params.TranscriptionCreateParams),
238
+ files=files,
239
+ options=make_request_options(
240
+ extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
274
241
  ),
275
- )
276
- finally:
277
- # Close file if we opened it
278
- if files_data and "file" in files_data:
279
- try:
280
- # Only close if it's a file object (not a tuple for URL)
281
- file_obj = files_data["file"]
282
- if hasattr(file_obj, "close") and not isinstance(file_obj, tuple):
283
- file_obj.close()
284
- except:
285
- pass
286
-
287
- # Parse response based on format
288
- if (
289
- response_format == "verbose_json"
290
- or response_format == AudioTranscriptionResponseFormat.VERBOSE_JSON
291
- or diarize
292
- ):
293
- # Create response with model validation that preserves extra fields
294
- return AudioTranscriptionVerboseResponse.model_validate(response.data)
295
- else:
296
- return AudioTranscriptionResponse(**response.data)
242
+ cast_to=cast(
243
+ Any, TranscriptionCreateResponse
244
+ ), # Union types cannot be passed in as arguments in the type system
245
+ ),
246
+ )
247
+
248
+
249
+ class TranscriptionsResourceWithRawResponse:
250
+ def __init__(self, transcriptions: TranscriptionsResource) -> None:
251
+ self._transcriptions = transcriptions
252
+
253
+ self.create = to_raw_response_wrapper(
254
+ transcriptions.create,
255
+ )
256
+
257
+
258
+ class AsyncTranscriptionsResourceWithRawResponse:
259
+ def __init__(self, transcriptions: AsyncTranscriptionsResource) -> None:
260
+ self._transcriptions = transcriptions
261
+
262
+ self.create = async_to_raw_response_wrapper(
263
+ transcriptions.create,
264
+ )
265
+
266
+
267
+ class TranscriptionsResourceWithStreamingResponse:
268
+ def __init__(self, transcriptions: TranscriptionsResource) -> None:
269
+ self._transcriptions = transcriptions
270
+
271
+ self.create = to_streamed_response_wrapper(
272
+ transcriptions.create,
273
+ )
274
+
275
+
276
+ class AsyncTranscriptionsResourceWithStreamingResponse:
277
+ def __init__(self, transcriptions: AsyncTranscriptionsResource) -> None:
278
+ self._transcriptions = transcriptions
279
+
280
+ self.create = async_to_streamed_response_wrapper(
281
+ transcriptions.create,
282
+ )