1 line
7.1 KiB
JSON
1 line
7.1 KiB
JSON
{"repo": "charlespikachu/freegpthub", "files": {"freegpthub/gpthub/providers/iflytek.py": {"c71979ba145a99624473344f4b8a194d5f733c76": {"t": 1785674320.5278218, "n": 6775, "h": "189254b86e22b6fa", "c": "'''\nFunction:\n Implementation of IFLYTEKSparkEndpoints\nAuthor:\n Zhenchao Jin\nWeChat Official Account (微信公众号):\n Charles的皮卡丘\n'''\nimport hmac\nimport json\nimport base64\nimport random\nimport hashlib\nimport websocket\nfrom time import mktime\nfrom datetime import datetime\nfrom .base import BaseEndpoint\nfrom urllib.parse import urlencode, urlparse\nfrom wsgiref.handlers import format_date_time\nfrom ..utils import resp2json, ChatRequest, ChatResponse, ModelIOType, SecretUtils\n\n\n'''SETTINGS'''\nSPARK_FREE_API_KEYS = {\n 'lite': [\n 'BrQGpZuyF-r-aa8BsEcILHhyck6bRGmeW5tOjGlKwLNkKeU04juloTRFZP7GtRlDWcU4hPcHtTycdJfRfcktr1JWlj54hlfnTe7bbbKl-FprpUcj',\n 'D9-CjAmX4ww-_QFr_s9BLQ1fHoq60aHZ46-ATnsHL4JeO5_0GeQeEKP9Di337RQ1n2VQz0U-MhNZcaMn7XN-v_MJDkhQ9zIONBCkstyOyvgRePzp', \n ],\n '4.0Ultra': [\n {'app_id': 'z8LR_zVlO-rnQzbiO_LoXe8wx4iPjRkFAegZ57flf1Xs6LIKwI4o2A==', 'api_key': '7fgq2apXPXAMJZ7t9ECF6st-jKQPxflqgaj7Z276GWgZkV_zivo-0SY4a0aIzD9-ZT-mBWLMBd9Eq2s8-NpBpI5Dx1UcSFfg', 'api_secret': 'Ly3BhBZeA19xT_D2HBlOhklLUw7JsljAJM1Cr4M9Z-JFQv_9O12ZQsPlp4FMy_9MNNxM8zmHnAMDqm8oQsiimUyL-h-CsNMw'}\n ],\n}\n\n\n'''IFLYTEKSparkEndpoints'''\nclass IFLYTEKSparkEndpoints(BaseEndpoint):\n provider, model = \"iflytek\", \"spark\"\n def __init__(self, **kwargs):\n super(IFLYTEKSparkEndpoints, self).__init__(**kwargs)\n self.registervariant(\"lite\", io_supported=[ModelIOType.fromtag(\"T2T\")])\n self.registerapi(\n version=\"lite\", name=\"cggapi\", io=ModelIOType.fromtag(\"T2T\"), handler=\"cggapi\",\n priority=10, note='thirdparty api: https://api.cenguigui.cn/api/chat/?msg=',\n )\n self.registerapi(\n version=\"lite\", name=\"officialapiv1\", io=ModelIOType.fromtag(\"T2T\"), handler=\"officialapiv1\",\n priority=100, note='official api: https://spark-api-open.xf-yun.com/v1'\n )\n self.registervariant(\"4.0Ultra\", io_supported=[ModelIOType.fromtag(\"T2T\")])\n self.registerapi(\n version=\"4.0Ultra\", name=\"officialapiv4\", io=ModelIOType.fromtag(\"T2T\"), handler=\"officialapiv4\",\n priority=100, note='official api: wss://spark-api.xf-yun.com/v4.0/chat'\n )\n '''officialapiv1'''\n def officialapiv1(self, req: ChatRequest, request_overrides: dict = None, version: str = None) -> ChatResponse:\n return self.openaisdk(\n base_url='https://spark-api-open.xf-yun.com/v1', candidate_api_keys=SPARK_FREE_API_KEYS, api_family='client.chat.completions.create',\n req=req, request_overrides=request_overrides, version=version\n )\n '''officialapiv4'''\n def officialapiv4(self, req: ChatRequest, request_overrides: dict = None, version: str = None) -> ChatResponse:\n # init\n request_overrides = request_overrides or {}\n full_response, websocket_cfg = [], req.websocket\n # _buildauthurl\n def _buildauthurl(ws_url: str, api_key: str, api_secret: str) -> str:\n u = urlparse(ws_url)\n host, path = u.netloc, u.path\n date = format_date_time(mktime(datetime.now().timetuple()))\n signature_origin = f\"host: {host}\\n\" f\"date: {date}\\n\" f\"GET {path} HTTP/1.1\"\n signature_sha = hmac.new(api_secret.encode(\"utf-8\"), signature_origin.encode(\"utf-8\"), digestmod=hashlib.sha256).digest()\n signature = base64.b64encode(signature_sha).decode(\"utf-8\")\n authorization_origin = f'api_key=\"{api_key}\", algorithm=\"hmac-sha256\", headers=\"host date request-line\", signature=\"{signature}\"'\n authorization = base64.b64encode(authorization_origin.encode(\"utf-8\")).decode(\"utf-8\")\n params = {\"authorization\": authorization, \"date\": date, \"host\": host}\n return ws_url + \"?\" + urlencode(params)\n # _buildrequest\n def _buildrequest(websocket_cfg: dict, content: str, domain: str, app_id: str) -> dict:\n return {\n \"header\": {\"app_id\": app_id, \"uid\": \"user_001\"},\n \"parameter\": websocket_cfg.get('parameter') or {\"chat\": {\"domain\": domain, \"temperature\": 0.5, \"top_k\": 4, \"max_tokens\": 2048}},\n \"payload\": websocket_cfg.get('payload') or {\"message\": {\"text\": [{\"role\": \"user\", \"content\": content}]}},\n }\n # _onopen\n def _onopen(ws: websocket.WebSocketApp):\n payload = _buildrequest(content=req.text, domain=version, app_id=app_id, websocket_cfg=websocket_cfg)\n ws.send(json.dumps(payload, ensure_ascii=False))\n # _onmessage\n def _onmessage(ws: websocket.WebSocketApp, message):\n nonlocal full_response\n data: dict = json.loads(message)\n header: dict = data.get(\"header\", {})\n if header.get(\"code\", -1) != 0: raise RuntimeError(f\"Spark error: {header}\")\n payload: dict = data.get(\"payload\", {})\n choices: dict = payload.get(\"choices\", {})\n text_list: list[dict] = choices.get(\"text\", [])\n if text_list:\n delta = text_list[0].get(\"content\", \"\")\n if delta: full_response.append(delta)\n if header.get(\"status\") == 2: ws.close()\n # _onerror\n def _onerror(ws, error): print(\"\\n[ws error]\", error)\n # _onclose\n def _onclose(ws, close_status_code, close_msg): pass\n # obtain api info\n app_secret = random.choice(SPARK_FREE_API_KEYS[version])\n app_id = SecretUtils.b64decode(SecretUtils.decryptaesgcm(app_secret['app_id'], self.aes_gem_key))\n api_key = SecretUtils.b64decode(SecretUtils.decryptaesgcm(app_secret['api_key'], self.aes_gem_key))\n api_secret = SecretUtils.b64decode(SecretUtils.decryptaesgcm(app_secret['api_secret'], self.aes_gem_key))\n # websocket\n ws_final_url = _buildauthurl(\"wss://spark-api.xf-yun.com/v4.0/chat\", api_key, api_secret)\n ws = websocket.WebSocketApp(ws_final_url, on_open=_onopen, on_message=_onmessage, on_error=_onerror, on_close=_onclose)\n ws.run_forever(sslopt={\"check_hostname\": True})\n # return\n return ChatResponse(text=\"\".join(full_response), raw=full_response)\n '''cggapi'''\n def cggapi(self, req: ChatRequest, request_overrides: dict = None, version: str = None) -> ChatResponse:\n request_overrides = request_overrides or {}\n try:\n resp = self.session.get(\"https://api.cenguigui.cn/api/chat/\", params={\"msg\": req.text}, **request_overrides)\n resp.raise_for_status()\n except:\n resp = self.session.get(\"https://api-v1.cenguigui.cn/api/chat/\", params={\"msg\": req.text}, **request_overrides)\n resp.raise_for_status()\n api_resp_raw_data = resp2json(resp)\n return ChatResponse(text=api_resp_raw_data['data']['content'], raw=api_resp_raw_data)"}}}} |