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

XFEstudio/gpt4free

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

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

代码差异

1 个文件 +64 -52
Modified g4f/Provider/nexra/NexraChatGPT4o.py +64 -52
@@ -1,73 +1,85 @@
1 1 from __future__ import annotations
2 2
3 from aiohttp import ClientSession
3 import json
4 import requests
4 5
5 from ...typing import AsyncResult, Messages
6 from ..base_provider import AsyncGeneratorProvider, ProviderModelMixin
6 from ...typing import CreateResult, Messages
7 from ..base_provider import ProviderModelMixin, AbstractProvider
7 8 from ..helper import format_prompt
8 import json
9 9
10 class NexraChatGPT4o(AsyncGeneratorProvider, ProviderModelMixin):
10 class NexraChatGPT4o(AbstractProvider, ProviderModelMixin):
11 11 label = "Nexra ChatGPT4o"
12 12 url = "https://nexra.aryahcr.cc/documentation/chatgpt/en"
13 13 api_endpoint = "https://nexra.aryahcr.cc/api/chat/complements"
14 working = False
15 supports_stream = False
14 working = True
15 supports_stream = True
16 16
17 default_model = 'gpt-4o'
17 default_model = "gpt-4o"
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,
29 stream: bool,
30 markdown: bool = False,
30 31 **kwargs
31 ) -> AsyncResult:
32 ) -> CreateResult:
32 33 model = cls.get_model(model)
33
34
34 35 headers = {
35 "Content-Type": "application/json",
36 'Content-Type': 'application/json'
36 37 }
37 async with ClientSession(headers=headers) as session:
38 data = {
39 "messages": [
40 {
41 "role": "user",
42 "content": format_prompt(messages)
43 }
44 ],
45 "stream": False,
46 "markdown": False,
47 "model": model
48 }
49 async with session.post(cls.api_endpoint, json=data, proxy=proxy) as response:
50 response.raise_for_status()
51 buffer = ""
52 last_message = ""
53 async for chunk in response.content.iter_any():
54 chunk_str = chunk.decode()
55 buffer += chunk_str
56 while '{' in buffer and '}' in buffer:
57 start = buffer.index('{')
58 end = buffer.index('}', start) + 1
59 json_str = buffer[start:end]
60 buffer = buffer[end:]
61 try:
62 json_obj = json.loads(json_str)
63 if json_obj.get("finish"):
64 if last_message:
65 yield last_message
66 return
67 elif json_obj.get("message"):
68 last_message = json_obj["message"]
69 except json.JSONDecodeError:
70 pass
71
72 if last_message:
73 yield last_message
38
39 data = {
40 "messages": [
41 {
42 "role": "user",
43 "content": format_prompt(messages)
44 }
45 ],
46 "stream": stream,
47 "markdown": markdown,
48 "model": model
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)
57
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 and message != full_message:
82 yield message[len(full_message):]
83 full_message = message
84 except json.JSONDecodeError:
85 pass