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    #[builder(setter(into, strip_option))]
10    #[builder(default=None)]
11    pub result_format: Option<String>,
12    #[builder(setter(strip_option))]
13    #[builder(default=None)]
14    pub translation_options: Option<TranslationOptions>,
15    // 增量式流式输出
16    #[deprecated(
17        since = "0.5.0",
18        note = "Stream control is now unified under the top-level `stream` parameter in request objects. This parameter will be ignored."
19    )]
20    #[builder(setter(into, strip_option))]
21    #[builder(default=None)]
22    pub incremental_output: Option<bool>,
23
24    #[builder(setter(into, strip_option))]
25    #[builder(default=None)]
26    // function call
27    pub tools: Option<Vec<FunctionCall>>,
28
29    #[builder(setter(into, strip_option))]
30    #[builder(default=None)]
31    pub parallel_tool_calls: Option<bool>,
32
33    // 限制思考长度
34    // 该参数仅支持Qwen3 模型设定。
35    #[builder(setter(into, strip_option))]
36    #[builder(default=None)]
37    pub thinking_budget: Option<usize>,
38
39    // 联网搜索
40    // 仅 Qwen3 商业版模型、QwQ 商业版模型(除了qwq-plus-2025-03-05)支持联网搜索。
41    #[builder(setter(into, strip_option))]
42    #[builder(default=None)]
43    pub enable_search: Option<bool>,
44
45    #[builder(setter(into, strip_option))]
46    #[builder(default=None)]
47    pub search_options: Option<SearchOptions>,
48
49    // 只支持 qwen3, 对 QwQ 与 DeepSeek-R1 模型无效。
50    #[builder(setter(into, strip_option))]
51    #[builder(default=None)]
52    pub enable_thinking: Option<bool>,
53
54    #[builder(setter(into, strip_option))]
55    #[builder(default=None)]
56    pub response_format: Option<ResponseFormat>,
57}
58
59#[derive(Debug, Clone, Builder, Serialize, Deserialize, PartialEq)]
60pub struct ResponseFormat {
61    #[builder(setter(into, strip_option))]
62    #[serde(rename = "type")]
63    pub type_: String,
64}
65
66impl ParametersBuilder {
67    pub fn functions<V>(&mut self, value: V) -> &mut Self
68    where
69        V: Into<Vec<FunctionCall>>,
70    {
71        self.tools(value)
72    }
73}
74
75#[derive(Debug, Clone, Builder, Serialize, Deserialize, PartialEq)]
76pub struct FunctionCall {
77    #[builder(setter(into, strip_option))]
78    #[serde(rename = "type")]
79    pub typ: Option<String>,
80
81    #[builder(setter(into, strip_option))]
82    #[serde(rename = "function")]
83    pub function: Option<Function>,
84}
85
86#[derive(Debug, Clone, Builder, Serialize, Deserialize, PartialEq)]
87#[builder(setter(into, strip_option))]
88pub struct Function {
89    name: String,
90    #[builder(setter(into, strip_option))]
91    #[builder(default=None)]
92    description: Option<String>,
93    #[builder(setter(into, strip_option))]
94    #[builder(default=None)]
95    parameters: Option<FunctionParameters>,
96}
97
98#[derive(Debug, Clone, Builder, Serialize, Deserialize, PartialEq)]
99pub struct FunctionParameters {
100    #[serde(rename = "type")]
101    pub typ: String,
102    properties: HashMap<String, Value>,
103    required: Option<Vec<String>>,
104}
105
106#[derive(Debug, Clone, Builder, Serialize, Deserialize, PartialEq)]
107#[builder(setter(into, strip_option))]
108pub struct SearchOptions {
109    #[builder(default=None)]
110    pub forced_search: Option<bool>,
111    #[builder(default=None)]
112    pub enable_source: Option<bool>,
113    #[builder(default=None)]
114    pub enable_citation: Option<bool>,
115    #[builder(default=None)]
116    pub citation_format: Option<String>,
117    #[builder(default=None)]
118    pub search_strategy: Option<String>,
119}
120
121#[derive(Debug, Clone, Builder, Serialize, Deserialize, PartialEq)]
122pub struct StreamOptions {
123    pub include_usage: bool,
124}
125
126#[derive(Debug, Clone, Builder, Serialize, Deserialize, PartialEq)]
127pub struct TranslationOptions {
128    #[builder(setter(into))]
129    pub source_lang: String,
130    #[builder(setter(into))]
131    pub target_lang: String,
132    #[builder(setter(into, strip_option))]
133    #[builder(default=None)]
134    pub terms: Option<Vec<Term>>,
135}
136
137#[derive(Debug, Clone, Builder, Serialize, Deserialize, PartialEq)]
138pub struct Term {
139    pub source: String,
140    pub target: String,
141}
142
143#[derive(Serialize, Deserialize, Debug, Clone)]
144pub struct Usage {
145    /// 用户输入内容转换成token后的长度。
146    #[serde(skip_serializing_if = "Option::is_none")]
147    pub input_tokens: Option<i32>,
148
149    /// chat请求返回内容转换成token后的长度。
150    #[serde(skip_serializing_if = "Option::is_none")]
151    pub output_tokens: Option<i32>,
152
153    /// 当输入为纯文本时返回该字段,为input_tokens与output_tokens之和。
154    #[serde(skip_serializing_if = "Option::is_none")]
155    pub total_tokens: Option<i32>,
156
157    /// 输入内容包含image时返回该字段。为用户输入图片内容转换成token后的长度。
158    #[serde(skip_serializing_if = "Option::is_none")]
159    pub image_tokens: Option<i32>,
160
161    /// 输入内容包含video时返回该字段。为用户输入视频内容转换成token后的长度。
162    #[serde(skip_serializing_if = "Option::is_none")]
163    pub video_tokens: Option<i32>,
164
165    /// 输入内容包含audio时返回该字段。为用户输入音频内容转换成token后的长度。
166    #[serde(skip_serializing_if = "Option::is_none")]
167    pub audio_tokens: Option<i32>,
168
169    /// 输入 Token 的细粒度分类。
170    #[serde(skip_serializing_if = "Option::is_none")]
171    pub prompt_tokens_details: Option<PromptTokensDetails>,
172
173    /// Audio 输入的 Token 消耗信息
174    #[serde(skip_serializing_if = "Option::is_none")]
175    pub input_tokens_details: Option<InputTokensDetails>,
176    /// Audio 输出的 Token 消耗信息
177    #[serde(skip_serializing_if = "Option::is_none")]
178    pub output_tokens_details: Option<OutputTokensDetails>,
179}
180
181#[derive(Serialize, Deserialize, Debug, Clone)]
182pub struct InputTokensDetails {
183    text_tokens: Option<i32>,
184}
185#[derive(Serialize, Deserialize, Debug, Clone)]
186pub struct OutputTokensDetails {
187    audio_tokens: Option<i32>,
188    text_tokens: Option<i32>,
189}
190#[derive(Serialize, Deserialize, Debug, Clone)]
191pub struct PromptTokensDetails {
192    /// 命中 Cache 的 Token 数。Context Cache 详情请参见上下文缓存[(Context Cache)](https://help.aliyun.com/zh/model-studio/user-guide/context-cache?spm=a2c4g.11186623.0.0.37a0453aeh9s1L)。
193    pub prompt_tokens: Option<i32>,
194}