{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "0e5dc476-e3c9-49bd-934a-35dbe0d55b13",
   "metadata": {},
   "source": [
    "# End of week 1 exercise (with user input(question, model)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "353fba18-a9b4-4ba8-be7e-f3e3c37521ff",
   "metadata": {},
   "outputs": [],
   "source": [
    "# imports\n",
    "\n",
    "import os\n",
    "import requests\n",
    "from dotenv import load_dotenv\n",
    "from bs4 import BeautifulSoup\n",
    "from IPython.display import Markdown, display, update_display\n",
    "from openai import OpenAI\n",
    "import ollama"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "be2b859d-b3d2-41f7-8666-28ecde26e3b8",
   "metadata": {},
   "outputs": [],
   "source": [
    "# set up environment and constants\n",
    "load_dotenv(override=True)\n",
    "api_key = os.getenv('OPENAI_API_KEY')\n",
    "\n",
    "if api_key and api_key.startswith('sk-proj-') and len(api_key)>10:\n",
    "    print(\"API key looks good so far\")\n",
    "else:\n",
    "    print(\"There might be a problem with your API key? Please visit the troubleshooting notebook!\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "c1b2b694-11a1-4d2a-8e34-d1fb02617fa3",
   "metadata": {},
   "outputs": [],
   "source": [
    "system_prompt = \"You are an expert coder with educational skills for beginners. \\\n",
    "You are able to explain, debbug or generate code in Python, R or bash, and to provide examples of use case if applicable. \\\n",
    "Please add references to relevant sources if available. If not, do not invent.\\n\"\n",
    "system_prompt += \"this is an example of a response:\"\n",
    "system_prompt += \"\"\"\n",
    "Sure! Here’s the explanation in plain text format, suitable for Markdown:\n",
    "\n",
    "# Explanation of the Code\n",
    "\n",
    "### Code:\n",
    "```python\n",
    "full_name = lambda first, last: f'Full name: {first.title()} {last.title()}'\n",
    "```\n",
    "\n",
    "### Explanation:\n",
    "\n",
    "1. **Lambda Function:**\n",
    "   - The keyword `lambda` is used to create a small, one-line anonymous function (a function without a name).\n",
    "   - It takes two parameters: `first` (for the first name) and `last` (for the last name).\n",
    "\n",
    "2. **String Formatting (`f-string`):**\n",
    "   - `f'Full name: {first.title()} {last.title()}'` is a formatted string (f-string).\n",
    "   - It inserts the values of `first` and `last` into the string while applying `.title()` to capitalize the first letter of each name.\n",
    "\n",
    "3. **Assigning the Function:**\n",
    "   - The lambda function is assigned to the variable `full_name`, so we can use `full_name()` like a regular function.\n",
    "\n",
    "### How to Use It:\n",
    "Now, let’s call this function and see what it does.\n",
    "\n",
    "```python\n",
    "print(full_name(\"john\", \"doe\"))\n",
    "```\n",
    "\n",
    "#### Output:\n",
    "```\n",
    "Full name: John Doe\n",
    "```\n",
    "\n",
    "### What Happens:\n",
    "- `\"john\"` becomes `\"John\"` (because `.title()` capitalizes the first letter).\n",
    "- `\"doe\"` becomes `\"Doe\"`.\n",
    "- The output is `\"Full name: John Doe\"`.\n",
    "\n",
    "### Summary:\n",
    "This is a simple way to create a function that formats a full name while ensuring proper capitalization. You could write the same function using `def` like this:\n",
    "\n",
    "```python\n",
    "def full_name(first, last):\n",
    "    return f'Full name: {first.title()} {last.title()}'\n",
    "```\n",
    "\n",
    "Both versions work the same way, but the `lambda` version is more compact.\n",
    "\n",
    "### Reference(s):\n",
    "To deepen your understanding of the code snippet involving Python's lambda functions here is a resource you might find helpful:\n",
    "\n",
    "Ref. **Python Lambda Functions:**\n",
    "   - The official Python documentation provides an in-depth explanation of lambda expressions, including their syntax and use cases.\n",
    "     - [Lambda Expressions](https://docs.python.org/3/tutorial/controlflow.html#lambda-expressions)\n",
    "\n",
    "```\n",
    "You can copy and paste this into any Markdown file or viewer. Let me know if you need further modifications! 😊\n",
    "\"\"\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "f7225ab0-5ade-4c93-839c-3c80b0b23c37",
   "metadata": {},
   "outputs": [],
   "source": [
    "# display(Markdown(system_prompt))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "07fa2506-4b24-4a53-9f3f-500b4cbcb10a",
   "metadata": {},
   "outputs": [],
   "source": [
    "# user question\n",
    "default_question= \"\"\"\n",
    "Please explain what this code does and why:\n",
    "yield from {book.get('author') from book in books if book.get('author')}\n",
    "\"\"\"\n",
    "user_question= str(input(\"What code do you want me to explain?/n(Press 'Enter' for an example)\"))\n",
    "\n",
    "if user_question== '':\n",
    "    question= default_question\n",
    "    print(default_question)\n",
    "else:\n",
    "    question= \"Please explain what this code does and why:\\n\" + user_question"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "a6749065-fb8a-4f9f-8297-3cd33abd97bd",
   "metadata": {},
   "outputs": [],
   "source": [
    "print(question)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "f48df06c-edb7-4a05-9e56-910854dad0c7",
   "metadata": {},
   "outputs": [],
   "source": [
    "# user model\n",
    "model_number= input(\"\"\"\n",
    "Please enter the number of the model you want to use from the list below:\n",
    "1 GPT-4o Mini\n",
    "2 Llama 3.2\n",
    "3 DeepSeek R1\n",
    "4 Qwen 2.5\n",
    "\"\"\")\n",
    "try:\n",
    "    if int(model_number)==1:\n",
    "        model= 'gpt-4o-mini'\n",
    "    elif int(model_number)==2:\n",
    "        model= 'llama3.2'\n",
    "    elif int(model_number)==3:\n",
    "        model= 'deepseek-r1:1.5b'\n",
    "    elif int(model_number)==4:\n",
    "        model= 'qwen2.5:3b'\n",
    "    else:\n",
    "        model= ''\n",
    "        print(\"please provide only a number from the list\")\n",
    "except:\n",
    "    model=''\n",
    "    print(\"Please provide a number or press 'Enter' to finish\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "aeb6e4e5-fb63-4192-bb74-0b015dfedfb7",
   "metadata": {},
   "outputs": [],
   "source": [
    "# print(model)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "fffa6021-d3f8-4855-a694-bed6d651791f",
   "metadata": {},
   "outputs": [],
   "source": [
    "messages=[\n",
    "    {\"role\": \"system\", \"content\": system_prompt},\n",
    "    {\"role\": \"user\", \"content\": question}\n",
    "    ]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "835374a4-3df5-4f28-82e3-6bc70514df16",
   "metadata": {},
   "outputs": [],
   "source": [
    "if int(model_number)==1:\n",
    "    openai= OpenAI()\n",
    "    stream = openai.chat.completions.create(\n",
    "        model=model,\n",
    "        messages=messages,\n",
    "        stream= True\n",
    "        )\n",
    "\n",
    "    response = \"\"\n",
    "    print(\"The following answer will be generated by {0} LLM\".format(model))\n",
    "    display_handle = display(Markdown(\"\"), display_id=True)\n",
    "    for chunk in stream:\n",
    "        response += chunk.choices[0].delta.content or ''\n",
    "        response = response.replace(\"```\",\"\").replace(\"markdown\", \"\")\n",
    "        update_display(Markdown(response), display_id=display_handle.display_id)\n",
    "elif int(model_number)==2 or 3 or 4:\n",
    "    !ollama pull {model}\n",
    "    print(\"\\n\\nThe following answer will be generated by {0} LLM\\n\\n\".format(model))\n",
    "    response = ollama.chat(\n",
    "        model=model,\n",
    "        messages = messages)\n",
    "    result= response['message']['content']\n",
    "    display(Markdown(result))"
   ]
  }
 ],
 "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.11"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}