summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore2
-rw-r--r--README.md2
-rw-r--r--models/card.go8
-rw-r--r--pngmeta/metareader.go35
-rw-r--r--tools.go3
-rw-r--r--tui.go12
6 files changed, 44 insertions, 18 deletions
diff --git a/.gitignore b/.gitignore
index 06cde6f..7c4b1f4 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,4 +5,4 @@ elefant
history/
*.db
config.toml
-sysprompts/*.png
+sysprompts/*
diff --git a/README.md b/README.md
index a62b6d4..ab7fd61 100644
--- a/README.md
+++ b/README.md
@@ -28,7 +28,6 @@
- consider adding use /completion of llamacpp, since openai endpoint clearly has template|format issues;
- separate messages that are stored and chat and send to the bot, i.e. option to omit tool calls (there might be a point where they are no longer needed in ctx);
- RAG support|implementation;
-- change card-chat pair with one binding;
- char card is the sys message, but how about giving tools to char that does not have it?
- it is a bit clumsy to mix chats in db and chars from the external files, maybe load external files in db on startup?
- lets say we have two (or more) agents with the same name across multiple chats. These agents go and ask db for topics they memorised. Now they can access topics that aren't meant for them. (so memory should have an option: shareable; that indicates if that memory can be shared across chats);
@@ -51,4 +50,5 @@
- all page names should be vars; +
- normal case regen omits assistant icon; +
- user icon (and role?) from config is not used; +
+- message editing broke ( runtime error: index out of range [-1]); +
- F1 can load any chat, by loading chat of other agent it does not switch agents, if that chat is continued, it will rewrite agent in db; (either allow only chats from current agent OR switch agent on chat loading);
diff --git a/models/card.go b/models/card.go
index 24226d3..4ff2d8b 100644
--- a/models/card.go
+++ b/models/card.go
@@ -34,8 +34,8 @@ func (c *CharCardSpec) Simplify(userName, fpath string) *CharCard {
}
type CharCard struct {
- SysPrompt string
- FirstMsg string
- Role string
- FilePath string
+ SysPrompt string `json:"sys_prompt"`
+ FirstMsg string `json:"first_msg"`
+ Role string `json:"role"`
+ FilePath string `json:"filepath"`
}
diff --git a/pngmeta/metareader.go b/pngmeta/metareader.go
index ea726c9..5542e86 100644
--- a/pngmeta/metareader.go
+++ b/pngmeta/metareader.go
@@ -84,6 +84,18 @@ func ReadCard(fname, uname string) (*models.CharCard, error) {
return charSpec.Simplify(uname, fname), nil
}
+func readCardJson(fname string) (*models.CharCard, error) {
+ data, err := os.ReadFile(fname)
+ if err != nil {
+ return nil, err
+ }
+ card := models.CharCard{}
+ if err := json.Unmarshal(data, &card); err != nil {
+ return nil, err
+ }
+ return &card, nil
+}
+
func ReadDirCards(dirname, uname string) ([]*models.CharCard, error) {
files, err := os.ReadDir(dirname)
if err != nil {
@@ -91,17 +103,22 @@ func ReadDirCards(dirname, uname string) ([]*models.CharCard, error) {
}
resp := []*models.CharCard{}
for _, f := range files {
- if !strings.HasSuffix(f.Name(), ".png") {
- continue
+ if strings.HasSuffix(f.Name(), ".png") {
+ fpath := path.Join(dirname, f.Name())
+ cc, err := ReadCard(fpath, uname)
+ if err != nil {
+ return nil, err // better to log and continue
+ }
+ resp = append(resp, cc)
}
- fpath := path.Join(dirname, f.Name())
- cc, err := ReadCard(fpath, uname)
- if err != nil {
- // log err
- return nil, err
- // continue
+ if strings.HasSuffix(f.Name(), ".json") {
+ fpath := path.Join(dirname, f.Name())
+ cc, err := readCardJson(fpath)
+ if err != nil {
+ return nil, err // better to log and continue
+ }
+ resp = append(resp, cc)
}
- resp = append(resp, cc)
}
return resp, nil
}
diff --git a/tools.go b/tools.go
index 39c6063..210ce9c 100644
--- a/tools.go
+++ b/tools.go
@@ -107,7 +107,8 @@ func recall(args ...string) []byte {
logger.Error(msg)
return []byte(msg)
}
- return []byte(mind)
+ answer := fmt.Sprintf("under the topic: %s is stored:\n%s", args[0], mind)
+ return []byte(answer)
}
func recallTopics(args ...string) []byte {
diff --git a/tui.go b/tui.go
index 719ea8c..28dc785 100644
--- a/tui.go
+++ b/tui.go
@@ -117,7 +117,9 @@ func makeChatTable(chatList []string) *tview.Table {
if err := store.RemoveChat(sc.ID); err != nil {
logger.Error("failed to remove chat from db", "chat_id", sc.ID, "chat_name", sc.Name)
}
- notifyUser("chat deleted", selectedChat+" was deleted")
+ if err := notifyUser("chat deleted", selectedChat+" was deleted"); err != nil {
+ logger.Error("failed to send notification", "error", err)
+ }
pages.RemovePage(historyPage)
return
default:
@@ -288,10 +290,16 @@ func init() {
return event
case tcell.KeyEnter:
si := indexPickWindow.GetText()
- selectedIndex, err := strconv.Atoi(si)
+ siInt, err := strconv.Atoi(si)
if err != nil {
logger.Error("failed to convert provided index", "error", err, "si", si)
+ if err := notifyUser("cancel", "no index provided"); err != nil {
+ logger.Error("failed to send notification", "error", err)
+ }
+ pages.RemovePage(indexPage)
+ return event
}
+ selectedIndex = siInt
if len(chatBody.Messages)+1 < selectedIndex || selectedIndex < 0 {
msg := "chosen index is out of bounds"
logger.Warn(msg, "index", selectedIndex)