{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "fe12c203-e6a6-452c-a655-afb8a03a4ff5",
   "metadata": {},
   "source": [
    "# End of week 1 exercise Solution Ollama with streaming\n",
    "\n",
    "A tool that takes a technical question, and responds with an explanation."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "c1070317-3ed9-4659-abe3-828943230e03",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Imports\n",
    "\n",
    "import ollama\n",
    "import requests\n",
    "from IPython.display import Markdown, display"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "4a456906-915a-4bfd-bb9d-57e505c5093f",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Constants\n",
    "\n",
    "MODEL_LLAMA = 'llama3.2'\n",
    "MODEL_LLAMA1b = \"llama3.2:1b\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "3f0d0137-52b0-47a8-81a8-11a90a010798",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Environment\n",
    "\n",
    "system_prompt = \"\"\"\n",
    "You are an assistant that takes a technical question and respond with an explanation.\n",
    "\"\"\"\n",
    "\n",
    "question = \"\"\"\n",
    "Please explain what this code does and why:\n",
    "yield from {book.get(\"author\") for book in books if book.get(\"author\")}\n",
    "\"\"\"\n",
    "\n",
    "question2 = \"\"\"\n",
    "What is the purpose of using yield from in the following code, and how does it differ from a standard for loop with yield?\n",
    "yield from {book.get(\"author\") for book in books if book.get(\"author\")}\n",
    "\"\"\"\n",
    "\n",
    "user_prompt = \"Answer these two questions in detail please, Question1:\" + question + \"Question2:\" + question2\n",
    "\n",
    "def message():\n",
    "    return [\n",
    "        {\"role\": \"system\", \"content\": system_prompt},\n",
    "        {\"role\": \"user\", \"content\": user_prompt}\n",
    "    ]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "8f7c8ea8-4082-4ad0-8751-3301adcf6538",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Llama 3.2 answer, with streaming\n",
    "\n",
    "def llama():\n",
    "    response = ollama.chat(\n",
    "        model = MODEL_LLAMA,\n",
    "        messages = message(),\n",
    "        stream =True\n",
    "    )\n",
    "    full_response = \"\"\n",
    "    display_handle = display(Markdown(\"\"), display_id=True)\n",
    "    for chunk in response:\n",
    "        content = chunk.get(\"message\", {}).get(\"content\", \"\")\n",
    "        if content:\n",
    "            full_response += content\n",
    "            display_handle.update(Markdown(full_response))\n",
    "llama()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "342a470c-9aab-4051-ad21-514dceec76eb",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Llama 3.2:1b answer\n",
    "\n",
    "def llama():\n",
    "    response = ollama.chat(\n",
    "        model = MODEL_LLAMA1b,\n",
    "        messages = message()\n",
    "    )\n",
    "    return display(Markdown(response['message']['content']))\n",
    "\n",
    "llama()"
   ]
  }
 ],
 "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.10.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}