{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "01d8a138-4c91-4bb2-9f00-06920d4d3967",
   "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": "5e788b5c-e124-4841-8efb-fbdc7606c238",
   "metadata": {},
   "source": [
    "## LangServe"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bab3040f-6952-4e9c-ae34-5456a3d1f5c8",
   "metadata": {},
   "source": [
    "Here's a server that deploys an OpenAI chat model and a chain that uses the OpenAI chat model to tell a joke about a topic."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "7882ac19-f250-4d79-8348-21d66a6b727c",
   "metadata": {},
   "outputs": [],
   "source": [
    "#!pip install langserve"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "67bc8da3-2dea-4a87-969b-0842d14f6550",
   "metadata": {},
   "outputs": [],
   "source": [
    "#!pip install sse_starlette"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "e68c28f9-ae1c-4e3d-895e-9f4c73f2bfff",
   "metadata": {},
   "outputs": [],
   "source": [
    "#!/usr/bin/env python\n",
    "from fastapi import FastAPI\n",
    "from threading import Thread\n",
    "from langchain.prompts import ChatPromptTemplate\n",
    "from langchain_openai import ChatOpenAI\n",
    "from langserve import add_routes\n",
    "\n",
    "\n",
    "app = FastAPI(\n",
    "  title=\"LangChain Server\",\n",
    "  version=\"1.0\",\n",
    "  description=\"A simple api server using Langchain's Runnable interfaces\",\n",
    ")\n",
    "\n",
    "add_routes(\n",
    "    app,\n",
    "    ChatOpenAI(),\n",
    "    path=\"/openai\",\n",
    ")\n",
    "\n",
    "model = ChatOpenAI()\n",
    "\n",
    "prompt = ChatPromptTemplate.from_template(\"tell me a joke about {topic}\")\n",
    "\n",
    "add_routes(\n",
    "    app,\n",
    "    prompt | model,\n",
    "    path=\"/chain\",\n",
    ")\n",
    "\n",
    "if __name__ == \"__main__\":\n",
    "    import uvicorn\n",
    "\n",
    "    @app.get(\"/\")\n",
    "    async def read_root():\n",
    "        return {\"Hello\": \"World\"}\n",
    "\n",
    "    # Function to run the Uvicorn server in a thread\n",
    "    def run_server():\n",
    "        uvicorn.run(app, host=\"127.0.0.1\", port=8000, log_level=\"info\")\n",
    "\n",
    "    # Start the server in a separate thread\n",
    "    thread = Thread(target=run_server)\n",
    "    thread.start()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7b610ab0-805a-4108-b69a-e8dcb95858af",
   "metadata": {},
   "source": [
    "## Links"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "efaffb80-d82d-46f4-ab9a-962cae5c0e53",
   "metadata": {},
   "source": [
    "* Playground to check the app: [http://127.0.0.1:8000/](http://127.0.0.1:8000/)\n",
    "* API routes:\n",
    "    * [http://127.0.0.1:8000/openai](http://127.0.0.1:8000/openai)\n",
    "    * [http://127.0.0.1:8000/chain](http://127.0.0.1:8000/chain)\n",
    "* FastAPI API documentation: [http://127.0.0.1:8000/docs#/](http://127.0.0.1:8000/docs#/)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d4324fbb-d500-4123-929f-136fa79a7a38",
   "metadata": {},
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "05adf560-2d17-4d41-88d1-aba4f5cf36c7",
   "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
}
