2023-10-07 05:03:36 +03:00
from __future__ import annotations
from aiohttp import ClientSession
2024-01-13 16:01:28 +03:00
import json
from Crypto . Cipher import AES
from Crypto . Util import Padding
import base64
import hashlib
import time
import math
2023-10-07 05:03:36 +03:00
2023-10-09 11:22:17 +03:00
from . . typing import AsyncResult , Messages
2023-10-07 05:03:36 +03:00
from . base_provider import AsyncGeneratorProvider
from . helper import format_prompt
class GptForLove ( AsyncGeneratorProvider ) :
url = " https://ai18.gptforlove.com "
working = True
2023-10-27 23:59:14 +03:00
supports_gpt_35_turbo = True
2023-10-07 05:03:36 +03:00
@classmethod
async def create_async_generator (
cls ,
model : str ,
2023-10-09 11:22:17 +03:00
messages : Messages ,
proxy : str = None ,
2023-10-07 05:03:36 +03:00
* * kwargs
2023-10-09 11:22:17 +03:00
) - > AsyncResult :
2023-10-07 05:03:36 +03: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 " : { } ,
2023-10-14 01:31:48 +03:00
" systemMessage " : kwargs . get ( " system_message " , " You are ChatGPT, the version is GPT3.5, a large language model trained by OpenAI. Follow the user ' s instructions carefully. " ) ,
" temperature " : kwargs . get ( " temperature " , 0.8 ) ,
" top_p " : kwargs . get ( " top_p " , 1 ) ,
2023-10-07 05:03:36 +03:00
" secret " : get_secret ( ) ,
}
2023-10-09 11:22:17 +03:00
async with session . post ( " https://api.gptplus.one/chat-process " , json = data , proxy = proxy ) as response :
2023-10-07 05:03:36 +03:00
response . raise_for_status ( )
async for line in response . content :
2023-10-08 12:39:19 +03:00
try :
line = json . loads ( line )
except :
raise RuntimeError ( f " Broken line: { line } " )
2023-10-07 05:03:36 +03:00
if " detail " in line :
2023-11-20 02:14:30 +03:00
content = line [ " detail " ] [ " choices " ] [ 0 ] [ " delta " ] . get ( " content " )
if content :
2023-10-07 05:03:36 +03:00
yield content
elif " 10分钟内提问超过了5次 " in line :
raise RuntimeError ( " Rate limit reached " )
else :
raise RuntimeError ( f " Response: { line } " )
def get_secret ( ) - > str :
2024-01-13 16:01:28 +03:00
k = ' 14487141bvirvvG '
e = math . floor ( time . time ( ) )
plaintext = str ( e ) . encode ( ' utf-8 ' )
key = hashlib . md5 ( k . encode ( ' utf-8 ' ) ) . digest ( )
cipher = AES . new ( key , AES . MODE_ECB )
ciphertext = cipher . encrypt ( Padding . pad ( plaintext , AES . block_size , style = ' pkcs7 ' ) )
return base64 . b64encode ( ciphertext ) . decode ( )