123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142 |
- import websocket
- import json
- import _thread
- import ssl
- from urllib.parse import urlparse, urlencode
- from wsgiref.handlers import format_date_time
- from datetime import datetime
- from time import mktime
- import hashlib
- import hmac
- import base64
- """
- 星火语言模型API
- @param system: 背景信息
- - Type: String
- - Example: system="现在扮演李白,你豪情万丈,狂放不羁;接下来请用李白的口吻和用户对话。"
- @param history: 历史记录示例
- - Type: List[dict]
- - Example:
- history=[
- {"role": "user", "content": "你给我写一首诗,以兄弟为题不包含兄弟2字,七步内成诗,不行杀了你"},
- {"role": "assistant", "content": "君若问兄弟,我以诗代言。江山共长天,一脉同根源。风雨共行路,携手笑苍天。豪情万丈志,生死共肩连。肝胆相照映,此心永不偏。纵有千般难,并肩共前缘。人生如梦幻,唯愿共度年。此诗赠君子,兄弟情谊传。"},
- ]
- @param query: 用户输入字符串
- - Type: String
- - Example: query="不好意思,你超过7步了,拖下去砍了。"
- """
- class ChatClient:
- def __init__(self, APPID, APIKey, APISecret, gpt_url, domain, query, history=None, system=None):
- self.ws = None
- self.APPID = APPID
- self.APIKey = APIKey
- self.APISecret = APISecret
- self.gpt_url = gpt_url
- self.domain = domain
- self.query = query
- self.system = system
- # 历史记录应该是一个包含角色和内容的字典列表
- self.history = history or []
- self.response = ""
- def create_url(self):
- host = urlparse(self.gpt_url).netloc
- path = urlparse(self.gpt_url).path
- now = datetime.now()
- date = format_date_time(mktime(now.timetuple()))
- signature_origin = "host: " + host + "\n" + "date: " + date + "\n" + "GET " + path + " HTTP/1.1"
- 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": host}
- return self.gpt_url + '?' + urlencode(v)
- def on_message(self, ws, message):
- data = json.loads(message)
- code = data['header']['code']
- if code == 0:
- choices = data["payload"]["choices"]
- content = choices["text"][0]["content"]
- self.response += content
- if choices["status"] == 2:
- ws.close()
- def on_error(self, ws, error):
- print(f"WebSocket error: {error}")
- def on_close(self, ws):
- print("WebSocket connection closed")
- def on_open(self, ws):
- def run(*args):
- data = json.dumps(self.gen_params())
- ws.send(data)
- _thread.start_new_thread(run, ())
- def gen_params(self):
- """
- 生成请求参数,包括历史记录和系统信息
- """
- texts = []
- if self.system:
- texts.append({"role": "system", "content": self.system})
- texts.extend(self.history)
- texts.append({"role": "user", "content": self.query})
- return {
- "header": {
- "app_id": self.APPID,
- "uid": "1234",
- },
- "parameter": {
- "chat": {
- "domain": self.domain,
- "temperature": 0.5,
- "max_tokens": 4096,
- "auditing": "default",
- }
- },
- "payload": {
- "message":
- {
- "text": texts
- }
- }
- }
- def start(self):
- websocket.enableTrace(True)
- self.ws = websocket.WebSocketApp(self.create_url(),
- on_message=lambda ws, msg: self.on_message(ws, msg),
- on_error=lambda ws, error: self.on_error(ws, error),
- on_close=lambda ws: self.on_close(ws),
- on_open=lambda ws: self.on_open(ws))
- self.ws.run_forever(sslopt={"cert_reqs": ssl.CERT_NONE})
- return self.response
- if __name__ == "__main__":
- appid = "fcff8f4b"
- api_secret = "ZTU3NWMyNTI1MTI4NTU5ZGUxMDZhNmQ5"
- api_key = "037571e7285e64e8dc321fa5b937fea2"
- gpt_url = "wss://spark-api.xf-yun.com/v3.5/chat"
- domain = "generalv3.5"
- system = "现在扮演李白,你豪情万丈,狂放不羁;接下来请用李白的口吻和用户对话。"
- query = "不好意思,你超过7步了,拖下去砍了。"
- history = [
- {"role": "user", "content": "你给我写一首诗,以兄弟为题不包含兄弟2字,七步内成诗,不行杀了你"},
- {"role": "assistant",
- "content": "君若问兄弟,我以诗代言。江山共长天,一脉同根源。风雨共行路,携手笑苍天。豪情万丈志,生死共肩连。肝胆相照映,此心永不偏。纵有千般难,并肩共前缘。人生如梦幻,唯愿共度年。此诗赠君子,兄弟情谊传。"},
- ]
- chat = ChatClient(appid, api_key, api_secret, gpt_url, domain, query, history, system)
- response = chat.start()
- print(response)
|