Final conversion
Some checks failed
ci/woodpecker/push/author-tests Pipeline failed

This commit is contained in:
Ryan Voots 2024-01-01 11:33:50 -05:00
parent 8c9fe2e808
commit 26f5e15da8
7 changed files with 28 additions and 452 deletions

84
.vstags
View file

@ -9865,10 +9865,6 @@ OpenAIAsync .build/bu5iQckAwH/blib/lib/OpenAIAsync.pm 1;" p
OpenAIAsync .build/bu5iQckAwH/lib/OpenAIAsync.pm 1;" p OpenAIAsync .build/bu5iQckAwH/lib/OpenAIAsync.pm 1;" p
OpenAIAsync .build/kBWSNkpY90/blib/lib/OpenAIAsync.pm 1;" p OpenAIAsync .build/kBWSNkpY90/blib/lib/OpenAIAsync.pm 1;" p
OpenAIAsync .build/kBWSNkpY90/lib/OpenAIAsync.pm 1;" p OpenAIAsync .build/kBWSNkpY90/lib/OpenAIAsync.pm 1;" p
OpenAIAsync .build/latest/blib/lib/OpenAIAsync.pm 1;" p
OpenAIAsync .build/latest/lib/OpenAIAsync.pm 1;" p
OpenAIAsync .build/previous/blib/lib/OpenAIAsync.pm 1;" p
OpenAIAsync .build/previous/lib/OpenAIAsync.pm 1;" p
OpenAIAsync .build/s8al1KxdoG/blib/lib/OpenAIAsync.pm 1;" p OpenAIAsync .build/s8al1KxdoG/blib/lib/OpenAIAsync.pm 1;" p
OpenAIAsync .build/s8al1KxdoG/lib/OpenAIAsync.pm 1;" p OpenAIAsync .build/s8al1KxdoG/lib/OpenAIAsync.pm 1;" p
OpenAIAsync lib/OpenAIAsync.pm 1;" p OpenAIAsync lib/OpenAIAsync.pm 1;" p
@ -9890,10 +9886,6 @@ OpenAIAsync::Client .build/bu5iQckAwH/blib/lib/OpenAIAsync/Client.pm 1;" p
OpenAIAsync::Client .build/bu5iQckAwH/lib/OpenAIAsync/Client.pm 1;" p OpenAIAsync::Client .build/bu5iQckAwH/lib/OpenAIAsync/Client.pm 1;" p
OpenAIAsync::Client .build/kBWSNkpY90/blib/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/kBWSNkpY90/lib/OpenAIAsync/Client.pm 1;" p
OpenAIAsync::Client .build/latest/blib/lib/OpenAIAsync/Client.pm 1;" p
OpenAIAsync::Client .build/latest/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 .build/s8al1KxdoG/blib/lib/OpenAIAsync/Client.pm 1;" p OpenAIAsync::Client .build/s8al1KxdoG/blib/lib/OpenAIAsync/Client.pm 1;" p
OpenAIAsync::Client .build/s8al1KxdoG/lib/OpenAIAsync/Client.pm 1;" p OpenAIAsync::Client .build/s8al1KxdoG/lib/OpenAIAsync/Client.pm 1;" p
OpenAIAsync::Client lib/OpenAIAsync/Client.pm 1;" p OpenAIAsync::Client lib/OpenAIAsync/Client.pm 1;" p
@ -9915,10 +9907,6 @@ OpenAIAsync::Server .build/bu5iQckAwH/blib/lib/OpenAIAsync/Server.pm 1;" p
OpenAIAsync::Server .build/bu5iQckAwH/lib/OpenAIAsync/Server.pm 1;" p OpenAIAsync::Server .build/bu5iQckAwH/lib/OpenAIAsync/Server.pm 1;" p
OpenAIAsync::Server .build/kBWSNkpY90/blib/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/kBWSNkpY90/lib/OpenAIAsync/Server.pm 1;" p
OpenAIAsync::Server .build/latest/blib/lib/OpenAIAsync/Server.pm 1;" p
OpenAIAsync::Server .build/latest/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 .build/s8al1KxdoG/blib/lib/OpenAIAsync/Server.pm 1;" p OpenAIAsync::Server .build/s8al1KxdoG/blib/lib/OpenAIAsync/Server.pm 1;" p
OpenAIAsync::Server .build/s8al1KxdoG/lib/OpenAIAsync/Server.pm 1;" p OpenAIAsync::Server .build/s8al1KxdoG/lib/OpenAIAsync/Server.pm 1;" p
OpenAIAsync::Server lib/OpenAIAsync/Server.pm 1;" p OpenAIAsync::Server lib/OpenAIAsync/Server.pm 1;" p
@ -9928,10 +9916,6 @@ OpenAIAsync::Server::API::v1::Audio .build/8vRKKpniYC/blib/lib/OpenAIAsync/Serve
OpenAIAsync::Server::API::v1::Audio .build/8vRKKpniYC/lib/OpenAIAsync/Server/API/v1/Audio.pm 1;" p OpenAIAsync::Server::API::v1::Audio .build/8vRKKpniYC/lib/OpenAIAsync/Server/API/v1/Audio.pm 1;" p
OpenAIAsync::Server::API::v1::Audio .build/FGqz_8QCrj/blib/lib/OpenAIAsync/Server/API/v1/Audio.pm 1;" p OpenAIAsync::Server::API::v1::Audio .build/FGqz_8QCrj/blib/lib/OpenAIAsync/Server/API/v1/Audio.pm 1;" p
OpenAIAsync::Server::API::v1::Audio .build/FGqz_8QCrj/lib/OpenAIAsync/Server/API/v1/Audio.pm 1;" p OpenAIAsync::Server::API::v1::Audio .build/FGqz_8QCrj/lib/OpenAIAsync/Server/API/v1/Audio.pm 1;" p
OpenAIAsync::Server::API::v1::Audio .build/latest/blib/lib/OpenAIAsync/Server/API/v1/Audio.pm 1;" p
OpenAIAsync::Server::API::v1::Audio .build/latest/lib/OpenAIAsync/Server/API/v1/Audio.pm 1;" p
OpenAIAsync::Server::API::v1::Audio .build/previous/blib/lib/OpenAIAsync/Server/API/v1/Audio.pm 1;" p
OpenAIAsync::Server::API::v1::Audio .build/previous/lib/OpenAIAsync/Server/API/v1/Audio.pm 1;" p
OpenAIAsync::Server::API::v1::Audio lib/OpenAIAsync/Server/API/v1/Audio.pm 1;" p OpenAIAsync::Server::API::v1::Audio lib/OpenAIAsync/Server/API/v1/Audio.pm 1;" p
OpenAIAsync::Server::API::v1::ChatCompletion .build/6o4PVL1DX3/blib/lib/OpenAIAsync/Server/API/v1/ChatCompletion.pm 1;" p OpenAIAsync::Server::API::v1::ChatCompletion .build/6o4PVL1DX3/blib/lib/OpenAIAsync/Server/API/v1/ChatCompletion.pm 1;" p
OpenAIAsync::Server::API::v1::ChatCompletion .build/6o4PVL1DX3/lib/OpenAIAsync/Server/API/v1/ChatCompletion.pm 1;" p OpenAIAsync::Server::API::v1::ChatCompletion .build/6o4PVL1DX3/lib/OpenAIAsync/Server/API/v1/ChatCompletion.pm 1;" p
@ -9951,10 +9935,6 @@ OpenAIAsync::Server::API::v1::ChatCompletion .build/bu5iQckAwH/blib/lib/OpenAIAs
OpenAIAsync::Server::API::v1::ChatCompletion .build/bu5iQckAwH/lib/OpenAIAsync/Server/API/v1/ChatCompletion.pm 1;" p OpenAIAsync::Server::API::v1::ChatCompletion .build/bu5iQckAwH/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/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/kBWSNkpY90/lib/OpenAIAsync/Server/API/v1/ChatCompletion.pm 1;" p
OpenAIAsync::Server::API::v1::ChatCompletion .build/latest/blib/lib/OpenAIAsync/Server/API/v1/ChatCompletion.pm 1;" p
OpenAIAsync::Server::API::v1::ChatCompletion .build/latest/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 .build/s8al1KxdoG/blib/lib/OpenAIAsync/Server/API/v1/ChatCompletion.pm 1;" p OpenAIAsync::Server::API::v1::ChatCompletion .build/s8al1KxdoG/blib/lib/OpenAIAsync/Server/API/v1/ChatCompletion.pm 1;" p
OpenAIAsync::Server::API::v1::ChatCompletion .build/s8al1KxdoG/lib/OpenAIAsync/Server/API/v1/ChatCompletion.pm 1;" p OpenAIAsync::Server::API::v1::ChatCompletion .build/s8al1KxdoG/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::ChatCompletion lib/OpenAIAsync/Server/API/v1/ChatCompletion.pm 1;" p
@ -9976,10 +9956,6 @@ OpenAIAsync::Server::API::v1::Completions .build/bu5iQckAwH/blib/lib/OpenAIAsync
OpenAIAsync::Server::API::v1::Completions .build/bu5iQckAwH/lib/OpenAIAsync/Server/API/v1/Completions.pm 1;" p OpenAIAsync::Server::API::v1::Completions .build/bu5iQckAwH/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/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/kBWSNkpY90/lib/OpenAIAsync/Server/API/v1/Completions.pm 1;" p
OpenAIAsync::Server::API::v1::Completions .build/latest/blib/lib/OpenAIAsync/Server/API/v1/Completions.pm 1;" p
OpenAIAsync::Server::API::v1::Completions .build/latest/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 .build/s8al1KxdoG/blib/lib/OpenAIAsync/Server/API/v1/Completions.pm 1;" p OpenAIAsync::Server::API::v1::Completions .build/s8al1KxdoG/blib/lib/OpenAIAsync/Server/API/v1/Completions.pm 1;" p
OpenAIAsync::Server::API::v1::Completions .build/s8al1KxdoG/lib/OpenAIAsync/Server/API/v1/Completions.pm 1;" p OpenAIAsync::Server::API::v1::Completions .build/s8al1KxdoG/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::Completions lib/OpenAIAsync/Server/API/v1/Completions.pm 1;" p
@ -10001,10 +9977,6 @@ OpenAIAsync::Server::API::v1::Embeddings .build/bu5iQckAwH/blib/lib/OpenAIAsync/
OpenAIAsync::Server::API::v1::Embeddings .build/bu5iQckAwH/lib/OpenAIAsync/Server/API/v1/Embeddings.pm 1;" p OpenAIAsync::Server::API::v1::Embeddings .build/bu5iQckAwH/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/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/kBWSNkpY90/lib/OpenAIAsync/Server/API/v1/Embeddings.pm 1;" p
OpenAIAsync::Server::API::v1::Embeddings .build/latest/blib/lib/OpenAIAsync/Server/API/v1/Embeddings.pm 1;" p
OpenAIAsync::Server::API::v1::Embeddings .build/latest/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 .build/s8al1KxdoG/blib/lib/OpenAIAsync/Server/API/v1/Embeddings.pm 1;" p OpenAIAsync::Server::API::v1::Embeddings .build/s8al1KxdoG/blib/lib/OpenAIAsync/Server/API/v1/Embeddings.pm 1;" p
OpenAIAsync::Server::API::v1::Embeddings .build/s8al1KxdoG/lib/OpenAIAsync/Server/API/v1/Embeddings.pm 1;" p OpenAIAsync::Server::API::v1::Embeddings .build/s8al1KxdoG/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::Embeddings lib/OpenAIAsync/Server/API/v1/Embeddings.pm 1;" p
@ -10026,10 +9998,6 @@ OpenAIAsync::Server::API::v1::File .build/bu5iQckAwH/blib/lib/OpenAIAsync/Server
OpenAIAsync::Server::API::v1::File .build/bu5iQckAwH/lib/OpenAIAsync/Server/API/v1/File.pm 1;" p OpenAIAsync::Server::API::v1::File .build/bu5iQckAwH/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/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/kBWSNkpY90/lib/OpenAIAsync/Server/API/v1/File.pm 1;" p
OpenAIAsync::Server::API::v1::File .build/latest/blib/lib/OpenAIAsync/Server/API/v1/File.pm 1;" p
OpenAIAsync::Server::API::v1::File .build/latest/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 .build/s8al1KxdoG/blib/lib/OpenAIAsync/Server/API/v1/File.pm 1;" p OpenAIAsync::Server::API::v1::File .build/s8al1KxdoG/blib/lib/OpenAIAsync/Server/API/v1/File.pm 1;" p
OpenAIAsync::Server::API::v1::File .build/s8al1KxdoG/lib/OpenAIAsync/Server/API/v1/File.pm 1;" p OpenAIAsync::Server::API::v1::File .build/s8al1KxdoG/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::File lib/OpenAIAsync/Server/API/v1/File.pm 1;" p
@ -10047,10 +10015,6 @@ OpenAIAsync::Server::API::v1::Image .build/ZeGti15sCn/blib/lib/OpenAIAsync/Serve
OpenAIAsync::Server::API::v1::Image .build/ZeGti15sCn/lib/OpenAIAsync/Server/API/v1/Image.pm 1;" p OpenAIAsync::Server::API::v1::Image .build/ZeGti15sCn/lib/OpenAIAsync/Server/API/v1/Image.pm 1;" p
OpenAIAsync::Server::API::v1::Image .build/bu5iQckAwH/blib/lib/OpenAIAsync/Server/API/v1/Image.pm 1;" p OpenAIAsync::Server::API::v1::Image .build/bu5iQckAwH/blib/lib/OpenAIAsync/Server/API/v1/Image.pm 1;" p
OpenAIAsync::Server::API::v1::Image .build/bu5iQckAwH/lib/OpenAIAsync/Server/API/v1/Image.pm 1;" p OpenAIAsync::Server::API::v1::Image .build/bu5iQckAwH/lib/OpenAIAsync/Server/API/v1/Image.pm 1;" p
OpenAIAsync::Server::API::v1::Image .build/latest/blib/lib/OpenAIAsync/Server/API/v1/Image.pm 1;" p
OpenAIAsync::Server::API::v1::Image .build/latest/lib/OpenAIAsync/Server/API/v1/Image.pm 1;" p
OpenAIAsync::Server::API::v1::Image .build/previous/blib/lib/OpenAIAsync/Server/API/v1/Image.pm 1;" p
OpenAIAsync::Server::API::v1::Image .build/previous/lib/OpenAIAsync/Server/API/v1/Image.pm 1;" p
OpenAIAsync::Server::API::v1::Image .build/s8al1KxdoG/blib/lib/OpenAIAsync/Server/API/v1/Image.pm 1;" p OpenAIAsync::Server::API::v1::Image .build/s8al1KxdoG/blib/lib/OpenAIAsync/Server/API/v1/Image.pm 1;" p
OpenAIAsync::Server::API::v1::Image .build/s8al1KxdoG/lib/OpenAIAsync/Server/API/v1/Image.pm 1;" p OpenAIAsync::Server::API::v1::Image .build/s8al1KxdoG/lib/OpenAIAsync/Server/API/v1/Image.pm 1;" p
OpenAIAsync::Server::API::v1::Image lib/OpenAIAsync/Server/API/v1/Image.pm 1;" p OpenAIAsync::Server::API::v1::Image lib/OpenAIAsync/Server/API/v1/Image.pm 1;" p
@ -10072,10 +10036,6 @@ OpenAIAsync::Server::API::v1::ModelList .build/bu5iQckAwH/blib/lib/OpenAIAsync/S
OpenAIAsync::Server::API::v1::ModelList .build/bu5iQckAwH/lib/OpenAIAsync/Server/API/v1/ModelList.pm 1;" p OpenAIAsync::Server::API::v1::ModelList .build/bu5iQckAwH/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/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/kBWSNkpY90/lib/OpenAIAsync/Server/API/v1/ModelList.pm 1;" p
OpenAIAsync::Server::API::v1::ModelList .build/latest/blib/lib/OpenAIAsync/Server/API/v1/ModelList.pm 1;" p
OpenAIAsync::Server::API::v1::ModelList .build/latest/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 .build/s8al1KxdoG/blib/lib/OpenAIAsync/Server/API/v1/ModelList.pm 1;" p OpenAIAsync::Server::API::v1::ModelList .build/s8al1KxdoG/blib/lib/OpenAIAsync/Server/API/v1/ModelList.pm 1;" p
OpenAIAsync::Server::API::v1::ModelList .build/s8al1KxdoG/lib/OpenAIAsync/Server/API/v1/ModelList.pm 1;" p OpenAIAsync::Server::API::v1::ModelList .build/s8al1KxdoG/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::ModelList lib/OpenAIAsync/Server/API/v1/ModelList.pm 1;" p
@ -10093,10 +10053,6 @@ OpenAIAsync::Server::API::v1::Moderations .build/ZeGti15sCn/blib/lib/OpenAIAsync
OpenAIAsync::Server::API::v1::Moderations .build/ZeGti15sCn/lib/OpenAIAsync/Server/API/v1/Moderations.pm 1;" p OpenAIAsync::Server::API::v1::Moderations .build/ZeGti15sCn/lib/OpenAIAsync/Server/API/v1/Moderations.pm 1;" p
OpenAIAsync::Server::API::v1::Moderations .build/bu5iQckAwH/blib/lib/OpenAIAsync/Server/API/v1/Moderations.pm 1;" p OpenAIAsync::Server::API::v1::Moderations .build/bu5iQckAwH/blib/lib/OpenAIAsync/Server/API/v1/Moderations.pm 1;" p
OpenAIAsync::Server::API::v1::Moderations .build/bu5iQckAwH/lib/OpenAIAsync/Server/API/v1/Moderations.pm 1;" p OpenAIAsync::Server::API::v1::Moderations .build/bu5iQckAwH/lib/OpenAIAsync/Server/API/v1/Moderations.pm 1;" p
OpenAIAsync::Server::API::v1::Moderations .build/latest/blib/lib/OpenAIAsync/Server/API/v1/Moderations.pm 1;" p
OpenAIAsync::Server::API::v1::Moderations .build/latest/lib/OpenAIAsync/Server/API/v1/Moderations.pm 1;" p
OpenAIAsync::Server::API::v1::Moderations .build/previous/blib/lib/OpenAIAsync/Server/API/v1/Moderations.pm 1;" p
OpenAIAsync::Server::API::v1::Moderations .build/previous/lib/OpenAIAsync/Server/API/v1/Moderations.pm 1;" p
OpenAIAsync::Server::API::v1::Moderations .build/s8al1KxdoG/blib/lib/OpenAIAsync/Server/API/v1/Moderations.pm 1;" p OpenAIAsync::Server::API::v1::Moderations .build/s8al1KxdoG/blib/lib/OpenAIAsync/Server/API/v1/Moderations.pm 1;" p
OpenAIAsync::Server::API::v1::Moderations .build/s8al1KxdoG/lib/OpenAIAsync/Server/API/v1/Moderations.pm 1;" p OpenAIAsync::Server::API::v1::Moderations .build/s8al1KxdoG/lib/OpenAIAsync/Server/API/v1/Moderations.pm 1;" p
OpenAIAsync::Server::API::v1::Moderations lib/OpenAIAsync/Server/API/v1/Moderations.pm 1;" p OpenAIAsync::Server::API::v1::Moderations lib/OpenAIAsync/Server/API/v1/Moderations.pm 1;" p
@ -10118,10 +10074,6 @@ OpenAIAsync::Types .build/bu5iQckAwH/blib/lib/OpenAIAsync/Types.pm 1;" p
OpenAIAsync::Types .build/bu5iQckAwH/lib/OpenAIAsync/Types.pm 1;" p OpenAIAsync::Types .build/bu5iQckAwH/lib/OpenAIAsync/Types.pm 1;" p
OpenAIAsync::Types .build/kBWSNkpY90/blib/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/kBWSNkpY90/lib/OpenAIAsync/Types.pm 1;" p
OpenAIAsync::Types .build/latest/blib/lib/OpenAIAsync/Types.pm 1;" p
OpenAIAsync::Types .build/latest/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 .build/s8al1KxdoG/blib/lib/OpenAIAsync/Types.pm 1;" p OpenAIAsync::Types .build/s8al1KxdoG/blib/lib/OpenAIAsync/Types.pm 1;" p
OpenAIAsync::Types .build/s8al1KxdoG/lib/OpenAIAsync/Types.pm 1;" p OpenAIAsync::Types .build/s8al1KxdoG/lib/OpenAIAsync/Types.pm 1;" p
OpenAIAsync::Types lib/OpenAIAsync/Types.pm 1;" p OpenAIAsync::Types lib/OpenAIAsync/Types.pm 1;" p
@ -10143,10 +10095,6 @@ OpenAIAsync::Types::Requests .build/bu5iQckAwH/blib/lib/OpenAIAsync/Types/Reques
OpenAIAsync::Types::Requests .build/bu5iQckAwH/lib/OpenAIAsync/Types/Requests.pm 1;" p OpenAIAsync::Types::Requests .build/bu5iQckAwH/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/blib/lib/OpenAIAsync/Types/Requests.pm 1;" p
OpenAIAsync::Types::Requests .build/kBWSNkpY90/lib/OpenAIAsync/Types/Requests.pm 1;" p OpenAIAsync::Types::Requests .build/kBWSNkpY90/lib/OpenAIAsync/Types/Requests.pm 1;" p
OpenAIAsync::Types::Requests .build/latest/blib/lib/OpenAIAsync/Types/Requests.pm 1;" p
OpenAIAsync::Types::Requests .build/latest/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 .build/s8al1KxdoG/blib/lib/OpenAIAsync/Types/Requests.pm 1;" p OpenAIAsync::Types::Requests .build/s8al1KxdoG/blib/lib/OpenAIAsync/Types/Requests.pm 1;" p
OpenAIAsync::Types::Requests .build/s8al1KxdoG/lib/OpenAIAsync/Types/Requests.pm 1;" p OpenAIAsync::Types::Requests .build/s8al1KxdoG/lib/OpenAIAsync/Types/Requests.pm 1;" p
OpenAIAsync::Types::Requests lib/OpenAIAsync/Types/Requests.pm 1;" p OpenAIAsync::Types::Requests lib/OpenAIAsync/Types/Requests.pm 1;" p
@ -10168,10 +10116,6 @@ OpenAIAsync::Types::Requests::ChatCompletion::Messages::Union .build/bu5iQckAwH/
OpenAIAsync::Types::Requests::ChatCompletion::Messages::Union .build/bu5iQckAwH/lib/OpenAIAsync/Types/Requests.pm 192;" p OpenAIAsync::Types::Requests::ChatCompletion::Messages::Union .build/bu5iQckAwH/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/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/kBWSNkpY90/lib/OpenAIAsync/Types/Requests.pm 192;" p
OpenAIAsync::Types::Requests::ChatCompletion::Messages::Union .build/latest/blib/lib/OpenAIAsync/Types/Requests.pm 209;" p
OpenAIAsync::Types::Requests::ChatCompletion::Messages::Union .build/latest/lib/OpenAIAsync/Types/Requests.pm 209;" p
OpenAIAsync::Types::Requests::ChatCompletion::Messages::Union .build/previous/blib/lib/OpenAIAsync/Types/Requests.pm 209;" p
OpenAIAsync::Types::Requests::ChatCompletion::Messages::Union .build/previous/lib/OpenAIAsync/Types/Requests.pm 209;" p
OpenAIAsync::Types::Requests::ChatCompletion::Messages::Union .build/s8al1KxdoG/blib/lib/OpenAIAsync/Types/Requests.pm 192;" p OpenAIAsync::Types::Requests::ChatCompletion::Messages::Union .build/s8al1KxdoG/blib/lib/OpenAIAsync/Types/Requests.pm 192;" p
OpenAIAsync::Types::Requests::ChatCompletion::Messages::Union .build/s8al1KxdoG/lib/OpenAIAsync/Types/Requests.pm 192;" p OpenAIAsync::Types::Requests::ChatCompletion::Messages::Union .build/s8al1KxdoG/lib/OpenAIAsync/Types/Requests.pm 192;" p
OpenAIAsync::Types::Requests::ChatCompletion::Messages::Union lib/OpenAIAsync/Types/Requests.pm 209;" p OpenAIAsync::Types::Requests::ChatCompletion::Messages::Union lib/OpenAIAsync/Types/Requests.pm 209;" p
@ -10193,10 +10137,6 @@ OpenAIAsync::Types::Requests::ChatCompletion::Messages::User::ContentUnion .buil
OpenAIAsync::Types::Requests::ChatCompletion::Messages::User::ContentUnion .build/bu5iQckAwH/lib/OpenAIAsync/Types/Requests.pm 115;" p OpenAIAsync::Types::Requests::ChatCompletion::Messages::User::ContentUnion .build/bu5iQckAwH/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/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/kBWSNkpY90/lib/OpenAIAsync/Types/Requests.pm 115;" p
OpenAIAsync::Types::Requests::ChatCompletion::Messages::User::ContentUnion .build/latest/blib/lib/OpenAIAsync/Types/Requests.pm 127;" p
OpenAIAsync::Types::Requests::ChatCompletion::Messages::User::ContentUnion .build/latest/lib/OpenAIAsync/Types/Requests.pm 127;" p
OpenAIAsync::Types::Requests::ChatCompletion::Messages::User::ContentUnion .build/previous/blib/lib/OpenAIAsync/Types/Requests.pm 127;" p
OpenAIAsync::Types::Requests::ChatCompletion::Messages::User::ContentUnion .build/previous/lib/OpenAIAsync/Types/Requests.pm 127;" p
OpenAIAsync::Types::Requests::ChatCompletion::Messages::User::ContentUnion .build/s8al1KxdoG/blib/lib/OpenAIAsync/Types/Requests.pm 115;" p OpenAIAsync::Types::Requests::ChatCompletion::Messages::User::ContentUnion .build/s8al1KxdoG/blib/lib/OpenAIAsync/Types/Requests.pm 115;" p
OpenAIAsync::Types::Requests::ChatCompletion::Messages::User::ContentUnion .build/s8al1KxdoG/lib/OpenAIAsync/Types/Requests.pm 115;" p OpenAIAsync::Types::Requests::ChatCompletion::Messages::User::ContentUnion .build/s8al1KxdoG/lib/OpenAIAsync/Types/Requests.pm 115;" p
OpenAIAsync::Types::Requests::ChatCompletion::Messages::User::ContentUnion lib/OpenAIAsync/Types/Requests.pm 127;" p OpenAIAsync::Types::Requests::ChatCompletion::Messages::User::ContentUnion lib/OpenAIAsync/Types/Requests.pm 127;" p
@ -10218,10 +10158,6 @@ OpenAIAsync::Types::Results .build/bu5iQckAwH/blib/lib/OpenAIAsync/Types/Results
OpenAIAsync::Types::Results .build/bu5iQckAwH/lib/OpenAIAsync/Types/Results.pm 1;" p OpenAIAsync::Types::Results .build/bu5iQckAwH/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/blib/lib/OpenAIAsync/Types/Results.pm 1;" p
OpenAIAsync::Types::Results .build/kBWSNkpY90/lib/OpenAIAsync/Types/Results.pm 1;" p OpenAIAsync::Types::Results .build/kBWSNkpY90/lib/OpenAIAsync/Types/Results.pm 1;" p
OpenAIAsync::Types::Results .build/latest/blib/lib/OpenAIAsync/Types/Results.pm 1;" p
OpenAIAsync::Types::Results .build/latest/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 .build/s8al1KxdoG/blib/lib/OpenAIAsync/Types/Results.pm 1;" p OpenAIAsync::Types::Results .build/s8al1KxdoG/blib/lib/OpenAIAsync/Types/Results.pm 1;" p
OpenAIAsync::Types::Results .build/s8al1KxdoG/lib/OpenAIAsync/Types/Results.pm 1;" p OpenAIAsync::Types::Results .build/s8al1KxdoG/lib/OpenAIAsync/Types/Results.pm 1;" p
OpenAIAsync::Types::Results lib/OpenAIAsync/Types/Results.pm 1;" p OpenAIAsync::Types::Results lib/OpenAIAsync/Types/Results.pm 1;" p
@ -10243,10 +10179,6 @@ OpenAIAsync::Types::Shared .build/bu5iQckAwH/blib/lib/OpenAIAsync/Types/Shared.p
OpenAIAsync::Types::Shared .build/bu5iQckAwH/lib/OpenAIAsync/Types/Shared.pm 1;" p OpenAIAsync::Types::Shared .build/bu5iQckAwH/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/blib/lib/OpenAIAsync/Types/Shared.pm 1;" p
OpenAIAsync::Types::Shared .build/kBWSNkpY90/lib/OpenAIAsync/Types/Shared.pm 1;" p OpenAIAsync::Types::Shared .build/kBWSNkpY90/lib/OpenAIAsync/Types/Shared.pm 1;" p
OpenAIAsync::Types::Shared .build/latest/blib/lib/OpenAIAsync/Types/Shared.pm 1;" p
OpenAIAsync::Types::Shared .build/latest/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 .build/s8al1KxdoG/blib/lib/OpenAIAsync/Types/Shared.pm 1;" p OpenAIAsync::Types::Shared .build/s8al1KxdoG/blib/lib/OpenAIAsync/Types/Shared.pm 1;" p
OpenAIAsync::Types::Shared .build/s8al1KxdoG/lib/OpenAIAsync/Types/Shared.pm 1;" p OpenAIAsync::Types::Shared .build/s8al1KxdoG/lib/OpenAIAsync/Types/Shared.pm 1;" p
OpenAIAsync::Types::Shared lib/OpenAIAsync/Types/Shared.pm 1;" p OpenAIAsync::Types::Shared lib/OpenAIAsync/Types/Shared.pm 1;" p
@ -28326,14 +28258,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/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 118;" s
new .build/kBWSNkpY90/lib/OpenAIAsync/Types/Requests.pm 195;" s new .build/kBWSNkpY90/lib/OpenAIAsync/Types/Requests.pm 195;" s
new .build/latest/blib/lib/OpenAIAsync/Types/Requests.pm 130;" s
new .build/latest/blib/lib/OpenAIAsync/Types/Requests.pm 212;" s
new .build/latest/lib/OpenAIAsync/Types/Requests.pm 130;" s
new .build/latest/lib/OpenAIAsync/Types/Requests.pm 212;" s
new .build/previous/blib/lib/OpenAIAsync/Types/Requests.pm 130;" s
new .build/previous/blib/lib/OpenAIAsync/Types/Requests.pm 212;" s
new .build/previous/lib/OpenAIAsync/Types/Requests.pm 130;" s
new .build/previous/lib/OpenAIAsync/Types/Requests.pm 212;" s
new .build/s8al1KxdoG/blib/lib/OpenAIAsync/Types/Requests.pm 118;" s new .build/s8al1KxdoG/blib/lib/OpenAIAsync/Types/Requests.pm 118;" s
new .build/s8al1KxdoG/blib/lib/OpenAIAsync/Types/Requests.pm 195;" s new .build/s8al1KxdoG/blib/lib/OpenAIAsync/Types/Requests.pm 195;" s
new .build/s8al1KxdoG/lib/OpenAIAsync/Types/Requests.pm 118;" s new .build/s8al1KxdoG/lib/OpenAIAsync/Types/Requests.pm 118;" s
@ -29146,10 +29070,6 @@ ontent::new .build/bu5iQckAwH/blib/lib/OpenAIAsync/Types/Requests.pm 195;" s
ontent::new .build/bu5iQckAwH/lib/OpenAIAsync/Types/Requests.pm 195;" s ontent::new .build/bu5iQckAwH/lib/OpenAIAsync/Types/Requests.pm 195;" s
ontent::new .build/kBWSNkpY90/blib/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/kBWSNkpY90/lib/OpenAIAsync/Types/Requests.pm 195;" s
ontent::new .build/latest/blib/lib/OpenAIAsync/Types/Requests.pm 212;" s
ontent::new .build/latest/lib/OpenAIAsync/Types/Requests.pm 212;" s
ontent::new .build/previous/blib/lib/OpenAIAsync/Types/Requests.pm 212;" s
ontent::new .build/previous/lib/OpenAIAsync/Types/Requests.pm 212;" s
ontent::new .build/s8al1KxdoG/blib/lib/OpenAIAsync/Types/Requests.pm 195;" s ontent::new .build/s8al1KxdoG/blib/lib/OpenAIAsync/Types/Requests.pm 195;" s
ontent::new .build/s8al1KxdoG/lib/OpenAIAsync/Types/Requests.pm 195;" s ontent::new .build/s8al1KxdoG/lib/OpenAIAsync/Types/Requests.pm 195;" s
ontent::new lib/OpenAIAsync/Types/Requests.pm 212;" s ontent::new lib/OpenAIAsync/Types/Requests.pm 212;" s
@ -31808,10 +31728,6 @@ y::new .build/bu5iQckAwH/blib/lib/OpenAIAsync/Types/Requests.pm 118;" s
y::new .build/bu5iQckAwH/lib/OpenAIAsync/Types/Requests.pm 118;" s y::new .build/bu5iQckAwH/lib/OpenAIAsync/Types/Requests.pm 118;" s
y::new .build/kBWSNkpY90/blib/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/kBWSNkpY90/lib/OpenAIAsync/Types/Requests.pm 118;" s
y::new .build/latest/blib/lib/OpenAIAsync/Types/Requests.pm 130;" s
y::new .build/latest/lib/OpenAIAsync/Types/Requests.pm 130;" s
y::new .build/previous/blib/lib/OpenAIAsync/Types/Requests.pm 130;" s
y::new .build/previous/lib/OpenAIAsync/Types/Requests.pm 130;" s
y::new .build/s8al1KxdoG/blib/lib/OpenAIAsync/Types/Requests.pm 118;" s y::new .build/s8al1KxdoG/blib/lib/OpenAIAsync/Types/Requests.pm 118;" s
y::new .build/s8al1KxdoG/lib/OpenAIAsync/Types/Requests.pm 118;" s y::new .build/s8al1KxdoG/lib/OpenAIAsync/Types/Requests.pm 118;" s
y::new lib/OpenAIAsync/Types/Requests.pm 130;" s y::new lib/OpenAIAsync/Types/Requests.pm 130;" s

