async_dashscope/operation/
multi_modal_conversation.rs

1use 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    /// 异步调用多模态对话功能。
25    ///
26    /// 此函数用于处理非流式多模态对话请求。如果请求参数中设置了流式处理,将返回错误。
27    ///
28    /// # 参数
29    /// * `request`: 包含多模态对话所需参数的请求对象。
30    ///
31    /// # 返回
32    /// * 成功时返回包含多模态对话输出结果的 `Result`。
33    /// * 如果请求参数中设置了 `stream` 为 `true`,将返回 `InvalidArgument` 错误。
34    pub async fn call(
35        &self,
36        request: MultiModalConversationParam,
37    ) -> Result<MultiModalConversationOutput> {
38        // 检查请求是否为流式处理,如果是,则返回错误。
39        if request.stream == Some(true) {
40            return Err(DashScopeError::InvalidArgument(
41                "When stream is true, use MultiModalConversation::call_stream".into(),
42            ));
43        }
44
45        // Validate parameters before making the request.
46        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        // 发起非流式多模态对话请求。
56        self.client
57            .post(MULTIMODAL_CONVERSATION_PATH, request)
58            .await
59    }
60
61    /// 异步调用流式多媒体对话功能
62    ///
63    /// 此函数用于处理流式多媒体对话请求。流式请求意味着响应会随着时间的推移逐步返回。
64    ///
65    /// # 参数
66    /// * `request`: 多媒体对话参数。
67    ///
68    /// # 返回
69    /// 返回一个流式输出结果,用于逐步处理和接收对话结果。
70    ///
71    /// # 错误
72    /// 如果 `request` 参数中的 `stream` 属性为 `Some(false)`,
73    /// 函数将返回一个错误,提示用户应使用非流式处理的 `call` 方法。
74    pub async fn call_stream(
75        &self,
76        mut request: MultiModalConversationParam,
77    ) -> Result<MultiModalConversationOutputStream> {
78        // 检查请求是否明确设置为非流式,如果是,则返回错误。
79        if request.stream == Some(false) {
80            return Err(DashScopeError::InvalidArgument(
81                "When stream is false, use MultiModalConversation::call".into(),
82            ));
83        }
84
85        // 确保请求参数配置为流式处理
86        request.stream = Some(true);
87
88        // Validate parameters before making the request.
89        let validators = check_model_parameters(&request.model);
90        for valid in validators {
91            valid.validate(&request)?;
92        }
93
94        // 发起流式请求并返回结果流
95        self.client
96            .post_stream(MULTIMODAL_CONVERSATION_PATH, request)
97            .await
98    }
99}