From 6ece544cc81b5acf366eb22db40a03f6b1b92ade Mon Sep 17 00:00:00 2001 From: tonaerospace Date: Tue, 5 Dec 2023 09:12:23 +0000 Subject: [PATCH] update --- src/interface.jl | 52 ++--------------------------------- src/utils.jl | 71 ++++++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 69 insertions(+), 54 deletions(-) diff --git a/src/interface.jl b/src/interface.jl index c66cec5..970f28d 100755 --- a/src/interface.jl +++ b/src/interface.jl @@ -761,7 +761,6 @@ function actor(a::agentReflex) totalsteps = checkTotalStepInPlan(a) while true # Actor loop - #WORKING if a.step == 0 a.step = 1 else @@ -774,8 +773,9 @@ function actor(a::agentReflex) a.step += 1 elseif decision == "No" # repeat the latest step - # TODO delete Thought/Act/ActInput from the latest input - error("repete step $(a.step)") + # WORKING delete Thought/Act/ActInput from the latest input + a.memory[:shortterm] = removeHeaders(a.memory[:shortterm], a.step, ["Plan"]) + println("repeating step $(a.step)") elseif decision == "formulateUserRespond" actorState = "formulateUserRespond" msgToUser = nothing @@ -1234,52 +1234,6 @@ function goNogo(a) return decision, reason end -# function goNogo(a) -# stimulus = a.memory[:shortterm]["user:"] -# work = "" -# for (k, v) in a.memory[:shortterm] -# if k ∉ ["user:"] -# work *= "$k $v" -# end -# end - - -# prompt = -# """ -# <|im_start|>system -# You have access to the following tools: -# chatbox: Useful for when you need to ask a customer for more context. Input should be a conversation to customer. -# wikisearch: Useful for when you need to search an encyclopedia Input is keywords and not a question. - -# Symbol: -# Stimulus: the input user gives to you and you must respond -# Plan: a plan -# Thought: your thought -# Act: the action you took -# ActInput: the input to the action -# Obs: the result of the action - -# Stimulus: -# $stimulus - -# Your work: -# $work - -# From your work, you job is to decide whether you're ready to do the next step in the plan by choosing one of the following choices: -# If you are ready say, "{Yes}". And what is the rationale behind the decision? -# If you are not ready say, "{No}". And what is the rationale behind the decision? -# <|im_end|> -# """ - -# respond = sendReceivePrompt(a, prompt) - -# decision = GeneralUtils.getStringBetweenCharacters(respond, "{", "}") -# start = findfirst("}", respond)[end] +1 -# reason = respond[start:end] - -# return decision, reason -# end - diff --git a/src/utils.jl b/src/utils.jl index 16fac90..00fc20b 100644 --- a/src/utils.jl +++ b/src/utils.jl @@ -3,7 +3,7 @@ module utils export makeSummary, sendReceivePrompt, chunktext, extractStepFromPlan, checkTotalStepInPlan, detectCharacters, findDetectedCharacter, extract_number, toolNameBeingCalled, chooseThinkingMode, conversationSummary, checkReasonableness, replaceHeaders, - addShortMem!, splittext, shortMemoryToString + addShortMem!, splittext, shortMemoryToString, removeHeaders using UUIDs, Dates, DataStructures using CommUtils, GeneralUtils @@ -622,7 +622,7 @@ end """ Convert short term memory into 1 continous string. Args: - shortMemory = a short memory of a ChatAgent's agent + shortMemory = a short term memory of a ChatAgent's agent skiplist = a list of keys in memory you want to skip Return: @@ -631,13 +631,15 @@ Return: # Example ```jldoctest julia> shortMemory = OrderedDict( - "Thought" => "I like it.", - "Act" => "chatbox", - "ActInput" => "I get this one.", + "user:" => "Umm", + "Thought 1:" => "I like it.", + "Act 1:" => "chatbox", + "ActInput 1:" => "I get this one.", ) julia> headers = ["user:"] julia> shortMemoryToString(shortMemory, headers) +"Thought 1: I like it.\nAct 1: chatbox\nActInput 1: I get this one.\n" ``` """ function shortMemoryToString(shortMemory::OrderedDict, @@ -658,8 +660,67 @@ function shortMemoryToString(shortMemory::OrderedDict, end +""" Remove headers of specific step from memory. +Args: + shortMemory = a short term memory of a ChatAgent's agent + skipHeaders = a list of keys in memory you want to skip + step = a step number you want to remove +Return: + a short term memory + +# Example +```jldoctest +julia> shortMemory = OrderedDict( + "user:" => "May I try this one?", + "Plan 1:" => "testing a small portion of icecream", + "Thought 1:" => "I like it.", + "Act 1:" => "chatbox", + "ActInput 1:" => "I get this one.", + "Plan 2:" => "I'm meeting my wife this afternoon", + "Thought 2:" => "I also want it for my wife", + "Act 2:" => "chatbox", + "ActInput 2:" => "I would like to get 2 more", + ) +julia> skipHeaders = ["Plan"] +julia> step = 2 +julia> removeHeaders(shortMemory, step, skipHeaders) +OrderedDict( + "user:" => "May I try this one?", + "Plan 1:" => "testing a small portion of icecream", + "Thought 1:" => "I like it.", + "Act 1:" => "chatbox", + "ActInput 1:" => "I get this one.", + "Plan 2:" => "I'm meeting my wife this afternoon", + ) +``` +""" #WORKING +function removeHeaders(shortMemory::OrderedDict, step::Int, + skipHeaders::Union{Array{String}, Array{Symbol}, Nothing}=nothing) + + newdict = similar(shortMemory) + + for (k, v) in shortMemory + if occursin("$step", k) + if skipHeaders !== nothing + for i in skipHeaders + if occursin(i, k) + newdict[k] = v + else + # skip, not copy + end + end + else + # no copy + end + else + newdict[k] = v + end + end + + return newdict +end