dashscope 1.13.6__py3-none-any.whl → 1.14.1__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.

Potentially problematic release.


This version of dashscope might be problematic. Click here for more details.

@@ -1,5 +1,5 @@
1
1
  from .tokenization import Tokenization
2
+ from .tokenizer import get_tokenizer, list_tokenizers
3
+ from .tokenizer_base import Tokenizer
2
4
 
3
- __all__ = [
4
- Tokenization,
5
- ]
5
+ __all__ = [Tokenization, Tokenizer, get_tokenizer, list_tokenizers]
@@ -0,0 +1,109 @@
1
+ import base64
2
+ import unicodedata
3
+ from typing import Collection, Dict, List, Set, Union
4
+
5
+ from .tokenizer_base import Tokenizer
6
+
7
+ PAT_STR = r"""(?i:'s|'t|'re|'ve|'m|'ll|'d)|[^\r\n\p{L}\p{N}]?\p{L}+|\p{N}| ?[^\s\p{L}\p{N}]+[\r\n]*|\s*[\r\n]+|\s+(?!\S)|\s+""" # noqa E501
8
+ ENDOFTEXT = '<|endoftext|>'
9
+ IMSTART = '<|im_start|>'
10
+ IMEND = '<|im_end|>'
11
+ # as the default behavior is changed to allow special tokens in
12
+ # regular texts, the surface forms of special tokens need to be
13
+ # as different as possible to minimize the impact
14
+ EXTRAS = tuple((f'<|extra_{i}|>' for i in range(205)))
15
+ # changed to use actual index to avoid misconfiguration with vocabulary expansion
16
+ SPECIAL_START_ID = 151643
17
+ SPECIAL_TOKENS = tuple(
18
+ enumerate(
19
+ ((
20
+ ENDOFTEXT,
21
+ IMSTART,
22
+ IMEND,
23
+ ) + EXTRAS),
24
+ start=SPECIAL_START_ID,
25
+ ))
26
+ SPECIAL_TOKENS_SET = set(t for i, t in SPECIAL_TOKENS)
27
+
28
+
29
+ class QwenTokenizer(Tokenizer):
30
+ @staticmethod
31
+ def _load_tiktoken_bpe(tiktoken_bpe_file: str) -> Dict[bytes, int]:
32
+ with open(tiktoken_bpe_file, 'rb') as f:
33
+ contents = f.read()
34
+ return {
35
+ base64.b64decode(token): int(rank)
36
+ for token, rank in (line.split() for line in contents.splitlines()
37
+ if line)
38
+ }
39
+
40
+ def __init__(self, vocab_file, errors='replace', extra_vocab_file=None):
41
+ self._errors = errors
42
+ self._vocab_file = vocab_file
43
+ self._extra_vocab_file = extra_vocab_file
44
+
45
+ self._mergeable_ranks = QwenTokenizer._load_tiktoken_bpe(
46
+ vocab_file) # type: Dict[bytes, int]
47
+ self._special_tokens = {
48
+ token: index
49
+ for index, token in SPECIAL_TOKENS
50
+ }
51
+
52
+ # try load extra vocab from file
53
+ if extra_vocab_file is not None:
54
+ used_ids = set(self._mergeable_ranks.values()) | set(
55
+ self._special_tokens.values())
56
+ extra_mergeable_ranks = self._load_tiktoken_bpe(extra_vocab_file)
57
+ for token, index in extra_mergeable_ranks.items():
58
+ if token in self._mergeable_ranks:
59
+ continue
60
+ if index in used_ids:
61
+ continue
62
+ self._mergeable_ranks[token] = index
63
+ # the index may be sparse after this, but don't worry tiktoken.Encoding will handle this
64
+ import tiktoken
65
+ enc = tiktoken.Encoding(
66
+ 'Qwen',
67
+ pat_str=PAT_STR,
68
+ mergeable_ranks=self._mergeable_ranks,
69
+ special_tokens=self._special_tokens,
70
+ )
71
+ assert (
72
+ len(self._mergeable_ranks) +
73
+ len(self._special_tokens) == enc.n_vocab
74
+ ), f'{len(self._mergeable_ranks) + len(self._special_tokens)} != {enc.n_vocab} in encoding'
75
+
76
+ self.decoder = {v: k
77
+ for k, v in self._mergeable_ranks.items()
78
+ } # type: dict[int, bytes|str]
79
+ self.decoder.update({v: k for k, v in self._special_tokens.items()})
80
+
81
+ self._tokenizer = enc # type: tiktoken.Encoding
82
+
83
+ self.eod_id = self._tokenizer.eot_token
84
+ self.im_start_id = self._special_tokens[IMSTART]
85
+ self.im_end_id = self._special_tokens[IMEND]
86
+
87
+ def encode(
88
+ self,
89
+ text: str,
90
+ allowed_special: Union[Set, str] = 'all',
91
+ disallowed_special: Union[Collection, str] = (),
92
+ ) -> Union[List[List], List]:
93
+ text = unicodedata.normalize('NFC', text)
94
+ return self._tokenizer.encode(text,
95
+ allowed_special=allowed_special,
96
+ disallowed_special=disallowed_special)
97
+
98
+ def decode(
99
+ self,
100
+ token_ids: Union[int, List[int]],
101
+ skip_special_tokens: bool = False,
102
+ errors: str = None,
103
+ **kwargs,
104
+ ) -> str:
105
+ if isinstance(token_ids, int):
106
+ token_ids = [token_ids]
107
+ if skip_special_tokens:
108
+ token_ids = [i for i in token_ids if i < self.eod_id]
109
+ return self._tokenizer.decode(token_ids, errors=errors or self._errors)
@@ -25,6 +25,8 @@ class Tokenization(BaseApi):
25
25
  qwen_14b_chat = 'qwen-14b-chat'
