diff --git a/.vstags b/.vstags index 8e2e3a4..7caed23 100644 --- a/.vstags +++ b/.vstags @@ -9865,10 +9865,6 @@ OpenAIAsync .build/bu5iQckAwH/blib/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/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/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/kBWSNkpY90/blib/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/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/kBWSNkpY90/blib/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/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/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/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::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 @@ -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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/kBWSNkpY90/blib/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/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/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/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/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/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/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/lib/OpenAIAsync/Types/Requests.pm 192;" 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/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/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/lib/OpenAIAsync/Types/Requests.pm 115;" 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/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/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/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/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/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/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/lib/OpenAIAsync/Types/Requests.pm 118;" 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 195;" 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/kBWSNkpY90/blib/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/lib/OpenAIAsync/Types/Requests.pm 195;" 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/kBWSNkpY90/blib/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/lib/OpenAIAsync/Types/Requests.pm 118;" s y::new lib/OpenAIAsync/Types/Requests.pm 130;" s diff --git a/Client.pod b/Client.pod deleted file mode 100644 index 50328d4..0000000 --- a/Client.pod +++ /dev/null @@ -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 interface, this means that you create a new client and then call C<< $loop->add($client) >> -this casues all Ls that are created to be part of the L of your program. This way when you call C 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. 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. - -It will also be pulled from the environment variable C 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 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 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'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 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 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 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 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, L, L - -=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) { - ... - } -} \ No newline at end of file diff --git a/lib/OpenAIAsync/Client.pm b/lib/OpenAIAsync/Client.pm index 2116bb0..67b6908 100644 --- a/lib/OpenAIAsync/Client.pm +++ b/lib/OpenAIAsync/Client.pm @@ -192,7 +192,8 @@ Ryan Voots, ... etc. =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 Net::Async::HTTP; use Feature::Compat::Try; diff --git a/lib/OpenAIAsync/Server.pm b/lib/OpenAIAsync/Server.pm index 3eda32d..0e7fdbf 100644 --- a/lib/OpenAIAsync/Server.pm +++ b/lib/OpenAIAsync/Server.pm @@ -128,7 +128,7 @@ terminator for TLS connections }, ... ] - + =head2 async auth_check($key, $ctx, $http_req) This method requres async keyword. @@ -207,7 +207,9 @@ Ryan Voots, ... etc. =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 Net::Async::HTTP::Server; use Feature::Compat::Try; diff --git a/lib/OpenAIAsync/Types.pm b/lib/OpenAIAsync/Types.pm index 165113c..2bc4027 100644 --- a/lib/OpenAIAsync/Types.pm +++ b/lib/OpenAIAsync/Types.pm @@ -7,7 +7,10 @@ use Object::PadX::Role::AutoJSON; use Object::Pad::ClassAttr::Struct; # 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//; 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 -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 Object::Pad::MOP::FieldAttr; diff --git a/lib/OpenAIAsync/Types/Results.pm b/lib/OpenAIAsync/Types/Results.pm index 55fce37..57bd24d 100644 --- a/lib/OpenAIAsync/Types/Results.pm +++ b/lib/OpenAIAsync/Types/Results.pm @@ -7,7 +7,7 @@ use Object::PadX::Role::AutoMarshal; use Object::PadX::Role::AutoJSON; 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; 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; } -class OpenAIAsync::Types::Results::FunctionCall :does(OpenAIAsync::Types::Base) :Struct { +class OpenAIAsync::Types::Results::FunctionCall :Struct { apply OpenAIAsync::Types::Base; field $arguments :JSONStr = undef; # TODO decode the json from this directly? field $name :JSONStr = undef; } -class OpenAIAsync::Types::Results::ChatMessage :does(OpenAIAsync::Types::Base) :Struct { +class OpenAIAsync::Types::Results::ChatMessage :Struct { apply OpenAIAsync::Types::Base; 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 } -class OpenAIAsync::Types::Results::ChatCompletionChoices :does(OpenAIAsync::Types::Base) :Struct { +class OpenAIAsync::Types::Results::ChatCompletionChoices :Struct { apply OpenAIAsync::Types::Base; field $finish_reason :JSONStr; @@ -39,7 +39,7 @@ class OpenAIAsync::Types::Results::ChatCompletionChoices :does(OpenAIAsync::Type 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; field $id :JSONStr; @@ -51,7 +51,7 @@ class OpenAIAsync::Types::Results::ChatCompletion :does(OpenAIAsync::Types::Base field $object :JSONStr; } -class OpenAIAsync::Types::Results::ChunkDelta :does(OpenAIAsync::Types::Base) :Struct { +class OpenAIAsync::Types::Results::ChunkDelta :Struct { apply OpenAIAsync::Types::Base; field $content :JSONStr; @@ -60,7 +60,7 @@ class OpenAIAsync::Types::Results::ChunkDelta :does(OpenAIAsync::Types::Base) :S field $role :JSONStr; } -class OpenAIAsync::Types::Results::ChatCompletionChunkChoices :does(OpenAIAsync::Types::Base) :Struct { +class OpenAIAsync::Types::Results::ChatCompletionChunkChoices :Struct { apply OpenAIAsync::Types::Base; 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 -class OpenAIAsync::Types::Results::ChatCompletionChunk :does(OpenAIAsync::Types::Base) :Struct { +class OpenAIAsync::Types::Results::ChatCompletionChunk :Struct { apply OpenAIAsync::Types::Base; field $id :JSONStr; @@ -80,7 +80,7 @@ class OpenAIAsync::Types::Results::ChatCompletionChunk :does(OpenAIAsync::Types: field $object :JSONStr; } -class OpenAIAsync::Types::Results::Usage :does(OpenAIAsync::Types::Base) :Struct { +class OpenAIAsync::Types::Results::Usage :Struct { apply OpenAIAsync::Types::Base; 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 } -class OpenAIAsync::Types::Results::LogProbs :does(OpenAIAsync::Types::Base) :Struct { +class OpenAIAsync::Types::Results::LogProbs :Struct { apply OpenAIAsync::Types::Base; # TODO what's the representation here? @@ -98,7 +98,7 @@ class OpenAIAsync::Types::Results::LogProbs :does(OpenAIAsync::Types::Base) :Str field $top_logprobs = undef; } -class OpenAIAsync::Types::Results::CompletionChoices :does(OpenAIAsync::Types::Base) :Struct { +class OpenAIAsync::Types::Results::CompletionChoices :Struct { apply OpenAIAsync::Types::Base; 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? } -class OpenAIAsync::Types::Results::Completion :does(OpenAIAsync::Types::Base) :Struct { +class OpenAIAsync::Types::Results::Completion :Struct { apply OpenAIAsync::Types::Base; field $id :JSONStr; diff --git a/lib/OpenAIAsync/Types/Shared.pm b/lib/OpenAIAsync/Types/Shared.pm index 1f70378..dc40c4d 100644 --- a/lib/OpenAIAsync/Types/Shared.pm +++ b/lib/OpenAIAsync/Types/Shared.pm @@ -9,7 +9,8 @@ use OpenAIAsync::Types; # 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 -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 $bytes :JSONNum; field $created_at :JSONNum;