-
Notifications
You must be signed in to change notification settings - Fork 0
API Reference
Complete Python API documentation for Agentic-Writer.
Location: src/orchestrator.py
Main orchestrator class that coordinates all agents.
ContentCreationOrchestrator(config: Config)Parameters:
-
config(Config): Configuration object with API keys and settings
Example:
from src.orchestrator import ContentCreationOrchestrator
from src.utils import Config
config = Config.from_env()
orchestrator = ContentCreationOrchestrator(config)create_content(
topic: str,
style: str = "professional",
target_audience: str = "general audience",
platforms: List[str] = ["file"],
output_dir: str = "output"
) -> Dict[str, Any]Execute the complete content creation pipeline.
Parameters:
-
topic(str): The topic to write about -
style(str): Writing style - "professional", "casual", "technical", or "accessible" -
target_audience(str): Description of target audience -
platforms(List[str]): Publishing platforms - ["file"], ["medium"], or both -
output_dir(str): Directory to save output files
Returns:
{
"status": "completed" | "failed",
"research": Dict[str, Any],
"article": Dict[str, Any],
"images": Dict[str, Any],
"publication": Dict[str, Dict[str, Any]],
"error": Optional[str]
}Example:
results = orchestrator.create_content(
topic="Machine Learning Basics",
style="accessible",
target_audience="beginners",
platforms=["file"],
output_dir="./articles"
)
if results["status"] == "completed":
print(f"Title: {results['article']['title']}")get_summary(results: Dict[str, Any]) -> strGenerate human-readable summary of results.
Parameters:
-
results(Dict): Results fromcreate_content()
Returns:
-
str: Formatted summary string
Example:
summary = orchestrator.get_summary(results)
print(summary)Location: src/utils/config.py
Configuration management using Pydantic.
class Config(BaseModel):
openai_api_key: str
medium_access_token: Optional[str] = None
unsplash_access_key: Optional[str] = None
openai_model: str = "gpt-4-turbo-preview"
temperature: float = 0.7
log_level: str = "INFO"
max_research_sources: int = 5
max_retries: int = 3@classmethod
def from_env(cls) -> "Config"Load configuration from environment variables.
Returns:
-
Config: Configuration object
Example:
from src.utils import Config
config = Config.from_env()
print(f"Model: {config.openai_model}")def validate_required(self) -> NoneValidate that required configuration is present.
Raises:
-
ValueError: If required configuration is missing
Example:
try:
config.validate_required()
print("Configuration valid!")
except ValueError as e:
print(f"Error: {e}")Location: src/agents/researcher.py
Conducts web research and synthesizes information.
ResearchAgent(llm: ChatOpenAI, max_sources: int = 5)Parameters:
-
llm(ChatOpenAI): Language model instance -
max_sources(int): Maximum number of sources to research
research(topic: str) -> Dict[str, Any]Conduct full research pipeline.
Parameters:
-
topic(str): Topic to research
Returns:
{
"topic": str,
"analysis": str,
"search_results": List[Dict[str, str]],
"synthesis": str,
"sources_count": int
}Example:
from src.agents import ResearchAgent
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(model="gpt-4", temperature=0.7)
researcher = ResearchAgent(llm=llm, max_sources=5)
results = researcher.research("Artificial Intelligence")
print(results["synthesis"])analyze_topic(topic: str) -> strAnalyze topic and identify key areas.
Parameters:
-
topic(str): Topic to analyze
Returns:
-
str: Topic analysis
search_web(topic: str) -> List[Dict[str, str]]Search the web using DuckDuckGo.
Parameters:
-
topic(str): Search query
Returns:
[
{
"title": str,
"body": str,
"href": str
}
]synthesize_research(topic: str, results: List[Dict]) -> strSynthesize research findings.
Parameters:
-
topic(str): Original topic -
results(List[Dict]): Search results
Returns:
-
str: Research synthesis
Location: src/agents/writer.py
Generates articles and metadata.
WriterAgent(llm: ChatOpenAI)Parameters:
-
llm(ChatOpenAI): Language model instance
write_article(
research_data: Dict[str, Any],
style: str = "professional",
target_audience: str = "general audience"
) -> Dict[str, Any]Generate complete article with metadata.
Parameters:
-
research_data(Dict): Results from ResearchAgent -
style(str): Writing style -
target_audience(str): Target audience description
Returns:
{
"title": str,
"content": str,
"outline": str,
"meta_description": str,
"tags": List[str],
"word_count": int,
"topic": str
}Example:
from src.agents import WriterAgent
writer = WriterAgent(llm=llm)
article = writer.write_article(
research_data=research_results,
style="casual",
target_audience="beginners"
)
print(f"Title: {article['title']}")
print(f"Words: {article['word_count']}")create_outline(research: str, style: str) -> strCreate article outline.
generate_title(content: str) -> strGenerate engaging title.
generate_meta_description(content: str) -> strCreate meta description.
generate_tags(content: str) -> List[str]Generate relevant tags.
Location: src/agents/image_handler.py
Finds and curates relevant images.
ImageAgent(llm: ChatOpenAI, unsplash_access_key: Optional[str] = None)Parameters:
-
llm(ChatOpenAI): Language model instance -
unsplash_access_key(Optional[str]): Unsplash API key
find_images(article_content: str, article_title: str) -> Dict[str, Any]Find relevant images for article.
Parameters:
-
article_content(str): Article content -
article_title(str): Article title
Returns:
{
"images": [
{
"url": str,
"description": str,
"author": str,
"author_url": str
}
]
}Example:
from src.agents import ImageAgent
image_handler = ImageAgent(
llm=llm,
unsplash_access_key="your-key"
)
images = image_handler.find_images(
article_content=article["content"],
article_title=article["title"]
)
for img in images["images"]:
print(f"Image: {img['url']}")generate_image_queries(content: str, title: str) -> List[str]Generate search queries for images.
search_unsplash(query: str) -> List[Dict]Search Unsplash for images.
Location: src/agents/publisher.py
Publishes content to various platforms.
PublisherAgent(medium_access_token: Optional[str] = None)Parameters:
-
medium_access_token(Optional[str]): Medium API token
publish(
article: Dict[str, Any],
images: Dict[str, Any],
platforms: List[str],
output_dir: str = "output"
) -> Dict[str, Dict[str, Any]]Publish to specified platforms.
Parameters:
-
article(Dict): Article data from WriterAgent -
images(Dict): Images from ImageAgent -
platforms(List[str]): Target platforms -
output_dir(str): Output directory
Returns:
{
"file": {
"success": bool,
"platform": str,
"markdown_file": str,
"metadata_file": str
},
"medium": {
"success": bool,
"platform": str,
"url": str,
"error": Optional[str]
}
}Example:
from src.agents import PublisherAgent
publisher = PublisherAgent(
medium_access_token="your-token"
)
results = publisher.publish(
article=article,
images=images,
platforms=["file", "medium"],
output_dir="./output"
)
for platform, result in results.items():
if result["success"]:
print(f"{platform}: ✓ Success")publish_to_file(
article: Dict,
images: Dict,
output_dir: str
) -> DictSave to file system.
publish_to_medium(article: Dict, images: Dict) -> DictPublish to Medium.
Location: src/utils/logger.py
setup_logger(
name: str = "agentic_writer",
level: str = "INFO",
log_file: Optional[str] = None
) -> logging.LoggerSetup configured logger.
Parameters:
-
name(str): Logger name -
level(str): Log level (DEBUG, INFO, WARNING, ERROR) -
log_file(Optional[str]): Path to log file
Returns:
-
logging.Logger: Configured logger
Example:
from src.utils import setup_logger
logger = setup_logger(
name="my_app",
level="DEBUG",
log_file="app.log"
)
logger.info("Application started")
logger.debug("Debug information")Location: src/cli.py
def run_cli() -> NoneMain CLI entry point.
Usage:
python main.py create "topic" [options]
python main.py config
python main.py version{
"topic": str,
"analysis": str,
"search_results": [
{
"title": str,
"body": str,
"href": str
}
],
"synthesis": str,
"sources_count": int
}{
"title": str,
"content": str, # Markdown formatted
"outline": str,
"meta_description": str,
"tags": List[str], # 5-8 tags
"word_count": int, # 1200-1500
"topic": str
}{
"images": [
{
"url": str,
"description": str,
"author": str,
"author_url": str
}
]
}{
"platform_name": {
"success": bool,
"platform": str,
"markdown_file": Optional[str],
"metadata_file": Optional[str],
"url": Optional[str],
"error": Optional[str]
}
}from src.orchestrator import ContentCreationOrchestrator
from src.utils import Config, setup_logger
# Setup
logger = setup_logger(level="INFO")
config = Config.from_env()
config.validate_required()
# Create orchestrator
orchestrator = ContentCreationOrchestrator(config)
# Create content
results = orchestrator.create_content(
topic="The Future of AI",
style="professional",
target_audience="business leaders",
platforms=["file", "medium"],
output_dir="./articles"
)
# Handle results
if results["status"] == "completed":
print("✓ Success!")
print(orchestrator.get_summary(results))
article = results["article"]
print(f"\nTitle: {article['title']}")
print(f"Words: {article['word_count']}")
print(f"Tags: {', '.join(article['tags'])}")
# Access files
pub = results["publication"]["file"]
print(f"\nMarkdown: {pub['markdown_file']}")
print(f"Metadata: {pub['metadata_file']}")
else:
print(f"✗ Failed: {results.get('error')}")from src.agents import ResearchAgent, WriterAgent, ImageAgent, PublisherAgent
from src.utils import Config
from langchain_openai import ChatOpenAI
# Setup
config = Config.from_env()
llm = ChatOpenAI(
model=config.openai_model,
temperature=config.temperature,
api_key=config.openai_api_key
)
# Research
researcher = ResearchAgent(llm, max_sources=5)
research = researcher.research("Machine Learning")
# Write
writer = WriterAgent(llm)
article = writer.write_article(
research_data=research,
style="technical",
target_audience="developers"
)
# Images
image_handler = ImageAgent(llm, config.unsplash_access_key)
images = image_handler.find_images(
article_content=article["content"],
article_title=article["title"]
)
# Publish
publisher = PublisherAgent(config.medium_access_token)
results = publisher.publish(
article=article,
images=images,
platforms=["file"],
output_dir="./output"
)from src.utils import Config
# Create custom config
config = Config(
openai_api_key="sk-...",
openai_model="gpt-3.5-turbo",
temperature=0.5,
max_research_sources=3,
max_retries=5,
log_level="DEBUG"
)
# Use config
orchestrator = ContentCreationOrchestrator(config)topics = [
"AI in Healthcare",
"Blockchain Technology",
"Renewable Energy"
]
for topic in topics:
print(f"Processing: {topic}")
results = orchestrator.create_content(
topic=topic,
style="professional",
target_audience="general audience",
platforms=["file"],
output_dir=f"./articles/{topic.replace(' ', '_').lower()}"
)
if results["status"] == "completed":
print(f"✓ {topic} completed")
else:
print(f"✗ {topic} failed: {results.get('error')}")try:
results = orchestrator.create_content(
topic="Your Topic",
style="professional",
target_audience="general audience"
)
if results["status"] == "completed":
print("Success!")
else:
print(f"Failed: {results.get('error')}")
except ValueError as e:
print(f"Configuration error: {e}")
except Exception as e:
print(f"Unexpected error: {e}")More examples? Check out the Usage Guide and examples.py.
Need help? See the FAQ or open an issue.