Files
Ettore Di Giacinto 16775f356a Use bleve for indexing short-term memory (#397)
Signed-off-by: Ettore Di Giacinto <mudler@localai.io>
2026-01-30 15:41:23 +01:00

92 lines
3.2 KiB
Go

package actions_test
import (
"context"
"os"
"path/filepath"
"github.com/mudler/LocalAGI/core/types"
"github.com/mudler/LocalAGI/services/actions"
. "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega"
)
var _ = Describe("MemoryActions", func() {
var (
tmpDir string
indexPath string
aAdd *actions.AddToMemoryAction
aList *actions.ListMemoryAction
aRemove *actions.RemoveFromMemoryAction
aSearch *actions.SearchMemoryAction
)
BeforeEach(func() {
var err error
tmpDir, err = os.MkdirTemp("", "memory_test_*")
Expect(err).ToNot(HaveOccurred())
indexPath = filepath.Join(tmpDir, "memory.bleve")
aAdd, aList, aRemove, aSearch = actions.NewMemoryActions(indexPath, map[string]string{})
})
AfterEach(func() {
os.RemoveAll(tmpDir)
})
It("adds and lists entries by name", func() {
_, err := aAdd.Run(context.TODO(), nil, types.ActionParams{"name": "foo", "content": "bar"})
Expect(err).ToNot(HaveOccurred())
_, err = aAdd.Run(context.TODO(), nil, types.ActionParams{"name": "baz", "content": "qux"})
Expect(err).ToNot(HaveOccurred())
res, err := aList.Run(context.TODO(), nil, types.ActionParams{})
Expect(err).ToNot(HaveOccurred())
Expect(res.Metadata["names"]).To(ContainElements("foo", "baz"))
Expect(res.Metadata["count"]).To(Equal(2))
})
It("removes by id", func() {
addRes, _ := aAdd.Run(context.TODO(), nil, types.ActionParams{"name": "foo", "content": "bar"})
id, ok := addRes.Metadata["id"].(string)
Expect(ok).To(BeTrue())
_, _ = aAdd.Run(context.TODO(), nil, types.ActionParams{"name": "baz", "content": "qux"})
_, err := aRemove.Run(context.TODO(), nil, types.ActionParams{"id": id})
Expect(err).ToNot(HaveOccurred())
res, _ := aList.Run(context.TODO(), nil, types.ActionParams{})
Expect(res.Metadata["names"]).To(ConsistOf("baz"))
})
It("returns error for missing id on remove", func() {
_, _ = aAdd.Run(context.TODO(), nil, types.ActionParams{"name": "foo", "content": "bar"})
_, err := aRemove.Run(context.TODO(), nil, types.ActionParams{})
Expect(err).To(HaveOccurred())
})
It("returns error for unknown id on remove", func() {
_, err := aRemove.Run(context.TODO(), nil, types.ActionParams{"id": "nonexistent"})
Expect(err).To(HaveOccurred())
})
It("returns error for empty name and content on add", func() {
_, err := aAdd.Run(context.TODO(), nil, types.ActionParams{"name": "", "content": ""})
Expect(err).To(HaveOccurred())
})
It("search returns matching entries", func() {
_, _ = aAdd.Run(context.TODO(), nil, types.ActionParams{"name": "meeting", "content": "discussed project X"})
_, _ = aAdd.Run(context.TODO(), nil, types.ActionParams{"name": "lunch", "content": "ate pizza"})
res, err := aSearch.Run(context.TODO(), nil, types.ActionParams{"query": "project"})
Expect(err).ToNot(HaveOccurred())
Expect(res.Metadata["count"]).To(Equal(1))
results, ok := res.Metadata["results"].([]actions.MemoryEntry)
Expect(ok).To(BeTrue())
Expect(results).To(HaveLen(1))
Expect(results[0].Name).To(Equal("meeting"))
Expect(results[0].Content).To(Equal("discussed project X"))
})
It("search returns error for empty query", func() {
_, err := aSearch.Run(context.TODO(), nil, types.ActionParams{"query": ""})
Expect(err).To(HaveOccurred())
})
})