View file

@ -1,350 +0,0 @@
package OpenAIAsync::Client;
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 client for OpenAI style REST API for various AI systems (LLMs, Images, Video, etc.)
=pod
=head1 NAME
OpenAIAsync::Client - IO::Async based client for OpenAI compatible APIs
=head1 SYNOPSIS
use IO::Async::Loop;
use OpenAIAsync::Client;
my $loop = IO::Async::Loop->new();
my $client = OpenAIAsync::Client->new();
$loop->add($client);
my $output = await $client->chat({
model => "gpt-3.5-turbo",
messages => [
{
role => "system",
content => "You are a helpful assistant that tells fanciful stories"
},
{
role => "user",
content => "Tell me a story of two princesses, Judy and Emmy. Judy is 8 and Emmy is 2."
}
],
max_tokens => 1024,
})->get();
# $output is now an OpenAIAsync::Type::Results::ChatCompletion
=head1 THEORY OF OPERATION
This module implements the L<IO::Async::Notifier> interface, this means that you create a new client and then call C<< $loop->add($client) >>
this casues all L<Future>s that are created to be part of the L<IO::Async::Loop> of your program. This way when you call C<await> on any method
it will properly suspend the execution of your program and do something else concurrently (probably waiting on requests).
=head1 Methods
=head2 new()
Create a new OpenAIAsync::Client. You'll need to register the client with C<< $loop->add($client) >> after creation.
=head3 PARAMETERS
=over 4
=item * api_base (optional)
Base url of the service to connect to. Defaults to C<https://api.openai.com/v1>. This should be a value pointing to something that
implements the v1 OpenAI API, which for OobaBooga's text-generation-webui might be something like C<http://localhost:5000/v1>.
It will also be pulled from the environment variable C<OPENAI_API_BASE> in the same fashion that the OpenAI libraries in other languages will do.
=item * api_key (required)
Api key that will be passed to the service you call. This gets passed as a header C<Authorization: Api-Key ....> to the service in all of the REST
calls. This should be kept secret as it can be used to make all kinds of calls to paid services.
It will also be pulled from the environment variable C<OPENAI_API_KEY> in the same fashion that the OpenAI libraries in other languages will do.
=item * api_org_name (optional)
A name for the organization that's making the call. This can be used by OpenAI to help identify which part of your company is
making any specific request, and I believe to help itemize billing and other tasks.
=item * http_user_agent (optional)
Set the useragent that's used to contact the API service. Defaults to
C<< __PACKAGE__." Perl/$VERSION (Net::Async::HTTP/".$Net::Async::HTTP::VERSION." IO::Async/".$IO::Async::VERSION." Perl/$])" >>
The default is to make it easier to debug if we ever see weird issues with the requests being generated but it does reveal some information
about the code environment.
=item * http_max_in_flight (optional)
How many requests should we allow to happen at once. Increasing this will increase the allowed parallel requests, but that can also
allow you to make too many requests and cost more in API calls.
Defaults to 2
=item * http_max_connections_per_host (optional)
TODO, I'm thinking this one will get dropped. Effectively since we're only ever connecting to one server this ends up functioning the same as the above parameter.
Defaults to 2
=item * http_max_redirects (optional)
How many redirects to allow. The official OpenAI API never sends redirects (for now) but for self hosted or other custom setups this might happen and should be handled correctly
Defaults to 3
=item * http_timeout (optional)
How long to wait on any given request to start.
Defaults to 120 seconds.
=item * http_stall_timeout (optional)
How long to wait on any given request to decide if it's been stalled. If a request starts responding and then stops part way through, this is how we'll treat it as stalled and time it out
Defaults to 600s (10 minutes). This is unlikely to happen except for a malfunctioning inference service since once generation starts to return it'll almost certainly finish.
=item * http_other (optional)
A hash ref that gets passed as additional parameters to L<Net::Async::HTTP>'s constructor. All values will be overriden by the ones above, so if a parameter is supported use those first.
=back
=head2 completion (deprecated)
Create a request for completion, this takes a prompt and returns a response. See L<OpenAIAsync::Types::Request::Completion> for exact details.
This particular API has been deprecated by OpenAI in favor of doing everything through the chat completion api below. However it is still supported
by OpenAI and compatible servers as it's a very simple interface to use
=head2 chat
Create a request for the chat completion api. This takes a series of messages and returns a new chat response. See L<OpenAIAsync::Types::Request::ChatCompletion> for exact details.
This API takes a series of messages from different agent sources and then responds as the assistant agent. A typical interaction is to start with a C<"system"> agent message
to set the context for the assistant, followed by the C<"user"> agent type for the user's request. You'll then get the response from the assistant agent to give to the user.
To continue the chat, you'd then take the new message and insert it into the list of messages as part of the chat and make a new request with the user's response. I'll be creating
a new module that uses this API and helps manage the chat in an easier manner with a few helper functions.
=head2 embedding
Create a request for calculating the embedding of an input. This takes a bit of text and returns a gigantic list of numbers, see L<OpenAIAsync::Types::Request::Embedding> for exact details.
These values are a bit difficult to explain how they work, but essentially you get a mathematical object, a vector, that describes the contents of the input as
a point in an N-dimensional space (typically 768 or 1536 dimensions). The dimensions themselves really don't have any inherit mathematical meaning but are instead relative to one-another
from the training data of the embedding model.
You'll want to take the vector and store it in a database that supports vector operations, like PostgreSQL with the L<pgvector|https://github.com/pgvector/pgvector> extension.
=head2 image_generate
Unimplemented, but once present will be used to generate images with Dall-E (or for self hosted, stable diffusion).
=head2 text_to_speech
Unimplemented, but can be used to turn text to speech using whatever algorithms/models are supported.
=head2 speech_to_text
Unimplemented. The opposite of the above.
=head2 vision
Unimplemented, I've not investigated this one much yet but I believe it's to get a description of an image and it's contents.
=head2 Missing apis
At least some for getting the list of models and some other meta information, those will be added next after I get some more documentation written
=head1 See Also
L<IO::Async>, L<Future::AsyncAwait>, L<Net::Async::HTTP>
=head1 License
Artistic 2.0
=head1 Author
Ryan Voots, ... etc.
=cut
class OpenAIAsync::Client :repr(HASH) :isa(IO::Async::Notifier) :strict(params) {
use JSON::MaybeXS qw//;
use Net::Async::HTTP;
use Feature::Compat::Try;
use URI;
field $_json = JSON::MaybeXS->new(utf8 => 1, convert_blessed => 1);
field $http;
# TODO document these directly, other options gets mixed in BEFORE all of these
field $_http_max_in_flight :param(http_max_in_flight) = 2;
field $_http_max_redirects :param(http_max_redirects) = 3;
field $_http_max_connections_per_host :param(http_max_connections_per_host) = 2;
field $_http_timeout :param(http_timeout) = 120; # My personal server is kinda slow, use a generous default
field $_http_stall_timeout :param(http_stall_timeout) = 600; # generous for my slow personal server
field $_http_other :param(http_other_options) = {};
field $_http_user_agent :param(http_user_agent) = __PACKAGE__." Perl/$VERSION (Net::Async::HTTP/".$Net::Async::HTTP::VERSION." IO::Async/".$IO::Async::VERSION." Perl/$])";
field $api_base :param(api_base) = $ENV{OPENAI_API_BASE} // "https://api.openai.com/v1";
field $api_key :param(api_key) = $ENV{OPENAI_API_KEY};
field $api_org_name :param(api_org_name) = undef;
field $io_async_notifier_params :param = undef;
method configure(%params) {
# We require them to go this way, so that there is no conflicts
# TODO document this
my %io_async_params = ($params{io_async_notifier_params} // {})->%*;
IO::Async::Notifier::configure($self, %io_async_params);
}
method __make_http() {
die "Missing API Key for OpenAI" unless $api_key;
return Net::Async::HTTP->new(
$_http_other->%*,
user_agent => "SNN OpenAI Client 1.0",
+headers => {
"Authorization" => "Bearer $api_key",
"Content-Type" => "application/json",
$api_org_name ? (
'OpenAI-Organization' => $api_org_name,
) : ()
},
max_redirects => $_http_max_redirects,
max_connections_per_host => $_http_max_connections_per_host,
max_in_flight => $_http_max_in_flight,
timeout => $_http_timeout,
stall_timeout => $_http_stall_timeout,
)
}
ADJUST {
$http = $self->__make_http;
$api_base =~ s|/$||; # trim an accidental final / since we will be putting it on the endpoints
}
async method _make_request($endpoint, $data) {
my $json = $_json->encode($data);
my $url = URI->new($api_base . $endpoint );
my $result = await $http->do_request(
uri => $url,
method => "POST",
content => $json,
content_type => 'application/json',
);
if ($result->is_success) {
my $json = $result->decoded_content;
my $out_data = $_json->decode($json);
return $out_data;
} else {
die "Failure in talking to OpenAI service: ".$result->status_line.": ".$result->decoded_content;
}
}
method _add_to_loop($loop) {
$loop->add($http);
}
method _remove_from_loop($loop) {
$loop->remove($http);
$http = $self->__make_http; # overkill? want to make sure we have a clean one
}
# This is the legacy completion api
async method completion($input) {
if (ref($input) eq 'HASH') {
$input = OpenAIAsync::Types::Requests::Completion->new($input->%*);
} elsif (ref($input) eq 'OpenAIAsync::Types::Requests::Completion') {
# dummy, nothing to do
} else {
die "Unsupported input type [".ref($input)."]";
}
my $data = await $self->_make_request($input->_endpoint(), $input);
my $type_result = OpenAIAsync::Types::Results::Completion->new($data->%*);
return $type_result;
}
async method chat($input) {
if (ref($input) eq 'HASH') {
$input = OpenAIAsync::Types::Requests::ChatCompletion->new($input->%*);
} elsif (ref($input) eq 'OpenAIAsync::Types::Requests::ChatCompletion') {
# dummy, nothing to do
} else {
die "Unsupported input type [".ref($input)."]";
}
my $data = await $self->_make_request($input->_endpoint(), $input);
my $type_result = OpenAIAsync::Types::Results::ChatCompletion->new($data->%*);
return $type_result;
}
async method embedding($input) {
if (ref($input) eq 'HASH') {
$input = OpenAIAsync::Types::Requests::Embedding->new($input->%*);
} elsif (ref($input) eq 'OpenAIAsync::Types::Requests::Embedding') {
# dummy, nothing to do
} else {
die "Unsupported input type [".ref($input)."]";
}
my $data = await $self->_make_request($input->_endpoint(), $input);
my $type_result = OpenAIAsync::Types::Results::Embedding->new($data->%*);
return $type_result;
}
async method image_generate($input) {
...
}
async method text_to_speech($text) {
...
}
async method speech_to_text($sound_data) {
...
}
async method vision($image, $prompt) {
...
}
}

View file

@ -192,7 +192,8 @@ Ryan Voots, ... etc.
=cut =cut
class OpenAIAsync::Client :repr(HASH) :isa(IO::Async::Notifier) :strict(params) { class OpenAIAsync::Client :repr(HASH) :strict(params) {
inherit IO::Async::Notifier;
use JSON::MaybeXS qw//; use JSON::MaybeXS qw//;
use Net::Async::HTTP; use Net::Async::HTTP;
use Feature::Compat::Try; use Feature::Compat::Try;

View file

@ -128,7 +128,7 @@ terminator for TLS connections
}, },
... ...
] ]
=head2 async auth_check($key, $ctx, $http_req) =head2 async auth_check($key, $ctx, $http_req)
This method requres async keyword. This method requres async keyword.
@ -207,7 +207,9 @@ Ryan Voots, ... etc.
=cut =cut
class OpenAIAsync::Server :repr(HASH) :isa(IO::Async::Notifier) :strict(params) { class OpenAIAsync::Server :repr(HASH) :strict(params) {
inherit IO::Async::Notifier;
use JSON::MaybeXS qw//; use JSON::MaybeXS qw//;
use Net::Async::HTTP::Server; use Net::Async::HTTP::Server;
use Feature::Compat::Try; use Feature::Compat::Try;

View file

@ -7,7 +7,10 @@ use Object::PadX::Role::AutoJSON;
use Object::Pad::ClassAttr::Struct; use Object::Pad::ClassAttr::Struct;
# Base role for all the types to simplify things later # Base role for all the types to simplify things later
role OpenAIAsync::Types::Base :does(Object::PadX::Role::AutoJSON) :does(Object::PadX::Role::AutoMarshal) :Struct { role OpenAIAsync::Types::Base :Struct {
apply Object::PadX::Role::AutoJSON;
apply Object::PadX::Role::AutoMarshal;
use JSON::MaybeXS qw//; use JSON::MaybeXS qw//;
our $_json = JSON::MaybeXS->new(utf8 => 1, convert_blessed => 1); our $_json = JSON::MaybeXS->new(utf8 => 1, convert_blessed => 1);
@ -18,7 +21,10 @@ role OpenAIAsync::Types::Base :does(Object::PadX::Role::AutoJSON) :does(Object::
} }
# Keep the JSON role stuff here, I might use it to annotate encodings of some non-json fields? not sure # Keep the JSON role stuff here, I might use it to annotate encodings of some non-json fields? not sure
role OpenAIAsync::Types::BaseFormEncoding :does(Object::PadX::Role::AutoJSON) :does(Object::PadX::Role::AutoMarshal) :Struct { role OpenAIAsync::Types::BaseFormEncoding :Struct {
apply Object::PadX::Role::AutoJSON;
apply Object::PadX::Role::AutoMarshal;
use WWW::Form::UrlEncoded; use WWW::Form::UrlEncoded;
use Object::Pad::MOP::FieldAttr; use Object::Pad::MOP::FieldAttr;

View file

@ -7,7 +7,7 @@ use Object::PadX::Role::AutoMarshal;
use Object::PadX::Role::AutoJSON; use Object::PadX::Role::AutoJSON;
use Object::Pad::ClassAttr::Struct; use Object::Pad::ClassAttr::Struct;
class OpenAIAsync::Types::Results::ToolCall :does(OpenAIAsync::Types::Base) :Struct { class OpenAIAsync::Types::Results::ToolCall :Struct {
apply OpenAIAsync::Types::Base; apply OpenAIAsync::Types::Base;
field $id :JSONStr = undef; field $id :JSONStr = undef;
@ -15,14 +15,14 @@ class OpenAIAsync::Types::Results::ToolCall :does(OpenAIAsync::Types::Base) :Str
field $function :MarshalTo(OpenAIAsync::Types::Results::FunctionCall) = undef; field $function :MarshalTo(OpenAIAsync::Types::Results::FunctionCall) = undef;
} }
class OpenAIAsync::Types::Results::FunctionCall :does(OpenAIAsync::Types::Base) :Struct { class OpenAIAsync::Types::Results::FunctionCall :Struct {
apply OpenAIAsync::Types::Base; apply OpenAIAsync::Types::Base;
field $arguments :JSONStr = undef; # TODO decode the json from this directly? field $arguments :JSONStr = undef; # TODO decode the json from this directly?
field $name :JSONStr = undef; field $name :JSONStr = undef;
} }
class OpenAIAsync::Types::Results::ChatMessage :does(OpenAIAsync::Types::Base) :Struct { class OpenAIAsync::Types::Results::ChatMessage :Struct {
apply OpenAIAsync::Types::Base; apply OpenAIAsync::Types::Base;
field $content :JSONStr; field $content :JSONStr;
@ -31,7 +31,7 @@ class OpenAIAsync::Types::Results::ChatMessage :does(OpenAIAsync::Types::Base) :
field $function_call :MarshalTo(OpenAIAsync::Types::Results::FunctionCall) = undef; # Depcrecated, might still happen field $function_call :MarshalTo(OpenAIAsync::Types::Results::FunctionCall) = undef; # Depcrecated, might still happen
} }
class OpenAIAsync::Types::Results::ChatCompletionChoices :does(OpenAIAsync::Types::Base) :Struct { class OpenAIAsync::Types::Results::ChatCompletionChoices :Struct {
apply OpenAIAsync::Types::Base; apply OpenAIAsync::Types::Base;
field $finish_reason :JSONStr; field $finish_reason :JSONStr;
@ -39,7 +39,7 @@ class OpenAIAsync::Types::Results::ChatCompletionChoices :does(OpenAIAsync::Type
field $message :MarshalTo(OpenAIAsync::Types::Results::ChatMessage); field $message :MarshalTo(OpenAIAsync::Types::Results::ChatMessage);
} }
class OpenAIAsync::Types::Results::ChatCompletion :does(OpenAIAsync::Types::Base) :Struct { class OpenAIAsync::Types::Results::ChatCompletion :Struct {
apply OpenAIAsync::Types::Base; apply OpenAIAsync::Types::Base;
field $id :JSONStr; field $id :JSONStr;
@ -51,7 +51,7 @@ class OpenAIAsync::Types::Results::ChatCompletion :does(OpenAIAsync::Types::Base
field $object :JSONStr; field $object :JSONStr;
} }
class OpenAIAsync::Types::Results::ChunkDelta :does(OpenAIAsync::Types::Base) :Struct { class OpenAIAsync::Types::Results::ChunkDelta :Struct {
apply OpenAIAsync::Types::Base; apply OpenAIAsync::Types::Base;
field $content :JSONStr; field $content :JSONStr;
@ -60,7 +60,7 @@ class OpenAIAsync::Types::Results::ChunkDelta :does(OpenAIAsync::Types::Base) :S
field $role :JSONStr; field $role :JSONStr;
} }
class OpenAIAsync::Types::Results::ChatCompletionChunkChoices :does(OpenAIAsync::Types::Base) :Struct { class OpenAIAsync::Types::Results::ChatCompletionChunkChoices :Struct {
apply OpenAIAsync::Types::Base; apply OpenAIAsync::Types::Base;
field $delta :MarshalTo(OpenAIAsync::Types::Results::ChunkDelta); field $delta :MarshalTo(OpenAIAsync::Types::Results::ChunkDelta);
@ -69,7 +69,7 @@ class OpenAIAsync::Types::Results::ChatCompletionChunkChoices :does(OpenAIAsync:
} }
# This is part of the streaming API # This is part of the streaming API
class OpenAIAsync::Types::Results::ChatCompletionChunk :does(OpenAIAsync::Types::Base) :Struct { class OpenAIAsync::Types::Results::ChatCompletionChunk :Struct {
apply OpenAIAsync::Types::Base; apply OpenAIAsync::Types::Base;
field $id :JSONStr; field $id :JSONStr;
@ -80,7 +80,7 @@ class OpenAIAsync::Types::Results::ChatCompletionChunk :does(OpenAIAsync::Types:
field $object :JSONStr; field $object :JSONStr;
} }
class OpenAIAsync::Types::Results::Usage :does(OpenAIAsync::Types::Base) :Struct { class OpenAIAsync::Types::Results::Usage :Struct {
apply OpenAIAsync::Types::Base; apply OpenAIAsync::Types::Base;
field $total_tokens :JSONNum; field $total_tokens :JSONNum;
@ -88,7 +88,7 @@ class OpenAIAsync::Types::Results::Usage :does(OpenAIAsync::Types::Base) :Struct
field $completion_tokens :JSONNum = undef; # look at chat completions, is this the same field $completion_tokens :JSONNum = undef; # look at chat completions, is this the same
} }
class OpenAIAsync::Types::Results::LogProbs :does(OpenAIAsync::Types::Base) :Struct { class OpenAIAsync::Types::Results::LogProbs :Struct {
apply OpenAIAsync::Types::Base; apply OpenAIAsync::Types::Base;
# TODO what's the representation here? # TODO what's the representation here?
@ -98,7 +98,7 @@ class OpenAIAsync::Types::Results::LogProbs :does(OpenAIAsync::Types::Base) :Str
field $top_logprobs = undef; field $top_logprobs = undef;
} }
class OpenAIAsync::Types::Results::CompletionChoices :does(OpenAIAsync::Types::Base) :Struct { class OpenAIAsync::Types::Results::CompletionChoices :Struct {
apply OpenAIAsync::Types::Base; apply OpenAIAsync::Types::Base;
field $text :JSONStr; field $text :JSONStr;
@ -107,7 +107,7 @@ class OpenAIAsync::Types::Results::CompletionChoices :does(OpenAIAsync::Types::B
field $finish_reason :JSONStr = undef; # TODO enum? helper funcs for this class? ->is_finished? field $finish_reason :JSONStr = undef; # TODO enum? helper funcs for this class? ->is_finished?
} }
class OpenAIAsync::Types::Results::Completion :does(OpenAIAsync::Types::Base) :Struct { class OpenAIAsync::Types::Results::Completion :Struct {
apply OpenAIAsync::Types::Base; apply OpenAIAsync::Types::Base;
field $id :JSONStr; field $id :JSONStr;

View file

@ -9,7 +9,8 @@ use OpenAIAsync::Types;
# TODO this is shared request and result? # TODO this is shared request and result?
# TODO Add a method here that given a file name will create a new object with things filled out # TODO Add a method here that given a file name will create a new object with things filled out
class OpenAIAsync::Types::Shared::FileObject :does(OpenAIAsync::Types::Base) :Struct { class OpenAIAsync::Types::Shared::FileObject :Struct {
apply OpenAIAsync::Types::Base;
field $id :JSONStr = undef; # Only optional for uploads, but always comes back from the service. TODO make a check field $id :JSONStr = undef; # Only optional for uploads, but always comes back from the service. TODO make a check
field $bytes :JSONNum; field $bytes :JSONNum;
field $created_at :JSONNum; field $created_at :JSONNum;