mirror of
				https://github.com/KoboldAI/KoboldAI-Client.git
				synced 2025-06-05 21:59:24 +02:00 
			
		
		
		
	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:
		
							
								
								
									
										2
									
								
								userscripts/examples/Readme.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								userscripts/examples/Readme.txt
									
									
									
									
									
										Normal 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. | ||||
							
								
								
									
										46
									
								
								userscripts/examples/haxe_transcend.min.lua
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								userscripts/examples/haxe_transcend.min.lua
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										25
									
								
								userscripts/examples/haxe_transcend/KoboldLib.hx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								userscripts/examples/haxe_transcend/KoboldLib.hx
									
									
									
									
									
										Normal 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>>; | ||||
| } | ||||
							
								
								
									
										91
									
								
								userscripts/examples/haxe_transcend/Main.hx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										91
									
								
								userscripts/examples/haxe_transcend/Main.hx
									
									
									
									
									
										Normal 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; | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										24
									
								
								userscripts/examples/haxe_transcend/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								userscripts/examples/haxe_transcend/README.md
									
									
									
									
									
										Normal 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 | ||||
|   ``` | ||||
							
								
								
									
										16
									
								
								userscripts/examples/haxe_transcend/build.bat
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								userscripts/examples/haxe_transcend/build.bat
									
									
									
									
									
										Normal 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 | ||||
							
								
								
									
										21
									
								
								userscripts/examples/haxe_transcend/build.ps1
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								userscripts/examples/haxe_transcend/build.ps1
									
									
									
									
									
										Normal 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 | ||||
							
								
								
									
										27
									
								
								userscripts/examples/haxe_transcend/build.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								userscripts/examples/haxe_transcend/build.sh
									
									
									
									
									
										Normal 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 | ||||
							
								
								
									
										54
									
								
								userscripts/examples/haxe_transcend/min.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								userscripts/examples/haxe_transcend/min.js
									
									
									
									
									
										Normal 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); | ||||
							
								
								
									
										76
									
								
								userscripts/examples/various_examples.lua
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										76
									
								
								userscripts/examples/various_examples.lua
									
									
									
									
									
										Normal 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 | ||||
		Reference in New Issue
	
	Block a user