dashscope 1.8.0__py3-none-any.whl → 1.25.6__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- dashscope/__init__.py +61 -14
- dashscope/aigc/__init__.py +10 -3
- dashscope/aigc/chat_completion.py +282 -0
- dashscope/aigc/code_generation.py +145 -0
- dashscope/aigc/conversation.py +71 -12
- dashscope/aigc/generation.py +288 -16
- dashscope/aigc/image_synthesis.py +473 -31
- dashscope/aigc/multimodal_conversation.py +299 -14
- dashscope/aigc/video_synthesis.py +610 -0
- dashscope/api_entities/aiohttp_request.py +8 -5
- dashscope/api_entities/api_request_data.py +4 -2
- dashscope/api_entities/api_request_factory.py +68 -20
- dashscope/api_entities/base_request.py +20 -3
- dashscope/api_entities/chat_completion_types.py +344 -0
- dashscope/api_entities/dashscope_response.py +243 -15
- dashscope/api_entities/encryption.py +179 -0
- dashscope/api_entities/http_request.py +216 -62
- dashscope/api_entities/websocket_request.py +43 -34
- dashscope/app/__init__.py +5 -0
- dashscope/app/application.py +203 -0
- dashscope/app/application_response.py +246 -0
- dashscope/assistants/__init__.py +16 -0
- dashscope/assistants/assistant_types.py +175 -0
- dashscope/assistants/assistants.py +311 -0
- dashscope/assistants/files.py +197 -0
- dashscope/audio/__init__.py +4 -2
- dashscope/audio/asr/__init__.py +17 -1
- dashscope/audio/asr/asr_phrase_manager.py +203 -0
- dashscope/audio/asr/recognition.py +167 -27
- dashscope/audio/asr/transcription.py +107 -14
- dashscope/audio/asr/translation_recognizer.py +1006 -0
- dashscope/audio/asr/vocabulary.py +177 -0
- dashscope/audio/qwen_asr/__init__.py +7 -0
- dashscope/audio/qwen_asr/qwen_transcription.py +189 -0
- dashscope/audio/qwen_omni/__init__.py +11 -0
- dashscope/audio/qwen_omni/omni_realtime.py +524 -0
- dashscope/audio/qwen_tts/__init__.py +5 -0
- dashscope/audio/qwen_tts/speech_synthesizer.py +77 -0
- dashscope/audio/qwen_tts_realtime/__init__.py +10 -0
- dashscope/audio/qwen_tts_realtime/qwen_tts_realtime.py +355 -0
- dashscope/audio/tts/__init__.py +2 -0
- dashscope/audio/tts/speech_synthesizer.py +5 -0
- dashscope/audio/tts_v2/__init__.py +12 -0
- dashscope/audio/tts_v2/enrollment.py +179 -0
- dashscope/audio/tts_v2/speech_synthesizer.py +886 -0
- dashscope/cli.py +157 -37
- dashscope/client/base_api.py +652 -87
- dashscope/common/api_key.py +2 -0
- dashscope/common/base_type.py +135 -0
- dashscope/common/constants.py +13 -16
- dashscope/common/env.py +2 -0
- dashscope/common/error.py +58 -22
- dashscope/common/logging.py +2 -0
- dashscope/common/message_manager.py +2 -0
- dashscope/common/utils.py +276 -46
- dashscope/customize/__init__.py +0 -0
- dashscope/customize/customize_types.py +192 -0
- dashscope/customize/deployments.py +146 -0
- dashscope/customize/finetunes.py +234 -0
- dashscope/embeddings/__init__.py +5 -1
- dashscope/embeddings/batch_text_embedding.py +208 -0
- dashscope/embeddings/batch_text_embedding_response.py +65 -0
- dashscope/embeddings/multimodal_embedding.py +118 -10
- dashscope/embeddings/text_embedding.py +13 -1
- dashscope/{file.py → files.py} +19 -4
- dashscope/io/input_output.py +2 -0
- dashscope/model.py +11 -2
- dashscope/models.py +43 -0
- dashscope/multimodal/__init__.py +20 -0
- dashscope/multimodal/dialog_state.py +56 -0
- dashscope/multimodal/multimodal_constants.py +28 -0
- dashscope/multimodal/multimodal_dialog.py +648 -0
- dashscope/multimodal/multimodal_request_params.py +313 -0
- dashscope/multimodal/tingwu/__init__.py +10 -0
- dashscope/multimodal/tingwu/tingwu.py +80 -0
- dashscope/multimodal/tingwu/tingwu_realtime.py +579 -0
- dashscope/nlp/__init__.py +0 -0
- dashscope/nlp/understanding.py +64 -0
- dashscope/protocol/websocket.py +3 -0
- dashscope/rerank/__init__.py +0 -0
- dashscope/rerank/text_rerank.py +69 -0
- dashscope/resources/qwen.tiktoken +151643 -0
- dashscope/threads/__init__.py +26 -0
- dashscope/threads/messages/__init__.py +0 -0
- dashscope/threads/messages/files.py +113 -0
- dashscope/threads/messages/messages.py +220 -0
- dashscope/threads/runs/__init__.py +0 -0
- dashscope/threads/runs/runs.py +501 -0
- dashscope/threads/runs/steps.py +112 -0
- dashscope/threads/thread_types.py +665 -0
- dashscope/threads/threads.py +212 -0
- dashscope/tokenizers/__init__.py +7 -0
- dashscope/tokenizers/qwen_tokenizer.py +111 -0
- dashscope/tokenizers/tokenization.py +125 -0
- dashscope/tokenizers/tokenizer.py +45 -0
- dashscope/tokenizers/tokenizer_base.py +32 -0
- dashscope/utils/__init__.py +0 -0
- dashscope/utils/message_utils.py +838 -0
- dashscope/utils/oss_utils.py +243 -0
- dashscope/utils/param_utils.py +29 -0
- dashscope/version.py +3 -1
- {dashscope-1.8.0.dist-info → dashscope-1.25.6.dist-info}/METADATA +53 -50
- dashscope-1.25.6.dist-info/RECORD +112 -0
- {dashscope-1.8.0.dist-info → dashscope-1.25.6.dist-info}/WHEEL +1 -1
- {dashscope-1.8.0.dist-info → dashscope-1.25.6.dist-info}/entry_points.txt +0 -1
- {dashscope-1.8.0.dist-info → dashscope-1.25.6.dist-info/licenses}/LICENSE +2 -4
- dashscope/deployment.py +0 -129
- dashscope/finetune.py +0 -149
- dashscope-1.8.0.dist-info/RECORD +0 -49
- {dashscope-1.8.0.dist-info → dashscope-1.25.6.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
from dataclasses import dataclass, field, asdict
|
|
2
|
+
import uuid
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
def get_random_uuid() -> str:
|
|
6
|
+
"""生成并返回32位UUID字符串"""
|
|
7
|
+
return uuid.uuid4().hex
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
@dataclass
|
|
11
|
+
class DashHeader:
|
|
12
|
+
action: str
|
|
13
|
+
task_id: str = field(default=get_random_uuid())
|
|
14
|
+
streaming: str = field(default="duplex") # 默认为 duplex
|
|
15
|
+
|
|
16
|
+
def to_dict(self):
|
|
17
|
+
return {
|
|
18
|
+
"action": self.action,
|
|
19
|
+
"task_id": self.task_id,
|
|
20
|
+
"request_id": self.task_id,
|
|
21
|
+
"streaming": self.streaming
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class DashPayloadParameters:
|
|
26
|
+
def to_dict(self):
|
|
27
|
+
pass
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class DashPayloadInput:
|
|
31
|
+
def to_dict(self):
|
|
32
|
+
pass
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
@dataclass
|
|
36
|
+
class DashPayload:
|
|
37
|
+
task_group: str = field(default="aigc")
|
|
38
|
+
function: str = field(default="generation")
|
|
39
|
+
model: str = field(default="")
|
|
40
|
+
task: str = field(default="multimodal-generation")
|
|
41
|
+
parameters: DashPayloadParameters = field(default=None)
|
|
42
|
+
input: DashPayloadInput = field(default=None)
|
|
43
|
+
|
|
44
|
+
def to_dict(self):
|
|
45
|
+
payload = {
|
|
46
|
+
"task_group": self.task_group,
|
|
47
|
+
"function": self.function,
|
|
48
|
+
"model": self.model,
|
|
49
|
+
"task": self.task,
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
if self.parameters is not None:
|
|
53
|
+
payload["parameters"] = self.parameters.to_dict()
|
|
54
|
+
|
|
55
|
+
if self.input is not None:
|
|
56
|
+
payload["input"] = self.input.to_dict()
|
|
57
|
+
|
|
58
|
+
return payload
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
@dataclass
|
|
62
|
+
class RequestBodyInput(DashPayloadInput):
|
|
63
|
+
workspace_id: str
|
|
64
|
+
app_id: str
|
|
65
|
+
directive: str
|
|
66
|
+
dialog_id: str
|
|
67
|
+
|
|
68
|
+
def to_dict(self):
|
|
69
|
+
return {
|
|
70
|
+
"workspace_id": self.workspace_id,
|
|
71
|
+
"app_id": self.app_id,
|
|
72
|
+
"directive": self.directive,
|
|
73
|
+
"dialog_id": self.dialog_id
|
|
74
|
+
}
|
|
75
|
+
@dataclass
|
|
76
|
+
class AsrPostProcessing:
|
|
77
|
+
replace_words: list = field(default=None)
|
|
78
|
+
|
|
79
|
+
def to_dict(self):
|
|
80
|
+
if self.replace_words is None:
|
|
81
|
+
return None
|
|
82
|
+
if len(self.replace_words) == 0:
|
|
83
|
+
return None
|
|
84
|
+
return {
|
|
85
|
+
"replace_words": [word.to_dict() for word in self.replace_words]
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
@dataclass
|
|
89
|
+
class ReplaceWord:
|
|
90
|
+
source: str = field(default=None)
|
|
91
|
+
target: str = field(default=None)
|
|
92
|
+
match_mode: str = field(default=None)
|
|
93
|
+
|
|
94
|
+
def to_dict(self):
|
|
95
|
+
return {
|
|
96
|
+
"source": self.source,
|
|
97
|
+
"target": self.target,
|
|
98
|
+
"match_mode": self.match_mode
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
@dataclass
|
|
102
|
+
class Upstream:
|
|
103
|
+
"""struct for upstream"""
|
|
104
|
+
audio_format: str = field(default="pcm") # 上行语音格式,默认pcm.支持pcm/opus
|
|
105
|
+
type: str = field(default="AudioOnly") # 上行类型:AudioOnly 仅语音通话; AudioAndVideo 上传视频
|
|
106
|
+
mode: str = field(default="tap2talk") # 客户端交互模式 push2talk/tap2talk/duplex
|
|
107
|
+
sample_rate: int = field(default=16000) # 音频采样率
|
|
108
|
+
vocabulary_id: str = field(default=None)
|
|
109
|
+
asr_post_processing: AsrPostProcessing = field(default=None)
|
|
110
|
+
pass_through_params: dict = field(default=None)
|
|
111
|
+
|
|
112
|
+
def to_dict(self):
|
|
113
|
+
upstream: dict = {
|
|
114
|
+
"type": self.type,
|
|
115
|
+
"mode": self.mode,
|
|
116
|
+
"audio_format": self.audio_format,
|
|
117
|
+
"sample_rate": self.sample_rate,
|
|
118
|
+
"vocabulary_id": self.vocabulary_id,
|
|
119
|
+
}
|
|
120
|
+
if self.asr_post_processing is not None:
|
|
121
|
+
upstream["asr_post_processing"] = self.asr_post_processing.to_dict()
|
|
122
|
+
|
|
123
|
+
if self.pass_through_params is not None:
|
|
124
|
+
upstream.update(self.pass_through_params)
|
|
125
|
+
return upstream
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
@dataclass
|
|
129
|
+
class Downstream:
|
|
130
|
+
# transcript 返回用户语音识别结果
|
|
131
|
+
# dialog 返回对话系统回答中间结果
|
|
132
|
+
# 可以设置多种,以逗号分割,默认为transcript
|
|
133
|
+
voice: str = field(default="") # 语音音色
|
|
134
|
+
sample_rate: int = field(default=0) # 语音音色 # 合成音频采样率
|
|
135
|
+
intermediate_text: str = field(default="transcript") # 控制返回给用户那些中间文本:
|
|
136
|
+
debug: bool = field(default=False) # 控制是否返回debug信息
|
|
137
|
+
# type_: str = field(default="Audio", metadata={"alias": "type"}) # 下行类型:Text:不需要下发语音;Audio:输出语音,默认值
|
|
138
|
+
audio_format: str = field(default="pcm") # 下行语音格式,默认pcm 。支持pcm/mp3
|
|
139
|
+
volume: int = field(default=50) # 语音音量 0-100
|
|
140
|
+
pitch_rate: int = field(default=100) # 语音语调 50-200
|
|
141
|
+
speech_rate: int = field(default=100) # 语音语速 50-200
|
|
142
|
+
pass_through_params: dict = field(default=None)
|
|
143
|
+
|
|
144
|
+
def to_dict(self):
|
|
145
|
+
stream: dict = {
|
|
146
|
+
"intermediate_text": self.intermediate_text,
|
|
147
|
+
"debug": self.debug,
|
|
148
|
+
# "type": self.type_,
|
|
149
|
+
"audio_format": self.audio_format,
|
|
150
|
+
"volume": self.volume,
|
|
151
|
+
"pitch_rate": self.pitch_rate,
|
|
152
|
+
"speech_rate": self.speech_rate
|
|
153
|
+
}
|
|
154
|
+
if self.voice != "":
|
|
155
|
+
stream["voice"] = self.voice
|
|
156
|
+
if self.sample_rate != 0:
|
|
157
|
+
stream["sample_rate"] = self.sample_rate
|
|
158
|
+
if self.pass_through_params is not None:
|
|
159
|
+
stream.update(self.pass_through_params)
|
|
160
|
+
return stream
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
@dataclass
|
|
164
|
+
class DialogAttributes:
|
|
165
|
+
agent_id: str = field(default=None)
|
|
166
|
+
prompt: str = field(default=None)
|
|
167
|
+
vocabulary_id: str = field(default=None)
|
|
168
|
+
|
|
169
|
+
def to_dict(self):
|
|
170
|
+
return {
|
|
171
|
+
"agent_id": self.agent_id,
|
|
172
|
+
"prompt": self.prompt,
|
|
173
|
+
"vocabulary_id": self.vocabulary_id
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
@dataclass
|
|
178
|
+
class Locations:
|
|
179
|
+
city_name: str = field(default=None)
|
|
180
|
+
latitude: str = field(default=None)
|
|
181
|
+
longitude: str = field(default=None)
|
|
182
|
+
|
|
183
|
+
def to_dict(self):
|
|
184
|
+
return {
|
|
185
|
+
"city_name": self.city_name,
|
|
186
|
+
"latitude": self.latitude,
|
|
187
|
+
"longitude": self.longitude
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
@dataclass
|
|
192
|
+
class Network:
|
|
193
|
+
ip: str = field(default=None)
|
|
194
|
+
|
|
195
|
+
def to_dict(self):
|
|
196
|
+
return {
|
|
197
|
+
"ip": self.ip
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
@dataclass
|
|
202
|
+
class Device:
|
|
203
|
+
uuid: str = field(default=None)
|
|
204
|
+
|
|
205
|
+
def to_dict(self):
|
|
206
|
+
return {
|
|
207
|
+
"uuid": self.uuid
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
|
|
211
|
+
@dataclass
|
|
212
|
+
class ClientInfo:
|
|
213
|
+
user_id: str
|
|
214
|
+
device: Device = field(default=None)
|
|
215
|
+
network: Network = field(default=None)
|
|
216
|
+
location: Locations = field(default=None)
|
|
217
|
+
|
|
218
|
+
def to_dict(self):
|
|
219
|
+
info = {
|
|
220
|
+
"user_id": self.user_id,
|
|
221
|
+
"sdk": "python"
|
|
222
|
+
}
|
|
223
|
+
if self.device is not None:
|
|
224
|
+
info["device"] = self.device.to_dict()
|
|
225
|
+
if self.network is not None:
|
|
226
|
+
info["network"] = self.network.to_dict()
|
|
227
|
+
if self.location is not None:
|
|
228
|
+
info["location"] = self.location.to_dict()
|
|
229
|
+
return info
|
|
230
|
+
|
|
231
|
+
|
|
232
|
+
@dataclass
|
|
233
|
+
class BizParams:
|
|
234
|
+
user_defined_params: dict = field(default=None)
|
|
235
|
+
user_defined_tokens: dict = field(default=None)
|
|
236
|
+
tool_prompts: dict = field(default=None)
|
|
237
|
+
user_prompt_params: dict = field(default=None)
|
|
238
|
+
user_query_params: dict = field(default=None)
|
|
239
|
+
videos: list = field(default=None)
|
|
240
|
+
pass_through_params: dict = field(default=None)
|
|
241
|
+
|
|
242
|
+
def to_dict(self):
|
|
243
|
+
params = {}
|
|
244
|
+
if self.user_defined_params is not None:
|
|
245
|
+
params["user_defined_params"] = self.user_defined_params
|
|
246
|
+
if self.user_defined_tokens is not None:
|
|
247
|
+
params["user_defined_tokens"] = self.user_defined_tokens
|
|
248
|
+
if self.tool_prompts is not None:
|
|
249
|
+
params["tool_prompts"] = self.tool_prompts
|
|
250
|
+
if self.user_prompt_params is not None:
|
|
251
|
+
params["user_prompt_params"] = self.user_prompt_params
|
|
252
|
+
if self.user_query_params is not None:
|
|
253
|
+
params["user_query_params"] = self.user_query_params
|
|
254
|
+
if self.videos is not None:
|
|
255
|
+
params["videos"] = self.videos
|
|
256
|
+
if self.pass_through_params is not None:
|
|
257
|
+
params.update(self.pass_through_params)
|
|
258
|
+
return params
|
|
259
|
+
|
|
260
|
+
|
|
261
|
+
@dataclass
|
|
262
|
+
class RequestParameters(DashPayloadParameters):
|
|
263
|
+
upstream: Upstream
|
|
264
|
+
downstream: Downstream
|
|
265
|
+
client_info: ClientInfo
|
|
266
|
+
dialog_attributes: DialogAttributes = field(default=None)
|
|
267
|
+
biz_params: BizParams = field(default=None)
|
|
268
|
+
|
|
269
|
+
def to_dict(self):
|
|
270
|
+
params = {
|
|
271
|
+
"upstream": self.upstream.to_dict(),
|
|
272
|
+
"downstream": self.downstream.to_dict(),
|
|
273
|
+
"client_info": self.client_info.to_dict(),
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
if self.dialog_attributes is not None:
|
|
277
|
+
params["dialog_attributes"] = self.dialog_attributes.to_dict()
|
|
278
|
+
if self.biz_params is not None:
|
|
279
|
+
params["biz_params"] = self.biz_params.to_dict()
|
|
280
|
+
return params
|
|
281
|
+
|
|
282
|
+
|
|
283
|
+
@dataclass
|
|
284
|
+
class RequestToRespondParameters(DashPayloadParameters):
|
|
285
|
+
images: list = field(default=None)
|
|
286
|
+
biz_params: BizParams = field(default=None)
|
|
287
|
+
|
|
288
|
+
def to_dict(self):
|
|
289
|
+
params = {
|
|
290
|
+
}
|
|
291
|
+
if self.images is not None:
|
|
292
|
+
params["images"] = self.images
|
|
293
|
+
if self.biz_params is not None:
|
|
294
|
+
params["biz_params"] = self.biz_params.to_dict()
|
|
295
|
+
return params
|
|
296
|
+
|
|
297
|
+
|
|
298
|
+
@dataclass
|
|
299
|
+
class RequestToRespondBodyInput(DashPayloadInput):
|
|
300
|
+
app_id: str
|
|
301
|
+
directive: str
|
|
302
|
+
dialog_id: str
|
|
303
|
+
type_: str = field(metadata={"alias": "type"}, default= None)
|
|
304
|
+
text: str = field(default="")
|
|
305
|
+
|
|
306
|
+
def to_dict(self):
|
|
307
|
+
return {
|
|
308
|
+
"app_id": self.app_id,
|
|
309
|
+
"directive": self.directive,
|
|
310
|
+
"dialog_id": self.dialog_id,
|
|
311
|
+
"type": self.type_,
|
|
312
|
+
"text": self.text
|
|
313
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
from typing import Dict, Any
|
|
2
|
+
|
|
3
|
+
from dashscope.api_entities.api_request_factory import _build_api_request
|
|
4
|
+
from dashscope.api_entities.dashscope_response import DashScopeAPIResponse
|
|
5
|
+
from dashscope.client.base_api import BaseApi
|
|
6
|
+
from dashscope.common.error import ModelRequired
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class TingWu(BaseApi):
|
|
10
|
+
"""API for TingWu APP.
|
|
11
|
+
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
task = None
|
|
15
|
+
task_group = None
|
|
16
|
+
function = None
|
|
17
|
+
|
|
18
|
+
@classmethod
|
|
19
|
+
def call(
|
|
20
|
+
cls,
|
|
21
|
+
model: str,
|
|
22
|
+
user_defined_input: Dict[str, Any],
|
|
23
|
+
parameters: Dict[str, Any] = None,
|
|
24
|
+
api_key: str = None,
|
|
25
|
+
**kwargs
|
|
26
|
+
) -> DashScopeAPIResponse:
|
|
27
|
+
"""Call generation model service.
|
|
28
|
+
|
|
29
|
+
Args:
|
|
30
|
+
model (str): The requested model, such as qwen-turbo
|
|
31
|
+
api_key (str, optional): The api api_key, can be None,
|
|
32
|
+
if None, will get by default rule(TODO: api key doc).
|
|
33
|
+
user_defined_input: custom input
|
|
34
|
+
parameters: custom parameters
|
|
35
|
+
**kwargs:
|
|
36
|
+
base_address: base address
|
|
37
|
+
additional parameters for request
|
|
38
|
+
|
|
39
|
+
Raises:
|
|
40
|
+
InvalidInput: The history and auto_history are mutually exclusive.
|
|
41
|
+
|
|
42
|
+
Returns:
|
|
43
|
+
Union[GenerationResponse,
|
|
44
|
+
Generator[GenerationResponse, None, None]]: If
|
|
45
|
+
stream is True, return Generator, otherwise GenerationResponse.
|
|
46
|
+
"""
|
|
47
|
+
if model is None or not model:
|
|
48
|
+
raise ModelRequired('Model is required!')
|
|
49
|
+
input_config, parameters = cls._build_input_parameters(input_config=user_defined_input,
|
|
50
|
+
params=parameters,
|
|
51
|
+
**kwargs)
|
|
52
|
+
|
|
53
|
+
request = _build_api_request(
|
|
54
|
+
model=model,
|
|
55
|
+
input=input_config,
|
|
56
|
+
api_key=api_key,
|
|
57
|
+
task_group=TingWu.task_group,
|
|
58
|
+
task=TingWu.task,
|
|
59
|
+
function=TingWu.function,
|
|
60
|
+
is_service=False,
|
|
61
|
+
**parameters)
|
|
62
|
+
response = request.call()
|
|
63
|
+
|
|
64
|
+
return response
|
|
65
|
+
|
|
66
|
+
@classmethod
|
|
67
|
+
def _build_input_parameters(cls,
|
|
68
|
+
input_config,
|
|
69
|
+
params: Dict[str, Any] = None,
|
|
70
|
+
**kwargs):
|
|
71
|
+
parameters = {}
|
|
72
|
+
if params is not None:
|
|
73
|
+
parameters = params
|
|
74
|
+
|
|
75
|
+
input_param = input_config
|
|
76
|
+
|
|
77
|
+
if kwargs.keys() is not None:
|
|
78
|
+
for key in kwargs.keys():
|
|
79
|
+
parameters[key] = kwargs[key]
|
|
80
|
+
return input_param, {**parameters, **kwargs}
|