using Revise # remove when this package is completed using YiemAgent, GeneralUtils, JSON3, MQTTClient, Dates, UUIDs, DataStructures using Base.Threads # ---------------------------------------------- 100 --------------------------------------------- # config = copy(JSON3.read("config.json")) instanceInternalTopic = config[:serviceInternalTopic][:mqtttopic] * "/1" client, connection = MakeConnection(config[:mqttServerInfo][:broker], config[:mqttServerInfo][:port]) receiveUserMsgChannel = Channel{Dict}(4) receiveInternalMsgChannel = Channel{Dict}(4) msgMeta = GeneralUtils.generate_msgMeta( "N/A", replyTopic = config[:servicetopic][:mqtttopic] # ask frontend reply to this instance_chat_topic ) agentConfig = Dict( :mqttServerInfo=> config[:mqttServerInfo], :receivemsg=> Dict( :prompt=> config[:servicetopic][:mqtttopic], # topic to receive prompt i.e. frontend send msg to this topic :internal=> instanceInternalTopic, ), :externalservice=> config[:externalservice], ) # Instantiate an agent tools=Dict( # update input format "askbox"=> Dict( :description => "Useful for when you need to ask the user for more context. Do not ask the user their own question.", :input => """Input is a text in JSON format.{\"Q1\": \"How are you doing?\", \"Q2\": \"How may I help you?\"}""", :output => "" , :func => nothing, ), # "winestock"=> Dict( # :description => "A handy tool for searching wine in your inventory that match the user preferences.", # :input => """Input is a JSON-formatted string that contains a detailed and precise search query.{\"wine type\": \"rose\", \"price\": \"max 35\", \"sweetness level\": \"sweet\", \"intensity level\": \"light bodied\", \"Tannin level\": \"low\", \"Acidity level\": \"low\"}""", # :output => """Output are wines that match the search query in JSON format.""", # :func => ChatAgent.winestock, # ), "finalanswer"=> Dict( :description => "Useful for when you are ready to recommend wines to the user.", :input => """{\"finalanswer\": \"some text\"}.{\"finalanswer\": \"I recommend Zena Crown Vista\"}""", :output => "" , :func => nothing, ), ) a = YiemAgent.sommelier( receiveUserMsgChannel, receiveInternalMsgChannel, agentConfig, name= "assistant", id= "testingSessionID", # agent instance id tools=tools, ) input = OrderedDict{Symbol, Any}( :question => "Hello, I would like a get a bottle of wine", :thought_1 => "A customer wants to buy a bottle of wine. Before making a recommendation, I need to know more about their preferences.", :action_1 => Dict{Symbol, Any}( :name => "chatbox", :input => "What is the occasion for which you're buying this wine?" ), :observation_1 => "We are holding a wedding party", :thought_2 => "A wedding party, that's a great occasion! The customer might be looking for a celebratory drink. Let me ask some more questions to narrow down the options.", :action_2 => Dict{Symbol, Any}( :name => "chatbox", :input => "What type of food will you be serving at the wedding?" ), :observation_2 => "It will be Thai dishes.", :thought_3 => "With Thai food, I should recommend a wine that complements its spicy and savory flavors. And since it's a celebratory occasion, the customer might prefer a full-bodied wine.", :action_3 => Dict{Symbol, Any}( :name => "chatbox", :input => "What is your budget for this bottle of wine?" ), :observation_3 => "I would spend up to 50 bucks.", :thought_4 => "Now that I have some more information, it's time to narrow down the options.", :action_4 => Dict{Symbol, Any}( :name => "winestock", :input => "red wine with full body, pairs well with spicy food, budget \$50"), :observation_4 => "I found the following wines in our stock: \n{\n 1: El Enemigo Cabernet Franc 2019\n2: Tantara Chardonnay 2017\n\n}\n", :thought_5 => "Now that I have a list of potential wines, I need to know more about the customer's taste preferences.", :action_5 => Dict{Symbol, Any}( :name => "chatbox", :input => "What type of wine characteristics are you looking for? (e.g. t.e.g. tannin level, sweetness, intensity, acidity)" ), :observation_5 => "I like full-bodied Red wine with low tannin.", :thought_6 => "Now that I have more information about the customer's preferences, it's time to make a recommendation.", :action_6 => Dict{Symbol, Any}( :name => "recommendbox", :input => "El Enemigo Cabernet Franc 2019" ), :observation_6 => "I don't like the one you recommend. I want dry wine." ) result = YiemAgent.reflector(a, input)