our
$AUTHORITY
=
'cpan:GETTY'
;
$Langertha::Engine::Anthropic::VERSION
=
'0.007'
;
JSON
HTTP
Models
Chat
Temperature
ResponseSize
SystemPrompt
)
);
sub
default_response_size { 1024 }
has
api_key
=> (
is
=>
'ro'
,
lazy_build
=> 1,
);
sub
_build_api_key {
my
(
$self
) =
@_
;
return
$ENV
{LANGERTHA_ANTHROPIC_API_KEY}
|| croak
""
.(
ref
$self
).
" requires LANGERTHA_ANTHROPIC_API_KEY or api_key set"
;
}
has
api_version
=> (
is
=>
'ro'
,
lazy_build
=> 1,
);
sub
_build_api_version {
'2023-06-01'
}
sub
update_request {
my
(
$self
,
$request
) =
@_
;
$request
->header(
'x-api-key'
,
$self
->api_key);
$request
->header(
'content-type'
,
'application/json'
);
$request
->header(
'anthropic-version'
,
$self
->api_version);
}
has
'+url'
=> (
lazy
=> 1,
);
sub
has_url { 1 }
sub
default_model {
'claude-3-5-sonnet-20240620'
}
sub
chat_request {
my
(
$self
,
$messages
,
%extra
) =
@_
;
my
@msgs
;
my
$system
=
""
;
for
my
$message
(@{
$messages
}) {
if
(
$message
->{role} eq
'system'
) {
$system
.=
"\n\n"
if
length
$system
;
$system
.=
$message
->{content};
}
else
{
push
@msgs
,
$message
;
}
}
if
(
$system
and
scalar
@msgs
== 0) {
push
@msgs
, {
role
=>
'user'
,
content
=>
$system
,
};
$system
=
undef
;
}
return
$self
->generate_http_request(
POST
=>
$self
->url.
'/v1/messages'
,
sub
{
$self
->chat_response(
shift
) },
model
=>
$self
->chat_model,
messages
=> \
@msgs
,
max_tokens
=>
$self
->get_response_size,
$self
->has_temperature ? (
temperature
=>
$self
->temperature ) : (),
$system
? (
system
=>
$system
) : (),
%extra
,
);
}
sub
chat_response {
my
(
$self
,
$response
) =
@_
;
my
$data
=
$self
->parse_response(
$response
);
my
@messages
= @{
$data
->{content}};
return
$messages
[0]->{text};
}
__PACKAGE__->meta->make_immutable;