server side audio apis
Some checks failed
ci/woodpecker/push/author-tests Pipeline failed

This commit is contained in:
Ryan Voots 2024-01-01 10:24:20 -05:00
parent 3430f315cf
commit 1e9a5b1fe2
3 changed files with 79 additions and 37 deletions

37
.vstags
View file

@ -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

View file

@ -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) {...}
}

View file

@ -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";
}