use crate::{error::Result, operation::validate::Validator};
use crate::{Client, error::DashScopeError, operation::validate::check_model_parameters};
pub use output::*;
pub use param::{
Element, InputBuilder, MessageBuilder, MultiModalConversationParam,
MultiModalConversationParamBuilder, MultiModalConversationParamBuilderError,
};
use secrecy::ExposeSecret;
mod output;
mod param;
const MULTIMODAL_CONVERSATION_PATH: &str = "/services/aigc/multimodal-generation/generation";
pub struct MultiModalConversation<'a> {
client: &'a Client,
}
impl<'a> MultiModalConversation<'a> {
pub fn new(client: &'a Client) -> Self {
Self { client }
}
pub async fn call(
&self,
request: MultiModalConversationParam,
) -> Result<MultiModalConversationOutput> {
if request.stream == Some(true) {
return Err(DashScopeError::InvalidArgument(
"When stream is true, use MultiModalConversation::call_stream".into(),
));
}
let validators = check_model_parameters(&request.model);
for valid in validators {
valid.validate(&request)?;
}
let request = request
.upload_file_to_oss(self.client.config().api_key().expose_secret())
.await?;
self.client
.post(MULTIMODAL_CONVERSATION_PATH, request)
.await
}
pub async fn call_stream(
&self,
mut request: MultiModalConversationParam,
) -> Result<MultiModalConversationOutputStream> {
if request.stream == Some(false) {
return Err(DashScopeError::InvalidArgument(
"When stream is false, use MultiModalConversation::call".into(),
));
}
request.stream = Some(true);
let validators = check_model_parameters(&request.model);
for valid in validators {
valid.validate(&request)?;
}
self.client
.post_stream(MULTIMODAL_CONVERSATION_PATH, request)
.await
}
}