async_dashscope/operation/
multi_modal_conversation.rs

1use crate::error::Result;
2use crate::{error::DashScopeError, Client};
3pub use output::*;
4pub use param::{
5    InputBuilder, MessageBuilder, MultiModalConversationParam, MultiModalConversationParamBuilder,
6    MultiModalConversationParamBuilderError,
7};
8
9use super::common::ParametersBuilder;
10mod output;
11mod param;
12
13pub struct MultiModalConversation<'a> {
14    client: &'a Client,
15}
16
17impl<'a> MultiModalConversation<'a> {
18    pub fn new(client: &'a Client) -> Self {
19        Self { client }
20    }
21
22    /// 异步调用多模态对话功能。
23    ///
24    /// 此函数用于处理非流式多模态对话请求。如果请求参数中设置了流式处理,将返回错误。
25    ///
26    /// # 参数
27    /// * `request`: 包含多模态对话所需参数的请求对象。
28    ///
29    /// # 返回
30    /// * 成功时返回包含多模态对话输出结果的 `Result`。
31    /// * 如果请求参数中设置了 `stream` 为 `true`,将返回 `InvalidArgument` 错误。
32    pub async fn call(
33        &self,
34        request: MultiModalConversationParam,
35    ) -> Result<MultiModalConversationOutput> {
36        // 检查请求是否为流式处理,如果是,则返回错误。
37        if request.stream == Some(true) {
38            return Err(DashScopeError::InvalidArgument(
39                "When stream is true, use MultiModalGeneration::call_stream".into(),
40            ));
41        }
42
43        // 检查请求参数是否设置为流式处理,如果是,则返回错误。
44        if request.parameters.is_some() {
45            if let Some(ref parameters) = request.parameters {
46                if parameters.incremental_output == Some(true) {
47                    return Err(DashScopeError::InvalidArgument(
48                        "When stream is true, use MultiModalGeneration::call_stream".into(),
49                    ));
50                }
51            }
52        }
53
54        // 发起非流式多模态对话请求。
55        self.client
56            .post("/services/aigc/multimodal-generation/generation", request)
57            .await
58    }
59
60    /// 异步调用流式多媒体对话功能
61    ///
62    /// 此函数用于处理流式多媒体对话请求。它要求请求必须是流式请求,
63    /// 并且如果请求参数中指定了非流式处理,则会返回错误。
64    /// 如果请求参数未设置或未明确指定流式处理,函数将自动设置为流式处理。
65    ///
66    /// # 参数
67    /// * `request`: 多媒体对话参数,包括是否为流式请求和其他配置参数
68    ///
69    /// # 返回
70    /// 返回一个流式输出结果,用于逐步处理和接收对话结果
71    ///
72    /// # 错误
73    /// 如果请求不是流式请求或参数配置与流式请求冲突,则返回无效参数错误
74    pub async fn call_stream(
75        &self,
76        mut request: MultiModalConversationParam,
77    ) -> Result<MultiModalConversationOutputStream> {
78        // 检查请求是否为流式请求,如果不是,则返回错误提示使用非流式调用
79        if request.stream != Some(true) {
80            return Err(DashScopeError::InvalidArgument(
81                "When stream is false, use MultiModalGeneration::call".into(),
82            ));
83        }
84
85        // 如果请求中包含参数配置,进一步检查是否与流式请求冲突
86        if request.parameters.is_some() {
87            if let Some(ref parameters) = request.parameters {
88                // 如果参数中指定了非流式处理,则返回错误提示使用非流式调用
89                if parameters.incremental_output == Some(false) {
90                    return Err(DashScopeError::InvalidArgument(
91                        "When stream is false, use MultiModalGeneration::call".into(),
92                    ));
93                }
94            }
95        }
96
97        // 确保请求参数配置为流式处理
98        request.parameters = Some(
99            ParametersBuilder::default()
100                .incremental_output(true)
101                .build()?,
102        );
103
104        // 发起流式请求并返回结果流
105        Ok(self
106            .client
107            .post_stream("/services/aigc/multimodal-generation/generation", request)
108            .await)
109    }
110}