improve path processing
This commit is contained in:
parent
95502b900d
commit
947e127e34
@ -39,10 +39,15 @@ func (a *App) OnStartup(ctx context.Context) {
|
|||||||
a.exDir = ""
|
a.exDir = ""
|
||||||
a.cmdPrefix = ""
|
a.cmdPrefix = ""
|
||||||
|
|
||||||
|
ex, err := os.Executable()
|
||||||
|
if err == nil {
|
||||||
if runtime.GOOS == "darwin" {
|
if runtime.GOOS == "darwin" {
|
||||||
ex, _ := os.Executable()
|
|
||||||
a.exDir = filepath.Dir(ex) + "/../../../"
|
a.exDir = filepath.Dir(ex) + "/../../../"
|
||||||
a.cmdPrefix = "cd " + a.exDir + " && "
|
a.cmdPrefix = "cd " + a.exDir + " && "
|
||||||
|
} else {
|
||||||
|
a.exDir = filepath.Dir(ex) + "/"
|
||||||
|
a.cmdPrefix = "cd " + a.exDir + " && "
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
os.Chmod(a.exDir+"backend-rust/webgpu_server", 0777)
|
os.Chmod(a.exDir+"backend-rust/webgpu_server", 0777)
|
||||||
@ -50,9 +55,9 @@ func (a *App) OnStartup(ctx context.Context) {
|
|||||||
os.Mkdir(a.exDir+"models", os.ModePerm)
|
os.Mkdir(a.exDir+"models", os.ModePerm)
|
||||||
os.Mkdir(a.exDir+"lora-models", os.ModePerm)
|
os.Mkdir(a.exDir+"lora-models", os.ModePerm)
|
||||||
os.Mkdir(a.exDir+"finetune/json2binidx_tool/data", os.ModePerm)
|
os.Mkdir(a.exDir+"finetune/json2binidx_tool/data", os.ModePerm)
|
||||||
trainLogPath := a.exDir + "lora-models/train_log.txt"
|
trainLogPath := "lora-models/train_log.txt"
|
||||||
if !a.FileExists(trainLogPath) {
|
if !a.FileExists(trainLogPath) {
|
||||||
f, err := os.Create(trainLogPath)
|
f, err := os.Create(a.exDir + trainLogPath)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
f.Close()
|
f.Close()
|
||||||
}
|
}
|
||||||
|
@ -10,7 +10,11 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func (a *App) DownloadFile(path string, url string) error {
|
func (a *App) DownloadFile(path string, url string) error {
|
||||||
_, err := grab.Get(a.exDir+path, url)
|
absPath, err := a.GetAbsPath(path)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
_, err = grab.Get(absPath, url)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -88,11 +92,15 @@ func (a *App) ContinueDownload(url string) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (a *App) AddToDownloadList(path string, url string) {
|
func (a *App) AddToDownloadList(path string, url string) {
|
||||||
if !existsInDownloadList(a.exDir+path, url) {
|
absPath, err := a.GetAbsPath(path)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if !existsInDownloadList(absPath, url) {
|
||||||
downloadList = append(downloadList, &DownloadStatus{
|
downloadList = append(downloadList, &DownloadStatus{
|
||||||
resp: nil,
|
resp: nil,
|
||||||
Name: filepath.Base(path),
|
Name: filepath.Base(path),
|
||||||
Path: a.exDir + path,
|
Path: absPath,
|
||||||
Url: url,
|
Url: url,
|
||||||
Downloading: false,
|
Downloading: false,
|
||||||
})
|
})
|
||||||
|
@ -14,27 +14,55 @@ import (
|
|||||||
wruntime "github.com/wailsapp/wails/v2/pkg/runtime"
|
wruntime "github.com/wailsapp/wails/v2/pkg/runtime"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func (a *App) GetAbsPath(path string) (string, error) {
|
||||||
|
var absPath string
|
||||||
|
var err error
|
||||||
|
if filepath.IsAbs(path) {
|
||||||
|
absPath = path
|
||||||
|
} else {
|
||||||
|
absPath, err = filepath.Abs(filepath.Join(a.exDir, path))
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
absPath = strings.ReplaceAll(absPath, "/", string(os.PathSeparator))
|
||||||
|
println("GetAbsPath:", absPath)
|
||||||
|
return absPath, nil
|
||||||
|
}
|
||||||
|
|
||||||
func (a *App) SaveFile(path string, savedContent []byte) error {
|
func (a *App) SaveFile(path string, savedContent []byte) error {
|
||||||
if err := os.WriteFile(a.exDir+path, savedContent, 0644); err != nil {
|
absPath, err := a.GetAbsPath(path)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if err := os.WriteFile(absPath, savedContent, 0644); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *App) SaveJson(fileName string, jsonData any) error {
|
func (a *App) SaveJson(path string, jsonData any) error {
|
||||||
text, err := json.MarshalIndent(jsonData, "", " ")
|
text, err := json.MarshalIndent(jsonData, "", " ")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := os.WriteFile(a.exDir+fileName, text, 0644); err != nil {
|
absPath, err := a.GetAbsPath(path)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if err := os.WriteFile(absPath, text, 0644); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *App) ReadJson(fileName string) (any, error) {
|
func (a *App) ReadJson(path string) (any, error) {
|
||||||
file, err := os.ReadFile(a.exDir + fileName)
|
absPath, err := a.GetAbsPath(path)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
file, err := os.ReadFile(absPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -48,8 +76,12 @@ func (a *App) ReadJson(fileName string) (any, error) {
|
|||||||
return data, nil
|
return data, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *App) FileExists(fileName string) bool {
|
func (a *App) FileExists(path string) bool {
|
||||||
_, err := os.Stat(a.exDir + fileName)
|
absPath, err := a.GetAbsPath(path)
|
||||||
|
if err != nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
_, err = os.Stat(absPath)
|
||||||
return err == nil
|
return err == nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -60,8 +92,12 @@ type FileInfo struct {
|
|||||||
ModTime string `json:"modTime"`
|
ModTime string `json:"modTime"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *App) ReadFileInfo(fileName string) (*FileInfo, error) {
|
func (a *App) ReadFileInfo(path string) (*FileInfo, error) {
|
||||||
info, err := os.Stat(a.exDir + fileName)
|
absPath, err := a.GetAbsPath(path)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
info, err := os.Stat(absPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -74,7 +110,11 @@ func (a *App) ReadFileInfo(fileName string) (*FileInfo, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (a *App) ListDirFiles(dirPath string) ([]FileInfo, error) {
|
func (a *App) ListDirFiles(dirPath string) ([]FileInfo, error) {
|
||||||
files, err := os.ReadDir(a.exDir + dirPath)
|
absDirPath, err := a.GetAbsPath(dirPath)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
files, err := os.ReadDir(absDirPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -96,7 +136,11 @@ func (a *App) ListDirFiles(dirPath string) ([]FileInfo, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (a *App) DeleteFile(path string) error {
|
func (a *App) DeleteFile(path string) error {
|
||||||
err := os.Remove(a.exDir + path)
|
absPath, err := a.GetAbsPath(path)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
err = os.Remove(absPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -104,18 +148,27 @@ func (a *App) DeleteFile(path string) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (a *App) CopyFile(src string, dst string) error {
|
func (a *App) CopyFile(src string, dst string) error {
|
||||||
sourceFile, err := os.Open(a.exDir + src)
|
absSrc, err := a.GetAbsPath(src)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
absDst, err := a.GetAbsPath(dst)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
sourceFile, err := os.Open(absSrc)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
defer sourceFile.Close()
|
defer sourceFile.Close()
|
||||||
|
|
||||||
err = os.MkdirAll(a.exDir+dst[:strings.LastIndex(dst, "/")], 0755)
|
err = os.MkdirAll(filepath.Dir(absDst), 0755)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
destFile, err := os.Create(a.exDir + dst)
|
destFile, err := os.Create(absDst)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -166,14 +219,8 @@ func (a *App) OpenOpenFileDialog(filterPattern string) (string, error) {
|
|||||||
return path, nil
|
return path, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *App) OpenFileFolder(path string, relative bool) error {
|
func (a *App) OpenFileFolder(path string) error {
|
||||||
var absPath string
|
absPath, err := a.GetAbsPath(path)
|
||||||
var err error
|
|
||||||
if relative {
|
|
||||||
absPath, err = filepath.Abs(a.exDir + path)
|
|
||||||
} else {
|
|
||||||
absPath, err = filepath.Abs(path)
|
|
||||||
}
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
// Considering some whitespace and multilingual support, the functions in rwkv.go should always be executed with cwd as RWKV-Runner, and never use a.GetAbsPath() here.
|
||||||
package backend_golang
|
package backend_golang
|
||||||
|
|
||||||
import (
|
import (
|
||||||
@ -11,14 +12,18 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func (a *App) StartServer(python string, port int, host string, webui bool, rwkvBeta bool, rwkvcpp bool, webgpu bool) (string, error) {
|
func (a *App) StartServer(python string, port int, host string, webui bool, rwkvBeta bool, rwkvcpp bool, webgpu bool) (string, error) {
|
||||||
var err error
|
execFile := "./backend-python/main.py"
|
||||||
|
_, err := os.Stat(execFile)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
if python == "" {
|
if python == "" {
|
||||||
python, err = GetPython()
|
python, err = GetPython()
|
||||||
}
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
args := []string{python, "./backend-python/main.py"}
|
args := []string{python, execFile}
|
||||||
if webui {
|
if webui {
|
||||||
args = append(args, "--webui")
|
args = append(args, "--webui")
|
||||||
}
|
}
|
||||||
@ -36,41 +41,77 @@ func (a *App) StartServer(python string, port int, host string, webui bool, rwkv
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (a *App) StartWebGPUServer(port int, host string) (string, error) {
|
func (a *App) StartWebGPUServer(port int, host string) (string, error) {
|
||||||
args := []string{"./backend-rust/webgpu_server"}
|
var execFile string
|
||||||
|
execFiles := []string{"./backend-rust/webgpu_server", "./backend-rust/webgpu_server.exe"}
|
||||||
|
for _, file := range execFiles {
|
||||||
|
_, err := os.Stat(file)
|
||||||
|
if err == nil {
|
||||||
|
execFile = file
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if execFile == "" {
|
||||||
|
return "", errors.New(execFiles[0] + " not found")
|
||||||
|
}
|
||||||
|
args := []string{execFile}
|
||||||
args = append(args, "--port", strconv.Itoa(port), "--ip", host)
|
args = append(args, "--port", strconv.Itoa(port), "--ip", host)
|
||||||
return Cmd(args...)
|
return Cmd(args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *App) ConvertModel(python string, modelPath string, strategy string, outPath string) (string, error) {
|
func (a *App) ConvertModel(python string, modelPath string, strategy string, outPath string) (string, error) {
|
||||||
var err error
|
execFile := "./backend-python/convert_model.py"
|
||||||
|
_, err := os.Stat(execFile)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
if python == "" {
|
if python == "" {
|
||||||
python, err = GetPython()
|
python, err = GetPython()
|
||||||
}
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
return Cmd(python, "./backend-python/convert_model.py", "--in", modelPath, "--out", outPath, "--strategy", strategy)
|
return Cmd(python, execFile, "--in", modelPath, "--out", outPath, "--strategy", strategy)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *App) ConvertSafetensors(modelPath string, outPath string) (string, error) {
|
func (a *App) ConvertSafetensors(modelPath string, outPath string) (string, error) {
|
||||||
args := []string{"./backend-rust/web-rwkv-converter"}
|
var execFile string
|
||||||
|
execFiles := []string{"./backend-rust/web-rwkv-converter", "./backend-rust/web-rwkv-converter.exe"}
|
||||||
|
for _, file := range execFiles {
|
||||||
|
_, err := os.Stat(file)
|
||||||
|
if err == nil {
|
||||||
|
execFile = file
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if execFile == "" {
|
||||||
|
return "", errors.New(execFiles[0] + " not found")
|
||||||
|
}
|
||||||
|
args := []string{execFile}
|
||||||
args = append(args, "--input", modelPath, "--output", outPath)
|
args = append(args, "--input", modelPath, "--output", outPath)
|
||||||
return Cmd(args...)
|
return Cmd(args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *App) ConvertSafetensorsWithPython(python string, modelPath string, outPath string) (string, error) {
|
func (a *App) ConvertSafetensorsWithPython(python string, modelPath string, outPath string) (string, error) {
|
||||||
var err error
|
execFile := "./backend-python/convert_safetensors.py"
|
||||||
|
_, err := os.Stat(execFile)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
if python == "" {
|
if python == "" {
|
||||||
python, err = GetPython()
|
python, err = GetPython()
|
||||||
}
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
return Cmd(python, "./backend-python/convert_safetensors.py", "--input", modelPath, "--output", outPath)
|
return Cmd(python, execFile, "--input", modelPath, "--output", outPath)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *App) ConvertGGML(python string, modelPath string, outPath string, Q51 bool) (string, error) {
|
func (a *App) ConvertGGML(python string, modelPath string, outPath string, Q51 bool) (string, error) {
|
||||||
var err error
|
execFile := "./backend-python/convert_pytorch_to_ggml.py"
|
||||||
|
_, err := os.Stat(execFile)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
if python == "" {
|
if python == "" {
|
||||||
python, err = GetPython()
|
python, err = GetPython()
|
||||||
}
|
}
|
||||||
@ -81,11 +122,15 @@ func (a *App) ConvertGGML(python string, modelPath string, outPath string, Q51 b
|
|||||||
if Q51 {
|
if Q51 {
|
||||||
dataType = "Q5_1"
|
dataType = "Q5_1"
|
||||||
}
|
}
|
||||||
return Cmd(python, "./backend-python/convert_pytorch_to_ggml.py", modelPath, outPath, dataType)
|
return Cmd(python, execFile, modelPath, outPath, dataType)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *App) ConvertData(python string, input string, outputPrefix string, vocab string) (string, error) {
|
func (a *App) ConvertData(python string, input string, outputPrefix string, vocab string) (string, error) {
|
||||||
var err error
|
execFile := "./finetune/json2binidx_tool/tools/preprocess_data.py"
|
||||||
|
_, err := os.Stat(execFile)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
if python == "" {
|
if python == "" {
|
||||||
python, err = GetPython()
|
python, err = GetPython()
|
||||||
}
|
}
|
||||||
@ -129,19 +174,23 @@ func (a *App) ConvertData(python string, input string, outputPrefix string, voca
|
|||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
|
|
||||||
return Cmd(python, "./finetune/json2binidx_tool/tools/preprocess_data.py", "--input", input, "--output-prefix", outputPrefix, "--vocab", vocab,
|
return Cmd(python, execFile, "--input", input, "--output-prefix", outputPrefix, "--vocab", vocab,
|
||||||
"--tokenizer-type", tokenizerType, "--dataset-impl", "mmap", "--append-eod")
|
"--tokenizer-type", tokenizerType, "--dataset-impl", "mmap", "--append-eod")
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *App) MergeLora(python string, useGpu bool, loraAlpha int, baseModel string, loraPath string, outputPath string) (string, error) {
|
func (a *App) MergeLora(python string, useGpu bool, loraAlpha int, baseModel string, loraPath string, outputPath string) (string, error) {
|
||||||
var err error
|
execFile := "./finetune/lora/merge_lora.py"
|
||||||
|
_, err := os.Stat(execFile)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
if python == "" {
|
if python == "" {
|
||||||
python, err = GetPython()
|
python, err = GetPython()
|
||||||
}
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
args := []string{python, "./finetune/lora/merge_lora.py"}
|
args := []string{python, execFile}
|
||||||
if useGpu {
|
if useGpu {
|
||||||
args = append(args, "--use-gpu")
|
args = append(args, "--use-gpu")
|
||||||
}
|
}
|
||||||
@ -157,9 +206,9 @@ func (a *App) DepCheck(python string) error {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
out, err := exec.Command(python, a.exDir+"./backend-python/dep_check.py").CombinedOutput()
|
out, err := exec.Command(python, a.exDir+"backend-python/dep_check.py").CombinedOutput()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.New("DepCheck Error: " + string(out))
|
return errors.New("DepCheck Error: " + string(out) + " GError: " + err.Error())
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@ -185,7 +234,7 @@ func (a *App) InstallPyDep(python string, cnMirror bool) (string, error) {
|
|||||||
if !cnMirror {
|
if !cnMirror {
|
||||||
installScript = strings.Replace(installScript, " -i https://pypi.tuna.tsinghua.edu.cn/simple", "", -1)
|
installScript = strings.Replace(installScript, " -i https://pypi.tuna.tsinghua.edu.cn/simple", "", -1)
|
||||||
}
|
}
|
||||||
err = os.WriteFile("./install-py-dep.bat", []byte(installScript), 0644)
|
err = os.WriteFile(a.exDir+"install-py-dep.bat", []byte(installScript), 0644)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
|
@ -23,14 +23,19 @@ func CmdHelper(hideWindow bool, args ...string) (*exec.Cmd, error) {
|
|||||||
if runtime.GOOS != "windows" {
|
if runtime.GOOS != "windows" {
|
||||||
return nil, errors.New("unsupported OS")
|
return nil, errors.New("unsupported OS")
|
||||||
}
|
}
|
||||||
filename := "./cmd-helper.bat"
|
ex, err := os.Executable()
|
||||||
_, err := os.Stat(filename)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if err := os.WriteFile(filename, []byte("start %*"), 0644); err != nil {
|
return nil, err
|
||||||
|
}
|
||||||
|
exDir := filepath.Dir(ex) + "/"
|
||||||
|
path := exDir + "cmd-helper.bat"
|
||||||
|
_, err = os.Stat(path)
|
||||||
|
if err != nil {
|
||||||
|
if err := os.WriteFile(path, []byte("start %*"), 0644); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
cmdHelper, err := filepath.Abs(filename)
|
cmdHelper, err := filepath.Abs(path)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -86,16 +91,18 @@ func Cmd(args ...string) (string, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func CopyEmbed(efs embed.FS) error {
|
func CopyEmbed(efs embed.FS) error {
|
||||||
prefix := ""
|
|
||||||
if runtime.GOOS == "darwin" {
|
|
||||||
ex, err := os.Executable()
|
ex, err := os.Executable()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
var prefix string
|
||||||
|
if runtime.GOOS == "darwin" {
|
||||||
prefix = filepath.Dir(ex) + "/../../../"
|
prefix = filepath.Dir(ex) + "/../../../"
|
||||||
|
} else {
|
||||||
|
prefix = filepath.Dir(ex) + "/"
|
||||||
}
|
}
|
||||||
|
|
||||||
err := fs.WalkDir(efs, ".", func(path string, d fs.DirEntry, err error) error {
|
err = fs.WalkDir(efs, ".", func(path string, d fs.DirEntry, err error) error {
|
||||||
if d.IsDir() {
|
if d.IsDir() {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@ -136,13 +143,19 @@ func CopyEmbed(efs embed.FS) error {
|
|||||||
func GetPython() (string, error) {
|
func GetPython() (string, error) {
|
||||||
switch platform := runtime.GOOS; platform {
|
switch platform := runtime.GOOS; platform {
|
||||||
case "windows":
|
case "windows":
|
||||||
_, err := os.Stat("py310/python.exe")
|
ex, err := os.Executable()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
_, err := os.Stat("python-3.10.11-embed-amd64.zip")
|
return "", err
|
||||||
|
}
|
||||||
|
exDir := filepath.Dir(ex) + "/"
|
||||||
|
pyexe := exDir + "py310/python.exe"
|
||||||
|
_, err = os.Stat(pyexe)
|
||||||
|
if err != nil {
|
||||||
|
_, err := os.Stat(exDir + "python-3.10.11-embed-amd64.zip")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", errors.New("python zip not found")
|
return "", errors.New("python zip not found")
|
||||||
} else {
|
} else {
|
||||||
err := Unzip("python-3.10.11-embed-amd64.zip", "py310")
|
err := Unzip(exDir+"python-3.10.11-embed-amd64.zip", exDir+"py310")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", errors.New("failed to unzip python")
|
return "", errors.New("failed to unzip python")
|
||||||
} else {
|
} else {
|
||||||
|
@ -9,7 +9,6 @@ import (
|
|||||||
"io"
|
"io"
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
"path/filepath"
|
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
@ -133,13 +132,7 @@ func (a *App) WslStop() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (a *App) WslIsEnabled() error {
|
func (a *App) WslIsEnabled() error {
|
||||||
ex, err := os.Executable()
|
data, err := os.ReadFile(a.exDir + "wsl.state")
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
exDir := filepath.Dir(ex)
|
|
||||||
|
|
||||||
data, err := os.ReadFile(exDir + "/wsl.state")
|
|
||||||
if err == nil {
|
if err == nil {
|
||||||
if strings.Contains(string(data), "Enabled") {
|
if strings.Contains(string(data), "Enabled") {
|
||||||
return nil
|
return nil
|
||||||
@ -147,12 +140,12 @@ func (a *App) WslIsEnabled() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
cmd := `-Command (Get-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform).State | Out-File -Encoding utf8 -FilePath ` + a.exDir + "wsl.state"
|
cmd := `-Command (Get-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform).State | Out-File -Encoding utf8 -FilePath ` + a.exDir + "wsl.state"
|
||||||
_, err = su.ShellExecute(su.RUNAS, "powershell", cmd, exDir)
|
_, err = su.ShellExecute(su.RUNAS, "powershell", cmd, a.exDir)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
time.Sleep(2 * time.Second)
|
time.Sleep(2 * time.Second)
|
||||||
data, err = os.ReadFile(exDir + "/wsl.state")
|
data, err = os.ReadFile(a.exDir + "wsl.state")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -170,7 +163,7 @@ func (a *App) WslEnable(forceMode bool) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if forceMode {
|
if forceMode {
|
||||||
os.WriteFile("./wsl.state", []byte("Enabled"), 0644)
|
os.WriteFile(a.exDir+"wsl.state", []byte("Enabled"), 0644)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -4,7 +4,7 @@ import os
|
|||||||
import pathlib
|
import pathlib
|
||||||
import copy
|
import copy
|
||||||
import re
|
import re
|
||||||
from typing import Dict, Iterable, List, Tuple, Union, Type
|
from typing import Dict, Iterable, List, Tuple, Union, Type, Callable
|
||||||
from utils.log import quick_log
|
from utils.log import quick_log
|
||||||
from fastapi import HTTPException
|
from fastapi import HTTPException
|
||||||
from pydantic import BaseModel, Field
|
from pydantic import BaseModel, Field
|
||||||
@ -556,7 +556,41 @@ def get_tokenizer(tokenizer_len: int):
|
|||||||
return "rwkv_vocab_v20230424"
|
return "rwkv_vocab_v20230424"
|
||||||
|
|
||||||
|
|
||||||
|
def get_model_path(model_path: str) -> str:
|
||||||
|
if os.path.isabs(model_path):
|
||||||
|
return model_path
|
||||||
|
|
||||||
|
working_dir: pathlib.Path = pathlib.Path(os.path.abspath(os.getcwd()))
|
||||||
|
|
||||||
|
parent_paths: List[pathlib.Path] = [
|
||||||
|
working_dir, # [cwd](RWKV-Runner)/models/xxx
|
||||||
|
working_dir.parent, # [cwd](backend-python)/../models/xxx
|
||||||
|
pathlib.Path(
|
||||||
|
os.path.abspath(__file__)
|
||||||
|
).parent.parent, # backend-python/models/xxx
|
||||||
|
pathlib.Path(
|
||||||
|
os.path.abspath(__file__)
|
||||||
|
).parent.parent.parent, # RWKV-Runner/models/xxx
|
||||||
|
]
|
||||||
|
|
||||||
|
child_paths: List[Callable[[pathlib.Path], pathlib.Path]] = [
|
||||||
|
lambda p: p / model_path,
|
||||||
|
lambda p: p / "build" / "bin" / model_path, # for dev
|
||||||
|
]
|
||||||
|
|
||||||
|
for parent_path in parent_paths:
|
||||||
|
for child_path in child_paths:
|
||||||
|
full_path: pathlib.Path = child_path(parent_path)
|
||||||
|
|
||||||
|
if os.path.isfile(full_path):
|
||||||
|
return str(full_path)
|
||||||
|
|
||||||
|
return model_path
|
||||||
|
|
||||||
|
|
||||||
def RWKV(model: str, strategy: str, tokenizer: Union[str, None]) -> AbstractRWKV:
|
def RWKV(model: str, strategy: str, tokenizer: Union[str, None]) -> AbstractRWKV:
|
||||||
|
model = get_model_path(model)
|
||||||
|
|
||||||
rwkv_beta = global_var.get(global_var.Args).rwkv_beta
|
rwkv_beta = global_var.get(global_var.Args).rwkv_beta
|
||||||
rwkv_cpp = getattr(global_var.get(global_var.Args), "rwkv.cpp")
|
rwkv_cpp = getattr(global_var.get(global_var.Args), "rwkv.cpp")
|
||||||
webgpu = global_var.get(global_var.Args).webgpu
|
webgpu = global_var.get(global_var.Args).webgpu
|
||||||
|
@ -295,7 +295,7 @@ const SidePanel: FC = observer(() => {
|
|||||||
OpenSaveFileDialog('*.txt', 'conversation.txt', savedContent).then((path) => {
|
OpenSaveFileDialog('*.txt', 'conversation.txt', savedContent).then((path) => {
|
||||||
if (path)
|
if (path)
|
||||||
toastWithButton(t('Conversation Saved'), t('Open'), () => {
|
toastWithButton(t('Conversation Saved'), t('Open'), () => {
|
||||||
OpenFileFolder(path, false);
|
OpenFileFolder(path);
|
||||||
});
|
});
|
||||||
}).catch(e => {
|
}).catch(e => {
|
||||||
toast(t('Error') + ' - ' + (e.message || e), { type: 'error', autoClose: 2500 });
|
toast(t('Error') + ' - ' + (e.message || e), { type: 'error', autoClose: 2500 });
|
||||||
|
@ -426,7 +426,7 @@ const CompositionPanel: FC = observer(() => {
|
|||||||
OpenSaveFileDialog('*.txt', 'abc-music.txt', commonStore.compositionParams.prompt).then((path) => {
|
OpenSaveFileDialog('*.txt', 'abc-music.txt', commonStore.compositionParams.prompt).then((path) => {
|
||||||
if (path)
|
if (path)
|
||||||
toastWithButton(t('File Saved'), t('Open'), () => {
|
toastWithButton(t('File Saved'), t('Open'), () => {
|
||||||
OpenFileFolder(path, false);
|
OpenFileFolder(path);
|
||||||
});
|
});
|
||||||
}).catch((e) => {
|
}).catch((e) => {
|
||||||
toast(t('Error') + ' - ' + (e.message || e), { type: 'error', autoClose: 2500 });
|
toast(t('Error') + ' - ' + (e.message || e), { type: 'error', autoClose: 2500 });
|
||||||
@ -437,7 +437,7 @@ const CompositionPanel: FC = observer(() => {
|
|||||||
OpenSaveFileDialogBytes('*.mid', 'music.mid', Array.from(new Uint8Array(params.midi))).then((path) => {
|
OpenSaveFileDialogBytes('*.mid', 'music.mid', Array.from(new Uint8Array(params.midi))).then((path) => {
|
||||||
if (path)
|
if (path)
|
||||||
toastWithButton(t('File Saved'), t('Open'), () => {
|
toastWithButton(t('File Saved'), t('Open'), () => {
|
||||||
OpenFileFolder(path, false);
|
OpenFileFolder(path);
|
||||||
});
|
});
|
||||||
}).catch((e) => {
|
}).catch((e) => {
|
||||||
toast(t('Error') + ' - ' + (e.message || e), { type: 'error', autoClose: 2500 });
|
toast(t('Error') + ' - ' + (e.message || e), { type: 'error', autoClose: 2500 });
|
||||||
|
@ -67,7 +67,7 @@ const Downloads: FC = observer(() => {
|
|||||||
AddToDownloadList(status.path, status.url);
|
AddToDownloadList(status.path, status.url);
|
||||||
}} />}
|
}} />}
|
||||||
<ToolTipButton desc={t('Open Folder')} icon={<Folder20Regular />} onClick={() => {
|
<ToolTipButton desc={t('Open Folder')} icon={<Folder20Regular />} onClick={() => {
|
||||||
OpenFileFolder(status.path, false);
|
OpenFileFolder(status.path);
|
||||||
}} />
|
}} />
|
||||||
</div>
|
</div>
|
||||||
</Field>
|
</Field>
|
||||||
|
@ -132,7 +132,7 @@ const columns: TableColumnDefinition<ModelSourceItem>[] = [
|
|||||||
{
|
{
|
||||||
item.isComplete &&
|
item.isComplete &&
|
||||||
<ToolTipButton desc={t('Open Folder')} icon={<Folder20Regular />} onClick={() => {
|
<ToolTipButton desc={t('Open Folder')} icon={<Folder20Regular />} onClick={() => {
|
||||||
OpenFileFolder(`${commonStore.settings.customModelsPath}/${item.name}`, true);
|
OpenFileFolder(`${commonStore.settings.customModelsPath}/${item.name}`);
|
||||||
}} />
|
}} />
|
||||||
}
|
}
|
||||||
{item.downloadUrl && !item.isComplete &&
|
{item.downloadUrl && !item.isComplete &&
|
||||||
|
@ -398,7 +398,7 @@ const LoraFinetune: FC = observer(() => {
|
|||||||
'Even for multi-turn conversations, they must be written in a single line using `\\n` to indicate line breaks. ' +
|
'Even for multi-turn conversations, they must be written in a single line using `\\n` to indicate line breaks. ' +
|
||||||
'If they are different dialogues or topics, they should be written in separate lines.')} />
|
'If they are different dialogues or topics, they should be written in separate lines.')} />
|
||||||
<ToolTipButton desc={t('Open Folder')} icon={<Folder20Regular />} onClick={() => {
|
<ToolTipButton desc={t('Open Folder')} icon={<Folder20Regular />} onClick={() => {
|
||||||
OpenFileFolder(dataParams.dataPath, false);
|
OpenFileFolder(dataParams.dataPath);
|
||||||
}} />
|
}} />
|
||||||
</div>
|
</div>
|
||||||
<div className="flex gap-2 items-center">
|
<div className="flex gap-2 items-center">
|
||||||
|
4
frontend/wailsjs/go/backend_golang/App.d.ts
generated
vendored
4
frontend/wailsjs/go/backend_golang/App.d.ts
generated
vendored
@ -28,6 +28,8 @@ export function DownloadFile(arg1:string,arg2:string):Promise<void>;
|
|||||||
|
|
||||||
export function FileExists(arg1:string):Promise<boolean>;
|
export function FileExists(arg1:string):Promise<boolean>;
|
||||||
|
|
||||||
|
export function GetAbsPath(arg1:string):Promise<string>;
|
||||||
|
|
||||||
export function GetPlatform():Promise<string>;
|
export function GetPlatform():Promise<string>;
|
||||||
|
|
||||||
export function GetPyError():Promise<string>;
|
export function GetPyError():Promise<string>;
|
||||||
@ -40,7 +42,7 @@ export function ListDirFiles(arg1:string):Promise<Array<backend_golang.FileInfo>
|
|||||||
|
|
||||||
export function MergeLora(arg1:string,arg2:boolean,arg3:number,arg4:string,arg5:string,arg6:string):Promise<string>;
|
export function MergeLora(arg1:string,arg2:boolean,arg3:number,arg4:string,arg5:string,arg6:string):Promise<string>;
|
||||||
|
|
||||||
export function OpenFileFolder(arg1:string,arg2:boolean):Promise<void>;
|
export function OpenFileFolder(arg1:string):Promise<void>;
|
||||||
|
|
||||||
export function OpenMidiPort(arg1:number):Promise<void>;
|
export function OpenMidiPort(arg1:number):Promise<void>;
|
||||||
|
|
||||||
|
8
frontend/wailsjs/go/backend_golang/App.js
generated
8
frontend/wailsjs/go/backend_golang/App.js
generated
@ -54,6 +54,10 @@ export function FileExists(arg1) {
|
|||||||
return window['go']['backend_golang']['App']['FileExists'](arg1);
|
return window['go']['backend_golang']['App']['FileExists'](arg1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function GetAbsPath(arg1) {
|
||||||
|
return window['go']['backend_golang']['App']['GetAbsPath'](arg1);
|
||||||
|
}
|
||||||
|
|
||||||
export function GetPlatform() {
|
export function GetPlatform() {
|
||||||
return window['go']['backend_golang']['App']['GetPlatform']();
|
return window['go']['backend_golang']['App']['GetPlatform']();
|
||||||
}
|
}
|
||||||
@ -78,8 +82,8 @@ export function MergeLora(arg1, arg2, arg3, arg4, arg5, arg6) {
|
|||||||
return window['go']['backend_golang']['App']['MergeLora'](arg1, arg2, arg3, arg4, arg5, arg6);
|
return window['go']['backend_golang']['App']['MergeLora'](arg1, arg2, arg3, arg4, arg5, arg6);
|
||||||
}
|
}
|
||||||
|
|
||||||
export function OpenFileFolder(arg1, arg2) {
|
export function OpenFileFolder(arg1) {
|
||||||
return window['go']['backend_golang']['App']['OpenFileFolder'](arg1, arg2);
|
return window['go']['backend_golang']['App']['OpenFileFolder'](arg1);
|
||||||
}
|
}
|
||||||
|
|
||||||
export function OpenMidiPort(arg1) {
|
export function OpenMidiPort(arg1) {
|
||||||
|
Loading…
Reference in New Issue
Block a user