diff --git a/src/interface.jl b/src/interface.jl index 652aff9..74b685c 100644 --- a/src/interface.jl +++ b/src/interface.jl @@ -1,6 +1,6 @@ module interface -export addNewMessage, conversation +export addNewMessage, conversation, decisionMaker using JSON3, DataStructures, Dates, UUIDs, HTTP, Random, MQTTClient using GeneralUtils @@ -60,7 +60,7 @@ using ..type, ..util, ..llmfunction, ..mcts Signature\n ----- """ -function decisionMaker(state::T) where {T<:AbstractDict} +function decisionMaker(a::T1, state::T2) where {T1<:agent, T2<:AbstractDict} customerinfo = """ I will give you the following information about customer: @@ -73,8 +73,8 @@ function decisionMaker(state::T) where {T<:AbstractDict} $(JSON3.write(state[:storeinfo])) """ - #[x] - prompt = + #[WORKING] + _prompt = """ You are a helpful sommelier working for a wine store. You helps users by searching wine that match the user preferences from your inventory. @@ -84,9 +84,9 @@ function decisionMaker(state::T) where {T<:AbstractDict} You must follow the """ + prompt = formatLLMtext_llama3instruct("system", _prompt) - - thought = iterativeprompting(prompt, syntaxcheck_json) + thought = iterativeprompting(a, prompt, syntaxcheck_json) error("--> decisionMaker") @@ -227,7 +227,8 @@ function conversation(a::T, userinput::Dict) where {T<:agent} initialState = Dict( # deepcopy the info to prevent modifying the info unintentionally during MCTS planning - :info=> deepcopy(a.keywordinfo), + :customerinfo=> deepcopy(a.keywordinfo[:customerinfo]), + :storeinfo=> deepcopy(a.keywordinfo[:storeinfo]), :thoughtHistory=> Dict{Symbol, Any}( # contain question, thought_1, action_1, observation_1, thought_2, ... :question=> userinput[:text], diff --git a/src/mcts.jl b/src/mcts.jl index 48cb056..1f5e8a3 100644 --- a/src/mcts.jl +++ b/src/mcts.jl @@ -267,106 +267,6 @@ end isLeaf(node::MCTSNode)::Bool = isempty(node.children) - -""" - - Arguments\n - ----- - - Return\n - ----- - - Example\n - ----- - ```jldoctest - julia> - ``` - - TODO\n - ----- - [] update docstring - [WORKING] implement the function - - Signature\n - ----- -""" -function iterativeprompting(a::T, prompt::String, verification::Function) where {T<:agent} - - msgMeta = GeneralUtils.generate_msgMeta( - a.config[:thirdPartyService][:text2textinstruct], - senderName= "iterativeprompting", - senderId= a.id, - receiverName= "text2textinstruct", - ) - - outgoingMsg = Dict( - :msgMeta, - :payload=> Dict( - :text=> prompt, - ) - ) - - # iteration loop - while true - # send prompt to LLM - response = GeneralUtils.sendReceiveMqttMsg() - - # check for correctness and get feedback - - if correct - - break - else - # get LLM critique - - # add critique to prompt - end - - - - end - return -end - - -""" Check JSON format correctness, provide - - Arguments\n - ----- - - Return\n - ----- - - Example\n - ----- - ```jldoctest - julia> - ``` - - TODO\n - ----- - [] update docstring - [WORKING] implement the function - - Signature\n - ----- -""" -function syntaxcheck_json(jsonstring::String)::NamedTuple - success, result, errormsg, st = GeneralUtils.showstracktrace(JSON3.read, jsonstring) - if !success # gives feedback - - - - else - - - end - - - return (success, result, critique) -end - - """ Arguments\n diff --git a/src/type.jl b/src/type.jl index e92af42..4a57e40 100644 --- a/src/type.jl +++ b/src/type.jl @@ -114,9 +114,6 @@ abstract type agent end :activeplan => Vector{Dict{Symbol, Any}}(), # current using plan :currenttrajectory=> Vector{Dict{Symbol, Any}}(), # store ) - - # communication - msgMeta::Dict{Symbol, Any} # a template for msgMeta # put incoming message here. waiting for further processing receiveUserMsgChannel::Channel{Dict} = Channel{Dict}(8) # for incoming user communication @@ -167,7 +164,6 @@ function sommelier( name= name, id= id, config= config, - msgMeta= msgMeta, maxHistoryMsg= maxHistoryMsg, tools= tools, thinkinglimit= thinkinglimit, diff --git a/src/util.jl b/src/util.jl index 54bd3b0..feecd01 100644 --- a/src/util.jl +++ b/src/util.jl @@ -1,6 +1,7 @@ module util -export clearhistory, addNewMessage, formatLLMtext, formatLLMtext_llama3instruct +export clearhistory, addNewMessage, formatLLMtext, formatLLMtext_llama3instruct, + syntaxcheck_json, iterativeprompting using UUIDs, Dates, DataStructures, HTTP, MQTTClient, JSON3 using GeneralUtils @@ -228,7 +229,105 @@ end +""" Check JSON format correctness, provide + Arguments\n + ----- + jsonstring::T + + Return\n + ----- + + Example\n + ----- + ```jldoctest + julia> + ``` + + TODO\n + ----- + [] update docstring + [WORKING] implement the function + + Signature\n + ----- +""" +function syntaxcheck_json(jsonstring::T)::NamedTuple where {T<:AbstractString} + error("--> syntaxcheck_json") + # success, result, errormsg, st = GeneralUtils.showstracktrace(JSON3.read, jsonstring) + # if !success # gives feedback + + + + # else + + + # end + + + # return (success, result, critique) +end + + +""" + + Arguments\n + ----- + + Return\n + ----- + + Example\n + ----- + ```jldoctest + julia> + ``` + + TODO\n + ----- + [] update docstring + [WORKING] implement the function + + Signature\n + ----- +""" +function iterativeprompting(a::T, prompt::String, verification::Function) where {T<:agent} + msgMeta = GeneralUtils.generate_msgMeta( + a.config[:externalService][:text2textinstruct], + senderName= "iterativeprompting", + senderId= a.id, + receiverName= "text2textinstruct", + ) + + outgoingMsg = Dict( + :msgMeta=> msgMeta, + :payload=> Dict( + :text=> prompt, + ) + ) + + # iteration loop + while true + # send prompt to LLM + response = GeneralUtils.sendReceiveMqttMsg(outgoingMsg) + error("--> iterativeprompting") + # check for correctness and get feedback + + # if correct + + # break + # else + # # get LLM critique + + # # add critique to prompt + # end + + + + end + + return response +end diff --git a/test/runtest.jl b/test/runtest.jl index 69d0d40..415f0b9 100644 --- a/test/runtest.jl +++ b/test/runtest.jl @@ -20,16 +20,19 @@ msgMeta = GeneralUtils.generate_msgMeta( ) agentConfig = Dict( - :receiveprompt=>Dict( - :mqtttopic=> config[:servicetopic][:value], # topic to receive prompt i.e. frontend send msg to this topic - ), - :receiveinternal=>Dict( - :mqtttopic=> instanceInternalTopic, # receive topic for model's internal - ), - :text2text=>Dict( - :mqtttopic=> config[:text2text][:value], - ), - ) + :mqttServerInfo=> Dict( + :broker=> config[:mqttServerInfo][:value][:broker], + :port=> config[:mqttServerInfo][:value][:port], + ), + :receivemsg=> Dict( + :prompt=> config[:servicetopic][:value], # topic to receive prompt i.e. frontend send msg to this topic + :internal=> instanceInternalTopic, + ), + :externalService=> Dict( + :text2textinstruct=> config[:externalService][:text2textinstruct][:value], + :text2textchat=> config[:externalService][:text2textchat][:value], + ), +) # Instantiate an agent tools=Dict( # update input format @@ -56,7 +59,6 @@ tools=Dict( # update input format a = YiemAgent.sommelier( receiveUserMsgChannel, receiveInternalMsgChannel, - msgMeta, agentConfig, name= "assistant", id= "randomSessionID", # agent instance id