{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "57be1cc4-8d3d-4098-a1ae-a813428e7469",
   "metadata": {},
   "outputs": [],
   "source": [
    "import os\n",
    "from dotenv import load_dotenv, find_dotenv\n",
    "_ = load_dotenv(find_dotenv())\n",
    "openai_api_key = os.environ[\"OPENAI_API_KEY\"]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "be4e1727-7987-48bb-b416-65d29f3a5e4e",
   "metadata": {},
   "source": [
    "## Basic app to interact with an API"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "87d3fb35-a88d-400d-abb3-10614090d853",
   "metadata": {},
   "outputs": [],
   "source": [
    "from langchain_openai import OpenAI"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "aa959059-46fe-4f6f-ab37-73993f501020",
   "metadata": {},
   "outputs": [],
   "source": [
    "llm = OpenAI()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e490fdf1-7efc-49ef-bbfa-df7a93f6a28c",
   "metadata": {},
   "source": [
    "**Define the API documentation**\n",
    "<br>\n",
    "We are going to use a short version of the RestCountries API. \n",
    "<br>\n",
    "<br>\n",
    "*Important note: our app will only work with the endpoints we define below, althougt the original API has many more endpoints.*"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "9917d8de-d697-44b6-8a25-2b660efbac27",
   "metadata": {},
   "outputs": [],
   "source": [
    "api_docs = \"\"\"\n",
    "BASE URL: https://restcountries.com/\n",
    "\n",
    "API Documentation:\n",
    "\n",
    "The API endpoint /v3.1/name/{name} Used to find informatin about \n",
    "a country. All URL parameters are listed below:\n",
    "    - name: Name of country - Example: Italy, France\n",
    "    \n",
    "The API endpoint /v3.1/currency/{currency} Used to find information \n",
    "about a region. All URL parameters are listed below:\n",
    "    - currency: 3 letter currency. Example: USD, COP\n",
    "\n",
    "The API endpoint /v3.1/lang/{language} Used to find information \n",
    "about the official language of the country. All URL parameters \n",
    "are listed below:\n",
    "    - language: language of the country. Example: English, Spanish\n",
    "    \n",
    "\"\"\""
   ]
  },
  {
   "cell_type": "markdown",
   "id": "096a253e-e222-4ab8-bf3f-ae0aaf452ffc",
   "metadata": {},
   "source": [
    "**Create a chain to read the API documentation**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "f7753144-9bc1-4777-a226-fb82f2b92820",
   "metadata": {},
   "outputs": [],
   "source": [
    "from langchain.chains import APIChain"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "a46cbb72-ec98-4893-936c-bd83a187eeb2",
   "metadata": {},
   "outputs": [],
   "source": [
    "api_chain = APIChain.from_llm_and_api_docs(\n",
    "    llm=llm,\n",
    "    api_docs=api_docs,\n",
    "    verbose=True,\n",
    "    limit_to_domains=[\"https://restcountries.com/\"]\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "6814ccea-8b2b-478d-a772-de0870054eb4",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "005e6152-2ee9-4177-aa7a-05e81153bb24",
   "metadata": {},
   "source": [
    "**Ask a question about the API**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "ccf341a8-8be7-434b-a472-624a2ea30193",
   "metadata": {},
   "outputs": [],
   "source": [
    "question = \"Give me information about France in less than 100 words.\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "ccda0a6d-b8e9-457d-afad-a1498afd2fd4",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/juliocolomer/.pyenv/versions/3.11.4/envs/venv020124/lib/python3.11/site-packages/langchain_core/_api/deprecation.py:117: LangChainDeprecationWarning: The function `run` was deprecated in LangChain 0.1.0 and will be removed in 0.2.0. Use invoke instead.\n",
      "  warn_deprecated(\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "\n",
      "\u001b[1m> Entering new APIChain chain...\u001b[0m\n",
      "\u001b[32;1m\u001b[1;3m https://restcountries.com/v3.1/name/France?fields=name;capital;nativeName;population;borders;languages;currencies;timezones\u001b[0m\n",
      "\u001b[33;1m\u001b[1;3m[{\"name\":{\"common\":\"France\",\"official\":\"French Republic\",\"nativeName\":{\"fra\":{\"official\":\"République française\",\"common\":\"France\"}}}}]\u001b[0m\n",
      "\n",
      "\u001b[1m> Finished chain.\u001b[0m\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "' The name of the country is France, and its official name is the French Republic. The native name for France is \"République française\". The population and capital are not included in the response. The country shares borders with other countries and the official language is French. The currency used is not specified. The country follows multiple timezones.'"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "api_chain.run(question)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "39ce6acc-7a4d-461b-91aa-fc06ef7262e5",
   "metadata": {},
   "outputs": [],
   "source": [
    "question2 = \"\"\"\n",
    "List the top 3 biggest countries \n",
    "where the official language is French.\n",
    "\"\"\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "88156da6-f47d-4d82-a182-284497a5026a",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "\n",
      "\u001b[1m> Entering new APIChain chain...\u001b[0m\n",
      "\u001b[32;1m\u001b[1;3m https://restcountries.com/v3.1/lang/French?fields=name,capital,population&sort=-area&limit=3\u001b[0m\n",
      "\u001b[33;1m\u001b[1;3m[{\"name\":{\"common\":\"Madagascar\",\"official\":\"Republic of Madagascar\",\"nativeName\":{\"fra\":{\"official\":\"République de Madagascar\",\"common\":\"Madagascar\"},\"mlg\":{\"official\":\"Repoblikan'i Madagasikara\",\"common\":\"Madagasikara\"}}},\"capital\":[\"Antananarivo\"],\"population\":27691019},{\"name\":{\"common\":\"French Southern and Antarctic Lands\",\"official\":\"Territory of the French Southern and Antarctic Lands\",\"nativeName\":{\"fra\":{\"official\":\"Territoire des Terres australes et antarctiques françaises\",\"common\":\"Terres australes et antarctiques françaises\"}}},\"capital\":[\"Port-aux-Français\"],\"population\":400},{\"name\":{\"common\":\"Canada\",\"official\":\"Canada\",\"nativeName\":{\"eng\":{\"official\":\"Canada\",\"common\":\"Canada\"},\"fra\":{\"official\":\"Canada\",\"common\":\"Canada\"}}},\"capital\":[\"Ottawa\"],\"population\":38005238},{\"name\":{\"common\":\"Luxembourg\",\"official\":\"Grand Duchy of Luxembourg\",\"nativeName\":{\"deu\":{\"official\":\"Großherzogtum Luxemburg\",\"common\":\"Luxemburg\"},\"fra\":{\"official\":\"Grand-Duché de Luxembourg\",\"common\":\"Luxembourg\"},\"ltz\":{\"official\":\"Groussherzogtum Lëtzebuerg\",\"common\":\"Lëtzebuerg\"}}},\"capital\":[\"Luxembourg\"],\"population\":632275},{\"name\":{\"common\":\"Republic of the Congo\",\"official\":\"Republic of the Congo\",\"nativeName\":{\"fra\":{\"official\":\"République du Congo\",\"common\":\"République du Congo\"},\"kon\":{\"official\":\"Repubilika ya Kongo\",\"common\":\"Repubilika ya Kongo\"},\"lin\":{\"official\":\"Republíki ya Kongó\",\"common\":\"Republíki ya Kongó\"}}},\"capital\":[\"Brazzaville\"],\"population\":5657000},{\"name\":{\"common\":\"Mayotte\",\"official\":\"Department of Mayotte\",\"nativeName\":{\"fra\":{\"official\":\"Département de Mayotte\",\"common\":\"Mayotte\"}}},\"capital\":[\"Mamoudzou\"],\"population\":226915},{\"name\":{\"common\":\"Vanuatu\",\"official\":\"Republic of Vanuatu\",\"nativeName\":{\"bis\":{\"official\":\"Ripablik blong Vanuatu\",\"common\":\"Vanuatu\"},\"eng\":{\"official\":\"Republic of Vanuatu\",\"common\":\"Vanuatu\"},\"fra\":{\"official\":\"République de Vanuatu\",\"common\":\"Vanuatu\"}}},\"capital\":[\"Port Vila\"],\"population\":307150},{\"name\":{\"common\":\"Jersey\",\"official\":\"Bailiwick of Jersey\",\"nativeName\":{\"eng\":{\"official\":\"Bailiwick of Jersey\",\"common\":\"Jersey\"},\"fra\":{\"official\":\"Bailliage de Jersey\",\"common\":\"Jersey\"},\"nrf\":{\"official\":\"Bailliage dé Jèrri\",\"common\":\"Jèrri\"}}},\"capital\":[\"Saint Helier\"],\"population\":100800},{\"name\":{\"common\":\"Martinique\",\"official\":\"Martinique\",\"nativeName\":{\"fra\":{\"official\":\"Martinique\",\"common\":\"Martinique\"}}},\"capital\":[\"Fort-de-France\"],\"population\":378243},{\"name\":{\"common\":\"DR Congo\",\"official\":\"Democratic Republic of the Congo\",\"nativeName\":{\"fra\":{\"official\":\"République démocratique du Congo\",\"common\":\"RD Congo\"},\"kon\":{\"official\":\"Repubilika ya Kongo Demokratiki\",\"common\":\"Repubilika ya Kongo Demokratiki\"},\"lin\":{\"official\":\"Republiki ya Kongó Demokratiki\",\"common\":\"Republiki ya Kongó Demokratiki\"},\"lua\":{\"official\":\"Ditunga dia Kongu wa Mungalaata\",\"common\":\"Ditunga dia Kongu wa Mungalaata\"},\"swa\":{\"official\":\"Jamhuri ya Kidemokrasia ya Kongo\",\"common\":\"Jamhuri ya Kidemokrasia ya Kongo\"}}},\"capital\":[\"Kinshasa\"],\"population\":108407721},{\"name\":{\"common\":\"Gabon\",\"official\":\"Gabonese Republic\",\"nativeName\":{\"fra\":{\"official\":\"République gabonaise\",\"common\":\"Gabon\"}}},\"capital\":[\"Libreville\"],\"population\":2225728},{\"name\":{\"common\":\"France\",\"official\":\"French Republic\",\"nativeName\":{\"fra\":{\"official\":\"République française\",\"common\":\"France\"}}},\"capital\":[\"Paris\"],\"population\":67391582},{\"name\":{\"common\":\"Mali\",\"official\":\"Republic of Mali\",\"nativeName\":{\"fra\":{\"official\":\"République du Mali\",\"common\":\"Mali\"}}},\"capital\":[\"Bamako\"],\"population\":20250834},{\"name\":{\"common\":\"Burundi\",\"official\":\"Republic of Burundi\",\"nativeName\":{\"fra\":{\"official\":\"République du Burundi\",\"common\":\"Burundi\"},\"run\":{\"official\":\"Republika y'Uburundi \",\"common\":\"Uburundi\"}}},\"capital\":[\"Gitega\"],\"population\":11890781},{\"name\":{\"common\":\"Belgium\",\"official\":\"Kingdom of Belgium\",\"nativeName\":{\"deu\":{\"official\":\"Königreich Belgien\",\"common\":\"Belgien\"},\"fra\":{\"official\":\"Royaume de Belgique\",\"common\":\"Belgique\"},\"nld\":{\"official\":\"Koninkrijk België\",\"common\":\"België\"}}},\"capital\":[\"Brussels\"],\"population\":11555997},{\"name\":{\"common\":\"Switzerland\",\"official\":\"Swiss Confederation\",\"nativeName\":{\"fra\":{\"official\":\"Confédération suisse\",\"common\":\"Suisse\"},\"gsw\":{\"official\":\"Schweizerische Eidgenossenschaft\",\"common\":\"Schweiz\"},\"ita\":{\"official\":\"Confederazione Svizzera\",\"common\":\"Svizzera\"},\"roh\":{\"official\":\"Confederaziun svizra\",\"common\":\"Svizra\"}}},\"capital\":[\"Bern\"],\"population\":8654622},{\"name\":{\"common\":\"Equatorial Guinea\",\"official\":\"Republic of Equatorial Guinea\",\"nativeName\":{\"fra\":{\"official\":\"République de la Guinée Équatoriale\",\"common\":\"Guinée équatoriale\"},\"por\":{\"official\":\"República da Guiné Equatorial\",\"common\":\"Guiné Equatorial\"},\"spa\":{\"official\":\"República de Guinea Ecuatorial\",\"common\":\"Guinea Ecuatorial\"}}},\"capital\":[\"Malabo\"],\"population\":1402985},{\"name\":{\"common\":\"Guadeloupe\",\"official\":\"Guadeloupe\",\"nativeName\":{\"fra\":{\"official\":\"Guadeloupe\",\"common\":\"Guadeloupe\"}}},\"capital\":[\"Basse-Terre\"],\"population\":400132},{\"name\":{\"common\":\"Guernsey\",\"official\":\"Bailiwick of Guernsey\",\"nativeName\":{\"eng\":{\"official\":\"Bailiwick of Guernsey\",\"common\":\"Guernsey\"},\"fra\":{\"official\":\"Bailliage de Guernesey\",\"common\":\"Guernesey\"},\"nfr\":{\"official\":\"Dgèrnésiais\",\"common\":\"Dgèrnésiais\"}}},\"capital\":[\"St. Peter Port\"],\"population\":62999},{\"name\":{\"common\":\"Lebanon\",\"official\":\"Lebanese Republic\",\"nativeName\":{\"ara\":{\"official\":\"الجمهورية اللبنانية\",\"common\":\"لبنان\"},\"fra\":{\"official\":\"République libanaise\",\"common\":\"Liban\"}}},\"capital\":[\"Beirut\"],\"population\":6825442},{\"name\":{\"common\":\"French Polynesia\",\"official\":\"French Polynesia\",\"nativeName\":{\"fra\":{\"official\":\"Polynésie française\",\"common\":\"Polynésie française\"}}},\"capital\":[\"Papeetē\"],\"population\":280904},{\"name\":{\"common\":\"Benin\",\"official\":\"Republic of Benin\",\"nativeName\":{\"fra\":{\"official\":\"République du Bénin\",\"common\":\"Bénin\"}}},\"capital\":[\"Porto-Novo\"],\"population\":12123198},{\"name\":{\"common\":\"Togo\",\"official\":\"Togolese Republic\",\"nativeName\":{\"fra\":{\"official\":\"République togolaise\",\"common\":\"Togo\"}}},\"capital\":[\"Lomé\"],\"population\":8278737},{\"name\":{\"common\":\"Ivory Coast\",\"official\":\"Republic of Côte d'Ivoire\",\"nativeName\":{\"fra\":{\"official\":\"République de Côte d'Ivoire\",\"common\":\"Côte d'Ivoire\"}}},\"capital\":[\"Yamoussoukro\"],\"population\":26378275},{\"name\":{\"common\":\"French Guiana\",\"official\":\"Guiana\",\"nativeName\":{\"fra\":{\"official\":\"Guyane\",\"common\":\"Guyane française\"}}},\"capital\":[\"Cayenne\"],\"population\":254541},{\"name\":{\"common\":\"Comoros\",\"official\":\"Union of the Comoros\",\"nativeName\":{\"ara\":{\"official\":\"الاتحاد القمري\",\"common\":\"القمر‎\"},\"fra\":{\"official\":\"Union des Comores\",\"common\":\"Comores\"},\"zdj\":{\"official\":\"Udzima wa Komori\",\"common\":\"Komori\"}}},\"capital\":[\"Moroni\"],\"population\":869595},{\"name\":{\"common\":\"Saint Pierre and Miquelon\",\"official\":\"Saint Pierre and Miquelon\",\"nativeName\":{\"fra\":{\"official\":\"Collectivité territoriale de Saint-Pierre-et-Miquelon\",\"common\":\"Saint-Pierre-et-Miquelon\"}}},\"capital\":[\"Saint-Pierre\"],\"population\":6069},{\"name\":{\"common\":\"Niger\",\"official\":\"Republic of Niger\",\"nativeName\":{\"fra\":{\"official\":\"République du Niger\",\"common\":\"Niger\"}}},\"capital\":[\"Niamey\"],\"population\":24206636},{\"name\":{\"common\":\"Cameroon\",\"official\":\"Republic of Cameroon\",\"nativeName\":{\"eng\":{\"official\":\"Republic of Cameroon\",\"common\":\"Cameroon\"},\"fra\":{\"official\":\"République du Cameroun\",\"common\":\"Cameroun\"}}},\"capital\":[\"Yaoundé\"],\"population\":26545864},{\"name\":{\"common\":\"Central African Republic\",\"official\":\"Central African Republic\",\"nativeName\":{\"fra\":{\"official\":\"République centrafricaine\",\"common\":\"République centrafricaine\"},\"sag\":{\"official\":\"Ködörösêse tî Bêafrîka\",\"common\":\"Bêafrîka\"}}},\"capital\":[\"Bangui\"],\"population\":4829764},{\"name\":{\"common\":\"Chad\",\"official\":\"Republic of Chad\",\"nativeName\":{\"ara\":{\"official\":\"جمهورية تشاد\",\"common\":\"تشاد‎\"},\"fra\":{\"official\":\"République du Tchad\",\"common\":\"Tchad\"}}},\"capital\":[\"N'Djamena\"],\"population\":16425859},{\"name\":{\"common\":\"Senegal\",\"official\":\"Republic of Senegal\",\"nativeName\":{\"fra\":{\"official\":\"République du Sénégal\",\"common\":\"Sénégal\"}}},\"capital\":[\"Dakar\"],\"population\":16743930},{\"name\":{\"common\":\"Mauritius\",\"official\":\"Republic of Mauritius\",\"nativeName\":{\"eng\":{\"official\":\"Republic of Mauritius\",\"common\":\"Mauritius\"},\"fra\":{\"official\":\"République de Maurice\",\"common\":\"Maurice\"},\"mfe\":{\"official\":\"Republik Moris\",\"common\":\"Moris\"}}},\"capital\":[\"Port Louis\"],\"population\":1265740},{\"name\":{\"common\":\"Haiti\",\"official\":\"Republic of Haiti\",\"nativeName\":{\"fra\":{\"official\":\"République d'Haïti\",\"common\":\"Haïti\"},\"hat\":{\"official\":\"Repiblik Ayiti\",\"common\":\"Ayiti\"}}},\"capital\":[\"Port-au-Prince\"],\"population\":11402533},{\"name\":{\"common\":\"Réunion\",\"official\":\"Réunion Island\",\"nativeName\":{\"fra\":{\"official\":\"Ile de la Réunion\",\"common\":\"La Réunion\"}}},\"capital\":[\"Saint-Denis\"],\"population\":840974},{\"name\":{\"common\":\"Guinea\",\"official\":\"Republic of Guinea\",\"nativeName\":{\"fra\":{\"official\":\"République de Guinée\",\"common\":\"Guinée\"}}},\"capital\":[\"Conakry\"],\"population\":13132792},{\"name\":{\"common\":\"Djibouti\",\"official\":\"Republic of Djibouti\",\"nativeName\":{\"ara\":{\"official\":\"جمهورية جيبوتي\",\"common\":\"جيبوتي‎\"},\"fra\":{\"official\":\"République de Djibouti\",\"common\":\"Djibouti\"}}},\"capital\":[\"Djibouti\"],\"population\":988002},{\"name\":{\"common\":\"Wallis and Futuna\",\"official\":\"Territory of the Wallis and Futuna Islands\",\"nativeName\":{\"fra\":{\"official\":\"Territoire des îles Wallis et Futuna\",\"common\":\"Wallis et Futuna\"}}},\"capital\":[\"Mata-Utu\"],\"population\":11750},{\"name\":{\"common\":\"Burkina Faso\",\"official\":\"Burkina Faso\",\"nativeName\":{\"fra\":{\"official\":\"République du Burkina\",\"common\":\"Burkina Faso\"}}},\"capital\":[\"Ouagadougou\"],\"population\":20903278},{\"name\":{\"common\":\"Rwanda\",\"official\":\"Republic of Rwanda\",\"nativeName\":{\"eng\":{\"official\":\"Republic of Rwanda\",\"common\":\"Rwanda\"},\"fra\":{\"official\":\"République rwandaise\",\"common\":\"Rwanda\"},\"kin\":{\"official\":\"Repubulika y'u Rwanda\",\"common\":\"Rwanda\"}}},\"capital\":[\"Kigali\"],\"population\":12952209},{\"name\":{\"common\":\"Saint Martin\",\"official\":\"Saint Martin\",\"nativeName\":{\"fra\":{\"official\":\"Saint-Martin\",\"common\":\"Saint-Martin\"}}},\"capital\":[\"Marigot\"],\"population\":38659},{\"name\":{\"common\":\"New Caledonia\",\"official\":\"New Caledonia\",\"nativeName\":{\"fra\":{\"official\":\"Nouvelle-Calédonie\",\"common\":\"Nouvelle-Calédonie\"}}},\"capital\":[\"Nouméa\"],\"population\":271960},{\"name\":{\"common\":\"Saint Barthélemy\",\"official\":\"Collectivity of Saint Barthélemy\",\"nativeName\":{\"fra\":{\"official\":\"Collectivité de Saint-Barthélemy\",\"common\":\"Saint-Barthélemy\"}}},\"capital\":[\"Gustavia\"],\"population\":4255},{\"name\":{\"common\":\"Seychelles\",\"official\":\"Republic of Seychelles\",\"nativeName\":{\"crs\":{\"official\":\"Repiblik Sesel\",\"common\":\"Sesel\"},\"eng\":{\"official\":\"Republic of Seychelles\",\"common\":\"Seychelles\"},\"fra\":{\"official\":\"République des Seychelles\",\"common\":\"Seychelles\"}}},\"capital\":[\"Victoria\"],\"population\":98462},{\"name\":{\"common\":\"Sint Maarten\",\"official\":\"Sint Maarten\",\"nativeName\":{\"eng\":{\"official\":\"Sint Maarten\",\"common\":\"Sint Maarten\"},\"fra\":{\"official\":\"Saint-Martin\",\"common\":\"Saint-Martin\"},\"nld\":{\"official\":\"Sint Maarten\",\"common\":\"Sint Maarten\"}}},\"capital\":[\"Philipsburg\"],\"population\":40812},{\"name\":{\"common\":\"Monaco\",\"official\":\"Principality of Monaco\",\"nativeName\":{\"fra\":{\"official\":\"Principauté de Monaco\",\"common\":\"Monaco\"}}},\"capital\":[\"Monaco\"],\"population\":39244}]\u001b[0m\n",
      "\n",
      "\u001b[1m> Finished chain.\u001b[0m\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "\" The top 3 biggest countries where the official language is French are Madagascar, French Southern and Antarctic Lands, and Canada. The response includes the country name, capital, and population, and is sorted by the country's area in descending order. The limit of 3 ensures that only the top 3 results are returned.\""
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "api_chain.run(question2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "792afe92-5a70-4d15-b524-432efc5b20b9",
   "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.11.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
