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