Langertha-Knarr
view release on metacpan or search on metacpan
lib/Langertha/Knarr/Protocol/OpenAI.pm view on Meta::CPAN
created => int( time() ),
model => $r->model // $request->model // 'unknown',
choices => [
{
index => 0,
message => $message,
finish_reason => $finish,
},
],
usage => $usage,
};
return ( 200, { 'Content-Type' => 'application/json' }, $self->_json->encode($payload) );
}
sub format_models_response {
my ($self, $models) = @_;
my @data = map {
ref $_ eq 'HASH' ? { object => 'model', %$_ } : { id => "$_", object => 'model' }
} @$models;
my $payload = { object => 'list', data => \@data };
return ( 200, { 'Content-Type' => 'application/json' }, $self->_json->encode($payload) );
}
sub format_stream_chunk {
my ($self, $delta_text, $request) = @_;
my $payload = {
id => 'chatcmpl-stream',
object => 'chat.completion.chunk',
created => int( time() ),
model => $request->model // 'unknown',
choices => [ { index => 0, delta => { content => $delta_text }, finish_reason => undef } ],
};
return "data: " . $self->_json->encode($payload) . "\n\n";
}
__PACKAGE__->meta->make_immutable;
1;
__END__
=pod
=encoding UTF-8
=head1 NAME
Langertha::Knarr::Protocol::OpenAI - OpenAI-compatible wire protocol (chat/completions, models) for Knarr
=head1 VERSION
version 1.100
=head1 DESCRIPTION
Implements the OpenAI Chat Completions wire format on top of
L<Langertha::Knarr::Protocol>. Loaded by default in every
L<Langertha::Knarr> instance.
=over
=item * C<POST /v1/chat/completions> â sync and SSE streaming
=item * C<GET /v1/models> â model listing
=back
Streaming uses the standard SSE chunk format with C<data: [DONE]> as
the terminator. C<tools>, C<tool_choice>, and C<response_format> are
extracted into L<Langertha::Knarr::Request> attributes and forwarded to
the engine via C<chat_f>. Tool-call responses are serialised into
C<message.tool_calls> with C<finish_reason: "tool_calls">.
=head1 SUPPORT
=head2 Issues
Please report bugs and feature requests on GitHub at
L<https://github.com/Getty/langertha-knarr/issues>.
=head2 IRC
Join C<#langertha> on C<irc.perl.org> or message Getty directly.
=head1 CONTRIBUTING
Contributions are welcome! Please fork the repository and submit a pull request.
=head1 AUTHOR
Torsten Raudssus <torsten@raudssus.de> L<https://raudssus.de/>
=head1 COPYRIGHT AND LICENSE
This software is copyright (c) 2026 by Torsten Raudssus.
This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.
=cut
( run in 0.571 second using v1.01-cache-2.11-cpan-600a1bdf6e4 )