diff --git a/examples/cookbooks/Government-Services-Assistant.ipynb b/examples/cookbooks/Government-Services-Assistant.ipynb new file mode 100644 index 00000000..d70bf8e2 --- /dev/null +++ b/examples/cookbooks/Government-Services-Assistant.ipynb @@ -0,0 +1,300 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "ZH_nR-SvvkDG" + }, + "source": [ + "# Government Services Assistant - AI Chatbot" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "w8B741JgvpFj" + }, + "source": [ + "This notebook demonstrates how to use an AI-powered assistant to answer questions about government services and procedures, using the Firecrawl API and a friendly, step-by-step conversational approach." + ] + }, + { + "cell_type": "markdown", + "source": [ + "[![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/DhivyaBharathy-web/PraisonAI/blob/main/examples/cookbooks/Chile_Government_Services_Assistant.ipynb)\n" + ], + "metadata": { + "id": "y8jiJYf4FA0m" + } + }, + { + "cell_type": "markdown", + "metadata": { + "id": "RRw8sPG89KNb" + }, + "source": [ + "# Install dependencies" + ] + }, + { + "cell_type": "code", + "source": [ + "!pip install flask firecrawl praisonaiagents google-genai python-dotenv deep-translator" + ], + "metadata": { + "id": "rW8ltqCICV8o" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "source": [ + "# Set API Keys" + ], + "metadata": { + "id": "XGjyt-B_EfbM" + } + }, + { + "cell_type": "code", + "source": [ + "import os\n", + "\n", + "os.environ['FIRECRAWL_API_KEY'] = \"your api key here\"\n", + "os.environ['OPENAI_API_KEY'] = \"your api key here\"" + ], + "metadata": { + "id": "qf8B_YltDiIe" + }, + "execution_count": 4, + "outputs": [] + }, + { + "cell_type": "markdown", + "source": [ + "# Import Libraries & Translator" + ], + "metadata": { + "id": "ccO0vwvCEqUJ" + } + }, + { + "cell_type": "code", + "source": [ + "from firecrawl import FirecrawlApp, ScrapeOptions\n", + "from deep_translator import GoogleTranslator\n", + "import re\n", + "\n", + "def translate_to_spanish(text):\n", + " try:\n", + " return GoogleTranslator(source='auto', target='es').translate(text)\n", + " except Exception as e:\n", + " print(\"Translation to Spanish failed:\", e)\n", + " return text\n", + "\n", + "def translate_to_english(text):\n", + " try:\n", + " # Remove Markdown images and None values before translation\n", + " text = str(text).replace(\"None\", \"\")\n", + " text = re.sub(r'!\\[.*?\\]\\(.*?\\)', '', text)\n", + " return GoogleTranslator(source='auto', target='en').translate(text)\n", + " except Exception as e:\n", + " print(\"Translation to English failed:\", e)\n", + " return text" + ], + "metadata": { + "id": "0prDQ5TpDnFu" + }, + "execution_count": 5, + "outputs": [] + }, + { + "cell_type": "markdown", + "source": [ + "# Firecrawl Tool Class" + ], + "metadata": { + "id": "WxOlCHMmEuK2" + } + }, + { + "cell_type": "code", + "source": [ + "class FirecrawlTool:\n", + " def __init__(self, api_key, instruction: str, template: str):\n", + " if not api_key:\n", + " raise ValueError(\"Firecrawl API key not provided.\")\n", + " self.app = FirecrawlApp(api_key=api_key)\n", + " self.instruction = instruction\n", + " self.template = template\n", + "\n", + " def search(self, search: str) -> str:\n", + " if not search or len(search) < 5:\n", + " return \"Error: Please provide a valid search query (at least 5 characters).\"\n", + " response_md = \"\"\n", + " try:\n", + " search_result = self.app.search(\n", + " query=self.instruction + search,\n", + " limit=2,\n", + " country=\"cl\",\n", + " lang=\"es\", # Always search in Spanish for best results\n", + " scrape_options=ScrapeOptions(formats=[\"markdown\", \"links\"])\n", + " )\n", + " if search_result and hasattr(search_result, 'data') and search_result.data:\n", + " filtered_results = [\n", + " result for result in search_result.data\n", + " if str(result.get(\"url\", \"\")).startswith(\"https://www.chileatiende.gob.cl/fichas\") and not str(result.get(\"url\", \"\")).endswith(\"pdf\")\n", + " ]\n", + " if filtered_results:\n", + " for num, result in enumerate(filtered_results, start=1):\n", + " response_md += self.template.format(\n", + " result_number=num,\n", + " page_title=str(result.get(\"title\", \"\")),\n", + " page_url=str(result.get(\"url\", \"\")),\n", + " page_content=str(result.get(\"markdown\", \"\"))\n", + " )\n", + " return response_md\n", + " else:\n", + " return None\n", + " else:\n", + " return None\n", + " except Exception as e:\n", + " return f\"Error during search: {e}\"" + ], + "metadata": { + "id": "G4RyzJ5mDp0t" + }, + "execution_count": 6, + "outputs": [] + }, + { + "cell_type": "markdown", + "source": [ + "# Firecrawl Prompt Template" + ], + "metadata": { + "id": "MjkjTWn_ExS0" + } + }, + { + "cell_type": "code", + "source": [ + "FIRECRAWL_INSTRUCTION = \"ChileAtiende: \"\n", + "FIRECRAWL_TEMPLATE = \"\"\"\n", + "# Result {result_number}\n", + "\n", + "## Page Name:\n", + "\"{page_title}\"\n", + "\n", + "## URL:\n", + "{page_url}\n", + "\n", + "## Content:\n", + "{page_content}\n", + "\n", + "\"\"\"" + ], + "metadata": { + "id": "AfivymU8Dufz" + }, + "execution_count": 7, + "outputs": [] + }, + { + "cell_type": "markdown", + "source": [ + "# Initialize Firecrawl Tool" + ], + "metadata": { + "id": "zK8AA_DlEz9K" + } + }, + { + "cell_type": "code", + "source": [ + "firecrawl_tool = FirecrawlTool(\n", + " api_key=os.environ['FIRECRAWL_API_KEY'],\n", + " instruction=FIRECRAWL_INSTRUCTION,\n", + " template=FIRECRAWL_TEMPLATE\n", + ")" + ], + "metadata": { + "id": "c3NKK0ZjDwKT" + }, + "execution_count": 8, + "outputs": [] + }, + { + "cell_type": "markdown", + "source": [ + "# Main Chat Loop" + ], + "metadata": { + "id": "uzXYIF_gE3XV" + } + }, + { + "cell_type": "code", + "source": [ + "print(\"Hello! I am your ChileAtiende assistant, Tomás. How can I help you today?\")\n", + "print(\"You can ask me, for example: How to renew your ID card, How to apply for the Winter Bonus, etc.\")\n", + "\n", + "while True:\n", + " user_input = input(\"\\nYou: \")\n", + " if user_input.lower() in [\"exit\", \"quit\"]:\n", + " print(\"Tomás: It was a pleasure to help you. Goodbye!\")\n", + " break\n", + "\n", + " # Translate English input to Spanish for Firecrawl\n", + " spanish_query = translate_to_spanish(user_input)\n", + " spanish_answer = firecrawl_tool.search(spanish_query)\n", + "\n", + " # Only translate if we got a real answer\n", + " if spanish_answer and isinstance(spanish_answer, str) and spanish_answer.strip() and \"Error\" not in spanish_answer:\n", + " try:\n", + " english_answer = translate_to_english(spanish_answer)\n", + " print(\"\\nTomás (in English):\\n\", english_answer)\n", + " except Exception as e:\n", + " print(f\"\\nTomás: I found information, but couldn't translate it. Here it is in Spanish:\\n{spanish_answer}\\n(Translation error: {e})\")\n", + " else:\n", + " print(\"\\nTomás: Sorry, I couldn't find relevant information. Try rephrasing your question or ask about another service.\")" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "TXMgZQNkDx7n", + "outputId": "76303cd1-a576-483f-a22d-9857e5e6d797" + }, + "execution_count": 12, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Hello! I am your ChileAtiende assistant, Tomás. How can I help you today?\n", + "You can ask me, for example: How to renew your ID card, How to apply for the Winter Bonus, etc.\n", + "\n", + "You: exit\n", + "Tomás: It was a pleasure to help you. Goodbye!\n" + ] + } + ] + } + ], + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + }, + "language_info": { + "name": "python" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +}