starting active tests

This commit is contained in:
Ryan Voots 2023-11-22 14:15:16 -05:00
parent ec1b4fb0fa
commit 3b7e9da9cb
5 changed files with 81 additions and 58 deletions

22
.vstags
View file

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

View file

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

View file

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

43
xt/02-create-client.t Normal file
View file

@ -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();