1use crate::client::Client;
2use crate::messages::Message;
3use crate::models::Model;
4use crate::requests::Content;
5use crate::requests::GeminiEmbedRequest;
6use crate::requests::GeminiEmbedRequests;
7use crate::responses::BatchEmbedContentsResponse;
8use crate::responses::EmbedContentResponse;
9use crate::traits::CTrait;
10use anyhow::Result;
11use derive_builder::Builder;
12use reqwest::Method;
13
14#[derive(Builder, Default, Clone)]
15#[builder(setter(into), default)]
16pub struct Embedding {
17 pub model: Model,
18 pub input: Message,
19}
20
21#[derive(Builder, Default, Clone)]
22#[builder(setter(into), default)]
23pub struct BatchEmbedding {
24 pub model: Model,
25 pub input: Vec<Message>,
26}
27
28#[derive(Clone)]
29pub struct Embeddings {
30 pub client: Client,
31}
32
33impl Embeddings {
34 pub async fn create(&self, params: Embedding) -> Result<EmbedContentResponse> {
35 let request_body = GeminiEmbedRequest {
36 model: format!("models/{}", params.model.to_string()),
37 content: Content {
38 parts: vec![params.input.to_part()],
39 },
40 };
41
42 let req = self
43 .client
44 .request(Method::POST, "embedContent")?
45 .json(&request_body);
46
47 let res = req.send().await?;
48 Ok(res.json().await?)
49 }
50
51 pub async fn batch(&self, params: BatchEmbedding) -> Result<BatchEmbedContentsResponse> {
52 let requests = params
53 .input
54 .into_iter()
55 .map(|message| GeminiEmbedRequest {
56 model: format!("models/{}", params.model.to_string()),
57 content: Content {
58 parts: vec![message.to_part()],
59 },
60 })
61 .collect::<Vec<GeminiEmbedRequest>>();
62
63 let request_body = GeminiEmbedRequests { requests };
64
65 let req = self
66 .client
67 .request(Method::POST, "batchEmbedContents")?
68 .json(&request_body);
69
70 let res = req.send().await?;
71 Ok(res.json().await?)
72 }
73}