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

XFEstudio/gpt4free

Fix history support for OpenaiChat

03fd5ac9
Heiner Lohaus <hlohaus@users.noreply.github.com>
提交于

代码差异

3 个文件 +15 -13
Modified g4f/Provider/needs_auth/OpenaiChat.py +5 -6
@@ -389,19 +389,17 @@ class OpenaiChat(AsyncGeneratorProvider, ProviderModelMixin):
389 389 print(f"{e.__class__.__name__}: {e}")
390 390
391 391 model = cls.get_model(model).replace("gpt-3.5-turbo", "text-davinci-002-render-sha")
392 fields = Conversation() if conversation is None else copy(conversation)
392 fields = Conversation(conversation_id, parent_id) if conversation is None else copy(conversation)
393 393 fields.finish_reason = None
394 394 while fields.finish_reason is None:
395 conversation_id = fields.conversation_id if hasattr(fields, "conversation_id") else conversation_id
396 parent_id = fields.message_id if hasattr(fields, "message_id") else parent_id
397 395 websocket_request_id = str(uuid.uuid4())
398 396 data = {
399 397 "action": action,
400 398 "conversation_mode": {"kind": "primary_assistant"},
401 399 "force_paragen": False,
402 400 "force_rate_limit": False,
403 "conversation_id": conversation_id,
404 "parent_message_id": parent_id,
401 "conversation_id": fields.conversation_id,
402 "parent_message_id": fields.message_id,
405 403 "model": model,
406 404 "history_and_training_disabled": history_disabled and not auto_continue and not return_conversation,
407 405 "websocket_request_id": websocket_request_id
@@ -425,6 +423,7 @@ class OpenaiChat(AsyncGeneratorProvider, ProviderModelMixin):
425 423 await raise_for_status(response)
426 424 async for chunk in cls.iter_messages_chunk(response.iter_lines(), session, fields):
427 425 if return_conversation:
426 history_disabled = False
428 427 return_conversation = False
429 428 yield fields
430 429 yield chunk
@@ -432,7 +431,7 @@ class OpenaiChat(AsyncGeneratorProvider, ProviderModelMixin):
432 431 break
433 432 action = "continue"
434 433 await asyncio.sleep(5)
435 if history_disabled and auto_continue and not return_conversation:
434 if history_disabled and auto_continue:
436 435 await cls.delete_conversation(session, cls._headers, fields.conversation_id)
437 436
438 437 @staticmethod
Modified g4f/gui/server/api.py +9 -6
@@ -41,7 +41,7 @@ from g4f.providers.base_provider import ProviderModelMixin
41 41 from g4f.Provider.bing.create_images import patch_provider
42 42 from g4f.providers.conversation import BaseConversation
43 43
44 conversations: dict[str, BaseConversation] = {}
44 conversations: dict[dict[str, BaseConversation]] = {}
45 45
46 46 class Api():
47 47
@@ -106,7 +106,8 @@ class Api():
106 106 kwargs["image"] = open(self.image, "rb")
107 107 for message in self._create_response_stream(
108 108 self._prepare_conversation_kwargs(options, kwargs),
109 options.get("conversation_id")
109 options.get("conversation_id"),
110 options.get('provider')
110 111 ):
111 112 if not window.evaluate_js(f"if (!this.abort) this.add_message_chunk({json.dumps(message)}); !this.abort && !this.error;"):
112 113 break
@@ -193,8 +194,8 @@ class Api():
193 194 messages[-1]["content"] = get_search_message(messages[-1]["content"])
194 195
195 196 conversation_id = json_data.get("conversation_id")
196 if conversation_id and conversation_id in conversations:
197 kwargs["conversation"] = conversations[conversation_id]
197 if conversation_id and provider in conversations and conversation_id in conversations[provider]:
198 kwargs["conversation"] = conversations[provider][conversation_id]
198 199
199 200 model = json_data.get('model')
200 201 model = model if model else models.default
@@ -211,7 +212,7 @@ class Api():
211 212 **kwargs
212 213 }
213 214
214 def _create_response_stream(self, kwargs, conversation_id: str) -> Iterator:
215 def _create_response_stream(self, kwargs: dict, conversation_id: str, provider: str) -> Iterator:
215 216 """
216 217 Creates and returns a streaming response for the conversation.
217 218
@@ -231,7 +232,9 @@ class Api():
231 232 first = False
232 233 yield self._format_json("provider", get_last_provider(True))
233 234 if isinstance(chunk, BaseConversation):
234 conversations[conversation_id] = chunk
235 if provider not in conversations:
236 conversations[provider] = {}
237 conversations[provider][conversation_id] = chunk
235 238 yield self._format_json("conversation", conversation_id)
236 239 elif isinstance(chunk, Exception):
237 240 logging.exception(chunk)
Modified g4f/gui/server/backend.py +1 -1
@@ -85,7 +85,7 @@ class Backend_Api(Api):
85 85 kwargs = self._prepare_conversation_kwargs(json_data, kwargs)
86 86
87 87 return self.app.response_class(
88 self._create_response_stream(kwargs, json_data.get("conversation_id")),
88 self._create_response_stream(kwargs, json_data.get("conversation_id"), json_data.get("provider")),
89 89 mimetype='text/event-stream'
90 90 )
91 91