diff --git a/agent/agent.go b/agent/agent.go index 8bd42a6..e44e37c 100644 --- a/agent/agent.go +++ b/agent/agent.go @@ -167,6 +167,9 @@ func (a *Agent) consumeJob(job *Job, role string) { ctx, cancel := context.WithCancel(context.Background()) a.actionContext = action.NewContext(ctx, cancel) a.selfEvaluationInProgress = selfEvaluation + if len(job.conversationHistory) != 0 { + a.currentConversation = job.conversationHistory + } a.Unlock() if selfEvaluation { diff --git a/agent/jobs.go b/agent/jobs.go index 48d01ac..89e3871 100644 --- a/agent/jobs.go +++ b/agent/jobs.go @@ -2,6 +2,8 @@ package agent import ( "sync" + + "github.com/sashabaranov/go-openai" ) // Job is a request to the agent to do something @@ -9,11 +11,12 @@ type Job struct { // The job is a request to the agent to do something // It can be a question, a command, or a request to do something // The agent will try to do it, and return a response - Text string - Image string // base64 encoded image - Result *JobResult - reasoningCallback func(ActionCurrentState) bool - resultCallback func(ActionState) + Text string + Image string // base64 encoded image + Result *JobResult + reasoningCallback func(ActionCurrentState) bool + resultCallback func(ActionState) + conversationHistory []openai.ChatCompletionMessage } // JobResult is the result of a job @@ -28,6 +31,12 @@ type JobResult struct { type JobOption func(*Job) +func WithConversationHistory(history []openai.ChatCompletionMessage) JobOption { + return func(j *Job) { + j.conversationHistory = history + } +} + func WithReasoningCallback(f func(ActionCurrentState) bool) JobOption { return func(r *Job) { r.reasoningCallback = f diff --git a/example/webui/agentpool.go b/example/webui/agentpool.go index 90bc788..1b4230b 100644 --- a/example/webui/agentpool.go +++ b/example/webui/agentpool.go @@ -43,6 +43,17 @@ type AgentPool struct { type AgentPoolData map[string]AgentConfig +func loadPoolFromFile(path string) (*AgentPoolData, error) { + data, err := os.ReadFile(path) + if err != nil { + return nil, err + } + + poolData := &AgentPoolData{} + err = json.Unmarshal(data, poolData) + return poolData, err +} + func NewAgentPool(model, apiURL, directory string) (*AgentPool, error) { // if file exists, try to load an existing pool. // if file does not exist, create a new pool. @@ -92,10 +103,6 @@ func (a *AgentPool) CreateAgent(name string, agentConfig *AgentConfig) error { return a.startAgentWithConfig(name, agentConfig) } -func (a *AgentPool) GetManager(name string) Manager { - return a.managers[name] -} - func (a *AgentPool) List() []string { var agents []string for agent := range a.pool { @@ -297,13 +304,6 @@ func (a *AgentPool) GetAgent(name string) *Agent { return a.agents[name] } -func loadPoolFromFile(path string) (*AgentPoolData, error) { - data, err := os.ReadFile(path) - if err != nil { - return nil, err - } - - poolData := &AgentPoolData{} - err = json.Unmarshal(data, poolData) - return poolData, err +func (a *AgentPool) GetManager(name string) Manager { + return a.managers[name] }