llmsdk_provider/
image_model.rs1use async_trait::async_trait;
7use bytes::Bytes;
8use serde::{Deserialize, Serialize};
9
10use crate::error::Result;
11use crate::language_model::FilePart;
12use crate::shared::{
13 Headers, ProviderMetadata, ProviderOptions, RequestInfo, ResponseInfo, Warning,
14};
15
16#[async_trait]
18pub trait ImageModel: Send + Sync + std::fmt::Debug {
19 fn provider(&self) -> &str;
21
22 fn model_id(&self) -> &str;
24
25 fn specification_version(&self) -> &'static str {
30 "v4"
31 }
32
33 async fn max_images_per_call(&self) -> Option<u32> {
35 None
36 }
37
38 async fn do_generate(&self, options: ImageOptions) -> Result<ImageResult>;
45}
46
47#[derive(Debug, Clone, Default, Serialize, Deserialize)]
49pub struct ImageOptions {
50 pub prompt: String,
52 #[serde(default, skip_serializing_if = "Option::is_none")]
54 pub n: Option<u32>,
55 #[serde(default, skip_serializing_if = "Option::is_none")]
57 pub size: Option<String>,
58 #[serde(
60 default,
61 rename = "aspectRatio",
62 skip_serializing_if = "Option::is_none"
63 )]
64 pub aspect_ratio: Option<String>,
65 #[serde(default, skip_serializing_if = "Option::is_none")]
67 pub seed: Option<u64>,
68 #[serde(default, skip_serializing_if = "Option::is_none")]
74 pub files: Option<Vec<FilePart>>,
75 #[serde(default, skip_serializing_if = "Option::is_none")]
77 pub mask: Option<FilePart>,
78 #[serde(default, skip_serializing_if = "Option::is_none")]
80 pub headers: Option<Headers>,
81 #[serde(
83 default,
84 rename = "providerOptions",
85 skip_serializing_if = "Option::is_none"
86 )]
87 pub provider_options: Option<ProviderOptions>,
88}
89
90#[derive(Debug, Clone)]
92pub struct ImageResult {
93 pub images: Vec<GeneratedImage>,
95 pub warnings: Vec<Warning>,
97 pub usage: Option<ImageUsage>,
99 pub provider_metadata: Option<ProviderMetadata>,
101 pub request: Option<RequestInfo>,
103 pub response: Option<ResponseInfo>,
105}
106
107#[derive(Debug, Clone, Copy, Default, Serialize, Deserialize, PartialEq, Eq)]
112pub struct ImageUsage {
113 #[serde(default, skip_serializing_if = "Option::is_none")]
115 pub input_tokens: Option<u64>,
116 #[serde(default, skip_serializing_if = "Option::is_none")]
118 pub output_tokens: Option<u64>,
119 #[serde(default, skip_serializing_if = "Option::is_none")]
121 pub input_tokens_details: Option<ImageUsageInputDetails>,
122}
123
124#[derive(Debug, Clone, Copy, Default, Serialize, Deserialize, PartialEq, Eq)]
126pub struct ImageUsageInputDetails {
127 #[serde(default, skip_serializing_if = "Option::is_none")]
129 pub text_tokens: Option<u64>,
130 #[serde(default, skip_serializing_if = "Option::is_none")]
132 pub image_tokens: Option<u64>,
133}
134
135#[derive(Debug, Clone)]
137pub struct GeneratedImage {
138 pub bytes: Bytes,
140 pub media_type: String,
142}