agent_1 / tools /blog_tools.py
jojopp's picture
Fix circular import by moving DuckDuckGoSearchTool to separate module
77726b9
from smolagents import tool
from typing import List, Dict
import re
import yaml
from .search_tools import get_search_tool
# Load style guide
with open("style_guide.yaml", 'r') as f:
style_guide = yaml.safe_load(f)
@tool
def generate_blog_section(topic: str, section_title: str) -> str:
"""Generates content for a specific section of the blog post, following Joséphine's style:
- Direct and conversational tone
- Short, clear sentences
- Personal but professional
- Draws from AI product experience when relevant
Args:
topic: The main topic of the blog post
section_title: The title of the section to generate
"""
# First, get some background information
search_tool = get_search_tool(max_results=2)
try:
search_query = f"{topic} {section_title}"
research = search_tool.forward(search_query)
# Format the content in your style
content = f"# {section_title}\n\n"
content += f"Here's my take on {topic}, focusing on {section_title}. "
content += f"From my experience in AI products:\n\n"
content += f"{research}\n\n"
content += "Questions? Let's discuss."
return content
except Exception as e:
return f"Error generating content: {str(e)}"
@tool
def improve_writing_style(text: str, style: str = "professional") -> str:
"""Improves the writing style while maintaining Joséphine's voice:
- Keeps direct, conversational tone
- Removes AI clichés
- Ensures natural flow
- Maintains authenticity
Args:
text: The text to improve
style: The desired writing style (e.g., professional, casual, academic)
"""
return f"Improved version of the text in {style} style"
@tool
def check_readability(text: str) -> Dict:
"""Analyzes the readability of the text, focusing on:
- Sentence length and clarity
- Natural flow
- Direct communication
- Professional but personal tone
Args:
text: The text to analyze
"""
words = len(text.split())
sentences = len(re.split(r'[.!?]+', text))
avg_words_per_sentence = words / max(sentences, 1)
return {
"word_count": words,
"sentence_count": sentences,
"avg_words_per_sentence": avg_words_per_sentence,
"readability_score": "Good" if avg_words_per_sentence < 15 else "Consider shorter sentences",
"style_notes": "Check for direct tone and clear communication"
}
@tool
def generate_seo_metadata(title: str, content: str) -> Dict:
"""Generates SEO metadata while maintaining authentic voice
Args:
title: The blog post title
content: The blog post content
"""
return {
"meta_description": f"A practical look at {title}",
"keywords": [word.lower() for word in title.split()],
"suggested_title_tags": [f"<h1>{title}</h1>"]
}