some update for llm、util
This commit is contained in:
parent
e690ae764b
commit
5faf209709
1
ai/ai.go
1
ai/ai.go
@ -79,6 +79,7 @@ function main(...args) {
|
|||||||
result, err := rt.RunMain(args...)
|
result, err := rt.RunMain(args...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println(u.BRed(err.Error()))
|
fmt.Println(u.BRed(err.Error()))
|
||||||
|
fmt.Println(u.Red(" " + strings.Join(rt.GetCallStack(), "\n ")))
|
||||||
} else if result != nil {
|
} else if result != nil {
|
||||||
fmt.Println(u.Cyan(u.JsonP(result)))
|
fmt.Println(u.Cyan(u.JsonP(result)))
|
||||||
}
|
}
|
||||||
|
20
goja/func.go
20
goja/func.go
@ -575,7 +575,25 @@ func (f *nativeFuncObject) vmCall(vm *vm, n int) {
|
|||||||
//vm.throw(Exception{
|
//vm.throw(Exception{
|
||||||
// val: ret.toString(),
|
// val: ret.toString(),
|
||||||
//})
|
//})
|
||||||
vm.throw(ret)
|
//stack := make([]StackFrame, 0)
|
||||||
|
//for i := len(vm.callStack) - 1; i >= 0; i-- {
|
||||||
|
// frame := &vm.callStack[i]
|
||||||
|
// if frame.prg != nil || frame.sb > 0 {
|
||||||
|
// var funcName unistring.String
|
||||||
|
// if prg := frame.prg; prg != nil {
|
||||||
|
// funcName = prg.funcName
|
||||||
|
// } else {
|
||||||
|
// funcName = getFuncName(vm.stack, frame.sb)
|
||||||
|
// }
|
||||||
|
// stack = append(stack, StackFrame{prg: vm.callStack[i].prg, pc: frame.pc, funcName: funcName})
|
||||||
|
// //prg := vm.callStack[i].prg
|
||||||
|
// //stack = append(stack, string(funcName)+" "+prg.src.Position(prg.sourceOffset(frame.pc)).String())
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
vm.throw(&Exception{
|
||||||
|
val: ret.ToString(),
|
||||||
|
})
|
||||||
|
return
|
||||||
} else {
|
} else {
|
||||||
vm.stack[vm.sp-n-2] = ret
|
vm.stack[vm.sp-n-2] = ret
|
||||||
vm.popCtx()
|
vm.popCtx()
|
||||||
|
@ -201,6 +201,8 @@ type Runtime struct {
|
|||||||
|
|
||||||
promiseRejectionTracker PromiseRejectionTracker
|
promiseRejectionTracker PromiseRejectionTracker
|
||||||
asyncContextTracker AsyncContextTracker
|
asyncContextTracker AsyncContextTracker
|
||||||
|
|
||||||
|
GoData map[string]any
|
||||||
}
|
}
|
||||||
|
|
||||||
type StackFrame struct {
|
type StackFrame struct {
|
||||||
|
33
js.go
33
js.go
@ -64,6 +64,14 @@ func (rt *Runtime) SetModuleLoader(fn func(filename string) string) {
|
|||||||
rt.moduleLoader = fn
|
rt.moduleLoader = fn
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (rt *Runtime) GetCallStack() []string {
|
||||||
|
callStacks := make([]string, 0)
|
||||||
|
for _, stack := range rt.vm.CaptureCallStack(0, nil) {
|
||||||
|
callStacks = append(callStacks, stack.Position().String())
|
||||||
|
}
|
||||||
|
return callStacks
|
||||||
|
}
|
||||||
|
|
||||||
func (rt *Runtime) requireMod(name string) error {
|
func (rt *Runtime) requireMod(name string) error {
|
||||||
var err error
|
var err error
|
||||||
if name == "console" || name == "" {
|
if name == "console" || name == "" {
|
||||||
@ -130,8 +138,10 @@ func (rt *Runtime) makeImport(matcher *regexp.Regexp, code string) (string, int,
|
|||||||
}
|
}
|
||||||
|
|
||||||
func New() *Runtime {
|
func New() *Runtime {
|
||||||
|
vm := goja.New()
|
||||||
|
vm.GoData = map[string]any{}
|
||||||
return &Runtime{
|
return &Runtime{
|
||||||
vm: goja.New(),
|
vm: vm,
|
||||||
required: map[string]bool{},
|
required: map[string]bool{},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -151,8 +161,10 @@ func (rt *Runtime) StartFromCode(code, refFile string) (any, error) {
|
|||||||
if absFile, err := filepath.Abs(rt.file); err == nil {
|
if absFile, err := filepath.Abs(rt.file); err == nil {
|
||||||
rt.file = absFile
|
rt.file = absFile
|
||||||
}
|
}
|
||||||
|
refPath := filepath.Dir(refFile)
|
||||||
|
rt.vm.GoData["startPath"] = refPath
|
||||||
|
|
||||||
InitFrom(filepath.Dir(refFile))
|
InitFrom(refPath)
|
||||||
|
|
||||||
if rt.srcCode == "" {
|
if rt.srcCode == "" {
|
||||||
rt.srcCode = code
|
rt.srcCode = code
|
||||||
@ -184,17 +196,20 @@ func (rt *Runtime) StartFromCode(code, refFile string) (any, error) {
|
|||||||
|
|
||||||
// 处理模块引用
|
// 处理模块引用
|
||||||
require.NewRegistryWithLoader(func(path string) ([]byte, error) {
|
require.NewRegistryWithLoader(func(path string) ([]byte, error) {
|
||||||
refPath := filepath.Join(filepath.Dir(rt.file), path)
|
modFile := path
|
||||||
if !strings.HasSuffix(refPath, ".js") && !u.FileExists(refPath) {
|
if !filepath.IsAbs(modFile) {
|
||||||
refPath += ".js"
|
modFile = filepath.Join(filepath.Dir(rt.file), modFile)
|
||||||
|
}
|
||||||
|
if !strings.HasSuffix(modFile, ".js") && !u.FileExists(modFile) {
|
||||||
|
modFile += ".js"
|
||||||
}
|
}
|
||||||
modCode := ""
|
modCode := ""
|
||||||
if rt.moduleLoader != nil {
|
if rt.moduleLoader != nil {
|
||||||
modCode = rt.moduleLoader(refPath)
|
modCode = rt.moduleLoader(modFile)
|
||||||
}
|
}
|
||||||
if modCode == "" {
|
if modCode == "" {
|
||||||
var err error
|
var err error
|
||||||
modCode, err = u.ReadFile(refPath)
|
modCode, err = u.ReadFile(modFile)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -208,7 +223,7 @@ func (rt *Runtime) StartFromCode(code, refFile string) (any, error) {
|
|||||||
if !checkMainMatcher.MatchString(rt.code) {
|
if !checkMainMatcher.MatchString(rt.code) {
|
||||||
rt.code = "function main(...args){" + rt.code + "}"
|
rt.code = "function main(...args){" + rt.code + "}"
|
||||||
}
|
}
|
||||||
if r, err := rt.vm.RunScript("main", rt.code); err != nil {
|
if r, err := rt.vm.RunScript(rt.file, rt.code); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
} else {
|
} else {
|
||||||
return r, nil
|
return r, nil
|
||||||
@ -229,7 +244,7 @@ func (rt *Runtime) RunMain(args ...any) (any, error) {
|
|||||||
if err := rt.vm.Set("__args", args); err != nil {
|
if err := rt.vm.Set("__args", args); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
jsResult, err := rt.vm.RunScript(rt.file, "main(...__args)")
|
jsResult, err := rt.vm.RunScript("main", "main(...__args)")
|
||||||
|
|
||||||
var result any
|
var result any
|
||||||
if err == nil {
|
if err == nil {
|
||||||
|
17
js/common.go
17
js/common.go
@ -4,6 +4,7 @@ import (
|
|||||||
"errors"
|
"errors"
|
||||||
"github.com/dop251/goja"
|
"github.com/dop251/goja"
|
||||||
"github.com/ssgo/u"
|
"github.com/ssgo/u"
|
||||||
|
"path/filepath"
|
||||||
)
|
)
|
||||||
|
|
||||||
func toMap(data any) map[string]any {
|
func toMap(data any) map[string]any {
|
||||||
@ -82,3 +83,19 @@ func (args *Args) Map2StrArr(index int) []string {
|
|||||||
}
|
}
|
||||||
return headers
|
return headers
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func findPath(vm *goja.Runtime, filename string) string {
|
||||||
|
if u.FileExists(filename) {
|
||||||
|
return filename
|
||||||
|
}
|
||||||
|
if !filepath.IsAbs(filename) {
|
||||||
|
startPath := u.String(vm.GoData["startPath"])
|
||||||
|
if startPath != "" {
|
||||||
|
tryFilename := filepath.Join(startPath, filename)
|
||||||
|
if u.FileExists(tryFilename) {
|
||||||
|
return tryFilename
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return filename
|
||||||
|
}
|
||||||
|
18
js/file.go
18
js/file.go
@ -2,7 +2,6 @@ package js
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
|
||||||
"github.com/dop251/goja"
|
"github.com/dop251/goja"
|
||||||
"github.com/ssgo/u"
|
"github.com/ssgo/u"
|
||||||
)
|
)
|
||||||
@ -13,18 +12,17 @@ func RequireFile() map[string]any {
|
|||||||
if len(args.Arguments) < 1 {
|
if len(args.Arguments) < 1 {
|
||||||
return vm.NewGoError(errors.New("arguments need 1, but given " + u.String(len(args.Arguments))))
|
return vm.NewGoError(errors.New("arguments need 1, but given " + u.String(len(args.Arguments))))
|
||||||
}
|
}
|
||||||
if r, err := u.ReadFile(u.String(args.Arguments[0].Export())); err == nil {
|
if r, err := u.ReadFile(findPath(vm, u.String(args.Arguments[0].Export()))); err == nil {
|
||||||
return vm.ToValue(r)
|
return vm.ToValue(r)
|
||||||
} else {
|
} else {
|
||||||
fmt.Println(err, "-----")
|
panic(vm.NewGoError(err))
|
||||||
return vm.NewGoError(err)
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"write": func(args goja.FunctionCall, vm *goja.Runtime) goja.Value {
|
"write": func(args goja.FunctionCall, vm *goja.Runtime) goja.Value {
|
||||||
if len(args.Arguments) < 2 {
|
if len(args.Arguments) < 2 {
|
||||||
return vm.NewGoError(errors.New("arguments need 2, but given " + u.String(len(args.Arguments))))
|
return vm.NewGoError(errors.New("arguments need 2, but given " + u.String(len(args.Arguments))))
|
||||||
}
|
}
|
||||||
if err := u.WriteFileBytes(u.String(args.Arguments[0].Export()), u.Bytes(args.Arguments[0].Export())); err == nil {
|
if err := u.WriteFileBytes(findPath(vm, u.String(args.Arguments[0].Export())), u.Bytes(args.Arguments[0].Export())); err == nil {
|
||||||
return nil
|
return nil
|
||||||
} else {
|
} else {
|
||||||
return vm.NewGoError(err)
|
return vm.NewGoError(err)
|
||||||
@ -34,7 +32,7 @@ func RequireFile() map[string]any {
|
|||||||
if len(args.Arguments) < 1 {
|
if len(args.Arguments) < 1 {
|
||||||
return vm.NewGoError(errors.New("arguments need 1, but given " + u.String(len(args.Arguments))))
|
return vm.NewGoError(errors.New("arguments need 1, but given " + u.String(len(args.Arguments))))
|
||||||
}
|
}
|
||||||
if r, err := u.ReadDir(u.String(args.Arguments[0].Export())); err == nil {
|
if r, err := u.ReadDir(findPath(vm, u.String(args.Arguments[0].Export()))); err == nil {
|
||||||
return vm.ToValue(r)
|
return vm.ToValue(r)
|
||||||
} else {
|
} else {
|
||||||
return vm.NewGoError(err)
|
return vm.NewGoError(err)
|
||||||
@ -44,7 +42,13 @@ func RequireFile() map[string]any {
|
|||||||
if len(args.Arguments) < 1 {
|
if len(args.Arguments) < 1 {
|
||||||
return vm.NewGoError(errors.New("arguments need 1, but given " + u.String(len(args.Arguments))))
|
return vm.NewGoError(errors.New("arguments need 1, but given " + u.String(len(args.Arguments))))
|
||||||
}
|
}
|
||||||
return vm.ToValue(u.GetFileInfo(u.String(args.Arguments[0].Export())))
|
return vm.ToValue(u.GetFileInfo(findPath(vm, u.String(args.Arguments[0].Export()))))
|
||||||
|
},
|
||||||
|
"find": func(args goja.FunctionCall, vm *goja.Runtime) goja.Value {
|
||||||
|
if len(args.Arguments) < 1 {
|
||||||
|
return vm.NewGoError(errors.New("arguments need 1, but given " + u.String(len(args.Arguments))))
|
||||||
|
}
|
||||||
|
return vm.ToValue(findPath(vm, u.String(args.Arguments[0].Export())))
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
16
js/http.go
16
js/http.go
@ -123,26 +123,34 @@ func (hc *Http) Do(argsIn goja.FunctionCall, vm *goja.Runtime) goja.Value {
|
|||||||
|
|
||||||
func (hc *Http) Upload(argsIn goja.FunctionCall, vm *goja.Runtime) goja.Value {
|
func (hc *Http) Upload(argsIn goja.FunctionCall, vm *goja.Runtime) goja.Value {
|
||||||
args := MakeArgs(&argsIn, vm)
|
args := MakeArgs(&argsIn, vm)
|
||||||
if err := args.Check(3); err != nil {
|
if err := args.Check(2); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
postData := map[string]string{}
|
postData := map[string]string{}
|
||||||
postFiles := map[string]any{}
|
postFiles := map[string]any{}
|
||||||
u.Convert(args.Any(1), &postData)
|
u.Convert(args.Any(1), &postData)
|
||||||
|
if len(argsIn.Arguments) > 2 {
|
||||||
u.Convert(args.Any(2), &postFiles)
|
u.Convert(args.Any(2), &postFiles)
|
||||||
|
}
|
||||||
r, _ := hc.client.MPost(args.Str(0), postData, postFiles, args.Map2StrArr(3)...)
|
r, _ := hc.client.MPost(args.Str(0), postData, postFiles, args.Map2StrArr(3)...)
|
||||||
return makeResult(r, vm)
|
return makeResult(r, vm)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (hc *Http) Download(argsIn goja.FunctionCall, vm *goja.Runtime) goja.Value {
|
func (hc *Http) Download(argsIn goja.FunctionCall, vm *goja.Runtime) goja.Value {
|
||||||
args := MakeArgs(&argsIn, vm)
|
args := MakeArgs(&argsIn, vm)
|
||||||
if err := args.Check(3); err != nil {
|
if err := args.Check(2); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
var r *httpclient.Result
|
var r *httpclient.Result
|
||||||
if cb, ok := goja.AssertFunction(argsIn.Arguments[3]); ok {
|
var callback goja.Callable
|
||||||
|
if len(argsIn.Arguments) > 2 {
|
||||||
|
if cb, ok := goja.AssertFunction(argsIn.Arguments[2]); ok {
|
||||||
|
callback = cb
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if callback != nil {
|
||||||
r, _ = hc.client.Download(args.Str(0), args.Str(1), func(start, end int64, ok bool, finished, total int64) {
|
r, _ = hc.client.Download(args.Str(0), args.Str(1), func(start, end int64, ok bool, finished, total int64) {
|
||||||
_, _ = cb(argsIn.This, vm.ToValue(finished), vm.ToValue(total))
|
_, _ = callback(argsIn.This, vm.ToValue(finished), vm.ToValue(total))
|
||||||
}, args.Map2StrArr(3)...)
|
}, args.Map2StrArr(3)...)
|
||||||
} else {
|
} else {
|
||||||
r, _ = hc.client.Download(args.Str(0), args.Str(1), nil, args.Map2StrArr(3)...)
|
r, _ = hc.client.Download(args.Str(0), args.Str(1), nil, args.Map2StrArr(3)...)
|
||||||
|
@ -11,6 +11,7 @@ function read(filename: string): string {return ''}
|
|||||||
function write(filename: string, data: any): void {}
|
function write(filename: string, data: any): void {}
|
||||||
function dir(filename: string): Array<FileInfo> {return null}
|
function dir(filename: string): Array<FileInfo> {return null}
|
||||||
function stat(filename: string): FileInfo {return null}
|
function stat(filename: string): FileInfo {return null}
|
||||||
|
function find(filename: string): string {return ''}
|
||||||
|
|
||||||
interface FileInfo {
|
interface FileInfo {
|
||||||
Name: string
|
Name: string
|
||||||
|
@ -49,5 +49,5 @@ function md5(data:any): string {return ''}
|
|||||||
function sha1(data:any): string {return ''}
|
function sha1(data:any): string {return ''}
|
||||||
function sha256(data:any): string {return ''}
|
function sha256(data:any): string {return ''}
|
||||||
function sha512(data:any): string {return ''}
|
function sha512(data:any): string {return ''}
|
||||||
function tpl(text:string, data:any): string {return ''}
|
function tpl(text:string, data:any, functions?:Object): string {return ''}
|
||||||
function shell(cmd:string, ...args:string[]): string[] {return []}
|
function shell(cmd:string, ...args:string[]): string[] {return []}
|
||||||
|
220
js/util.go
220
js/util.go
@ -4,7 +4,6 @@ import (
|
|||||||
"bytes"
|
"bytes"
|
||||||
"encoding/hex"
|
"encoding/hex"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"errors"
|
|
||||||
"github.com/dop251/goja"
|
"github.com/dop251/goja"
|
||||||
"github.com/ssgo/u"
|
"github.com/ssgo/u"
|
||||||
"gopkg.in/yaml.v3"
|
"gopkg.in/yaml.v3"
|
||||||
@ -13,20 +12,24 @@ import (
|
|||||||
|
|
||||||
func RequireUtil() map[string]any {
|
func RequireUtil() map[string]any {
|
||||||
return map[string]any{
|
return map[string]any{
|
||||||
"json": func(args goja.FunctionCall, vm *goja.Runtime) goja.Value {
|
"json": func(argsIn goja.FunctionCall, vm *goja.Runtime) goja.Value {
|
||||||
if len(args.Arguments) < 1 {
|
args := MakeArgs(&argsIn, vm)
|
||||||
return vm.NewGoError(errors.New("arguments need 1, but given " + u.String(len(args.Arguments))))
|
if err := args.Check(1); err != nil {
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if r, err := json.Marshal(args.Arguments[0].Export()); err == nil {
|
if r, err := json.Marshal(args.Arguments[0].Export()); err == nil {
|
||||||
return vm.ToValue(string(r))
|
return vm.ToValue(string(r))
|
||||||
} else {
|
} else {
|
||||||
return vm.NewGoError(err)
|
return vm.NewGoError(err)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"jsonP": func(args goja.FunctionCall, vm *goja.Runtime) goja.Value {
|
"jsonP": func(argsIn goja.FunctionCall, vm *goja.Runtime) goja.Value {
|
||||||
if len(args.Arguments) < 1 {
|
args := MakeArgs(&argsIn, vm)
|
||||||
return vm.NewGoError(errors.New("arguments need 1, but given " + u.String(len(args.Arguments))))
|
if err := args.Check(1); err != nil {
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if r, err := json.Marshal(args.Arguments[0].Export()); err == nil {
|
if r, err := json.Marshal(args.Arguments[0].Export()); err == nil {
|
||||||
r1 := bytes.Buffer{}
|
r1 := bytes.Buffer{}
|
||||||
if err2 := json.Indent(&r1, r, "", " "); err2 == nil {
|
if err2 := json.Indent(&r1, r, "", " "); err2 == nil {
|
||||||
@ -38,10 +41,12 @@ func RequireUtil() map[string]any {
|
|||||||
return vm.NewGoError(err)
|
return vm.NewGoError(err)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"unJson": func(args goja.FunctionCall, vm *goja.Runtime) goja.Value {
|
"unJson": func(argsIn goja.FunctionCall, vm *goja.Runtime) goja.Value {
|
||||||
if len(args.Arguments) < 1 {
|
args := MakeArgs(&argsIn, vm)
|
||||||
return vm.NewGoError(errors.New("arguments need 1, but given " + u.String(len(args.Arguments))))
|
if err := args.Check(1); err != nil {
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
var r any
|
var r any
|
||||||
if err := json.Unmarshal(u.Bytes(args.Arguments[0].Export()), &r); err == nil {
|
if err := json.Unmarshal(u.Bytes(args.Arguments[0].Export()), &r); err == nil {
|
||||||
return vm.ToValue(r)
|
return vm.ToValue(r)
|
||||||
@ -49,20 +54,24 @@ func RequireUtil() map[string]any {
|
|||||||
return vm.NewGoError(err)
|
return vm.NewGoError(err)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"yaml": func(args goja.FunctionCall, vm *goja.Runtime) goja.Value {
|
"yaml": func(argsIn goja.FunctionCall, vm *goja.Runtime) goja.Value {
|
||||||
if len(args.Arguments) < 1 {
|
args := MakeArgs(&argsIn, vm)
|
||||||
return vm.NewGoError(errors.New("arguments need 1, but given " + u.String(len(args.Arguments))))
|
if err := args.Check(1); err != nil {
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if r, err := yaml.Marshal(args.Arguments[0].Export()); err == nil {
|
if r, err := yaml.Marshal(args.Arguments[0].Export()); err == nil {
|
||||||
return vm.ToValue(string(r))
|
return vm.ToValue(string(r))
|
||||||
} else {
|
} else {
|
||||||
return vm.NewGoError(err)
|
return vm.NewGoError(err)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"unYaml": func(args goja.FunctionCall, vm *goja.Runtime) goja.Value {
|
"unYaml": func(argsIn goja.FunctionCall, vm *goja.Runtime) goja.Value {
|
||||||
if len(args.Arguments) < 1 {
|
args := MakeArgs(&argsIn, vm)
|
||||||
return vm.NewGoError(errors.New("arguments need 1, but given " + u.String(len(args.Arguments))))
|
if err := args.Check(1); err != nil {
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
var r any
|
var r any
|
||||||
if err := yaml.Unmarshal(u.Bytes(args.Arguments[0].Export()), &r); err == nil {
|
if err := yaml.Unmarshal(u.Bytes(args.Arguments[0].Export()), &r); err == nil {
|
||||||
return vm.ToValue(r)
|
return vm.ToValue(r)
|
||||||
@ -70,131 +79,180 @@ func RequireUtil() map[string]any {
|
|||||||
return vm.NewGoError(err)
|
return vm.NewGoError(err)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"base64": func(args goja.FunctionCall, vm *goja.Runtime) goja.Value {
|
"base64": func(argsIn goja.FunctionCall, vm *goja.Runtime) goja.Value {
|
||||||
if len(args.Arguments) < 1 {
|
args := MakeArgs(&argsIn, vm)
|
||||||
return vm.NewGoError(errors.New("arguments need 1, but given " + u.String(len(args.Arguments))))
|
if err := args.Check(1); err != nil {
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
return vm.ToValue(u.Base64(u.Bytes(args.Arguments[0].Export())))
|
return vm.ToValue(u.Base64(u.Bytes(args.Arguments[0].Export())))
|
||||||
},
|
},
|
||||||
"unBase64": func(args goja.FunctionCall, vm *goja.Runtime) goja.Value {
|
"unBase64": func(argsIn goja.FunctionCall, vm *goja.Runtime) goja.Value {
|
||||||
if len(args.Arguments) < 1 {
|
args := MakeArgs(&argsIn, vm)
|
||||||
return vm.NewGoError(errors.New("arguments need 1, but given " + u.String(len(args.Arguments))))
|
if err := args.Check(1); err != nil {
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
return vm.ToValue(u.UnBase64String(u.String(args.Arguments[0].Export())))
|
|
||||||
|
return vm.ToValue(u.UnBase64String(args.Str(0)))
|
||||||
},
|
},
|
||||||
"urlBase64": func(args goja.FunctionCall, vm *goja.Runtime) goja.Value {
|
"urlBase64": func(argsIn goja.FunctionCall, vm *goja.Runtime) goja.Value {
|
||||||
if len(args.Arguments) < 1 {
|
args := MakeArgs(&argsIn, vm)
|
||||||
return vm.NewGoError(errors.New("arguments need 1, but given " + u.String(len(args.Arguments))))
|
if err := args.Check(1); err != nil {
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
return vm.ToValue(u.UrlBase64String(u.String(args.Arguments[0].Export())))
|
|
||||||
|
return vm.ToValue(u.UrlBase64String(args.Str(0)))
|
||||||
},
|
},
|
||||||
"unUrlBase64": func(args goja.FunctionCall, vm *goja.Runtime) goja.Value {
|
"unUrlBase64": func(argsIn goja.FunctionCall, vm *goja.Runtime) goja.Value {
|
||||||
if len(args.Arguments) < 1 {
|
args := MakeArgs(&argsIn, vm)
|
||||||
return vm.NewGoError(errors.New("arguments need 1, but given " + u.String(len(args.Arguments))))
|
if err := args.Check(1); err != nil {
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
return vm.ToValue(u.UnUrlBase64String(u.String(args.Arguments[0].Export())))
|
|
||||||
|
return vm.ToValue(u.UnUrlBase64String(args.Str(0)))
|
||||||
},
|
},
|
||||||
"hex": func(args goja.FunctionCall, vm *goja.Runtime) goja.Value {
|
"hex": func(argsIn goja.FunctionCall, vm *goja.Runtime) goja.Value {
|
||||||
if len(args.Arguments) < 1 {
|
args := MakeArgs(&argsIn, vm)
|
||||||
return vm.NewGoError(errors.New("arguments need 1, but given " + u.String(len(args.Arguments))))
|
if err := args.Check(1); err != nil {
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
return vm.ToValue(hex.EncodeToString(u.Bytes(args.Arguments[0].Export())))
|
return vm.ToValue(hex.EncodeToString(u.Bytes(args.Arguments[0].Export())))
|
||||||
},
|
},
|
||||||
"unHex": func(args goja.FunctionCall, vm *goja.Runtime) goja.Value {
|
"unHex": func(argsIn goja.FunctionCall, vm *goja.Runtime) goja.Value {
|
||||||
if len(args.Arguments) < 1 {
|
args := MakeArgs(&argsIn, vm)
|
||||||
return vm.NewGoError(errors.New("arguments need 1, but given " + u.String(len(args.Arguments))))
|
if err := args.Check(1); err != nil {
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
if r, err := hex.DecodeString(u.String(args.Arguments[0].Export())); err == nil {
|
|
||||||
|
if r, err := hex.DecodeString(args.Str(0)); err == nil {
|
||||||
return vm.ToValue(string(r))
|
return vm.ToValue(string(r))
|
||||||
} else {
|
} else {
|
||||||
return vm.NewGoError(err)
|
return vm.NewGoError(err)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"aes": func(args goja.FunctionCall, vm *goja.Runtime) goja.Value {
|
"aes": func(argsIn goja.FunctionCall, vm *goja.Runtime) goja.Value {
|
||||||
if len(args.Arguments) < 3 {
|
args := MakeArgs(&argsIn, vm)
|
||||||
return vm.NewGoError(errors.New("arguments need 3, but given " + u.String(len(args.Arguments))))
|
if err := args.Check(3); err != nil {
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if r, err := u.EncryptAesBytes(u.Bytes(args.Arguments[0].Export()), u.Bytes(args.Arguments[1].Export()), u.Bytes(args.Arguments[2].Export())); err == nil {
|
if r, err := u.EncryptAesBytes(u.Bytes(args.Arguments[0].Export()), u.Bytes(args.Arguments[1].Export()), u.Bytes(args.Arguments[2].Export())); err == nil {
|
||||||
return vm.ToValue(string(r))
|
return vm.ToValue(string(r))
|
||||||
} else {
|
} else {
|
||||||
return vm.NewGoError(err)
|
return vm.NewGoError(err)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"unAes": func(args goja.FunctionCall, vm *goja.Runtime) goja.Value {
|
"unAes": func(argsIn goja.FunctionCall, vm *goja.Runtime) goja.Value {
|
||||||
if len(args.Arguments) < 3 {
|
args := MakeArgs(&argsIn, vm)
|
||||||
return vm.NewGoError(errors.New("arguments need 3, but given " + u.String(len(args.Arguments))))
|
if err := args.Check(3); err != nil {
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if r, err := u.DecryptAesBytes(u.Bytes(args.Arguments[0].Export()), u.Bytes(args.Arguments[1].Export()), u.Bytes(args.Arguments[2].Export())); err == nil {
|
if r, err := u.DecryptAesBytes(u.Bytes(args.Arguments[0].Export()), u.Bytes(args.Arguments[1].Export()), u.Bytes(args.Arguments[2].Export())); err == nil {
|
||||||
return vm.ToValue(string(r))
|
return vm.ToValue(string(r))
|
||||||
} else {
|
} else {
|
||||||
return vm.NewGoError(err)
|
return vm.NewGoError(err)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"gzip": func(args goja.FunctionCall, vm *goja.Runtime) goja.Value {
|
"gzip": func(argsIn goja.FunctionCall, vm *goja.Runtime) goja.Value {
|
||||||
if len(args.Arguments) < 1 {
|
args := MakeArgs(&argsIn, vm)
|
||||||
return vm.NewGoError(errors.New("arguments need 1, but given " + u.String(len(args.Arguments))))
|
if err := args.Check(1); err != nil {
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if r, err := u.Gzip(u.Bytes(args.Arguments[0].Export())); err == nil {
|
if r, err := u.Gzip(u.Bytes(args.Arguments[0].Export())); err == nil {
|
||||||
return vm.ToValue(string(r))
|
return vm.ToValue(string(r))
|
||||||
} else {
|
} else {
|
||||||
return vm.NewGoError(err)
|
return vm.NewGoError(err)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"gunzip": func(args goja.FunctionCall, vm *goja.Runtime) goja.Value {
|
"gunzip": func(argsIn goja.FunctionCall, vm *goja.Runtime) goja.Value {
|
||||||
if len(args.Arguments) < 1 {
|
args := MakeArgs(&argsIn, vm)
|
||||||
return vm.NewGoError(errors.New("arguments need 1, but given " + u.String(len(args.Arguments))))
|
if err := args.Check(1); err != nil {
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if r, err := u.Gunzip(u.Bytes(args.Arguments[0].Export())); err == nil {
|
if r, err := u.Gunzip(u.Bytes(args.Arguments[0].Export())); err == nil {
|
||||||
return vm.ToValue(string(r))
|
return vm.ToValue(string(r))
|
||||||
} else {
|
} else {
|
||||||
return vm.NewGoError(err)
|
return vm.NewGoError(err)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"id": func(args goja.FunctionCall, vm *goja.Runtime) goja.Value {
|
"id": func(argsIn goja.FunctionCall, vm *goja.Runtime) goja.Value {
|
||||||
return vm.ToValue(u.Id12())
|
return vm.ToValue(u.Id12())
|
||||||
},
|
},
|
||||||
"uniqueId": func(args goja.FunctionCall, vm *goja.Runtime) goja.Value {
|
"uniqueId": func(argsIn goja.FunctionCall, vm *goja.Runtime) goja.Value {
|
||||||
return vm.ToValue(u.UniqueId())
|
return vm.ToValue(u.UniqueId())
|
||||||
},
|
},
|
||||||
"token": func(args goja.FunctionCall, vm *goja.Runtime) goja.Value {
|
"token": func(argsIn goja.FunctionCall, vm *goja.Runtime) goja.Value {
|
||||||
size := 20
|
size := 20
|
||||||
if len(args.Arguments) > 0 {
|
if len(argsIn.Arguments) > 0 {
|
||||||
size = u.Int(args.Arguments[0].Export())
|
size = u.Int(argsIn.Arguments[0].Export())
|
||||||
}
|
}
|
||||||
return vm.ToValue(u.MakeToken(size))
|
return vm.ToValue(u.MakeToken(size))
|
||||||
},
|
},
|
||||||
"md5": func(args goja.FunctionCall, vm *goja.Runtime) goja.Value {
|
"md5": func(argsIn goja.FunctionCall, vm *goja.Runtime) goja.Value {
|
||||||
if len(args.Arguments) < 1 {
|
args := MakeArgs(&argsIn, vm)
|
||||||
return vm.NewGoError(errors.New("arguments need 1, but given " + u.String(len(args.Arguments))))
|
if err := args.Check(1); err != nil {
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
return vm.ToValue(u.MD5(u.Bytes(args.Arguments[0].Export())))
|
return vm.ToValue(u.MD5(u.Bytes(args.Arguments[0].Export())))
|
||||||
},
|
},
|
||||||
"sha1": func(args goja.FunctionCall, vm *goja.Runtime) goja.Value {
|
"sha1": func(argsIn goja.FunctionCall, vm *goja.Runtime) goja.Value {
|
||||||
if len(args.Arguments) < 1 {
|
args := MakeArgs(&argsIn, vm)
|
||||||
return vm.NewGoError(errors.New("arguments need 1, but given " + u.String(len(args.Arguments))))
|
if err := args.Check(1); err != nil {
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
return vm.ToValue(u.Sha1(u.Bytes(args.Arguments[0].Export())))
|
return vm.ToValue(u.Sha1(u.Bytes(args.Arguments[0].Export())))
|
||||||
},
|
},
|
||||||
"sha256": func(args goja.FunctionCall, vm *goja.Runtime) goja.Value {
|
"sha256": func(argsIn goja.FunctionCall, vm *goja.Runtime) goja.Value {
|
||||||
if len(args.Arguments) < 1 {
|
args := MakeArgs(&argsIn, vm)
|
||||||
return vm.NewGoError(errors.New("arguments need 1, but given " + u.String(len(args.Arguments))))
|
if err := args.Check(1); err != nil {
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
return vm.ToValue(u.Sha256(u.Bytes(args.Arguments[0].Export())))
|
return vm.ToValue(u.Sha256(u.Bytes(args.Arguments[0].Export())))
|
||||||
},
|
},
|
||||||
"sha512": func(args goja.FunctionCall, vm *goja.Runtime) goja.Value {
|
"sha512": func(argsIn goja.FunctionCall, vm *goja.Runtime) goja.Value {
|
||||||
if len(args.Arguments) < 1 {
|
args := MakeArgs(&argsIn, vm)
|
||||||
return vm.NewGoError(errors.New("arguments need 1, but given " + u.String(len(args.Arguments))))
|
if err := args.Check(1); err != nil {
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
return vm.ToValue(u.Sha512(u.Bytes(args.Arguments[0].Export())))
|
return vm.ToValue(u.Sha512(u.Bytes(args.Arguments[0].Export())))
|
||||||
},
|
},
|
||||||
"tpl": func(args goja.FunctionCall, vm *goja.Runtime) goja.Value {
|
"tpl": func(argsIn goja.FunctionCall, vm *goja.Runtime) goja.Value {
|
||||||
if len(args.Arguments) < 2 {
|
args := MakeArgs(&argsIn, vm)
|
||||||
return vm.NewGoError(errors.New("arguments need 2, but given " + u.String(len(args.Arguments))))
|
if err := args.Check(2); err != nil {
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
var tpl *template.Template
|
|
||||||
|
var functions = map[string]any{}
|
||||||
|
if len(argsIn.Arguments) > 2 {
|
||||||
|
obj := argsIn.Arguments[2].ToObject(vm)
|
||||||
|
for _, k := range obj.Keys() {
|
||||||
|
v := obj.Get(k)
|
||||||
|
if cb, ok := goja.AssertFunction(v); ok {
|
||||||
|
functions[k] = func(in string) string {
|
||||||
|
if r, err := cb(argsIn.This, vm.ToValue(in)); err == nil {
|
||||||
|
return r.String()
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
buf := bytes.NewBuffer(make([]byte, 0))
|
buf := bytes.NewBuffer(make([]byte, 0))
|
||||||
var err error
|
var err error
|
||||||
if tpl, err = template.New("tpl").Parse(u.String(args.Arguments[0].Export())); err == nil {
|
tpl := template.New("tpl")
|
||||||
|
if len(functions) > 0 {
|
||||||
|
tpl.Funcs(functions)
|
||||||
|
}
|
||||||
|
if tpl, err = tpl.Parse(args.Str(0)); err == nil {
|
||||||
err = tpl.Execute(buf, args.Arguments[1].Export())
|
err = tpl.Execute(buf, args.Arguments[1].Export())
|
||||||
}
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -202,16 +260,18 @@ func RequireUtil() map[string]any {
|
|||||||
}
|
}
|
||||||
return vm.ToValue(buf.String())
|
return vm.ToValue(buf.String())
|
||||||
},
|
},
|
||||||
"shell": func(args goja.FunctionCall, vm *goja.Runtime) goja.Value {
|
"shell": func(argsIn goja.FunctionCall, vm *goja.Runtime) goja.Value {
|
||||||
if len(args.Arguments) < 1 {
|
args := MakeArgs(&argsIn, vm)
|
||||||
return vm.NewGoError(errors.New("arguments need 1 or more, but given " + u.String(len(args.Arguments))))
|
if err := args.Check(1); err != nil {
|
||||||
}
|
return err
|
||||||
a := make([]string, len(args.Arguments)-1)
|
|
||||||
for i := 1; i < len(args.Arguments); i++ {
|
|
||||||
a[i-1] = u.String(args.Arguments[i].Export())
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if r, err := u.RunCommand(u.String(args.Arguments[0].Export()), a...); err == nil {
|
a := make([]string, len(args.Arguments)-1)
|
||||||
|
for i := 1; i < len(args.Arguments); i++ {
|
||||||
|
a[i-1] = args.Str(i)
|
||||||
|
}
|
||||||
|
|
||||||
|
if r, err := u.RunCommand(args.Str(0), a...); err == nil {
|
||||||
return vm.ToValue(r)
|
return vm.ToValue(r)
|
||||||
} else {
|
} else {
|
||||||
return vm.NewGoError(err)
|
return vm.NewGoError(err)
|
||||||
|
@ -30,6 +30,7 @@ type Config struct {
|
|||||||
ApiKey string
|
ApiKey string
|
||||||
ChatConfig ChatConfig
|
ChatConfig ChatConfig
|
||||||
GCConfig GCConfig
|
GCConfig GCConfig
|
||||||
|
Debug bool
|
||||||
}
|
}
|
||||||
|
|
||||||
type LLM interface {
|
type LLM interface {
|
||||||
|
@ -86,11 +86,18 @@ func (lm *LLM) Ask(messages []llm.ChatMessage, config llm.ChatConfig, callback f
|
|||||||
contents[j] = part
|
contents[j] = part
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if len(contents) == 1 && contents[0].Type == llm.TypeText {
|
||||||
|
agentMessages[i] = openai.ChatCompletionMessage{
|
||||||
|
Role: RoleMap[msg.Role],
|
||||||
|
Content: contents[0].Text,
|
||||||
|
}
|
||||||
|
} else {
|
||||||
agentMessages[i] = openai.ChatCompletionMessage{
|
agentMessages[i] = openai.ChatCompletionMessage{
|
||||||
Role: RoleMap[msg.Role],
|
Role: RoleMap[msg.Role],
|
||||||
MultiContent: contents,
|
MultiContent: contents,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
opt := openai.ChatCompletionRequest{
|
opt := openai.ChatCompletionRequest{
|
||||||
Model: config.GetModel(),
|
Model: config.GetModel(),
|
||||||
|
@ -83,11 +83,18 @@ func (lm *LLM) Ask(messages []llm.ChatMessage, config llm.ChatConfig, callback f
|
|||||||
contents[j] = part
|
contents[j] = part
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if len(contents) == 1 && contents[0].Type == llm.TypeText {
|
||||||
|
cc.AddMessage(zhipu.ChatCompletionMessage{
|
||||||
|
Role: NameMap[msg.Role],
|
||||||
|
Content: contents[0].Text,
|
||||||
|
})
|
||||||
|
} else {
|
||||||
cc.AddMessage(zhipu.ChatCompletionMultiMessage{
|
cc.AddMessage(zhipu.ChatCompletionMultiMessage{
|
||||||
Role: NameMap[msg.Role],
|
Role: NameMap[msg.Role],
|
||||||
Content: contents,
|
Content: contents,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for name := range config.GetTools() {
|
for name := range config.GetTools() {
|
||||||
switch name {
|
switch name {
|
||||||
|
Loading…
Reference in New Issue
Block a user