|
from __future__ import annotations |
|
|
|
from ..typing import Messages, List, Dict |
|
from .base_provider import BaseProvider, CreateResult |
|
from uuid import uuid4 |
|
import requests |
|
|
|
def format_prompt(messages) -> List[Dict[str, str]]: |
|
|
|
return [{"id": str(uuid4()), "content": '\n'.join(f'{m["role"]}: {m["content"]}' for m in messages), "from": "you"}] |
|
|
|
class Bestim(BaseProvider): |
|
url = "https://chatgpt.bestim.org" |
|
supports_gpt_35_turbo = True |
|
supports_message_history = True |
|
working = True |
|
supports_stream = True |
|
|
|
@staticmethod |
|
def create_completion( |
|
model: str, |
|
messages: Messages, |
|
stream: bool, |
|
proxy: str = None, |
|
**kwargs |
|
) -> CreateResult: |
|
|
|
headers = { |
|
'POST': '/chat/send2/ HTTP/3', |
|
'Host': 'chatgpt.bestim.org', |
|
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:121.0) Gecko/20100101 Firefox/121.0', |
|
'Accept': 'application/json, text/event-stream', |
|
'Accept-Language': 'en-US,en;q=0.5', |
|
'Accept-Encoding': 'gzip, deflate, br', |
|
'Referer': 'https://chatgpt.bestim.org/chat/', |
|
'Content-Type': 'application/json', |
|
'Content-Length': '109', |
|
'Origin': 'https://chatgpt.bestim.org', |
|
'Cookie': 'NpZAER=qKkRHguMIOraVbJAWpoyzGLFjZwYlm; qKkRHguMIOraVbJAWpoyzGLFjZwYlm=8ebb5ae1561bde05354de5979b52c6e1-1704058188-1704058188; NpZAER_hits=2; _csrf-front=fcf20965823c0a152ae8f9cdf15b23022bb26cdc6bf32a9d4c8bfe78dcc6b807a%3A2%3A%7Bi%3A0%3Bs%3A11%3A%22_csrf-front%22%3Bi%3A1%3Bs%3A32%3A%22a5wP6azsc7dxV8rmwAXaNsl8XS1yvW5V%22%3B%7D', |
|
'Alt-Used': 'chatgpt.bestim.org', |
|
'Connection': 'keep-alive', |
|
'Sec-Fetch-Dest': 'empty', |
|
'Sec-Fetch-Mode': 'cors', |
|
'Sec-Fetch-Site': 'same-origin', |
|
'TE': 'trailers' |
|
} |
|
|
|
data = { |
|
|
|
"messagesHistory": format_prompt(messages), |
|
"type": "chat", |
|
} |
|
|
|
response = requests.post( |
|
url="https://chatgpt.bestim.org/chat/send2/", |
|
headers=headers, |
|
json=data, |
|
proxies={"https": proxy} |
|
) |
|
|
|
response.raise_for_status() |
|
|
|
for chunk in response.iter_lines(): |
|
|
|
if b"event: trylimit" not in chunk: |
|
|
|
yield chunk.decode().removeprefix("data: ") |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|