add_user_message() fails. called with List instead of a string.

### System Info

Here is the error call stack. The code is attached to this submission.
I did a workaround to prevent the crash. However, this is not the correct fix.
Hacked FIX
def add_user_message(self, message: str) -> None:
        """Add a user message to the store"""
        print(type(message))
        **if isinstance(message, list):
           message = message[0].content**
        self.add_message(HumanMessage(content=message))

---------------------------- Call Stack Error --------------------
Exception has occurred: ValidationError       (note: full exception trace is shown but execution is paused at: _run_module_as_main)
1 validation error for HumanMessage
content
  str type expected (type=type_error.str)
  File "/Users/randolphhill/anaconda3/envs/version2/lib/python3.10/site-packages/pydantic/main.py", line 341, in pydantic.main.BaseModel.__init__
    raise validation_error
  File "/Users/randolphhill/anaconda3/envs/version2/lib/python3.10/site-packages/langchain/schema.py", line 254, in add_user_message
    self.add_message(HumanMessage(content=message))
  File "/Users/randolphhill/anaconda3/envs/version2/lib/python3.10/site-packages/langchain/memory/chat_memory.py", line 35, in save_context
    self.chat_memory.add_user_message(input_str)
  File "/Users/randolphhill/anaconda3/envs/version2/lib/python3.10/site-packages/langchain/chains/base.py", line 191, in prep_outputs
    self.memory.save_context(inputs, outputs)
  File "/Users/randolphhill/anaconda3/envs/version2/lib/python3.10/site-packages/langchain/chains/base.py", line 142, in __call__
    return self.prep_outputs(inputs, outputs, return_only_outputs)
  File "/Users/randolphhill/gepetto/code/mpv1/version1/geppetto/maincontroller.py", line 96, in <module>
    eaes = agent(messages)
  File "/Users/randolphhill/anaconda3/envs/version2/lib/python3.10/runpy.py", line 86, in _run_code
    exec(code, run_globals)
  File "/Users/randolphhill/anaconda3/envs/version2/lib/python3.10/runpy.py", line 196, in _run_module_as_main (Current frame)
    return _run_code(code, main_globals, None,
pydantic.error_wrappers.ValidationError: 1 validation error for HumanMessage
content
  str type expected (type=type_error.str)



### Who can help?

_No response_

### Information

- [ ] The official example notebooks/scripts
- [ ] My own modified scripts

### Related Components

- [ ] LLMs/Chat Models
- [ ] Embedding Models
- [ ] Prompts / Prompt Templates / Prompt Selectors
- [ ] Output Parsers
- [ ] Document Loaders
- [ ] Vector Stores / Retrievers
- [ ] Memory
- [X] Agents / Agent Executors
- [X] Tools / Toolkits
- [ ] Chains
- [ ] Callbacks/Tracing
- [ ] Async

### Reproduction

from langchain.chat_models import ChatOpenAI
from langchain import SerpAPIWrapper
#from typing import Union
from langchain.agents import load_tools
from langchain.agents import initialize_agent
from langchain.agents import Tool
from langchain.chains.conversation.memory import ConversationBufferWindowMemory
from langchain.prompts.prompt import PromptTemplate
from langchain.tools import DuckDuckGoSearchRun
from langchain.schema import (
    SystemMessage,
    HumanMessage,
)
#Build Prompt
EXAMPLES = [
"Question: Is there a Thai restaurant in San Francisco?\nThought: I need to search for Thai restaurants in San Francisco.\nservation: Yes, there are several Thai restaurants located in San Francisco. Here are five examples: 1. Lers Ros Thai, 2. Kin Khao, 3. Farmhouse Kitchen Thai Cuisine, 4. Marnee Thai, 5. Osha Thai Restaurant.\nAction: Finished"
]

SUFFIX = """\nQuestion: {input}
{agent_scratchpad}"""
TEST_PROMPT = PromptTemplate.from_examples(
  EXAMPLES, SUFFIX, ["input", "agent_scratchpad"]
)
#print(TEST_PROMPT)






messages = [
    SystemMessage(content="You are a virtual librarian who stores search results, pdf and txt files. if a message cannot save, provide a file name based on the content of the message. File extension txt."),
#  AIMessage(content="I'm great thank you. How can I help you?"),
   HumanMessage(content="List 5 Thai resturants located in San Francisco that existed before September 2021.")
]

def ingestFile(filename:str):
    return f"{filename}ingested file cabinate middle drawer"

def saveText(msg:str):
    print("\nSEARCH RESULTS FILER !!!!\n",msg,"\n")
    try:
        with open("/tmp/file_name.txt", 'w') as file:
            file.write(msg)
        #print(f"Successfully written")
        return f"{msg}Information saved to thai.txt"
    except Exception as e:
        print(f"An error occurred: {e}")

#serpapi = SerpAPIWrapper()
serpapi = DuckDuckGoSearchRun()
search = Tool(
       name="Search",
       func=serpapi.run,
       description="Use to search for current events"
)
save = Tool(
     name="Save Text",
     func= saveText,
     description="used to save results of human request. File name will be created"
)
#tool_names = ["serpapi"]
#tools = load_tools(tool_names,search_filer)
ingestFile = Tool(
        name="Ingest-Save file",
        func= ingestFile,
        description="Used to store/ingest file in virtual file cabinet"
)
tools = [search,save,ingestFile]
type(tools)


    
chat = ChatOpenAI(
    #openai_api_key=OPENAI_API_KEY,
    temperature=0,
    #model='gpt-3.5-turbo'
    #prompt=TEST_PROMPT,
    model='gpt-4'
)
memory = ConversationBufferWindowMemory(
    memory_key='chat_history',
    k=20,
    return_messages=True
)

agent = initialize_agent(tools, chat,
                          #iagent="zero-shot-react-description",
                          agent='chat-conversational-react-description',
                          max_interations=5,
                          #output_parser=output_parser,
                          verbose=True,
                          max_iterations=3,
                          early_stopping_method='generate',
                          memory=memory)
eaes = agent(messages)
#res =agent(O"List 5 Thai resturants in San Franciso.")
#res = agent(messages)
print(res['output'])
res =agent("What time is it in London")
print(res['output'])
res =agent("Save the last  TWO LAST ANSWERS PROVIDEDi. Format answer First Answer: Second Answer:")
print("RESULTS OF LAST TWO\n",res['output'])
print("\n")
res =agent("Ingest the file nih.pdf")
print(res['output'])
res=agent("your state is now set to ready to analyze data")
print(res['output'])
res=agent("What is your current state")
print(res['output'])

### Expected behavior

Not to crash and return with message saved.