XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet
公开
关注 0 Fork 0 Star 1
返回提交历史

XFEstudio/gpt4free

Restored provider (g4f/Provider/nexra/NexraBing.py)

6a3684a7
kqlio67 <kqlio67@users.noreply.github.com>
提交于

代码差异

2 个文件 +71 -74
Modified g4f/Provider/nexra/NexraBing.py +69 -73
@@ -1,95 +1,91 @@
1 1 from __future__ import annotations
2 2
3 from aiohttp import ClientSession
4 from aiohttp.client_exceptions import ContentTypeError
5
6 from ...typing import AsyncResult, Messages
7 from ..base_provider import AsyncGeneratorProvider, ProviderModelMixin
8 from ..helper import format_prompt
9 3 import json
4 import requests
10 5
6 from ...typing import CreateResult, Messages
7 from ..base_provider import ProviderModelMixin, AbstractProvider
8 from ..helper import format_prompt
11 9
12 class NexraBing(AsyncGeneratorProvider, ProviderModelMixin):
10 class NexraBing(AbstractProvider, ProviderModelMixin):
13 11 label = "Nexra Bing"
14 12 url = "https://nexra.aryahcr.cc/documentation/bing/en"
15 13 api_endpoint = "https://nexra.aryahcr.cc/api/chat/complements"
16 working = False
17 supports_stream = False
14 working = True
15 supports_stream = True
18 16
19 default_model = 'Bing (Balanced)'
20 models = ['Bing (Balanced)', 'Bing (Creative)', 'Bing (Precise)']
17 default_model = 'Balanced'
18 models = [default_model, 'Creative', 'Precise']
21 19
22 20 model_aliases = {
23 "gpt-4": "Bing (Balanced)",
24 "gpt-4": "Bing (Creative)",
25 "gpt-4": "Bing (Precise)",
21 "gpt-4": "Balanced",
22 "gpt-4": "Creative",
23 "gpt-4": "Precise",
26 24 }
27 25
28 26 @classmethod
29 def get_model_and_style(cls, model: str) -> tuple[str, str]:
30 # Default to the default model if not found
31 model = cls.model_aliases.get(model, model)
32 if model not in cls.models:
33 model = cls.default_model
34
35 # Extract the base model and conversation style
36 base_model, conversation_style = model.split(' (')
37 conversation_style = conversation_style.rstrip(')')
38 return base_model, conversation_style
39
27 def get_model(cls, model: str) -> str:
28 if model in cls.models:
29 return model
30 elif model in cls.model_aliases:
31 return cls.model_aliases[model]
32 else:
33 return cls.default_model
34
40 35 @classmethod
41 async def create_async_generator(
36 def create_completion(
42 37 cls,
43 38 model: str,
44 39 messages: Messages,
45 proxy: str = None,
46 stream: bool = False,
47 markdown: bool = False,
40 stream: bool,
48 41 **kwargs
49 ) -> AsyncResult:
50 base_model, conversation_style = cls.get_model_and_style(model)
51
42 ) -> CreateResult:
43 model = cls.get_model(model)
44
52 45 headers = {
53 "Content-Type": "application/json",
54 "origin": cls.url,
55 "referer": f"{cls.url}/chat",
46 'Content-Type': 'application/json'
56 47 }
57 async with ClientSession(headers=headers) as session:
58 prompt = format_prompt(messages)
59 data = {
60 "messages": [
61 {
62 "role": "user",
63 "content": prompt
64 }
65 ],
66 "conversation_style": conversation_style,
67 "markdown": markdown,
68 "stream": stream,
69 "model": base_model
70 }
71 async with session.post(cls.api_endpoint, json=data, proxy=proxy) as response:
72 response.raise_for_status()
73 try:
74 # Read the entire response text
75 text_response = await response.text()
76 # Split the response on the separator character
77 segments = text_response.split('\x1e')
78
79 complete_message = ""
80 for segment in segments:
81 if not segment.strip():
82 continue
83 try:
84 response_data = json.loads(segment)
85 if response_data.get('message'):
86 complete_message = response_data['message']
87 if response_data.get('finish'):
88 break
89 except json.JSONDecodeError:
90 raise Exception(f"Failed to parse segment: {segment}")
48
49 data = {
50 "messages": [
51 {
52 "role": "user",
53 "content": format_prompt(messages)
54 }
55 ],
56 "conversation_style": model,
57 "markdown": False,
58 "stream": stream,
59 "model": "Bing"
60 }
61
62 response = requests.post(cls.api_endpoint, headers=headers, json=data, stream=True)
63
64 return cls.process_response(response)
65
66 @classmethod
67 def process_response(cls, response):
68 if response.status_code != 200:
69 yield f"Error: {response.status_code}"
70 return
71
72 full_message = ""
73 for chunk in response.iter_content(chunk_size=None):
74 if chunk:
75 messages = chunk.decode('utf-8').split('\x1e')
76 for message in messages:
77 try:
78 json_data = json.loads(message)
79 if json_data.get('finish', False):
80 return
81 current_message = json_data.get('message', '')
82 if current_message:
83 new_content = current_message[len(full_message):]
84 if new_content:
85 yield new_content
86 full_message = current_message
87 except json.JSONDecodeError:
88 continue
91 89
92 # Yield the complete message
93 yield complete_message
94 except ContentTypeError:
95 raise Exception("Failed to parse response content type.")
90 if not full_message:
91 yield "No message received"
Modified g4f/models.py +2 -1
@@ -39,6 +39,7 @@ from .Provider import (
39 39 Liaobots,
40 40 MagickPen,
41 41 MetaAI,
42 NexraBing,
42 43 NexraBlackbox,
43 44 NexraChatGPT,
44 45 NexraChatGPT4o,
@@ -150,7 +151,7 @@ gpt_4_turbo = Model(
150 151 gpt_4 = Model(
151 152 name = 'gpt-4',
152 153 base_provider = 'OpenAI',
153 best_provider = IterListProvider([Chatgpt4Online, Ai4Chat, NexraChatGPT, NexraChatGptV2, NexraChatGptWeb, Airforce, Bing, OpenaiChat, gpt_4_turbo.best_provider, gpt_4o.best_provider, gpt_4o_mini.best_provider])
154 best_provider = IterListProvider([Chatgpt4Online, Ai4Chat, NexraBing, NexraChatGPT, NexraChatGptV2, NexraChatGptWeb, Airforce, Bing, OpenaiChat, gpt_4_turbo.best_provider, gpt_4o.best_provider, gpt_4o_mini.best_provider])
154 155 )
155 156
156 157 # o1