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

XFEstudio/gpt4free

Restore the provider (g4f/Provider/nexra/NexraBlackbox.py)

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

代码差异

2 个文件 +69 -68
Modified g4f/Provider/nexra/NexraBlackbox.py +66 -66
@@ -1,20 +1,22 @@
1 1 from __future__ import annotations
2 2
3 3 import json
4 from aiohttp import ClientSession, ClientTimeout, ClientError
4 import requests
5 5
6 from ...typing import AsyncResult, Messages
7 from ..base_provider import AsyncGeneratorProvider, ProviderModelMixin
6 from ...typing import CreateResult, Messages
7 from ..base_provider import ProviderModelMixin, AbstractProvider
8 from ..helper import format_prompt
8 9
9 class NexraBlackbox(AsyncGeneratorProvider, ProviderModelMixin):
10 label = "Nexra Blackbox"
11 url = "https://nexra.aryahcr.cc/documentation/blackbox/en"
12 api_endpoint = "https://nexra.aryahcr.cc/api/chat/complements"
13 working = False
10 class NexraBlackbox(AbstractProvider, ProviderModelMixin):
11 url = "https://nexra.aryahcr.cc/api/chat/complements"
12 working = True
14 13 supports_stream = True
15 14
16 default_model = 'blackbox'
17 models = [default_model]
15 default_model = "blackbox"
16
17 models = [
18 'blackbox',
19 ]
18 20
19 21 model_aliases = {
20 22 "blackboxai": "blackbox",
@@ -28,74 +30,72 @@ class NexraBlackbox(AsyncGeneratorProvider, ProviderModelMixin):
28 30 return cls.model_aliases[model]
29 31 else:
30 32 return cls.default_model
31
33
32 34 @classmethod
33 async def create_async_generator(
35 def create_completion(
34 36 cls,
35 37 model: str,
36 38 messages: Messages,
37 proxy: str = None,
38 stream: bool = False,
39 markdown: bool = False,
40 websearch: bool = False,
39 stream: bool,
41 40 **kwargs
42 ) -> AsyncResult:
43 model = cls.get_model(model)
41 ) -> CreateResult:
42 model = model or cls.default_model
44 43
45 44 headers = {
46 "Content-Type": "application/json"
45 'Content-Type': 'application/json'
47 46 }
48 47
49 payload = {
50 "messages": [{"role": msg["role"], "content": msg["content"]} for msg in messages],
51 "websearch": websearch,
48 data = {
49 "messages": [
50 {
51 "role": "user",
52 "content": format_prompt(messages)
53 }
54 ],
55 "websearch": False,
52 56 "stream": stream,
53 "markdown": markdown,
57 "markdown": False,
54 58 "model": model
55 59 }
56
57 timeout = ClientTimeout(total=600) # 10 minutes timeout
58 60
59 try:
60 async with ClientSession(headers=headers, timeout=timeout) as session:
61 async with session.post(cls.api_endpoint, json=payload, proxy=proxy) as response:
62 if response.status != 200:
63 error_text = await response.text()
64 raise Exception(f"Error: {response.status} - {error_text}")
65
66 content = await response.text()
67
68 # Split content by Record Separator character
69 parts = content.split('\x1e')
70 full_message = ""
71 links = []
72
73 for part in parts:
74 if part:
75 try:
76 json_response = json.loads(part)
77
78 if json_response.get("message"):
79 full_message = json_response["message"] # Overwrite instead of append
80
81 if isinstance(json_response.get("search"), list):
82 links = json_response["search"] # Overwrite instead of extend
83
84 if json_response.get("finish", False):
85 break
86
87 except json.JSONDecodeError:
88 pass
89
90 if full_message:
91 yield full_message.strip()
61 response = requests.post(cls.url, headers=headers, json=data, stream=stream)
62
63 if stream:
64 return cls.process_streaming_response(response)
65 else:
66 return cls.process_non_streaming_response(response)
92 67
93 if payload["websearch"] and links:
94 yield "\n\n**Source:**"
95 for i, link in enumerate(links, start=1):
96 yield f"\n{i}. {link['title']}: {link['link']}"
68 @classmethod
69 def process_non_streaming_response(cls, response):
70 if response.status_code == 200:
71 try:
72 full_response = ""
73 for line in response.iter_lines(decode_unicode=True):
74 if line:
75 data = json.loads(line)
76 if data.get('finish'):
77 break
78 message = data.get('message', '')
79 if message:
80 full_response = message
81 return full_response
82 except json.JSONDecodeError:
83 return "Error: Unable to decode JSON response"
84 else:
85 return f"Error: {response.status_code}"
97 86
98 except ClientError:
99 raise
100 except Exception:
101 raise
87 @classmethod
88 def process_streaming_response(cls, response):
89 previous_message = ""
90 for line in response.iter_lines(decode_unicode=True):
91 if line:
92 try:
93 data = json.loads(line)
94 if data.get('finish'):
95 break
96 message = data.get('message', '')
97 if message and message != previous_message:
98 yield message[len(previous_message):]
99 previous_message = message
100 except json.JSONDecodeError:
101 pass
Modified g4f/models.py +3 -2
@@ -443,7 +443,8 @@ reka_core = Model(
443 443 blackboxai = Model(
444 444 name = 'blackboxai',
445 445 base_provider = 'Blackbox AI',
446 best_provider = IterListProvider([Blackbox, NexraBlackbox])
446 #best_provider = IterListProvider([Blackbox, NexraBlackbox])
447 best_provider = IterListProvider([NexraBlackbox])
447 448 )
448 449
449 450 blackboxai_pro = Model(
@@ -766,7 +767,7 @@ flux = Model(
766 767 flux_pro = Model(
767 768 name = 'flux-pro',
768 769 base_provider = 'Flux AI',
769 best_provider = IterListProvider([NexraFluxPro, AmigoChat])
770 best_provider = IterListProvider([AmigoChat, NexraFluxPro])
770 771
771 772 )
772 773