Skip to main content

gproxy_protocol/adapt/generate/resources/
gemini.rs

1use super::*;
2use crate::wire::{DeclaredFields, gemini as g};
3
4impl<R: ResourceAccess> GenerationResources<'_, R> {
5    pub async fn gemini(
6        &self,
7        input: g::GenerateContentRequestBody,
8    ) -> Result<g::GenerateContentRequestBody, TransformError> {
9        let mut input = input.into_declared();
10        let mut budget = self.budget();
11        for content in input
12            .contents
13            .iter_mut()
14            .chain(input.system_instruction.iter_mut())
15        {
16            for part in content.parts.iter_mut().flatten() {
17                if let Some(file) = &part.file_data {
18                    if part.inline_data.is_some() {
19                        return Err(TransformError::shape(
20                            "part",
21                            "ambiguous file and inline data",
22                        ));
23                    }
24                    let media = budget
25                        .read(ResourceReference::Url(file.file_uri.clone()), false)
26                        .await?;
27                    if file
28                        .mime_type
29                        .as_ref()
30                        .is_some_and(|mime| mime != &media.mime)
31                    {
32                        return Err(TransformError::invalid_result(
33                            "file_data.mime",
34                            "resource MIME differs from request",
35                        ));
36                    }
37                    part.inline_data =
38                        Some(g::Blob::builder(media.mime, STANDARD.encode(media.bytes)).build());
39                    part.file_data = None;
40                }
41            }
42        }
43        Ok(input)
44    }
45}