ReMind / src /agents /gmail_agent.py
GhostDragon01's picture
refactor: Reduce verbosity in agent outputs and enhance message formatting in chat interface
b58981e
import os
from typing import List, Dict, Any
from smolagents import CodeAgent, InferenceClientModel, tool
from src.tools.gmail_mcp_client import get_recent_emails as _get_recent_emails
from src.tools.gmail_mcp_client import search_emails_simple as _search_emails_simple
from src.tools.gmail_mcp_client import read_email_content as _read_email_content
@tool
def get_recent_emails(max_results: int = 10) -> List[Dict[str, str]]:
"""
Get the most recent emails from allowed senders (habib.adoum01@gmail.com and news@alphasignal.ai).
This is the main tool for browsing recent emails.
Args:
max_results: Number of recent emails to fetch, between 1 and 50 (default: 10).
Returns:
List of email dictionaries with 'id', 'subject', 'sender', 'date', and 'snippet' fields.
Returns empty list if no emails found. Each email can be read in detail using read_email_content.
"""
if max_results < 1:
max_results = 1
elif max_results > 50:
max_results = 50
return _get_recent_emails(max_results)
@tool
def search_emails(query: str, max_results: int = 10) -> List[Dict[str, str]]:
"""
Search for emails containing specific keywords from allowed senders only.
Use simple keywords - no need for complex Gmail search operators.
Args:
query: Search keywords (examples: "AI", "newsletter", "update", "coding"). Simple terms work best.
max_results: Maximum number of results to return, between 1 and 50 (default: 10).
Returns:
List of email dictionaries with 'id', 'subject', 'sender', 'date', and 'snippet' fields.
Returns empty list if no matching emails found. Use read_email_content to get full email text.
"""
if not query or not query.strip():
print("Error: Empty search query provided")
return [{"error": "Search query cannot be empty"}]
if max_results < 1:
max_results = 1
elif max_results > 50:
max_results = 50
return _search_emails_simple(query.strip(), max_results)
@tool
def read_email_content(message_id: str) -> Dict[str, Any]:
"""
Read the full content of a specific email by its ID.
Use this after getting email IDs from get_recent_emails or search_emails.
Args:
message_id: The email ID from get_recent_emails or search_emails (example: "197421416350ce1a").
Returns:
Dictionary with 'id', 'subject', 'sender', 'date', 'snippet', and 'body' fields.
The 'body' contains the full email text content.
Returns error dict if email not accessible or not from allowed sender.
"""
if not message_id or not message_id.strip():
return {"error": "Message ID cannot be empty"}
return _read_email_content(message_id.strip())
gmail_agent = CodeAgent(
model=InferenceClientModel(
provider="nebius",
token=os.environ["HF_TOKEN"],
),
tools=[get_recent_emails, search_emails, read_email_content],
name="gmail_agent",
description="Gmail agent specialized in reading and searching emails from habib.adoum01@gmail.com and news@alphasignal.ai only",
max_steps=10,
additional_authorized_imports=["json"],
stream_outputs=False,
max_print_outputs_length=300,
)