AI-Anthropic
view release on metacpan or search on metacpan
lib/AI/Anthropic.pm view on Meta::CPAN
content => $self->{_json}->encode($body),
data_callback => sub {
my ($chunk, $res) = @_;
# Parse SSE events
for my $line (split /\n/, $chunk) {
next unless $line =~ /^data: (.+)/;
my $data = $1;
next if $data eq '[DONE]';
eval {
my $event = $self->{_json}->decode($data);
if ($event->{type} eq 'content_block_delta') {
my $text = $event->{delta}{text} // '';
$full_text .= $text;
$callback->($text) if $callback;
} elsif ($event->{type} eq 'message_stop') {
$response_data = $event;
}
};
lib/AI/Anthropic.pm view on Meta::CPAN
'Content-Type' => 'application/json',
'x-api-key' => $self->{api_key},
'anthropic-version' => API_VERSION,
};
}
sub _handle_response {
my ($self, $response) = @_;
my $data;
eval {
$data = $self->{_json}->decode($response->{content});
};
unless ($response->{success}) {
my $error_msg = $data->{error}{message} // $response->{content} // 'Unknown error';
croak "Anthropic API error: $error_msg (status: $response->{status})";
}
return AI::Anthropic::Response->new(
text => $data->{content}[0]{text} // '',
t/01-basic.t view on Meta::CPAN
use strict;
use warnings;
use Test::More;
# Test loading
use_ok('AI::Anthropic');
# Test object creation without API key (should fail gracefully later)
{
local $ENV{ANTHROPIC_API_KEY};
eval {
my $claude = AI::Anthropic->new();
};
like($@, qr/API key required/, 'Dies without API key');
}
# Test object creation with API key
{
my $claude = AI::Anthropic->new(api_key => 'test-key-123');
isa_ok($claude, 'AI::Anthropic');
}
( run in 1.127 second using v1.01-cache-2.11-cpan-acf6aa7dc9e )