agent_1 / tools /blog_tools.py
jojopp's picture
Fix circular import by moving DuckDuckGoSearchTool to separate module
77726b9
raw
history blame
2.93 kB
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>"]
}