From 3b7e9da9cb9f3e98026290461f162c5c6553a9c9 Mon Sep 17 00:00:00 2001 From: Ryan Voots Date: Wed, 22 Nov 2023 14:15:16 -0500 Subject: [PATCH] starting active tests --- .vstags | 22 --------- lib/OpenAIAsync/OobaBooga/README.md | 1 + lib/OpenAIAsync/Types/Requests.pm | 2 +- lib/OpenAIAsync/Types/Results.pm | 71 +++++++++++++++-------------- xt/02-create-client.t | 43 +++++++++++++++++ 5 files changed, 81 insertions(+), 58 deletions(-) create mode 100644 lib/OpenAIAsync/OobaBooga/README.md create mode 100644 xt/02-create-client.t diff --git a/.vstags b/.vstags index ae9c351..0d746d8 100644 --- a/.vstags +++ b/.vstags @@ -9857,8 +9857,6 @@ OpenAIAsync .build/Xz72xzB4iA/blib/lib/OpenAIAsync.pm 1;" p OpenAIAsync .build/Xz72xzB4iA/lib/OpenAIAsync.pm 1;" p OpenAIAsync .build/bgXXjrPaza/blib/lib/OpenAIAsync.pm 1;" p OpenAIAsync .build/bgXXjrPaza/lib/OpenAIAsync.pm 1;" p -OpenAIAsync .build/latest/blib/lib/OpenAIAsync.pm 1;" p -OpenAIAsync .build/latest/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 @@ -9874,8 +9872,6 @@ OpenAIAsync::Client .build/Xz72xzB4iA/blib/lib/OpenAIAsync/Client.pm 1;" p OpenAIAsync::Client .build/Xz72xzB4iA/lib/OpenAIAsync/Client.pm 1;" p OpenAIAsync::Client .build/bgXXjrPaza/blib/lib/OpenAIAsync/Client.pm 1;" p OpenAIAsync::Client .build/bgXXjrPaza/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/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 @@ -9891,8 +9887,6 @@ OpenAIAsync::Types .build/Xz72xzB4iA/blib/lib/OpenAIAsync/Types.pm 1;" p OpenAIAsync::Types .build/Xz72xzB4iA/lib/OpenAIAsync/Types.pm 1;" p OpenAIAsync::Types .build/bgXXjrPaza/blib/lib/OpenAIAsync/Types.pm 1;" p OpenAIAsync::Types .build/bgXXjrPaza/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/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 @@ -9918,8 +9912,6 @@ OpenAIAsync::Types::Requests .build/bgXXjrPaza/blib/lib/OpenAIAsync/Types/Reques OpenAIAsync::Types::Requests .build/bgXXjrPaza/lib/OpenAIAsync/Types/Requests.pm 1;" p OpenAIAsync::Types::Requests .build/cD5KaBDsj2/blib/lib/OpenAIAsync/Types/Requests.pm 1;" p OpenAIAsync::Types::Requests .build/cD5KaBDsj2/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/mKmyAW37h1/blib/lib/OpenAIAsync/Types/Requests.pm 1;" p 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 @@ -9949,8 +9941,6 @@ OpenAIAsync::Types::Requests::ChatCompletion::Messages::Union .build/bgXXjrPaza/ OpenAIAsync::Types::Requests::ChatCompletion::Messages::Union .build/bgXXjrPaza/lib/OpenAIAsync/Types/Requests.pm 170;" p OpenAIAsync::Types::Requests::ChatCompletion::Messages::Union .build/cD5KaBDsj2/blib/lib/OpenAIAsync/Types/Requests.pm 170;" p OpenAIAsync::Types::Requests::ChatCompletion::Messages::Union .build/cD5KaBDsj2/lib/OpenAIAsync/Types/Requests.pm 170;" p -OpenAIAsync::Types::Requests::ChatCompletion::Messages::Union .build/latest/blib/lib/OpenAIAsync/Types/Requests.pm 170;" p -OpenAIAsync::Types::Requests::ChatCompletion::Messages::Union .build/latest/lib/OpenAIAsync/Types/Requests.pm 170;" p OpenAIAsync::Types::Requests::ChatCompletion::Messages::Union .build/mKmyAW37h1/blib/lib/OpenAIAsync/Types/Requests.pm 170;" p 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 @@ -9979,8 +9969,6 @@ OpenAIAsync::Types::Requests::ChatCompletion::Messages::User::ContentUnion .buil OpenAIAsync::Types::Requests::ChatCompletion::Messages::User::ContentUnion .build/bgXXjrPaza/lib/OpenAIAsync/Types/Requests.pm 94;" p OpenAIAsync::Types::Requests::ChatCompletion::Messages::User::ContentUnion .build/cD5KaBDsj2/blib/lib/OpenAIAsync/Types/Requests.pm 94;" p OpenAIAsync::Types::Requests::ChatCompletion::Messages::User::ContentUnion .build/cD5KaBDsj2/lib/OpenAIAsync/Types/Requests.pm 94;" p -OpenAIAsync::Types::Requests::ChatCompletion::Messages::User::ContentUnion .build/latest/blib/lib/OpenAIAsync/Types/Requests.pm 94;" p -OpenAIAsync::Types::Requests::ChatCompletion::Messages::User::ContentUnion .build/latest/lib/OpenAIAsync/Types/Requests.pm 94;" p OpenAIAsync::Types::Requests::ChatCompletion::Messages::User::ContentUnion .build/mKmyAW37h1/blib/lib/OpenAIAsync/Types/Requests.pm 94;" p 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 @@ -10009,8 +9997,6 @@ OpenAIAsync::Types::Results .build/bgXXjrPaza/blib/lib/OpenAIAsync/Types/Results OpenAIAsync::Types::Results .build/bgXXjrPaza/lib/OpenAIAsync/Types/Results.pm 1;" p OpenAIAsync::Types::Results .build/cD5KaBDsj2/blib/lib/OpenAIAsync/Types/Results.pm 1;" p OpenAIAsync::Types::Results .build/cD5KaBDsj2/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/mKmyAW37h1/blib/lib/OpenAIAsync/Types/Results.pm 1;" p 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 @@ -28096,10 +28082,6 @@ new .build/cD5KaBDsj2/blib/lib/OpenAIAsync/Types/Requests.pm 173;" s new .build/cD5KaBDsj2/blib/lib/OpenAIAsync/Types/Requests.pm 97;" s new .build/cD5KaBDsj2/lib/OpenAIAsync/Types/Requests.pm 173;" s new .build/cD5KaBDsj2/lib/OpenAIAsync/Types/Requests.pm 97;" s -new .build/latest/blib/lib/OpenAIAsync/Types/Requests.pm 173;" s -new .build/latest/blib/lib/OpenAIAsync/Types/Requests.pm 97;" s -new .build/latest/lib/OpenAIAsync/Types/Requests.pm 173;" s -new .build/latest/lib/OpenAIAsync/Types/Requests.pm 97;" s new .build/mKmyAW37h1/blib/lib/OpenAIAsync/Types/Requests.pm 173;" s new .build/mKmyAW37h1/blib/lib/OpenAIAsync/Types/Requests.pm 97;" s new .build/mKmyAW37h1/lib/OpenAIAsync/Types/Requests.pm 173;" s @@ -28927,8 +28909,6 @@ ontent::new .build/bgXXjrPaza/blib/lib/OpenAIAsync/Types/Requests.pm 173;" s ontent::new .build/bgXXjrPaza/lib/OpenAIAsync/Types/Requests.pm 173;" s ontent::new .build/cD5KaBDsj2/blib/lib/OpenAIAsync/Types/Requests.pm 173;" s ontent::new .build/cD5KaBDsj2/lib/OpenAIAsync/Types/Requests.pm 173;" s -ontent::new .build/latest/blib/lib/OpenAIAsync/Types/Requests.pm 173;" s -ontent::new .build/latest/lib/OpenAIAsync/Types/Requests.pm 173;" s 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 @@ -31594,8 +31574,6 @@ y::new .build/bgXXjrPaza/blib/lib/OpenAIAsync/Types/Requests.pm 97;" s y::new .build/bgXXjrPaza/lib/OpenAIAsync/Types/Requests.pm 97;" s y::new .build/cD5KaBDsj2/blib/lib/OpenAIAsync/Types/Requests.pm 97;" s y::new .build/cD5KaBDsj2/lib/OpenAIAsync/Types/Requests.pm 97;" s -y::new .build/latest/blib/lib/OpenAIAsync/Types/Requests.pm 97;" s -y::new .build/latest/lib/OpenAIAsync/Types/Requests.pm 97;" s 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 diff --git a/lib/OpenAIAsync/OobaBooga/README.md b/lib/OpenAIAsync/OobaBooga/README.md new file mode 100644 index 0000000..39b464f --- /dev/null +++ b/lib/OpenAIAsync/OobaBooga/README.md @@ -0,0 +1 @@ +This is going to be a subclass of the client that adds in some additional options that are present only in their version of the OpenAI api \ No newline at end of file diff --git a/lib/OpenAIAsync/Types/Requests.pm b/lib/OpenAIAsync/Types/Requests.pm index b751520..a6c2734 100644 --- a/lib/OpenAIAsync/Types/Requests.pm +++ b/lib/OpenAIAsync/Types/Requests.pm @@ -190,4 +190,4 @@ package } }; -1; \ No newline at end of file +1; \ No newline at end of file diff --git a/lib/OpenAIAsync/Types/Results.pm b/lib/OpenAIAsync/Types/Results.pm index 90d9975..0db05ca 100644 --- a/lib/OpenAIAsync/Types/Results.pm +++ b/lib/OpenAIAsync/Types/Results.pm @@ -8,69 +8,70 @@ use Object::PadX::Role::AutoJSON; use Object::Pad::ClassAttr::Struct; class OpenAIAsync::Types::Results::ToolCall :does(OpenAIAsync::Types::Base) { - field $id; - field $type; # always "function" right now, may get expanded in the future + 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) { - field $arguments; # TODO decode the json from this directly? - field $name; + field $arguments :JSONStr; # TODO decode the json from this directly? + field $name :JSONStr; } class OpenAIAsync::Types::Results::ChatMessage :does(OpenAIAsync::Types::Base) { - field $content; + field $content :JSONStr; field $tool_calls :MarshalTo([OpenAIAsync::Types::Results::ToolCall]) = undef; # don't think my local server provides this - field $role; + 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) { - field $finish_reason; - field $index; + field $finish_reason :JSONStr; + field $index :JSONNum; field $message :MarshalTo(OpenAIAsync::Types::Results::ChatMessage); } class OpenAIAsync::Types::Results::ChatCompletion :does(OpenAIAsync::Types::Base) { - field $id; + field $id :JSONStr; field $choices :MarshalTo([OpenAIAsync::Types::Results::ChatCompletionChoices]); - field $created; - field $model; - field $system_fingerprint = undef; # My local system doesn't provide this + field $created :JSONStr; + field $model :JSONStr; + field $system_fingerprint :JSONStr = undef; # My local system doesn't provide this field $usage :MarshalTo(OpenAIAsync::Types::Results::Usage); - field $object; + field $object :JSONStr; } class OpenAIAsync::Types::Results::ChunkDelta :does(OpenAIAsync::Types::Base) { - field $content; + field $content :JSONStr; field $function_call :MarshalTo(OpenAIAsync::Types::Results::FunctionCall); field $tool_cass :MarshalTo([OpenAIAsync::Types::Results::ToolCall]); - field $role; + field $role :JSONStr; } class OpenAIAsync::Types::Results::ChatCompletionChunkChoices :does(OpenAIAsync::Types::Base) { field $delta :MarshalTo(OpenAIAsync::Types::Results::ChunkDelta); - field $finish_reason; - field $index; + field $finish_reason :JSONStr; + field $index :JSONStr; } # This is part of the streaming API class OpenAIAsync::Types::Results::ChatCompletionChunk :does(OpenAIAsync::Types::Base) { - field $id; + field $id :JSONStr; field $choices :MarshalTo(OpenAIAsync::Types::Results::ChatCompletionChunkChoices); - field $created; - field $model; - field $system_fingerprint = undef; - field $object; + field $created :JSONStr; + field $model :JSONStr; + field $system_fingerprint :JSONStr = undef; + field $object :JSONStr; } class OpenAIAsync::Types::Results::Usage :does(OpenAIAsync::Types::Base) { - field $total_tokens; - field $prompt_tokens; - field $completion_tokens; # look at chat completions, is this the same + 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) { + # TODO what's the representation here? field $text_offset = undef; field $token_logprobs = undef; field $tokens = undef; @@ -78,24 +79,24 @@ class OpenAIAsync::Types::Results::LogProbs :does(OpenAIAsync::Types::Base) { } class OpenAIAsync::Types::Results::CompletionChoices :does(OpenAIAsync::Types::Base) { - field $text; - field $index; + field $text :JSONStr; + field $index :JSONNum; field $logprobs :MarshalTo(OpenAIAsync::Types::Results::LogProbs) = undef; # TODO make nicer type? - field $finish_reason = 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) { - field $id; + field $id :JSONStr; field $choices :MarshalTo([OpenAIAsync::Types::Results::CompletionChoices]); - field $created; - field $model; + field $created :JSONStr; + field $model :JSONStr; field $system_fingerprint = undef; # my local implementation doesn't provide this, openai does it for tracking changes somehow field $usage :MarshalTo(OpenAIAsync::Types::Results::Usage); - field $object; + field $object :JSONStr; } class OpenAIAsync::Types::Results::Embedding :does(OpenAIAsync::Types::Base) { - field $index; - field $embedding; - field $object; + field $index :JSONNum; + field $embedding :JSONList(JSONNum); + field $object :JSONStr; } \ No newline at end of file diff --git a/xt/02-create-client.t b/xt/02-create-client.t new file mode 100644 index 0000000..62d8bbd --- /dev/null +++ b/xt/02-create-client.t @@ -0,0 +1,43 @@ +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