1
1
from .provider import ProviderFactory
2
2
import os
3
3
from .utils .tools import Tools
4
- from typing import Union , BinaryIO
4
+ from typing import Union , BinaryIO , Optional , Any
5
+ from .framework .message import (
6
+ TranscriptionOptions ,
7
+ TranscriptionResponse ,
8
+ )
5
9
6
10
7
11
class Client :
@@ -51,7 +55,7 @@ def _validate_provider_key(self, provider_key):
51
55
52
56
return provider_key
53
57
54
- def configure (self , provider_configs : dict = None ):
58
+ def configure (self , provider_configs : Optional [ dict ] = None ):
55
59
"""
56
60
Configure the client with provider configurations.
57
61
"""
@@ -124,7 +128,7 @@ def _tool_runner(
124
128
provider ,
125
129
model_name : str ,
126
130
messages : list ,
127
- tools : any ,
131
+ tools : Any ,
128
132
max_turns : int ,
129
133
** kwargs ,
130
134
):
@@ -273,18 +277,47 @@ class Transcriptions:
273
277
def __init__ (self , client : "Client" ):
274
278
self .client = client
275
279
276
- def create (self , * , model : str , file : Union [str , BinaryIO ], ** kwargs ):
280
+ def create (
281
+ self ,
282
+ * ,
283
+ model : str ,
284
+ file : Union [str , BinaryIO ],
285
+ options : Optional [TranscriptionOptions ] = None ,
286
+ ** kwargs ,
287
+ ) -> TranscriptionResponse :
277
288
"""
278
289
Create a transcription using the specified model and file.
279
290
280
291
Args:
281
292
model: Provider and model in format 'provider:model' (e.g., 'openai:whisper-1')
282
293
file: Audio file to transcribe (file path or file-like object)
283
- **kwargs: Additional parameters to pass to the provider
294
+ options: TranscriptionOptions instance with unified parameters (includes stream control)
295
+ **kwargs: Additional parameters (used if options is None, assumed to be OpenAI format)
284
296
285
297
Returns:
286
- TranscriptionResult : Unified transcription result
298
+ TranscriptionResponse : Unified response (batch or streaming based on options.stream)
287
299
"""
300
+ # Validate options and kwargs
301
+ if options is not None :
302
+ if not options .has_any_parameters ():
303
+ raise ValueError (
304
+ "TranscriptionOptions provided but no parameters are set. "
305
+ "Please set at least one parameter or pass None to use kwargs."
306
+ )
307
+ # TranscriptionOptions takes precedence, ignore kwargs
308
+ if kwargs :
309
+ import warnings
310
+
311
+ warnings .warn (
312
+ "Both TranscriptionOptions and kwargs provided. Using TranscriptionOptions and ignoring kwargs." ,
313
+ UserWarning ,
314
+ )
315
+ elif not kwargs :
316
+ # Neither options nor kwargs provided
317
+ raise ValueError (
318
+ "Either TranscriptionOptions or kwargs must be provided for transcription parameters."
319
+ )
320
+
288
321
# Check that correct format is used
289
322
if ":" not in model :
290
323
raise ValueError (
@@ -294,29 +327,61 @@ def create(self, *, model: str, file: Union[str, BinaryIO], **kwargs):
294
327
# Extract the provider key from the model identifier
295
328
provider_key , model_name = model .split (":" , 1 )
296
329
297
- # Validate if the provider is supported
298
- supported_providers = ProviderFactory .get_supported_providers ()
299
- if provider_key not in supported_providers :
300
- raise ValueError (
301
- f"Invalid provider key '{ provider_key } '. Supported providers: { supported_providers } . "
302
- "Make sure the model string is formatted correctly as 'provider:model'."
303
- )
304
-
305
330
# Initialize provider if not already initialized
306
331
if provider_key not in self .client .providers :
307
332
config = self .client .provider_configs .get (provider_key , {})
308
- self .client .providers [provider_key ] = ProviderFactory .create_provider (
309
- provider_key , config
310
- )
333
+ try :
334
+ self .client .providers [provider_key ] = ProviderFactory .create_provider (
335
+ provider_key , config
336
+ )
337
+ except ImportError as e :
338
+ raise ValueError (f"Provider '{ provider_key } ' is not available: { e } " )
311
339
312
340
provider = self .client .providers .get (provider_key )
313
341
if not provider :
314
342
raise ValueError (f"Could not load provider for '{ provider_key } '." )
315
343
344
+ # Check if provider supports audio transcription
345
+ if not hasattr (provider , "audio" ) or provider .audio is None :
346
+ raise ValueError (
347
+ f"Provider '{ provider_key } ' does not support audio transcription."
348
+ )
349
+
350
+ # Determine if streaming is requested
351
+ should_stream = False # Default to batch processing
352
+ if options and options .stream is not None :
353
+ should_stream = options .stream
354
+ elif kwargs .get ("stream" ):
355
+ should_stream = kwargs .get ("stream" , False )
356
+
316
357
# Delegate the transcription to the correct provider's implementation
317
- # The provider will raise NotImplementedError if it doesn't support ASR
318
358
try :
319
- return provider .audio_transcriptions_create (model_name , file , ** kwargs )
359
+ if should_stream :
360
+ # Check if provider supports output streaming
361
+ if (
362
+ hasattr (provider .audio , "transcriptions" )
363
+ and hasattr (provider .audio .transcriptions , "create_stream_output" )
364
+ ):
365
+ return provider .audio .transcriptions .create_stream_output (
366
+ model_name , file , options = options , ** kwargs
367
+ )
368
+ else :
369
+ raise ValueError (
370
+ f"Provider '{ provider_key } ' does not support output streaming transcription."
371
+ )
372
+ else :
373
+ # Non-streaming (batch) transcription
374
+ if (
375
+ hasattr (provider .audio , "transcriptions" )
376
+ and hasattr (provider .audio .transcriptions , "create" )
377
+ ):
378
+ return provider .audio .transcriptions .create (
379
+ model_name , file , options = options , ** kwargs
380
+ )
381
+ else :
382
+ raise ValueError (
383
+ f"Provider '{ provider_key } ' does not support audio transcription."
384
+ )
320
385
except NotImplementedError :
321
386
raise ValueError (
322
387
f"Provider '{ provider_key } ' does not support audio transcription."
0 commit comments