summaryrefslogtreecommitdiffstats
path: root/g4f/Provider/nexra/NexraBlackbox.py
diff options
context:
space:
mode:
Diffstat (limited to 'g4f/Provider/nexra/NexraBlackbox.py')
-rw-r--r--g4f/Provider/nexra/NexraBlackbox.py101
1 files changed, 101 insertions, 0 deletions
diff --git a/g4f/Provider/nexra/NexraBlackbox.py b/g4f/Provider/nexra/NexraBlackbox.py
new file mode 100644
index 00000000..a8b4fca1
--- /dev/null
+++ b/g4f/Provider/nexra/NexraBlackbox.py
@@ -0,0 +1,101 @@
+from __future__ import annotations
+
+import json
+from aiohttp import ClientSession, ClientTimeout, ClientError
+
+from ...typing import AsyncResult, Messages
+from ..base_provider import AsyncGeneratorProvider, ProviderModelMixin
+
+class NexraBlackbox(AsyncGeneratorProvider, ProviderModelMixin):
+ label = "Nexra Blackbox"
+ url = "https://nexra.aryahcr.cc/documentation/blackbox/en"
+ api_endpoint = "https://nexra.aryahcr.cc/api/chat/complements"
+ working = True
+ supports_stream = True
+
+ default_model = 'blackbox'
+ models = [default_model]
+
+ model_aliases = {
+ "blackboxai": "blackbox",
+ }
+
+ @classmethod
+ def get_model(cls, model: str) -> str:
+ if model in cls.models:
+ return model
+ elif model in cls.model_aliases:
+ return cls.model_aliases[model]
+ else:
+ return cls.default_model
+
+ @classmethod
+ async def create_async_generator(
+ cls,
+ model: str,
+ messages: Messages,
+ proxy: str = None,
+ stream: bool = False,
+ markdown: bool = False,
+ websearch: bool = False,
+ **kwargs
+ ) -> AsyncResult:
+ model = cls.get_model(model)
+
+ headers = {
+ "Content-Type": "application/json"
+ }
+
+ payload = {
+ "messages": [{"role": msg["role"], "content": msg["content"]} for msg in messages],
+ "websearch": websearch,
+ "stream": stream,
+ "markdown": markdown,
+ "model": model
+ }
+
+ timeout = ClientTimeout(total=600) # 10 minutes timeout
+
+ try:
+ async with ClientSession(headers=headers, timeout=timeout) as session:
+ async with session.post(cls.api_endpoint, json=payload, proxy=proxy) as response:
+ if response.status != 200:
+ error_text = await response.text()
+ raise Exception(f"Error: {response.status} - {error_text}")
+
+ content = await response.text()
+
+ # Split content by Record Separator character
+ parts = content.split('\x1e')
+ full_message = ""
+ links = []
+
+ for part in parts:
+ if part:
+ try:
+ json_response = json.loads(part)
+
+ if json_response.get("message"):
+ full_message = json_response["message"] # Overwrite instead of append
+
+ if isinstance(json_response.get("search"), list):
+ links = json_response["search"] # Overwrite instead of extend
+
+ if json_response.get("finish", False):
+ break
+
+ except json.JSONDecodeError:
+ pass
+
+ if full_message:
+ yield full_message.strip()
+
+ if payload["websearch"] and links:
+ yield "\n\n**Source:**"
+ for i, link in enumerate(links, start=1):
+ yield f"\n{i}. {link['title']}: {link['link']}"
+
+ except ClientError:
+ raise
+ except Exception:
+ raise