mirror of
https://github.com/SillyTavern/SillyTavern.git
synced 2025-06-05 21:59:27 +02:00
Local poe support
This commit is contained in:
14
poe.js
14
poe.js
@ -64,6 +64,11 @@ class Client {
|
|||||||
bot_names = [];
|
bot_names = [];
|
||||||
ws = null;
|
ws = null;
|
||||||
ws_connected = false;
|
ws_connected = false;
|
||||||
|
auto_reconnect = false;
|
||||||
|
|
||||||
|
constructor(auto_reconnect = false) {
|
||||||
|
this.auto_reconnect = auto_reconnect;
|
||||||
|
}
|
||||||
|
|
||||||
async init(token, proxy = null) {
|
async init(token, proxy = null) {
|
||||||
this.proxy = proxy;
|
this.proxy = proxy;
|
||||||
@ -210,6 +215,10 @@ class Client {
|
|||||||
this.on_message(this.ws, message);
|
this.on_message(this.ws, message);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
this.ws.on('close', () => {
|
||||||
|
this.ws_connected = false;
|
||||||
|
});
|
||||||
|
|
||||||
this.ws.on('error', (error) => {
|
this.ws.on('error', (error) => {
|
||||||
this.on_ws_error(this.ws, error);
|
this.on_ws_error(this.ws, error);
|
||||||
});
|
});
|
||||||
@ -237,7 +246,10 @@ class Client {
|
|||||||
on_ws_error(ws, error) {
|
on_ws_error(ws, error) {
|
||||||
logger.warn(`Websocket returned error: ${error}`);
|
logger.warn(`Websocket returned error: ${error}`);
|
||||||
this.disconnect_ws();
|
this.disconnect_ws();
|
||||||
this.connect_ws();
|
|
||||||
|
if (this.auto_reconnect) {
|
||||||
|
this.connect_ws();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
on_message(ws, msg) {
|
on_message(ws, msg) {
|
||||||
|
@ -124,6 +124,7 @@ export {
|
|||||||
is_send_press,
|
is_send_press,
|
||||||
api_server_textgenerationwebui,
|
api_server_textgenerationwebui,
|
||||||
count_view_mes,
|
count_view_mes,
|
||||||
|
max_context,
|
||||||
default_avatar,
|
default_avatar,
|
||||||
system_message_types,
|
system_message_types,
|
||||||
talkativeness_default,
|
talkativeness_default,
|
||||||
|
@ -1,12 +1,18 @@
|
|||||||
import { getContext, getApiUrl } from "../../extensions.js";
|
import { getContext } from "../../extensions.js";
|
||||||
import { delay } from "../../utils.js";
|
import { delay } from "../../utils.js";
|
||||||
import { showSwipeButtons, hideSwipeButtons, getExtensionPrompt, extension_prompt_types } from "../../../script.js";
|
import {
|
||||||
|
showSwipeButtons,
|
||||||
|
hideSwipeButtons,
|
||||||
|
getExtensionPrompt,
|
||||||
|
extension_prompt_types,
|
||||||
|
token as csrf_token,
|
||||||
|
max_context,
|
||||||
|
} from "../../../script.js";
|
||||||
|
|
||||||
const TOKEN_KEY = 'extensions_poe_token';
|
const TOKEN_KEY = 'extensions_poe_token';
|
||||||
const BOT_KEY = 'extensions_poe_bot';
|
const BOT_KEY = 'extensions_poe_bot';
|
||||||
const RESPONSE_KEY = 'extensions_poe_response';
|
const RESPONSE_KEY = 'extensions_poe_response';
|
||||||
const MESSAGE_KEY = 'extensions_poe_message';
|
const MESSAGE_KEY = 'extensions_poe_message';
|
||||||
const MAX_CONTEXT_KEY = 'extensions_poe_max_context';
|
|
||||||
|
|
||||||
const DEFAULT_MAX_CONTEXT = 2000;
|
const DEFAULT_MAX_CONTEXT = 2000;
|
||||||
const MAX_RETRIES_FOR_ACTIVATION = 5;
|
const MAX_RETRIES_FOR_ACTIVATION = 5;
|
||||||
@ -30,7 +36,6 @@ let token;
|
|||||||
let bot;
|
let bot;
|
||||||
let jailbreak_response = DEFAULT_JAILBREAK_RESPONSE;
|
let jailbreak_response = DEFAULT_JAILBREAK_RESPONSE;
|
||||||
let jailbreak_message = DEFAULT_JAILBREAK_MESSAGE;
|
let jailbreak_message = DEFAULT_JAILBREAK_MESSAGE;
|
||||||
let max_context = DEFAULT_MAX_CONTEXT;
|
|
||||||
let jailbroken = false;
|
let jailbroken = false;
|
||||||
let got_reply = false;
|
let got_reply = false;
|
||||||
|
|
||||||
@ -39,10 +44,8 @@ function loadSettings() {
|
|||||||
bot = localStorage.getItem(BOT_KEY);
|
bot = localStorage.getItem(BOT_KEY);
|
||||||
jailbreak_response = localStorage.getItem(RESPONSE_KEY) ?? DEFAULT_JAILBREAK_RESPONSE;
|
jailbreak_response = localStorage.getItem(RESPONSE_KEY) ?? DEFAULT_JAILBREAK_RESPONSE;
|
||||||
jailbreak_message = localStorage.getItem(MESSAGE_KEY) ?? DEFAULT_JAILBREAK_MESSAGE;
|
jailbreak_message = localStorage.getItem(MESSAGE_KEY) ?? DEFAULT_JAILBREAK_MESSAGE;
|
||||||
max_context = Number(localStorage.getItem(MAX_CONTEXT_KEY) ?? DEFAULT_MAX_CONTEXT);
|
|
||||||
$('#poe_activation_response').val(jailbreak_response);
|
$('#poe_activation_response').val(jailbreak_response);
|
||||||
$('#poe_activation_message').val(jailbreak_message);
|
$('#poe_activation_message').val(jailbreak_message);
|
||||||
$('#poe_max_context').val(max_context);
|
|
||||||
$('#poe_token').val(token ?? '');
|
$('#poe_token').val(token ?? '');
|
||||||
selectBot();
|
selectBot();
|
||||||
|
|
||||||
@ -63,7 +66,6 @@ function saveSettings() {
|
|||||||
localStorage.setItem(BOT_KEY, bot);
|
localStorage.setItem(BOT_KEY, bot);
|
||||||
localStorage.setItem(RESPONSE_KEY, jailbreak_response);
|
localStorage.setItem(RESPONSE_KEY, jailbreak_response);
|
||||||
localStorage.setItem(MESSAGE_KEY, jailbreak_message);
|
localStorage.setItem(MESSAGE_KEY, jailbreak_message);
|
||||||
localStorage.setItem(MAX_CONTEXT_KEY, max_context);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function onTokenInput() {
|
function onTokenInput() {
|
||||||
@ -110,6 +112,7 @@ async function generate(type, chat2, storyString, mesExamplesArray, promptBias,
|
|||||||
let messageSendString = '';
|
let messageSendString = '';
|
||||||
|
|
||||||
const allMessages = [...chat2, ...mesExamplesArray];
|
const allMessages = [...chat2, ...mesExamplesArray];
|
||||||
|
const maxContext = Math.min(Number(max_context), DEFAULT_MAX_CONTEXT);
|
||||||
|
|
||||||
for (let index = 0; index < allMessages.length; ++index) {
|
for (let index = 0; index < allMessages.length; ++index) {
|
||||||
const item = allMessages[index];
|
const item = allMessages[index];
|
||||||
@ -117,7 +120,7 @@ async function generate(type, chat2, storyString, mesExamplesArray, promptBias,
|
|||||||
const promptLength = context.encode(prompt + messageSendString + item + activator + extensionPrompt).length;
|
const promptLength = context.encode(prompt + messageSendString + item + activator + extensionPrompt).length;
|
||||||
await delay(1);
|
await delay(1);
|
||||||
|
|
||||||
if (promptLength >= Number(max_context)) {
|
if (promptLength >= maxContext) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -148,13 +151,9 @@ async function purgeConversation(count = -1) {
|
|||||||
count,
|
count,
|
||||||
});
|
});
|
||||||
|
|
||||||
const apiUrl = new URL(getApiUrl());
|
const response = await fetch('/purge_poe', {
|
||||||
apiUrl.pathname = '/api/poe/purge';
|
|
||||||
|
|
||||||
|
|
||||||
const response = await fetch(apiUrl, {
|
|
||||||
headers: {
|
headers: {
|
||||||
'Bypass-Tunnel-Reminder': 'bypass',
|
'X-CSRF-Token': csrf_token,
|
||||||
'Content-Type': 'application/json',
|
'Content-Type': 'application/json',
|
||||||
},
|
},
|
||||||
body: body,
|
body: body,
|
||||||
@ -171,12 +170,9 @@ async function sendMessage(prompt) {
|
|||||||
token,
|
token,
|
||||||
});
|
});
|
||||||
|
|
||||||
const apiUrl = new URL(getApiUrl());
|
const response = await fetch('/generate_poe', {
|
||||||
apiUrl.pathname = '/api/poe/generate';
|
|
||||||
|
|
||||||
const response = await fetch(apiUrl, {
|
|
||||||
headers: {
|
headers: {
|
||||||
'Bypass-Tunnel-Reminder': 'bypass',
|
'X-CSRF-Token': csrf_token,
|
||||||
'Content-Type': 'application/json',
|
'Content-Type': 'application/json',
|
||||||
},
|
},
|
||||||
body: body,
|
body: body,
|
||||||
@ -199,12 +195,9 @@ async function sendMessage(prompt) {
|
|||||||
|
|
||||||
async function onConnectClick() {
|
async function onConnectClick() {
|
||||||
const body = JSON.stringify({ token: token });
|
const body = JSON.stringify({ token: token });
|
||||||
const apiUrl = new URL(getApiUrl());
|
const response = await fetch('/status_poe', {
|
||||||
apiUrl.pathname = '/api/poe/status';
|
|
||||||
|
|
||||||
const response = await fetch(apiUrl, {
|
|
||||||
headers: {
|
headers: {
|
||||||
'Bypass-Tunnel-Reminder': 'bypass',
|
'X-CSRF-Token': csrf_token,
|
||||||
'Content-Type': 'application/json',
|
'Content-Type': 'application/json',
|
||||||
},
|
},
|
||||||
body: body,
|
body: body,
|
||||||
@ -248,11 +241,6 @@ function onMessageInput() {
|
|||||||
saveSettings();
|
saveSettings();
|
||||||
}
|
}
|
||||||
|
|
||||||
function onMaxContextInput() {
|
|
||||||
max_context = Number($(this).val());
|
|
||||||
saveSettings();
|
|
||||||
}
|
|
||||||
|
|
||||||
$('document').ready(function () {
|
$('document').ready(function () {
|
||||||
function addExtensionControls() {
|
function addExtensionControls() {
|
||||||
const settingsHtml = `
|
const settingsHtml = `
|
||||||
@ -271,9 +259,7 @@ $('document').ready(function () {
|
|||||||
<label for="poe_activation_message">Jailbreak activation message</label>
|
<label for="poe_activation_message">Jailbreak activation message</label>
|
||||||
<textarea id="poe_activation_message" rows="3"></textarea>
|
<textarea id="poe_activation_message" rows="3"></textarea>
|
||||||
<label for="poe_activation_response">Jailbreak activation response</label>
|
<label for="poe_activation_response">Jailbreak activation response</label>
|
||||||
<input id="poe_activation_response" class="text_pole" type="text />
|
<input id="poe_activation_response" class="text_pole" type="text" />
|
||||||
<label for="poe_max_context">Max context (in tokens)</label>
|
|
||||||
<input id="poe_max_context" class="text_pole" type="number" min="0" max="4096" />
|
|
||||||
<input id="poe_connect" class="menu_button" type="button" value="Connect" />
|
<input id="poe_connect" class="menu_button" type="button" value="Connect" />
|
||||||
<div>
|
<div>
|
||||||
<label for="poe_bots">List of bots:</label>
|
<label for="poe_bots">List of bots:</label>
|
||||||
@ -289,7 +275,6 @@ $('document').ready(function () {
|
|||||||
$('#poe_connect').on('click', onConnectClick);
|
$('#poe_connect').on('click', onConnectClick);
|
||||||
$('#poe_activation_response').on('input', onResponseInput);
|
$('#poe_activation_response').on('input', onResponseInput);
|
||||||
$('#poe_activation_message').on('input', onMessageInput);
|
$('#poe_activation_message').on('input', onMessageInput);
|
||||||
$('#poe_max_context').on('input', onMaxContextInput);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
addExtensionControls();
|
addExtensionControls();
|
||||||
|
@ -1,9 +1,7 @@
|
|||||||
{
|
{
|
||||||
"display_name": "poe.com generation",
|
"display_name": "poe.com generation",
|
||||||
"loading_order": 0,
|
"loading_order": 0,
|
||||||
"requires": [
|
"requires": [],
|
||||||
"poe"
|
|
||||||
],
|
|
||||||
"optional": [],
|
"optional": [],
|
||||||
"js": "index.js",
|
"js": "index.js",
|
||||||
"css": "style.css"
|
"css": "style.css"
|
||||||
|
58
server.js
58
server.js
@ -35,6 +35,8 @@ const tiktoken = require('@dqbd/tiktoken');
|
|||||||
var Client = require('node-rest-client').Client;
|
var Client = require('node-rest-client').Client;
|
||||||
var client = new Client();
|
var client = new Client();
|
||||||
|
|
||||||
|
let poe = require('./poe');
|
||||||
|
|
||||||
var api_server = "http://0.0.0.0:5000";
|
var api_server = "http://0.0.0.0:5000";
|
||||||
var api_novelai = "https://api.novelai.net";
|
var api_novelai = "https://api.novelai.net";
|
||||||
let api_openai = "https://api.openai.com/v1";
|
let api_openai = "https://api.openai.com/v1";
|
||||||
@ -1614,6 +1616,62 @@ app.post('/deletegroup', jsonParser, async (request, response) => {
|
|||||||
return response.send({ ok: true });
|
return response.send({ ok: true });
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const POE_DEFAULT_BOT = 'a2';
|
||||||
|
|
||||||
|
async function getPoeClient(token) {
|
||||||
|
let client = new poe.Client();
|
||||||
|
await client.init(token);
|
||||||
|
return client;
|
||||||
|
}
|
||||||
|
|
||||||
|
app.post('/status_poe', jsonParser, async (request, response) => {
|
||||||
|
if (!request.body.token) {
|
||||||
|
return response.sendStatus(400);
|
||||||
|
}
|
||||||
|
|
||||||
|
const client = await getPoeClient(request.body.token);
|
||||||
|
const botNames = client.get_bot_names();
|
||||||
|
client.disconnect_ws();
|
||||||
|
return response.send({'bot_names': botNames});
|
||||||
|
});
|
||||||
|
|
||||||
|
app.post('/purge_poe', jsonParser, async (request, response) => {
|
||||||
|
if (!request.body.token) {
|
||||||
|
return response.sendStatus(400);
|
||||||
|
}
|
||||||
|
|
||||||
|
const token = request.body.token;
|
||||||
|
const bot = request.body.bot ?? POE_DEFAULT_BOT;
|
||||||
|
const count = request.body.count ?? -1;
|
||||||
|
|
||||||
|
const client = await getPoeClient(token);
|
||||||
|
await client.purge_conversation(bot, count)
|
||||||
|
client.disconnect_ws();
|
||||||
|
|
||||||
|
return response.send({"ok" : true});
|
||||||
|
});
|
||||||
|
|
||||||
|
app.post('/generate_poe', jsonParser, async (request, response) => {
|
||||||
|
if (!request.body.token || !request.body.prompt) {
|
||||||
|
return response.sendStatus(400);
|
||||||
|
}
|
||||||
|
|
||||||
|
const token = request.body.token;
|
||||||
|
const prompt = request.body.prompt;
|
||||||
|
const bot = request.body.bot ?? POE_DEFAULT_BOT;
|
||||||
|
|
||||||
|
const client = await getPoeClient(token);
|
||||||
|
|
||||||
|
let reply;
|
||||||
|
for await (const mes of client.send_message(bot, prompt)) {
|
||||||
|
reply = mes.text;
|
||||||
|
}
|
||||||
|
|
||||||
|
client.disconnect_ws();
|
||||||
|
|
||||||
|
return response.send({'reply': reply});
|
||||||
|
});
|
||||||
|
|
||||||
function getThumbnailFolder(type) {
|
function getThumbnailFolder(type) {
|
||||||
let thumbnailFolder;
|
let thumbnailFolder;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user