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
90#[derive(Debug, Clone, Builder, Serialize, Deserialize, PartialEq)]
91pub struct ResponseFormat {
92    #[builder(setter(into, strip_option))]
93    #[serde(rename = "type")]
94    pub type_: String,
95}
96
97impl ParametersBuilder {
98    pub fn functions<V>(&mut self, value: V) -> &mut Self
99    where
100        V: Into<Vec<FunctionCall>>,
101    {
102        self.tools(value)
103    }
104}
105
106#[derive(Debug, Clone, Builder, Serialize, Deserialize, PartialEq)]
107pub struct FunctionCall {
108    #[builder(setter(into, strip_option))]
109    #[serde(rename = "type")]
110    pub typ: Option<String>,
111
112    #[builder(setter(into, strip_option))]
113    #[serde(rename = "function")]
114    pub function: Option<Function>,
115}
116
117#[derive(Debug, Clone, Builder, Serialize, Deserialize, PartialEq)]
118#[builder(setter(into, strip_option))]
119pub struct Function {
120    name: String,
121    #[builder(setter(into, strip_option))]
122    #[builder(default=None)]
123    description: Option<String>,
124    #[builder(setter(into, strip_option))]
125    #[builder(default=None)]
126    parameters: Option<FunctionParameters>,
127}
128
129#[derive(Debug, Clone, Builder, Serialize, Deserialize, PartialEq)]
130pub struct FunctionParameters {
131    #[serde(rename = "type")]
132    pub typ: String,
133    properties: HashMap<String, Value>,
134    required: Option<Vec<String>>,
135}
136
137#[derive(Debug, Clone, Builder, Serialize, Deserialize, PartialEq)]
138#[builder(setter(into, strip_option))]
139pub struct SearchOptions {
140    #[builder(default=None)]
141    pub forced_search: Option<bool>,
142    #[builder(default=None)]
143    pub enable_source: Option<bool>,
144    #[builder(default=None)]
145    pub enable_citation: Option<bool>,
146    #[builder(default=None)]
147    pub citation_format: Option<String>,
148    #[builder(default=None)]
149    pub search_strategy: Option<String>,
150}
151
152#[derive(Debug, Clone, Builder, Serialize, Deserialize, PartialEq)]
153pub struct StreamOptions {
154    pub include_usage: bool,
155}
156
157#[derive(Debug, Clone, Builder, Serialize, Deserialize, PartialEq)]
158pub struct TranslationOptions {
159    #[builder(setter(into))]
160    pub source_lang: String,
161    #[builder(setter(into))]
162    pub target_lang: String,
163    #[builder(setter(into, strip_option))]
164    #[builder(default=None)]
165    pub terms: Option<Vec<Term>>,
166}
167
168#[derive(Debug, Clone, Builder, Serialize, Deserialize, PartialEq)]
169pub struct Term {
170    pub source: String,
171    pub target: String,
172}
173
174#[derive(Serialize, Deserialize, Debug, Clone)]
175pub struct Usage {
176    /// 用户输入内容转换成token后的长度。
177    #[serde(skip_serializing_if = "Option::is_none")]
178    pub input_tokens: Option<i32>,
179
180    /// chat请求返回内容转换成token后的长度。
181    #[serde(skip_serializing_if = "Option::is_none")]
182    pub output_tokens: Option<i32>,
183
184    /// 当输入为纯文本时返回该字段,为input_tokens与output_tokens之和。
185    #[serde(skip_serializing_if = "Option::is_none")]
186    pub total_tokens: Option<i32>,
187
188    /// 输入内容包含image时返回该字段。为用户输入图片内容转换成token后的长度。
189    #[serde(skip_serializing_if = "Option::is_none")]
190    pub image_tokens: Option<i32>,
191
192    /// 输入内容包含video时返回该字段。为用户输入视频内容转换成token后的长度。
193    #[serde(skip_serializing_if = "Option::is_none")]
194    pub video_tokens: Option<i32>,
195
196    /// 输入内容包含audio时返回该字段。为用户输入音频内容转换成token后的长度。
197    #[serde(skip_serializing_if = "Option::is_none")]
198    pub audio_tokens: Option<i32>,
199
200    /// 输入 Token 的细粒度分类。
201    #[serde(skip_serializing_if = "Option::is_none")]
202    pub prompt_tokens_details: Option<PromptTokensDetails>,
203
204    /// Audio 输入的 Token 消耗信息
205    #[serde(skip_serializing_if = "Option::is_none")]
206    pub input_tokens_details: Option<InputTokensDetails>,
207    /// Audio 输出的 Token 消耗信息
208    #[serde(skip_serializing_if = "Option::is_none")]
209    pub output_tokens_details: Option<OutputTokensDetails>,
210}
211
212#[derive(Serialize, Deserialize, Debug, Clone)]
213pub struct InputTokensDetails {
214    text_tokens: Option<i32>,
215}
216#[derive(Serialize, Deserialize, Debug, Clone)]
217pub struct OutputTokensDetails {
218    audio_tokens: Option<i32>,
219    text_tokens: Option<i32>,
220}
221#[derive(Serialize, Deserialize, Debug, Clone)]
222pub struct PromptTokensDetails {
223    /// 命中 Cache 的 Token 数。Context Cache 详情请参见上下文缓存[(Context Cache)](https://help.aliyun.com/zh/model-studio/user-guide/context-cache?spm=a2c4g.11186623.0.0.37a0453aeh9s1L)。
224    pub prompt_tokens: Option<i32>,
225}