{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "9363398d",
   "metadata": {},
   "source": [
    "# PowerBI Dataset\n",
    "\n",
    "This notebook showcases an agent interacting with a `Power BI Dataset`. The agent is answering more general questions about a dataset, as well as recover from errors.\n",
    "\n",
    "Note that, as this agent is in active development, all answers might not be correct. It runs against the [executequery endpoint](https://learn.microsoft.com/en-us/rest/api/power-bi/datasets/execute-queries), which does not allow deletes.\n",
    "\n",
    "### Notes:\n",
    "- It relies on authentication with the azure.identity package, which can be installed with `pip install azure-identity`. Alternatively you can create the powerbi dataset with a token as a string without supplying the credentials.\n",
    "- You can also supply a username to impersonate for use with datasets that have RLS enabled. \n",
    "- The toolkit uses a LLM to create the query from the question, the agent uses the LLM for the overall execution.\n",
    "- Testing was done mostly with a `text-davinci-003` model, codex models did not seem to perform ver well."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0725445e",
   "metadata": {
    "tags": []
   },
   "source": [
    "## Initialization"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "c82f33e9",
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "from langchain.agents.agent_toolkits import create_pbi_agent\n",
    "from langchain.agents.agent_toolkits import PowerBIToolkit\n",
    "from langchain.utilities.powerbi import PowerBIDataset\n",
    "from langchain.chat_models import ChatOpenAI\n",
    "from langchain.agents import AgentExecutor\n",
    "from azure.identity import DefaultAzureCredential"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "0b2c5853",
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "fast_llm = ChatOpenAI(\n",
    "    temperature=0.5, max_tokens=1000, model_name=\"gpt-3.5-turbo\", verbose=True\n",
    ")\n",
    "smart_llm = ChatOpenAI(temperature=0, max_tokens=100, model_name=\"gpt-4\", verbose=True)\n",
    "\n",
    "toolkit = PowerBIToolkit(\n",
    "    powerbi=PowerBIDataset(\n",
    "        dataset_id=\"<dataset_id>\",\n",
    "        table_names=[\"table1\", \"table2\"],\n",
    "        credential=DefaultAzureCredential(),\n",
    "    ),\n",
    "    llm=smart_llm,\n",
    ")\n",
    "\n",
    "agent_executor = create_pbi_agent(\n",
    "    llm=fast_llm,\n",
    "    toolkit=toolkit,\n",
    "    verbose=True,\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "80c92be3",
   "metadata": {},
   "source": [
    "## Example: describing a table"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "90f236cb",
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "agent_executor.run(\"Describe table1\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b464930f",
   "metadata": {},
   "source": [
    "## Example: simple query on a table\n",
    "In this example, the agent actually figures out the correct query to get a row count of the table."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "b668c907",
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "agent_executor.run(\"How many records are in table1?\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f2229a2f",
   "metadata": {},
   "source": [
    "## Example: running queries"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "865a420f",
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "agent_executor.run(\"How many records are there by dimension1 in table2?\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "120cd49a",
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "agent_executor.run(\"What unique values are there for dimensions2 in table2\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ac584fb2",
   "metadata": {},
   "source": [
    "## Example: add your own few-shot prompts"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "ffa66827",
   "metadata": {},
   "outputs": [],
   "source": [
    "# fictional example\n",
    "few_shots = \"\"\"\n",
    "Question: How many rows are in the table revenue?\n",
    "DAX: EVALUATE ROW(\"Number of rows\", COUNTROWS(revenue_details))\n",
    "----\n",
    "Question: How many rows are in the table revenue where year is not empty?\n",
    "DAX: EVALUATE ROW(\"Number of rows\", COUNTROWS(FILTER(revenue_details, revenue_details[year] <> \"\")))\n",
    "----\n",
    "Question: What was the average of value in revenue in dollars?\n",
    "DAX: EVALUATE ROW(\"Average\", AVERAGE(revenue_details[dollar_value]))\n",
    "----\n",
    "\"\"\"\n",
    "toolkit = PowerBIToolkit(\n",
    "    powerbi=PowerBIDataset(\n",
    "        dataset_id=\"<dataset_id>\",\n",
    "        table_names=[\"table1\", \"table2\"],\n",
    "        credential=DefaultAzureCredential(),\n",
    "    ),\n",
    "    llm=smart_llm,\n",
    "    examples=few_shots,\n",
    ")\n",
    "agent_executor = create_pbi_agent(\n",
    "    llm=fast_llm,\n",
    "    toolkit=toolkit,\n",
    "    verbose=True,\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "3be44685",
   "metadata": {},
   "outputs": [],
   "source": [
    "agent_executor.run(\"What was the maximum of value in revenue in dollars in 2022?\")"
   ]
  }
 ],
 "metadata": {
  "interpreter": {
   "hash": "397704579725e15f5c7cb49fe5f0341eb7531c82d19f2c29d197e8b64ab5776b"
  },
  "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
}
