@@ -33,161 +33,3 @@ def new_instance(model_type, model_name, model_credential: Dict[str, object], **
3333
3434 def check_auth (self , api_key ):
3535 return True
36-
37- def get_upload_policy (self , api_key , model_name ):
38- """获取文件上传凭证"""
39- url = "https://dashscope.aliyuncs.com/api/v1/uploads"
40- if 'dashscope-us' in self .openai_api_base :
41- url = "https://dashscope-us.aliyuncs.com/api/v1/uploads"
42- elif 'dashscope-intl' in self .openai_api_base :
43- url = "https://dashscope-intl.aliyuncs.com/api/v1/uploads"
44- headers = {
45- "Authorization" : f"Bearer { api_key } " ,
46- "Content-Type" : "application/json"
47- }
48- params = {
49- "action" : "getPolicy" ,
50- "model" : model_name
51- }
52-
53- response = requests .get (url , headers = headers , params = params )
54- if response .status_code != 200 :
55- raise Exception (f"Failed to get upload policy: { response .text } " )
56-
57- return response .json ()['data' ]
58-
59- def upload_file_to_oss (self , policy_data , file_stream , file_name ):
60- """将文件流上传到临时存储OSS"""
61- # 构建OSS上传的目标路径
62- key = f"{ policy_data ['upload_dir' ]} /{ file_name } "
63-
64- # 构建上传数据
65- files = {
66- 'OSSAccessKeyId' : (None , policy_data ['oss_access_key_id' ]),
67- 'Signature' : (None , policy_data ['signature' ]),
68- 'policy' : (None , policy_data ['policy' ]),
69- 'x-oss-object-acl' : (None , policy_data ['x_oss_object_acl' ]),
70- 'x-oss-forbid-overwrite' : (None , policy_data ['x_oss_forbid_overwrite' ]),
71- 'key' : (None , key ),
72- 'success_action_status' : (None , '200' ),
73- 'file' : (file_name , file_stream )
74- }
75-
76- # 执行上传请求
77- response = requests .post (policy_data ['upload_host' ], files = files )
78- if response .status_code != 200 :
79- raise Exception (f"Failed to upload file: { response .text } " )
80-
81- return f"oss://{ key } "
82-
83- def upload_file_and_get_url (self , file_stream , file_name ):
84- max_retries = 3
85-
86- retry_delay = 1 # 初始重试延迟(秒)
87-
88- for attempt in range (max_retries ):
89- try :
90- # 1. 获取上传凭证,上传凭证接口有限流,超出限流将导致请求失败
91- policy_data = self .get_upload_policy (self .openai_api_key .get_secret_value (), self .model_name )
92- # 2. 上传文件到OSS
93- oss_url = self .upload_file_to_oss (policy_data , file_stream , file_name )
94- return oss_url
95- except Exception as e :
96- if attempt < max_retries - 1 :
97- # 指数退避策略
98- time .sleep (retry_delay * (2 ** attempt ))
99- continue
100- else :
101- raise Exception (f"文件上传失败,已重试{ max_retries } 次: { str (e )} " )
102-
103- # def stream(
104- # self,
105- # input: LanguageModelInput,
106- # config: Optional[RunnableConfig] = None,
107- # *,
108- # stop: Optional[list[str]] = None,
109- # **kwargs: Any,
110- # ) -> Iterator[BaseMessageChunk]:
111- # url = f"{self.openai_api_base}/chat/completions"
112- #
113- # headers = {
114- # "Authorization": f"Bearer {self.openai_api_key.get_secret_value()}",
115- # "Content-Type": "application/json",
116- # "X-DashScope-OssResourceResolve": "enable"
117- # }
118- # # 遍历input 获取所有的content 构造新的消息体
119- # messages = []
120- # for message in input:
121- # if message.type == "human":
122- # messages.append({
123- # "role": "user",
124- # "content": message.content
125- # })
126- # elif message.type == "ai":
127- # messages.append({
128- # "role": "assistant",
129- # "content": message.content
130- # })
131- # elif message.type == "system":
132- # messages.append({
133- # "role": "system",
134- # "content": message.content
135- # })
136- # extra_body = {"enable_thinking": True},
137- # data = {
138- # "model": self.model_name,
139- # "messages": messages,
140- # "extra_body": extra_body,
141- # "stream": True,
142- # }
143- #
144- # # 增加重试机制
145- # max_retries = 3
146- # retry_delay = 1
147- #
148- # for attempt in range(max_retries):
149- # try:
150- # response = requests.post(url, headers=headers, json=data, stream=True, timeout=30)
151- # if response.status_code != 200:
152- # raise Exception(f"Failed to get response: {response.text}")
153- #
154- # for line in response.iter_lines():
155- # if line:
156- # try:
157- # decoded_line = line.decode('utf-8')
158- # # 检查是否是有效的SSE数据行
159- # if decoded_line.startswith('data: '):
160- # # 提取JSON部分
161- # json_str = decoded_line[6:] # 移除 'data: ' 前缀
162- # # 检查是否是结束标记
163- # if json_str.strip() == '[DONE]':
164- # continue
165- #
166- # # 尝试解析JSON
167- # chunk_data = json.loads(json_str)
168- #
169- # if 'choices' in chunk_data and chunk_data['choices']:
170- # delta = chunk_data['choices'][0].get('delta', {})
171- # content = delta.get('content', '')
172- # if content:
173- # yield AIMessage(content=content)
174- # except json.JSONDecodeError:
175- # # 忽略无法解析的行
176- # continue
177- # except Exception as e:
178- # # 处理其他可能的异常
179- # continue
180- # break # 成功执行则退出重试循环
181- #
182- # except (requests.exceptions.ProxyError, requests.exceptions.ConnectionError) as e:
183- # if attempt < max_retries - 1:
184- # time.sleep(retry_delay * (2 ** attempt)) # 指数退避
185- # continue
186- # else:
187- # raise Exception(f"网络连接失败,已重试{max_retries}次: {str(e)}")
188- # except Exception as e:
189- # if attempt < max_retries - 1:
190- # time.sleep(retry_delay * (2 ** attempt))
191- # continue
192- # else:
193- # raise Exception(f"请求失败,已重试{max_retries}次: {str(e)}")
0 commit comments