|
from __future__ import annotations |
|
|
|
import time, json |
|
|
|
from ...typing import CreateResult, Messages |
|
from ..base_provider import AbstractProvider |
|
from ..helper import format_prompt |
|
from ...webdriver import WebDriver, WebDriverSession, bypass_cloudflare |
|
|
|
class MyShell(AbstractProvider): |
|
url = "https://app.myshell.ai/chat" |
|
working = False |
|
supports_gpt_35_turbo = True |
|
supports_stream = True |
|
|
|
@classmethod |
|
def create_completion( |
|
cls, |
|
model: str, |
|
messages: Messages, |
|
stream: bool, |
|
proxy: str = None, |
|
timeout: int = 120, |
|
webdriver: WebDriver = None, |
|
**kwargs |
|
) -> CreateResult: |
|
with WebDriverSession(webdriver, "", proxy=proxy) as driver: |
|
bypass_cloudflare(driver, cls.url, timeout) |
|
|
|
|
|
data = { |
|
"botId": "4738", |
|
"conversation_scenario": 3, |
|
"message": format_prompt(messages), |
|
"messageType": 1 |
|
} |
|
script = """ |
|
response = await fetch("https://api.myshell.ai/v1/bot/chat/send_message", { |
|
"headers": { |
|
"accept": "application/json", |
|
"content-type": "application/json", |
|
"myshell-service-name": "organics-api", |
|
"visitor-id": localStorage.getItem("mix_visitorId") |
|
}, |
|
"body": '{body}', |
|
"method": "POST" |
|
}) |
|
window._reader = response.body.pipeThrough(new TextDecoderStream()).getReader(); |
|
""" |
|
driver.execute_script(script.replace("{body}", json.dumps(data))) |
|
script = """ |
|
chunk = await window._reader.read(); |
|
if (chunk.done) { |
|
return null; |
|
} |
|
content = ''; |
|
chunk.value.split('\\n').forEach((line, index) => { |
|
if (line.startsWith('data: ')) { |
|
try { |
|
const data = JSON.parse(line.substring('data: '.length)); |
|
if ('content' in data) { |
|
content += data['content']; |
|
} |
|
} catch(e) {} |
|
} |
|
}); |
|
return content; |
|
""" |
|
while True: |
|
chunk = driver.execute_script(script) |
|
if chunk: |
|
yield chunk |
|
elif chunk != "": |
|
break |
|
else: |
|
time.sleep(0.1) |
|
|