diff --git a/neo/command/request.go b/neo/command/request.go index 4451e863..05881377 100644 --- a/neo/command/request.go +++ b/neo/command/request.go @@ -318,7 +318,7 @@ func (req *Request) saveHistory(content []byte, messages []map[string]interface{ func (req *Request) error(err error, cb func(msg *message.JSON) int) { cb(req.msg().Text(err.Error())) - cb(message.New().Done()) + cb(req.msg().Done()) // req.Done() } @@ -400,7 +400,7 @@ func (req *Request) runScript(id string, args []interface{}, cb func(msg *messag } cb(req.msg().Done()) - req.Done() + // req.Done() return v8go.Null(v8ctx.Isolate()) }) diff --git a/neo/neo.go b/neo/neo.go index 3f251a32..0390d6c5 100644 --- a/neo/neo.go +++ b/neo/neo.go @@ -6,6 +6,7 @@ import ( "net/url" "strings" + "github.com/fatih/color" "github.com/gin-gonic/gin" "github.com/google/uuid" "github.com/yaoapp/gou/api" @@ -143,7 +144,7 @@ func (neo *DSL) Answer(ctx command.Context, question string, answer Answer) erro content := []byte{} // get the chat messages - messages, err := neo.chatMessages(ctx.Sid, question) + messages, err := neo.chatMessages(ctx, question) if err != nil { return err } @@ -242,15 +243,64 @@ func (neo *DSL) prompts() []map[string]interface{} { return prompts } +// prepare the messages +func (neo *DSL) prepare(ctx command.Context, messages []map[string]interface{}) []map[string]interface{} { + if neo.Prepare == "" { + return []map[string]interface{}{} + } + + prompts := []map[string]interface{}{} + p, err := process.Of(neo.Prepare, ctx, messages) + if err != nil { + color.Red("Neo prepare error: %s", err.Error()) + return prompts + } + + data, err := p.Exec() + if err != nil { + color.Red("Neo prepare execute error: %s", err.Error()) + return prompts + } + + items, ok := data.([]interface{}) + if !ok { + color.Red("Neo prepare response is not array") + return prompts + } + + for i, item := range items { + v, ok := item.(map[string]interface{}) + if !ok { + color.Red("Neo prepare response [%d] is not map", i) + continue + } + + if _, ok := v["role"]; !ok { + color.Red(`Neo prepare response [%d]["role"] required`, i) + continue + } + + if _, ok := v["content"]; !ok { + color.Red(`Neo prepare response [%d]["content"] required`, i) + continue + } + prompts = append(prompts, v) + } + + return prompts +} + // chatMessages get the chat messages -func (neo *DSL) chatMessages(sid, content string) ([]map[string]interface{}, error) { +func (neo *DSL) chatMessages(ctx command.Context, content string) ([]map[string]interface{}, error) { messages := append([]map[string]interface{}{}, neo.prompts()...) - history, err := neo.Conversation.GetHistory(sid) + + history, err := neo.Conversation.GetHistory(ctx.Sid) if err != nil { return nil, err } + messages = append(messages, neo.prepare(ctx, messages)...) // Add prepare messages messages = append(messages, history...) - messages = append(messages, map[string]interface{}{"role": "user", "content": content, "name": sid}) + messages = append(messages, map[string]interface{}{"role": "user", "content": content, "name": ctx.Sid}) return messages, nil } diff --git a/neo/types.go b/neo/types.go index a0dfe9f7..f020ee93 100644 --- a/neo/types.go +++ b/neo/types.go @@ -16,6 +16,7 @@ type DSL struct { Connector string `json:"connector"` ConversationSetting conversation.Setting `json:"conversation" yaml:"conversation"` Option map[string]interface{} `json:"option"` + Prepare string `json:"prepare,omitempty"` Prompts []aigc.Prompt `json:"prompts,omitempty"` Allows []string `json:"allows,omitempty"` AI aigc.AI `json:"-" yaml:"-"`