summaryrefslogtreecommitdiffstats
path: root/g4f/Provider/Ails.py
diff options
context:
space:
mode:
Diffstat (limited to 'g4f/Provider/Ails.py')
-rw-r--r--g4f/Provider/Ails.py89
1 files changed, 38 insertions, 51 deletions
diff --git a/g4f/Provider/Ails.py b/g4f/Provider/Ails.py
index 4eb21729..d533ae24 100644
--- a/g4f/Provider/Ails.py
+++ b/g4f/Provider/Ails.py
@@ -1,36 +1,36 @@
from __future__ import annotations
import hashlib
-import json
import time
import uuid
+import json
from datetime import datetime
+from aiohttp import ClientSession
-import requests
-
-from ..typing import SHA256, Any, CreateResult
-from .base_provider import BaseProvider
+from ..typing import SHA256, AsyncGenerator
+from .base_provider import AsyncGeneratorProvider
-class Ails(BaseProvider):
+class Ails(AsyncGeneratorProvider):
url: str = "https://ai.ls"
working = True
- supports_stream = True
supports_gpt_35_turbo = True
@staticmethod
- def create_completion(
+ async def create_async_generator(
model: str,
messages: list[dict[str, str]],
- stream: bool, **kwargs: Any) -> CreateResult:
-
+ stream: bool,
+ proxy: str = None,
+ **kwargs
+ ) -> AsyncGenerator:
headers = {
"authority": "api.caipacity.com",
"accept": "*/*",
"accept-language": "en,fr-FR;q=0.9,fr;q=0.8,es-ES;q=0.7,es;q=0.6,en-US;q=0.5,am;q=0.4,de;q=0.3",
"authorization": "Bearer free",
"client-id": str(uuid.uuid4()),
- "client-v": _get_client_v(),
+ "client-v": "0.1.278",
"content-type": "application/json",
"origin": "https://ai.ls",
"referer": "https://ai.ls/",
@@ -41,42 +41,39 @@ class Ails(BaseProvider):
"sec-fetch-mode": "cors",
"sec-fetch-site": "cross-site",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36",
+ "from-url": "https://ai.ls/?chat=1"
}
-
- timestamp = _format_timestamp(int(time.time() * 1000))
- sig = {
- "d": datetime.now().strftime("%Y-%m-%d"),
- "t": timestamp,
- "s": _hash({"t": timestamp, "m": messages[-1]["content"]}),
- }
-
- json_data = json.dumps(
- separators=(",", ":"),
- obj={
+ async with ClientSession(
+ headers=headers
+ ) as session:
+ timestamp = _format_timestamp(int(time.time() * 1000))
+ json_data = {
"model": "gpt-3.5-turbo",
"temperature": kwargs.get("temperature", 0.6),
"stream": True,
"messages": messages,
+ "d": datetime.now().strftime("%Y-%m-%d"),
+ "t": timestamp,
+ "s": _hash({"t": timestamp, "m": messages[-1]["content"]}),
}
- | sig,
- )
-
- response = requests.post(
- "https://api.caipacity.com/v1/chat/completions",
- headers=headers,
- data=json_data,
- stream=True,
- )
- response.raise_for_status()
+ async with session.post(
+ "https://api.caipacity.com/v1/chat/completions",
+ proxy=proxy,
+ json=json_data
+ ) as response:
+ response.raise_for_status()
+ start = "data: "
+ async for line in response.content:
+ line = line.decode('utf-8')
+ if line.startswith(start) and line != "data: [DONE]":
+ line = line[len(start):-1]
+ line = json.loads(line)
+ token = line["choices"][0]["delta"].get("content")
+ if token:
+ if "ai.ls" in token or "ai.ci" in token:
+ raise Exception("Response Error: " + token)
+ yield token
- for token in response.iter_lines():
- if b"content" in token:
- completion_chunk = json.loads(token.decode().replace("data: ", ""))
- token = completion_chunk["choices"][0]["delta"].get("content")
- if "ai.ls" in token.lower() or "ai.ci" in token.lower():
- raise Exception("Response Error: " + token)
- if token != None:
- yield token
@classmethod
@property
@@ -106,14 +103,4 @@ def _format_timestamp(timestamp: int) -> str:
e = timestamp
n = e % 10
r = n + 1 if n % 2 == 0 else n
- return str(e - n + r)
-
-
-def _get_client_v():
- response = requests.get("https://ai.ls/?chat=1")
- response.raise_for_status()
- js_path = response.text.split('crossorigin href="')[1].split('"')[0]
-
- response = requests.get("https://ai.ls" + js_path)
- response.raise_for_status()
- return response.text.split('G4="')[1].split('"')[0]
+ return str(e - n + r) \ No newline at end of file