2023-10-07 02:03:36 +00:00
from __future__ import annotations
from aiohttp import ClientSession
import execjs , os , json
2023-10-09 08:22:17 +00:00
from . . typing import AsyncResult , Messages
2023-10-07 02:03:36 +00:00
from . base_provider import AsyncGeneratorProvider
from . helper import format_prompt
class GptForLove ( AsyncGeneratorProvider ) :
url = " https://ai18.gptforlove.com "
supports_gpt_35_turbo = True
working = True
@classmethod
async def create_async_generator (
cls ,
model : str ,
2023-10-09 08:22:17 +00:00
messages : Messages ,
proxy : str = None ,
2023-10-07 02:03:36 +00:00
* * kwargs
2023-10-09 08:22:17 +00:00
) - > AsyncResult :
2023-10-07 02:03:36 +00:00
if not model :
model = " gpt-3.5-turbo "
headers = {
" authority " : " api.gptplus.one " ,
" accept " : " application/json, text/plain, */* " ,
" accept-language " : " de-DE,de;q=0.9,en-DE;q=0.8,en;q=0.7,en-US;q=0.6,nl;q=0.5,zh-CN;q=0.4,zh-TW;q=0.3,zh;q=0.2 " ,
" content-type " : " application/json " ,
" origin " : cls . url ,
" referer " : f " { cls . url } / " ,
" sec-ch-ua " : " \" Google Chrome \" ;v= \" 117 \" , \" Not;A=Brand \" ;v= \" 8 \" , \" Chromium \" ;v= \" 117 \" " ,
" sec-ch-ua-mobile " : " ?0 " ,
" sec-ch-ua-platform " : " Linux " ,
" sec-fetch-dest " : " empty " ,
" sec-fetch-mode " : " cors " ,
" sec-fetch-site " : " cross-site " ,
" user-agent " : " Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36 "
}
async with ClientSession ( headers = headers ) as session :
prompt = format_prompt ( messages )
data = {
" prompt " : prompt ,
" options " : { } ,
" systemMessage " : " You are ChatGPT, the version is GPT3.5, a large language model trained by OpenAI. Follow the user ' s instructions carefully. Respond using markdown. " ,
" temperature " : 0.8 ,
" top_p " : 1 ,
" secret " : get_secret ( ) ,
* * kwargs
}
2023-10-09 08:22:17 +00:00
async with session . post ( " https://api.gptplus.one/chat-process " , json = data , proxy = proxy ) as response :
2023-10-07 02:03:36 +00:00
response . raise_for_status ( )
async for line in response . content :
2023-10-08 09:39:19 +00:00
try :
line = json . loads ( line )
except :
raise RuntimeError ( f " Broken line: { line } " )
2023-10-07 02:03:36 +00:00
if " detail " in line :
content = line [ " detail " ] [ " choices " ] [ 0 ] [ " delta " ] . get ( " content " )
if content :
yield content
elif " 10分钟内提问超过了5次 " in line :
raise RuntimeError ( " Rate limit reached " )
else :
raise RuntimeError ( f " Response: { line } " )
def get_secret ( ) - > str :
dir = os . path . dirname ( __file__ )
dir + = ' /npm/node_modules/crypto-js '
source = """
CryptoJS = require ( ' {dir} /crypto-js ' )
var k = ' 14487141bvirvvG '
, e = Math . floor ( new Date ( ) . getTime ( ) / 1e3 ) ;
var t = CryptoJS . enc . Utf8 . parse ( e )
, o = CryptoJS . AES . encrypt ( t , k , {
mode : CryptoJS . mode . ECB ,
padding : CryptoJS . pad . Pkcs7
} ) ;
return o . toString ( )
"""
source = source . replace ( ' {dir} ' , dir )
return execjs . compile ( source ) . call ( ' ' )