from __future__ import annotations
import json
import requests
from ...typing import CreateResult, Messages
from ..base_provider import ProviderModelMixin, AbstractProvider
from ..helper import format_prompt
class NexraBing(AbstractProvider, ProviderModelMixin):
label = "Nexra Bing"
url = "https://nexra.aryahcr.cc/documentation/bing/en"
api_endpoint = "https://nexra.aryahcr.cc/api/chat/complements"
working = True
supports_stream = True
default_model = 'Balanced'
models = [default_model, 'Creative', 'Precise']
model_aliases = {
"gpt-4": "Balanced",
"gpt-4": "Creative",
"gpt-4": "Precise",
}
@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
def create_completion(
cls,
model: str,
messages: Messages,
stream: bool = False,
proxy: str = None,
markdown: bool = False,
**kwargs
) -> CreateResult:
model = cls.get_model(model)
headers = {
'Content-Type': 'application/json'
}
data = {
"messages": [
{
"role": "user",
"content": format_prompt(messages)
}
],
"conversation_style": model,
"markdown": markdown,
"stream": stream,
"model": "Bing"
}
response = requests.post(cls.api_endpoint, headers=headers, json=data, stream=True)
return cls.process_response(response)
@classmethod
def process_response(cls, response):
if response.status_code != 200:
yield f"Error: {response.status_code}"
return
full_message = ""
for chunk in response.iter_content(chunk_size=None):
if chunk:
messages = chunk.decode('utf-8').split('\x1e')
for message in messages:
try:
json_data = json.loads(message)
if json_data.get('finish', False):
return
current_message = json_data.get('message', '')
if current_message:
new_content = current_message[len(full_message):]
if new_content:
yield new_content
full_message = current_message
except json.JSONDecodeError:
continue
if not full_message:
yield "No message received"