返回提交历史
Modified
g4f/gui/client/css/style.css
+33
-0
Modified
g4f/gui/client/js/chat.v1.js
+36
-16
Modified
g4f/gui/server/backend.py
+14
-34
XFEstudio/gpt4free
added context
03dc8532
代码差异
3 个文件
+83
-50
@@ -260,6 +260,32 @@ body {
260
260
z-index: 10000;
261
261
}
262
262
263
.message .assistant{
264
max-width: 48px;
265
max-height: 48px;
266
flex-shrink: 0;
267
}
268
269
.message .assistant img {
270
width: 100%;
271
height: 100%;
272
object-fit: cover;
273
border-radius: 8px;
274
outline: 1px solid var(--blur-border);
275
}
276
277
.message .assistant:after {
278
content: "63";
279
position: absolute;
280
bottom: 0;
281
right: 0;
282
height: 60%;
283
width: 60%;
284
background: var(--colour-3);
285
filter: blur(10px) opacity(0.5);
286
z-index: 10000;
287
}
288
263
289
.message .content {
264
290
display: flex;
265
291
flex-direction: column;
@@ -280,6 +306,13 @@ body {
280
306
z-index: 1000;
281
307
}
282
308
309
.message .assistant i {
310
position: absolute;
311
bottom: -6px;
312
right: -6px;
313
z-index: 1000;
314
}
315
283
316
.new_convo {
284
317
padding: 8px 12px;
285
318
display: flex;
@@ -31,12 +31,37 @@ const handle_ask = async () => {
31
31
message_input.style.height = `80px`;
32
32
message_input.focus();
33
33
34
let txtMsgs = [];
35
const divTags = document.getElementsByClassName("message");
36
for(let i=0;i<divTags.length;i++){
37
if(!divTags[i].children[1].classList.contains("welcome-message")){
38
if(divTags[i].children[0].className == "assistant"){
39
const msg = {
40
role: "assistant",
41
content: divTags[i].children[1].textContent+" "
42
};
43
txtMsgs.push(msg);
44
}else{
45
const msg = {
46
role: "user",
47
content: divTags[i].children[1].textContent+" "
48
};
49
txtMsgs.push(msg);
50
}
51
}
52
}
53
34
54
window.scrollTo(0, 0);
35
55
let message = message_input.value;
56
const msg = {
57
role: "user",
58
content: message
59
};
60
txtMsgs.push(msg);
36
61
37
62
if (message.length > 0) {
38
63
message_input.value = ``;
39
await ask_gpt(message);
64
await ask_gpt(txtMsgs);
40
65
}
41
66
};
42
67
@@ -49,13 +74,13 @@ const remove_cancel_button = async () => {
49
74
}, 300);
50
75
};
51
76
52
const ask_gpt = async (message) => {
77
const ask_gpt = async (txtMsgs) => {
53
78
try {
54
79
message_input.value = ``;
55
80
message_input.innerHTML = ``;
56
81
message_input.innerText = ``;
57
82
58
add_conversation(window.conversation_id, message);
83
add_conversation(window.conversation_id, txtMsgs[0].content);
59
84
window.scrollTo(0, 0);
60
85
window.controller = new AbortController();
61
86
@@ -75,7 +100,7 @@ const ask_gpt = async (message) => {
75
100
<i class="fa-regular fa-phone-arrow-up-right"></i>
76
101
</div>
77
102
<div class="content" id="user_${token}">
78
${format(message)}
103
${format(txtMsgs[txtMsgs.length-1].content)}
79
104
</div>
80
105
</div>
81
106
`;
@@ -87,7 +112,7 @@ const ask_gpt = async (message) => {
87
112
88
113
message_box.innerHTML += `
89
114
<div class="message">
90
<div class="user">
115
<div class="assistant">
91
116
${gpt_image} <i class="fa-regular fa-phone-arrow-down-left"></i>
92
117
</div>
93
118
<div class="content" id="gpt_${window.token}">
@@ -120,12 +145,7 @@ const ask_gpt = async (message) => {
120
145
conversation: await get_conversation(window.conversation_id),
121
146
internet_access: document.getElementById(`switch`).checked,
122
147
content_type: `text`,
123
parts: [
124
{
125
content: message,
126
role: `user`,
127
},
128
],
148
parts: txtMsgs,
129
149
},
130
150
},
131
151
}),
@@ -154,7 +174,7 @@ const ask_gpt = async (message) => {
154
174
document.getElementById(`gpt_${window.token}`).innerHTML = "An error occured, please try again, if the problem persists, please reload / refresh cache or use a differnet browser";
155
175
}
156
176
157
add_message(window.conversation_id, "user", message);
177
add_message(window.conversation_id, "user", txtMsgs[txtMsgs.length-1].content);
158
178
add_message(window.conversation_id, "assistant", text);
159
179
160
180
message_box.scrollTop = message_box.scrollHeight;
@@ -165,7 +185,7 @@ const ask_gpt = async (message) => {
165
185
window.scrollTo(0, 0);
166
186
167
187
} catch (e) {
168
add_message(window.conversation_id, "user", message);
188
add_message(window.conversation_id, "user", txtMsgs[txtMsgs.length-1].content);
169
189
170
190
message_box.scrollTop = message_box.scrollHeight;
171
191
await remove_cancel_button();
@@ -279,7 +299,7 @@ const load_conversation = async (conversation_id) => {
279
299
for (item of conversation.items) {
280
300
message_box.innerHTML += `
281
301
<div class="message">
282
<div class="user">
302
<div class=${item.role == "assistant" ? "assistant" : "user"}>
283
303
${item.role == "assistant" ? gpt_image : user_image}
284
304
${item.role == "assistant"
285
305
? `<i class="fa-regular fa-phone-arrow-down-left"></i>`
@@ -316,7 +336,7 @@ const get_conversation = async (conversation_id) => {
316
336
317
337
const add_conversation = async (conversation_id, content) => {
318
338
if (content.length > 17) {
319
title = content.substring(0, 17) + '..'
339
title = content.substring(0, 17) + '...'
320
340
} else {
321
341
title = content + ' '.repeat(19 - content.length)
322
342
}
@@ -461,7 +481,7 @@ const say_hello = async () => {
461
481
462
482
message_box.innerHTML += `
463
483
<div class="message">
464
<div class="user">
484
<div class="assistant">
465
485
${gpt_image}
466
486
<i class="fa-regular fa-phone-arrow-down-left"></i>
467
487
</div>
@@ -1,5 +1,4 @@
1
1
import g4f
2
import json
3
2
4
3
from flask import request
5
4
from .internet import search
@@ -44,45 +43,26 @@ class Backend_Api:
44
43
}
45
44
46
45
def _conversation(self):
47
config = None
48
proxy = None
49
46
try:
50
config = json.load(open("config.json","r",encoding="utf-8"))
51
proxy = config["proxy"]
52
53
except Exception:
54
pass
55
56
try:
57
jailbreak = request.json['jailbreak']
58
internet_access = request.json['meta']['content']['internet_access']
59
conversation = request.json['meta']['content']['conversation']
60
prompt = request.json['meta']['content']['parts'][0]
47
#jailbreak = request.json['jailbreak']
48
#internet_access = request.json['meta']['content']['internet_access']
49
#conversation = request.json['meta']['content']['conversation']
50
prompt = request.json['meta']['content']['parts']
61
51
model = request.json['model']
62
52
provider = request.json.get('provider').split('g4f.Provider.')[1]
63
53
64
messages = special_instructions[jailbreak] + conversation + search(internet_access, prompt) + [prompt]
54
messages = prompt
55
print(messages)
65
56
66
57
def stream():
67
if proxy != None:
68
yield from g4f.ChatCompletion.create(
69
model=model,
70
provider=get_provider(provider),
71
messages=messages,
72
stream=True,
73
proxy=proxy
74
) if provider else g4f.ChatCompletion.create(
75
model=model, messages=messages, stream=True, proxy=proxy
76
)
77
else:
78
yield from g4f.ChatCompletion.create(
79
model=model,
80
provider=get_provider(provider),
81
messages=messages,
82
stream=True,
83
) if provider else g4f.ChatCompletion.create(
84
model=model, messages=messages, stream=True
85
)
58
yield from g4f.ChatCompletion.create(
59
model=g4f.models.gpt_35_long,
60
provider=get_provider(provider),
61
messages=messages,
62
stream=True,
63
) if provider else g4f.ChatCompletion.create(
64
model=model, messages=messages, stream=True
65
)
86
66
87
67
return self.app.response_class(stream(), mimetype='text/event-stream')
88
68