{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "e734b314",
   "metadata": {},
   "source": [
    "# OpenAPI calls with OpenAI functions\n",
    "\n",
    "In this notebook we'll show how to create a chain that automatically makes calls to an API based only on an OpenAPI  spec. Under the hood, we're parsing the OpenAPI spec into a JSON schema that the OpenAI functions API can handle. This allows ChatGPT to automatically select and populate the relevant API call to make for any user input. Using the output of ChatGPT we then make the actual API call, and return the result."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "555661b5",
   "metadata": {},
   "outputs": [],
   "source": [
    "from langchain.chains.openai_functions.openapi import get_openapi_chain"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a95f510a",
   "metadata": {},
   "source": [
    "## Query Klarna"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "08e19b64",
   "metadata": {},
   "outputs": [],
   "source": [
    "chain = get_openapi_chain(\"https://www.klarna.com/us/shopping/public/openai/v0/api-docs/\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "3959f866",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'products': [{'name': \"Tommy Hilfiger Men's Short Sleeve Button-Down Shirt\",\n",
       "   'url': 'https://www.klarna.com/us/shopping/pl/cl10001/3204878580/Clothing/Tommy-Hilfiger-Men-s-Short-Sleeve-Button-Down-Shirt/?utm_source=openai&ref-site=openai_plugin',\n",
       "   'price': '$26.78',\n",
       "   'attributes': ['Material:Linen,Cotton',\n",
       "    'Target Group:Man',\n",
       "    'Color:Gray,Pink,White,Blue,Beige,Black,Turquoise',\n",
       "    'Size:S,XL,M,XXL']},\n",
       "  {'name': \"Van Heusen Men's Long Sleeve Button-Down Shirt\",\n",
       "   'url': 'https://www.klarna.com/us/shopping/pl/cl10001/3201809514/Clothing/Van-Heusen-Men-s-Long-Sleeve-Button-Down-Shirt/?utm_source=openai&ref-site=openai_plugin',\n",
       "   'price': '$18.89',\n",
       "   'attributes': ['Material:Cotton',\n",
       "    'Target Group:Man',\n",
       "    'Color:Red,Gray,White,Blue',\n",
       "    'Size:XL,XXL']},\n",
       "  {'name': 'Brixton Bowery Flannel Shirt',\n",
       "   'url': 'https://www.klarna.com/us/shopping/pl/cl10001/3202331096/Clothing/Brixton-Bowery-Flannel-Shirt/?utm_source=openai&ref-site=openai_plugin',\n",
       "   'price': '$34.48',\n",
       "   'attributes': ['Material:Cotton',\n",
       "    'Target Group:Man',\n",
       "    'Color:Gray,Blue,Black,Orange',\n",
       "    'Size:XL,3XL,4XL,5XL,L,M,XXL']},\n",
       "  {'name': 'Cubavera Four Pocket Guayabera Shirt',\n",
       "   'url': 'https://www.klarna.com/us/shopping/pl/cl10001/3202055522/Clothing/Cubavera-Four-Pocket-Guayabera-Shirt/?utm_source=openai&ref-site=openai_plugin',\n",
       "   'price': '$23.22',\n",
       "   'attributes': ['Material:Polyester,Cotton',\n",
       "    'Target Group:Man',\n",
       "    'Color:Red,White,Blue,Black',\n",
       "    'Size:S,XL,L,M,XXL']},\n",
       "  {'name': 'Theory Sylvain Shirt - Eclipse',\n",
       "   'url': 'https://www.klarna.com/us/shopping/pl/cl10001/3202028254/Clothing/Theory-Sylvain-Shirt-Eclipse/?utm_source=openai&ref-site=openai_plugin',\n",
       "   'price': '$86.01',\n",
       "   'attributes': ['Material:Polyester,Cotton',\n",
       "    'Target Group:Man',\n",
       "    'Color:Blue',\n",
       "    'Size:S,XL,XS,L,M,XXL']}]}"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "chain.run(\"What are some options for a men's large blue button down shirt\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6f648c77",
   "metadata": {},
   "source": [
    "## Query a translation service\n",
    "\n",
    "Additionally, see the request payload by setting `verbose=True`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "bf6cd695",
   "metadata": {},
   "outputs": [],
   "source": [
    "chain = get_openapi_chain(\"https://api.speak.com/openapi.yaml\", verbose=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "1ba51609",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "\n",
      "\u001b[1m> Entering new  chain...\u001b[0m\n",
      "\n",
      "\n",
      "\u001b[1m> Entering new  chain...\u001b[0m\n",
      "Prompt after formatting:\n",
      "\u001b[32;1m\u001b[1;3mHuman: Use the provided API's to respond to this user query:\n",
      "\n",
      "How would you say no thanks in Russian\u001b[0m\n",
      "\n",
      "\u001b[1m> Finished chain.\u001b[0m\n",
      "\n",
      "\n",
      "\u001b[1m> Entering new  chain...\u001b[0m\n",
      "Calling endpoint \u001b[32;1m\u001b[1;3mtranslate\u001b[0m with arguments:\n",
      "\u001b[32;1m\u001b[1;3m{\n",
      "  \"json\": {\n",
      "    \"phrase_to_translate\": \"no thanks\",\n",
      "    \"learning_language\": \"russian\",\n",
      "    \"native_language\": \"english\",\n",
      "    \"additional_context\": \"\",\n",
      "    \"full_query\": \"How would you say no thanks in Russian\"\n",
      "  }\n",
      "}\u001b[0m\n",
      "\u001b[1m> Finished chain.\u001b[0m\n",
      "\n",
      "\u001b[1m> Finished chain.\u001b[0m\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "{'explanation': '<translation language=\"Russian\">\\nНет, спасибо. (Net, spasibo)\\n</translation>\\n\\n<alternatives>\\n1. \"Нет, я в порядке\" *(Neutral/Formal - Can be used in professional settings or formal situations.)*\\n2. \"Нет, спасибо, я откажусь\" *(Formal - Can be used in polite settings, such as a fancy dinner with colleagues or acquaintances.)*\\n3. \"Не надо\" *(Informal - Can be used in informal situations, such as declining an offer from a friend.)*\\n</alternatives>\\n\\n<example-convo language=\"Russian\">\\n<context>Max is being offered a cigarette at a party.</context>\\n* Sasha: \"Хочешь покурить?\"\\n* Max: \"Нет, спасибо. Я бросил.\"\\n* Sasha: \"Окей, понятно.\"\\n</example-convo>\\n\\n*[Report an issue or leave feedback](https://speak.com/chatgpt?rid=noczaa460do8yqs8xjun6zdm})*',\n",
       " 'extra_response_instructions': 'Use all information in the API response and fully render all Markdown.\\nAlways end your response with a link to report an issue or leave feedback on the plugin.'}"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "chain.run(\"How would you say no thanks in Russian\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4923a291",
   "metadata": {},
   "source": [
    "## Query XKCD"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "a9198f62",
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "chain = get_openapi_chain(\"https://gist.githubusercontent.com/roaldnefs/053e505b2b7a807290908fe9aa3e1f00/raw/0a212622ebfef501163f91e23803552411ed00e4/openapi.yaml\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "3110c398",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'month': '6',\n",
       " 'num': 2793,\n",
       " 'link': '',\n",
       " 'year': '2023',\n",
       " 'news': '',\n",
       " 'safe_title': 'Garden Path Sentence',\n",
       " 'transcript': '',\n",
       " 'alt': 'Arboretum Owner Denied Standing in Garden Path Suit on Grounds Grounds Appealing Appealing',\n",
       " 'img': 'https://imgs.xkcd.com/comics/garden_path_sentence.png',\n",
       " 'title': 'Garden Path Sentence',\n",
       " 'day': '23'}"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "chain.run(\"What's today's comic?\")"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "venv",
   "language": "python",
   "name": "venv"
  },
  "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.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
