Langertha-Knarr
view release on metacpan or search on metacpan
t/71_router_passthrough_fallback.t view on Meta::CPAN
use strict;
use warnings;
use Test2::V0;
use Future;
use Langertha::Knarr::Session;
use Langertha::Knarr::Request;
use Langertha::Knarr::Handler::Router;
# Mock router: knows one model, dies on others.
{
package MockRouter;
use Moose;
has known => ( is => 'ro', isa => 'HashRef', default => sub { { 'gpt-test' => 1 } } );
sub resolve {
my ($self, $model) = @_;
die "no such model: $model\n" unless $self->known->{ $model // '' };
return ( MockEngine->new, $model );
}
sub list_models { [ { id => 'gpt-test', object => 'model' } ] }
__PACKAGE__->meta->make_immutable;
}
{
package MockEngine;
use Moose;
use Future;
sub chat_f {
my ($self, %args) = @_;
my @msgs = @{ $args{messages} || [] };
my $last = $msgs[-1];
my $text = ref $last ? ($last->{content} // '') : "$last";
return Future->done("ENGINE: $text");
}
sub simple_chat_f {
my ($self, @msgs) = @_;
return $self->chat_f( messages => \@msgs );
}
__PACKAGE__->meta->make_immutable;
}
# Mock passthrough handler that records calls.
{
package MockPassthrough;
use Moose;
use Future;
with 'Langertha::Knarr::Handler';
has calls => ( is => 'ro', default => sub { [] } );
sub handle_chat_f {
my ($self, $session, $request) = @_;
push @{ $self->calls }, $request->model // '';
return Future->done({ content => "PASSTHROUGH: " . ($request->model // ''), model => 'pt' });
}
sub list_models { [] }
__PACKAGE__->meta->make_immutable;
}
my $session = Langertha::Knarr::Session->new( id => 's' );
# --- 1) Without passthrough: known model resolves, unknown dies ---
{
my $h = Langertha::Knarr::Handler::Router->new( router => MockRouter->new );
my $req_known = Langertha::Knarr::Request->new(
protocol => 'openai',
model => 'gpt-test',
messages => [ { role => 'user', content => 'hi' } ],
);
my $r = $h->handle_chat_f( $session, $req_known )->get;
is( $r->content, 'ENGINE: hi', 'known model goes to engine' );
my $req_unknown = Langertha::Knarr::Request->new(
protocol => 'openai',
model => 'gpt-mystery',
messages => [ { role => 'user', content => 'hi' } ],
);
( run in 1.893 second using v1.01-cache-2.11-cpan-5a3173703d6 )