{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "bfe18e28",
   "metadata": {},
   "source": [
    "# Serialization\n",
    "\n",
    "This notebook goes over how to serialize agents. For this notebook, it is important to understand the distinction we draw between `agents` and `tools`. An agent is the LLM powered decision maker that decides which actions to take and in which order. Tools are various instruments (functions) an agent has access to, through which an agent can interact with the outside world. When people generally use agents, they primarily talk about using an agent WITH tools. However, when we talk about serialization of agents, we are talking about the agent by itself. We plan to add support for serializing an agent WITH tools sometime in the future.\n",
    "\n",
    "Let's start by creating an agent with tools as we normally do:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "eb729f16",
   "metadata": {},
   "outputs": [],
   "source": [
    "from langchain.agents import load_tools\n",
    "from langchain.agents import initialize_agent\n",
    "from langchain.llms import OpenAI\n",
    "\n",
    "llm = OpenAI(temperature=0)\n",
    "tools = load_tools([\"serpapi\", \"llm-math\"], llm=llm)\n",
    "agent = initialize_agent(tools, llm, agent=\"zero-shot-react-description\", verbose=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0578f566",
   "metadata": {},
   "source": [
    "Let's now serialize the agent. To be explicit that we are serializing ONLY the agent, we will call the `save_agent` method."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "dc544de6",
   "metadata": {},
   "outputs": [],
   "source": [
    "agent.save_agent('agent.json')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "62dd45bf",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{\r\n",
      "    \"llm_chain\": {\r\n",
      "        \"memory\": null,\r\n",
      "        \"verbose\": false,\r\n",
      "        \"prompt\": {\r\n",
      "            \"input_variables\": [\r\n",
      "                \"input\",\r\n",
      "                \"agent_scratchpad\"\r\n",
      "            ],\r\n",
      "            \"output_parser\": null,\r\n",
      "            \"template\": \"Answer the following questions as best you can. You have access to the following tools:\\n\\nSearch: A search engine. Useful for when you need to answer questions about current events. Input should be a search query.\\nCalculator: Useful for when you need to answer questions about math.\\n\\nUse the following format:\\n\\nQuestion: the input question you must answer\\nThought: you should always think about what to do\\nAction: the action to take, should be one of [Search, Calculator]\\nAction Input: the input to the action\\nObservation: the result of the action\\n... (this Thought/Action/Action Input/Observation can repeat N times)\\nThought: I now know the final answer\\nFinal Answer: the final answer to the original input question\\n\\nBegin!\\n\\nQuestion: {input}\\nThought:{agent_scratchpad}\",\r\n",
      "            \"template_format\": \"f-string\",\r\n",
      "            \"validate_template\": true,\r\n",
      "            \"_type\": \"prompt\"\r\n",
      "        },\r\n",
      "        \"llm\": {\r\n",
      "            \"model_name\": \"text-davinci-003\",\r\n",
      "            \"temperature\": 0.0,\r\n",
      "            \"max_tokens\": 256,\r\n",
      "            \"top_p\": 1,\r\n",
      "            \"frequency_penalty\": 0,\r\n",
      "            \"presence_penalty\": 0,\r\n",
      "            \"n\": 1,\r\n",
      "            \"best_of\": 1,\r\n",
      "            \"request_timeout\": null,\r\n",
      "            \"logit_bias\": {},\r\n",
      "            \"_type\": \"openai\"\r\n",
      "        },\r\n",
      "        \"output_key\": \"text\",\r\n",
      "        \"_type\": \"llm_chain\"\r\n",
      "    },\r\n",
      "    \"allowed_tools\": [\r\n",
      "        \"Search\",\r\n",
      "        \"Calculator\"\r\n",
      "    ],\r\n",
      "    \"return_values\": [\r\n",
      "        \"output\"\r\n",
      "    ],\r\n",
      "    \"_type\": \"zero-shot-react-description\"\r\n",
      "}"
     ]
    }
   ],
   "source": [
    "!cat agent.json"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0eb72510",
   "metadata": {},
   "source": [
    "We can now load the agent back in"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "eb660b76",
   "metadata": {},
   "outputs": [],
   "source": [
    "agent = initialize_agent(tools, llm, agent_path=\"agent.json\", verbose=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "aa624ea5",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
