Codex Handbook
ext/image-generation/src/backend.rs 60 lines
use codex_api::ImageEditRequest;use codex_api::ImageGenerationRequest;use codex_api::ImageResponse;use codex_api::ImagesClient;use codex_api::ReqwestTransport;use codex_login::default_client::build_reqwest_client;use codex_model_provider::SharedModelProvider;use http::HeaderMap;#[derive(Clone)]pub(crate) struct CodexImagesBackend {    provider: SharedModelProvider,}impl CodexImagesBackend {    /// Creates a backend that sends image requests through the active model provider.    pub(crate) fn new(provider: SharedModelProvider) -> Self {        Self { provider }    }    /// Resolves the provider and auth required for the current image API request.    async fn client(&self) -> Result<ImagesClient<ReqwestTransport>, String> {        let provider = self            .provider            .api_provider()            .await            .map_err(|err| err.to_string())?;        let auth = self            .provider            .api_auth()            .await            .map_err(|err| err.to_string())?;        Ok(ImagesClient::new(            ReqwestTransport::new(build_reqwest_client()),            provider,            auth,        ))    }    /// Sends a standalone image generation request through the configured Images client.    pub(crate) async fn generate(        &self,        request: ImageGenerationRequest,    ) -> Result<ImageResponse, String> {        self.client()            .await?            .generate(&request, HeaderMap::new())            .await            .map_err(|err| err.to_string())    }    /// Sends a standalone image edit request through the configured Images client.    pub(crate) async fn edit(&self, request: ImageEditRequest) -> Result<ImageResponse, String> {        self.client()            .await?            .edit(&request, HeaderMap::new())            .await            .map_err(|err| err.to_string())    }}