Merge branch 'YaoApp:main' into main

This commit is contained in:
yflau 2024-06-13 20:02:35 +08:00 committed by GitHub
commit 7675d72797
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
14 changed files with 110 additions and 72 deletions

View file

@ -81,13 +81,9 @@ Yao has a built-in data management system. By writing **JSON** to describe the i
## Install
Run the script under terminal: (MacOS/Linux)
Latest Version download and installation:
```bash
curl -fsSL https://website.yaoapps.com/install.sh | bash
```
For Windows users, please refer to the Installation and Debugging chapter: [Installation and debugging](https://yaoapps.com/en-US/doc/Introduction/Install)
https://github.com/YaoApp/xgen-dev-app/blob/main/README.md
## Getting Started
@ -109,23 +105,6 @@ yao start # Start installation
- Password: **A123456p+**
### Download a project
Create a new project directory, enter the project directory, run the `yao get` command, and download the application code.
```bash
mkdir -p /data/app # create project directory
cd /data/app # Enter the project directory
yao get yaoapp/demo-plm # download demo-plm
yao start # Start installation
```
**Default Account**
- User: **xiang@iqka.com**
- Password: **A123456p+**
## About Yao
Yao's name is derived from the Chinese character **爻 (yáo)**, the basic symbol that makes up the Eight Trigrams. The Eight Trigrams is a symbol system created by the ancient god Fuxi after observing and summarizing the laws of nature, which can refer to everything. Yao has two states of yin and yang, like 0 and 1. The transformation of yin and yang of Yao drives the replacement of Eight Trigrams, so as to summarize and record the development law of things.

View file

@ -50,13 +50,9 @@ Yao 内置了一套数据管理系统,通过编写 **JSON** 描述界面布局
## 安装
在终端下运行脚本: ( MacOS / Linux )
Yao v0.10.4 使用说明
```bash
curl -fsSL https://website.yaoapps.com/install.sh | bash
```
Windows 用户请参考安装调试章节: [安装调试](https://yaoapps.com/doc/%E4%BB%8B%E7%BB%8D/%E5%AE%89%E8%A3%85%E8%B0%83%E8%AF%95)
https://github.com/YaoApp/xgen-dev-app/blob/main/README.zh-CN.md
## 入门指南
@ -82,23 +78,6 @@ yao start # 启动安装界面
![安装界面](docs/yao-setup-step2.jpg)
#### 下载已上架应用
新建一个项目目录,进入项目目录,运行 `yao get` 命令, 下载应用代码。
```bash
mkdir -p /data/app # 创建应用目录
cd /data/app # 进入应用目录
yao get yaoapp/demo-plm # 下载 demo-plm
yao start # 启动安装界面
```
**默认账号**
- 用户名: **xiang@iqka.com**
- 密码: **A123456p+**
## 关于 Yao
Yao 的名字源于汉字**爻(yáo)**,是构成八卦的基本符号。八卦,是上古大神伏羲观测总结自然规律后,创造的一个可以指代万事万物的符号体系。爻,有阴阳两种状态,就像 0 和 1。爻的阴阳转换驱动八卦更替以此来总结记录事物的发展规律。

View file

@ -65,4 +65,8 @@ type Runtime struct {
HeapSizeRelease uint64 `json:"heapSizeRelease,omitempty" env:"YAO_RUNTIME_HEAP_RELEASE" envDefault:"52428800"` // the isolate will be re-created when reaching this value, and the default value is 52428800 (50M)
HeapAvailableSize uint64 `json:"heapAvailableSize,omitempty" env:"YAO_RUNTIME_HEAP_AVAILABLE" envDefault:"524288000"` // the isolate will be re-created when the available size is smaller than this value, and the default value is 524288000 (500M)
Precompile bool `json:"precompile,omitempty" env:"YAO_RUNTIME_PRECOMPILE" envDefault:"false"` // if true compile scripts when the VM is created. this will increase the load time, but the script will run faster. the default value is false
// The following options are experimental features and not stable.
// They may be removed once the features become stable. Please do not use them in a production environment.
Import bool `json:"import,omitempty" env:"YAO_RUNTIME_IMPORT" envDefault:"false"` // If true, TypeScript import will be enabled. Default value is false.
}

View file

@ -130,6 +130,29 @@ func (neo *DSL) API(router *gin.Engine, path string) error {
}
switch cmd {
case "ModelList":
c.JSON(200, gin.H{"data": neo.Models, "code": 200})
c.Done()
case "SelectModel":
model, ok := payload["model"].(string)
if !ok {
c.JSON(400, gin.H{"message": "model is required", "code": 400})
c.Done()
return
}
err := neo.Select(model)
if err != nil {
c.JSON(500, gin.H{"message": err.Error(), "code": 500})
c.Done()
return
}
c.JSON(200, gin.H{"message": "success", "code": 200})
c.Done()
case "ExitCommandMode":
err := command.Exit(sid)
if err != nil {
@ -524,11 +547,17 @@ func (neo *DSL) getGuardHandlers() ([]gin.HandlerFunc, error) {
// NewAI create a new AI
func (neo *DSL) newAI() error {
if neo.Connector == "" {
ai, err := openai.NewMoapi("gpt-3.5-turbo")
if neo.Connector == "" || strings.HasPrefix(neo.Connector, "moapi") {
model := "gpt-3.5-turbo"
if neo.Connector != "" {
model = strings.TrimPrefix(neo.Connector, "moapi:")
}
ai, err := openai.NewMoapi(model)
if err != nil {
return err
}
neo.AI = ai
return nil
}
@ -550,6 +579,16 @@ func (neo *DSL) newAI() error {
return fmt.Errorf("%s connector %s not support, should be a openai", neo.ID, neo.Connector)
}
// Select select the model
func (neo *DSL) Select(model string) error {
ai, err := openai.NewMoapi(model)
if err != nil {
return err
}
neo.AI = ai
return nil
}
// newConversation create a new conversation
func (neo *DSL) newConversation() error {

View file

@ -22,6 +22,7 @@ type DSL struct {
Prompts []aigc.Prompt `json:"prompts,omitempty"`
Allows []string `json:"allows,omitempty"`
Command Command `json:"command,omitempty"`
Models []string `json:"models,omitempty"`
AI aigc.AI `json:"-" yaml:"-"`
Conversation conversation.Conversation `json:"-" yaml:"-"`
GuardHandlers []gin.HandlerFunc `json:"-" yaml:"-"`

View file

@ -19,6 +19,7 @@ func Start(cfg config.Config) error {
Mode: cfg.Runtime.Mode,
DefaultTimeout: cfg.Runtime.DefaultTimeout,
ContextTimeout: cfg.Runtime.ContextTimeout,
Import: cfg.Runtime.Import,
}
err := v8.Start(option)

View file

@ -11,6 +11,7 @@ import (
// Load 加载共享库
func Load(cfg config.Config) error {
v8.CLearModules()
exts := []string{"*.js", "*.ts"}
err := application.App.Walk("scripts", func(root, file string, isdir bool) error {
if isdir {

View file

@ -13,7 +13,7 @@ import (
)
var slotRe = regexp.MustCompile(`\[\{([^\}]+)\}\]`)
var cssRe = regexp.MustCompile(`([\.a-z0-9A-Z# ]+)\{`)
var cssRe = regexp.MustCompile(`([\.a-z0-9A-Z-:# ]+)\{`)
// Build is the struct for the public
func (page *Page) Build(option *BuildOption) (*goquery.Document, []string, error) {
@ -72,11 +72,13 @@ func (page *Page) BuildForImport(option *BuildOption, slots map[string]interface
for k, v := range slots {
slotvars[k] = v
}
data["$slot"] = slotvars
data["$slot"] = slotvars // Will be deprecated use $slots instead
data["$slots"] = slotvars
}
if attrs != nil {
data["$prop"] = attrs
data["$prop"] = attrs // Will be deprecated use $props instead
data["$props"] = attrs
page.Attrs = attrs
}
@ -195,7 +197,10 @@ func (page *Page) parse(doc *goquery.Document, option *BuildOption, warnings []s
}
val := attr.Val
if page.Attrs != nil {
parentProps := Data{"$prop": page.Attrs}
parentProps := Data{
"$prop": page.Attrs, // Will be deprecated use $props instead
"$props": page.Attrs,
}
val, _ = parentProps.ReplaceUse(slotRe, val)
}
attrs[attr.Key] = val

View file

@ -27,6 +27,11 @@ func (dsl DSL) Map() map[string]interface{} {
"type": dsl.Type,
"props": map[string]interface{}(dsl.Props),
}
if dsl.HideLabel {
res["hideLabel"] = true
}
if dsl.Bind != "" {
res["bind"] = dsl.Bind
}

View file

@ -2,10 +2,11 @@ package component
// DSL the component DSL
type DSL struct {
Bind string `json:"bind,omitempty"`
Type string `json:"type,omitempty"`
Compute *Compute `json:"compute,omitempty"`
Props PropsDSL `json:"props,omitempty"`
Bind string `json:"bind,omitempty"`
HideLabel bool `json:"hideLabel,omitempty"`
Type string `json:"type,omitempty"`
Compute *Compute `json:"compute,omitempty"`
Props PropsDSL `json:"props,omitempty"`
}
// Actions the actions

View file

@ -112,6 +112,10 @@ func (column ColumnDSL) Map() map[string]interface{} {
"bind": column.Bind,
}
if column.HideLabel {
res["hideLabel"] = true
}
if column.Data != nil {
res["data"] = map[string]interface{}{"process": column.Data.Process, "query": column.Data.Query}
}

View file

@ -18,13 +18,14 @@ type CloudProps map[string]component.CloudPropsDSL
// ColumnDSL the field column dsl
type ColumnDSL struct {
ID string `json:"id,omitempty"`
Data *component.CloudPropsDSL `json:"$data,omitempty"`
Key string `json:"key,omitempty"`
Bind string `json:"bind,omitempty"`
Link string `json:"link,omitempty"`
View *component.DSL `json:"view,omitempty"`
Edit *component.DSL `json:"edit,omitempty"`
ID string `json:"id,omitempty"`
Data *component.CloudPropsDSL `json:"$data,omitempty"`
Key string `json:"key,omitempty"`
Bind string `json:"bind,omitempty"`
Link string `json:"link,omitempty"`
HideLabel bool `json:"hideLabel,omitempty"`
View *component.DSL `json:"view,omitempty"`
Edit *component.DSL `json:"edit,omitempty"`
}
type aliasColumnDSL ColumnDSL

View file

@ -264,15 +264,24 @@ func (dsl *DSL) Xgen(data map[string]interface{}, excludes map[string]bool) (map
return nil, err
}
// full width default value
if _, has := dsl.Config["full"]; !has {
dsl.Config["full"] = true
// ** WARNING **
// set the full configuration by default
// Temporary solution, Will be removed in the future
// should be set when the list is created
config := map[string]interface{}{}
if dsl.Config != nil {
for key, value := range dsl.Config {
config[key] = value
}
}
if _, has := config["full"]; !has {
config["full"] = true
}
// Merge the layout config
if layout.Config != nil {
for key, value := range layout.Config {
dsl.Config[key] = value
config[key] = value
}
}
@ -289,7 +298,7 @@ func (dsl *DSL) Xgen(data map[string]interface{}, excludes map[string]bool) (map
onChange := map[string]interface{}{} // Hooks
setting["fields"] = fields
setting["config"] = dsl.Config
setting["config"] = config
for _, cProp := range dsl.CProps {
err := cProp.Replace(setting, func(cProp component.CloudPropsDSL) interface{} {

View file

@ -219,9 +219,18 @@ func (dsl *DSL) Xgen(data map[string]interface{}, excludes map[string]bool, quer
return nil, err
}
// full width default value
if _, has := dsl.Config["full"]; !has {
dsl.Config["full"] = true
// ** WARNING **
// set the full configuration by default
// Temporary solution, Will be removed in the future
// should be set when the list is created
config := map[string]interface{}{}
if dsl.Config != nil {
for key, value := range dsl.Config {
config[key] = value
}
}
if _, has := config["full"]; !has {
config["full"] = true
}
setting := map[string]interface{}{}
@ -237,7 +246,7 @@ func (dsl *DSL) Xgen(data map[string]interface{}, excludes map[string]bool, quer
onChange := map[string]interface{}{} // Hooks
setting["fields"] = fields
setting["config"] = dsl.Config
setting["config"] = config
replacements := maps.Map{}
if query != nil {