xunfei spark api test
This commit is contained in:
		
							parent
							
								
									aaf4f37403
								
							
						
					
					
						commit
						587c7400d1
					
				
							
								
								
									
										180
									
								
								request_llm/com_sparkapi.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										180
									
								
								request_llm/com_sparkapi.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,180 @@
 | 
				
			|||||||
 | 
					import _thread as thread
 | 
				
			||||||
 | 
					import base64
 | 
				
			||||||
 | 
					import datetime
 | 
				
			||||||
 | 
					import hashlib
 | 
				
			||||||
 | 
					import hmac
 | 
				
			||||||
 | 
					import json
 | 
				
			||||||
 | 
					from urllib.parse import urlparse
 | 
				
			||||||
 | 
					import ssl
 | 
				
			||||||
 | 
					from datetime import datetime
 | 
				
			||||||
 | 
					from time import mktime
 | 
				
			||||||
 | 
					from urllib.parse import urlencode
 | 
				
			||||||
 | 
					from wsgiref.handlers import format_date_time
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import websocket
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					timeout_bot_msg = '[Local Message] Request timeout. Network error.'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class Ws_Param(object):
 | 
				
			||||||
 | 
					    # 初始化
 | 
				
			||||||
 | 
					    def __init__(self, APPID, APIKey, APISecret, gpt_url):
 | 
				
			||||||
 | 
					        self.APPID = APPID
 | 
				
			||||||
 | 
					        self.APIKey = APIKey
 | 
				
			||||||
 | 
					        self.APISecret = APISecret
 | 
				
			||||||
 | 
					        self.host = urlparse(gpt_url).netloc
 | 
				
			||||||
 | 
					        self.path = urlparse(gpt_url).path
 | 
				
			||||||
 | 
					        self.gpt_url = gpt_url
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # 生成url
 | 
				
			||||||
 | 
					    def create_url(self):
 | 
				
			||||||
 | 
					        # 生成RFC1123格式的时间戳
 | 
				
			||||||
 | 
					        now = datetime.now()
 | 
				
			||||||
 | 
					        date = format_date_time(mktime(now.timetuple()))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        # 拼接字符串
 | 
				
			||||||
 | 
					        signature_origin = "host: " + self.host + "\n"
 | 
				
			||||||
 | 
					        signature_origin += "date: " + date + "\n"
 | 
				
			||||||
 | 
					        signature_origin += "GET " + self.path + " HTTP/1.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        # 进行hmac-sha256进行加密
 | 
				
			||||||
 | 
					        signature_sha = hmac.new(self.APISecret.encode('utf-8'), signature_origin.encode('utf-8'),
 | 
				
			||||||
 | 
					                                 digestmod=hashlib.sha256).digest()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        signature_sha_base64 = base64.b64encode(signature_sha).decode(encoding='utf-8')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        authorization_origin = f'api_key="{self.APIKey}", algorithm="hmac-sha256", headers="host date request-line", signature="{signature_sha_base64}"'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        authorization = base64.b64encode(authorization_origin.encode('utf-8')).decode(encoding='utf-8')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        # 将请求的鉴权参数组合为字典
 | 
				
			||||||
 | 
					        v = {
 | 
				
			||||||
 | 
					            "authorization": authorization,
 | 
				
			||||||
 | 
					            "date": date,
 | 
				
			||||||
 | 
					            "host": self.host
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        # 拼接鉴权参数,生成url
 | 
				
			||||||
 | 
					        url = self.gpt_url + '?' + urlencode(v)
 | 
				
			||||||
 | 
					        # 此处打印出建立连接时候的url,参考本demo的时候可取消上方打印的注释,比对相同参数时生成的url与自己代码生成的url是否一致
 | 
				
			||||||
 | 
					        return url
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# 收到websocket错误的处理
 | 
				
			||||||
 | 
					def on_error(ws, error):
 | 
				
			||||||
 | 
					    print("### error:", error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# 收到websocket关闭的处理
 | 
				
			||||||
 | 
					def on_close(ws):
 | 
				
			||||||
 | 
					    print("### closed ###")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def generate_message_payload(inputs, llm_kwargs, history, system_prompt, stream):
 | 
				
			||||||
 | 
					    conversation_cnt = len(history) // 2
 | 
				
			||||||
 | 
					    messages = [{"role": "system", "content": system_prompt}]
 | 
				
			||||||
 | 
					    if conversation_cnt:
 | 
				
			||||||
 | 
					        for index in range(0, 2*conversation_cnt, 2):
 | 
				
			||||||
 | 
					            what_i_have_asked = {}
 | 
				
			||||||
 | 
					            what_i_have_asked["role"] = "user"
 | 
				
			||||||
 | 
					            what_i_have_asked["content"] = history[index]
 | 
				
			||||||
 | 
					            what_gpt_answer = {}
 | 
				
			||||||
 | 
					            what_gpt_answer["role"] = "assistant"
 | 
				
			||||||
 | 
					            what_gpt_answer["content"] = history[index+1]
 | 
				
			||||||
 | 
					            if what_i_have_asked["content"] != "":
 | 
				
			||||||
 | 
					                if what_gpt_answer["content"] == "": continue
 | 
				
			||||||
 | 
					                if what_gpt_answer["content"] == timeout_bot_msg: continue
 | 
				
			||||||
 | 
					                messages.append(what_i_have_asked)
 | 
				
			||||||
 | 
					                messages.append(what_gpt_answer)
 | 
				
			||||||
 | 
					            else:
 | 
				
			||||||
 | 
					                messages[-1]['content'] = what_gpt_answer['content']
 | 
				
			||||||
 | 
					    what_i_ask_now = {}
 | 
				
			||||||
 | 
					    what_i_ask_now["role"] = "user"
 | 
				
			||||||
 | 
					    what_i_ask_now["content"] = inputs
 | 
				
			||||||
 | 
					    messages.append(what_i_ask_now)
 | 
				
			||||||
 | 
					    return messages
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def gen_params(appid, inputs, llm_kwargs, history, system_prompt, stream):
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
 | 
					    通过appid和用户的提问来生成请参数
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
 | 
					    data = {
 | 
				
			||||||
 | 
					        "header": {
 | 
				
			||||||
 | 
					            "app_id": appid,
 | 
				
			||||||
 | 
					            "uid": "1234"
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "parameter": {
 | 
				
			||||||
 | 
					            "chat": {
 | 
				
			||||||
 | 
					                "domain": "general",
 | 
				
			||||||
 | 
					                "random_threshold": 0.5,
 | 
				
			||||||
 | 
					                "max_tokens": 2048,
 | 
				
			||||||
 | 
					                "auditing": "default"
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "payload": {
 | 
				
			||||||
 | 
					            "message": {
 | 
				
			||||||
 | 
					                "text": generate_message_payload(inputs, llm_kwargs, history, system_prompt, stream)
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return data
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# 收到websocket消息的处理
 | 
				
			||||||
 | 
					def on_message(ws, message):
 | 
				
			||||||
 | 
					    print(message)
 | 
				
			||||||
 | 
					    data = json.loads(message)
 | 
				
			||||||
 | 
					    code = data['header']['code']
 | 
				
			||||||
 | 
					    if code != 0:
 | 
				
			||||||
 | 
					        print(f'请求错误: {code}, {data}')
 | 
				
			||||||
 | 
					        ws.close()
 | 
				
			||||||
 | 
					    else:
 | 
				
			||||||
 | 
					        choices = data["payload"]["choices"]
 | 
				
			||||||
 | 
					        status = choices["status"]
 | 
				
			||||||
 | 
					        content = choices["text"][0]["content"]
 | 
				
			||||||
 | 
					        ws.content += content
 | 
				
			||||||
 | 
					        print(content, end='')
 | 
				
			||||||
 | 
					        if status == 2:
 | 
				
			||||||
 | 
					            ws.close()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def commit_request(appid, api_key, api_secret, gpt_url, question):
 | 
				
			||||||
 | 
					    inputs = question
 | 
				
			||||||
 | 
					    llm_kwargs = {}
 | 
				
			||||||
 | 
					    history = []
 | 
				
			||||||
 | 
					    system_prompt = ""
 | 
				
			||||||
 | 
					    stream = True
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    wsParam = Ws_Param(appid, api_key, api_secret, gpt_url)
 | 
				
			||||||
 | 
					    websocket.enableTrace(False)
 | 
				
			||||||
 | 
					    wsUrl = wsParam.create_url()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # 收到websocket连接建立的处理
 | 
				
			||||||
 | 
					    def on_open(ws):
 | 
				
			||||||
 | 
					        thread.start_new_thread(run, (ws,))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def run(ws, *args):
 | 
				
			||||||
 | 
					        data = json.dumps(gen_params(ws.appid, *ws.all_args))
 | 
				
			||||||
 | 
					        ws.send(data)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ws = websocket.WebSocketApp(wsUrl, on_message=on_message, on_error=on_error, on_close=on_close, on_open=on_open)
 | 
				
			||||||
 | 
					    ws.appid = appid
 | 
				
			||||||
 | 
					    ws.content = ""
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    ws.all_args = (inputs, llm_kwargs, history, system_prompt, stream)
 | 
				
			||||||
 | 
					    ws.run_forever(sslopt={"cert_reqs": ssl.CERT_NONE})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return ws.content
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"""
 | 
				
			||||||
 | 
					    1、配置好python、pip的环境变量
 | 
				
			||||||
 | 
					    2、执行 pip install websocket 与 pip3 install websocket-client
 | 
				
			||||||
 | 
					    3、去控制台https://console.xfyun.cn/services/cbm获取appid等信息填写即可
 | 
				
			||||||
 | 
					"""
 | 
				
			||||||
 | 
					if __name__ == "__main__":
 | 
				
			||||||
 | 
					    # 测试时候在此处正确填写相关信息即可运行
 | 
				
			||||||
 | 
					    commit_request(appid="929e7d53",
 | 
				
			||||||
 | 
					         api_secret="NmFjNGE1ZDNhZWE2MzBkYzg5ZjNkZDcx",
 | 
				
			||||||
 | 
					         api_key="896f9c5cf1b2b8669f523507f96e6c99",
 | 
				
			||||||
 | 
					         gpt_url="ws://spark-api.xf-yun.com/v1.1/chat",
 | 
				
			||||||
 | 
					         question="你是谁?你能做什么")
 | 
				
			||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user