返回提交历史
Modified
g4f/Provider/needs_auth/OpenaiChat.py
+5
-6
Modified
g4f/gui/server/api.py
+9
-6
Modified
g4f/gui/server/backend.py
+1
-1
XFEstudio/gpt4free
Fix history support for OpenaiChat
03fd5ac9
代码差异
3 个文件
+15
-13
@@ -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
@@ -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)
@@ -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