diff --git a/.vstags b/.vstags index a842961..5ca06d5 100644 --- a/.vstags +++ b/.vstags @@ -9851,100 +9851,73 @@ OpenAIAsync .build/S3aTKnbkmA/blib/lib/OpenAIAsync.pm 1;" p OpenAIAsync .build/S3aTKnbkmA/lib/OpenAIAsync.pm 1;" p OpenAIAsync .build/kBWSNkpY90/blib/lib/OpenAIAsync.pm 1;" p OpenAIAsync .build/kBWSNkpY90/lib/OpenAIAsync.pm 1;" p -OpenAIAsync .build/previous/blib/lib/OpenAIAsync.pm 1;" p -OpenAIAsync .build/previous/lib/OpenAIAsync.pm 1;" p OpenAIAsync lib/OpenAIAsync.pm 1;" p OpenAIAsync::Client .build/S3aTKnbkmA/blib/lib/OpenAIAsync/Client.pm 1;" p OpenAIAsync::Client .build/S3aTKnbkmA/lib/OpenAIAsync/Client.pm 1;" p OpenAIAsync::Client .build/kBWSNkpY90/blib/lib/OpenAIAsync/Client.pm 1;" p OpenAIAsync::Client .build/kBWSNkpY90/lib/OpenAIAsync/Client.pm 1;" p -OpenAIAsync::Client .build/previous/blib/lib/OpenAIAsync/Client.pm 1;" p -OpenAIAsync::Client .build/previous/lib/OpenAIAsync/Client.pm 1;" p OpenAIAsync::Client lib/OpenAIAsync/Client.pm 1;" p OpenAIAsync::Server .build/S3aTKnbkmA/blib/lib/OpenAIAsync/Server.pm 1;" p OpenAIAsync::Server .build/S3aTKnbkmA/lib/OpenAIAsync/Server.pm 1;" p OpenAIAsync::Server .build/kBWSNkpY90/blib/lib/OpenAIAsync/Server.pm 1;" p OpenAIAsync::Server .build/kBWSNkpY90/lib/OpenAIAsync/Server.pm 1;" p -OpenAIAsync::Server .build/previous/blib/lib/OpenAIAsync/Server.pm 1;" p -OpenAIAsync::Server .build/previous/lib/OpenAIAsync/Server.pm 1;" p OpenAIAsync::Server lib/OpenAIAsync/Server.pm 1;" p +OpenAIAsync::Server::API::v1::Audio lib/OpenAIAsync/Server/API/v1/Audio.pm 1;" p OpenAIAsync::Server::API::v1::ChatCompletion .build/S3aTKnbkmA/blib/lib/OpenAIAsync/Server/API/v1/ChatCompletion.pm 1;" p OpenAIAsync::Server::API::v1::ChatCompletion .build/S3aTKnbkmA/lib/OpenAIAsync/Server/API/v1/ChatCompletion.pm 1;" p OpenAIAsync::Server::API::v1::ChatCompletion .build/kBWSNkpY90/blib/lib/OpenAIAsync/Server/API/v1/ChatCompletion.pm 1;" p OpenAIAsync::Server::API::v1::ChatCompletion .build/kBWSNkpY90/lib/OpenAIAsync/Server/API/v1/ChatCompletion.pm 1;" p -OpenAIAsync::Server::API::v1::ChatCompletion .build/previous/blib/lib/OpenAIAsync/Server/API/v1/ChatCompletion.pm 1;" p -OpenAIAsync::Server::API::v1::ChatCompletion .build/previous/lib/OpenAIAsync/Server/API/v1/ChatCompletion.pm 1;" p OpenAIAsync::Server::API::v1::ChatCompletion lib/OpenAIAsync/Server/API/v1/ChatCompletion.pm 1;" p OpenAIAsync::Server::API::v1::Completions .build/S3aTKnbkmA/blib/lib/OpenAIAsync/Server/API/v1/Completions.pm 1;" p OpenAIAsync::Server::API::v1::Completions .build/S3aTKnbkmA/lib/OpenAIAsync/Server/API/v1/Completions.pm 1;" p OpenAIAsync::Server::API::v1::Completions .build/kBWSNkpY90/blib/lib/OpenAIAsync/Server/API/v1/Completions.pm 1;" p OpenAIAsync::Server::API::v1::Completions .build/kBWSNkpY90/lib/OpenAIAsync/Server/API/v1/Completions.pm 1;" p -OpenAIAsync::Server::API::v1::Completions .build/previous/blib/lib/OpenAIAsync/Server/API/v1/Completions.pm 1;" p -OpenAIAsync::Server::API::v1::Completions .build/previous/lib/OpenAIAsync/Server/API/v1/Completions.pm 1;" p OpenAIAsync::Server::API::v1::Completions lib/OpenAIAsync/Server/API/v1/Completions.pm 1;" p OpenAIAsync::Server::API::v1::Embeddings .build/S3aTKnbkmA/blib/lib/OpenAIAsync/Server/API/v1/Embeddings.pm 1;" p OpenAIAsync::Server::API::v1::Embeddings .build/S3aTKnbkmA/lib/OpenAIAsync/Server/API/v1/Embeddings.pm 1;" p OpenAIAsync::Server::API::v1::Embeddings .build/kBWSNkpY90/blib/lib/OpenAIAsync/Server/API/v1/Embeddings.pm 1;" p OpenAIAsync::Server::API::v1::Embeddings .build/kBWSNkpY90/lib/OpenAIAsync/Server/API/v1/Embeddings.pm 1;" p -OpenAIAsync::Server::API::v1::Embeddings .build/previous/blib/lib/OpenAIAsync/Server/API/v1/Embeddings.pm 1;" p -OpenAIAsync::Server::API::v1::Embeddings .build/previous/lib/OpenAIAsync/Server/API/v1/Embeddings.pm 1;" p OpenAIAsync::Server::API::v1::Embeddings lib/OpenAIAsync/Server/API/v1/Embeddings.pm 1;" p OpenAIAsync::Server::API::v1::File .build/S3aTKnbkmA/blib/lib/OpenAIAsync/Server/API/v1/File.pm 1;" p OpenAIAsync::Server::API::v1::File .build/S3aTKnbkmA/lib/OpenAIAsync/Server/API/v1/File.pm 1;" p OpenAIAsync::Server::API::v1::File .build/kBWSNkpY90/blib/lib/OpenAIAsync/Server/API/v1/File.pm 1;" p OpenAIAsync::Server::API::v1::File .build/kBWSNkpY90/lib/OpenAIAsync/Server/API/v1/File.pm 1;" p -OpenAIAsync::Server::API::v1::File .build/previous/blib/lib/OpenAIAsync/Server/API/v1/File.pm 1;" p -OpenAIAsync::Server::API::v1::File .build/previous/lib/OpenAIAsync/Server/API/v1/File.pm 1;" p OpenAIAsync::Server::API::v1::File lib/OpenAIAsync/Server/API/v1/File.pm 1;" p OpenAIAsync::Server::API::v1::ModelList .build/S3aTKnbkmA/blib/lib/OpenAIAsync/Server/API/v1/ModelList.pm 1;" p OpenAIAsync::Server::API::v1::ModelList .build/S3aTKnbkmA/lib/OpenAIAsync/Server/API/v1/ModelList.pm 1;" p OpenAIAsync::Server::API::v1::ModelList .build/kBWSNkpY90/blib/lib/OpenAIAsync/Server/API/v1/ModelList.pm 1;" p OpenAIAsync::Server::API::v1::ModelList .build/kBWSNkpY90/lib/OpenAIAsync/Server/API/v1/ModelList.pm 1;" p -OpenAIAsync::Server::API::v1::ModelList .build/previous/blib/lib/OpenAIAsync/Server/API/v1/ModelList.pm 1;" p -OpenAIAsync::Server::API::v1::ModelList .build/previous/lib/OpenAIAsync/Server/API/v1/ModelList.pm 1;" p OpenAIAsync::Server::API::v1::ModelList lib/OpenAIAsync/Server/API/v1/ModelList.pm 1;" p OpenAIAsync::Server::API::v1::Moderations lib/OpenAIAsync/Server/API/v1/Moderations.pm 1;" p OpenAIAsync::Types .build/S3aTKnbkmA/blib/lib/OpenAIAsync/Types.pm 1;" p OpenAIAsync::Types .build/S3aTKnbkmA/lib/OpenAIAsync/Types.pm 1;" p OpenAIAsync::Types .build/kBWSNkpY90/blib/lib/OpenAIAsync/Types.pm 1;" p OpenAIAsync::Types .build/kBWSNkpY90/lib/OpenAIAsync/Types.pm 1;" p -OpenAIAsync::Types .build/previous/blib/lib/OpenAIAsync/Types.pm 1;" p -OpenAIAsync::Types .build/previous/lib/OpenAIAsync/Types.pm 1;" p OpenAIAsync::Types lib/OpenAIAsync/Types.pm 1;" p OpenAIAsync::Types::Requests .build/S3aTKnbkmA/blib/lib/OpenAIAsync/Types/Requests.pm 1;" p OpenAIAsync::Types::Requests .build/S3aTKnbkmA/lib/OpenAIAsync/Types/Requests.pm 1;" p OpenAIAsync::Types::Requests .build/kBWSNkpY90/blib/lib/OpenAIAsync/Types/Requests.pm 1;" p OpenAIAsync::Types::Requests .build/kBWSNkpY90/lib/OpenAIAsync/Types/Requests.pm 1;" p -OpenAIAsync::Types::Requests .build/previous/blib/lib/OpenAIAsync/Types/Requests.pm 1;" p -OpenAIAsync::Types::Requests .build/previous/lib/OpenAIAsync/Types/Requests.pm 1;" p OpenAIAsync::Types::Requests lib/OpenAIAsync/Types/Requests.pm 1;" p OpenAIAsync::Types::Requests::ChatCompletion::Messages::Union .build/S3aTKnbkmA/blib/lib/OpenAIAsync/Types/Requests.pm 192;" p OpenAIAsync::Types::Requests::ChatCompletion::Messages::Union .build/S3aTKnbkmA/lib/OpenAIAsync/Types/Requests.pm 192;" p OpenAIAsync::Types::Requests::ChatCompletion::Messages::Union .build/kBWSNkpY90/blib/lib/OpenAIAsync/Types/Requests.pm 192;" p OpenAIAsync::Types::Requests::ChatCompletion::Messages::Union .build/kBWSNkpY90/lib/OpenAIAsync/Types/Requests.pm 192;" p -OpenAIAsync::Types::Requests::ChatCompletion::Messages::Union .build/previous/blib/lib/OpenAIAsync/Types/Requests.pm 192;" p -OpenAIAsync::Types::Requests::ChatCompletion::Messages::Union .build/previous/lib/OpenAIAsync/Types/Requests.pm 192;" p OpenAIAsync::Types::Requests::ChatCompletion::Messages::Union lib/OpenAIAsync/Types/Requests.pm 192;" p OpenAIAsync::Types::Requests::ChatCompletion::Messages::User::ContentUnion .build/S3aTKnbkmA/blib/lib/OpenAIAsync/Types/Requests.pm 115;" p OpenAIAsync::Types::Requests::ChatCompletion::Messages::User::ContentUnion .build/S3aTKnbkmA/lib/OpenAIAsync/Types/Requests.pm 115;" p OpenAIAsync::Types::Requests::ChatCompletion::Messages::User::ContentUnion .build/kBWSNkpY90/blib/lib/OpenAIAsync/Types/Requests.pm 115;" p OpenAIAsync::Types::Requests::ChatCompletion::Messages::User::ContentUnion .build/kBWSNkpY90/lib/OpenAIAsync/Types/Requests.pm 115;" p -OpenAIAsync::Types::Requests::ChatCompletion::Messages::User::ContentUnion .build/previous/blib/lib/OpenAIAsync/Types/Requests.pm 115;" p -OpenAIAsync::Types::Requests::ChatCompletion::Messages::User::ContentUnion .build/previous/lib/OpenAIAsync/Types/Requests.pm 115;" p OpenAIAsync::Types::Requests::ChatCompletion::Messages::User::ContentUnion lib/OpenAIAsync/Types/Requests.pm 115;" p OpenAIAsync::Types::Results .build/S3aTKnbkmA/blib/lib/OpenAIAsync/Types/Results.pm 1;" p OpenAIAsync::Types::Results .build/S3aTKnbkmA/lib/OpenAIAsync/Types/Results.pm 1;" p OpenAIAsync::Types::Results .build/kBWSNkpY90/blib/lib/OpenAIAsync/Types/Results.pm 1;" p OpenAIAsync::Types::Results .build/kBWSNkpY90/lib/OpenAIAsync/Types/Results.pm 1;" p -OpenAIAsync::Types::Results .build/previous/blib/lib/OpenAIAsync/Types/Results.pm 1;" p -OpenAIAsync::Types::Results .build/previous/lib/OpenAIAsync/Types/Results.pm 1;" p OpenAIAsync::Types::Results lib/OpenAIAsync/Types/Results.pm 1;" p OpenAIAsync::Types::Shared .build/S3aTKnbkmA/blib/lib/OpenAIAsync/Types/Shared.pm 1;" p OpenAIAsync::Types::Shared .build/S3aTKnbkmA/lib/OpenAIAsync/Types/Shared.pm 1;" p OpenAIAsync::Types::Shared .build/kBWSNkpY90/blib/lib/OpenAIAsync/Types/Shared.pm 1;" p OpenAIAsync::Types::Shared .build/kBWSNkpY90/lib/OpenAIAsync/Types/Shared.pm 1;" p -OpenAIAsync::Types::Shared .build/previous/blib/lib/OpenAIAsync/Types/Shared.pm 1;" p -OpenAIAsync::Types::Shared .build/previous/lib/OpenAIAsync/Types/Shared.pm 1;" p OpenAIAsync::Types::Shared lib/OpenAIAsync/Types/Shared.pm 1;" p PAREN local/lib/perl5/Perl/Tidy/Tokenizer.pm 1699;" c PART_PRES local/lib/perl5/Lingua/EN/Inflect.pm 1452;" s @@ -27994,10 +27967,6 @@ new .build/kBWSNkpY90/blib/lib/OpenAIAsync/Types/Requests.pm 118;" s new .build/kBWSNkpY90/blib/lib/OpenAIAsync/Types/Requests.pm 195;" s new .build/kBWSNkpY90/lib/OpenAIAsync/Types/Requests.pm 118;" s new .build/kBWSNkpY90/lib/OpenAIAsync/Types/Requests.pm 195;" s -new .build/previous/blib/lib/OpenAIAsync/Types/Requests.pm 118;" s -new .build/previous/blib/lib/OpenAIAsync/Types/Requests.pm 195;" s -new .build/previous/lib/OpenAIAsync/Types/Requests.pm 118;" s -new .build/previous/lib/OpenAIAsync/Types/Requests.pm 195;" s new lib/OpenAIAsync/Types/Requests.pm 118;" s new lib/OpenAIAsync/Types/Requests.pm 195;" s new local/bin/lwp-request 231;" s @@ -28792,8 +28761,6 @@ ontent::new .build/S3aTKnbkmA/blib/lib/OpenAIAsync/Types/Requests.pm 195;" s ontent::new .build/S3aTKnbkmA/lib/OpenAIAsync/Types/Requests.pm 195;" s ontent::new .build/kBWSNkpY90/blib/lib/OpenAIAsync/Types/Requests.pm 195;" s ontent::new .build/kBWSNkpY90/lib/OpenAIAsync/Types/Requests.pm 195;" s -ontent::new .build/previous/blib/lib/OpenAIAsync/Types/Requests.pm 195;" s -ontent::new .build/previous/lib/OpenAIAsync/Types/Requests.pm 195;" s ontent::new lib/OpenAIAsync/Types/Requests.pm 195;" s oo local/lib/perl5/oo.pm 1;" p oo::import local/lib/perl5/oo.pm 22;" s @@ -31436,8 +31403,6 @@ y::new .build/S3aTKnbkmA/blib/lib/OpenAIAsync/Types/Requests.pm 118;" s y::new .build/S3aTKnbkmA/lib/OpenAIAsync/Types/Requests.pm 118;" s y::new .build/kBWSNkpY90/blib/lib/OpenAIAsync/Types/Requests.pm 118;" s y::new .build/kBWSNkpY90/lib/OpenAIAsync/Types/Requests.pm 118;" s -y::new .build/previous/blib/lib/OpenAIAsync/Types/Requests.pm 118;" s -y::new .build/previous/lib/OpenAIAsync/Types/Requests.pm 118;" s y::new lib/OpenAIAsync/Types/Requests.pm 118;" s y_n local/lib/perl5/Module/Build/Base.pm 602;" s year local/lib/perl5/Software/License.pm 57;" s diff --git a/lib/OpenAIAsync/Server/API/v1/Audio.pm b/lib/OpenAIAsync/Server/API/v1/Audio.pm new file mode 100644 index 0000000..1780115 --- /dev/null +++ b/lib/OpenAIAsync/Server/API/v1/Audio.pm @@ -0,0 +1,76 @@ +package OpenAIAsync::Server::API::v1::Audio; + +use v5.36.0; +use Object::Pad; +use IO::Async::SSL; # We're not directly using it but I want to enforce that we pull it in when detecting dependencies, since openai itself is always https +use Future::AsyncAwait; +use IO::Async; + +use OpenAIAsync::Types::Results; +use OpenAIAsync::Types::Requests; + +our $VERSION = '0.02'; + +# ABSTRACT: Async server for OpenAI style REST API for various AI systems (LLMs, Images, Video, etc.) + +=pod + +=head1 NAME + +OpenAIAsync::Server::API::Audio - Basic audio api role, consumed to implement the OpenAI audio api. Does not provide an implementation, you are expected to override them in your class + +TODO document the subroles here, split up because TTS is much simpler to implement than the others and will be more valuable to support alone if someone chooses + +=head1 SYNOPSIS + +... + +=cut + +role OpenAIAsync::Server::API::v1::Audio :strict(params) { + apply OpenAIAsync::Server::API::v1::AudioTTS; + apply OpenAIAsync::Server::API::v1::AudioSTT; + apply OpenAIAsync::Server::API::v1::AudioTranslate; +} + +role OpenAIAsync::Server::API::v1::AudioTTS :strict(params) { + ADJUST { + $self->register_url( + method => 'POST', + url => qr{^/v1/audio/speech$}, + handle => async sub($req, $ctx, $obj, $params) {await $self->audio_create_speech($obj, $req, $ctx)}, + request_class => "OpenAIAsync::Type::Requests::CreateSpeech", + result_class => "", # This gives back a file of audio data + ); + } + + async method audio_create_speech($obj, $http_req, $ctx) {...} +} + +role OpenAIAsync::Server::API::v1::AudioSTT :strict(params) { + ADJUST { + $self->register_url( + method => 'POST', + url => qr{^/v1/audio/transcription$}, + handle => async sub($req, $ctx, $obj, $params) {await $self->audio_create_transcript($obj, $req, $ctx)}, + request_class => "OpenAIAsync::Type::Requests::CreateTranscription", + result_class => "", # This gives back a file, in the requested format + ); + } + + async method audio_create_transcript($obj, $http_req, $ctx) {...} +} + +role OpenAIAsync::Server::API::v1::AudioTranslate :strict(params) { + ADJUST { + $self->register_url( + method => 'POST', + url => qr{^/v1/$}, + handle => async sub($req, $ctx, $obj, $params) {await $self->audio_create_translation($obj, $req, $ctx)}, + request_class => "OpenAIAsync::Type::Requests::CreateTranslation", + result_class => "", # This gives back a file, in the requested format + ); + } + + async method audio_create_translation($obj, $http_req, $ctx) {...} +} \ No newline at end of file diff --git a/t/02-create-client.t b/t/02-create-client.t index b308693..94fba3b 100644 --- a/t/02-create-client.t +++ b/t/02-create-client.t @@ -6,6 +6,7 @@ use Test2::V0; use OpenAIAsync::Client; BEGIN { + no warnings 'uninitialized'; $ENV{OPENAI_API_KEY}="12345" unless $ENV{OPENAI_API_KEY}eq"12345"; } @@ -37,4 +38,4 @@ ok lives { -done_testing(); \ No newline at end of file +done_testing();