[feat] metrica plugin

This commit is contained in:
kwaroran
2023-11-11 14:00:54 +09:00
parent 55f508bff7
commit c1dbe886a0
5 changed files with 83 additions and 0 deletions

View File

@@ -99,6 +99,7 @@ export const languageEnglish = {
romanizer: "Romanizer is a plugin that converts non-roman characters to roman characters to reduce tokens when using non-roman characters while requesting data. this can result diffrent output from the original model. it is not recommended to use this plugin when using roman characters on chat.", romanizer: "Romanizer is a plugin that converts non-roman characters to roman characters to reduce tokens when using non-roman characters while requesting data. this can result diffrent output from the original model. it is not recommended to use this plugin when using roman characters on chat.",
oaiRandomUser: "If enabled, random uuid would be put on user parameter on request, and would be changed on refresh. this can be used to prevent AI from identifying user.", oaiRandomUser: "If enabled, random uuid would be put on user parameter on request, and would be changed on refresh. this can be used to prevent AI from identifying user.",
inlayImages: "If enabled, images could be inlayed to the chat and AIs can see it if they support it.", inlayImages: "If enabled, images could be inlayed to the chat and AIs can see it if they support it.",
metrica: 'Metric Systemizer is a plugin that converts metrics to imperial units when request, and vice versa on output to show user metric system while using imperial for performace. it is not recommended to use this plugin when using imperial units on chat.',
}, },
setup: { setup: {
chooseProvider: "Choose AI Provider", chooseProvider: "Choose AI Provider",

View File

@@ -30,6 +30,12 @@
<div class="flex items-center mt-2"> <div class="flex items-center mt-2">
<Check bind:check={$DataBase.officialplugins.romanizer} name={language.able}/> <Check bind:check={$DataBase.officialplugins.romanizer} name={language.able}/>
</div> </div>
<div class="flex">
<span class="font-bold flex-grow">Metric Systemizer <Help key="metrica" /> <span class="text-green-500 italic">(Official Plugin)</span></span>
</div>
<div class="flex items-center mt-2">
<Check bind:check={$DataBase.officialplugins.metrica} name={language.able}/>
</div>
{#each $DataBase.plugins as plugin, i} {#each $DataBase.plugins as plugin, i}
<div class="border-borderc mt-2 mb-2 w-full border-solid border-b-1 seperator"></div> <div class="border-borderc mt-2 mb-2 w-full border-solid border-b-1 seperator"></div>
<div class="flex"> <div class="flex">

68
src/ts/plugins/metrica.ts Normal file
View File

@@ -0,0 +1,68 @@
const convertion:[string,string,number][] = [
['kg', 'lbs', 2.20462],
['m', 'ft', 3.28084],
['cm', 'in', 0.393701],
['mm', 'in', 0.0393701],
['km', 'mi', 0.621371],
['killogram', 'pound', 2.20462],
['meter', 'foot', 3.28084],
['centimeter', 'inch', 0.393701],
['millimeter', 'inch', 0.0393701],
['kilometer', 'mile', 0.621371],
]
export function metricaPlugin(data:string, toSystem:'metrics'|'imperial'){
const c = convertion.sort((a,b) => b[0].length - a[0].length);
for(let i=0;i<data.length;i++){
function extractNumber(data:string, i:number){
let number = '';
while(i > 0){
i--;
if(data[i] === ' ' || data[i] === '\n' || data[i] === '\t' || data[i] === ','){
continue
}
if(data[i] === '.'){
number = '.' + number;
continue;
}
if(isNaN(Number(data[i]))){
break;
}
number = data[i] + number;
}
i++
while(data[i] === ' ' || data[i] === '\n' || data[i] === '\t' || data[i] === ','){
i++;
}
return {
number: number === '' ? 0 : Number(number),
index: i
};
}
let sub = ''
let sublen = 0;
for(let j=0;j<c.length;j++){
const [from, to, ratio] = (toSystem === 'imperial') ? c[j] : [c[j][1], c[j][0], 1/c[j][2]];
if(sublen !== from.length){
sub = data.substring(i,i+from.length)
sublen = from.length;
}
if(sub === from){
const n = extractNumber(data, i);
if(n .number !== 0){
const num = (n.number * ratio)
const rto = (num >= 1) ? num.toFixed(0) : num.toFixed(1);
const newData = data.substring(0, n.index) + rto + ' ' + to + data.substring(i+from.length);
const offset = newData.length - data.length;
i += offset;
data = newData;
}
}
}
}
return data
}

View File

@@ -8,6 +8,7 @@ import { selectSingleFile } from "../util";
import { risuChatParser as risuChatParserOrg, type simpleCharacterArgument } from "../parser"; import { risuChatParser as risuChatParserOrg, type simpleCharacterArgument } from "../parser";
import { autoMarkPlugin } from "../plugins/automark"; import { autoMarkPlugin } from "../plugins/automark";
import { runCharacterJS } from "../plugins/embedscript"; import { runCharacterJS } from "../plugins/embedscript";
import { metricaPlugin } from "../plugins/metrica";
const dreg = /{{data}}/g const dreg = /{{data}}/g
const randomness = /\|\|\|/g const randomness = /\|\|\|/g
@@ -62,6 +63,12 @@ export async function processScriptFull(char:character|groupChat|simpleCharacter
if(db.officialplugins.automark && mode === 'editdisplay'){ if(db.officialplugins.automark && mode === 'editdisplay'){
data = autoMarkPlugin(data) data = autoMarkPlugin(data)
} }
if(db.officialplugins.metrica && mode === 'editdisplay'){
data = metricaPlugin(data, 'metrics')
}
if(db.officialplugins.metrica && (mode === 'editinput' || mode === 'editoutput')){
data = metricaPlugin(data, 'imperial')
}
data = await runCharacterJS({ data = await runCharacterJS({
code: char.virtualscript ?? null, code: char.virtualscript ?? null,
mode, mode,

View File

@@ -363,6 +363,7 @@ export interface Database{
officialplugins: { officialplugins: {
automark?: boolean automark?: boolean
romanizer?: boolean romanizer?: boolean
metrica?: boolean
} }
currentPluginProvider: string currentPluginProvider: string
zoomsize:number zoomsize:number