diff --git a/fern/pages/cookbooks/multi-purpose-agent.mdx b/fern/pages/cookbooks/multi-purpose-agent.mdx index dad9473ac..f005c0a31 100644 --- a/fern/pages/cookbooks/multi-purpose-agent.mdx +++ b/fern/pages/cookbooks/multi-purpose-agent.mdx @@ -2,7 +2,7 @@ title: Agentic RAG with an Evaluator, Web Search, Human Input, and Python Tool. slug: /page/multi-purpose-agent -description: "" +description: "This page describes how to build a powerful, multi-stage agent with the Cohere platform." image: "" keywords: "" --- diff --git a/notebooks/agents/Vanilla_Multi_Step_Tool_Use.ipynb b/notebooks/agents/Vanilla_Multi_Step_Tool_Use.ipynb index 550e7d87f..6bb5d60df 100644 --- a/notebooks/agents/Vanilla_Multi_Step_Tool_Use.ipynb +++ b/notebooks/agents/Vanilla_Multi_Step_Tool_Use.ipynb @@ -1,21 +1,10 @@ { - "nbformat": 4, - "nbformat_minor": 0, - "metadata": { - "colab": { - "provenance": [] - }, - "kernelspec": { - "name": "python3", - "display_name": "Python 3" - }, - "language_info": { - "name": "python" - } - }, "cells": [ { "cell_type": "markdown", + "metadata": { + "id": "aH1iAdZiURXh" + }, "source": [ "# Multi-Step Tool Use\n", "\n", @@ -24,19 +13,16 @@ "Multi-step tool use is an extension of this basic idea, and allows the model to call more than one tool in a sequence of steps, using the results from one tool call in a subsequent step. This process allows the language model to reason, perform dynamic actions, and quickly adapt on the basis of information coming from external sources.\n", "\n", "The recommended way to achieve [multi-step tool use with Cohere](https://docs.cohere.com/docs/multi-step-tool-use) is by leveraging the [Langchain framework](https://python.langchain.com/docs/integrations/providers/cohere#react-agent) in Python." - ], - "metadata": { - "id": "aH1iAdZiURXh" - } + ] }, { "cell_type": "markdown", - "source": [ - "## Install Dependencies" - ], "metadata": { "id": "PVT6Sl3msjNe" - } + }, + "source": [ + "## Install Dependencies" + ] }, { "cell_type": "code", @@ -50,8 +36,8 @@ }, "outputs": [ { - "output_type": "stream", "name": "stdout", + "output_type": "stream", "text": [ "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m812.8/812.8 kB\u001b[0m \u001b[31m6.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m194.1/194.1 kB\u001b[0m \u001b[31m4.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", @@ -76,19 +62,22 @@ }, { "cell_type": "code", - "source": [ - "# LLM\n", - "import os\n", - "os.environ['COHERE_API_KEY'] = " - ], + "execution_count": 2, "metadata": { "id": "K0GELKJVnadW" }, - "execution_count": 2, - "outputs": [] + "outputs": [], + "source": [ + "# LLM\n", + "import os\n", + "os.environ['COHERE_API_KEY'] = \"\"" + ] }, { "cell_type": "markdown", + "metadata": { + "id": "6l1pDbAmsptW" + }, "source": [ "## Define tools\n", "\n", @@ -100,23 +89,25 @@ "- and/or directly answering [ this tool comes out of the box! ]\n", "\n", "Plus the model can self-reflect." - ], - "metadata": { - "id": "6l1pDbAmsptW" - } + ] }, { "cell_type": "markdown", + "metadata": { + "id": "_9riBTvIVnaN" + }, "source": [ "#### Web search\n", "You can easily equip your agent with web search!" - ], - "metadata": { - "id": "_9riBTvIVnaN" - } + ] }, { "cell_type": "code", + "execution_count": 3, + "metadata": { + "id": "6wMNTOGNVvwA" + }, + "outputs": [], "source": [ "from langchain_community.tools.tavily_search import TavilySearchResults\n", "\n", @@ -131,50 +122,50 @@ "class TavilySearchInput(BaseModel):\n", " query: str = Field(description=\"Query to search the internet with\")\n", "internet_search.args_schema = TavilySearchInput" - ], - "metadata": { - "id": "6wMNTOGNVvwA" - }, - "execution_count": 3, - "outputs": [] + ] }, { "cell_type": "markdown", + "metadata": { + "id": "pax1SemzX6Kg" + }, "source": [ "#### Vector store\n", "You can easily equip your agent with a vector store!" - ], - "metadata": { - "id": "pax1SemzX6Kg" - } + ] }, { "cell_type": "code", - "source": [ - "!pip --quiet install faiss-cpu tiktoken" - ], + "execution_count": 4, "metadata": { - "id": "cc4d4pRFndYu", "colab": { "base_uri": "https://localhost:8080/" }, + "id": "cc4d4pRFndYu", "outputId": "6478fd6b-5618-4d0b-8928-44f78e3ca7e6" }, - "execution_count": 4, "outputs": [ { - "output_type": "stream", "name": "stdout", + "output_type": "stream", "text": [ "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m27.0/27.0 MB\u001b[0m \u001b[31m41.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.8/1.8 MB\u001b[0m \u001b[31m58.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25h" ] } + ], + "source": [ + "!pip --quiet install faiss-cpu tiktoken" ] }, { "cell_type": "code", + "execution_count": 5, + "metadata": { + "id": "eqcorKP4YEH6" + }, + "outputs": [], "source": [ "from langchain.text_splitter import RecursiveCharacterTextSplitter\n", "from langchain_community.document_loaders import WebBaseLoader\n", @@ -206,15 +197,15 @@ ")\n", "\n", "vectorstore_retriever = vectorstore.as_retriever()\n" - ], - "metadata": { - "id": "eqcorKP4YEH6" - }, - "execution_count": 5, - "outputs": [] + ] }, { "cell_type": "code", + "execution_count": 6, + "metadata": { + "id": "eQFNJ-38abRd" + }, + "outputs": [], "source": [ "from langchain.tools.retriever import create_retriever_tool\n", "\n", @@ -223,25 +214,25 @@ " name=\"vectorstore_search\",\n", " description=\"Retrieve relevant info from a vectorstore that contains information from Paul Graham about how to write good essays.\"\n", ")" - ], - "metadata": { - "id": "eQFNJ-38abRd" - }, - "execution_count": 6, - "outputs": [] + ] }, { "cell_type": "markdown", + "metadata": { + "id": "aB90i9W5YqWi" + }, "source": [ "#### Python interpreter tool\n", "You can easily equip your agent with a python interpreter!" - ], - "metadata": { - "id": "aB90i9W5YqWi" - } + ] }, { "cell_type": "code", + "execution_count": 7, + "metadata": { + "id": "AN-4FqXKYEFw" + }, + "outputs": [], "source": [ "from langchain.agents import Tool\n", "from langchain_experimental.utilities import PythonREPL\n", @@ -258,34 +249,34 @@ "class ToolInput(BaseModel):\n", " code: str = Field(description=\"Python code to execute.\")\n", "python_tool.args_schema = ToolInput" - ], - "metadata": { - "id": "AN-4FqXKYEFw" - }, - "execution_count": 7, - "outputs": [] + ] }, { "cell_type": "code", - "source": [], + "execution_count": 7, "metadata": { "id": "8vj868w_YED_" }, - "execution_count": 7, - "outputs": [] + "outputs": [], + "source": [] }, { "cell_type": "markdown", + "metadata": { + "id": "2SDCaoypexGL" + }, "source": [ "#### Transform any Python function in a Tool\n", "You can easily equip your agent with any Python function!" - ], - "metadata": { - "id": "2SDCaoypexGL" - } + ] }, { "cell_type": "code", + "execution_count": 8, + "metadata": { + "id": "DYUJT2xKewny" + }, + "outputs": [], "source": [ "from langchain_core.tools import tool\n", "import random\n", @@ -307,27 +298,27 @@ " a: int = Field(description=\"First input\")\n", " b: int = Field(description=\"Second input\")\n", "random_operation_tool.args_schema = random_operation_inputs" - ], - "metadata": { - "id": "DYUJT2xKewny" - }, - "execution_count": 8, - "outputs": [] + ] }, { "cell_type": "markdown", + "metadata": { + "id": "hcspRBsRY2ED" + }, "source": [ "## Create ReAct Agent\n", "\n", "The model can smartly pick the right tool(s) for the user query, call them in any sequence, analyze the results and self-reflect. \n", "Once the model considers it has enough information to answer the user question, it generates the final answer." - ], - "metadata": { - "id": "hcspRBsRY2ED" - } + ] }, { "cell_type": "code", + "execution_count": 13, + "metadata": { + "id": "CY83aAprYECO" + }, + "outputs": [], "source": [ "from langchain.agents import AgentExecutor\n", "from langchain_cohere.react_multi_hop.agent import create_cohere_react_agent\n", @@ -355,44 +346,30 @@ ")\n", "\n", "agent_executor = AgentExecutor(agent=agent, tools=[internet_search, vectorstore_search, python_tool, random_operation_tool], verbose=True)" - ], - "metadata": { - "id": "CY83aAprYECO" - }, - "execution_count": 13, - "outputs": [] + ] }, { "cell_type": "code", - "source": [], + "execution_count": 13, "metadata": { "id": "RK0NaqngYD_J" }, - "execution_count": 13, - "outputs": [] + "outputs": [], + "source": [] }, { "cell_type": "markdown", + "metadata": { + "id": "mzTQcVXSaBe7" + }, "source": [ "## Ask a standalone question to the ReAct agent\n", "A question that requires using a predefined tool from Langchain" - ], - "metadata": { - "id": "mzTQcVXSaBe7" - } + ] }, { "cell_type": "code", - "source": [ - "response = agent_executor.invoke({\n", - " \"input\": \"I want to write an essay about the Roman Empire. Any tips for writing an essay? Any fun facts?\",\n", - " \"preamble\": preamble,\n", - "})\n", - "\n", - "response['output']\n", - "\n", - "# note that the model smartly looks in the vector db, and then online" - ], + "execution_count": 14, "metadata": { "colab": { "base_uri": "https://localhost:8080/", @@ -401,11 +378,10 @@ "id": "rR2hWVp-aEsU", "outputId": "fcf9b8b3-7027-4679-c06d-ef166f016892" }, - "execution_count": 14, "outputs": [ { - "output_type": "stream", "name": "stdout", + "output_type": "stream", "text": [ "\n", "\n", @@ -580,50 +556,51 @@ ] }, { - "output_type": "execute_result", "data": { - "text/plain": [ - "\"Here are some tips for writing an essay:\\n- Start with a question that spurs some response.\\n- Don't choose a topic at random, make sure you have a way in, a new insight or approach.\\n- You don't need a complete thesis, just a gap to explore.\\n- You can get ideas by talking to people, reading, doing and building things, and going places and seeing things.\\n- You can improve the quality of your ideas by increasing the breadth and depth of what goes in.\\n- You can get breadth by reading and talking about a wide range of topics.\\n- You can get depth by doing and having to solve problems.\\n- You can also get ideas by talking to people who make you have new ideas.\\n\\nHere are some fun facts about the Roman Empire:\\n- At its peak, the empire stretched from North Africa to Britain, reigning over 60 million people.\\n- The story of Rome's warrior founder and the twins and their wolf step-mother was depicted on Rome's first coins.\\n- The Crossing of the Rhine in 405/6 AD brought around 100,000 barbarians into the Empire.\"" - ], "application/vnd.google.colaboratory.intrinsic+json": { "type": "string" - } + }, + "text/plain": [ + "\"Here are some tips for writing an essay:\\n- Start with a question that spurs some response.\\n- Don't choose a topic at random, make sure you have a way in, a new insight or approach.\\n- You don't need a complete thesis, just a gap to explore.\\n- You can get ideas by talking to people, reading, doing and building things, and going places and seeing things.\\n- You can improve the quality of your ideas by increasing the breadth and depth of what goes in.\\n- You can get breadth by reading and talking about a wide range of topics.\\n- You can get depth by doing and having to solve problems.\\n- You can also get ideas by talking to people who make you have new ideas.\\n\\nHere are some fun facts about the Roman Empire:\\n- At its peak, the empire stretched from North Africa to Britain, reigning over 60 million people.\\n- The story of Rome's warrior founder and the twins and their wolf step-mother was depicted on Rome's first coins.\\n- The Crossing of the Rhine in 405/6 AD brought around 100,000 barbarians into the Empire.\"" + ] }, + "execution_count": 14, "metadata": {}, - "execution_count": 14 + "output_type": "execute_result" } + ], + "source": [ + "response = agent_executor.invoke({\n", + " \"input\": \"I want to write an essay about the Roman Empire. Any tips for writing an essay? Any fun facts?\",\n", + " \"preamble\": preamble,\n", + "})\n", + "\n", + "response['output']\n", + "\n", + "# note that the model smartly looks in the vector db, and then online" ] }, { "cell_type": "code", - "source": [], + "execution_count": 14, "metadata": { "id": "DIP1YkXCg7rQ" }, - "execution_count": 14, - "outputs": [] + "outputs": [], + "source": [] }, { "cell_type": "markdown", - "source": [ - "A question that requires the large language model to use a custom tool." - ], "metadata": { "id": "FhwS3VHvg3_l" - } + }, + "source": [ + "A question that requires the large language model to use a custom tool." + ] }, { "cell_type": "code", - "source": [ - "response = agent_executor.invoke({\n", - " \"input\": \"Calculate the result of the random operation of 10 and 20. Then find a few fun facts about that number, as well as its prime factors.\",\n", - " \"preamble\": preamble,\n", - "})\n", - "\n", - "response['output']\n", - "\n", - "# note that the model uses a sequence of tools" - ], + "execution_count": 22, "metadata": { "colab": { "base_uri": "https://localhost:8080/", @@ -632,11 +609,10 @@ "id": "79Dw6Zhrg3xI", "outputId": "a41c6de9-cb64-4cff-a58b-e9481d438f6c" }, - "execution_count": 22, "outputs": [ { - "output_type": "stream", "name": "stdout", + "output_type": "stream", "text": [ "\n", "\n", @@ -672,50 +648,51 @@ ] }, { - "output_type": "execute_result", "data": { - "text/plain": [ - "\"The result of the random operation is **200**. Here are some fun facts about the number 200:\\n- It is the smallest base 10 unprimeable number, meaning it cannot be turned into a prime number by changing just one of its digits to any other digit.\\n- According to Bullinger's study of biblical literature, the number 200 signifies 'insufficiency'.\\n- The number 200 is an even composite number composed of two distinct primes.\\n\\nThe prime factors of 200 are 2 and 5.\"" - ], "application/vnd.google.colaboratory.intrinsic+json": { "type": "string" - } + }, + "text/plain": [ + "\"The result of the random operation is **200**. Here are some fun facts about the number 200:\\n- It is the smallest base 10 unprimeable number, meaning it cannot be turned into a prime number by changing just one of its digits to any other digit.\\n- According to Bullinger's study of biblical literature, the number 200 signifies 'insufficiency'.\\n- The number 200 is an even composite number composed of two distinct primes.\\n\\nThe prime factors of 200 are 2 and 5.\"" + ] }, + "execution_count": 22, "metadata": {}, - "execution_count": 22 + "output_type": "execute_result" } + ], + "source": [ + "response = agent_executor.invoke({\n", + " \"input\": \"Calculate the result of the random operation of 10 and 20. Then find a few fun facts about that number, as well as its prime factors.\",\n", + " \"preamble\": preamble,\n", + "})\n", + "\n", + "response['output']\n", + "\n", + "# note that the model uses a sequence of tools" ] }, { "cell_type": "code", - "source": [], + "execution_count": 15, "metadata": { "id": "V8LcAh8vaEqR" }, - "execution_count": 15, - "outputs": [] + "outputs": [], + "source": [] }, { "cell_type": "markdown", - "source": [ - "A question that requires the large language model to directly answer." - ], "metadata": { "id": "n9nV_jiaAaD1" - } + }, + "source": [ + "A question that requires the large language model to directly answer." + ] }, { "cell_type": "code", - "source": [ - "response = agent_executor.invoke({\n", - " \"input\": \"Hey how are you?\",\n", - " \"preamble\": preamble,\n", - "})\n", - "\n", - "response['output']\n", - "\n", - "# note that the modle can directly answer!" - ], + "execution_count": 23, "metadata": { "colab": { "base_uri": "https://localhost:8080/", @@ -724,11 +701,10 @@ "id": "tRf6V3gJAZkO", "outputId": "aec1acdb-876c-48e9-a1f5-e3ba8a0f19ed" }, - "execution_count": 23, "outputs": [ { - "output_type": "stream", "name": "stdout", + "output_type": "stream", "text": [ "\n", "\n", @@ -745,49 +721,52 @@ ] }, { - "output_type": "execute_result", "data": { - "text/plain": [ - "\"I'm an AI chatbot, so I don't have feelings as such, but I'm here to help you with your queries. How can I help?\"" - ], "application/vnd.google.colaboratory.intrinsic+json": { "type": "string" - } + }, + "text/plain": [ + "\"I'm an AI chatbot, so I don't have feelings as such, but I'm here to help you with your queries. How can I help?\"" + ] }, + "execution_count": 23, "metadata": {}, - "execution_count": 23 + "output_type": "execute_result" } + ], + "source": [ + "response = agent_executor.invoke({\n", + " \"input\": \"Hey how are you?\",\n", + " \"preamble\": preamble,\n", + "})\n", + "\n", + "response['output']\n", + "\n", + "# note that the modle can directly answer!" ] }, { "cell_type": "code", - "source": [], + "execution_count": null, "metadata": { "id": "hnLkln_ckYXJ" }, - "execution_count": null, - "outputs": [] + "outputs": [], + "source": [] }, { "cell_type": "markdown", + "metadata": { + "id": "3h-icRL2_5iu" + }, "source": [ "## Ask a more complex question to the ReAct agent\n", "A question that requires using multipe tools, in sequence" - ], - "metadata": { - "id": "3h-icRL2_5iu" - } + ] }, { "cell_type": "code", - "source": [ - "response = agent_executor.invoke({\n", - " \"input\": \"In what year was the company that was founded as Sound of Music went public? What was its stock price in 2000 and 2010.\",\n", - " \"preamble\": preamble,\n", - "})\n", - "\n", - "response['output']" - ], + "execution_count": 27, "metadata": { "colab": { "base_uri": "https://localhost:8080/", @@ -796,11 +775,10 @@ "id": "Q4IyoXXRaEoL", "outputId": "0e935f68-8b7c-4d9a-b8f1-1be57b7c9a1f" }, - "execution_count": 27, "outputs": [ { - "output_type": "stream", "name": "stdout", + "output_type": "stream", "text": [ "\n", "\n", @@ -822,41 +800,54 @@ ] }, { - "output_type": "execute_result", "data": { - "text/plain": [ - "'Best Buy, which was founded as Sound of Music, went public in 1985. Its stock price in 2000 was between $5.93 and $16.24 and in 2010, it was between $20.27 and $31.24.'" - ], "application/vnd.google.colaboratory.intrinsic+json": { "type": "string" - } + }, + "text/plain": [ + "'Best Buy, which was founded as Sound of Music, went public in 1985. Its stock price in 2000 was between $5.93 and $16.24 and in 2010, it was between $20.27 and $31.24.'" + ] }, + "execution_count": 27, "metadata": {}, - "execution_count": 27 + "output_type": "execute_result" } + ], + "source": [ + "response = agent_executor.invoke({\n", + " \"input\": \"In what year was the company that was founded as Sound of Music went public? What was its stock price in 2000 and 2010.\",\n", + " \"preamble\": preamble,\n", + "})\n", + "\n", + "response['output']" ] }, { "cell_type": "code", - "source": [], + "execution_count": null, "metadata": { "id": "L1BsKueTaEmg" }, - "execution_count": null, - "outputs": [] + "outputs": [], + "source": [] }, { "cell_type": "markdown", + "metadata": { + "id": "53FDSFzQBFyf" + }, "source": [ "## Have a multi-turn conversation with the ReAct agent\n", "The chat history enables you to have multi-turn conversations with the ReAct agent." - ], - "metadata": { - "id": "53FDSFzQBFyf" - } + ] }, { "cell_type": "code", + "execution_count": 28, + "metadata": { + "id": "1iYyAExsaEk9" + }, + "outputs": [], "source": [ "# Step 1: Construct the chat history as a list of LangChain Messages, ending with the last user message\n", "from langchain_core.messages import HumanMessage, AIMessage\n", @@ -868,15 +859,15 @@ "]\n", "\n", "prompt = ChatPromptTemplate.from_messages(chat_history)" - ], - "metadata": { - "id": "1iYyAExsaEk9" - }, - "execution_count": 28, - "outputs": [] + ] }, { "cell_type": "code", + "execution_count": 29, + "metadata": { + "id": "fyv_1LedaEi7" + }, + "outputs": [], "source": [ "# Step 2: When you make the agent, specify the chat_history as the prompt, e.g.\n", "# Create the ReAct agent\n", @@ -887,36 +878,23 @@ ")\n", "\n", "agent_executor = AgentExecutor(agent=agent, tools=[internet_search, vectorstore_search, python_tool], verbose=True)" - ], - "metadata": { - "id": "fyv_1LedaEi7" - }, - "execution_count": 29, - "outputs": [] + ] }, { "cell_type": "code", - "source": [ - "# Step 3: When you invoke the agent_executor there's no need to pass anything else into invoke\n", - "response = agent_executor.invoke({\n", - " \"preamble\": preamble,\n", - "})\n", - "\n", - "response['output']" - ], + "execution_count": 30, "metadata": { - "id": "-ZCFj-m5nqFw", "colab": { "base_uri": "https://localhost:8080/", "height": 538 }, + "id": "-ZCFj-m5nqFw", "outputId": "3d71931e-1644-49b9-903c-4ff117787868" }, - "execution_count": 30, "outputs": [ { - "output_type": "stream", "name": "stdout", + "output_type": "stream", "text": [ "\n", "\n", @@ -943,37 +921,59 @@ ] }, { - "output_type": "execute_result", "data": { - "text/plain": [ - "\"Oracle's CRM offering includes the following:\\n- Marketing Cloud, which provides a comprehensive set of tools that cover a range of digital marketing needs, including cross-channel marketing, marketing automation, data management, content marketing and social media marketing\\n- CRM On Demand, which is a full-featured marketing automation product with features from lead management and nurturing, to measuring marketing ROI\\n- Siebel CRM, which delivers a combination of transactional, analytical, and engagement features to manage all customer-facing operations, with solutions tailored to more than 20 industries\\n- Siebel CRM Life Sciences, which provides personalised content delivery tools to help sales and marketing teams deliver the right messages during each customer interaction\\n- Oracle Client Experience (CX), a connected suite of tools that transcends standard CRM\"" - ], "application/vnd.google.colaboratory.intrinsic+json": { "type": "string" - } + }, + "text/plain": [ + "\"Oracle's CRM offering includes the following:\\n- Marketing Cloud, which provides a comprehensive set of tools that cover a range of digital marketing needs, including cross-channel marketing, marketing automation, data management, content marketing and social media marketing\\n- CRM On Demand, which is a full-featured marketing automation product with features from lead management and nurturing, to measuring marketing ROI\\n- Siebel CRM, which delivers a combination of transactional, analytical, and engagement features to manage all customer-facing operations, with solutions tailored to more than 20 industries\\n- Siebel CRM Life Sciences, which provides personalised content delivery tools to help sales and marketing teams deliver the right messages during each customer interaction\\n- Oracle Client Experience (CX), a connected suite of tools that transcends standard CRM\"" + ] }, + "execution_count": 30, "metadata": {}, - "execution_count": 30 + "output_type": "execute_result" } + ], + "source": [ + "# Step 3: When you invoke the agent_executor there's no need to pass anything else into invoke\n", + "response = agent_executor.invoke({\n", + " \"preamble\": preamble,\n", + "})\n", + "\n", + "response['output']" ] }, { "cell_type": "code", - "source": [], + "execution_count": 30, "metadata": { "id": "8Zh01M4hWw3L" }, - "execution_count": 30, - "outputs": [] + "outputs": [], + "source": [] }, { "cell_type": "code", - "source": [], + "execution_count": null, "metadata": { "id": "0qEPY6xj_qwr" }, - "execution_count": null, - "outputs": [] + "outputs": [], + "source": [] } - ] -} \ No newline at end of file + ], + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + }, + "language_info": { + "name": "python" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +}