async_dashscope/operation/
common.rs

1use std::collections::HashMap;
2
3use derive_builder::Builder;
4use serde::{Deserialize, Serialize};
5use serde_json::Value;
6
7#[derive(Debug, Clone, Builder, Serialize, Deserialize, PartialEq)]
8pub struct Parameters {
9    /// 返回数据的格式。推荐优先设置为"message"
10    #[builder(setter(into, strip_option))]
11    #[builder(default=None)]
12    pub result_format: Option<String>,
13
14    /// 当您使用翻译模型时需要配置的翻译参数。
15    #[builder(setter(strip_option))]
16    #[builder(default=None)]
17    pub translation_options: Option<TranslationOptions>,
18    // 增量式流式输出
19    #[deprecated(
20        since = "0.5.0",
21        note = "Stream control is now unified under the top-level `stream` parameter in request objects. This parameter will be ignored."
22    )]
23    #[builder(setter(into, strip_option))]
24    #[builder(default=None)]
25    pub incremental_output: Option<bool>,
26
27    #[builder(setter(into, strip_option))]
28    #[builder(default=None)]
29    // function call
30    pub tools: Option<Vec<FunctionCall>>,
31
32    /// 是否开启并行工具调用。参数为true时开启,为false时不开启。并行工具调用详情请参见:[并行工具调用](https://help.aliyun.com/zh/model-studio/qwen-function-calling#cb6b5c484bt4x)。
33    #[builder(setter(into, strip_option))]
34    #[builder(default=None)]
35    pub parallel_tool_calls: Option<bool>,
36
37    // 限制思考长度
38    // 该参数仅支持Qwen3 模型设定。
39    #[builder(setter(into, strip_option))]
40    #[builder(default=None)]
41    pub thinking_budget: Option<usize>,
42
43    // 联网搜索
44    // 仅 Qwen3 商业版模型、QwQ 商业版模型(除了qwq-plus-2025-03-05)支持联网搜索。
45    #[builder(setter(into, strip_option))]
46    #[builder(default=None)]
47    pub enable_search: Option<bool>,
48
49    /// 联网搜索的策略。仅当enable_search为true时生效。
50    #[builder(setter(into, strip_option))]
51    #[builder(default=None)]
52    pub search_options: Option<SearchOptions>,
53
54    /// 只支持 qwen3, 对 QwQ 与 DeepSeek-R1 模型无效。
55    #[builder(setter(into, strip_option))]
56    #[builder(default=None)]
57    pub enable_thinking: Option<bool>,
58
59    #[builder(setter(into, strip_option))]
60    #[builder(default=None)]
61    pub response_format: Option<ResponseFormat>,
62
63    /// 模型生成时连续序列中的重复度。提高repetition_penalty时可以降低模型生成的重复度,1.0表示不做惩罚。没有严格的取值范围,只要大于0即可。
64    #[builder(setter(into, strip_option))]
65    #[builder(default=None)]
66    repetition_penalty: Option<f64>,
67
68    /// 控制模型生成文本时的内容重复度。
69    /// 
70    /// 取值范围:[-2.0, 2.0]。正数会减少重复度,负数会增加重复度。
71    /// 
72    /// 适用场景:
73    /// - 较高的presence_penalty适用于要求多样性、趣味性或创造性的场景,如创意写作或头脑风暴。
74    /// - 较低的presence_penalty适用于要求一致性或专业术语的场景,如技术文档或其他正式文档。
75    #[builder(setter(into, strip_option))]
76    #[builder(default=None)]
77    presence_penalty: Option<f64>,
78
79    /// 是否提高输入图片的默认Token上限。输入图片的默认Token上限为1280,配置为true时输入图片的Token上限为16384。
80    #[builder(setter(into, strip_option))]
81    #[builder(default=None)]
82    vl_high_resolution_images: Option<bool>,
83
84    /// 是否返回图像缩放后的尺寸。模型会对输入的图像进行缩放处理,配置为 True 时会返回图像缩放后的高度和宽度,开启流式输出时,该信息在最后一个数据块(chunk)中返回。支持Qwen-VL模型。
85    #[builder(setter(into, strip_option))]
86    #[builder(default=None)]
87    vl_enable_image_hw_output: Option<bool>,
88
89    /// 是否在图像右下角添加 "Qwen-Image" 水印。默认为 false。
90    #[builder(setter(into, strip_option))]
91    #[builder(default=None)]
92    watermark:Option<bool>,
93
94    /// 反向提示词,用来描述不希望在画面中看到的内容,可以对画面进行限制。
95    /// 支持中英文,长度上限500个字符,每个汉字/字母占一个字符,超过部分会自动截断。
96    /// 
97    /// 示例:低分辨率、错误、最差质量、低质量、残缺、多余的手指、比例不良等。
98    #[builder(setter(into, strip_option))]
99    #[builder(default=None)]
100    negative_prompt: Option<String>,
101
102    /// 随机数种子,取值范围[0,2147483647]。
103    /// 使用相同的seed参数值可使生成内容保持相对稳定。若不提供,算法将自动使用随机数种子。
104    /// 
105    /// **注意**:模型生成过程具有概率性,即使使用相同的seed,也不能保证每次生成结果完全一致。
106    #[builder(setter(into, strip_option))]
107    #[builder(default=None)]
108    seed: Option<i32>,
109}
110
111#[derive(Debug, Clone, Builder, Serialize, Deserialize, PartialEq)]
112pub struct ResponseFormat {
113    #[builder(setter(into, strip_option))]
114    #[serde(rename = "type")]
115    pub type_: String,
116}
117
118impl ParametersBuilder {
119    pub fn functions<V>(&mut self, value: V) -> &mut Self
120    where
121        V: Into<Vec<FunctionCall>>,
122    {
123        self.tools(value)
124    }
125}
126
127#[derive(Debug, Clone, Builder, Serialize, Deserialize, PartialEq)]
128pub struct FunctionCall {
129    #[builder(setter(into, strip_option))]
130    #[serde(rename = "type")]
131    pub typ: Option<String>,
132
133    #[builder(setter(into, strip_option))]
134    #[serde(rename = "function")]
135    pub function: Option<Function>,
136}
137
138#[derive(Debug, Clone, Builder, Serialize, Deserialize, PartialEq)]
139#[builder(setter(into, strip_option))]
140pub struct Function {
141    name: String,
142    #[builder(setter(into, strip_option))]
143    #[builder(default=None)]
144    description: Option<String>,
145    #[builder(setter(into, strip_option))]
146    #[builder(default=None)]
147    parameters: Option<FunctionParameters>,
148}
149
150#[derive(Debug, Clone, Builder, Serialize, Deserialize, PartialEq)]
151pub struct FunctionParameters {
152    #[serde(rename = "type")]
153    pub typ: String,
154    properties: HashMap<String, Value>,
155    required: Option<Vec<String>>,
156}
157
158#[derive(Debug, Clone, Builder, Serialize, Deserialize, PartialEq)]
159#[builder(setter(into, strip_option))]
160pub struct SearchOptions {
161    #[builder(default=None)]
162    pub forced_search: Option<bool>,
163    #[builder(default=None)]
164    pub enable_source: Option<bool>,
165    #[builder(default=None)]
166    pub enable_citation: Option<bool>,
167    #[builder(default=None)]
168    pub citation_format: Option<String>,
169    #[builder(default=None)]
170    pub search_strategy: Option<String>,
171}
172
173#[derive(Debug, Clone, Builder, Serialize, Deserialize, PartialEq)]
174pub struct StreamOptions {
175    pub include_usage: bool,
176}
177
178#[derive(Debug, Clone, Builder, Serialize, Deserialize, PartialEq)]
179pub struct TranslationOptions {
180    #[builder(setter(into))]
181    pub source_lang: String,
182    #[builder(setter(into))]
183    pub target_lang: String,
184    #[builder(setter(into, strip_option))]
185    #[builder(default=None)]
186    pub terms: Option<Vec<Term>>,
187}
188
189#[derive(Debug, Clone, Builder, Serialize, Deserialize, PartialEq)]
190pub struct Term {
191    pub source: String,
192    pub target: String,
193}
194
195#[derive(Serialize, Deserialize, Debug, Clone)]
196pub struct Usage {
197    /// 用户输入内容转换成token后的长度。
198    #[serde(skip_serializing_if = "Option::is_none")]
199    pub input_tokens: Option<i32>,
200
201    /// chat请求返回内容转换成token后的长度。
202    #[serde(skip_serializing_if = "Option::is_none")]
203    pub output_tokens: Option<i32>,
204
205    /// 当输入为纯文本时返回该字段,为input_tokens与output_tokens之和。
206    #[serde(skip_serializing_if = "Option::is_none")]
207    pub total_tokens: Option<i32>,
208
209    /// 输入内容包含image时返回该字段。为用户输入图片内容转换成token后的长度。
210    #[serde(skip_serializing_if = "Option::is_none")]
211    pub image_tokens: Option<i32>,
212
213    /// 输入内容包含video时返回该字段。为用户输入视频内容转换成token后的长度。
214    #[serde(skip_serializing_if = "Option::is_none")]
215    pub video_tokens: Option<i32>,
216
217    /// 输入内容包含audio时返回该字段。为用户输入音频内容转换成token后的长度。
218    #[serde(skip_serializing_if = "Option::is_none")]
219    pub audio_tokens: Option<i32>,
220
221    /// 输入 Token 的细粒度分类。
222    #[serde(skip_serializing_if = "Option::is_none")]
223    pub prompt_tokens_details: Option<PromptTokensDetails>,
224
225    /// Audio 输入的 Token 消耗信息
226    #[serde(skip_serializing_if = "Option::is_none")]
227    pub input_tokens_details: Option<InputTokensDetails>,
228    /// Audio 输出的 Token 消耗信息
229    #[serde(skip_serializing_if = "Option::is_none")]
230    pub output_tokens_details: Option<OutputTokensDetails>,
231}
232
233#[derive(Serialize, Deserialize, Debug, Clone)]
234pub struct InputTokensDetails {
235    text_tokens: Option<i32>,
236}
237#[derive(Serialize, Deserialize, Debug, Clone)]
238pub struct OutputTokensDetails {
239    audio_tokens: Option<i32>,
240    text_tokens: Option<i32>,
241}
242#[derive(Serialize, Deserialize, Debug, Clone)]
243pub struct PromptTokensDetails {
244    /// 命中 Cache 的 Token 数。Context Cache 详情请参见上下文缓存[(Context Cache)](https://help.aliyun.com/zh/model-studio/user-guide/context-cache?spm=a2c4g.11186623.0.0.37a0453aeh9s1L)。
245    pub prompt_tokens: Option<i32>,
246}