{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "8f210ec3",
   "metadata": {},
   "source": [
    "# Shell (bash)\n",
    "\n",
    "Giving agents access to the shell is powerful (though risky outside a sandboxed environment).\n",
    "\n",
    "The LLM can use it to execute any shell commands. A common use case for this is letting the LLM interact with your local file system.\n",
    "\n",
    "**Note:** Shell tool does not work with Windows OS."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "f7b3767b",
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "from langchain.tools import ShellTool\n",
    "\n",
    "shell_tool = ShellTool()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "c92ac832-556b-4f66-baa4-b78f965dfba0",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Hello World!\n",
      "\n",
      "real\t0m0.000s\n",
      "user\t0m0.000s\n",
      "sys\t0m0.000s\n",
      "\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/wfh/code/lc/lckg/langchain/tools/shell/tool.py:34: UserWarning: The shell tool has no safeguards by default. Use at your own risk.\n",
      "  warnings.warn(\n"
     ]
    }
   ],
   "source": [
    "print(shell_tool.run({\"commands\": [\"echo 'Hello World!'\", \"time\"]}))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2fa952fc",
   "metadata": {},
   "source": [
    "### Use with Agents\n",
    "\n",
    "As with all tools, these can be given to an agent to accomplish more complex tasks. Let's have the agent fetch some links from a web page."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "851fee9f",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "\n",
      "\u001b[1m> Entering new AgentExecutor chain...\u001b[0m\n",
      "\u001b[32;1m\u001b[1;3mQuestion: What is the task?\n",
      "Thought: We need to download the langchain.com webpage and extract all the URLs from it. Then we need to sort the URLs and return them.\n",
      "Action:\n",
      "```\n",
      "{\n",
      "  \"action\": \"shell\",\n",
      "  \"action_input\": {\n",
      "    \"commands\": [\n",
      "      \"curl -s https://langchain.com | grep -o 'http[s]*://[^\\\" ]*' | sort\"\n",
      "    ]\n",
      "  }\n",
      "}\n",
      "```\n",
      "\u001b[0m"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/wfh/code/lc/lckg/langchain/tools/shell/tool.py:34: UserWarning: The shell tool has no safeguards by default. Use at your own risk.\n",
      "  warnings.warn(\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "Observation: \u001b[36;1m\u001b[1;3mhttps://blog.langchain.dev/\n",
      "https://discord.gg/6adMQxSpJS\n",
      "https://docs.langchain.com/docs/\n",
      "https://github.com/hwchase17/chat-langchain\n",
      "https://github.com/hwchase17/langchain\n",
      "https://github.com/hwchase17/langchainjs\n",
      "https://github.com/sullivan-sean/chat-langchainjs\n",
      "https://js.langchain.com/docs/\n",
      "https://python.langchain.com/en/latest/\n",
      "https://twitter.com/langchainai\n",
      "\u001b[0m\n",
      "Thought:\u001b[32;1m\u001b[1;3mThe URLs have been successfully extracted and sorted. We can return the list of URLs as the final answer.\n",
      "Final Answer: [\"https://blog.langchain.dev/\", \"https://discord.gg/6adMQxSpJS\", \"https://docs.langchain.com/docs/\", \"https://github.com/hwchase17/chat-langchain\", \"https://github.com/hwchase17/langchain\", \"https://github.com/hwchase17/langchainjs\", \"https://github.com/sullivan-sean/chat-langchainjs\", \"https://js.langchain.com/docs/\", \"https://python.langchain.com/en/latest/\", \"https://twitter.com/langchainai\"]\u001b[0m\n",
      "\n",
      "\u001b[1m> Finished chain.\u001b[0m\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "'[\"https://blog.langchain.dev/\", \"https://discord.gg/6adMQxSpJS\", \"https://docs.langchain.com/docs/\", \"https://github.com/hwchase17/chat-langchain\", \"https://github.com/hwchase17/langchain\", \"https://github.com/hwchase17/langchainjs\", \"https://github.com/sullivan-sean/chat-langchainjs\", \"https://js.langchain.com/docs/\", \"https://python.langchain.com/en/latest/\", \"https://twitter.com/langchainai\"]'"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from langchain.agents import AgentType, initialize_agent\n",
    "from langchain.chat_models import ChatOpenAI\n",
    "\n",
    "llm = ChatOpenAI(temperature=0)\n",
    "\n",
    "shell_tool.description = shell_tool.description + f\"args {shell_tool.args}\".replace(\n",
    "    \"{\", \"{{\"\n",
    ").replace(\"}\", \"}}\")\n",
    "self_ask_with_search = initialize_agent(\n",
    "    [shell_tool], llm, agent=AgentType.CHAT_ZERO_SHOT_REACT_DESCRIPTION, verbose=True\n",
    ")\n",
    "self_ask_with_search.run(\n",
    "    \"Download the langchain.com webpage and grep for all urls. Return only a sorted list of them. Be sure to use double quotes.\"\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "8d0ea3ac-0890-4e39-9cec-74bd80b4b8b8",
   "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.10.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
