Add tests
This commit is contained in:
@@ -473,6 +473,8 @@ func (a *Agent) consumeJob(job *types.Job, role string) {
|
|||||||
Role: "assistant",
|
Role: "assistant",
|
||||||
Content: reasoning,
|
Content: reasoning,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
xlog.Debug("Finish job with reasoning", "reasoning", reasoning, "agent", a.Character.Name, "conversation", fmt.Sprintf("%+v", conv))
|
||||||
job.Result.Conversation = conv
|
job.Result.Conversation = conv
|
||||||
a.saveCurrentConversation(conv)
|
a.saveCurrentConversation(conv)
|
||||||
job.Result.SetResponse(reasoning)
|
job.Result.SetResponse(reasoning)
|
||||||
@@ -864,7 +866,7 @@ func (a *Agent) Run() error {
|
|||||||
//todoTimer := time.NewTicker(a.options.periodicRuns)
|
//todoTimer := time.NewTicker(a.options.periodicRuns)
|
||||||
timer := time.NewTimer(a.options.periodicRuns)
|
timer := time.NewTimer(a.options.periodicRuns)
|
||||||
for {
|
for {
|
||||||
xlog.Debug("Agent is waiting for a job", "agent", a.Character.Name)
|
xlog.Debug("Agent is now waiting for a new job", "agent", a.Character.Name)
|
||||||
select {
|
select {
|
||||||
case job := <-a.jobQueue:
|
case job := <-a.jobQueue:
|
||||||
a.loop(timer, job)
|
a.loop(timer, job)
|
||||||
|
|||||||
13
services/connectors/connectors_suite_test.go
Normal file
13
services/connectors/connectors_suite_test.go
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
package connectors_test
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
. "github.com/onsi/ginkgo/v2"
|
||||||
|
. "github.com/onsi/gomega"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestConnectors(t *testing.T) {
|
||||||
|
RegisterFailHandler(Fail)
|
||||||
|
RunSpecs(t, "Connectors test suite")
|
||||||
|
}
|
||||||
111
services/connectors/conversationstracker_test.go
Normal file
111
services/connectors/conversationstracker_test.go
Normal file
@@ -0,0 +1,111 @@
|
|||||||
|
package connectors_test
|
||||||
|
|
||||||
|
import (
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/mudler/LocalAgent/services/connectors"
|
||||||
|
. "github.com/onsi/ginkgo/v2"
|
||||||
|
. "github.com/onsi/gomega"
|
||||||
|
"github.com/sashabaranov/go-openai"
|
||||||
|
)
|
||||||
|
|
||||||
|
var _ = Describe("ConversationTracker", func() {
|
||||||
|
var (
|
||||||
|
tracker *connectors.ConversationTracker[string]
|
||||||
|
duration time.Duration
|
||||||
|
)
|
||||||
|
|
||||||
|
BeforeEach(func() {
|
||||||
|
duration = 1 * time.Second
|
||||||
|
tracker = connectors.NewConversationTracker[string](duration)
|
||||||
|
})
|
||||||
|
|
||||||
|
It("should initialize with empty conversations", func() {
|
||||||
|
Expect(tracker.GetConversation("test")).To(BeEmpty())
|
||||||
|
})
|
||||||
|
|
||||||
|
It("should add a message and retrieve it", func() {
|
||||||
|
message := openai.ChatCompletionMessage{
|
||||||
|
Role: openai.ChatMessageRoleUser,
|
||||||
|
Content: "Hello",
|
||||||
|
}
|
||||||
|
tracker.AddMessage("test", message)
|
||||||
|
conv := tracker.GetConversation("test")
|
||||||
|
Expect(conv).To(HaveLen(1))
|
||||||
|
Expect(conv[0]).To(Equal(message))
|
||||||
|
})
|
||||||
|
|
||||||
|
It("should clear the conversation after the duration", func() {
|
||||||
|
message := openai.ChatCompletionMessage{
|
||||||
|
Role: openai.ChatMessageRoleUser,
|
||||||
|
Content: "Hello",
|
||||||
|
}
|
||||||
|
tracker.AddMessage("test", message)
|
||||||
|
time.Sleep(2 * time.Second)
|
||||||
|
conv := tracker.GetConversation("test")
|
||||||
|
Expect(conv).To(BeEmpty())
|
||||||
|
})
|
||||||
|
|
||||||
|
It("should keep the conversation within the duration", func() {
|
||||||
|
message := openai.ChatCompletionMessage{
|
||||||
|
Role: openai.ChatMessageRoleUser,
|
||||||
|
Content: "Hello",
|
||||||
|
}
|
||||||
|
tracker.AddMessage("test", message)
|
||||||
|
time.Sleep(500 * time.Millisecond) // Half the duration
|
||||||
|
conv := tracker.GetConversation("test")
|
||||||
|
Expect(conv).To(HaveLen(1))
|
||||||
|
Expect(conv[0]).To(Equal(message))
|
||||||
|
})
|
||||||
|
|
||||||
|
It("should handle multiple keys and clear old conversations", func() {
|
||||||
|
message1 := openai.ChatCompletionMessage{
|
||||||
|
Role: openai.ChatMessageRoleUser,
|
||||||
|
Content: "Hello 1",
|
||||||
|
}
|
||||||
|
message2 := openai.ChatCompletionMessage{
|
||||||
|
Role: openai.ChatMessageRoleUser,
|
||||||
|
Content: "Hello 2",
|
||||||
|
}
|
||||||
|
|
||||||
|
tracker.AddMessage("key1", message1)
|
||||||
|
tracker.AddMessage("key2", message2)
|
||||||
|
|
||||||
|
time.Sleep(2 * time.Second)
|
||||||
|
|
||||||
|
conv1 := tracker.GetConversation("key1")
|
||||||
|
conv2 := tracker.GetConversation("key2")
|
||||||
|
|
||||||
|
Expect(conv1).To(BeEmpty())
|
||||||
|
Expect(conv2).To(BeEmpty())
|
||||||
|
})
|
||||||
|
|
||||||
|
It("should handle different key types", func() {
|
||||||
|
trackerInt := connectors.NewConversationTracker[int](duration)
|
||||||
|
trackerInt64 := connectors.NewConversationTracker[int64](duration)
|
||||||
|
|
||||||
|
message := openai.ChatCompletionMessage{
|
||||||
|
Role: openai.ChatMessageRoleUser,
|
||||||
|
Content: "Hello",
|
||||||
|
}
|
||||||
|
|
||||||
|
trackerInt.AddMessage(1, message)
|
||||||
|
trackerInt64.AddMessage(int64(1), message)
|
||||||
|
|
||||||
|
Expect(trackerInt.GetConversation(1)).To(HaveLen(1))
|
||||||
|
Expect(trackerInt64.GetConversation(int64(1))).To(HaveLen(1))
|
||||||
|
})
|
||||||
|
|
||||||
|
It("should cleanup other conversations if older", func() {
|
||||||
|
message := openai.ChatCompletionMessage{
|
||||||
|
Role: openai.ChatMessageRoleUser,
|
||||||
|
Content: "Hello",
|
||||||
|
}
|
||||||
|
tracker.AddMessage("key1", message)
|
||||||
|
tracker.AddMessage("key2", message)
|
||||||
|
time.Sleep(2 * time.Second)
|
||||||
|
tracker.GetConversation("key3")
|
||||||
|
Expect(tracker.GetConversation("key1")).To(BeEmpty())
|
||||||
|
Expect(tracker.GetConversation("key2")).To(BeEmpty())
|
||||||
|
})
|
||||||
|
})
|
||||||
@@ -306,6 +306,8 @@ func (t *Slack) handleChannelMessage(
|
|||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
|
xlog.Debug("After adding message to conversation tracker", "conversation", t.conversationTracker.GetConversation(t.channelID))
|
||||||
|
|
||||||
//res.Response = githubmarkdownconvertergo.Slack(res.Response)
|
//res.Response = githubmarkdownconvertergo.Slack(res.Response)
|
||||||
|
|
||||||
_, _, err = api.PostMessage(ev.Channel,
|
_, _, err = api.PostMessage(ev.Channel,
|
||||||
@@ -574,6 +576,7 @@ func (t *Slack) handleMention(
|
|||||||
// Format the final response
|
// Format the final response
|
||||||
//finalResponse := githubmarkdownconvertergo.Slack(res.Response)
|
//finalResponse := githubmarkdownconvertergo.Slack(res.Response)
|
||||||
finalResponse := fmt.Sprintf("@%s %s", user.Name, res.Response)
|
finalResponse := fmt.Sprintf("@%s %s", user.Name, res.Response)
|
||||||
|
xlog.Debug("Send final response to slack", "response", finalResponse)
|
||||||
|
|
||||||
// Update the placeholder message with the final result
|
// Update the placeholder message with the final result
|
||||||
t.placeholderMutex.RLock()
|
t.placeholderMutex.RLock()
|
||||||
|
|||||||
@@ -64,11 +64,15 @@ func (t *Telegram) handleUpdate(ctx context.Context, b *bot.Bot, a *agent.Agent,
|
|||||||
Role: "user",
|
Role: "user",
|
||||||
})
|
})
|
||||||
|
|
||||||
|
xlog.Info("New message", "username", username, "conversation", currentConv)
|
||||||
res := a.Ask(
|
res := a.Ask(
|
||||||
types.WithConversationHistory(currentConv),
|
types.WithConversationHistory(currentConv),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
xlog.Debug("Response", "response", res.Response)
|
||||||
|
|
||||||
if res.Response == "" {
|
if res.Response == "" {
|
||||||
|
xlog.Error("Empty response from agent")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -80,11 +84,15 @@ func (t *Telegram) handleUpdate(ctx context.Context, b *bot.Bot, a *agent.Agent,
|
|||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
b.SendMessage(ctx, &bot.SendMessageParams{
|
xlog.Debug("Sending message back to telegram", "response", res.Response)
|
||||||
ParseMode: models.ParseModeMarkdown,
|
_, err := b.SendMessage(ctx, &bot.SendMessageParams{
|
||||||
|
// ParseMode: models.ParseModeMarkdown,
|
||||||
ChatID: update.Message.Chat.ID,
|
ChatID: update.Message.Chat.ID,
|
||||||
Text: res.Response,
|
Text: res.Response,
|
||||||
})
|
})
|
||||||
|
if err != nil {
|
||||||
|
xlog.Error("Error sending message", "error", err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// func (t *Telegram) handleNewMessage(ctx context.Context, b *bot.Bot, m openai.ChatCompletionMessage) {
|
// func (t *Telegram) handleNewMessage(ctx context.Context, b *bot.Bot, m openai.ChatCompletionMessage) {
|
||||||
|
|||||||
Reference in New Issue
Block a user