gproxy_protocol/adapt/generate/resources/
gemini.rs1use 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}