{ "cells": [ { "cell_type": "markdown", "id": "8f210ec3", "metadata": {}, "source": [ "# Shell Tool\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." ] }, { "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.chat_models import ChatOpenAI\n", "from langchain.agents import initialize_agent\n", "from langchain.agents import AgentType\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.8.16" } }, "nbformat": 4, "nbformat_minor": 5 }