Userscripts reorganizing

Moved examples to their own example directory, treating folders we didn't add as a unofficial folder, anything in examples gets submitted in commits. Because I want people to learn that kaipreset_ should only be used if a file should be part of KoboldAI's official scripts the examples do not have kaipreset_ in the name.
This commit is contained in:
henk717
2022-01-15 18:16:07 +01:00
parent 9bcc24c07e
commit cbebfae236
12 changed files with 120 additions and 38 deletions

View File

@ -0,0 +1,2 @@
This folder contains example code for KoboldAI, to use these scripts move them to the userscripts folder.
Anything in this folder is considered official, make sure to copy it to the userscripts folder first if you do not want changes overwritten or commited as examples.

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,25 @@
/*
* This file is part of KoboldAI.
*
* KoboldAI is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
import lua.Table;
extern class KoboldLib {
@:luaDotMethod public function get_config_file(?clear:Bool):lua.FileHandle;
@:luaDotMethod public function halt_generation():Void;
@:luaDotMethod public function restart_generation(?sequence:Int):Void;
public var outputs:Null<Table<Int, String>>;
}

View File

@ -0,0 +1,91 @@
/*
* This file is part of KoboldAI.
*
* KoboldAI is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
import haxe.exceptions.PosException;
import lua.Lua;
@:expose class Main {
public static final kobold:KoboldLib = untyped __lua__("_G.kobold");
public static final exampleConfig = "return true";
public static var shouldRun:Bool;
public static var f:BigInt = -2;
public static var e:BigInt = 4;
public static var s:BigInt = 8;
public static var t:BigInt = 1;
public static var i:BigInt = 0;
public static var v:BigInt = 1;
public static var a:BigInt = 6;
public static var l:BigInt = 1;
public static function inmod() {
if (!shouldRun) return;
kobold.halt_generation();
}
public static function outmod() {
if (!shouldRun) return;
// Gibbons, Jeremy. (2004). Unbounded Spigot Algorithms for the Digits
// of Pi. American Mathematical Monthly. 113. 10.2307/27641917.
while (true) {
var x = i/v;
if (x == (i + t)/v) {
trace(x);
kobold.outputs[1] = Std.string(x);
t *= 10;
i -= x*v;
i *= 10;
break;
}
else {
v *= s*a;
i *= s;
s += 8;
i += e * t;
e += 4;
i *= a;
a += 4;
t *= f*l;
l += 2;
f -= 4;
}
}
kobold.restart_generation(1);
}
public static function main() {
var f = kobold.get_config_file();
f.seek("set");
if (f.read(1) == null) f.write(exampleConfig);
f.seek("set");
var a = f.read("a");
f.close();
var result = Lua.load(a);
trace(result);
if (result.message != null) throw new PosException(result.message);
shouldRun = switch result.func() {
case false: false;
case null: false;
default: true;
}
}
}

View File

@ -0,0 +1,24 @@
# Installing dependencies:
* Install [Haxe](https://haxe.org/) 4 and Haxelib. Add them to your PATH. The specific version of Haxe used for this compilation was 4.2.4.
* Install the Haxelib package [littleBigInt](https://github.com/maitag/littleBigInt), version 0.1.3:
```
haxelib install littleBigInt 0.1.3
```
* Install [Node.js](https://nodejs.org/).
* Install https://github.com/FATH-Mechatronics/luamin/tree/d7359250cf28ab617ba5e43d1fda6ec411b1f9f7 using npm:
```
npm install FATH-Mechatronics/luamin#d7359250cf28ab617ba5e43d1fda6ec411b1f9f7
```
# Compilation:
* Run build.sh if you're running Linux or build.bat if you're running Windows.
* Use Node.js to run min.js:
```
node min.js
```

View File

@ -0,0 +1,16 @@
:: This file is part of KoboldAI.
::
:: KoboldAI is free software: you can redistribute it and/or modify
:: it under the terms of the GNU Affero General Public License as published by
:: the Free Software Foundation, either version 3 of the License, or
:: (at your option) any later version.
::
:: This program is distributed in the hope that it will be useful,
:: but WITHOUT ANY WARRANTY; without even the implied warranty of
:: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
:: GNU Affero General Public License for more details.
::
:: You should have received a copy of the GNU Affero General Public License
:: along with this program. If not, see <https://www.gnu.org/licenses/>.
@powershell ./build.ps1 %1

View File

@ -0,0 +1,21 @@
# This file is part of KoboldAI.
#
# KoboldAI is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
$path = "out.lua"
if ($args[0].length -gt 0) {
$path = $args[0]
}
haxe --lua $path -L littleBigInt --main Main
if (-not $?) { exit 1 }
(Get-Content $path).replace('_G.require("rex_pcre")', '({flags = function() return {CASELESS = 1, DOTALL = 1, MULTILINE = 1, UCP = 1, UTF8 = 1} end, gsub = function() return "" end, new = function() return {} end})').replace("return _hx_exports", "return _hx_exports.Main").replace(" _hx_bit_raw = _G.require('bit32')", " _hx_bit_raw = {arshift = function(x, n) local y = x >> n; if (x < 0) then y = y | ~(-1 >> n) end return y end, band = function(x, y) return x & y end, bor = function(x, y) return x | y end, bnot = function(x) return ~x end, bxor = function(x, y) return x ~ y end, lshift = function(x, n) return x << n end, rshift = function(x, n) return x >> n end}").replace('__lua_lib_luautf8_Utf8 = _G.require("lua-utf8")', "__lua_lib_luautf8_Utf8 = {byte = _G.string.byte, find = _G.string.find, gmatch = _G.string.gmatch, gsub = _G.string.gsub, lower = _G.string.lower, match = _G.string.match, reverse = _G.string.reverse, sub = _G.string.sub, upper = _G.string.upper}; for k, v in pairs(_G.utf8) do __lua_lib_luautf8_Utf8[k] = v end;").replace("_G.xpcall(Main.main, _hx_error)", 'local err; if not xpcall(Main.main, function(obj) err = ""; local _print = _G.print; _G.print = function(...) local args = table.pack(...) for i = 1, args.n do args[i] = tostring(args[i]) end err = err .. table.concat(args, "\t") .. "\n" end _hx_error(obj); _G.print = _print end) then _G.error(err) return end;') | Set-Content $path

View File

@ -0,0 +1,27 @@
#!/bin/bash
# This file is part of KoboldAI.
#
# KoboldAI is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
set -e
path=$1
if [ $# -eq 0 ]
then
path="out.lua"
fi
haxe --lua $path -L littleBigInt --main Main
perl -pe 's/\Q_G.require("rex_pcre")/\E({flags = function() return {CASELESS = 1, DOTALL = 1, MULTILINE = 1, UCP = 1, UTF8 = 1} end, gsub = function() return "" end, new = function() return {} end})/' -i $path
perl -pe 's/\Qreturn _hx_exports/\Ereturn _hx_exports.Main/' -i $path
perl -pe "s/\Q _hx_bit_raw = _G.require('bit32')/\E _hx_bit_raw = {arshift = function(x, n) local y = x >> n; if (x < 0) then y = y | ~(-1 >> n) end return y end, band = function(x, y) return x & y end, bor = function(x, y) return x | y end, bnot = function(x) return ~x end, bxor = function(x, y) return x ~ y end, lshift = function(x, n) return x << n end, rshift = function(x, n) return x >> n end}/" -i $path
perl -pe 's/\Q__lua_lib_luautf8_Utf8 = _G.require("lua-utf8")/\E__lua_lib_luautf8_Utf8 = {byte = _G.string.byte, find = _G.string.find, gmatch = _G.string.gmatch, gsub = _G.string.gsub, lower = _G.string.lower, match = _G.string.match, reverse = _G.string.reverse, sub = _G.string.sub, upper = _G.string.upper}; for k, v in pairs(_G.utf8) do __lua_lib_luautf8_Utf8[k] = v end;/' -i $path
perl -pe 's/\Q_G.xpcall(Main.main, _hx_error)/\Elocal err; if not xpcall(Main.main, function(obj) err = ""; local _print = _G.print; _G.print = function(...) local args = table.pack(...) for i = 1, args.n do args[i] = tostring(args[i]) end err = err .. table.concat(args, "\\t") .. "\\n" end _hx_error(obj); _G.print = _print end) then _G.error(err) return end;/' -i $path

View File

@ -0,0 +1,54 @@
const fs = require("fs");
const luamin = require("luamin");
const in_path = "out.lua";
const out_path = "out.min.lua";
var data = fs.readFileSync(in_path, "utf8");
data = luamin.minify(data);
data = '-- Haxe transcendental test\n\
-- This is a script written in Haxe that prints the natural logarithm of the\n\
-- golden ratio in base 10 to arbitrarily many digits.\n\
\n\
-- This file is part of KoboldAI.\n\
--\n\
-- KoboldAI is free software: you can redistribute it and/or modify\n\
-- it under the terms of the GNU Affero General Public License as published by\n\
-- the Free Software Foundation, either version 3 of the License, or\n\
-- (at your option) any later version.\n\
--\n\
-- This program is distributed in the hope that it will be useful,\n\
-- but WITHOUT ANY WARRANTY; without even the implied warranty of\n\
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n\
-- GNU Affero General Public License for more details.\n\
--\n\
-- You should have received a copy of the GNU Affero General Public License\n\
-- along with this program. If not, see <https://www.gnu.org/licenses/>.\n\
\n\
--------------------------------------------------------------------------------\n\
\n\
-- License for littleBigInt:\n\
\n\
-- MIT License\n\
--\n\
-- Copyright (c) 2020 Sylvio Sell\n\
--\n\
-- Permission is hereby granted, free of charge, to any person obtaining a copy\n\
-- of this software and associated documentation files (the "Software"), to deal\n\
-- in the Software without restriction, including without limitation the rights\n\
-- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n\
-- copies of the Software, and to permit persons to whom the Software is\n\
-- furnished to do so, subject to the following conditions:\n\
--\n\
-- The above copyright notice and this permission notice shall be included in all\n\
-- copies or substantial portions of the Software.\n\
--\n\
-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n\
-- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n\
-- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n\
-- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n\
-- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n\
-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n\
-- SOFTWARE.\n\
\n' + data + "\n";
fs.writeFileSync(out_path, data);

View File

@ -0,0 +1,76 @@
-- Example script
-- Description goes on
--[[subsequent lines including
in multiline comments]]
kobold = require("bridge")() -- This line is optional and is only for EmmyLua type annotations
-- You can import libraries that are in extern/lualibs/
local inspect = require("inspect")
local mt19937ar = require("mt19937ar")
---@class KoboldUserScript
local userscript = {}
local twister = mt19937ar.new()
local seed = math.random(0, 2147483647)
local token_num = 0
local lifetime_token_num = 0
-- This gets run when user submits a string to the AI (right after the input
-- formatting is applied but before the string is actually sent to the AI)
function userscript.inmod()
warn("\nINPUT MODIFIER")
token_num = 0
twister:init_genrand(seed)
print("Submitted text: " .. kobold.submission) -- You can also write to kobold.submission to alter the user's input
print("top-p sampling value: " .. kobold.settings.settopp)
end
-- This gets run every time the AI generates a token (before the token is
-- actually sampled, so this is where you can make certain tokens more likely
-- to appear than others)
function userscript.genmod()
warn("\nGENERATION MODIFIER")
print("Tokens generated in the current generation: " .. token_num)
print("Tokens generated since this script started up: " .. lifetime_token_num)
local r = twister:genrand_real3()
print("Setting top-p sampling value to " .. r)
kobold.settings.settopp = r
local generated = {}
for sequence_number, tokens in ipairs(kobold.generated) do
generated[sequence_number] = kobold.decode(tokens)
end
print("Current generated strings: " .. inspect(generated))
if token_num == math.floor(kobold.settings.genamt/2) then
print("\n\n\n\n\n\nMaking all subsequent tokens more likely to be exclamation marks...")
end
if token_num >= math.floor(kobold.settings.genamt/2) then
for i = 1, kobold.settings.numseqs do
kobold.logits[i][1] = 13.37
end
end
token_num = token_num + 1
lifetime_token_num = lifetime_token_num + 1
end
-- This gets run right before the output formatting is applied after generation
-- is finished
function userscript.outmod()
warn("\nOUTPUT MODIFIER")
for chunk in kobold.story:reverse_iter() do
print(chunk.num, chunk.content)
end
print("Wrapping first output in brackets")
kobold.outputs[1] = "[" .. kobold.outputs[1] .. "]"
end
return userscript