diff --git a/neo/assistant/api.go b/neo/assistant/api.go new file mode 100644 index 00000000..69c22a00 --- /dev/null +++ b/neo/assistant/api.go @@ -0,0 +1,38 @@ +package assistant + +// Get get the assistant by id +func Get(id string) (*Assistant, error) { + return LoadStore(id) +} + +// GetByConnector get the assistant by connector +func GetByConnector(connector string, name string) (*Assistant, error) { + id := "connector:" + connector + + assistant, exists := loaded.Get(id) + if exists { + return assistant, nil + } + + data := map[string]interface{}{ + "assistant_id": id, + "connector": connector, + "description": "Default assistant for " + connector, + "name": name, + "type": "assistant", + } + + assistant, err := loadMap(data) + if err != nil { + return nil, err + + } + loaded.Put(assistant) + return assistant, nil +} + +// Init init the assistant +// Choose the connector and initialize the assistant +func (ast *Assistant) initialize() error { + return nil +} diff --git a/neo/assistant/assistant.go b/neo/assistant/assistant.go index 9f2f92ad..ee57d890 100644 --- a/neo/assistant/assistant.go +++ b/neo/assistant/assistant.go @@ -115,6 +115,17 @@ func LoadStore(id string) (*Assistant, error) { return nil, err } + // Load from path + if data["path"] != nil { + assistant, err = LoadPath(data["path"].(string)) + if err != nil { + return nil, err + } + loaded.Put(assistant) + return assistant, nil + } + + // Load from store assistant, err = loadMap(data) if err != nil { return nil, err diff --git a/neo/load.go b/neo/load.go index 6b87957f..53dfe9a6 100644 --- a/neo/load.go +++ b/neo/load.go @@ -1,10 +1,7 @@ package neo import ( - "context" - "fmt" "path/filepath" - "time" "github.com/yaoapp/gou/application" "github.com/yaoapp/yao/config" @@ -58,32 +55,11 @@ func Load(cfg config.Config) error { return err } - // Query Assistant List - ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) - defer cancel() - - listDone := make(chan error, 1) - go func() { - list, err := Neo.HookAssistants(ctx, assistant.QueryParam{Limit: 100}) - Neo.updateAssistantList(list) - listDone <- err - }() - - select { - case err := <-listDone: - if err != nil { - return fmt.Errorf("Neo assistant list failed: %w", err) - } - - // Create Default Assistant - Neo.Assistant, err = Neo.createDefaultAssistant() - if err != nil { - return err - } - - return nil - case <-ctx.Done(): - return fmt.Errorf("Neo assistant list timeout: %w", ctx.Err()) + defaultAssistant, err := Neo.defaultAssistant() + if err != nil { + return err } + Neo.Assistant = defaultAssistant.API + return nil } diff --git a/neo/neo.go b/neo/neo.go index f072dc1c..e5cf0399 100644 --- a/neo/neo.go +++ b/neo/neo.go @@ -346,6 +346,20 @@ func (neo *DSL) chat(ast assistant.API, ctx Context, messages []map[string]inter } } +// defaultAssistant get the default assistant +func (neo *DSL) defaultAssistant() (*assistant.Assistant, error) { + if neo.Use != "" { + return assistant.Get(neo.Use) + } + + name := neo.Name + if name == "" { + name = "Neo" + } + + return assistant.GetByConnector(neo.Connector, name) +} + // updateAssistantList update the assistant list func (neo *DSL) updateAssistantList(list []assistant.Assistant) { lock.Lock()