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/Readme.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								userscripts/Readme.txt
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,2 @@
 | 
			
		||||
This folder contains userscripts for KoboldAI, any script that begins with kaipreset_ is treated as a official part of KoboldAI and can be overwritten by updates.
 | 
			
		||||
If you would like to make modifications to any of the lua scripts it is recommended you that you either rename the script, or create a new copy with a new name.
 | 
			
		||||
							
								
								
									
										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.
 | 
			
		||||
@@ -1,16 +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
 | 
			
		||||
:: 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
 | 
			
		||||
@@ -1,21 +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
 | 
			
		||||
# 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
 | 
			
		||||
							
								
								
									
										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