forked from Archives/langchain
244 lines
9.5 KiB
Plaintext
244 lines
9.5 KiB
Plaintext
|
{
|
||
|
"cells": [
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"id": "9fcaa37f",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"# OpenAPI Chain\n",
|
||
|
"\n",
|
||
|
"This notebook shows an example of using an OpenAPI chain to call an endpoint in natural language, and get back a response in natural language"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 1,
|
||
|
"id": "efa6909f",
|
||
|
"metadata": {},
|
||
|
"outputs": [],
|
||
|
"source": [
|
||
|
"from langchain.tools import OpenAPISpec, APIOperation\n",
|
||
|
"from langchain.chains import OpenAPIEndpointChain\n",
|
||
|
"from langchain.requests import Requests\n",
|
||
|
"from langchain.llms import OpenAI"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"id": "71e38c6c",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"## Load the spec\n",
|
||
|
"\n",
|
||
|
"Load a wrapper of the spec (so we can work with it more easily). You can load from a url or from a local file."
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 2,
|
||
|
"id": "0831271b",
|
||
|
"metadata": {},
|
||
|
"outputs": [],
|
||
|
"source": [
|
||
|
"spec = OpenAPISpec.from_url(\"https://www.klarna.com/us/shopping/public/openai/v0/api-docs/\")"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 3,
|
||
|
"id": "189dd506",
|
||
|
"metadata": {},
|
||
|
"outputs": [],
|
||
|
"source": [
|
||
|
"# Alternative loading from file\n",
|
||
|
"# spec = OpenAPISpec.from_file(\"openai_openapi.yaml\")"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"id": "f7093582",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"## Select the Operation\n",
|
||
|
"\n",
|
||
|
"In order to provide a focused on modular chain, we create a chain specifically only for one of the endpoints. Here we get an API operation from a specified endpoint and method."
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 4,
|
||
|
"id": "157494b9",
|
||
|
"metadata": {},
|
||
|
"outputs": [],
|
||
|
"source": [
|
||
|
"operation = APIOperation.from_openapi_spec(spec, '/public/openai/v0/products', \"get\")"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"id": "e3ab1c5c",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"## Construct the chain\n",
|
||
|
"\n",
|
||
|
"We can now construct a chain to interact with it. In order to construct such a chain, we will pass in:\n",
|
||
|
"\n",
|
||
|
"1. The operation endpoint\n",
|
||
|
"2. A requests wrapper (can be used to handle authentication, etc)\n",
|
||
|
"3. The LLM to use to interact with it"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 5,
|
||
|
"id": "c5f27406",
|
||
|
"metadata": {},
|
||
|
"outputs": [],
|
||
|
"source": [
|
||
|
"chain = OpenAPIEndpointChain.from_api_operation(operation, OpenAI(), requests=Requests(), verbose=True)"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 6,
|
||
|
"id": "23652053",
|
||
|
"metadata": {
|
||
|
"scrolled": false
|
||
|
},
|
||
|
"outputs": [
|
||
|
{
|
||
|
"name": "stdout",
|
||
|
"output_type": "stream",
|
||
|
"text": [
|
||
|
"\n",
|
||
|
"\n",
|
||
|
"\u001b[1m> Entering new OpenAPIEndpointChain chain...\u001b[0m\n",
|
||
|
"\n",
|
||
|
"\n",
|
||
|
"\u001b[1m> Entering new APIRequesterChain chain...\u001b[0m\n",
|
||
|
"Prompt after formatting:\n",
|
||
|
"\u001b[32;1m\u001b[1;3mYou are a helpful AI Assistant. Please provide JSON arguments to agentFunc() based on the user's instructions.\n",
|
||
|
"\n",
|
||
|
"API_SCHEMA: ```typescript\n",
|
||
|
"type productsUsingGET = (_: {\n",
|
||
|
"/* A precise query that matches one very small category or product that needs to be searched for to find the products the user is looking for. If the user explicitly stated what they want, use that as a query. The query is as specific as possible to the product name or category mentioned by the user in its singular form, and don't contain any clarifiers like latest, newest, cheapest, budget, premium, expensive or similar. The query is always taken from the latest topic, if there is a new topic a new query is started. */\n",
|
||
|
"\t\tq: string,\n",
|
||
|
"/* number of products returned */\n",
|
||
|
"\t\tsize?: number,\n",
|
||
|
"/* (Optional) Minimum price in local currency for the product searched for. Either explicitly stated by the user or implicitly inferred from a combination of the user's request and the kind of product searched for. */\n",
|
||
|
"\t\tmin_price?: number,\n",
|
||
|
"/* (Optional) Maximum price in local currency for the product searched for. Either explicitly stated by the user or implicitly inferred from a combination of the user's request and the kind of product searched for. */\n",
|
||
|
"\t\tmax_price?: number,\n",
|
||
|
"}) => any;\n",
|
||
|
"```\n",
|
||
|
"\n",
|
||
|
"USER_INSTRUCTIONS: \"whats the most expensive shirt?\"\n",
|
||
|
"\n",
|
||
|
"Your arguments must be plain json provided in a markdown block:\n",
|
||
|
"\n",
|
||
|
"ARGS: ```json\n",
|
||
|
"{valid json conforming to API_SCHEMA}\n",
|
||
|
"```\n",
|
||
|
"\n",
|
||
|
"Example\n",
|
||
|
"-----\n",
|
||
|
"\n",
|
||
|
"ARGS: ```json\n",
|
||
|
"{\"foo\": \"bar\", \"baz\": {\"qux\": \"quux\"}}\n",
|
||
|
"```\n",
|
||
|
"\n",
|
||
|
"The block must be no more than 1 line long, and all arguments must be valid JSON. All string arguments must be wrapped in double quotes.\n",
|
||
|
"You MUST strictly comply to the types indicated by the provided schema, including all required args.\n",
|
||
|
"\n",
|
||
|
"If you don't have sufficient information to call the function due to things like requiring specific uuid's, you can reply with the following message:\n",
|
||
|
"\n",
|
||
|
"Message: ```text\n",
|
||
|
"Concise response requesting the additional information that would make calling the function successful.\n",
|
||
|
"```\n",
|
||
|
"\n",
|
||
|
"Begin\n",
|
||
|
"-----\n",
|
||
|
"ARGS:\n",
|
||
|
"\u001b[0m\n",
|
||
|
"\n",
|
||
|
"\u001b[1m> Finished chain.\u001b[0m\n",
|
||
|
"\n",
|
||
|
"\n",
|
||
|
"\u001b[1m> Entering new APIResponderChain chain...\u001b[0m\n",
|
||
|
"Prompt after formatting:\n",
|
||
|
"\u001b[32;1m\u001b[1;3mYou are a helpful AI assistant trained to answer user queries from API responses.\n",
|
||
|
"You attempted to call an API, which resulted in:\n",
|
||
|
"API_RESPONSE: {\"products\":[{\"name\":\"Burberry Check Poplin Shirt\",\"url\":\"https://www.klarna.com/us/shopping/pl/cl10001/3201810981/Clothing/Burberry-Check-Poplin-Shirt/?utm_source=openai&ref-site=openai_plugin\",\"price\":\"$360.00\",\"attributes\":[\"Material:Cotton\",\"Target Group:Man\",\"Color:Gray,Blue,Beige\",\"Properties:Pockets\",\"Pattern:Checkered\"]},{\"name\":\"Burberry Vintage Check Cotton Shirt - Beige\",\"url\":\"https://www.klarna.com/us/shopping/pl/cl359/3200280807/Children-s-Clothing/Burberry-Vintage-Check-Cotton-Shirt-Beige/?utm_source=openai&ref-site=openai_plugin\",\"price\":\"$196.30\",\"attributes\":[\"Material:Cotton,Elastane\",\"Color:Beige\",\"Model:Boy\",\"Pattern:Checkered\"]},{\"name\":\"Burberry Somerton Check Shirt - Camel\",\"url\":\"https://www.klarna.com/us/shopping/pl/cl10001/3201112728/Clothing/Burberry-Somerton-Check-Shirt-Camel/?utm_source=openai&ref-site=openai_plugin\",\"price\":\"$450.00\",\"attributes\":[\"Material:Elastane/Lycra/Spandex,Cotton\",\"Target Group:Man\",\"Color:Beige\"]},{\"name\":\"Calvin Klein Slim Fit Oxford Dress Shirt\",\"url\":\"https://www.klarna.com/us/shopping/pl/cl10001/3201839169/Clothing/Calvin-Klein-Slim-Fit-Oxford-Dress-Shirt/?utm_source=openai&ref-site=openai_plugin\",\"price\":\"$30.97\",\"attributes\":[\"Material:Cotton\",\"Target Group:Man\",\"Color:Gray,White,Blue,Black\",\"Pattern:Solid Color\"]},{\"name\":\"Magellan Outdoors Laguna Madre Solid Short Sleeve Fishing Shirt\",\"url\":\"https://www.klarna.com/us/shopping/pl/cl10001/3203102142/Clothing/Magellan-Outdoors-Laguna-Madre-Solid-Short-Sleeve-Fishing-Shirt/?utm_source=openai&ref-site=openai_plugin\",\"price\":\"$19.99\",\"attributes\":[\"Material:Polyester,Nylon\",\"Target Group:Man\",\"Color:Red,Pink,White,Blue,Purple,Beige,Black,Green\",\"Properties:Pockets\",\"Pattern:Solid Color\"]}]}\n",
|
||
|
"\n",
|
||
|
"USER_COMMENT: \"whats the most expensive shirt?\"\n",
|
||
|
"\n",
|
||
|
"\n",
|
||
|
"If the API_RESPONSE can answer the USER_COMMENT respond with the following markdown json block:\n",
|
||
|
"Response: ```json\n",
|
||
|
"{\"response\": \"Concise response to USER_COMMENT based on API_RESPONSE.\"}\n",
|
||
|
"```\n",
|
||
|
"\n",
|
||
|
"Otherwise respond with the following markdown json block:\n",
|
||
|
"Response Error: ```json\n",
|
||
|
"{\"response\": \"What you did and a concise statement of the resulting error. If it can be easily fixed, provide a suggestion.\"}\n",
|
||
|
"```\n",
|
||
|
"\n",
|
||
|
"You MUST respond as a markdown json code block.\n",
|
||
|
"\n",
|
||
|
"Begin:\n",
|
||
|
"---\n",
|
||
|
"\u001b[0m\n",
|
||
|
"\n",
|
||
|
"\u001b[1m> Finished chain.\u001b[0m\n",
|
||
|
"\u001b[33;1m\u001b[1;3mThe most expensive shirt in this list is the Burberry Somerton Check Shirt - Camel, which costs $450.00.\u001b[0m\n",
|
||
|
"\n",
|
||
|
"\u001b[1m> Finished chain.\u001b[0m\n"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"data": {
|
||
|
"text/plain": [
|
||
|
"'The most expensive shirt in this list is the Burberry Somerton Check Shirt - Camel, which costs $450.00.'"
|
||
|
]
|
||
|
},
|
||
|
"execution_count": 6,
|
||
|
"metadata": {},
|
||
|
"output_type": "execute_result"
|
||
|
}
|
||
|
],
|
||
|
"source": [
|
||
|
"chain.run(\"whats the most expensive shirt?\")"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": null,
|
||
|
"id": "8d7924e4",
|
||
|
"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.9.1"
|
||
|
}
|
||
|
},
|
||
|
"nbformat": 4,
|
||
|
"nbformat_minor": 5
|
||
|
}
|