{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "683953b3",
   "metadata": {
    "id": "683953b3"
   },
   "source": [
    "# Elasticsearch\n",
    "\n",
    ">[Elasticsearch](https://www.elastic.co/elasticsearch/) is a distributed, RESTful search and analytics engine, capable of performing both vector and lexical search. It is built on top of the Apache Lucene library.\n",
    "\n",
    "This notebook shows how to use chat message history functionality with `Elasticsearch`."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3c7720c3",
   "metadata": {},
   "source": [
    "## Set up Elasticsearch\n",
    "\n",
    "There are two main ways to set up an Elasticsearch instance:\n",
    "\n",
    "1. **Elastic Cloud.** Elastic Cloud is a managed Elasticsearch service. Sign up for a [free trial](https://cloud.elastic.co/registration?storm=langchain-notebook).\n",
    "\n",
    "2. **Local Elasticsearch installation.** Get started with Elasticsearch by running it locally. The easiest way is to use the official Elasticsearch Docker image. See the [Elasticsearch Docker documentation](https://www.elastic.co/guide/en/elasticsearch/reference/current/docker.html) for more information."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cdf1d2b7",
   "metadata": {},
   "source": [
    "## Install dependencies"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "e5bbffe2",
   "metadata": {},
   "outputs": [],
   "source": [
    "%pip install elasticsearch langchain"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c46c216c",
   "metadata": {},
   "source": [
    "## Authentication\n",
    "\n",
    "### How to obtain a password for the default \"elastic\" user\n",
    "\n",
    "To obtain your Elastic Cloud password for the default \"elastic\" user:\n",
    "1. Log in to the [Elastic Cloud console](https://cloud.elastic.co)\n",
    "2. Go to \"Security\" > \"Users\"\n",
    "3. Locate the \"elastic\" user and click \"Edit\"\n",
    "4. Click \"Reset password\"\n",
    "5. Follow the prompts to reset the password\n",
    "\n",
    "\n",
    "### Use the Username/password\n",
    "\n",
    "```python\n",
    "es_username = os.environ.get(\"ES_USERNAME\", \"elastic\")\n",
    "es_password = os.environ.get(\"ES_PASSWORD\", \"change me...\")\n",
    "\n",
    "history = ElasticsearchChatMessageHistory(\n",
    "    es_url=es_url,\n",
    "    es_user=es_username,\n",
    "    es_password=es_password,\n",
    "    index=\"test-history\",\n",
    "    session_id=\"test-session\"\n",
    ")\n",
    "```\n",
    "\n",
    "### How to obtain an API key\n",
    "\n",
    "To obtain an API key:\n",
    "1. Log in to the [Elastic Cloud console](https://cloud.elastic.co)\n",
    "2. Open `Kibana` and go to Stack Management > API Keys\n",
    "3. Click \"Create API key\"\n",
    "4. Enter a name for the API key and click \"Create\"\n",
    "\n",
    "### Use the API key\n",
    "\n",
    "```python\n",
    "es_api_key = os.environ.get(\"ES_API_KEY\")\n",
    "\n",
    "history = ElasticsearchChatMessageHistory(\n",
    "    es_api_key=es_api_key,\n",
    "    index=\"test-history\",\n",
    "    session_id=\"test-session\"\n",
    ")\n",
    "```\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8be8fcc3",
   "metadata": {},
   "source": [
    "## Initialize Elasticsearch client and chat message history"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "8e2ee0fa",
   "metadata": {},
   "outputs": [],
   "source": [
    "import os\n",
    "\n",
    "from langchain.memory import ElasticsearchChatMessageHistory\n",
    "\n",
    "es_url = os.environ.get(\"ES_URL\", \"http://localhost:9200\")\n",
    "\n",
    "# If using Elastic Cloud:\n",
    "# es_cloud_id = os.environ.get(\"ES_CLOUD_ID\")\n",
    "\n",
    "# Note: see Authentication section for various authentication methods\n",
    "\n",
    "history = ElasticsearchChatMessageHistory(\n",
    "    es_url=es_url, index=\"test-history\", session_id=\"test-session\"\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a63942e2",
   "metadata": {},
   "source": [
    "## Use the chat message history"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "c1c7be79",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "indexing message content='hi!' additional_kwargs={} example=False\n",
      "indexing message content='whats up?' additional_kwargs={} example=False\n"
     ]
    }
   ],
   "source": [
    "history.add_user_message(\"hi!\")\n",
    "history.add_ai_message(\"whats up?\")"
   ]
  }
 ],
 "metadata": {
  "colab": {
   "provenance": []
  },
  "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.10.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
