12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- 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)
|