File Coverage

blib/lib/WebService/Jina.pm
Criterion Covered Total %
statement 14 66 21.2
branch 0 28 0.0
condition 0 24 0.0
subroutine 5 11 45.4
pod 6 6 100.0
total 25 135 18.5


line stmt bran cond sub pod time code
1             package WebService::Jina;
2              
3 1     1   85884 use 5.006;
  1         4  
4 1     1   8 use strict;
  1         1  
  1         26  
5 1     1   3 use warnings;
  1         2  
  1         61  
6              
7             our $VERSION = '0.05';
8              
9 1     1   381 use WebService::Jina::UA;
  1         3  
  1         30  
10 1     1   5 use Moo;
  1         2  
  1         3  
11              
12             has api_key => (
13             is => 'ro',
14             lazy => 1,
15             required => 1
16             );
17              
18             has ua => (
19             is => 'ro',
20             default => sub {
21             return WebService::Jina::UA->new(
22             api_key => $_[0]->api_key
23             );
24             }
25             );
26              
27             sub deepsearch {
28 0     0 1   my ($self, %args) = @_;
29              
30 0   0       $args{model} ||= 'jina-deepsearch-v1';
31              
32 0 0         if (! $args{messages}) {
33 0           die 'No messages defined for deepsearch';
34             }
35              
36 0 0         $args{stream} = $args{stream} ? \1 : \0;
37              
38 0   0       $args{reasoning_effort} ||= "medium";
39              
40             $self->ua->post(
41             url => 'https://deepsearch.jina.ai/v1/chat/completions',
42             headers => delete $args{headers},
43 0           data => \%args
44             );
45             }
46              
47             sub reader {
48 0     0 1   my ($self, %args) = @_;
49              
50 0 0         if (! $args{url}) {
51 0           die "no url defined for reader";
52             }
53            
54             $self->ua->post(
55             url => "https://r.jina.ai/",
56             headers => delete $args{headers},
57 0           data => \%args
58             );
59             }
60              
61             sub embedding {
62 0     0 1   my ($self, %args) = @_;
63              
64 0   0       $args{model} ||= 'jina-clip-v2';
65              
66 0   0       $args{dimensions} ||= 1024;
67              
68 0   0       $args{normalized} //= 1;
69 0 0         $args{normalized} = $args{normalized} ? \0 : \1;
70              
71 0   0       $args{embedding_type} ||= 'float';
72              
73 0 0         if (! $args{input}) {
74 0           die 'no input defined for embedding';
75             }
76              
77 0           for my $input (@{$args{input}}) {
  0            
78 0 0         if ($input->{image_file}) {
79 0           $input->{image} = $self->ua->base64_images([delete $input->{image_file}])->[0];
80             }
81             }
82              
83             $self->ua->post(
84             url => 'https://api.jina.ai/v1/embeddings',
85             headers => delete $args{headers},
86 0           data => \%args,
87             );
88             }
89              
90             sub rerank {
91 0     0 1   my ($self, %args) = @_;
92              
93 0   0       $args{model} ||= 'jina-reranker-v2-base-multilingual';
94              
95 0   0       $args{top_n} ||= 3;
96              
97 0 0         if (! $args{query}) {
98 0           die 'no query defined for rerank';
99             }
100              
101 0 0         if (! $args{documents}) {
102 0           die 'no documents defiend for rerank';
103             }
104              
105             $self->ua->post(
106             url => 'https://api.jina.ai/v1/rerank',
107             headers => delete $args{headers},
108 0           data => \%args
109             );
110              
111             }
112              
113             sub classify {
114 0     0 1   my ($self, %args) = @_;
115              
116 0   0       $args{model} ||= 'jina-clip-v2';
117              
118 0 0         if (! $args{input}) {
119 0           die 'no input defined for classify';
120             }
121              
122 0           for my $input (@{$args{input}}) {
  0            
123 0 0         if ($input->{image_file}) {
124 0           $input->{image} = $self->ua->base64_images([delete $input->{image_file}])->[0];
125             }
126             }
127            
128 0 0         if (! $args{labels}) {
129 0           die 'no labels defined for classify';
130             }
131              
132             $self->ua->post(
133             url => 'https://api.jina.ai/v1/classify',
134             headers => delete $args{headers},
135 0           data => \%args
136             );
137             }
138              
139             sub segment {
140 0     0 1   my ($self, %args) = @_;
141              
142 0   0       $args{return_tokens} //= 1;
143 0 0         $args{return_tokens} = $args{return_tokens} ? \1 : \0;
144              
145 0   0       $args{return_chunks} //= 1;
146 0 0         $args{return_chunks} = $args{return_chunks} ? \1 : \0;
147              
148 0   0       $args{max_chunk_length} ||= 1000;
149            
150 0 0         if (! $args{content}) {
151 0           die 'no content defined for segment';
152             }
153              
154             $self->ua->post(
155             url => 'https://api.jina.ai/v1/segment',
156             headers => delete $args{headers},
157 0           data => \%args
158             );
159             }
160              
161              
162             1;
163              
164             __END__