diff --git a/1678301915024987.png b/1678360420020361.png similarity index 100% rename from 1678301915024987.png rename to 1678360420020361.png diff --git a/1678360427710524.mp3 b/1678360427710524.mp3 new file mode 100644 index 00000000..590d5f5d Binary files /dev/null and b/1678360427710524.mp3 differ diff --git a/example/lib/create_audio_translation.dart b/example/lib/create_audio_translation.dart index 7e98138a..91078b3b 100644 --- a/example/lib/create_audio_translation.dart +++ b/example/lib/create_audio_translation.dart @@ -11,21 +11,25 @@ Future main() async { OpenAI.apiKey = Env.apiKey; // create the audio transcription. - final translation = OpenAI.instance.audio.createTranslation( + final translation = await OpenAI.instance.audio.createTranslation( file: await getFileFromUrl( - 'https://www.cbvoiceovers.com/wp-content/uploads/2017/05/Commercial-showreel.mp3', - ), + 'https://www.cbvoiceovers.com/wp-content/uploads/2017/05/Commercial-showreel.mp3', + fileExtension: "mp3"), model: "whisper-1", + responseFormat: "json", ); // print the translation. print(translation); } -Future getFileFromUrl(String networkUrl) async { +Future getFileFromUrl( + String networkUrl, { + String fileExtension = 'png', +}) async { final response = await http.get(Uri.parse(networkUrl)); final uniqueImageName = DateTime.now().microsecondsSinceEpoch; - final file = File("$uniqueImageName.mp3"); + final file = File("$uniqueImageName.$fileExtension"); await file.writeAsBytes(response.bodyBytes); return file; } diff --git a/lib/src/core/models/audio/audio.dart b/lib/src/core/models/audio/audio.dart index bb15f803..87d4b0c6 100644 --- a/lib/src/core/models/audio/audio.dart +++ b/lib/src/core/models/audio/audio.dart @@ -1,24 +1,32 @@ -class OpenAIAudioModel { - // lass from json -// { -// "text": "Imagine the wildest idea that you've ever had, and you're curious about how it might scale to something that's a 100, a 1,000 times bigger. This is a place where you can get to do that." -// } +import 'package:meta/meta.dart'; +/// {@template openai_audio} +/// This class represents the audio model of the OpenAI API, which is used and get returned while using the [OpenAIAudio] methods. +/// {@endtemplate} +@immutable +class OpenAIAudioModel { + // This the generated text. final String text; @override int get hashCode => text.hashCode; + /// {@macro openai_audio} OpenAIAudioModel({ required this.text, }); - factory OpenAIAudioModel.fromJson(Map json) { + + /// This is used to convert a [Map] object to a [OpenAIAudioModel] object. + factory OpenAIAudioModel.fromMap(Map json) { return OpenAIAudioModel( text: json['text'], ); } - Map toJson() { + /// This method used to convert the [OpenAIAudioModel] to a [Map] object. + /// + /// could be useful if you want to save an audio response to a database. + Map toMap() { return { 'text': text, }; diff --git a/lib/src/core/models/chat/chat.dart b/lib/src/core/models/chat/chat.dart index e3504bde..539ca9e7 100644 --- a/lib/src/core/models/chat/chat.dart +++ b/lib/src/core/models/chat/chat.dart @@ -1,4 +1,5 @@ import 'package:collection/collection.dart'; +import 'package:meta/meta.dart'; import 'sub_models/choices/choices.dart'; import 'sub_models/usage.dart'; @@ -7,6 +8,10 @@ export 'sub_models/usage.dart'; export 'sub_models/choices/choices.dart'; export 'stream/chat.dart'; +/// {@template openai_chat_completion} +/// This class represents the chat completion response model of the OpenAI API, which is used and get returned while using the [OpenAIChat] methods. +/// {@endtemplate} +@immutable class OpenAIChatCompletionModel { /// The [id] of the chat completion. final String id; @@ -25,6 +30,7 @@ class OpenAIChatCompletionModel { return id.hashCode ^ created.hashCode ^ choices.hashCode ^ usage.hashCode; } + /// {@macro openai_chat_completion} OpenAIChatCompletionModel({ required this.id, required this.created, @@ -32,17 +38,28 @@ class OpenAIChatCompletionModel { required this.usage, }); - factory OpenAIChatCompletionModel.fromJson(Map json) { + /// This is used to convert a [Map] object to a [OpenAIChatCompletionModel] object. + factory OpenAIChatCompletionModel.fromMap(Map json) { return OpenAIChatCompletionModel( id: json['id'], created: DateTime.fromMillisecondsSinceEpoch(json['created'] * 1000), choices: (json['choices'] as List) - .map((e) => OpenAIChatCompletionChoiceModel.fromJson(e)) + .map((e) => OpenAIChatCompletionChoiceModel.fromMap(e)) .toList(), - usage: OpenAIChatCompletionUsageModel.fromJson(json['usage']), + usage: OpenAIChatCompletionUsageModel.fromMap(json['usage']), ); } + /// This is used to convert a [OpenAIChatCompletionModel] object to a [Map] object. + Map toMap() { + return { + "id": id, + "created": created.millisecondsSinceEpoch, + "choices": choices.map((e) => e.toMap()).toList(), + "usage": usage.toMap(), + }; + } + @override String toString() { return 'OpenAIChatCompletionModel(id: $id, created: $created, choices: $choices, usage: $usage)'; diff --git a/lib/src/core/models/chat/stream/chat.dart b/lib/src/core/models/chat/stream/chat.dart index 22ae9714..6b507872 100644 --- a/lib/src/core/models/chat/stream/chat.dart +++ b/lib/src/core/models/chat/stream/chat.dart @@ -26,12 +26,12 @@ class OpenAIStreamChatCompletionModel { required this.choices, }); - factory OpenAIStreamChatCompletionModel.fromJson(Map json) { + factory OpenAIStreamChatCompletionModel.fromMap(Map json) { return OpenAIStreamChatCompletionModel( id: json['id'], created: DateTime.fromMillisecondsSinceEpoch(json['created'] * 1000), choices: (json['choices'] as List) - .map((e) => OpenAIStreamChatCompletionChoiceModel.fromJson(e)) + .map((e) => OpenAIStreamChatCompletionChoiceModel.fromMap(e)) .toList(), ); } diff --git a/lib/src/core/models/chat/stream/sub_models/choices/choices.dart b/lib/src/core/models/chat/stream/sub_models/choices/choices.dart index e3be64ee..d39445cd 100644 --- a/lib/src/core/models/chat/stream/sub_models/choices/choices.dart +++ b/lib/src/core/models/chat/stream/sub_models/choices/choices.dart @@ -17,12 +17,12 @@ class OpenAIStreamChatCompletionChoiceModel { required this.finishReason, }); - factory OpenAIStreamChatCompletionChoiceModel.fromJson( + factory OpenAIStreamChatCompletionChoiceModel.fromMap( Map json, ) { return OpenAIStreamChatCompletionChoiceModel( index: json['index'], - delta: OpenAIStreamChatCompletionChoiceDeltaModel.fromJson(json['delta']), + delta: OpenAIStreamChatCompletionChoiceDeltaModel.fromMap(json['delta']), finishReason: json['finish_reason'], ); } diff --git a/lib/src/core/models/chat/stream/sub_models/choices/sub_models/delta.dart b/lib/src/core/models/chat/stream/sub_models/choices/sub_models/delta.dart index ecffdd3d..1f86fe49 100644 --- a/lib/src/core/models/chat/stream/sub_models/choices/sub_models/delta.dart +++ b/lib/src/core/models/chat/stream/sub_models/choices/sub_models/delta.dart @@ -12,7 +12,7 @@ class OpenAIStreamChatCompletionChoiceDeltaModel { required this.content, }); - factory OpenAIStreamChatCompletionChoiceDeltaModel.fromJson( + factory OpenAIStreamChatCompletionChoiceDeltaModel.fromMap( Map json, ) { return OpenAIStreamChatCompletionChoiceDeltaModel( diff --git a/lib/src/core/models/chat/stream/sub_models/usage.dart b/lib/src/core/models/chat/stream/sub_models/usage.dart index e8938130..210331ad 100644 --- a/lib/src/core/models/chat/stream/sub_models/usage.dart +++ b/lib/src/core/models/chat/stream/sub_models/usage.dart @@ -18,7 +18,7 @@ class OpenAIStreamChatCompletionUsageModel { required this.totalTokens, }); - factory OpenAIStreamChatCompletionUsageModel.fromJson( + factory OpenAIStreamChatCompletionUsageModel.fromMap( Map json) { return OpenAIStreamChatCompletionUsageModel( promptTokens: json['prompt_tokens'], diff --git a/lib/src/core/models/chat/sub_models/choices/choices.dart b/lib/src/core/models/chat/sub_models/choices/choices.dart index 387d6cb9..0dd85105 100644 --- a/lib/src/core/models/chat/sub_models/choices/choices.dart +++ b/lib/src/core/models/chat/sub_models/choices/choices.dart @@ -1,8 +1,16 @@ import 'sub_models/message.dart'; +/// {@template openai_chat_completion_choice} +/// This class represents a choice of the [OpenAIChatCompletionModel] model of the OpenAI API, which is used and get returned while using the [OpenAIChat] methods. +/// {@endtemplate} class OpenAIChatCompletionChoiceModel { + /// The [index] of the choice. final int index; + + /// The [message] of the choice. final OpenAIChatCompletionChoiceMessageModel message; + + /// The [finishReason] of the choice. final String? finishReason; @override @@ -10,20 +18,31 @@ class OpenAIChatCompletionChoiceModel { return index.hashCode ^ message.hashCode ^ finishReason.hashCode; } + /// {@macro openai_chat_completion_choice} OpenAIChatCompletionChoiceModel({ required this.index, required this.message, required this.finishReason, }); - factory OpenAIChatCompletionChoiceModel.fromJson(Map json) { + /// This is used to convert a [Map] object to a [OpenAIChatCompletionChoiceModel] object. + factory OpenAIChatCompletionChoiceModel.fromMap(Map json) { return OpenAIChatCompletionChoiceModel( index: json['index'], - message: OpenAIChatCompletionChoiceMessageModel.fromJson(json['message']), + message: OpenAIChatCompletionChoiceMessageModel.fromMap(json['message']), finishReason: json['finish_reason'], ); } + /// This method used to convert the [OpenAIChatCompletionChoiceModel] to a [Map] object. + Map toMap() { + return { + "index": index, + "message": message.toMap(), + "finish_reason": finishReason, + }; + } + @override String toString() { return 'OpenAIChatCompletionChoiceModel(index: $index, message: $message, finishReason: $finishReason)'; diff --git a/lib/src/core/models/chat/sub_models/choices/sub_models/message.dart b/lib/src/core/models/chat/sub_models/choices/sub_models/message.dart index 0c748d6b..4fca4a80 100644 --- a/lib/src/core/models/chat/sub_models/choices/sub_models/message.dart +++ b/lib/src/core/models/chat/sub_models/choices/sub_models/message.dart @@ -1,5 +1,12 @@ +/// {@template openai_chat_completion_choice_message_model} +/// This represents the message of the [OpenAIChatCompletionChoiceModel] model of the OpenAI API, which is used and get returned while using the [OpenAIChat] methods. +/// {@endtemplate} + class OpenAIChatCompletionChoiceMessageModel { + /// The [role] of the message. final String role; + + /// The [content] of the message. final String content; @override @@ -7,12 +14,14 @@ class OpenAIChatCompletionChoiceMessageModel { return role.hashCode ^ content.hashCode; } + /// {@macro openai_chat_completion_choice_message_model} OpenAIChatCompletionChoiceMessageModel({ required this.role, required this.content, }); - factory OpenAIChatCompletionChoiceMessageModel.fromJson( + /// This is used to convert a [Map] object to a [OpenAIChatCompletionChoiceMessageModel] object. + factory OpenAIChatCompletionChoiceMessageModel.fromMap( Map json, ) { return OpenAIChatCompletionChoiceMessageModel( @@ -20,6 +29,8 @@ class OpenAIChatCompletionChoiceMessageModel { content: json['content'], ); } + + /// This method used to convert the [OpenAIChatCompletionChoiceMessageModel] to a [Map] object. Map toMap() { return { "role": role, diff --git a/lib/src/core/models/chat/sub_models/usage.dart b/lib/src/core/models/chat/sub_models/usage.dart index 7a8dd869..0e5c1925 100644 --- a/lib/src/core/models/chat/sub_models/usage.dart +++ b/lib/src/core/models/chat/sub_models/usage.dart @@ -1,8 +1,17 @@ export 'choices/sub_models/message.dart'; +/// {@template openai_chat_completion_usage} +/// This class represents the chat completion usage model of the OpenAI API, which is used and get returned while using the [OpenAIChat] methods. +/// {@endtemplate} class OpenAIChatCompletionUsageModel { + /// The number of tokens used for the prompt(s). final int promptTokens; + + /// The number of tokens used for the chat completion(s). final int completionTokens; + + /// The total number of tokens used for the chat completion(s). + /// This is the sum of [promptTokens] and [completionTokens]. final int totalTokens; @override @@ -12,13 +21,15 @@ class OpenAIChatCompletionUsageModel { totalTokens.hashCode; } + /// {@macro openai_chat_completion_usage} OpenAIChatCompletionUsageModel({ required this.promptTokens, required this.completionTokens, required this.totalTokens, }); - factory OpenAIChatCompletionUsageModel.fromJson(Map json) { + /// This is used to convert a [Map] object to a [OpenAIChatCompletionUsageModel] object. + factory OpenAIChatCompletionUsageModel.fromMap(Map json) { return OpenAIChatCompletionUsageModel( promptTokens: json['prompt_tokens'], completionTokens: json['completion_tokens'], @@ -26,6 +37,15 @@ class OpenAIChatCompletionUsageModel { ); } + /// This is used to convert a [OpenAIChatCompletionUsageModel] object to a [Map] object. + Map toMap() { + return { + "prompt_tokens": promptTokens, + "completion_tokens": completionTokens, + "total_tokens": totalTokens, + }; + } + @override String toString() { return 'OpenAIChatCompletionUsageModel(promptTokens: $promptTokens, completionTokens: $completionTokens, totalTokens: $totalTokens)'; diff --git a/lib/src/core/models/completion/completion.dart b/lib/src/core/models/completion/completion.dart index f37f49ed..41d236d3 100644 --- a/lib/src/core/models/completion/completion.dart +++ b/lib/src/core/models/completion/completion.dart @@ -40,15 +40,15 @@ class OpenAICompletionModel { }); /// This method is used to convert a [Map] object to a [OpenAICompletionModel] object. - factory OpenAICompletionModel.fromJson(Map json) { + factory OpenAICompletionModel.fromMap(Map json) { return OpenAICompletionModel( id: json['id'], created: DateTime.fromMillisecondsSinceEpoch(json['created'] * 1000), model: json['model'], choices: (json['choices'] as List) - .map((i) => OpenAICompletionModelChoice.fromJson(i)) + .map((i) => OpenAICompletionModelChoice.fromMap(i)) .toList(), - usage: OpenAICompletionModelUsage.fromJson(json['usage']), + usage: OpenAICompletionModelUsage.fromMap(json['usage']), ); } diff --git a/lib/src/core/models/completion/stream/completion.dart b/lib/src/core/models/completion/stream/completion.dart index eaa20485..9cd1ba4d 100644 --- a/lib/src/core/models/completion/stream/completion.dart +++ b/lib/src/core/models/completion/stream/completion.dart @@ -33,12 +33,12 @@ class OpenAIStreamCompletionModel { }); /// This method is used to convert a [Map] object to a [OpenAIStreamCompletionModel] object. - factory OpenAIStreamCompletionModel.fromJson(Map json) { + factory OpenAIStreamCompletionModel.fromMap(Map json) { return OpenAIStreamCompletionModel( id: json['id'], created: DateTime.fromMillisecondsSinceEpoch(json['created'] * 1000), choices: (json['choices'] as List) - .map((e) => OpenAIStreamCompletionModelChoice.fromJson(e)) + .map((e) => OpenAIStreamCompletionModelChoice.fromMap(e)) .toList(), model: json['model'], ); diff --git a/lib/src/core/models/completion/stream/sub_models/choices.dart b/lib/src/core/models/completion/stream/sub_models/choices.dart index 0ed9608c..f47c8afa 100644 --- a/lib/src/core/models/completion/stream/sub_models/choices.dart +++ b/lib/src/core/models/completion/stream/sub_models/choices.dart @@ -31,7 +31,7 @@ class OpenAIStreamCompletionModelChoice { }); /// This method is used to convert a [Map] object to a [OpenAIStreamCompletionModelChoice] object. - factory OpenAIStreamCompletionModelChoice.fromJson( + factory OpenAIStreamCompletionModelChoice.fromMap( Map json, ) { return OpenAIStreamCompletionModelChoice( diff --git a/lib/src/core/models/completion/sub_models/choice.dart b/lib/src/core/models/completion/sub_models/choice.dart index 31c7572c..1f7c5849 100644 --- a/lib/src/core/models/completion/sub_models/choice.dart +++ b/lib/src/core/models/completion/sub_models/choice.dart @@ -31,7 +31,7 @@ class OpenAICompletionModelChoice { }); /// This method is used to convert a [Map] object to a [OpenAICompletionModelChoice] object. - factory OpenAICompletionModelChoice.fromJson(Map json) { + factory OpenAICompletionModelChoice.fromMap(Map json) { return OpenAICompletionModelChoice( text: json['text'], index: json['index'], diff --git a/lib/src/core/models/completion/sub_models/usage.dart b/lib/src/core/models/completion/sub_models/usage.dart index 07be4efd..efe642c6 100644 --- a/lib/src/core/models/completion/sub_models/usage.dart +++ b/lib/src/core/models/completion/sub_models/usage.dart @@ -23,7 +23,7 @@ class OpenAICompletionModelUsage { }); /// This method is used to convert a [Map] object to a [OpenAICompletionModelUsage] object. - factory OpenAICompletionModelUsage.fromJson(Map json) { + factory OpenAICompletionModelUsage.fromMap(Map json) { return OpenAICompletionModelUsage( promptTokens: json['prompt_tokens'], completionTokens: json['completion_tokens'], diff --git a/lib/src/core/models/edit/edit.dart b/lib/src/core/models/edit/edit.dart index 65a0f989..4400308b 100644 --- a/lib/src/core/models/edit/edit.dart +++ b/lib/src/core/models/edit/edit.dart @@ -28,13 +28,13 @@ class OpenAIEditModel { }); /// This method is used to convert a [Map] object to a [OpenAIEditModel] object. - factory OpenAIEditModel.fromJson(Map json) { + factory OpenAIEditModel.fromMap(Map json) { return OpenAIEditModel( created: DateTime.fromMillisecondsSinceEpoch(json['created'] * 1000), choices: (json['choices'] as List) - .map((e) => OpenAIEditModelChoice.fromJson(e)) + .map((e) => OpenAIEditModelChoice.fromMap(e)) .toList(), - usage: OpenAIEditModelUsage.fromJson(json['usage']), + usage: OpenAIEditModelUsage.fromMap(json['usage']), ); } diff --git a/lib/src/core/models/edit/sub_models/choice.dart b/lib/src/core/models/edit/sub_models/choice.dart index 809c9032..013b6821 100644 --- a/lib/src/core/models/edit/sub_models/choice.dart +++ b/lib/src/core/models/edit/sub_models/choice.dart @@ -18,7 +18,7 @@ class OpenAIEditModelChoice { }); /// This method is used to convert a [Map] object to a [OpenAIEditModelChoice] object. - factory OpenAIEditModelChoice.fromJson(Map json) { + factory OpenAIEditModelChoice.fromMap(Map json) { return OpenAIEditModelChoice( text: json['text'], index: json['index'], diff --git a/lib/src/core/models/edit/sub_models/usage.dart b/lib/src/core/models/edit/sub_models/usage.dart index b17d31f6..8447f190 100644 --- a/lib/src/core/models/edit/sub_models/usage.dart +++ b/lib/src/core/models/edit/sub_models/usage.dart @@ -23,7 +23,7 @@ class OpenAIEditModelUsage { }); /// This method is used to convert a [Map] object to a [OpenAIEditModelUsage] object. - factory OpenAIEditModelUsage.fromJson(Map json) { + factory OpenAIEditModelUsage.fromMap(Map json) { return OpenAIEditModelUsage( promptTokens: json['prompt_tokens'], completionTokens: json['completion_tokens'], diff --git a/lib/src/core/models/fine_tune/fine_tune.dart b/lib/src/core/models/fine_tune/fine_tune.dart index 6f908f57..5b053372 100644 --- a/lib/src/core/models/fine_tune/fine_tune.dart +++ b/lib/src/core/models/fine_tune/fine_tune.dart @@ -64,16 +64,16 @@ class OpenAIFineTuneModel { }); /// This method is used to convert a [Map] object to a [OpenAIFineTuneModel] object. - factory OpenAIFineTuneModel.fromJson(Map json) { + factory OpenAIFineTuneModel.fromMap(Map json) { return OpenAIFineTuneModel( id: json['id'], model: json['model'], createdAt: DateTime.fromMillisecondsSinceEpoch(json['created_at'] * 1000), events: (json['events'] as List?) - ?.map((e) => OpenAIFineTuneEventModel.fromJson(e)) + ?.map((e) => OpenAIFineTuneEventModel.fromMap(e)) .toList(), fineTunedModel: json['fine_tuned_model'], - hyperparams: OpenAiFineTuneHyperParamsModel.fromJson(json['hyperparams']), + hyperparams: OpenAiFineTuneHyperParamsModel.fromMap(json['hyperparams']), organizationId: json['organization_id'], resultFiles: (json['result_files'] as List).map((e) => e.toString()).toList(), @@ -81,7 +81,7 @@ class OpenAIFineTuneModel { validationFiles: (json['validation_files'] as List).map((e) => e.toString()).toList(), trainingFiles: (json['training_files'] as List) - .map((e) => OpenAIFineTuneTrainingFilesModel.fromJson(e)) + .map((e) => OpenAIFineTuneTrainingFilesModel.fromMap(e)) .toList(), updatedAt: DateTime.fromMillisecondsSinceEpoch(json['updated_at'] * 1000), ); diff --git a/lib/src/core/models/fine_tune/stream/fine_tun_event.dart b/lib/src/core/models/fine_tune/stream/fine_tun_event.dart index 971432ca..16e93c3c 100644 --- a/lib/src/core/models/fine_tune/stream/fine_tun_event.dart +++ b/lib/src/core/models/fine_tune/stream/fine_tun_event.dart @@ -22,7 +22,7 @@ class OpenAIFineTuneEventStreamModel { }); /// Creates a new instance of [OpenAIFineTuneEventStreamModel] from a [Map]. - factory OpenAIFineTuneEventStreamModel.fromJson(Map json) { + factory OpenAIFineTuneEventStreamModel.fromMap(Map json) { return OpenAIFineTuneEventStreamModel( level: json['level'] as String, message: json['message'] as String, diff --git a/lib/src/core/models/fine_tune/sub_models/event.dart b/lib/src/core/models/fine_tune/sub_models/event.dart index fd075ccf..7ea926e1 100644 --- a/lib/src/core/models/fine_tune/sub_models/event.dart +++ b/lib/src/core/models/fine_tune/sub_models/event.dart @@ -22,7 +22,7 @@ class OpenAIFineTuneEventModel { }); /// This method is used to convert a [Map] object to a [OpenAIFineTuneEventModel] object. - factory OpenAIFineTuneEventModel.fromJson(Map json) { + factory OpenAIFineTuneEventModel.fromMap(Map json) { return OpenAIFineTuneEventModel( createdAt: DateTime.fromMillisecondsSinceEpoch(json['created_at'] * 1000), level: json['level'], diff --git a/lib/src/core/models/fine_tune/sub_models/hyper_params.dart b/lib/src/core/models/fine_tune/sub_models/hyper_params.dart index 9833e251..77ab7308 100644 --- a/lib/src/core/models/fine_tune/sub_models/hyper_params.dart +++ b/lib/src/core/models/fine_tune/sub_models/hyper_params.dart @@ -31,7 +31,7 @@ class OpenAiFineTuneHyperParamsModel { }); /// This method is used to convert a [Map] object to a [OpenAiFineTuneHyperParamsModel] object. - factory OpenAiFineTuneHyperParamsModel.fromJson(Map json) { + factory OpenAiFineTuneHyperParamsModel.fromMap(Map json) { return OpenAiFineTuneHyperParamsModel( batchSize: json['batch_size'], learningRateMultiplier: json['learning_rate_multiplier'], diff --git a/lib/src/core/models/fine_tune/sub_models/training_files.dart b/lib/src/core/models/fine_tune/sub_models/training_files.dart index 71f4de4e..3c2799d1 100644 --- a/lib/src/core/models/fine_tune/sub_models/training_files.dart +++ b/lib/src/core/models/fine_tune/sub_models/training_files.dart @@ -36,7 +36,7 @@ class OpenAIFineTuneTrainingFilesModel { }); /// This method is used to convert a [Map] object to a [OpenAIFineTuneTrainingFilesModel] object. - factory OpenAIFineTuneTrainingFilesModel.fromJson(Map json) { + factory OpenAIFineTuneTrainingFilesModel.fromMap(Map json) { return OpenAIFineTuneTrainingFilesModel( id: json['id'], bytes: json['bytes'], diff --git a/lib/src/core/models/image/edit/image_edit.dart b/lib/src/core/models/image/edit/image_edit.dart index d6960fa3..59dab769 100644 --- a/lib/src/core/models/image/edit/image_edit.dart +++ b/lib/src/core/models/image/edit/image_edit.dart @@ -22,12 +22,12 @@ class OpenAiImageEditModel { }); /// This method is used to convert a [Map] object to a [OpenAiImageEditModel] object. - factory OpenAiImageEditModel.fromJson(Map json) { + factory OpenAiImageEditModel.fromMap(Map json) { return OpenAiImageEditModel( created: DateTime.fromMillisecondsSinceEpoch(json['created'] * 1000), data: List.from( json['data'].map( - (x) => OpenAIImageEditDataModel.fromJson(x), + (x) => OpenAIImageEditDataModel.fromMap(x), ), ), ); diff --git a/lib/src/core/models/image/edit/sub_models/data.dart b/lib/src/core/models/image/edit/sub_models/data.dart index 721f2fcf..610434b6 100644 --- a/lib/src/core/models/image/edit/sub_models/data.dart +++ b/lib/src/core/models/image/edit/sub_models/data.dart @@ -14,7 +14,7 @@ class OpenAIImageEditDataModel { }); /// This method is used to convert a [Map] object to a [OpenAIImageEditDataModel] object. - factory OpenAIImageEditDataModel.fromJson(Map json) { + factory OpenAIImageEditDataModel.fromMap(Map json) { return OpenAIImageEditDataModel( url: json['url'], ); diff --git a/lib/src/core/models/image/image/image.dart b/lib/src/core/models/image/image/image.dart index 60601489..eb74cc5e 100644 --- a/lib/src/core/models/image/image/image.dart +++ b/lib/src/core/models/image/image/image.dart @@ -22,11 +22,11 @@ class OpenAIImageModel { }); /// This method is used to convert a [Map] object to a [OpenAIImageModel] object. - factory OpenAIImageModel.fromJson(Map json) { + factory OpenAIImageModel.fromMap(Map json) { return OpenAIImageModel( created: DateTime.fromMillisecondsSinceEpoch(json['created'] * 1000), data: (json['data'] as List) - .map((e) => OpenAIImageData.fromJson(e)) + .map((e) => OpenAIImageData.fromMap(e)) .toList(), ); } diff --git a/lib/src/core/models/image/image/sub_models/data.dart b/lib/src/core/models/image/image/sub_models/data.dart index f06c25ca..004cff24 100644 --- a/lib/src/core/models/image/image/sub_models/data.dart +++ b/lib/src/core/models/image/image/sub_models/data.dart @@ -14,7 +14,7 @@ class OpenAIImageData { }); /// This method is used to convert a [Map] object to a [OpenAIImageData] object. - factory OpenAIImageData.fromJson(Map json) { + factory OpenAIImageData.fromMap(Map json) { return OpenAIImageData(url: json['url']); } diff --git a/lib/src/core/models/image/variation/sub_models/data.dart b/lib/src/core/models/image/variation/sub_models/data.dart index e4ed2cf2..08a00496 100644 --- a/lib/src/core/models/image/variation/sub_models/data.dart +++ b/lib/src/core/models/image/variation/sub_models/data.dart @@ -14,7 +14,7 @@ class OpenAIVariationData { }); /// This method is used to convert a [Map] object to a [OpenAIVariationData] object. - factory OpenAIVariationData.fromJson(Map json) { + factory OpenAIVariationData.fromMap(Map json) { return OpenAIVariationData(url: json['url']); } diff --git a/lib/src/core/models/image/variation/variation.dart b/lib/src/core/models/image/variation/variation.dart index 35a4dee8..6ece9403 100644 --- a/lib/src/core/models/image/variation/variation.dart +++ b/lib/src/core/models/image/variation/variation.dart @@ -22,11 +22,11 @@ class OpenAIImageVariationModel { }); /// This method is used to convert a [Map] object to a [OpenAIImageVariationModel] object. - factory OpenAIImageVariationModel.fromJson(Map json) { + factory OpenAIImageVariationModel.fromMap(Map json) { return OpenAIImageVariationModel( created: DateTime.fromMillisecondsSinceEpoch(json['created'] * 1000), data: (json['data'] as List) - .map((e) => OpenAIVariationData.fromJson(e)) + .map((e) => OpenAIVariationData.fromMap(e)) .toList(), ); } diff --git a/lib/src/core/models/model/model.dart b/lib/src/core/models/model/model.dart index 908087e8..e20f6c55 100644 --- a/lib/src/core/models/model/model.dart +++ b/lib/src/core/models/model/model.dart @@ -26,13 +26,13 @@ class OpenAIModelModel { }); /// This method is used to convert a [Map] object to a [OpenAIModelModel] object. - factory OpenAIModelModel.fromJson(Map json) { + factory OpenAIModelModel.fromMap(Map json) { return OpenAIModelModel( id: json['id'], ownedBy: json['owned_by'], permission: (json['permission'] as List) .map((e) => - OpenAIModelModelPermission.fromJson(e as Map)) + OpenAIModelModelPermission.fromMap(e as Map)) .toList(), ); } diff --git a/lib/src/core/models/model/sub_models/permission.dart b/lib/src/core/models/model/sub_models/permission.dart index 08cfcbe3..5bd4d844 100644 --- a/lib/src/core/models/model/sub_models/permission.dart +++ b/lib/src/core/models/model/sub_models/permission.dart @@ -66,7 +66,7 @@ class OpenAIModelModelPermission { }); /// This method is used to convert a [Map] object to a [OpenAIModelModelPermission] object. - factory OpenAIModelModelPermission.fromJson(Map json) { + factory OpenAIModelModelPermission.fromMap(Map json) { return OpenAIModelModelPermission( id: json['id'], created: diff --git a/lib/src/core/models/moderation/moderation.dart b/lib/src/core/models/moderation/moderation.dart index ed6006db..06b39329 100644 --- a/lib/src/core/models/moderation/moderation.dart +++ b/lib/src/core/models/moderation/moderation.dart @@ -28,13 +28,13 @@ class OpenAIModerationModel { }); /// This method is used to convert a [Map] object to a [OpenAIModerationModel] object. - factory OpenAIModerationModel.fromJson(Map json) { + factory OpenAIModerationModel.fromMap(Map json) { return OpenAIModerationModel( id: json['id'], model: json['model'], results: List.from( json['results'].map( - (x) => OpenAIModerationResultModel.fromJson(x), + (x) => OpenAIModerationResultModel.fromMap(x), ), ), ); diff --git a/lib/src/core/models/moderation/sub_models/catgeories.dart b/lib/src/core/models/moderation/sub_models/catgeories.dart index 338aa331..7fd96a7e 100644 --- a/lib/src/core/models/moderation/sub_models/catgeories.dart +++ b/lib/src/core/models/moderation/sub_models/catgeories.dart @@ -46,7 +46,7 @@ class OpenAIModerationResultCategoriesModel { }); /// This method is used to convert a [Map] object to a [OpenAIModerationResultCategoriesModel] object. - factory OpenAIModerationResultCategoriesModel.fromJson( + factory OpenAIModerationResultCategoriesModel.fromMap( Map json, ) { return OpenAIModerationResultCategoriesModel( diff --git a/lib/src/core/models/moderation/sub_models/catgeories_scores.dart b/lib/src/core/models/moderation/sub_models/catgeories_scores.dart index 1cd3c56f..c61dd392 100644 --- a/lib/src/core/models/moderation/sub_models/catgeories_scores.dart +++ b/lib/src/core/models/moderation/sub_models/catgeories_scores.dart @@ -46,7 +46,7 @@ class OpenAIModerationResultScoresModel { }); /// This method is used to convert a [Map] object to a [OpenAIModerationResultScoresModel] object. - factory OpenAIModerationResultScoresModel.fromJson( + factory OpenAIModerationResultScoresModel.fromMap( Map json, ) { return OpenAIModerationResultScoresModel( diff --git a/lib/src/core/models/moderation/sub_models/result.dart b/lib/src/core/models/moderation/sub_models/result.dart index d0407500..68240778 100644 --- a/lib/src/core/models/moderation/sub_models/result.dart +++ b/lib/src/core/models/moderation/sub_models/result.dart @@ -29,12 +29,12 @@ class OpenAIModerationResultModel { }); /// This method is used to convert a [Map] object to a [OpenAIModerationResultModel] object. - factory OpenAIModerationResultModel.fromJson(Map json) { + factory OpenAIModerationResultModel.fromMap(Map json) { return OpenAIModerationResultModel( - categories: OpenAIModerationResultCategoriesModel.fromJson( + categories: OpenAIModerationResultCategoriesModel.fromMap( json['categories'], ), - categoryScores: OpenAIModerationResultScoresModel.fromJson( + categoryScores: OpenAIModerationResultScoresModel.fromMap( json['category_scores'], ), flagged: json['flagged'], diff --git a/lib/src/instance/audio/audio.dart b/lib/src/instance/audio/audio.dart index 2d7dfeaa..e5f07853 100644 --- a/lib/src/instance/audio/audio.dart +++ b/lib/src/instance/audio/audio.dart @@ -30,7 +30,7 @@ class OpenAIAudio implements OpenAIAudioBase { if (laungage != null) "language": laungage, }, onSuccess: (Map response) { - return OpenAIAudioModel.fromJson(response); + return OpenAIAudioModel.fromMap(response); }, ); } @@ -53,7 +53,7 @@ class OpenAIAudio implements OpenAIAudioBase { if (temperature != null) "temperature": temperature.toString(), }, onSuccess: (Map response) { - return OpenAIAudioModel.fromJson(response); + return OpenAIAudioModel.fromMap(response); }, ); } diff --git a/lib/src/instance/chat/chat.dart b/lib/src/instance/chat/chat.dart index 2045d2ef..e5007f46 100644 --- a/lib/src/instance/chat/chat.dart +++ b/lib/src/instance/chat/chat.dart @@ -82,7 +82,7 @@ class OpenAIChat implements OpenAIChatBase { if (user != null) "user": user, }, onSuccess: (Map response) { - return OpenAIChatCompletionModel.fromJson(response); + return OpenAIChatCompletionModel.fromMap(response); }, ); } @@ -165,7 +165,7 @@ class OpenAIChat implements OpenAIChatBase { if (user != null) "user": user, }, onSuccess: (Map response) { - return OpenAIStreamChatCompletionModel.fromJson(response); + return OpenAIStreamChatCompletionModel.fromMap(response); }, ); } diff --git a/lib/src/instance/completion/completion.dart b/lib/src/instance/completion/completion.dart index 6f74e42e..803559d4 100644 --- a/lib/src/instance/completion/completion.dart +++ b/lib/src/instance/completion/completion.dart @@ -128,7 +128,7 @@ class OpenAICompletion implements OpenAICompletionBase { if (user != null) "user": user, }, onSuccess: (Map response) { - return OpenAICompletionModel.fromJson(response); + return OpenAICompletionModel.fromMap(response); }, ); } @@ -241,7 +241,7 @@ class OpenAICompletion implements OpenAICompletionBase { if (user != null) "user": user, }, onSuccess: (Map response) { - return OpenAIStreamCompletionModel.fromJson(response); + return OpenAIStreamCompletionModel.fromMap(response); }, ); } diff --git a/lib/src/instance/edits/edits.dart b/lib/src/instance/edits/edits.dart index 679da404..960c6612 100644 --- a/lib/src/instance/edits/edits.dart +++ b/lib/src/instance/edits/edits.dart @@ -58,7 +58,7 @@ class OpenAIEdits implements OpenAIEditsBase { if (topP != null) "top_p": topP, }, onSuccess: (Map response) { - return OpenAIEditModel.fromJson(response); + return OpenAIEditModel.fromMap(response); }, ); } diff --git a/lib/src/instance/fine_tunes/fine_tunes.dart b/lib/src/instance/fine_tunes/fine_tunes.dart index c44e2251..3f3e5785 100644 --- a/lib/src/instance/fine_tunes/fine_tunes.dart +++ b/lib/src/instance/fine_tunes/fine_tunes.dart @@ -94,7 +94,7 @@ class OpenAIFineTunes implements OpenAIFineTunesBase { }, to: BaseApiUrlBuilder.build(endpoint), onSuccess: (Map response) { - return OpenAIFineTuneModel.fromJson(response); + return OpenAIFineTuneModel.fromMap(response); }, ); } @@ -113,7 +113,7 @@ class OpenAIFineTunes implements OpenAIFineTunesBase { from: BaseApiUrlBuilder.build(endpoint), onSuccess: (Map response) { final dataList = response['data'] as List; - return dataList.map((e) => OpenAIFineTuneModel.fromJson(e)).toList(); + return dataList.map((e) => OpenAIFineTuneModel.fromMap(e)).toList(); }, ); } @@ -134,7 +134,7 @@ class OpenAIFineTunes implements OpenAIFineTunesBase { return await OpenAINetworkingClient.post( to: BaseApiUrlBuilder.build(fineTuneCancelEndpoint), onSuccess: (Map response) { - return OpenAIFineTuneModel.fromJson(response); + return OpenAIFineTuneModel.fromMap(response); }, ); } @@ -169,7 +169,7 @@ class OpenAIFineTunes implements OpenAIFineTunesBase { from: BaseApiUrlBuilder.build(fineTuneEvents), onSuccess: (Map response) { final List events = response['data'] as List; - return events.map((e) => OpenAIFineTuneEventModel.fromJson(e)).toList(); + return events.map((e) => OpenAIFineTuneEventModel.fromMap(e)).toList(); }, ); } @@ -200,7 +200,7 @@ class OpenAIFineTunes implements OpenAIFineTunesBase { return OpenAINetworkingClient.getStream( from: BaseApiUrlBuilder.build(fineTuneEvents, null, "stream=true"), onSuccess: (Map response) { - return OpenAIFineTuneEventStreamModel.fromJson(response); + return OpenAIFineTuneEventStreamModel.fromMap(response); }, ); } @@ -221,7 +221,7 @@ class OpenAIFineTunes implements OpenAIFineTunesBase { return await OpenAINetworkingClient.get( from: BaseApiUrlBuilder.build(fineTuneRetrieve), onSuccess: (Map response) { - return OpenAIFineTuneModel.fromJson(response); + return OpenAIFineTuneModel.fromMap(response); }, ); } diff --git a/lib/src/instance/images/images.dart b/lib/src/instance/images/images.dart index f1a4cc25..2040742b 100644 --- a/lib/src/instance/images/images.dart +++ b/lib/src/instance/images/images.dart @@ -62,7 +62,7 @@ class OpenAIImages implements OpenAIImagesBase { final String generations = "/generations"; return await OpenAINetworkingClient.post( to: BaseApiUrlBuilder.build(endpoint + generations), - onSuccess: (json) => OpenAIImageModel.fromJson(json), + onSuccess: (json) => OpenAIImageModel.fromMap(json), body: { "prompt": prompt, if (n != null) "n": n, @@ -134,7 +134,7 @@ class OpenAIImages implements OpenAIImagesBase { if (user != null) "user": user, }, onSuccess: (Map response) { - return OpenAiImageEditModel.fromJson(response); + return OpenAiImageEditModel.fromMap(response); }, to: BaseApiUrlBuilder.build(endpoint + edit), ); @@ -192,7 +192,7 @@ class OpenAIImages implements OpenAIImagesBase { if (user != null) "user": user, }, onSuccess: (Map response) { - return OpenAIImageVariationModel.fromJson(response); + return OpenAIImageVariationModel.fromMap(response); }, to: BaseApiUrlBuilder.build(endpoint + variations), ); diff --git a/lib/src/instance/model/model.dart b/lib/src/instance/model/model.dart index 8ee874c0..dc30977b 100644 --- a/lib/src/instance/model/model.dart +++ b/lib/src/instance/model/model.dart @@ -29,7 +29,7 @@ class OpenAIModel implements OpenAIModelBase { ), onSuccess: (Map response) { final List data = response['data']; - return data.map((model) => OpenAIModelModel.fromJson(model)).toList(); + return data.map((model) => OpenAIModelModel.fromMap(model)).toList(); }, ); } @@ -48,7 +48,7 @@ class OpenAIModel implements OpenAIModelBase { return await OpenAINetworkingClient.get( from: BaseApiUrlBuilder.build(endpoint, id), onSuccess: (Map response) { - return OpenAIModelModel.fromJson(response); + return OpenAIModelModel.fromMap(response); }, ); } diff --git a/lib/src/instance/moderations/moderations.dart b/lib/src/instance/moderations/moderations.dart index 73f7331d..95243b83 100644 --- a/lib/src/instance/moderations/moderations.dart +++ b/lib/src/instance/moderations/moderations.dart @@ -39,7 +39,7 @@ class OpenAIModeration implements OpenAIModerationBase { }) async { return await OpenAINetworkingClient.post( onSuccess: (Map response) { - return OpenAIModerationModel.fromJson(response); + return OpenAIModerationModel.fromMap(response); }, body: { "input": input, diff --git a/pubspec.yaml b/pubspec.yaml index 47157581..199f448b 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: dart_openai description: Dart SDK for openAI Apis (GPT-3 & DALL-E), integrate easily the power of OpenAI's state-of-the-art AI models into their Dart applications. -version: 1.6.3 +version: 1.6.4 homepage: https://github.com/anasfik/openai repository: https://github.com/anasfik/openai documentation: https://github.com/anasfik/openai/blob/main/README.md diff --git a/test/openai_test.dart b/test/openai_test.dart index 0c2e8cbc..5a6709a8 100644 --- a/test/openai_test.dart +++ b/test/openai_test.dart @@ -6,9 +6,13 @@ import 'package:http/http.dart' as http; import 'package:test/test.dart'; void main() async { - final exampleImageFile = getFileFromUrl( + final exampleImageFile = await getFileFromUrl( "https://upload.wikimedia.org/wikipedia/commons/7/7e/Dart-logo.png", ); + final audioExampleFile = await getFileFromUrl( + "https://www.cbvoiceovers.com/wp-content/uploads/2017/05/Commercial-showreel.mp3", + fileExtension: "mp3", + ); final imageFileExample = await exampleImageFile; final maskFileExample = await exampleImageFile; @@ -210,6 +214,28 @@ void main() async { }); }); + group('audio', () { + test("create transcription", () async { + final transcription = await OpenAI.instance.audio.createTranscription( + file: audioExampleFile, + model: "whisper-1", + responseFormat: "json", + ); + + expect(transcription, isA()); + expect(transcription.text, isA()); + }); + test("create translation", () async { + final translation = await OpenAI.instance.audio.createTranslation( + file: audioExampleFile, + model: "whisper-1", + ); + + expect(translation, isA()); + expect(translation.text, isA()); + }); + }); + group("files", () { test("upload", () async { final OpenAIFileModel file = await OpenAI.instance.file.upload( @@ -353,10 +379,13 @@ File jsonLFileExample() { return file; } -Future getFileFromUrl(String networkUrl) async { +Future getFileFromUrl( + String networkUrl, { + String fileExtension = 'png', +}) async { final response = await http.get(Uri.parse(networkUrl)); final uniqueImageName = DateTime.now().microsecondsSinceEpoch; - final file = File("$uniqueImageName.png"); + final file = File("$uniqueImageName.$fileExtension"); await file.writeAsBytes(response.bodyBytes); return file; }