返回提交历史
Modified
g4f/Provider/nexra/NexraGeminiPro.py
+49
-32
XFEstudio/gpt4free
Restored provider (g4f/Provider/nexra/NexraGeminiPro.py)
ef6ec5d4
代码差异
1 个文件
+49
-32
@@ -1,42 +1,41 @@
1
1
from __future__ import annotations
2
2
3
from aiohttp import ClientSession
4
3
import json
5
from ..base_provider import AsyncGeneratorProvider, ProviderModelMixin
6
from ..helper import format_prompt
7
from ...typing import AsyncResult, Messages
4
import requests
8
5
6
from ...typing import CreateResult, Messages
7
from ..base_provider import ProviderModelMixin, AbstractProvider
8
from ..helper import format_prompt
9
9
10
class NexraGeminiPro(AsyncGeneratorProvider, ProviderModelMixin):
10
class NexraGeminiPro(AbstractProvider, ProviderModelMixin):
11
11
label = "Nexra Gemini PRO"
12
12
url = "https://nexra.aryahcr.cc/documentation/gemini-pro/en"
13
13
api_endpoint = "https://nexra.aryahcr.cc/api/chat/complements"
14
working = False
14
working = True
15
15
supports_stream = True
16
16
17
17
default_model = 'gemini-pro'
18
18
models = [default_model]
19
19
20
20
@classmethod
21
21
def get_model(cls, model: str) -> str:
22
22
return cls.default_model
23
23
24
24
@classmethod
25
async def create_async_generator(
25
def create_completion(
26
26
cls,
27
27
model: str,
28
28
messages: Messages,
29
proxy: str = None,
30
stream: bool = False,
29
stream: bool,
31
30
markdown: bool = False,
32
31
**kwargs
33
) -> AsyncResult:
32
) -> CreateResult:
34
33
model = cls.get_model(model)
35
34
36
35
headers = {
37
"Content-Type": "application/json"
36
'Content-Type': 'application/json'
38
37
}
39
38
40
39
data = {
41
40
"messages": [
42
41
{
@@ -44,25 +43,43 @@ class NexraGeminiPro(AsyncGeneratorProvider, ProviderModelMixin):
44
43
"content": format_prompt(messages)
45
44
}
46
45
],
47
"markdown": markdown,
48
46
"stream": stream,
47
"markdown": markdown,
49
48
"model": model
50
49
}
50
51
response = requests.post(cls.api_endpoint, headers=headers, json=data, stream=stream)
52
53
if stream:
54
return cls.process_streaming_response(response)
55
else:
56
return cls.process_non_streaming_response(response)
51
57
52
async with ClientSession(headers=headers) as session:
53
async with session.post(cls.api_endpoint, json=data, proxy=proxy) as response:
54
response.raise_for_status()
55
buffer = ""
56
async for chunk in response.content.iter_any():
57
if chunk.strip(): # Check if chunk is not empty
58
buffer += chunk.decode()
59
while '\x1e' in buffer:
60
part, buffer = buffer.split('\x1e', 1)
61
if part.strip():
62
try:
63
response_json = json.loads(part)
64
message = response_json.get("message", "")
65
if message:
66
yield message
67
except json.JSONDecodeError as e:
68
print(f"JSONDecodeError: {e}")
58
@classmethod
59
def process_non_streaming_response(cls, response):
60
if response.status_code == 200:
61
try:
62
content = response.text.lstrip('`')
63
data = json.loads(content)
64
return data.get('message', '')
65
except json.JSONDecodeError:
66
return "Error: Unable to decode JSON response"
67
else:
68
return f"Error: {response.status_code}"
69
70
@classmethod
71
def process_streaming_response(cls, response):
72
full_message = ""
73
for line in response.iter_lines(decode_unicode=True):
74
if line:
75
try:
76
line = line.lstrip('`')
77
data = json.loads(line)
78
if data.get('finish'):
79
break
80
message = data.get('message', '')
81
if message:
82
yield message[len(full_message):]
83
full_message = message
84
except json.JSONDecodeError:
85
pass