async_dashscope/operation/
multi_modal_conversation.rs

1use crate::error::Result;
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 validator = check_model_parameters(&request.model);
47        validator.validate(&request)?;
48
49        let request = request
50            .upload_file_to_oss(self.client.config().api_key().expose_secret())
51            .await?;
52
53        // 发起非流式多模态对话请求。
54        self.client
55            .post(MULTIMODAL_CONVERSATION_PATH, request)
56            .await
57    }
58
59    /// 异步调用流式多媒体对话功能
60    ///
61    /// 此函数用于处理流式多媒体对话请求。流式请求意味着响应会随着时间的推移逐步返回。
62    ///
63    /// # 参数
64    /// * `request`: 多媒体对话参数。
65    ///
66    /// # 返回
67    /// 返回一个流式输出结果,用于逐步处理和接收对话结果。
68    ///
69    /// # 错误
70    /// 如果 `request` 参数中的 `stream` 属性为 `Some(false)`,
71    /// 函数将返回一个错误,提示用户应使用非流式处理的 `call` 方法。
72    pub async fn call_stream(
73        &self,
74        mut request: MultiModalConversationParam,
75    ) -> Result<MultiModalConversationOutputStream> {
76        // 检查请求是否明确设置为非流式,如果是,则返回错误。
77        if request.stream == Some(false) {
78            return Err(DashScopeError::InvalidArgument(
79                "When stream is false, use MultiModalConversation::call".into(),
80            ));
81        }
82
83        // 确保请求参数配置为流式处理
84        request.stream = Some(true);
85
86        // Validate parameters before making the request.
87        let validator = check_model_parameters(&request.model);
88        validator.validate(&request)?;
89
90        // 发起流式请求并返回结果流
91        self.client
92            .post_stream(MULTIMODAL_CONVERSATION_PATH, request)
93            .await
94    }
95}