Skip to content

Add Government Services Assistant notebook #686

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
300 changes: 300 additions & 0 deletions examples/cookbooks/Chile_Government_Services_Assistant_.ipynb
Original file line number Diff line number Diff line change
@@ -0,0 +1,300 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "ZH_nR-SvvkDG"
},
"source": [
"# Chile 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 Chilean 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"
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Remove unused dependencies to reduce footprint.

Several installed packages (flask, praisonaiagents, google-genai, python-dotenv) are not used in the notebook. Consider removing them to minimize dependencies.

-!pip install flask firecrawl praisonaiagents google-genai python-dotenv deep-translator
+!pip install firecrawl deep-translator

Committable suggestion skipped: line range outside the PR's diff.

🤖 Prompt for AI Agents
In examples/cookbooks/Chile_Government_Services_Assistant_.ipynb at line 42, the
pip install command includes unused packages such as flask, praisonaiagents,
google-genai, and python-dotenv. Remove these unused dependencies from the
install command to reduce the environment footprint and only keep the necessary
packages like firecrawl and 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\""
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Use secure input method for API keys to prevent accidental commits.

Hardcoded API key placeholders can lead to accidental commits of real keys. Consider using getpass for secure input.

-os.environ['FIRECRAWL_API_KEY'] = "your api key here"
-os.environ['OPENAI_API_KEY'] = "your api key here"
+from getpass import getpass
+
+os.environ['FIRECRAWL_API_KEY'] = getpass("Enter your Firecrawl API key: ")
+os.environ['OPENAI_API_KEY'] = getpass("Enter your OpenAI API key: ")
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
"os.environ['FIRECRAWL_API_KEY'] = \"your api key here\"\n",
"os.environ['OPENAI_API_KEY'] = \"your api key here\""
from getpass import getpass
os.environ['FIRECRAWL_API_KEY'] = getpass("Enter your Firecrawl API key: ")
os.environ['OPENAI_API_KEY'] = getpass("Enter your OpenAI API key: ")
🤖 Prompt for AI Agents
In examples/cookbooks/Chile_Government_Services_Assistant_.ipynb around lines 64
to 65, the API keys are set using hardcoded strings which risks accidental
commits of sensitive information. Replace these hardcoded assignments with
secure input prompts using the getpass module to read the API keys at runtime
without displaying them, preventing exposure in the codebase.

],
"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",
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Consider using a more robust method for removing Markdown images, as this regex might not cover all cases.

text = str(text).replace("None", "")
        text = re.sub(r'!\[.*?\]\(.*?\)', '', text)

" 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",
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Add class and method documentation for better maintainability.

The FirecrawlTool class and its methods lack docstrings. Adding documentation would improve code maintainability and user understanding.

 class FirecrawlTool:
+    """
+    A tool for searching Chilean government services using the Firecrawl API.
+    
+    This class provides functionality to search for information on ChileAtiende
+    government service pages and format the results.
+    """
+    
     def __init__(self, api_key, instruction: str, template: str):
+        """
+        Initialize the FirecrawlTool.
+        
+        Args:
+            api_key (str): Firecrawl API key
+            instruction (str): Search instruction prefix
+            template (str): Template for formatting results
+            
+        Raises:
+            ValueError: If API key is not provided
+        """
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
"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",
class FirecrawlTool:
"""
A tool for searching Chilean government services using the Firecrawl API.
This class provides functionality to search for information on ChileAtiende
government service pages and format the results.
"""
def __init__(self, api_key, instruction: str, template: str):
"""
Initialize the FirecrawlTool.
Args:
api_key (str): Firecrawl API key
instruction (str): Search instruction prefix
template (str): Template for formatting results
Raises:
ValueError: If API key is not provided
"""
if not api_key:
raise ValueError("Firecrawl API key not provided.")
self.app = FirecrawlApp(api_key=api_key)
self.instruction = instruction
self.template = template
🤖 Prompt for AI Agents
In examples/cookbooks/Chile_Government_Services_Assistant_.ipynb around lines
124 to 130, the FirecrawlTool class and its __init__ method lack docstrings. Add
clear and concise docstrings to the class describing its purpose and to the
__init__ method explaining the parameters and their roles to improve
maintainability and user understanding.

"\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",
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Consider adding input validation to check if search is a string to prevent potential errors.

if not search or len(search) < 5:
            return "Error: Please provide a valid search query (at least 5 characters)."

" 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
}
Loading