Many things better now, just needs to do some other stuff
This commit is contained in:
parent
75a359bd6d
commit
78184a015b
4 changed files with 18 additions and 15 deletions
|
@ -222,6 +222,9 @@ class OpenAIAsync::Server :repr(HASH) :strict(params) {
|
||||||
use HTTP::Response;
|
use HTTP::Response;
|
||||||
use HTTP::Request;
|
use HTTP::Request;
|
||||||
|
|
||||||
|
use OpenAIAsync::Types::Requests;
|
||||||
|
use OpenAIAsync::Types::Results;
|
||||||
|
|
||||||
field $_json = JSON::MaybeXS->new(utf8 => 1, convert_blessed => 1);
|
field $_json = JSON::MaybeXS->new(utf8 => 1, convert_blessed => 1);
|
||||||
field $http_server;
|
field $http_server;
|
||||||
|
|
||||||
|
@ -280,7 +283,7 @@ class OpenAIAsync::Server :repr(HASH) :strict(params) {
|
||||||
|
|
||||||
method register_url(%opts) {
|
method register_url(%opts) {
|
||||||
# TODO check params
|
# TODO check params
|
||||||
use Data::Dumper;
|
#use Data::Dumper;
|
||||||
#say Dumper("Got url registered", \%opts);
|
#say Dumper("Got url registered", \%opts);
|
||||||
push $routes->@*, \%opts;
|
push $routes->@*, \%opts;
|
||||||
}
|
}
|
||||||
|
@ -288,7 +291,6 @@ class OpenAIAsync::Server :repr(HASH) :strict(params) {
|
||||||
async method _route_request($req, $ctx) {
|
async method _route_request($req, $ctx) {
|
||||||
my $method = $req->method();
|
my $method = $req->method();
|
||||||
my $path = $req->path;
|
my $path = $req->path;
|
||||||
|
|
||||||
say "Got request ", $method, " => ", $path;
|
say "Got request ", $method, " => ", $path;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
@ -303,20 +305,20 @@ class OpenAIAsync::Server :repr(HASH) :strict(params) {
|
||||||
|
|
||||||
my $obj;
|
my $obj;
|
||||||
if ($route->{decoder} eq "www-form-urlencoded") {
|
if ($route->{decoder} eq "www-form-urlencoded") {
|
||||||
my %data = WWW::Form::UrlEncoded::parse_urlencoded($req->decoded_content);
|
my %data = WWW::Form::UrlEncoded::parse_urlencoded($req->body);
|
||||||
$obj = $route->{request_class}->new(%data);
|
$obj = $route->{request_class}->new(%data);
|
||||||
} elsif ($route->{decoder} eq "json") {
|
} elsif ($route->{decoder} eq "json") {
|
||||||
my $data = $_json->decode($req->decoded_content);
|
my $data = $_json->decode($req->body);
|
||||||
$obj = $route->{request_class}->new(%$data);
|
$obj = $route->{request_class}->new(%$data);
|
||||||
} elsif ($route->{decoder} eq "null") {
|
} elsif ($route->{decoder} eq "null") {
|
||||||
$obj = $route->{request_class}->new();
|
$obj = $route->{request_class}->new();
|
||||||
} else { # Try to detect based on content-type, then fail
|
} else { # Try to detect based on content-type, then fail
|
||||||
my $content_type = $req->header("Content-Type");
|
my $content_type = $req->header("Content-Type");
|
||||||
if ($content_type eq 'application/json') {
|
if ($content_type eq 'application/json') {
|
||||||
my $data = $_json->decode($req->decoded_content);
|
my $data = $_json->decode($req->body);
|
||||||
$obj = $route->{request_class}->new(%$data);
|
$obj = $route->{request_class}->new(%$data);
|
||||||
} elsif ($content_type eq 'application/x-www-form-urlencoded') {
|
} elsif ($content_type eq 'application/x-www-form-urlencoded') {
|
||||||
my %data = WWW::Form::UrlEncoded::parse_urlencoded($req->decoded_content);
|
my %data = WWW::Form::UrlEncoded::parse_urlencoded($req->body);
|
||||||
$obj = $route->{request_class}->new(%data);
|
$obj = $route->{request_class}->new(%data);
|
||||||
} else {
|
} else {
|
||||||
die "Unsupported content-type for URI: $content_type";
|
die "Unsupported content-type for URI: $content_type";
|
||||||
|
@ -324,11 +326,12 @@ class OpenAIAsync::Server :repr(HASH) :strict(params) {
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
my ($result, @extra) = (await $route->{handle}->($req, $ctx, $obj, $params))->get();
|
my ($result, @extra) = (await $route->{handle}->($req, $ctx, $obj, $params));
|
||||||
|
|
||||||
if ($route->{result_class}) {
|
if ($route->{result_class}) {
|
||||||
my $out_obj = $result;
|
my $out_obj = $result;
|
||||||
unless ($out_obj isa $route->{result_object}) {
|
|
||||||
|
unless ($out_obj isa $route->{result_class}) {
|
||||||
$out_obj = $route->{result_class}->new(%$result);
|
$out_obj = $route->{result_class}->new(%$result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -33,9 +33,9 @@ role OpenAIAsync::Server::API::v1::ChatCompletion :strict(params) {
|
||||||
method => 'POST',
|
method => 'POST',
|
||||||
url => qr{^/v1/chat/completions$},
|
url => qr{^/v1/chat/completions$},
|
||||||
handle => async sub($req, $ctx, $obj, $params) {await $self->chat($obj, $req, $ctx)},
|
handle => async sub($req, $ctx, $obj, $params) {await $self->chat($obj, $req, $ctx)},
|
||||||
request_class => "OpenAIAsync::Type::Request::ChatCompletion",
|
request_class => "OpenAIAsync::Types::Requests::ChatCompletion",
|
||||||
result_class => "OpenAIAsync::Type::Result::ChatCompletion",
|
result_class => "OpenAIAsync::Types::Results::ChatCompletion",
|
||||||
decoder => 'www-form-urlencoded', # default is json, we need this for this api
|
decoder => 'json', # default is json, we need this for this api
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -49,7 +49,7 @@ my $chat_completion_input = {
|
||||||
|
|
||||||
sub mk_req($uri, $content) {
|
sub mk_req($uri, $content) {
|
||||||
my $content_json = encode_json($content);
|
my $content_json = encode_json($content);
|
||||||
return $http_client->POST("http://127.0.0.1:$port/v1".$uri, $content_json, headers => {"Content-Type" => "application/json"});
|
return $http_client->POST("http://127.0.0.1:$port/v1".$uri, $content_json, content_type => 'application/json');
|
||||||
}
|
}
|
||||||
|
|
||||||
my $res = await mk_req("/chat/completions", $chat_completion_input);
|
my $res = await mk_req("/chat/completions", $chat_completion_input);
|
||||||
|
|
|
@ -37,9 +37,9 @@ role OpenAIAsync::Server::API::Test::ChatCompletion :strict(params) {
|
||||||
model => "GumbyBrain-llm",
|
model => "GumbyBrain-llm",
|
||||||
system_fingerprint => "SHODAN node 12 of 16 tertiary adjunct of unimatrix 42",
|
system_fingerprint => "SHODAN node 12 of 16 tertiary adjunct of unimatrix 42",
|
||||||
usage => {
|
usage => {
|
||||||
42,
|
total_tokens => 42,
|
||||||
6,
|
prompt_tokens => 6,
|
||||||
9,
|
completion_tokens => 9,
|
||||||
},
|
},
|
||||||
object => "text_completion",
|
object => "text_completion",
|
||||||
created => 0,
|
created => 0,
|
||||||
|
|
Loading…
Add table
Reference in a new issue