2023-12-07 09:18:05 +03:00
|
|
|
from __future__ import annotations
|
|
|
|
|
|
|
|
from urllib.parse import unquote
|
|
|
|
|
|
|
|
from ...typing import AsyncResult, Messages
|
2024-01-01 19:48:57 +03:00
|
|
|
from ..base_provider import AbstractProvider
|
2023-12-07 09:18:05 +03:00
|
|
|
from ...webdriver import WebDriver
|
|
|
|
from ...requests import Session, get_session_from_browser
|
|
|
|
|
2024-01-01 19:48:57 +03:00
|
|
|
class AiChatting(AbstractProvider):
|
2023-12-07 09:18:05 +03:00
|
|
|
url = "https://www.aichatting.net"
|
|
|
|
supports_gpt_35_turbo = True
|
|
|
|
_session: Session = None
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
def create_completion(
|
|
|
|
cls,
|
|
|
|
model: str,
|
|
|
|
messages: Messages,
|
|
|
|
stream: bool,
|
|
|
|
proxy: str = None,
|
|
|
|
timeout: int = 120,
|
|
|
|
webdriver: WebDriver = None,
|
|
|
|
**kwargs
|
|
|
|
) -> AsyncResult:
|
|
|
|
if not cls._session:
|
|
|
|
cls._session = get_session_from_browser(cls.url, webdriver, proxy, timeout)
|
|
|
|
visitorId = unquote(cls._session.cookies.get("aichatting.website.visitorId"))
|
|
|
|
|
|
|
|
headers = {
|
|
|
|
"accept": "application/json, text/plain, */*",
|
|
|
|
"lang": "en",
|
|
|
|
"source": "web"
|
|
|
|
}
|
|
|
|
data = {
|
|
|
|
"roleId": 0,
|
|
|
|
}
|
|
|
|
try:
|
|
|
|
response = cls._session.post("https://aga-api.aichatting.net/aigc/chat/record/conversation/create", json=data, headers=headers)
|
|
|
|
response.raise_for_status()
|
|
|
|
conversation_id = response.json()["data"]["conversationId"]
|
|
|
|
except Exception as e:
|
|
|
|
cls.reset()
|
|
|
|
raise e
|
|
|
|
headers = {
|
|
|
|
"authority": "aga-api.aichatting.net",
|
|
|
|
"accept": "text/event-stream,application/json, text/event-stream",
|
|
|
|
"lang": "en",
|
|
|
|
"source": "web",
|
|
|
|
"vtoken": visitorId,
|
|
|
|
}
|
|
|
|
data = {
|
|
|
|
"spaceHandle": True,
|
|
|
|
"roleId": 0,
|
|
|
|
"messages": messages,
|
|
|
|
"conversationId": conversation_id,
|
|
|
|
}
|
|
|
|
response = cls._session.post("https://aga-api.aichatting.net/aigc/chat/v2/stream", json=data, headers=headers, stream=True)
|
|
|
|
response.raise_for_status()
|
|
|
|
for chunk in response.iter_lines():
|
|
|
|
if chunk.startswith(b"data:"):
|
|
|
|
yield chunk[5:].decode().replace("-=- --", " ").replace("-=-n--", "\n").replace("--@DONE@--", "")
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
def reset(cls):
|
|
|
|
cls._session = None
|