返回提交历史
Modified
g4f/client/service.py
+7
-5
Modified
g4f/gui/client/static/js/chat.v1.js
+12
-14
Modified
g4f/gui/server/api.py
+2
-1
Modified
g4f/requests/raise_for_status.py
+4
-2
XFEstudio/gpt4free
Fix show html in gui
3b7b79f5
代码差异
4 个文件
+25
-22
@@ -26,7 +26,8 @@ def get_model_and_provider(model : Union[Model, str],
26
26
stream : bool,
27
27
ignored : list[str] = None,
28
28
ignore_working: bool = False,
29
ignore_stream: bool = False) -> tuple[str, ProviderType]:
29
ignore_stream: bool = False,
30
logging: bool = True) -> tuple[str, ProviderType]:
30
31
"""
31
32
Retrieves the model and provider based on input parameters.
32
33
@@ -92,10 +93,11 @@ def get_model_and_provider(model : Union[Model, str],
92
93
if not ignore_stream and not provider.supports_stream and stream:
93
94
raise StreamNotSupportedError(f'{provider_name} does not support "stream" argument')
94
95
95
if model:
96
debug.log(f'Using {provider_name} provider and {model} model')
97
else:
98
debug.log(f'Using {provider_name} provider')
96
if logging:
97
if model:
98
debug.log(f'Using {provider_name} provider and {model} model')
99
else:
100
debug.log(f'Using {provider_name} provider')
99
101
100
102
debug.last_provider = provider
101
103
debug.last_model = model
@@ -503,7 +503,7 @@ async function add_message_chunk(message, message_id) {
503
503
} else if (message.type == "error") {
504
504
error_storage[message_id] = message.error
505
505
console.error(message.error);
506
content_map.inner.innerHTML += `<p><strong>An error occured:</strong> ${message.error}</p>`;
506
content_map.inner.innerHTML += markdown_render(`**An error occured:** ${message.error}`);
507
507
let p = document.createElement("p");
508
508
p.innerText = message.error;
509
509
log_storage.appendChild(p);
@@ -609,7 +609,7 @@ const ask_gpt = async (message_id, message_index = -1, regenerate = false, provi
609
609
const files = input && input.files.length > 0 ? input.files : null;
610
610
const auto_continue = document.getElementById("auto_continue")?.checked;
611
611
const download_images = document.getElementById("download_images")?.checked;
612
let api_key = get_api_key_by_provider(provider);
612
const api_key = get_api_key_by_provider(provider);
613
613
const ignored = Array.from(settings.querySelectorAll("input.provider:not(:checked)")).map((el)=>el.value);
614
614
await api("conversation", {
615
615
id: message_id,
@@ -635,7 +635,7 @@ const ask_gpt = async (message_id, message_index = -1, regenerate = false, provi
635
635
console.error(e);
636
636
if (e.name != "AbortError") {
637
637
error_storage[message_id] = true;
638
content_map.inner.innerHTML += `<p><strong>An error occured:</strong> ${e}</p>`;
638
content_map.inner.innerHTML += markdown_render(`**An error occured:** ${e}`);
639
639
}
640
640
}
641
641
delete controller_storage[message_id];
@@ -771,7 +771,6 @@ const set_conversation = async (conversation_id) => {
771
771
await load_conversation(conversation_id);
772
772
load_conversations();
773
773
hide_sidebar();
774
log_storage.classList.add("hidden");
775
774
};
776
775
777
776
const new_conversation = async () => {
@@ -785,7 +784,6 @@ const new_conversation = async () => {
785
784
}
786
785
load_conversations();
787
786
hide_sidebar();
788
log_storage.classList.add("hidden");
789
787
say_hello();
790
788
};
791
789
@@ -1104,10 +1102,10 @@ async function hide_sidebar() {
1104
1102
1105
1103
window.addEventListener('popstate', hide_sidebar, false);
1106
1104
1107
sidebar_button.addEventListener("click", (event) => {
1105
sidebar_button.addEventListener("click", async () => {
1108
1106
settings.classList.add("hidden");
1109
1107
if (sidebar.classList.contains("shown")) {
1110
hide_sidebar();
1108
await hide_sidebar();
1111
1109
} else {
1112
1110
sidebar.classList.add("shown");
1113
1111
sidebar_button.classList.add("rotated");
@@ -1365,11 +1363,10 @@ async function on_api() {
1365
1363
option = document.createElement("div");
1366
1364
option.classList.add("field");
1367
1365
option.innerHTML = `
1368
<div class="field">
1369
<span class="label">Enable ${provider.label}</span>
1370
<input id="Provider${provider.name}" type="checkbox" name="Provider${provider.name}" value="${provider.name}" class="provider" checked="">
1371
<label for="Provider${provider.name}" class="toogle" title="Remove provider from dropdown"></label>
1372
</div>`;
1366
<span class="label">Enable ${provider.label}</span>
1367
<input id="Provider${provider.name}" type="checkbox" name="Provider${provider.name}" value="${provider.name}" class="provider" checked="">
1368
<label for="Provider${provider.name}" class="toogle" title="Remove provider from dropdown"></label>
1369
`;
1373
1370
option.querySelector("input").addEventListener("change", (event) => load_provider_option(event.target, provider.name));
1374
1371
settings.querySelector(".paper").appendChild(option);
1375
1372
provider_options[provider.name] = option;
@@ -1405,7 +1402,7 @@ async function on_api() {
1405
1402
});
1406
1403
document.querySelector(".slide-systemPrompt")?.addEventListener("click", () => {
1407
1404
hide_systemPrompt.click();
1408
let checked = hide_systemPrompt.checked;
1405
const checked = hide_systemPrompt.checked;
1409
1406
systemPrompt.classList[checked ? "add": "remove"]("hidden");
1410
1407
slide_systemPrompt_icon.classList[checked ? "remove": "add"]("fa-angles-up");
1411
1408
slide_systemPrompt_icon.classList[checked ? "add": "remove"]("fa-angles-down");
@@ -1599,8 +1596,9 @@ function get_api_key_by_provider(provider) {
1599
1596
let api_key = null;
1600
1597
if (provider) {
1601
1598
api_key = document.getElementById(`${provider}-api_key`)?.value || null;
1602
if (api_key == null)
1599
if (api_key == null) {
1603
1600
api_key = document.querySelector(`.${provider}-api_key`)?.value || null;
1601
}
1604
1602
}
1605
1603
return api_key;
1606
1604
}
@@ -130,7 +130,8 @@ class Api:
130
130
model, provider_handler = get_model_and_provider(
131
131
kwargs.get("model"), provider,
132
132
stream=True,
133
ignore_stream=True
133
ignore_stream=True,
134
logging=False
134
135
)
135
136
first = True
136
137
try:
@@ -29,8 +29,8 @@ async def raise_for_status_async(response: Union[StreamResponse, ClientResponse]
29
29
elif response.status == 403 and is_openai(message):
30
30
raise ResponseStatusError(f"Response {response.status}: OpenAI Bot detected")
31
31
elif not response.ok:
32
if "<html>" in message:
33
message = "HTML content"
32
if message is None and response.headers.get("content-type") == "text/html":
33
message = "Bad gateway" if response.status == 502 else "HTML content"
34
34
raise ResponseStatusError(f"Response {response.status}: {message}")
35
35
36
36
def raise_for_status(response: Union[Response, StreamResponse, ClientResponse, RequestsResponse], message: str = None):
@@ -42,4 +42,6 @@ def raise_for_status(response: Union[Response, StreamResponse, ClientResponse, R
42
42
elif response.status_code == 403 and is_cloudflare(response.text):
43
43
raise CloudflareError(f"Response {response.status_code}: Cloudflare detected")
44
44
elif not response.ok:
45
if message is None and response.headers.get("content-type") == "text/html":
46
message = "Bad gateway" if response.status_code == 502 else "HTML content"
45
47
raise ResponseStatusError(f"Response {response.status_code}: {response.text if message is None else message}")