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

XFEstudio/gpt4free

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

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

代码差异

1 个文件 +49 -32
Modified g4f/Provider/nexra/NexraGeminiPro.py +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