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

XFEstudio/gpt4free

Add conversation support in HuggingChat

9e3c046d
Heiner Lohaus <hlohaus@users.noreply.github.com>
提交于

代码差异

6 个文件 +71 -45
Modified g4f/Provider/MagickPen.py +1 -1
@@ -13,7 +13,7 @@ from .helper import format_prompt
13 13 class MagickPen(AsyncGeneratorProvider, ProviderModelMixin):
14 14 url = "https://magickpen.com"
15 15 api_endpoint = "https://api.magickpen.com/ask"
16 working = True
16 working = False
17 17 supports_stream = True
18 18 supports_system_message = True
19 19 supports_message_history = True
Modified g4f/Provider/Pizzagpt.py +3 -3
@@ -1,6 +1,5 @@
1 1 from __future__ import annotations
2 2
3 import json
4 3 from aiohttp import ClientSession
5 4
6 5 from ..typing import AsyncResult, Messages
@@ -45,5 +44,6 @@ class Pizzagpt(AsyncGeneratorProvider, ProviderModelMixin):
45 44 async with session.post(f"{cls.url}{cls.api_endpoint}", json=data, proxy=proxy) as response:
46 45 response.raise_for_status()
47 46 response_json = await response.json()
48 content = response_json.get("answer", {}).get("content", "")
49 yield content
47 content = response_json.get("answer", response_json).get("content")
48 if content:
49 yield content
Modified g4f/Provider/Prodia.py +0 -1
@@ -1,7 +1,6 @@
1 1 from __future__ import annotations
2 2
3 3 from aiohttp import ClientSession
4 import time
5 4 import asyncio
6 5
7 6 from ..typing import AsyncResult, Messages
Modified g4f/Provider/Upstage.py +1 -1
@@ -11,7 +11,7 @@ from .helper import format_prompt
11 11 class Upstage(AsyncGeneratorProvider, ProviderModelMixin):
12 12 url = "https://console.upstage.ai/playground/chat"
13 13 api_endpoint = "https://ap-northeast-2.apistage.ai/v1/web/demo/chat/completions"
14 working = True
14 working = False
15 15 default_model = 'solar-pro'
16 16 models = [
17 17 'upstage/solar-1-mini-chat',
Modified g4f/Provider/needs_auth/HuggingChat.py +65 -39
@@ -12,8 +12,14 @@ from ...typing import CreateResult, Messages, Cookies
12 12 from ...errors import MissingRequirementsError
13 13 from ...requests.raise_for_status import raise_for_status
14 14 from ...cookies import get_cookies
15 from ..base_provider import ProviderModelMixin, AbstractProvider
15 from ..base_provider import ProviderModelMixin, AbstractProvider, BaseConversation
16 16 from ..helper import format_prompt
17 from ... import debug
18
19 class Conversation(BaseConversation):
20 def __init__(self, conversation_id: str, message_id: str):
21 self.conversation_id = conversation_id
22 self.message_id = message_id
17 23
18 24 class HuggingChat(AbstractProvider, ProviderModelMixin):
19 25 url = "https://huggingface.co/chat"
@@ -54,6 +60,8 @@ class HuggingChat(AbstractProvider, ProviderModelMixin):
54 60 model: str,
55 61 messages: Messages,
56 62 stream: bool,
63 return_conversation: bool = False,
64 conversation: Conversation = None,
57 65 web_search: bool = False,
58 66 cookies: Cookies = None,
59 67 **kwargs
@@ -81,45 +89,23 @@ class HuggingChat(AbstractProvider, ProviderModelMixin):
81 89 'sec-fetch-site': 'same-origin',
82 90 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36',
83 91 }
84 json_data = {
85 'model': model,
86 }
87 response = session.post('https://huggingface.co/chat/conversation', json=json_data)
88 raise_for_status(response)
89 92
90 conversationId = response.json().get('conversationId')
91
92 # Get the data response and parse it properly
93 response = session.get(f'https://huggingface.co/chat/conversation/{conversationId}/__data.json?x-sveltekit-invalidated=11')
94 raise_for_status(response)
93 if conversation is None:
94 conversationId = cls.create_conversation(session, model)
95 messageId = cls.fetch_message_id(session, conversationId)
96 conversation = Conversation(conversationId, messageId)
97 if return_conversation:
98 yield conversation
99 inputs = format_prompt(messages)
100 else:
101 conversation.message_id = cls.fetch_message_id(session, conversation.conversation_id)
102 inputs = messages[-1]["content"]
95 103
96 # Split the response content by newlines and parse each line as JSON
97 try:
98 json_data = None
99 for line in response.text.split('\n'):
100 if line.strip():
101 try:
102 parsed = json.loads(line)
103 if isinstance(parsed, dict) and "nodes" in parsed:
104 json_data = parsed
105 break
106 except json.JSONDecodeError:
107 continue
108
109 if not json_data:
110 raise RuntimeError("Failed to parse response data")
111
112 data: list = json_data["nodes"][1]["data"]
113 keys: list[int] = data[data[0]["messages"]]
114 message_keys: dict = data[keys[0]]
115 messageId: str = data[message_keys["id"]]
116
117 except (KeyError, IndexError, TypeError) as e:
118 raise RuntimeError(f"Failed to extract message ID: {str(e)}")
104 debug.log(f"Use conversation: {conversation.conversation_id} Use message: {conversation.message_id}")
119 105
120 106 settings = {
121 "inputs": format_prompt(messages),
122 "id": messageId,
107 "inputs": inputs,
108 "id": conversation.message_id,
123 109 "is_retry": False,
124 110 "is_continue": False,
125 111 "web_search": web_search,
@@ -133,7 +119,7 @@ class HuggingChat(AbstractProvider, ProviderModelMixin):
133 119 'origin': 'https://huggingface.co',
134 120 'pragma': 'no-cache',
135 121 'priority': 'u=1, i',
136 'referer': f'https://huggingface.co/chat/conversation/{conversationId}',
122 'referer': f'https://huggingface.co/chat/conversation/{conversation.conversation_id}',
137 123 'sec-ch-ua': '"Not)A;Brand";v="99", "Google Chrome";v="127", "Chromium";v="127"',
138 124 'sec-ch-ua-mobile': '?0',
139 125 'sec-ch-ua-platform': '"macOS"',
@@ -147,7 +133,7 @@ class HuggingChat(AbstractProvider, ProviderModelMixin):
147 133 data.addpart('data', data=json.dumps(settings, separators=(',', ':')))
148 134
149 135 response = session.post(
150 f'https://huggingface.co/chat/conversation/{conversationId}',
136 f'https://huggingface.co/chat/conversation/{conversation.conversation_id}',
151 137 cookies=session.cookies,
152 138 headers=headers,
153 139 multipart=data,
@@ -180,4 +166,44 @@ class HuggingChat(AbstractProvider, ProviderModelMixin):
180 166 full_response = full_response.replace('<|im_end|', '').replace('\u0000', '').strip()
181 167
182 168 if not stream:
183 yield full_response
169 yield full_response
170
171 @classmethod
172 def create_conversation(cls, session: Session, model: str):
173 json_data = {
174 'model': model,
175 }
176 response = session.post('https://huggingface.co/chat/conversation', json=json_data)
177 raise_for_status(response)
178
179 return response.json().get('conversationId')
180
181 @classmethod
182 def fetch_message_id(cls, session: Session, conversation_id: str):
183 # Get the data response and parse it properly
184 response = session.get(f'https://huggingface.co/chat/conversation/{conversation_id}/__data.json?x-sveltekit-invalidated=11')
185 raise_for_status(response)
186
187 # Split the response content by newlines and parse each line as JSON
188 try:
189 json_data = None
190 for line in response.text.split('\n'):
191 if line.strip():
192 try:
193 parsed = json.loads(line)
194 if isinstance(parsed, dict) and "nodes" in parsed:
195 json_data = parsed
196 break
197 except json.JSONDecodeError:
198 continue
199
200 if not json_data:
201 raise RuntimeError("Failed to parse response data")
202
203 data = json_data["nodes"][1]["data"]
204 keys = data[data[0]["messages"]]
205 message_keys = data[keys[-1]]
206 return data[message_keys["id"]]
207
208 except (KeyError, IndexError, TypeError) as e:
209 raise RuntimeError(f"Failed to extract message ID: {str(e)}")
Modified g4f/Provider/needs_auth/PollinationsAI.py +1 -0
@@ -16,6 +16,7 @@ class PollinationsAI(OpenaiAPI):
16 16 label = "Pollinations.AI"
17 17 url = "https://pollinations.ai"
18 18 working = True
19 needs_auth = False
19 20 supports_stream = True
20 21 default_model = "openai"
21 22