async_dashscope/operation/
multi_modal_conversation.rs1use crate::{error::Result, operation::validate::Validator};
2use crate::{Client, error::DashScopeError, operation::validate::check_model_parameters};
3pub use output::*;
4pub use param::{
5 Element, InputBuilder, MessageBuilder, MultiModalConversationParam,
6 MultiModalConversationParamBuilder, MultiModalConversationParamBuilderError,
7};
8use secrecy::ExposeSecret;
9
10mod output;
11mod param;
12
13const MULTIMODAL_CONVERSATION_PATH: &str = "/services/aigc/multimodal-generation/generation";
14
15pub struct MultiModalConversation<'a> {
16 client: &'a Client,
17}
18
19impl<'a> MultiModalConversation<'a> {
20 pub fn new(client: &'a Client) -> Self {
21 Self { client }
22 }
23
24 pub async fn call(
35 &self,
36 request: MultiModalConversationParam,
37 ) -> Result<MultiModalConversationOutput> {
38 if request.stream == Some(true) {
40 return Err(DashScopeError::InvalidArgument(
41 "When stream is true, use MultiModalConversation::call_stream".into(),
42 ));
43 }
44
45 let validators = check_model_parameters(&request.model);
47 for valid in validators {
48 valid.validate(&request)?;
49 }
50
51 let request = request
52 .upload_file_to_oss(self.client.config().api_key().expose_secret())
53 .await?;
54
55 self.client
57 .post(MULTIMODAL_CONVERSATION_PATH, request)
58 .await
59 }
60
61 pub async fn call_stream(
75 &self,
76 mut request: MultiModalConversationParam,
77 ) -> Result<MultiModalConversationOutputStream> {
78 if request.stream == Some(false) {
80 return Err(DashScopeError::InvalidArgument(
81 "When stream is false, use MultiModalConversation::call".into(),
82 ));
83 }
84
85 request.stream = Some(true);
87
88 let validators = check_model_parameters(&request.model);
90 for valid in validators {
91 valid.validate(&request)?;
92 }
93
94 self.client
96 .post_stream(MULTIMODAL_CONVERSATION_PATH, request)
97 .await
98 }
99}