1- use anyhow:: Result ;
2-
31use crate :: transformers:: types:: {
42 EmbeddingPayload , EmbeddingRequest , EmbeddingResponse , Inputs , PairedEmbeddings ,
53} ;
4+ use anyhow:: Result ;
65pub async fn handle_response < T : for < ' de > serde:: Deserialize < ' de > > (
76 resp : reqwest:: Response ,
87 method : & ' static str ,
@@ -26,22 +25,47 @@ pub async fn openai_embedding_request(
2625 timeout : i32 ,
2726) -> Result < Vec < Vec < f64 > > > {
2827 let client = reqwest:: Client :: new ( ) ;
29- let mut req = client
30- . post ( request. url )
31- . timeout ( std:: time:: Duration :: from_secs ( timeout as u64 ) )
32- . json :: < EmbeddingPayload > ( & request. payload )
33- . header ( "Content-Type" , "application/json" ) ;
34- if let Some ( key) = request. api_key {
35- req = req. header ( "Authorization" , format ! ( "Bearer {}" , key) ) ;
28+
29+ // openai request size limit is 2048 inputs
30+ let number_inputs = request. payload . input . len ( ) ;
31+ let todo_requests: Vec < EmbeddingPayload > = if number_inputs > 2048 {
32+ split_vector ( request. payload . input , 2048 )
33+ . iter ( )
34+ . map ( |chunk| EmbeddingPayload {
35+ input : chunk. clone ( ) ,
36+ model : request. payload . model . clone ( ) ,
37+ } )
38+ . collect ( )
39+ } else {
40+ vec ! [ request. payload]
41+ } ;
42+
43+ let mut all_embeddings: Vec < Vec < f64 > > = Vec :: with_capacity ( number_inputs) ;
44+
45+ for request_payload in todo_requests. iter ( ) {
46+ let mut req = client
47+ . post ( & request. url )
48+ . timeout ( std:: time:: Duration :: from_secs ( timeout as u64 ) )
49+ . json :: < EmbeddingPayload > ( request_payload)
50+ . header ( "Content-Type" , "application/json" ) ;
51+ if let Some ( key) = request. api_key . as_ref ( ) {
52+ req = req. header ( "Authorization" , format ! ( "Bearer {}" , key) ) ;
53+ }
54+ let resp = req. send ( ) . await ?;
55+ let embedding_resp: EmbeddingResponse =
56+ handle_response :: < EmbeddingResponse > ( resp, "embeddings" ) . await ?;
57+ let embeddings: Vec < Vec < f64 > > = embedding_resp
58+ . data
59+ . iter ( )
60+ . map ( |d| d. embedding . clone ( ) )
61+ . collect ( ) ;
62+ all_embeddings. extend ( embeddings) ;
3663 }
37- let resp = req. send ( ) . await ?;
38- let embedding_resp = handle_response :: < EmbeddingResponse > ( resp, "embeddings" ) . await ?;
39- let embeddings = embedding_resp
40- . data
41- . iter ( )
42- . map ( |d| d. embedding . clone ( ) )
43- . collect ( ) ;
44- Ok ( embeddings)
64+ Ok ( all_embeddings)
65+ }
66+
67+ fn split_vector ( vec : Vec < String > , chunk_size : usize ) -> Vec < Vec < String > > {
68+ vec. chunks ( chunk_size) . map ( |chunk| chunk. to_vec ( ) ) . collect ( )
4569}
4670
4771// merges the vec of inputs with the embedding responses
0 commit comments