From 2112424a80dda2fd707dee2cef888e322bc4fe6c Mon Sep 17 00:00:00 2001 From: Ryan Voots Date: Wed, 22 Nov 2023 17:40:06 -0500 Subject: [PATCH] brane fart here? --- .vstags | 100 +++++++++++++++++++++--------- lib/OpenAIAsync/Client.pm | 19 +++++- lib/OpenAIAsync/Types/Requests.pm | 48 +++++++++----- lib/OpenAIAsync/Types/Results.pm | 26 ++++---- t/02-create-client.t | 2 +- xt/01-completion-deprecated.t | 32 ++++++++++ xt/02-chat-completion.t | 49 +++++++++++++++ xt/02-create-client.t | 43 ------------- xtest.sh | 11 ++++ 9 files changed, 227 insertions(+), 103 deletions(-) create mode 100644 xt/01-completion-deprecated.t create mode 100644 xt/02-chat-completion.t delete mode 100644 xt/02-create-client.t create mode 100755 xtest.sh diff --git a/.vstags b/.vstags index 0d746d8..008dbdd 100644 --- a/.vstags +++ b/.vstags @@ -9849,8 +9849,12 @@ Object::PadX::Role::AutoMarshal::unimport local/lib/perl5/Object/PadX/Role/AutoM OlsonVersion local/lib/perl5/DateTime/TimeZone/Catalog.pm 1865;" s OpenAIAsync .build/0T4wbFlmwf/blib/lib/OpenAIAsync.pm 1;" p OpenAIAsync .build/0T4wbFlmwf/lib/OpenAIAsync.pm 1;" p +OpenAIAsync .build/2oNz8Mp68u/blib/lib/OpenAIAsync.pm 1;" p +OpenAIAsync .build/2oNz8Mp68u/lib/OpenAIAsync.pm 1;" p OpenAIAsync .build/AcmKa2ZbCJ/blib/lib/OpenAIAsync.pm 1;" p OpenAIAsync .build/AcmKa2ZbCJ/lib/OpenAIAsync.pm 1;" p +OpenAIAsync .build/JhaXDkLtkw/blib/lib/OpenAIAsync.pm 1;" p +OpenAIAsync .build/JhaXDkLtkw/lib/OpenAIAsync.pm 1;" p OpenAIAsync .build/UPVIKQUOaN/blib/lib/OpenAIAsync.pm 1;" p OpenAIAsync .build/UPVIKQUOaN/lib/OpenAIAsync.pm 1;" p OpenAIAsync .build/Xz72xzB4iA/blib/lib/OpenAIAsync.pm 1;" p @@ -9859,13 +9863,17 @@ OpenAIAsync .build/bgXXjrPaza/blib/lib/OpenAIAsync.pm 1;" p OpenAIAsync .build/bgXXjrPaza/lib/OpenAIAsync.pm 1;" p OpenAIAsync .build/mKmyAW37h1/blib/lib/OpenAIAsync.pm 1;" p OpenAIAsync .build/mKmyAW37h1/lib/OpenAIAsync.pm 1;" p -OpenAIAsync .build/previous/blib/lib/OpenAIAsync.pm 1;" p -OpenAIAsync .build/previous/lib/OpenAIAsync.pm 1;" p +OpenAIAsync .build/t7Cb8f47yj/blib/lib/OpenAIAsync.pm 1;" p +OpenAIAsync .build/t7Cb8f47yj/lib/OpenAIAsync.pm 1;" p OpenAIAsync .build/trQp7H7Uyl/blib/lib/OpenAIAsync.pm 1;" p OpenAIAsync .build/trQp7H7Uyl/lib/OpenAIAsync.pm 1;" p OpenAIAsync .build/wX6DkQhw6E/blib/lib/OpenAIAsync.pm 1;" p OpenAIAsync .build/wX6DkQhw6E/lib/OpenAIAsync.pm 1;" p OpenAIAsync lib/OpenAIAsync.pm 1;" p +OpenAIAsync::Client .build/2oNz8Mp68u/blib/lib/OpenAIAsync/Client.pm 1;" p +OpenAIAsync::Client .build/2oNz8Mp68u/lib/OpenAIAsync/Client.pm 1;" p +OpenAIAsync::Client .build/JhaXDkLtkw/blib/lib/OpenAIAsync/Client.pm 1;" p +OpenAIAsync::Client .build/JhaXDkLtkw/lib/OpenAIAsync/Client.pm 1;" p OpenAIAsync::Client .build/UPVIKQUOaN/blib/lib/OpenAIAsync/Client.pm 1;" p OpenAIAsync::Client .build/UPVIKQUOaN/lib/OpenAIAsync/Client.pm 1;" p OpenAIAsync::Client .build/Xz72xzB4iA/blib/lib/OpenAIAsync/Client.pm 1;" p @@ -9874,13 +9882,17 @@ OpenAIAsync::Client .build/bgXXjrPaza/blib/lib/OpenAIAsync/Client.pm 1;" p OpenAIAsync::Client .build/bgXXjrPaza/lib/OpenAIAsync/Client.pm 1;" p OpenAIAsync::Client .build/mKmyAW37h1/blib/lib/OpenAIAsync/Client.pm 1;" p OpenAIAsync::Client .build/mKmyAW37h1/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/t7Cb8f47yj/blib/lib/OpenAIAsync/Client.pm 1;" p +OpenAIAsync::Client .build/t7Cb8f47yj/lib/OpenAIAsync/Client.pm 1;" p OpenAIAsync::Client lib/OpenAIAsync/Client.pm 1;" p OpenAIAsync::Types .build/0T4wbFlmwf/blib/lib/OpenAIAsync/Types.pm 1;" p OpenAIAsync::Types .build/0T4wbFlmwf/lib/OpenAIAsync/Types.pm 1;" p +OpenAIAsync::Types .build/2oNz8Mp68u/blib/lib/OpenAIAsync/Types.pm 1;" p +OpenAIAsync::Types .build/2oNz8Mp68u/lib/OpenAIAsync/Types.pm 1;" p OpenAIAsync::Types .build/AcmKa2ZbCJ/blib/lib/OpenAIAsync/Types.pm 1;" p OpenAIAsync::Types .build/AcmKa2ZbCJ/lib/OpenAIAsync/Types.pm 1;" p +OpenAIAsync::Types .build/JhaXDkLtkw/blib/lib/OpenAIAsync/Types.pm 1;" p +OpenAIAsync::Types .build/JhaXDkLtkw/lib/OpenAIAsync/Types.pm 1;" p OpenAIAsync::Types .build/UPVIKQUOaN/blib/lib/OpenAIAsync/Types.pm 1;" p OpenAIAsync::Types .build/UPVIKQUOaN/lib/OpenAIAsync/Types.pm 1;" p OpenAIAsync::Types .build/Xz72xzB4iA/blib/lib/OpenAIAsync/Types.pm 1;" p @@ -9889,8 +9901,8 @@ OpenAIAsync::Types .build/bgXXjrPaza/blib/lib/OpenAIAsync/Types.pm 1;" p OpenAIAsync::Types .build/bgXXjrPaza/lib/OpenAIAsync/Types.pm 1;" p OpenAIAsync::Types .build/mKmyAW37h1/blib/lib/OpenAIAsync/Types.pm 1;" p OpenAIAsync::Types .build/mKmyAW37h1/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/t7Cb8f47yj/blib/lib/OpenAIAsync/Types.pm 1;" p +OpenAIAsync::Types .build/t7Cb8f47yj/lib/OpenAIAsync/Types.pm 1;" p OpenAIAsync::Types .build/trQp7H7Uyl/blib/lib/OpenAIAsync/Types.pm 1;" p OpenAIAsync::Types .build/trQp7H7Uyl/lib/OpenAIAsync/Types.pm 1;" p OpenAIAsync::Types .build/wX6DkQhw6E/blib/lib/OpenAIAsync/Types.pm 1;" p @@ -9898,10 +9910,14 @@ OpenAIAsync::Types .build/wX6DkQhw6E/lib/OpenAIAsync/Types.pm 1;" p OpenAIAsync::Types lib/OpenAIAsync/Types.pm 1;" p OpenAIAsync::Types::Requests .build/0T4wbFlmwf/blib/lib/OpenAIAsync/Types/Requests.pm 1;" p OpenAIAsync::Types::Requests .build/0T4wbFlmwf/lib/OpenAIAsync/Types/Requests.pm 1;" p +OpenAIAsync::Types::Requests .build/2oNz8Mp68u/blib/lib/OpenAIAsync/Types/Requests.pm 1;" p +OpenAIAsync::Types::Requests .build/2oNz8Mp68u/lib/OpenAIAsync/Types/Requests.pm 1;" p OpenAIAsync::Types::Requests .build/4DgDOdekNW/blib/lib/OpenAIAsync/Types/Requests.pm 1;" p OpenAIAsync::Types::Requests .build/4DgDOdekNW/lib/OpenAIAsync/Types/Requests.pm 1;" p OpenAIAsync::Types::Requests .build/AcmKa2ZbCJ/blib/lib/OpenAIAsync/Types/Requests.pm 1;" p OpenAIAsync::Types::Requests .build/AcmKa2ZbCJ/lib/OpenAIAsync/Types/Requests.pm 1;" p +OpenAIAsync::Types::Requests .build/JhaXDkLtkw/blib/lib/OpenAIAsync/Types/Requests.pm 1;" p +OpenAIAsync::Types::Requests .build/JhaXDkLtkw/lib/OpenAIAsync/Types/Requests.pm 1;" p OpenAIAsync::Types::Requests .build/UPVIKQUOaN/blib/lib/OpenAIAsync/Types/Requests.pm 1;" p OpenAIAsync::Types::Requests .build/UPVIKQUOaN/lib/OpenAIAsync/Types/Requests.pm 1;" p OpenAIAsync::Types::Requests .build/Xz72xzB4iA/blib/lib/OpenAIAsync/Types/Requests.pm 1;" p @@ -9916,8 +9932,8 @@ OpenAIAsync::Types::Requests .build/mKmyAW37h1/blib/lib/OpenAIAsync/Types/Reques OpenAIAsync::Types::Requests .build/mKmyAW37h1/lib/OpenAIAsync/Types/Requests.pm 1;" p OpenAIAsync::Types::Requests .build/nb3podVIwj/blib/lib/OpenAIAsync/Types/Requests.pm 1;" p OpenAIAsync::Types::Requests .build/nb3podVIwj/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/t7Cb8f47yj/blib/lib/OpenAIAsync/Types/Requests.pm 1;" p +OpenAIAsync::Types::Requests .build/t7Cb8f47yj/lib/OpenAIAsync/Types/Requests.pm 1;" p OpenAIAsync::Types::Requests .build/trQp7H7Uyl/blib/lib/OpenAIAsync/Types/Requests.pm 1;" p OpenAIAsync::Types::Requests .build/trQp7H7Uyl/lib/OpenAIAsync/Types/Requests.pm 1;" p OpenAIAsync::Types::Requests .build/wX6DkQhw6E/blib/lib/OpenAIAsync/Types/Requests.pm 1;" p @@ -9926,10 +9942,14 @@ OpenAIAsync::Types::Requests lib/OpenAIAsync/Types/Requests.pm 1;" p OpenAIAsync::Types::Requests:: .build/NfFNPyy4iR/lib/OpenAIAsync/Types/Requests.pm 1;" p OpenAIAsync::Types::Requests::ChatCompletion::Messages::Union .build/0T4wbFlmwf/blib/lib/OpenAIAsync/Types/Requests.pm 170;" p OpenAIAsync::Types::Requests::ChatCompletion::Messages::Union .build/0T4wbFlmwf/lib/OpenAIAsync/Types/Requests.pm 170;" p +OpenAIAsync::Types::Requests::ChatCompletion::Messages::Union .build/2oNz8Mp68u/blib/lib/OpenAIAsync/Types/Requests.pm 170;" p +OpenAIAsync::Types::Requests::ChatCompletion::Messages::Union .build/2oNz8Mp68u/lib/OpenAIAsync/Types/Requests.pm 170;" p OpenAIAsync::Types::Requests::ChatCompletion::Messages::Union .build/4DgDOdekNW/blib/lib/OpenAIAsync/Types/Requests.pm 169;" p OpenAIAsync::Types::Requests::ChatCompletion::Messages::Union .build/4DgDOdekNW/lib/OpenAIAsync/Types/Requests.pm 169;" p OpenAIAsync::Types::Requests::ChatCompletion::Messages::Union .build/AcmKa2ZbCJ/blib/lib/OpenAIAsync/Types/Requests.pm 170;" p OpenAIAsync::Types::Requests::ChatCompletion::Messages::Union .build/AcmKa2ZbCJ/lib/OpenAIAsync/Types/Requests.pm 170;" p +OpenAIAsync::Types::Requests::ChatCompletion::Messages::Union .build/JhaXDkLtkw/blib/lib/OpenAIAsync/Types/Requests.pm 170;" p +OpenAIAsync::Types::Requests::ChatCompletion::Messages::Union .build/JhaXDkLtkw/lib/OpenAIAsync/Types/Requests.pm 170;" p OpenAIAsync::Types::Requests::ChatCompletion::Messages::Union .build/NfFNPyy4iR/lib/OpenAIAsync/Types/Requests.pm 169;" p OpenAIAsync::Types::Requests::ChatCompletion::Messages::Union .build/UPVIKQUOaN/blib/lib/OpenAIAsync/Types/Requests.pm 170;" p OpenAIAsync::Types::Requests::ChatCompletion::Messages::Union .build/UPVIKQUOaN/lib/OpenAIAsync/Types/Requests.pm 170;" p @@ -9945,19 +9965,23 @@ OpenAIAsync::Types::Requests::ChatCompletion::Messages::Union .build/mKmyAW37h1/ OpenAIAsync::Types::Requests::ChatCompletion::Messages::Union .build/mKmyAW37h1/lib/OpenAIAsync/Types/Requests.pm 170;" p OpenAIAsync::Types::Requests::ChatCompletion::Messages::Union .build/nb3podVIwj/blib/lib/OpenAIAsync/Types/Requests.pm 170;" p OpenAIAsync::Types::Requests::ChatCompletion::Messages::Union .build/nb3podVIwj/lib/OpenAIAsync/Types/Requests.pm 170;" p -OpenAIAsync::Types::Requests::ChatCompletion::Messages::Union .build/previous/blib/lib/OpenAIAsync/Types/Requests.pm 170;" p -OpenAIAsync::Types::Requests::ChatCompletion::Messages::Union .build/previous/lib/OpenAIAsync/Types/Requests.pm 170;" p +OpenAIAsync::Types::Requests::ChatCompletion::Messages::Union .build/t7Cb8f47yj/blib/lib/OpenAIAsync/Types/Requests.pm 170;" p +OpenAIAsync::Types::Requests::ChatCompletion::Messages::Union .build/t7Cb8f47yj/lib/OpenAIAsync/Types/Requests.pm 170;" p OpenAIAsync::Types::Requests::ChatCompletion::Messages::Union .build/trQp7H7Uyl/blib/lib/OpenAIAsync/Types/Requests.pm 170;" p OpenAIAsync::Types::Requests::ChatCompletion::Messages::Union .build/trQp7H7Uyl/lib/OpenAIAsync/Types/Requests.pm 170;" p OpenAIAsync::Types::Requests::ChatCompletion::Messages::Union .build/wX6DkQhw6E/blib/lib/OpenAIAsync/Types/Requests.pm 170;" p OpenAIAsync::Types::Requests::ChatCompletion::Messages::Union .build/wX6DkQhw6E/lib/OpenAIAsync/Types/Requests.pm 170;" p -OpenAIAsync::Types::Requests::ChatCompletion::Messages::Union lib/OpenAIAsync/Types/Requests.pm 170;" p +OpenAIAsync::Types::Requests::ChatCompletion::Messages::Union lib/OpenAIAsync/Types/Requests.pm 186;" p OpenAIAsync::Types::Requests::ChatCompletion::Messages::User::ContentUnion .build/0T4wbFlmwf/blib/lib/OpenAIAsync/Types/Requests.pm 94;" p OpenAIAsync::Types::Requests::ChatCompletion::Messages::User::ContentUnion .build/0T4wbFlmwf/lib/OpenAIAsync/Types/Requests.pm 94;" p +OpenAIAsync::Types::Requests::ChatCompletion::Messages::User::ContentUnion .build/2oNz8Mp68u/blib/lib/OpenAIAsync/Types/Requests.pm 94;" p +OpenAIAsync::Types::Requests::ChatCompletion::Messages::User::ContentUnion .build/2oNz8Mp68u/lib/OpenAIAsync/Types/Requests.pm 94;" p OpenAIAsync::Types::Requests::ChatCompletion::Messages::User::ContentUnion .build/4DgDOdekNW/blib/lib/OpenAIAsync/Types/Requests.pm 93;" p OpenAIAsync::Types::Requests::ChatCompletion::Messages::User::ContentUnion .build/4DgDOdekNW/lib/OpenAIAsync/Types/Requests.pm 93;" p OpenAIAsync::Types::Requests::ChatCompletion::Messages::User::ContentUnion .build/AcmKa2ZbCJ/blib/lib/OpenAIAsync/Types/Requests.pm 94;" p OpenAIAsync::Types::Requests::ChatCompletion::Messages::User::ContentUnion .build/AcmKa2ZbCJ/lib/OpenAIAsync/Types/Requests.pm 94;" p +OpenAIAsync::Types::Requests::ChatCompletion::Messages::User::ContentUnion .build/JhaXDkLtkw/blib/lib/OpenAIAsync/Types/Requests.pm 94;" p +OpenAIAsync::Types::Requests::ChatCompletion::Messages::User::ContentUnion .build/JhaXDkLtkw/lib/OpenAIAsync/Types/Requests.pm 94;" p OpenAIAsync::Types::Requests::ChatCompletion::Messages::User::ContentUnion .build/NfFNPyy4iR/lib/OpenAIAsync/Types/Requests.pm 93;" p OpenAIAsync::Types::Requests::ChatCompletion::Messages::User::ContentUnion .build/UPVIKQUOaN/blib/lib/OpenAIAsync/Types/Requests.pm 94;" p OpenAIAsync::Types::Requests::ChatCompletion::Messages::User::ContentUnion .build/UPVIKQUOaN/lib/OpenAIAsync/Types/Requests.pm 94;" p @@ -9973,19 +9997,23 @@ OpenAIAsync::Types::Requests::ChatCompletion::Messages::User::ContentUnion .buil OpenAIAsync::Types::Requests::ChatCompletion::Messages::User::ContentUnion .build/mKmyAW37h1/lib/OpenAIAsync/Types/Requests.pm 94;" p OpenAIAsync::Types::Requests::ChatCompletion::Messages::User::ContentUnion .build/nb3podVIwj/blib/lib/OpenAIAsync/Types/Requests.pm 94;" p OpenAIAsync::Types::Requests::ChatCompletion::Messages::User::ContentUnion .build/nb3podVIwj/lib/OpenAIAsync/Types/Requests.pm 94;" p -OpenAIAsync::Types::Requests::ChatCompletion::Messages::User::ContentUnion .build/previous/blib/lib/OpenAIAsync/Types/Requests.pm 94;" p -OpenAIAsync::Types::Requests::ChatCompletion::Messages::User::ContentUnion .build/previous/lib/OpenAIAsync/Types/Requests.pm 94;" p +OpenAIAsync::Types::Requests::ChatCompletion::Messages::User::ContentUnion .build/t7Cb8f47yj/blib/lib/OpenAIAsync/Types/Requests.pm 94;" p +OpenAIAsync::Types::Requests::ChatCompletion::Messages::User::ContentUnion .build/t7Cb8f47yj/lib/OpenAIAsync/Types/Requests.pm 94;" p OpenAIAsync::Types::Requests::ChatCompletion::Messages::User::ContentUnion .build/trQp7H7Uyl/blib/lib/OpenAIAsync/Types/Requests.pm 94;" p OpenAIAsync::Types::Requests::ChatCompletion::Messages::User::ContentUnion .build/trQp7H7Uyl/lib/OpenAIAsync/Types/Requests.pm 94;" p OpenAIAsync::Types::Requests::ChatCompletion::Messages::User::ContentUnion .build/wX6DkQhw6E/blib/lib/OpenAIAsync/Types/Requests.pm 94;" p OpenAIAsync::Types::Requests::ChatCompletion::Messages::User::ContentUnion .build/wX6DkQhw6E/lib/OpenAIAsync/Types/Requests.pm 94;" p -OpenAIAsync::Types::Requests::ChatCompletion::Messages::User::ContentUnion lib/OpenAIAsync/Types/Requests.pm 94;" p +OpenAIAsync::Types::Requests::ChatCompletion::Messages::User::ContentUnion lib/OpenAIAsync/Types/Requests.pm 110;" p OpenAIAsync::Types::Results .build/0T4wbFlmwf/blib/lib/OpenAIAsync/Types/Results.pm 1;" p OpenAIAsync::Types::Results .build/0T4wbFlmwf/lib/OpenAIAsync/Types/Results.pm 1;" p +OpenAIAsync::Types::Results .build/2oNz8Mp68u/blib/lib/OpenAIAsync/Types/Results.pm 1;" p +OpenAIAsync::Types::Results .build/2oNz8Mp68u/lib/OpenAIAsync/Types/Results.pm 1;" p OpenAIAsync::Types::Results .build/4DgDOdekNW/blib/lib/OpenAIAsync/Types/Results.pm 1;" p OpenAIAsync::Types::Results .build/4DgDOdekNW/lib/OpenAIAsync/Types/Results.pm 1;" p OpenAIAsync::Types::Results .build/AcmKa2ZbCJ/blib/lib/OpenAIAsync/Types/Results.pm 1;" p OpenAIAsync::Types::Results .build/AcmKa2ZbCJ/lib/OpenAIAsync/Types/Results.pm 1;" p +OpenAIAsync::Types::Results .build/JhaXDkLtkw/blib/lib/OpenAIAsync/Types/Results.pm 1;" p +OpenAIAsync::Types::Results .build/JhaXDkLtkw/lib/OpenAIAsync/Types/Results.pm 1;" p OpenAIAsync::Types::Results .build/NfFNPyy4iR/lib/OpenAIAsync/Types/Results.pm 1;" p OpenAIAsync::Types::Results .build/UPVIKQUOaN/blib/lib/OpenAIAsync/Types/Results.pm 1;" p OpenAIAsync::Types::Results .build/UPVIKQUOaN/lib/OpenAIAsync/Types/Results.pm 1;" p @@ -10001,8 +10029,8 @@ OpenAIAsync::Types::Results .build/mKmyAW37h1/blib/lib/OpenAIAsync/Types/Results OpenAIAsync::Types::Results .build/mKmyAW37h1/lib/OpenAIAsync/Types/Results.pm 1;" p OpenAIAsync::Types::Results .build/nb3podVIwj/blib/lib/OpenAIAsync/Types/Results.pm 1;" p OpenAIAsync::Types::Results .build/nb3podVIwj/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/t7Cb8f47yj/blib/lib/OpenAIAsync/Types/Results.pm 1;" p +OpenAIAsync::Types::Results .build/t7Cb8f47yj/lib/OpenAIAsync/Types/Results.pm 1;" p OpenAIAsync::Types::Results .build/trQp7H7Uyl/blib/lib/OpenAIAsync/Types/Results.pm 1;" p OpenAIAsync::Types::Results .build/trQp7H7Uyl/lib/OpenAIAsync/Types/Results.pm 1;" p OpenAIAsync::Types::Results .build/wX6DkQhw6E/blib/lib/OpenAIAsync/Types/Results.pm 1;" p @@ -28052,6 +28080,10 @@ new .build/0T4wbFlmwf/blib/lib/OpenAIAsync/Types/Requests.pm 173;" s new .build/0T4wbFlmwf/blib/lib/OpenAIAsync/Types/Requests.pm 97;" s new .build/0T4wbFlmwf/lib/OpenAIAsync/Types/Requests.pm 173;" s new .build/0T4wbFlmwf/lib/OpenAIAsync/Types/Requests.pm 97;" s +new .build/2oNz8Mp68u/blib/lib/OpenAIAsync/Types/Requests.pm 173;" s +new .build/2oNz8Mp68u/blib/lib/OpenAIAsync/Types/Requests.pm 97;" s +new .build/2oNz8Mp68u/lib/OpenAIAsync/Types/Requests.pm 173;" s +new .build/2oNz8Mp68u/lib/OpenAIAsync/Types/Requests.pm 97;" s new .build/4DgDOdekNW/blib/lib/OpenAIAsync/Types/Requests.pm 172;" s new .build/4DgDOdekNW/blib/lib/OpenAIAsync/Types/Requests.pm 96;" s new .build/4DgDOdekNW/lib/OpenAIAsync/Types/Requests.pm 172;" s @@ -28060,6 +28092,10 @@ new .build/AcmKa2ZbCJ/blib/lib/OpenAIAsync/Types/Requests.pm 173;" s new .build/AcmKa2ZbCJ/blib/lib/OpenAIAsync/Types/Requests.pm 97;" s new .build/AcmKa2ZbCJ/lib/OpenAIAsync/Types/Requests.pm 173;" s new .build/AcmKa2ZbCJ/lib/OpenAIAsync/Types/Requests.pm 97;" s +new .build/JhaXDkLtkw/blib/lib/OpenAIAsync/Types/Requests.pm 173;" s +new .build/JhaXDkLtkw/blib/lib/OpenAIAsync/Types/Requests.pm 97;" s +new .build/JhaXDkLtkw/lib/OpenAIAsync/Types/Requests.pm 173;" s +new .build/JhaXDkLtkw/lib/OpenAIAsync/Types/Requests.pm 97;" s new .build/NfFNPyy4iR/lib/OpenAIAsync/Types/Requests.pm 172;" s new .build/NfFNPyy4iR/lib/OpenAIAsync/Types/Requests.pm 96;" s new .build/UPVIKQUOaN/blib/lib/OpenAIAsync/Types/Requests.pm 173;" s @@ -28090,10 +28126,10 @@ new .build/nb3podVIwj/blib/lib/OpenAIAsync/Types/Requests.pm 173;" s new .build/nb3podVIwj/blib/lib/OpenAIAsync/Types/Requests.pm 97;" s new .build/nb3podVIwj/lib/OpenAIAsync/Types/Requests.pm 173;" s new .build/nb3podVIwj/lib/OpenAIAsync/Types/Requests.pm 97;" s -new .build/previous/blib/lib/OpenAIAsync/Types/Requests.pm 173;" s -new .build/previous/blib/lib/OpenAIAsync/Types/Requests.pm 97;" s -new .build/previous/lib/OpenAIAsync/Types/Requests.pm 173;" s -new .build/previous/lib/OpenAIAsync/Types/Requests.pm 97;" s +new .build/t7Cb8f47yj/blib/lib/OpenAIAsync/Types/Requests.pm 173;" s +new .build/t7Cb8f47yj/blib/lib/OpenAIAsync/Types/Requests.pm 97;" s +new .build/t7Cb8f47yj/lib/OpenAIAsync/Types/Requests.pm 173;" s +new .build/t7Cb8f47yj/lib/OpenAIAsync/Types/Requests.pm 97;" s new .build/trQp7H7Uyl/blib/lib/OpenAIAsync/Types/Requests.pm 173;" s new .build/trQp7H7Uyl/blib/lib/OpenAIAsync/Types/Requests.pm 97;" s new .build/trQp7H7Uyl/lib/OpenAIAsync/Types/Requests.pm 173;" s @@ -28102,8 +28138,8 @@ new .build/wX6DkQhw6E/blib/lib/OpenAIAsync/Types/Requests.pm 173;" s new .build/wX6DkQhw6E/blib/lib/OpenAIAsync/Types/Requests.pm 97;" s new .build/wX6DkQhw6E/lib/OpenAIAsync/Types/Requests.pm 173;" s new .build/wX6DkQhw6E/lib/OpenAIAsync/Types/Requests.pm 97;" s -new lib/OpenAIAsync/Types/Requests.pm 173;" s -new lib/OpenAIAsync/Types/Requests.pm 97;" s +new lib/OpenAIAsync/Types/Requests.pm 113;" s +new lib/OpenAIAsync/Types/Requests.pm 189;" s new local/bin/lwp-request 231;" s new local/lib/perl5/Algorithm/Diff.pm 580;" s new local/lib/perl5/App/Cmd.pm 163;" s @@ -28894,10 +28930,14 @@ onlyres local/lib/perl5/List/SomeUtils/PP.pm 160;" s onlyval local/lib/perl5/List/SomeUtils/PP.pm 148;" s ontent::new .build/0T4wbFlmwf/blib/lib/OpenAIAsync/Types/Requests.pm 173;" s ontent::new .build/0T4wbFlmwf/lib/OpenAIAsync/Types/Requests.pm 173;" s +ontent::new .build/2oNz8Mp68u/blib/lib/OpenAIAsync/Types/Requests.pm 173;" s +ontent::new .build/2oNz8Mp68u/lib/OpenAIAsync/Types/Requests.pm 173;" s ontent::new .build/4DgDOdekNW/blib/lib/OpenAIAsync/Types/Requests.pm 172;" s ontent::new .build/4DgDOdekNW/lib/OpenAIAsync/Types/Requests.pm 172;" s ontent::new .build/AcmKa2ZbCJ/blib/lib/OpenAIAsync/Types/Requests.pm 173;" s ontent::new .build/AcmKa2ZbCJ/lib/OpenAIAsync/Types/Requests.pm 173;" s +ontent::new .build/JhaXDkLtkw/blib/lib/OpenAIAsync/Types/Requests.pm 173;" s +ontent::new .build/JhaXDkLtkw/lib/OpenAIAsync/Types/Requests.pm 173;" s ontent::new .build/NfFNPyy4iR/lib/OpenAIAsync/Types/Requests.pm 172;" s ontent::new .build/UPVIKQUOaN/blib/lib/OpenAIAsync/Types/Requests.pm 173;" s ontent::new .build/UPVIKQUOaN/lib/OpenAIAsync/Types/Requests.pm 173;" s @@ -28913,13 +28953,13 @@ ontent::new .build/mKmyAW37h1/blib/lib/OpenAIAsync/Types/Requests.pm 173;" s ontent::new .build/mKmyAW37h1/lib/OpenAIAsync/Types/Requests.pm 173;" s ontent::new .build/nb3podVIwj/blib/lib/OpenAIAsync/Types/Requests.pm 173;" s ontent::new .build/nb3podVIwj/lib/OpenAIAsync/Types/Requests.pm 173;" s -ontent::new .build/previous/blib/lib/OpenAIAsync/Types/Requests.pm 173;" s -ontent::new .build/previous/lib/OpenAIAsync/Types/Requests.pm 173;" s +ontent::new .build/t7Cb8f47yj/blib/lib/OpenAIAsync/Types/Requests.pm 173;" s +ontent::new .build/t7Cb8f47yj/lib/OpenAIAsync/Types/Requests.pm 173;" s ontent::new .build/trQp7H7Uyl/blib/lib/OpenAIAsync/Types/Requests.pm 173;" s ontent::new .build/trQp7H7Uyl/lib/OpenAIAsync/Types/Requests.pm 173;" s ontent::new .build/wX6DkQhw6E/blib/lib/OpenAIAsync/Types/Requests.pm 173;" s ontent::new .build/wX6DkQhw6E/lib/OpenAIAsync/Types/Requests.pm 173;" s -ontent::new lib/OpenAIAsync/Types/Requests.pm 173;" s +ontent::new lib/OpenAIAsync/Types/Requests.pm 189;" s oo local/lib/perl5/oo.pm 1;" p oo::import local/lib/perl5/oo.pm 22;" s oo::moo local/lib/perl5/oo.pm 7;" s @@ -31559,10 +31599,14 @@ xlp_collapsed_lengths_initialize local/lib/perl5/Perl/Tidy/Formatter.pm 13897;" xlp_tweak local/lib/perl5/Perl/Tidy/Formatter.pm 29023;" s y::new .build/0T4wbFlmwf/blib/lib/OpenAIAsync/Types/Requests.pm 97;" s y::new .build/0T4wbFlmwf/lib/OpenAIAsync/Types/Requests.pm 97;" s +y::new .build/2oNz8Mp68u/blib/lib/OpenAIAsync/Types/Requests.pm 97;" s +y::new .build/2oNz8Mp68u/lib/OpenAIAsync/Types/Requests.pm 97;" s y::new .build/4DgDOdekNW/blib/lib/OpenAIAsync/Types/Requests.pm 96;" s y::new .build/4DgDOdekNW/lib/OpenAIAsync/Types/Requests.pm 96;" s y::new .build/AcmKa2ZbCJ/blib/lib/OpenAIAsync/Types/Requests.pm 97;" s y::new .build/AcmKa2ZbCJ/lib/OpenAIAsync/Types/Requests.pm 97;" s +y::new .build/JhaXDkLtkw/blib/lib/OpenAIAsync/Types/Requests.pm 97;" s +y::new .build/JhaXDkLtkw/lib/OpenAIAsync/Types/Requests.pm 97;" s y::new .build/NfFNPyy4iR/lib/OpenAIAsync/Types/Requests.pm 96;" s y::new .build/UPVIKQUOaN/blib/lib/OpenAIAsync/Types/Requests.pm 97;" s y::new .build/UPVIKQUOaN/lib/OpenAIAsync/Types/Requests.pm 97;" s @@ -31578,13 +31622,13 @@ y::new .build/mKmyAW37h1/blib/lib/OpenAIAsync/Types/Requests.pm 97;" s y::new .build/mKmyAW37h1/lib/OpenAIAsync/Types/Requests.pm 97;" s y::new .build/nb3podVIwj/blib/lib/OpenAIAsync/Types/Requests.pm 97;" s y::new .build/nb3podVIwj/lib/OpenAIAsync/Types/Requests.pm 97;" s -y::new .build/previous/blib/lib/OpenAIAsync/Types/Requests.pm 97;" s -y::new .build/previous/lib/OpenAIAsync/Types/Requests.pm 97;" s +y::new .build/t7Cb8f47yj/blib/lib/OpenAIAsync/Types/Requests.pm 97;" s +y::new .build/t7Cb8f47yj/lib/OpenAIAsync/Types/Requests.pm 97;" s y::new .build/trQp7H7Uyl/blib/lib/OpenAIAsync/Types/Requests.pm 97;" s y::new .build/trQp7H7Uyl/lib/OpenAIAsync/Types/Requests.pm 97;" s y::new .build/wX6DkQhw6E/blib/lib/OpenAIAsync/Types/Requests.pm 97;" s y::new .build/wX6DkQhw6E/lib/OpenAIAsync/Types/Requests.pm 97;" s -y::new lib/OpenAIAsync/Types/Requests.pm 97;" s +y::new lib/OpenAIAsync/Types/Requests.pm 113;" s y_n local/lib/perl5/Module/Build/Base.pm 602;" s year local/lib/perl5/Software/License.pm 57;" s year local/lib/perl5/x86_64-linux/DateTime.pm 767;" s diff --git a/lib/OpenAIAsync/Client.pm b/lib/OpenAIAsync/Client.pm index c28fb40..180caeb 100644 --- a/lib/OpenAIAsync/Client.pm +++ b/lib/OpenAIAsync/Client.pm @@ -126,8 +126,23 @@ class OpenAIAsync::Client :repr(HASH) :isa(IO::Async::Notifier) :strict(params) return $type_result; } - async method chat($prompt) { - ... + 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)."]"; + } + + print "Making request\n"; + + my $data = await $self->_make_request("/completions", $input); + + my $type_result = OpenAIAsync::Types::Results::ChatCompletion->new($data->%*); + + return $type_result; + } async method embedding($input) { diff --git a/lib/OpenAIAsync/Types/Requests.pm b/lib/OpenAIAsync/Types/Requests.pm index a6c2734..f523823 100644 --- a/lib/OpenAIAsync/Types/Requests.pm +++ b/lib/OpenAIAsync/Types/Requests.pm @@ -13,15 +13,31 @@ role OpenAIAsync::Types::Requests::Base :does(OpenAIAsync::Types::Base) :Struct #### Base Request Types -class OpenAIAsync::Types::Requests::ChatCompletion :does(OpenAIAsync::Types::Requests::Base) { - method _endpoint() {...} +class OpenAIAsync::Types::Requests::ChatCompletion :does(OpenAIAsync::Types::Requests::Base) :Struct { + method _endpoint() {"/chat/completion"} field $messages :MarshalTo([OpenAIAsync::Types::Requests::ChatCompletion::Messages::Union]); + field $model :JSONStr = "gpt-3.5-turbo"; + field $frequency_penalty :JSONNum = undefs; + field $presence_penalty :JSONNum = undef; + field $logit_bias = undef; # TODO wtf is this? + field $max_tokens :JSONNum = undef; + field $response_format :JSONStr :JSONExclude = undef; # I'm not supporting this this version yet + + field $seed :JSONNum = undef; + field $stop = undef; # String, array or null, todo handle + field $stream :JSONBool = undef; # TODO handle + field $temperature :JSONNum = undef; + field $top_p :JSONNum = undef; + field $tools :JSONExclude = undef; # TODO handle this + field $tool_choice :JSONExclude = undef; # TODO handle this + + field $function_call :JSONExclude = undef; + field $functions :JSONExclude = undef;s } -class OpenAIAsync::Types::Requests::Completion :does(OpenAIAsync::Types::Requests::Base) { - method _endpoint() {...} - use JSON::MaybeXS; # TODO make a role that does this better? - +class OpenAIAsync::Types::Requests::Completion :does(OpenAIAsync::Types::Requests::Base) :Struct { + method _endpoint() {"/completion"} + field $model :JSONStr = "gpt-3.5-turbo"; # This is how 99% of everyone else seems to default this field $prompt :JSONStr; @@ -51,7 +67,7 @@ class OpenAIAsync::Types::Requests::Completion :does(OpenAIAsync::Types::Request } } -class OpenAIAsync::Types::Requests::Embedding :does(OpenAIAsync::Types::Requests::Base) { +class OpenAIAsync::Types::Requests::Embedding :does(OpenAIAsync::Types::Requests::Base) :Struct { method _endpoint() {...} field $input :JSONStr; field $model :JSONStr; @@ -61,7 +77,7 @@ class OpenAIAsync::Types::Requests::Embedding :does(OpenAIAsync::Types::Requests ### Request Subtypes -class OpenAIAsync::Types::Requests::ChatCompletion::Messages::Assistant::ToolCall :does(OpenAIAsync::Types::Base) { +class OpenAIAsync::Types::Requests::ChatCompletion::Messages::Assistant::ToolCall :does(OpenAIAsync::Types::Base) :Struct { field $id :JSONStr; field $arguments :JSONStr; field $type :JSONStr; @@ -73,17 +89,17 @@ class OpenAIAsync::Types::Requests::ChatCompletion::Messages::Assistant::Functio field $name :JSONStr; } -class OpenAIAsync::Types::Requests::ChatCompletion::Messages::User::Text :does(OpenAIAsync::Types::Base) { +class OpenAIAsync::Types::Requests::ChatCompletion::Messages::User::Text :does(OpenAIAsync::Types::Base) :Struct { field $type :JSONStr; field $text :JSONStr; } -class OpenAIAsync::Types::Requests::ChatCompletion::Messages::User::ImageUrl :does(OpenAIAsync::Types::Base) { +class OpenAIAsync::Types::Requests::ChatCompletion::Messages::User::ImageUrl :does(OpenAIAsync::Types::Base) :Struct { field $url :JSONStr; field $detail :JSONStr = undef; } -class OpenAIAsync::Types::Requests::ChatCompletion::Messages::User::Image :does(OpenAIAsync::Types::Base) { +class OpenAIAsync::Types::Requests::ChatCompletion::Messages::User::Image :does(OpenAIAsync::Types::Base) :Struct { field $type :JSONStr; field $image_url :MarshalTo(OpenAIAsync::Types::Requests::ChatCompletion::Messages::User::ImageUrl); } @@ -110,7 +126,7 @@ package } }; -class OpenAIAsync::Types::Requests::ChatCompletion::Messages::User :does(OpenAIAsync::Types::Base) { +class OpenAIAsync::Types::Requests::ChatCompletion::Messages::User :does(OpenAIAsync::Types::Base) :Struct { # This particular type is more complicated than AutoMarshal can handle, so we need to # do this in a custom manner. field $role; @@ -139,7 +155,7 @@ class OpenAIAsync::Types::Requests::ChatCompletion::Messages::User :does(OpenAIA } } -class OpenAIAsync::Types::Requests::ChatCompletion::Messages::Assistant :does(OpenAIAsync::Types::Base) { +class OpenAIAsync::Types::Requests::ChatCompletion::Messages::Assistant :does(OpenAIAsync::Types::Base) :Struct { field $role :JSONStr; field $content :JSONStr; field $name = undef; @@ -147,19 +163,19 @@ class OpenAIAsync::Types::Requests::ChatCompletion::Messages::Assistant :does(Op field $function_call :MarshalTo(OpenAIAsync::Types::Requests::ChatCompletion::Messages::Assistant::FunctionCall) = undef; } -class OpenAIAsync::Types::Requests::ChatCompletion::Messages::Function :does(OpenAIAsync::Types::Base) { +class OpenAIAsync::Types::Requests::ChatCompletion::Messages::Function :does(OpenAIAsync::Types::Base) :Struct { field $role :JSONStr; field $content :JSONStr; field $name :JSONStr; } -class OpenAIAsync::Types::Requests::ChatCompletion::Messages::Tool :does(OpenAIAsync::Types::Base) { +class OpenAIAsync::Types::Requests::ChatCompletion::Messages::Tool :does(OpenAIAsync::Types::Base) :Struct { field $role :JSONStr; field $content :JSONStr; field $tool_call_id :JSONStr; } -class OpenAIAsync::Types::Requests::ChatCompletion::Messages::System :does(OpenAIAsync::Types::Base) { +class OpenAIAsync::Types::Requests::ChatCompletion::Messages::System :does(OpenAIAsync::Types::Base) :Struct { field $role :JSONStr; field $name :JSONStr = undef; field $content :JSONStr; diff --git a/lib/OpenAIAsync/Types/Results.pm b/lib/OpenAIAsync/Types/Results.pm index 0db05ca..075feb3 100644 --- a/lib/OpenAIAsync/Types/Results.pm +++ b/lib/OpenAIAsync/Types/Results.pm @@ -7,31 +7,31 @@ use Object::PadX::Role::AutoMarshal; use Object::PadX::Role::AutoJSON; use Object::Pad::ClassAttr::Struct; -class OpenAIAsync::Types::Results::ToolCall :does(OpenAIAsync::Types::Base) { +class OpenAIAsync::Types::Results::ToolCall :does(OpenAIAsync::Types::Base) :Struct { field $id :JSONStr; field $type :JSONStr; # always "function" right now, may get expanded in the future field $function :MarshalTo(OpenAIAsync::Types::Results::FunctionCall); } -class OpenAIAsync::Types::Results::FunctionCall :does(OpenAIAsync::Types::Base) { +class OpenAIAsync::Types::Results::FunctionCall :does(OpenAIAsync::Types::Base) :Struct { field $arguments :JSONStr; # TODO decode the json from this directly? field $name :JSONStr; } -class OpenAIAsync::Types::Results::ChatMessage :does(OpenAIAsync::Types::Base) { +class OpenAIAsync::Types::Results::ChatMessage :does(OpenAIAsync::Types::Base) :Struct { field $content :JSONStr; field $tool_calls :MarshalTo([OpenAIAsync::Types::Results::ToolCall]) = undef; # don't think my local server provides this field $role :JSONStr; field $function_call :MarshalTo(OpenAIAsync::Types::Results::FunctionCall) = undef; # Depcrecated, might still happen } -class OpenAIAsync::Types::Results::ChatCompletionChoices :does(OpenAIAsync::Types::Base) { +class OpenAIAsync::Types::Results::ChatCompletionChoices :does(OpenAIAsync::Types::Base) :Struct { field $finish_reason :JSONStr; field $index :JSONNum; field $message :MarshalTo(OpenAIAsync::Types::Results::ChatMessage); } -class OpenAIAsync::Types::Results::ChatCompletion :does(OpenAIAsync::Types::Base) { +class OpenAIAsync::Types::Results::ChatCompletion :does(OpenAIAsync::Types::Base) :Struct { field $id :JSONStr; field $choices :MarshalTo([OpenAIAsync::Types::Results::ChatCompletionChoices]); field $created :JSONStr; @@ -41,21 +41,21 @@ class OpenAIAsync::Types::Results::ChatCompletion :does(OpenAIAsync::Types::Base field $object :JSONStr; } -class OpenAIAsync::Types::Results::ChunkDelta :does(OpenAIAsync::Types::Base) { +class OpenAIAsync::Types::Results::ChunkDelta :does(OpenAIAsync::Types::Base) :Struct { field $content :JSONStr; field $function_call :MarshalTo(OpenAIAsync::Types::Results::FunctionCall); field $tool_cass :MarshalTo([OpenAIAsync::Types::Results::ToolCall]); field $role :JSONStr; } -class OpenAIAsync::Types::Results::ChatCompletionChunkChoices :does(OpenAIAsync::Types::Base) { +class OpenAIAsync::Types::Results::ChatCompletionChunkChoices :does(OpenAIAsync::Types::Base) :Struct { field $delta :MarshalTo(OpenAIAsync::Types::Results::ChunkDelta); field $finish_reason :JSONStr; field $index :JSONStr; } # This is part of the streaming API -class OpenAIAsync::Types::Results::ChatCompletionChunk :does(OpenAIAsync::Types::Base) { +class OpenAIAsync::Types::Results::ChatCompletionChunk :does(OpenAIAsync::Types::Base) :Struct { field $id :JSONStr; field $choices :MarshalTo(OpenAIAsync::Types::Results::ChatCompletionChunkChoices); field $created :JSONStr; @@ -64,13 +64,13 @@ class OpenAIAsync::Types::Results::ChatCompletionChunk :does(OpenAIAsync::Types: field $object :JSONStr; } -class OpenAIAsync::Types::Results::Usage :does(OpenAIAsync::Types::Base) { +class OpenAIAsync::Types::Results::Usage :does(OpenAIAsync::Types::Base) :Struct { field $total_tokens :JSONNum; field $prompt_tokens :JSONNum; field $completion_tokens :JSONNum; # look at chat completions, is this the same } -class OpenAIAsync::Types::Results::LogProbs :does(OpenAIAsync::Types::Base) { +class OpenAIAsync::Types::Results::LogProbs :does(OpenAIAsync::Types::Base) :Struct { # TODO what's the representation here? field $text_offset = undef; field $token_logprobs = undef; @@ -78,14 +78,14 @@ class OpenAIAsync::Types::Results::LogProbs :does(OpenAIAsync::Types::Base) { field $top_logprobs = undef; } -class OpenAIAsync::Types::Results::CompletionChoices :does(OpenAIAsync::Types::Base) { +class OpenAIAsync::Types::Results::CompletionChoices :does(OpenAIAsync::Types::Base) :Struct { field $text :JSONStr; field $index :JSONNum; field $logprobs :MarshalTo(OpenAIAsync::Types::Results::LogProbs) = undef; # TODO make nicer type? field $finish_reason :JSONStr = undef; # TODO enum? helper funcs for this class? ->is_finished? } -class OpenAIAsync::Types::Results::Completion :does(OpenAIAsync::Types::Base) { +class OpenAIAsync::Types::Results::Completion :does(OpenAIAsync::Types::Base) :Struct { field $id :JSONStr; field $choices :MarshalTo([OpenAIAsync::Types::Results::CompletionChoices]); field $created :JSONStr; @@ -95,7 +95,7 @@ class OpenAIAsync::Types::Results::Completion :does(OpenAIAsync::Types::Base) { field $object :JSONStr; } -class OpenAIAsync::Types::Results::Embedding :does(OpenAIAsync::Types::Base) { +class OpenAIAsync::Types::Results::Embedding :does(OpenAIAsync::Types::Base) :Struct { field $index :JSONNum; field $embedding :JSONList(JSONNum); field $object :JSONStr; diff --git a/t/02-create-client.t b/t/02-create-client.t index 3766418..b308693 100644 --- a/t/02-create-client.t +++ b/t/02-create-client.t @@ -6,7 +6,7 @@ use Test2::V0; use OpenAIAsync::Client; BEGIN { - $ENV{OPENAI_API_KEY}="12345" unless $ENV{OPENAI_API_KEY}="12345"; + $ENV{OPENAI_API_KEY}="12345" unless $ENV{OPENAI_API_KEY}eq"12345"; } ok(lives { diff --git a/xt/01-completion-deprecated.t b/xt/01-completion-deprecated.t new file mode 100644 index 0000000..ddfd775 --- /dev/null +++ b/xt/01-completion-deprecated.t @@ -0,0 +1,32 @@ +use strict; +use warnings; + +use Test2::V0; + +use OpenAIAsync::Client; + +skip_all("Needs disclaimer to run") unless $ENV{I_PROMISE_NOT_TO_SUE_FOR_EXCESSIVE_COSTS} eq "Signed, ".getlogin(); + +skip_all("No api base defined") unless $ENV{OPENAI_API_BASE}; +skip_all("No API key defined") unless $ENV{OPENAI_API_KEY}; + +exit() unless ($ENV{OPENAI_API_KEY} and $ENV{OPENAI_API_BASE} and $ENV{I_PROMISE_NOT_TO_SUE_FOR_EXCESSIVE_COSTS} eq "Signed, ".getlogin()); + +use IO::Async::Loop; + +my $loop = IO::Async::Loop->new(); + +my $client; +ok(lives { + $client = OpenAIAsync::Client->new(); + + isa_ok($client, "OpenAIAsync::Client"); +}, "basic client creation"); + +ok(lives {$loop->add($client);}, "Adding to loop"); + +my $output_future = $client->completion({max_tokens => 1024, prompt => "Tell a story about a princess named Judy and her princess sister Emmy"}); +use Data::Dumper; +print Dumper($output_future->get()); + +done_testing(); \ No newline at end of file diff --git a/xt/02-chat-completion.t b/xt/02-chat-completion.t new file mode 100644 index 0000000..53a97c6 --- /dev/null +++ b/xt/02-chat-completion.t @@ -0,0 +1,49 @@ +use strict; +use warnings; + +use Test2::V0; + +use OpenAIAsync::Client; + +skip_all("Needs disclaimer to run") unless $ENV{I_PROMISE_NOT_TO_SUE_FOR_EXCESSIVE_COSTS} eq "Signed, ".getlogin(); + +skip_all("No api base defined") unless $ENV{OPENAI_API_BASE}; +skip_all("No API key defined") unless $ENV{OPENAI_API_KEY}; + +exit() unless ($ENV{OPENAI_API_KEY} and $ENV{OPENAI_API_BASE} and $ENV{I_PROMISE_NOT_TO_SUE_FOR_EXCESSIVE_COSTS} eq "Signed, ".getlogin()); + +use IO::Async::Loop; + +my $loop = IO::Async::Loop->new(); + +my $client; +ok(lives { + $client = OpenAIAsync::Client->new(); + + isa_ok($client, "OpenAIAsync::Client"); +}, "basic client creation"); + +ok(lives {$loop->add($client);}, "Adding to loop"); + +my $output_future = $client->chat({ + model => "gpt-3.5-turbo", + messages => [ + { + role => "system", + content => "You are a helpful assistant that tells fanciful stories" + }, + { + role => "user", + content => "Hello!" + } + ], + + + + max_tokens => 1024, +}); + +use Data::Dumper; +print Dumper($output_future->get()); + +done_testing(); \ No newline at end of file diff --git a/xt/02-create-client.t b/xt/02-create-client.t deleted file mode 100644 index 62d8bbd..0000000 --- a/xt/02-create-client.t +++ /dev/null @@ -1,43 +0,0 @@ -use strict; -use warnings; - -use Test2::V0; - -use OpenAIAsync::Client; - -skip_all("Needs disclaimer to run") unless $ENV{I_PROMISE_NOT_TO_SUE_FOR_EXCESSIVE_COSTS} eq "Signed, ".getlogin(); - -skip_all("No api base defined") unless $ENV{OPENAI_API_BASE}; -skip_all("No API key defined") unless $ENV{OPENAI_API_KEY}; - -exit() unless ($ENV{OPENAI_API_KEY} and $ENV{OPENAI_API_BASE} and $ENV{I_PROMISE_NOT_TO_SUE_FOR_EXCESSIVE_COSTS} eq "Signed, ".getlogin()); - -ok(lives { - my $client = OpenAIAsync::Client->new(); - - isa_ok($client, "OpenAIAsync::Client"); -}, "basic client creation"); - -my $exp = dies { - my $client = OpenAIAsync::Client->new(bad_option_doesnt_exist => 1); -}; - -ok($exp, "Unknown option kills creation"); - -like($exp, qr/Unrecognised parameters for OpenAIAsync::Client constructor: 'bad_option_doesnt_exist' at/, "exception text for unknonwn option"); - -ok lives { - my $client = OpenAIAsync::Client->new(http_other_options => {}); - - isa_ok($client, "OpenAIAsync::Client"); -}, "set http options"; - -ok lives { - my $client = OpenAIAsync::Client->new(io_async_notifier_params=>{}); - - isa_ok($client, "OpenAIAsync::Client"); -}, "Can give io async notifier options"; - - - -done_testing(); \ No newline at end of file diff --git a/xtest.sh b/xtest.sh new file mode 100755 index 0000000..58cf5f1 --- /dev/null +++ b/xtest.sh @@ -0,0 +1,11 @@ +#!/bin/bash + +set -euxo pipefail + +export OPENAI_API_KEY="0118 999 881 999 119 725 3" +export OPENAI_API_BASE="http://openai.general1-model.brainiac.ai.simcop2387.info/v1" +export I_PROMISE_NOT_TO_SUE_FOR_EXCESSIVE_COSTS="Signed, ryan" + +#dzil xtest + +perl -Ilib xt/02-chat-completion.t