mirror of
https://github.com/xtekky/gpt4free.git
synced 2026-01-03 07:42:30 -08:00
Add AbstractProvider class Add ProviderType type Add get_last_provider function Add version module and VersionUtils Display used provider in gui Fix error response in api
76 lines
No EOL
2.2 KiB
Python
76 lines
No EOL
2.2 KiB
Python
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 = True
|
|
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)
|
|
|
|
# Send request with message
|
|
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) |