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 )