+ ${item.role == "assistant" ? gpt_image : user_image}
+ ${
+ item.role == "assistant"
+ ? ``
+ : ``
+ }
- ${markdown.render(content)}
+ ${
+ item.role == "user"
+ ? `
`
+ : `
`
+ }
+ ${
+ item.role == "assistant"
+ ? markdown.render(item.content)
+ : item.content
+ }
+ ${
+ item.role == "user"
+ ? `
`
+ : ''
+ }
`;
-};
+ }
-const is_assistant = (role) => {
- return role == "assistant";
+ document.querySelectorAll(`code`).forEach((el) => {
+ hljs.highlightElement(el);
+ });
+
+ message_box.scrollTo({ top: message_box.scrollHeight, behavior: "smooth" });
+
+ setTimeout(() => {
+ message_box.scrollTop = message_box.scrollHeight;
+ }, 500);
};
const get_conversation = async (conversation_id) => {
- let conversation = await JSON.parse(localStorage.getItem(`conversation:${conversation_id}`));
- return conversation.items;
+ let conversation = await JSON.parse(
+ localStorage.getItem(`conversation:${conversation_id}`)
+ );
+ let result = conversation.items.slice(-4)
+ for (var i = 0; i < result.length; i++) {
+ delete result[i].token;
+ console.log(result[i]);
+ console.log(result[i]);
+ }
+ return result;
};
const add_conversation = async (conversation_id, title) => {
- if (localStorage.getItem(`conversation:${conversation_id}`) == null) {
- localStorage.setItem(
- `conversation:${conversation_id}`,
- JSON.stringify({
- id: conversation_id,
- title: title,
- items: [],
- })
- );
- }
+ if (localStorage.getItem(`conversation:${conversation_id}`) == null) {
+ localStorage.setItem(
+ `conversation:${conversation_id}`,
+ JSON.stringify({
+ id: conversation_id,
+ title: title,
+ items: [],
+ })
+ );
+ }
};
-const add_message = async (conversation_id, role, content) => {
- before_adding = JSON.parse(localStorage.getItem(`conversation:${conversation_id}`));
+const add_message = async (conversation_id, role, content, token) => {
+ before_adding = JSON.parse(
+ localStorage.getItem(`conversation:${conversation_id}`)
+ );
- before_adding.items.push({
- role: role,
- content: content,
- });
+ before_adding.items.push({
+ role: role,
+ content: content,
+ token: token,
+ });
- localStorage.setItem(`conversation:${conversation_id}`, JSON.stringify(before_adding)); // update conversation
+ localStorage.setItem(
+ `conversation:${conversation_id}`,
+ JSON.stringify(before_adding)
+ ); // update conversation
};
const load_conversations = async (limit, offset, loader) => {
- //console.log(loader);
- //if (loader === undefined) box_conversations.appendChild(spinner);
+ //console.log(loader);
+ //if (loader === undefined) box_conversations.appendChild(spinner);
- let conversations = [];
- for (let i = 0; i < localStorage.length; i++) {
- if (localStorage.key(i).startsWith("conversation:")) {
- let conversation = localStorage.getItem(localStorage.key(i));
- conversations.push(JSON.parse(conversation));
- }
- }
+ let conversations = [];
+ for (let i = 0; i < localStorage.length; i++) {
+ if (localStorage.key(i).startsWith("conversation:")) {
+ let conversation = localStorage.getItem(localStorage.key(i));
+ conversations.push(JSON.parse(conversation));
+ }
+ }
- //if (loader === undefined) spinner.parentNode.removeChild(spinner)
- await clear_conversations();
+ //if (loader === undefined) spinner.parentNode.removeChild(spinner)
+ await clear_conversations();
- for (conversation of conversations) {
- box_conversations.innerHTML += `
-
- `;
- }
+ for (conversation of conversations) {
+ box_conversations.innerHTML += `
+
+
+
+ ${conversation.title}
+
+
+
+
+
+ `;
+ }
- document.querySelectorAll(`code`).forEach((el) => {
- hljs.highlightElement(el);
- });
+ document.querySelectorAll(`code`).forEach((el) => {
+ hljs.highlightElement(el);
+ });
};
document.getElementById(`cancelButton`).addEventListener(`click`, async () => {
- window.controller.abort();
- console.log(`aborted ${window.conversation_id}`);
+ window.controller.abort();
+ console.log(`aborted ${window.conversation_id}`);
});
function h2a(str1) {
- var hex = str1.toString();
- var str = "";
+ var hex = str1.toString();
+ var str = "";
- for (var n = 0; n < hex.length; n += 2) {
- str += String.fromCharCode(parseInt(hex.substr(n, 2), 16));
- }
+ for (var n = 0; n < hex.length; n += 2) {
+ str += String.fromCharCode(parseInt(hex.substr(n, 2), 16));
+ }
- return str;
+ return str;
}
const uuid = () => {
- return `xxxxxxxx-xxxx-4xxx-yxxx-${Date.now().toString(16)}`.replace(/[xy]/g, function (c) {
- var r = (Math.random() * 16) | 0,
- v = c == "x" ? r : (r & 0x3) | 0x8;
- return v.toString(16);
- });
+ return `xxxxxxxx-xxxx-4xxx-yxxx-${Date.now().toString(16)}`.replace(
+ /[xy]/g,
+ function (c) {
+ var r = (Math.random() * 16) | 0,
+ v = c == "x" ? r : (r & 0x3) | 0x8;
+ return v.toString(16);
+ }
+ );
};
const message_id = () => {
- random_bytes = (Math.floor(Math.random() * 1338377565) + 2956589730).toString(2);
- unix = Math.floor(Date.now() / 1000).toString(2);
+ random_bytes = (Math.floor(Math.random() * 1338377565) + 2956589730).toString(
+ 2
+ );
+ unix = Math.floor(Date.now() / 1000).toString(2);
- return BigInt(`0b${unix}${random_bytes}`).toString();
+ return BigInt(`0b${unix}${random_bytes}`).toString();
};
window.onload = async () => {
- load_settings_localstorage();
+ load_settings_localstorage();
- conversations = 0;
- for (let i = 0; i < localStorage.length; i++) {
- if (localStorage.key(i).startsWith("conversation:")) {
- conversations += 1;
- }
- }
+ conversations = 0;
+ for (let i = 0; i < localStorage.length; i++) {
+ if (localStorage.key(i).startsWith("conversation:")) {
+ conversations += 1;
+ }
+ }
- if (conversations == 0) localStorage.clear();
+ if (conversations == 0) localStorage.clear();
- await setTimeout(() => {
- load_conversations(20, 0);
- }, 1);
+ await setTimeout(() => {
+ load_conversations(20, 0);
+ }, 1);
- if (!window.location.href.endsWith(`#`)) {
- if (/\/chat\/.+/.test(window.location.href.slice(url_prefix.length))) {
- await load_conversation(window.conversation_id);
- }
- }
+ if (!window.location.href.endsWith(`#`)) {
+ if (/\{{chat_path}}\/.+/.test(window.location.href)) {
+ await load_conversation(window.conversation_id);
+ }
+ }
- message_input.addEventListener("keydown", async (evt) => {
- if (prompt_lock) return;
+message_input.addEventListener(`keydown`, async (evt) => {
+ if (prompt_lock) return;
+ if (evt.keyCode === 13 && !evt.shiftKey) {
+ evt.preventDefault();
+ console.log('pressed enter');
+ await handle_ask();
+ } else {
+ message_input.style.removeProperty("height");
+ message_input.style.height = message_input.scrollHeight + 4 + "px";
+ }
+ });
- if (evt.key === "Enter" && !evt.shiftKey) {
- evt.preventDefault();
- await handle_ask();
- }
- });
+ send_button.addEventListener(`click`, async () => {
+ console.log("clicked send");
+ if (prompt_lock) return;
+ await handle_ask();
+ });
- send_button.addEventListener("click", async (event) => {
- event.preventDefault();
- if (prompt_lock) return;
- message_input.blur();
- await handle_ask();
- });
-
- register_settings_localstorage();
+ register_settings_localstorage();
};
+document.querySelector(".mobile-sidebar").addEventListener("click", (event) => {
+ const sidebar = document.querySelector(".conversations");
+
+ if (sidebar.classList.contains("shown")) {
+ sidebar.classList.remove("shown");
+ event.target.classList.remove("rotated");
+ } else {
+ sidebar.classList.add("shown");
+ event.target.classList.add("rotated");
+ }
+
+ window.scrollTo(0, 0);
+});
+
const register_settings_localstorage = async () => {
- settings_ids = ["switch", "model", "jailbreak"];
- settings_elements = settings_ids.map((id) => document.getElementById(id));
- settings_elements.map((element) =>
- element.addEventListener(`change`, async (event) => {
- switch (event.target.type) {
- case "checkbox":
- localStorage.setItem(event.target.id, event.target.checked);
- break;
- case "select-one":
- localStorage.setItem(event.target.id, event.target.selectedIndex);
- break;
- default:
- console.warn("Unresolved element type");
- }
- })
- );
+ settings_ids = ["switch", "model", "jailbreak"];
+ settings_elements = settings_ids.map((id) => document.getElementById(id));
+ settings_elements.map((element) =>
+ element.addEventListener(`change`, async (event) => {
+ switch (event.target.type) {
+ case "checkbox":
+ localStorage.setItem(event.target.id, event.target.checked);
+ break;
+ case "select-one":
+ localStorage.setItem(event.target.id, event.target.selectedIndex);
+ break;
+ default:
+ console.warn("Unresolved element type");
+ }
+ })
+ );
};
const load_settings_localstorage = async () => {
- settings_ids = ["switch", "model", "jailbreak"];
- settings_elements = settings_ids.map((id) => document.getElementById(id));
- settings_elements.map((element) => {
- if (localStorage.getItem(element.id)) {
- switch (element.type) {
- case "checkbox":
- element.checked = localStorage.getItem(element.id) === "true";
- break;
- case "select-one":
- element.selectedIndex = parseInt(localStorage.getItem(element.id));
- break;
- default:
- console.warn("Unresolved element type");
- }
- }
- });
+ settings_ids = ["switch", "model", "jailbreak"];
+ settings_elements = settings_ids.map((id) => document.getElementById(id));
+ settings_elements.map((element) => {
+ if (localStorage.getItem(element.id)) {
+ switch (element.type) {
+ case "checkbox":
+ element.checked = localStorage.getItem(element.id) === "true";
+ break;
+ case "select-one":
+ element.selectedIndex = parseInt(localStorage.getItem(element.id));
+ break;
+ default:
+ console.warn("Unresolved element type");
+ }
+ }
+ });
};
-function clearTextarea(textarea) {
- textarea.style.removeProperty("height");
- textarea.style.height = `${textarea.scrollHeight + 4}px`;
- if (textarea.value.trim() === "" && textarea.value.includes("\n")) {
- textarea.value = "";
- }
+// Theme storage for recurring viewers
+const storeTheme = function (theme) {
+ localStorage.setItem("theme", theme);
+};
+
+// set theme when visitor returns
+const setTheme = function () {
+ const activeTheme = localStorage.getItem("theme");
+ colorThemes.forEach((themeOption) => {
+ if (themeOption.id === activeTheme) {
+ themeOption.checked = true;
+ }
+ });
+ // fallback for no :has() support
+ document.documentElement.className = activeTheme;
+};
+
+colorThemes.forEach((themeOption) => {
+ themeOption.addEventListener("click", () => {
+ storeTheme(themeOption.id);
+ // fallback for no :has() support
+ document.documentElement.className = themeOption.id;
+ });
+});
+
+function deleteMessage(token) {
+ const messageDivUser = document.getElementById(`user_${token}`)
+ const messageDivGpt = document.getElementById(`gpt_${token}`)
+ if (messageDivUser) messageDivUser.parentNode.remove();
+ if (messageDivGpt) messageDivGpt.parentNode.remove();
+ const conversation = JSON.parse(localStorage.getItem(`conversation:${window.conversation_id}`));
+ conversation.items = conversation.items.filter(item => item.token !== token);
+ localStorage.setItem(`conversation:${window.conversation_id}`, JSON.stringify(conversation));
+
+ const messages = document.getElementsByClassName("message");
+ if (messages.length === 0) {
+ delete_conversation(window.conversation_id);
+ };
}
-function createElement(tag, { classNames, id, innerHTML, textContent } = {}) {
- const el = document.createElement(tag);
- if (classNames) {
- el.classList.add(...classNames);
- }
- if (id) {
- el.id = id;
- }
- if (innerHTML) {
- el.innerHTML = innerHTML;
- }
- if (textContent) {
- const preElement = document.createElement("pre");
- preElement.textContent = textContent;
- el.appendChild(preElement);
- }
- return el;
-}
+document.onload = setTheme();
diff --git a/chat_gpt_microservice/client/js/sidebar-toggler.js b/chat_gpt_microservice/client/js/sidebar-toggler.js
deleted file mode 100644
index b23f94e..0000000
--- a/chat_gpt_microservice/client/js/sidebar-toggler.js
+++ /dev/null
@@ -1,34 +0,0 @@
-const sidebar = document.querySelector(".sidebar");
-const menuButton = document.querySelector(".menu-button");
-
-function toggleSidebar(event) {
- if (sidebar.classList.contains("shown")) {
- hideSidebar(event.target);
- } else {
- showSidebar(event.target);
- }
- window.scrollTo(0, 0);
-}
-
-function showSidebar(target) {
- sidebar.classList.add("shown");
- target.classList.add("rotated");
- document.body.style.overflow = "hidden";
-}
-
-function hideSidebar(target) {
- sidebar.classList.remove("shown");
- target.classList.remove("rotated");
- document.body.style.overflow = "auto";
-}
-
-menuButton.addEventListener("click", toggleSidebar);
-
-document.body.addEventListener('click', function(event) {
- if (event.target.matches('.conversation-title')) {
- const menuButtonStyle = window.getComputedStyle(menuButton);
- if (menuButtonStyle.display !== 'none') {
- hideSidebar(menuButton);
- }
- }
-});
diff --git a/chat_gpt_microservice/client/js/theme-toggler.js b/chat_gpt_microservice/client/js/theme-toggler.js
deleted file mode 100644
index 67e1a95..0000000
--- a/chat_gpt_microservice/client/js/theme-toggler.js
+++ /dev/null
@@ -1,22 +0,0 @@
-var switch_theme_toggler = document.getElementById("theme-toggler");
-
-switch_theme_toggler.addEventListener("change", toggleTheme);
-
-function setTheme(themeName) {
- localStorage.setItem("theme", themeName);
- document.documentElement.className = themeName;
-}
-
-function toggleTheme() {
- var currentTheme = localStorage.getItem("theme");
- var newTheme = currentTheme === "theme-dark" ? "theme-light" : "theme-dark";
-
- setTheme(newTheme);
- switch_theme_toggler.checked = newTheme === "theme-dark";
-}
-
-(function () {
- var currentTheme = localStorage.getItem("theme") || "theme-dark";
- setTheme(currentTheme);
- switch_theme_toggler.checked = currentTheme === "theme-dark";
-})();
diff --git a/chat_gpt_microservice/config.json b/chat_gpt_microservice/config.json
deleted file mode 100644
index 31863e9..0000000
--- a/chat_gpt_microservice/config.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "site_config": {
- "host": "0.0.0.0",
- "port": 1338,
- "debug": false
- },
- "url_prefix": "/gpt"
-}
diff --git a/chat_gpt_microservice/docker-compose.yml b/chat_gpt_microservice/docker-compose.yml
deleted file mode 100644
index 630cf75..0000000
--- a/chat_gpt_microservice/docker-compose.yml
+++ /dev/null
@@ -1,38 +0,0 @@
-version: "3.9"
-
-networks:
- chat_gpt_network:
- name: "chat_gpt_network"
-
-services:
-
- chat-gpt-caddy:
- image: caddy:2.7.4
- container_name: "chat_gpt_caddy"
- restart: unless-stopped
- networks:
- - chat_gpt_network
- environment:
- - TZ=Europe/Moscow
- ports:
- - "8081:8080"
- volumes:
- - ./Caddyfile:/etc/caddy/Caddyfile:ro
- - /etc/localtime:/etc/localtime:ro
-
- chat-gpt:
- image: balsh_chat_gpt:latest #ramonvc/freegpt-webui:latest
- container_name: "chat_gpt"
- build:
- context: .
- dockerfile: Dockerfile
- hostname: "chat_gpt"
- networks:
- - chat_gpt_network
- volumes:
- - ./client:/client
- depends_on:
- - chat-gpt-caddy
- expose:
- - "1338"
- restart: unless-stopped
\ No newline at end of file
diff --git a/chat_gpt_microservice/g4f/Provider/Provider.py b/chat_gpt_microservice/g4f/Provider/Provider.py
deleted file mode 100644
index 59f63d5..0000000
--- a/chat_gpt_microservice/g4f/Provider/Provider.py
+++ /dev/null
@@ -1,19 +0,0 @@
-import os
-from typing import get_type_hints
-
-url = None
-model = None
-supports_stream = False
-needs_auth = False
-
-
-def _create_completion(model: str, messages: list, stream: bool, **kwargs):
- return
-
-
-params = f"g4f.Providers.{os.path.basename(__file__)[:-3]} supports: " + "(%s)" % ", ".join(
- [
- f"{name}: {get_type_hints(_create_completion)[name].__name__}"
- for name in _create_completion.__code__.co_varnames[: _create_completion.__code__.co_argcount]
- ]
-)
diff --git a/chat_gpt_microservice/g4f/Provider/Providers/AiService.py b/chat_gpt_microservice/g4f/Provider/Providers/AiService.py
deleted file mode 100644
index 3b258e7..0000000
--- a/chat_gpt_microservice/g4f/Provider/Providers/AiService.py
+++ /dev/null
@@ -1,41 +0,0 @@
-import os
-from typing import get_type_hints
-
-import requests
-
-url = "https://aiservice.vercel.app/api/chat/answer"
-model = ["gpt-3.5-turbo"]
-supports_stream = False
-needs_auth = False
-
-
-def _create_completion(model: str, messages: list, stream: bool, **kwargs):
- base = ""
- for message in messages:
- base += "%s: %s\n" % (message["role"], message["content"])
- base += "assistant:"
-
- headers = {
- "accept": "*/*",
- "content-type": "text/plain;charset=UTF-8",
- "sec-fetch-dest": "empty",
- "sec-fetch-mode": "cors",
- "sec-fetch-site": "same-origin",
- "Referer": "https://aiservice.vercel.app/chat",
- }
- data = {"input": base}
- response = requests.post(url, headers=headers, json=data)
- if response.status_code == 200:
- _json = response.json()
- yield _json["data"]
- else:
- print(f"Error Occurred::{response.status_code}")
- return None
-
-
-params = f"g4f.Providers.{os.path.basename(__file__)[:-3]} supports: " + "(%s)" % ", ".join(
- [
- f"{name}: {get_type_hints(_create_completion)[name].__name__}"
- for name in _create_completion.__code__.co_varnames[: _create_completion.__code__.co_argcount]
- ]
-)
diff --git a/chat_gpt_microservice/g4f/Provider/Providers/Aichat.py b/chat_gpt_microservice/g4f/Provider/Providers/Aichat.py
deleted file mode 100644
index 99ed232..0000000
--- a/chat_gpt_microservice/g4f/Provider/Providers/Aichat.py
+++ /dev/null
@@ -1,46 +0,0 @@
-import json
-import os
-from typing import get_type_hints
-
-import requests
-
-url = "https://hteyun.com"
-model = [
- "gpt-3.5-turbo",
- "gpt-3.5-turbo-16k",
- "gpt-3.5-turbo-16k-0613",
- "gpt-3.5-turbo-0613",
-]
-supports_stream = True
-needs_auth = False
-
-
-def _create_completion(model: str, messages: list, stream: bool, temperature: float = 0.7, **kwargs):
- headers = {
- "Content-Type": "application/json",
- }
- data = {
- "model": model,
- "temperature": 0.7,
- "presence_penalty": 0,
- "messages": messages,
- }
- response = requests.post(url + "/api/chat-stream", json=data, stream=True)
-
- if stream:
- for chunk in response.iter_content(chunk_size=None):
- chunk = chunk.decode("utf-8")
- if chunk.strip():
- message = json.loads(chunk)["choices"][0]["message"]["content"]
- yield message
- else:
- message = response.json()["choices"][0]["message"]["content"]
- yield message
-
-
-params = f"g4f.Providers.{os.path.basename(__file__)[:-3]} supports: " + "(%s)" % ", ".join(
- [
- f"{name}: {get_type_hints(_create_completion)[name].__name__}"
- for name in _create_completion.__code__.co_varnames[: _create_completion.__code__.co_argcount]
- ]
-)
diff --git a/chat_gpt_microservice/g4f/Provider/Providers/Ails.py b/chat_gpt_microservice/g4f/Provider/Providers/Ails.py
deleted file mode 100644
index c349715..0000000
--- a/chat_gpt_microservice/g4f/Provider/Providers/Ails.py
+++ /dev/null
@@ -1,96 +0,0 @@
-import hashlib
-import json
-import os
-import time
-import uuid
-from datetime import datetime
-from typing import Dict, get_type_hints
-
-import requests
-from g4f.typing import sha256
-
-url: str = "https://ai.ls"
-model: str = "gpt-3.5-turbo"
-supports_stream = True
-needs_auth = False
-working = True
-
-
-class Utils:
- def hash(json_data: Dict[str, str]) -> sha256:
- base_string: str = "%s:%s:%s:%s" % (
- json_data["t"],
- json_data["m"],
- "WI,2rU#_r:r~aF4aJ36[.Z(/8Rv93Rf",
- len(json_data["m"]),
- )
-
- return hashlib.sha256(base_string.encode()).hexdigest()
-
- def format_timestamp(timestamp: int) -> str:
- e = timestamp
- n = e % 10
- r = n + 1 if n % 2 == 0 else n
- return str(e - n + r)
-
-
-def _create_completion(model: str, messages: list, temperature: float = 0.6, stream: bool = False, **kwargs):
- headers = {
- "authority": "api.caipacity.com",
- "accept": "*/*",
- "accept-language": "en,fr-FR;q=0.9,fr;q=0.8,es-ES;q=0.7,es;q=0.6,en-US;q=0.5,am;q=0.4,de;q=0.3",
- "authorization": "Bearer free",
- "client-id": str(uuid.uuid4()),
- "client-v": "0.1.249",
- "content-type": "application/json",
- "origin": "https://ai.ls",
- "referer": "https://ai.ls/",
- "sec-ch-ua": '"Not.A/Brand";v="8", "Chromium";v="114", "Google Chrome";v="114"',
- "sec-ch-ua-mobile": "?0",
- "sec-ch-ua-platform": '"Windows"',
- "sec-fetch-dest": "empty",
- "sec-fetch-mode": "cors",
- "sec-fetch-site": "cross-site",
- "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36",
- }
-
- timestamp = Utils.format_timestamp(int(time.time() * 1000))
-
- sig = {
- "d": datetime.now().strftime("%Y-%m-%d"),
- "t": timestamp,
- "s": Utils.hash({"t": timestamp, "m": messages[-1]["content"]}),
- }
-
- json_data = json.dumps(
- separators=(",", ":"),
- obj={
- "model": "gpt-3.5-turbo",
- "temperature": 0.6,
- "stream": True,
- "messages": messages,
- }
- | sig,
- )
-
- response = requests.post(
- "https://api.caipacity.com/v1/chat/completions",
- headers=headers,
- data=json_data,
- stream=True,
- )
-
- for token in response.iter_lines():
- if b"content" in token:
- completion_chunk = json.loads(token.decode().replace("data: ", ""))
- token = completion_chunk["choices"][0]["delta"].get("content")
- if token != None:
- yield token
-
-
-params = f"g4f.Providers.{os.path.basename(__file__)[:-3]} supports: " + "(%s)" % ", ".join(
- [
- f"{name}: {get_type_hints(_create_completion)[name].__name__}"
- for name in _create_completion.__code__.co_varnames[: _create_completion.__code__.co_argcount]
- ]
-)
diff --git a/chat_gpt_microservice/g4f/Provider/Providers/Bard.py b/chat_gpt_microservice/g4f/Provider/Providers/Bard.py
deleted file mode 100644
index 68db84c..0000000
--- a/chat_gpt_microservice/g4f/Provider/Providers/Bard.py
+++ /dev/null
@@ -1,87 +0,0 @@
-import json
-import os
-import random
-import re
-from typing import get_type_hints
-
-import browser_cookie3
-import requests
-
-url = "https://bard.google.com"
-model = ["Palm2"]
-supports_stream = False
-needs_auth = True
-
-
-def _create_completion(model: str, messages: list, stream: bool, **kwargs):
- psid = {cookie.name: cookie.value for cookie in browser_cookie3.chrome(domain_name=".google.com")}["__Secure-1PSID"]
-
- formatted = "\n".join(["%s: %s" % (message["role"], message["content"]) for message in messages])
- prompt = f"{formatted}\nAssistant:"
-
- proxy = kwargs.get("proxy", False)
- if proxy == False:
- print("warning!, you did not give a proxy, a lot of countries are banned from Google Bard, so it may not work")
-
- snlm0e = None
- conversation_id = None
- response_id = None
- choice_id = None
-
- client = requests.Session()
- client.proxies = {"http": f"http://{proxy}", "https": f"http://{proxy}"} if proxy else None
-
- client.headers = {
- "authority": "bard.google.com",
- "content-type": "application/x-www-form-urlencoded;charset=UTF-8",
- "origin": "https://bard.google.com",
- "referer": "https://bard.google.com/",
- "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36",
- "x-same-domain": "1",
- "cookie": f"__Secure-1PSID={psid}",
- }
-
- snlm0e = (
- re.search(r"SNlM0e\":\"(.*?)\"", client.get("https://bard.google.com/").text).group(1) if not snlm0e else snlm0e
- )
-
- params = {
- "bl": "boq_assistant-bard-web-server_20230326.21_p0",
- "_reqid": random.randint(1111, 9999),
- "rt": "c",
- }
-
- data = {
- "at": snlm0e,
- "f.req": json.dumps(
- [
- None,
- json.dumps([[prompt], None, [conversation_id, response_id, choice_id]]),
- ]
- ),
- }
-
- intents = ".".join(["assistant", "lamda", "BardFrontendService"])
-
- response = client.post(
- f"https://bard.google.com/_/BardChatUi/data/{intents}/StreamGenerate",
- data=data,
- params=params,
- )
-
- chat_data = json.loads(response.content.splitlines()[3])[0][2]
- if chat_data:
- json_chat_data = json.loads(chat_data)
-
- yield json_chat_data[0][0]
-
- else:
- yield "error"
-
-
-params = f"g4f.Providers.{os.path.basename(__file__)[:-3]} supports: " + "(%s)" % ", ".join(
- [
- f"{name}: {get_type_hints(_create_completion)[name].__name__}"
- for name in _create_completion.__code__.co_varnames[: _create_completion.__code__.co_argcount]
- ]
-)
diff --git a/chat_gpt_microservice/g4f/Provider/Providers/Better.py b/chat_gpt_microservice/g4f/Provider/Providers/Better.py
deleted file mode 100644
index 3185a5a..0000000
--- a/chat_gpt_microservice/g4f/Provider/Providers/Better.py
+++ /dev/null
@@ -1,64 +0,0 @@
-import json
-import os
-from typing import get_type_hints
-
-import requests
-
-url = "https://openai-proxy-api.vercel.app/v1/"
-model = [
- "gpt-3.5-turbo",
- "gpt-3.5-turbo-0613",
- "gpt-3.5-turbo-16k",
- "gpt-3.5-turbo-16k-0613",
- "gpt-4",
-]
-
-supports_stream = True
-needs_auth = False
-
-
-def _create_completion(model: str, messages: list, stream: bool, **kwargs):
- headers = {
- "Content-Type": "application/json",
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36 Edg/114.0.1823.58",
- "Referer": "https://chat.ylokh.xyz/",
- "Origin": "https://chat.ylokh.xyz",
- "Connection": "keep-alive",
- }
-
- json_data = {
- "messages": messages,
- "temperature": 1.0,
- "model": model,
- "stream": stream,
- }
-
- response = requests.post(
- "https://openai-proxy-api.vercel.app/v1/chat/completions",
- headers=headers,
- json=json_data,
- stream=True,
- )
-
- for token in response.iter_lines():
- decoded = token.decode("utf-8")
- if decoded.startswith("data: "):
- data_str = decoded.replace("data: ", "")
- data = json.loads(data_str)
- if "choices" in data and "delta" in data["choices"][0]:
- delta = data["choices"][0]["delta"]
- content = delta.get("content", "")
- finish_reason = delta.get("finish_reason", "")
-
- if finish_reason == "stop":
- break
- if content:
- yield content
-
-
-params = f"g4f.Providers.{os.path.basename(__file__)[:-3]} supports: " + "(%s)" % ", ".join(
- [
- f"{name}: {get_type_hints(_create_completion)[name].__name__}"
- for name in _create_completion.__code__.co_varnames[: _create_completion.__code__.co_argcount]
- ]
-)
diff --git a/chat_gpt_microservice/g4f/Provider/Providers/Bing.py b/chat_gpt_microservice/g4f/Provider/Providers/Bing.py
deleted file mode 100644
index 7eefdbf..0000000
--- a/chat_gpt_microservice/g4f/Provider/Providers/Bing.py
+++ /dev/null
@@ -1,355 +0,0 @@
-import asyncio
-import json
-import os
-import random
-import ssl
-import uuid
-from typing import get_type_hints
-
-import aiohttp
-import certifi
-import requests
-
-url = "https://bing.com/chat"
-model = ["gpt-4"]
-supports_stream = True
-needs_auth = False
-
-ssl_context = ssl.create_default_context()
-ssl_context.load_verify_locations(certifi.where())
-
-
-class optionsSets:
- optionSet: dict = {"tone": str, "optionsSets": list}
-
- jailbreak: dict = {
- "optionsSets": [
- "saharasugg",
- "enablenewsfc",
- "clgalileo",
- "gencontentv3",
- "nlu_direct_response_filter",
- "deepleo",
- "disable_emoji_spoken_text",
- "responsible_ai_policy_235",
- "enablemm",
- "h3precise"
- # "harmonyv3",
- "dtappid",
- "cricinfo",
- "cricinfov2",
- "dv3sugg",
- "nojbfedge",
- ]
- }
-
-
-class Defaults:
- delimiter = "\x1e"
- ip_address = f"13.{random.randint(104, 107)}.{random.randint(0, 255)}.{random.randint(0, 255)}"
-
- allowedMessageTypes = [
- "Chat",
- "Disengaged",
- "AdsQuery",
- "SemanticSerp",
- "GenerateContentQuery",
- "SearchQuery",
- "ActionRequest",
- "Context",
- "Progress",
- "AdsQuery",
- "SemanticSerp",
- ]
-
- sliceIds = [
- # "222dtappid",
- # "225cricinfo",
- # "224locals0"
- "winmuid3tf",
- "osbsdusgreccf",
- "ttstmout",
- "crchatrev",
- "winlongmsgtf",
- "ctrlworkpay",
- "norespwtf",
- "tempcacheread",
- "temptacache",
- "505scss0",
- "508jbcars0",
- "515enbotdets0",
- "5082tsports",
- "515vaoprvs",
- "424dagslnv1s0",
- "kcimgattcf",
- "427startpms0",
- ]
-
- location = {
- "locale": "en-US",
- "market": "en-US",
- "region": "US",
- "locationHints": [
- {
- "country": "United States",
- "state": "California",
- "city": "Los Angeles",
- "timezoneoffset": 8,
- "countryConfidence": 8,
- "Center": {"Latitude": 34.0536909, "Longitude": -118.242766},
- "RegionType": 2,
- "SourceType": 1,
- }
- ],
- }
-
-
-def _format(msg: dict) -> str:
- return json.dumps(msg, ensure_ascii=False) + Defaults.delimiter
-
-
-async def create_conversation():
- for _ in range(5):
- create = requests.get(
- "https://www.bing.com/turing/conversation/create",
- headers={
- "authority": "edgeservices.bing.com",
- "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",
- "accept-language": "en-US,en;q=0.9",
- "cache-control": "max-age=0",
- "sec-ch-ua": '"Chromium";v="110", "Not A(Brand";v="24", "Microsoft Edge";v="110"',
- "sec-ch-ua-arch": '"x86"',
- "sec-ch-ua-bitness": '"64"',
- "sec-ch-ua-full-version": '"110.0.1587.69"',
- "sec-ch-ua-full-version-list": '"Chromium";v="110.0.5481.192", "Not A(Brand";v="24.0.0.0", "Microsoft Edge";v="110.0.1587.69"',
- "sec-ch-ua-mobile": "?0",
- "sec-ch-ua-model": '""',
- "sec-ch-ua-platform": '"Windows"',
- "sec-ch-ua-platform-version": '"15.0.0"',
- "sec-fetch-dest": "document",
- "sec-fetch-mode": "navigate",
- "sec-fetch-site": "none",
- "sec-fetch-user": "?1",
- "upgrade-insecure-requests": "1",
- "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36 Edg/110.0.1587.69",
- "x-edge-shopping-flag": "1",
- "x-forwarded-for": Defaults.ip_address,
- },
- )
-
- conversationId = create.json().get("conversationId")
- clientId = create.json().get("clientId")
- conversationSignature = create.json().get("conversationSignature")
-
- if not conversationId or not clientId or not conversationSignature and _ == 4:
- raise Exception("Failed to create conversation.")
-
- return conversationId, clientId, conversationSignature
-
-
-async def stream_generate(
- prompt: str,
- mode: optionsSets.optionSet = optionsSets.jailbreak,
- context: bool or str = False,
-):
- timeout = aiohttp.ClientTimeout(total=900)
- session = aiohttp.ClientSession(timeout=timeout)
-
- conversationId, clientId, conversationSignature = await create_conversation()
-
- wss = await session.ws_connect(
- "wss://sydney.bing.com/sydney/ChatHub",
- ssl=ssl_context,
- autoping=False,
- headers={
- "accept": "application/json",
- "accept-language": "en-US,en;q=0.9",
- "content-type": "application/json",
- "sec-ch-ua": '"Not_A Brand";v="99", "Microsoft Edge";v="110", "Chromium";v="110"',
- "sec-ch-ua-arch": '"x86"',
- "sec-ch-ua-bitness": '"64"',
- "sec-ch-ua-full-version": '"109.0.1518.78"',
- "sec-ch-ua-full-version-list": '"Chromium";v="110.0.5481.192", "Not A(Brand";v="24.0.0.0", "Microsoft Edge";v="110.0.1587.69"',
- "sec-ch-ua-mobile": "?0",
- "sec-ch-ua-model": "",
- "sec-ch-ua-platform": '"Windows"',
- "sec-ch-ua-platform-version": '"15.0.0"',
- "sec-fetch-dest": "empty",
- "sec-fetch-mode": "cors",
- "sec-fetch-site": "same-origin",
- "x-ms-client-request-id": str(uuid.uuid4()),
- "x-ms-useragent": "azsdk-js-api-client-factory/1.0.0-beta.1 core-rest-pipeline/1.10.0 OS/Win32",
- "Referer": "https://www.bing.com/search?q=Bing+AI&showconv=1&FORM=hpcodx",
- "Referrer-Policy": "origin-when-cross-origin",
- "x-forwarded-for": Defaults.ip_address,
- },
- )
-
- await wss.send_str(_format({"protocol": "json", "version": 1}))
- await wss.receive(timeout=900)
-
- struct = {
- "arguments": [
- {
- **mode,
- "source": "cib",
- "allowedMessageTypes": Defaults.allowedMessageTypes,
- "sliceIds": Defaults.sliceIds,
- "traceId": os.urandom(16).hex(),
- "isStartOfSession": True,
- "message": Defaults.location
- | {
- "author": "user",
- "inputMethod": "Keyboard",
- "text": prompt,
- "messageType": "Chat",
- },
- "conversationSignature": conversationSignature,
- "participant": {"id": clientId},
- "conversationId": conversationId,
- }
- ],
- "invocationId": "0",
- "target": "chat",
- "type": 4,
- }
-
- if context:
- struct["arguments"][0]["previousMessages"] = [
- {
- "author": "user",
- "description": context,
- "contextType": "WebPage",
- "messageType": "Context",
- "messageId": "discover-web--page-ping-mriduna-----",
- }
- ]
-
- await wss.send_str(_format(struct))
-
- final = False
- draw = False
- resp_txt = ""
- result_text = ""
- resp_txt_no_link = ""
- cache_text = ""
-
- while not final:
- msg = await wss.receive(timeout=900)
- objects = msg.data.split(Defaults.delimiter)
-
- for obj in objects:
- if obj is None or not obj:
- continue
-
- response = json.loads(obj)
- if response.get("type") == 1 and response["arguments"][0].get(
- "messages",
- ):
- if not draw:
- if (response["arguments"][0]["messages"][0]["contentOrigin"] != "Apology") and not draw:
- resp_txt = result_text + response["arguments"][0]["messages"][0]["adaptiveCards"][0]["body"][
- 0
- ].get("text", "")
- resp_txt_no_link = result_text + response["arguments"][0]["messages"][0].get("text", "")
-
- if response["arguments"][0]["messages"][0].get(
- "messageType",
- ):
- resp_txt = (
- resp_txt
- + response["arguments"][0]["messages"][0]["adaptiveCards"][0]["body"][0]["inlines"][
- 0
- ].get("text")
- + "\n"
- )
- result_text = (
- result_text
- + response["arguments"][0]["messages"][0]["adaptiveCards"][0]["body"][0]["inlines"][
- 0
- ].get("text")
- + "\n"
- )
-
- if cache_text.endswith(" "):
- final = True
- if wss and not wss.closed:
- await wss.close()
- if session and not session.closed:
- await session.close()
-
- yield (resp_txt.replace(cache_text, ""))
- cache_text = resp_txt
-
- elif response.get("type") == 2:
- if response["item"]["result"].get("error"):
- if wss and not wss.closed:
- await wss.close()
- if session and not session.closed:
- await session.close()
-
- raise Exception(f"{response['item']['result']['value']}: {response['item']['result']['message']}")
-
- if draw:
- cache = response["item"]["messages"][1]["adaptiveCards"][0]["body"][0]["text"]
- response["item"]["messages"][1]["adaptiveCards"][0]["body"][0]["text"] = cache + resp_txt
-
- if response["item"]["messages"][-1]["contentOrigin"] == "Apology" and resp_txt:
- response["item"]["messages"][-1]["text"] = resp_txt_no_link
- response["item"]["messages"][-1]["adaptiveCards"][0]["body"][0]["text"] = resp_txt
-
- # print('Preserved the message from being deleted', file=sys.stderr)
-
- final = True
- if wss and not wss.closed:
- await wss.close()
- if session and not session.closed:
- await session.close()
-
-
-def run(generator):
- loop = asyncio.new_event_loop()
- asyncio.set_event_loop(loop)
- gen = generator.__aiter__()
-
- while True:
- try:
- next_val = loop.run_until_complete(gen.__anext__())
- yield next_val
-
- except StopAsyncIteration:
- break
- # print('Done')
-
-
-def convert(messages):
- context = ""
-
- for message in messages:
- context += "[%s](#message)\n%s\n\n" % (message["role"], message["content"])
-
- return context
-
-
-def _create_completion(model: str, messages: list, stream: bool, **kwargs):
- if len(messages) < 2:
- prompt = messages[0]["content"]
- context = False
-
- else:
- prompt = messages[-1]["content"]
- context = convert(messages[:-1])
-
- response = run(stream_generate(prompt, optionsSets.jailbreak, context))
- for token in response:
- yield (token)
-
- # print('Done')
-
-
-params = f"g4f.Providers.{os.path.basename(__file__)[:-3]} supports: " + "(%s)" % ", ".join(
- [
- f"{name}: {get_type_hints(_create_completion)[name].__name__}"
- for name in _create_completion.__code__.co_varnames[: _create_completion.__code__.co_argcount]
- ]
-)
diff --git a/chat_gpt_microservice/g4f/Provider/Providers/ChatFree.py b/chat_gpt_microservice/g4f/Provider/Providers/ChatFree.py
deleted file mode 100644
index fbb72b2..0000000
--- a/chat_gpt_microservice/g4f/Provider/Providers/ChatFree.py
+++ /dev/null
@@ -1,58 +0,0 @@
-import json
-import os
-from typing import get_type_hints
-
-import requests
-
-url = "https://v.chatfree.cc"
-model = ["gpt-3.5-turbo", "gpt-3.5-turbo-16k"]
-supports_stream = False
-needs_auth = False
-
-
-def _create_completion(model: str, messages: list, stream: bool, **kwargs):
- headers = {
- "authority": "chat.dfehub.com",
- "accept": "*/*",
- "accept-language": "en,fr-FR;q=0.9,fr;q=0.8,es-ES;q=0.7,es;q=0.6,en-US;q=0.5,am;q=0.4,de;q=0.3",
- "content-type": "application/json",
- "origin": "https://v.chatfree.cc",
- "referer": "https://v.chatfree.cc/",
- "sec-ch-ua": '"Not.A/Brand";v="8", "Chromium";v="114", "Google Chrome";v="114"',
- "sec-ch-ua-mobile": "?0",
- "sec-ch-ua-platform": '"macOS"',
- "sec-fetch-dest": "empty",
- "sec-fetch-mode": "cors",
- "sec-fetch-site": "same-origin",
- "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36",
- "x-requested-with": "XMLHttpRequest",
- }
-
- json_data = {
- "messages": messages,
- "stream": True,
- "model": model,
- "temperature": 0.5,
- "presence_penalty": 0,
- "frequency_penalty": 0,
- "top_p": 1,
- }
-
- response = requests.post(
- "https://v.chatfree.cc/api/openai/v1/chat/completions",
- headers=headers,
- json=json_data,
- )
-
- for chunk in response.iter_lines():
- if b"content" in chunk:
- data = json.loads(chunk.decode().split("data: ")[1])
- yield (data["choices"][0]["delta"]["content"])
-
-
-params = f"g4f.Providers.{os.path.basename(__file__)[:-3]} supports: " + "(%s)" % ", ".join(
- [
- f"{name}: {get_type_hints(_create_completion)[name].__name__}"
- for name in _create_completion.__code__.co_varnames[: _create_completion.__code__.co_argcount]
- ]
-)
diff --git a/chat_gpt_microservice/g4f/Provider/Providers/ChatgptAi.py b/chat_gpt_microservice/g4f/Provider/Providers/ChatgptAi.py
deleted file mode 100644
index cb35ac9..0000000
--- a/chat_gpt_microservice/g4f/Provider/Providers/ChatgptAi.py
+++ /dev/null
@@ -1,60 +0,0 @@
-import os
-import re
-from typing import get_type_hints
-
-import requests
-
-url = "https://chatgpt.ai/gpt-4/"
-model = ["gpt-4"]
-supports_stream = True
-needs_auth = False
-
-
-def _create_completion(model: str, messages: list, stream: bool, **kwargs):
- chat = ""
- for message in messages:
- chat += "%s: %s\n" % (message["role"], message["content"])
- chat += "assistant: "
-
- response = requests.get("https://chatgpt.ai/")
- nonce, post_id, _, bot_id = re.findall(
- r'data-nonce="(.*)"\n data-post-id="(.*)"\n data-url="(.*)"\n data-bot-id="(.*)"\n data-width',
- response.text,
- )[0]
-
- headers = {
- "authority": "chatgpt.ai",
- "accept": "*/*",
- "accept-language": "en,fr-FR;q=0.9,fr;q=0.8,es-ES;q=0.7,es;q=0.6,en-US;q=0.5,am;q=0.4,de;q=0.3",
- "cache-control": "no-cache",
- "origin": "https://chatgpt.ai",
- "pragma": "no-cache",
- "referer": "https://chatgpt.ai/gpt-4/",
- "sec-ch-ua": '"Not.A/Brand";v="8", "Chromium";v="114", "Google Chrome";v="114"',
- "sec-ch-ua-mobile": "?0",
- "sec-ch-ua-platform": '"Windows"',
- "sec-fetch-dest": "empty",
- "sec-fetch-mode": "cors",
- "sec-fetch-site": "same-origin",
- "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36",
- }
- data = {
- "_wpnonce": nonce,
- "post_id": post_id,
- "url": "https://chatgpt.ai/gpt-4",
- "action": "wpaicg_chat_shortcode_message",
- "message": chat,
- "bot_id": bot_id,
- }
-
- response = requests.post("https://chatgpt.ai/wp-admin/admin-ajax.php", headers=headers, data=data)
-
- yield (response.json()["data"])
-
-
-params = f"g4f.Providers.{os.path.basename(__file__)[:-3]} supports: " + "(%s)" % ", ".join(
- [
- f"{name}: {get_type_hints(_create_completion)[name].__name__}"
- for name in _create_completion.__code__.co_varnames[: _create_completion.__code__.co_argcount]
- ]
-)
diff --git a/chat_gpt_microservice/g4f/Provider/Providers/ChatgptLogin.py b/chat_gpt_microservice/g4f/Provider/Providers/ChatgptLogin.py
deleted file mode 100644
index a8fe785..0000000
--- a/chat_gpt_microservice/g4f/Provider/Providers/ChatgptLogin.py
+++ /dev/null
@@ -1,113 +0,0 @@
-import base64
-import os
-import re
-from typing import get_type_hints
-
-import requests
-
-url = "https://chatgptlogin.ac"
-model = ["gpt-3.5-turbo"]
-supports_stream = False
-needs_auth = False
-
-
-def _create_completion(model: str, messages: list, stream: bool, **kwargs):
- def get_nonce():
- res = requests.get(
- "https://chatgptlogin.ac/use-chatgpt-free/",
- headers={
- "Referer": "https://chatgptlogin.ac/use-chatgpt-free/",
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36",
- },
- )
-
- src = re.search(
- r'class="mwai-chat mwai-chatgpt">.*
Send