26
26
  llama2_7b_chat_v2 = 'llama2-7b-chat-v2'
27
27
  llama2_13b_chat_v2 = 'llama2-13b-chat-v2'
28
+ text_embedding_v2 = 'text-embedding-v2'
29
+ qwen_72b_chat = 'qwen-72b-chat'
28
30
 
29
31
  @classmethod
30
32
  def call(cls,
@@ -0,0 +1,43 @@
1
+ import os
2
+ from typing import List
3
+
4
+ from dashscope.common.error import UnsupportedModel
5
+ from dashscope.tokenizers.qwen_tokenizer import QwenTokenizer
6
+
7
+ from .tokenizer_base import Tokenizer
8
+
9
+ QWEN_SERIALS = ['qwen-7b-chat', 'qwen-turbo', 'qwen-plus', 'qwen-max']
10
+ current_path = os.path.dirname(os.path.abspath(__file__))
11
+ root_path = os.path.dirname(current_path)
12
+
13
+
14
+ def get_tokenizer(model: str) -> Tokenizer:
15
+ """Get a tokenizer based on model name.
16
+
17
+ Args:
18
+ model (str): The model name.
19
+
20
+ Raises:
21
+ UnsupportedModel: Not support model
22
+
23
+ Returns:
24
+ Tokenizer: The `Tokenizer` of the model.
25
+ """
26
+ if model in QWEN_SERIALS:
27
+ return QwenTokenizer(
28
+ os.path.join(root_path, 'resources', 'qwen.tiktoken'))
29
+ elif model.startswith('qwen'):
30
+ return QwenTokenizer(
31
+ os.path.join(root_path, 'resources', 'qwen.tiktoken'))
32
+ else:
33
+ raise UnsupportedModel(
34
+ f'Not support model: {model}, currently only support qwen models.')
35
+
36
+
37
+ def list_tokenizers() -> List[str]:
38
+ """List support models
39
+
40
+ Returns:
41
+ List[str]: The model list.
42
+ """
43
+ return QWEN_SERIALS
@@ -0,0 +1,30 @@
1
+ from typing import List
2
+
3
+
4
+ class Tokenizer:
5
+ """Base tokenizer interface for local tokenizers.
6
+ """
7
+ def __init__(self):
8
+ pass
9
+
10
+ def encode(self, text: str, **kwargs) -> List[int]:
11
+ """Encode input text string to token ids.
12
+
13
+ Args:
14
+ text (str): The string to be encoded.
15
+
16
+ Returns:
17
+ List[int]: The token ids.
18
+ """
19
+ pass
20
+
21
+ def decode(self, token_ids: List[int], **kwargs) -> str:
22
+ """Decode token ids to string.
23
+
24
+ Args:
25
+ token_ids (List[int]): The input token ids.
26
+
27
+ Returns:
28
+ str: The string of the token ids.
29
+ """
30
+ pass
dashscope/version.py CHANGED
@@ -1 +1 @@
1
- __version__ = '1.13.6'
1
+ __version__ = '1.14.1'
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: dashscope
3
- Version: 1.13.6
3
+ Version: 1.14.1
4
4
  Summary: dashscope client sdk library
5
5
  Home-page: https://dashscope.aliyun.com/
6
6
  Author: Alibaba Cloud
@@ -21,6 +21,8 @@ Requires-Python: >=3.7.0
21
21
  Description-Content-Type: text/markdown
22
22
  Requires-Dist: aiohttp
23
23
  Requires-Dist: requests
24
+ Provides-Extra: tokenizer
25
+ Requires-Dist: tiktoken ; extra == 'tokenizer'
24
26
 
25
27
  <h4 align="center">
26
28
  <p>
@@ -44,6 +46,10 @@ If you clone the code from github, you can install from source by running:
44
46
  pip install -e .
45
47
  ```
46
48
 
49
+ To use tokenizer in local mode without downloading any files, run:
50
+ ```shell
51
+ pip install dashscope[tokenizer]
52
+ ```
47
53
 
48
54
 
49
55
  ## QuickStart
@@ -157,50 +163,33 @@ if __name__ == '__main__':
157
163
  sample_sync_call_stream()
158
164
 
159
165
  ```
160
- #### Streaming with History
166
+ #### Stream with Messages
161
167
  ```python
162
168
  from http import HTTPStatus
169
+ from dashscope import Generation
170
+ from dashscope.api_entities.dashscope_response import Role
163
171
 
164
- from dashscope import Conversation, History, HistoryItem
165
- def conversation_stream_example():
166
- history = History()
167
- item = HistoryItem('user', text='Is the weather good today?')
168
- history.append(item)
169
- item = HistoryItem('bot', text='The weather is nice today, do you want to go out and play?')
170
- history.append(item)
171
-
172
- item = HistoryItem('user', text='Do you have any places to recommend?')
173
- history.append(item)
174
- item = HistoryItem('bot', text='I suggest you go to the park. Spring is here, and the flowers are blooming. It is beautiful.')
175
- history.append(item)
176
- chat = Conversation(history)
177
- response = chat.call(Conversation.Models.qwen_turbo,
178
- prompt='Recommend a nearby park',
179
- stream=True)
180
- for part in response:
181
- if part.status_code == HTTPStatus.OK:
182
- print(part.output)
183
- else:
184
- print('Failed request_id: %s, status_code: %s code: %s, message:%s' %
185
- (part.id, part.status_code, part.code, part.message))
186
- response = chat.call(
187
- Conversation.Models.qwen_turbo,
188
- prompt='I have been to that park many times, how about a more distant one?',
189
- auto_history=True,
172
+
173
+ def stream_with_messages():
174
+ messages = [{'role': Role.SYSTEM, 'content': 'You are a helpful assistant.'},
175
+ {'role': Role.USER, 'content': '如何做西红柿炖牛腩?'}]
176
+ responses = Generation.call(
177
+ Generation.Models.qwen_turbo,
178
+ messages=messages,
179
+ result_format='message', # set the result to be "message" format.
190
180
  stream=True,
191
181
  )
192
- for part in response:
193
- if part.status_code == HTTPStatus.OK:
194
- print(part.output.text)
195
- print(part.usage)
196
- else:
197
- print('Failed request_id: %s, status_code: %s, code: %s, message:%s' %
198
- (part.id, part.status_code, part.code, part.message))
199
-
182
+ for response in responses:
183
+ if response.status_code == HTTPStatus.OK:
184
+ print(response)
185
+ else:
186
+ print('Request id: %s, Status code: %s, error code: %s, error message: %s' % (
187
+ response.request_id, response.status_code,
188
+ response.code, response.message
189
+ ))
200
190
 
201
191
  if __name__ == '__main__':
202
- conversation_stream_example()
203
-
192
+ stream_with_messages()
204
193
 
205
194
  ```
206
195
  ## Logging
@@ -1,10 +1,10 @@
1
- dashscope/__init__.py,sha256=ZxCknpY8JWS4tnlSiH-2rIRnjSJwuCgeY7P5wb_nJgs,1897
1
+ dashscope/__init__.py,sha256=UExSJnogmqVAzRL6R4HhTp-yTz9GwoDIh5xAf7E_BEI,2018
2
2
  dashscope/cli.py,sha256=7CnUZqaaUc0FxbmXHMiqOALl9YzZmSrFS23A7hbR0w0,23917
3
3
  dashscope/deployment.py,sha256=uhlQYOiu1baMQxQnFmRwI6ces0I-_DKp8uej_L0v1eY,4400
4
4
  dashscope/file.py,sha256=Dv2Fz3DLbcye2uuQxyQwRM7ky27OthouLXIpSQagQy4,3324
5
5
  dashscope/finetune.py,sha256=5QlIcnFCfSjN3gn9A2FO0kLUDa9Rx_jSc44ezT3aBEo,5118
6
6
  dashscope/model.py,sha256=iuIfal-vOo0yav0HXPdA7f93vd5JNTGIAdCG_WIYkW8,1158
7
- dashscope/version.py,sha256=ZvZac_TGhBsmAT7mxeokg8Dq4epRltEzBfVWYw6TAIM,23
7
+ dashscope/version.py,sha256=eyARjsqZfiB7blnKzG-sgKU2HEsI143aQSUAfhkeA8U,23
8
8
  dashscope/aigc/__init__.py,sha256=s-MCA87KYiVumYtKtJi5IMN7xelSF6TqEU3s3_7RF-Y,327
9
9
  dashscope/aigc/code_generation.py,sha256=bizJb3zGZx3pB74FKMIcnOi_6jkxpKgx__6urzqhQ_E,10627
10
10
  dashscope/aigc/conversation.py,sha256=_sAWhQjLgJENqRAXh-i2dw8bt_i69fJv9KZYVIi4CEg,14090
@@ -12,13 +12,13 @@ dashscope/aigc/generation.py,sha256=SgOtVsd0DaMOuHmJ2EcA3E_hcU1Bqah1Q-Ztnb3TcC8,
12
12
  dashscope/aigc/image_synthesis.py,sha256=Y20B_hpCe-uLKR661hvFpjQVk9jFfNtiPpiBkYiHAA0,8996
13
13
  dashscope/aigc/multimodal_conversation.py,sha256=D5JYLLxwdGsgCrYeF0gNvE1kR5Vbmq1g0MiRU-4hlZQ,5228
14
14
  dashscope/api_entities/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
15
- dashscope/api_entities/aiohttp_request.py,sha256=1WuvODWcm-merZnAFpxV2Y9QohcB3hSGS_YkwK18O7g,10359
15
+ dashscope/api_entities/aiohttp_request.py,sha256=ZFbdpJh7SwHnBzbYLhqr_FdcDVRgLVMLhLUS_vXbUGs,10228
16
16
  dashscope/api_entities/api_request_data.py,sha256=JUMcfpJjKXEZLCBSFIDpgoaeQYk5uK9-CwhM4OHIHFQ,5463
17
- dashscope/api_entities/api_request_factory.py,sha256=yRCY9OVGagsEvid6RXwvwiQv_8ZTEqYaKXnVLd9F9pA,4281
17
+ dashscope/api_entities/api_request_factory.py,sha256=MCJOGgUzaWTaLZ5d8m8dck7QdSUNX7XLbKYyB3pT23E,4067
18
18
  dashscope/api_entities/base_request.py,sha256=cXUL7xqSV8wBr5d-1kx65AO3IsRR9A_ps6Lok-v-MKM,926
19
19
  dashscope/api_entities/dashscope_response.py,sha256=1KdBib5xOftcKXLzTETe5LElGy2mB8IG8E3JZrGOaAY,15814
20
- dashscope/api_entities/http_request.py,sha256=8bNtylkE98h1SeCrxTPow4Dqy3wPXWp9wHPdeWAIDe8,9637
21
- dashscope/api_entities/websocket_request.py,sha256=VK4488_3Qi2Rwx7i1FGb-lPu_BSNZAoedOqnHzOxTH8,15844
20
+ dashscope/api_entities/http_request.py,sha256=MzaTznVJUbyA8u6cLegxVSEM3JWlAhPHbSh4uDCX0-A,9506
21
+ dashscope/api_entities/websocket_request.py,sha256=zU7OskAHaNlKcR9s_6Hlnhr5N3oam4w0sUD5E9N-4BQ,14586
22
22
  dashscope/audio/__init__.py,sha256=vlw0TFVRdeRWfzmJxhzarVUqkMs-DZNf4GiMtm3C8XE,45
23
23
  dashscope/audio/asr/__init__.py,sha256=-s180qWn_JPSpCo1q0aDJJ5HQ3zTzD4z5yUwsRqH4aU,275
24
24
  dashscope/audio/asr/asr_phrase_manager.py,sha256=BNrRBGGoAW_rcxoi_euh6bRktJO6asTiGroE8PMh1Xg,6641
@@ -30,16 +30,16 @@ dashscope/client/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,
30
30
  dashscope/client/base_api.py,sha256=1YTlwY2_tlvMLaz6oGh1BNQt5GT_Xx3obS6nKOvnpkY,31749
31
31
  dashscope/common/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
32
32
  dashscope/common/api_key.py,sha256=5Stp0odL5JSuIO3qJBp23QNppuGbqhhvKPS66qbMs0I,1986
33
- dashscope/common/constants.py,sha256=2zF1l2BDnDDa7oFSfg3gLV34A-6Lr-3_o8QfX60rkCk,2640
33
+ dashscope/common/constants.py,sha256=OCe3UNGH05sTEsffipWDYpUL_bz__AaYm9lSDB-ZkRI,2297
34
34
  dashscope/common/env.py,sha256=oQOZW5JyEeTSde394un2lpDJ5RBh4fMU9hBfbtrKKkc,869
35
- dashscope/common/error.py,sha256=ihgDx08P2fw0cB-0HsA6MMgO0vY-6yIhxXHlIIF8c0Y,1641
35
+ dashscope/common/error.py,sha256=5Ndi6w38fSHX6qcPgr9udKISf1RbRJVL8hjDPtU4lJ4,1896
36
36
  dashscope/common/logging.py,sha256=ecGxylG3bWES_Xv5-BD6ep4_0Ciu7F6ZPBjiZtu9Jx4,984
37
37
  dashscope/common/message_manager.py,sha256=i5149WzDk6nWmdFaHzYx4USXMBeX18GKSI-F4fLwbN0,1097
38
- dashscope/common/utils.py,sha256=UZSK6AStBVriVTR5wdxfcKTBDzCEN6PLyEv3avZ8YwQ,6679
38
+ dashscope/common/utils.py,sha256=xsY36zXGnProdkgarbFu30rX9rmdQNZHcHbvEuVXoss,6697
39
39
  dashscope/embeddings/__init__.py,sha256=-dxHaoxZZVuP-wAGUIa3sNNh8CQwaeWj2UlqsDy1sV4,240
40
40
  dashscope/embeddings/batch_text_embedding.py,sha256=M8jvdz304Oh5ZwegHWGwTda9AezYsgVC59HnweuCagY,7977
41
41
  dashscope/embeddings/batch_text_embedding_response.py,sha256=WziXlQsFIkL1kPc_7lRG1HtqgkO5vVThtnNqExJggNU,2000
42
- dashscope/embeddings/multimodal_embedding.py,sha256=a6aQYR1Ikmh4ZOGldfVTP0KDAlCVzM6pxDj2pNd5w3M,3779
42
+ dashscope/embeddings/multimodal_embedding.py,sha256=Wgh80k-mI0DJiapWxM27H1rwkCPoFqunca2JHvwTE68,3824
43
43
  dashscope/embeddings/text_embedding.py,sha256=X7_FBM57gQQCu8xb-W-jTlSsathaCiAtW0mdb19N-PM,1714
44
44
  dashscope/io/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
45
45
  dashscope/io/input_output.py,sha256=iZ1X1x1btdoZK2VeC9JsKkag2eaXwqfNT3Q6SrmRi2w,3941
@@ -47,13 +47,17 @@ dashscope/nlp/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
47
47
  dashscope/nlp/understanding.py,sha256=uVkf_4iULnlnuGmEX3taKiHgzxu173vvgVwY5EO2C2Y,2803
48
48
  dashscope/protocol/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
49
49
  dashscope/protocol/websocket.py,sha256=z-v6PGx3L4zYBANuC48s7SWSQSwRCDoh0zcfhv9Bf8U,561
50
- dashscope/tokenizers/__init__.py,sha256=zRNBe3ONNOA3T2gnxhlG3PTjkVOQBUYotMMJAruyk70,71
51
- dashscope/tokenizers/tokenization.py,sha256=WhSdiH0Bu-pGQCsJfC91LL_y5tVDzCtQ7tTs2Tox-HY,4543
50
+ dashscope/resources/qwen.tiktoken,sha256=srG437XMXwJLr8NzEhxquj9m-aWgJp4kNHCh3hajMYY,2561218
51
+ dashscope/tokenizers/__init__.py,sha256=Oy5FMT37Non6e1YxdHQ89U93Dy3CG1Ez0gBa771KZo0,200
52
+ dashscope/tokenizers/qwen_tokenizer.py,sha256=dCnT9-9NrqPS85bEhjlPULUfDADVRhlleYwM_ILgCeI,4111
53
+ dashscope/tokenizers/tokenization.py,sha256=q-mx2ufZAXyelLyPZdjsKieYHC6tJU19t7lC5bEz6kU,4631
54
+ dashscope/tokenizers/tokenizer.py,sha256=y6P91qTCYo__pEx_0VHAcj9YECfbUdRqZU1fdGTjF4o,1154
55
+ dashscope/tokenizers/tokenizer_base.py,sha256=REDhzRyDT13iequ61-a6_KcTy0GFKlihQve5HkyoyRs,656
52
56
  dashscope/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
53
57
  dashscope/utils/oss_utils.py,sha256=iCF5fLqIXDCS2zkE96t2DEUxCI76ArnQH2DiY2hgHu0,6522
54
- dashscope-1.13.6.dist-info/LICENSE,sha256=Izp5L1DF1Mbza6qojkqNNWlE_mYLnr4rmzx2EBF8YFw,11413
55
- dashscope-1.13.6.dist-info/METADATA,sha256=Jy5x-xQoVYSzUjXvxxKHQv-wuDbdcVZIdB-_iwYnMlg,7227
56
- dashscope-1.13.6.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92
57
- dashscope-1.13.6.dist-info/entry_points.txt,sha256=raEp5dOuj8whJ7yqZlDM8WQ5p2RfnGrGNo0QLQEnatY,50
58
- dashscope-1.13.6.dist-info/top_level.txt,sha256=woqavFJK9zas5xTqynmALqOtlafghjsk63Xk86powTU,10
59
- dashscope-1.13.6.dist-info/RECORD,,
58
+ dashscope-1.14.1.dist-info/LICENSE,sha256=Izp5L1DF1Mbza6qojkqNNWlE_mYLnr4rmzx2EBF8YFw,11413
59
+ dashscope-1.14.1.dist-info/METADATA,sha256=Hlg9nly8P6C_7fj2RwM8HEDuP8dt5unBCUmwGEy-FoY,6659
60
+ dashscope-1.14.1.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92
61
+ dashscope-1.14.1.dist-info/entry_points.txt,sha256=raEp5dOuj8whJ7yqZlDM8WQ5p2RfnGrGNo0QLQEnatY,50
62
+ dashscope-1.14.1.dist-info/top_level.txt,sha256=woqavFJK9zas5xTqynmALqOtlafghjsk63Xk86powTU,10
63
+ dashscope-1.14.1.dist-info/RECORD,,