Spaces:
Running
Running
| # Writer Agents Usage Examples | |
| This document provides examples of how to use the writer agents in DeepCritical for generating research reports. | |
| ## Overview | |
| DeepCritical provides three writer agents for different report generation scenarios: | |
| 1. **WriterAgent** - Basic writer for simple reports from findings | |
| 2. **LongWriterAgent** - Iterative writer for long-form multi-section reports | |
| 3. **ProofreaderAgent** - Finalizes and polishes report drafts | |
| ## WriterAgent | |
| The `WriterAgent` generates final reports from research findings. It's used in iterative research flows. | |
| ### Basic Usage | |
| ```python | |
| from src.agent_factory.agents import create_writer_agent | |
| # Create writer agent | |
| writer = create_writer_agent() | |
| # Generate report | |
| query = "What is the capital of France?" | |
| findings = """ | |
| Paris is the capital of France [1]. | |
| It is located in the north-central part of the country [2]. | |
| [1] https://example.com/france-info | |
| [2] https://example.com/paris-info | |
| """ | |
| report = await writer.write_report( | |
| query=query, | |
| findings=findings, | |
| ) | |
| print(report) | |
| ``` | |
| ### With Output Length Specification | |
| ```python | |
| report = await writer.write_report( | |
| query="Explain machine learning", | |
| findings=findings, | |
| output_length="500 words", | |
| ) | |
| ``` | |
| ### With Additional Instructions | |
| ```python | |
| report = await writer.write_report( | |
| query="Explain machine learning", | |
| findings=findings, | |
| output_length="A comprehensive overview", | |
| output_instructions="Use formal academic language and include examples", | |
| ) | |
| ``` | |
| ### Integration with IterativeResearchFlow | |
| The `WriterAgent` is automatically used by `IterativeResearchFlow`: | |
| ```python | |
| from src.agent_factory.agents import create_iterative_flow | |
| flow = create_iterative_flow(max_iterations=5, max_time_minutes=10) | |
| report = await flow.run( | |
| query="What is quantum computing?", | |
| output_length="A detailed explanation", | |
| output_instructions="Include practical applications", | |
| ) | |
| ``` | |
| ## LongWriterAgent | |
| The `LongWriterAgent` iteratively writes report sections with proper citation management. It's used in deep research flows. | |
| ### Basic Usage | |
| ```python | |
| from src.agent_factory.agents import create_long_writer_agent | |
| from src.utils.models import ReportDraft, ReportDraftSection | |
| # Create long writer agent | |
| long_writer = create_long_writer_agent() | |
| # Create report draft with sections | |
| report_draft = ReportDraft( | |
| sections=[ | |
| ReportDraftSection( | |
| section_title="Introduction", | |
| section_content="Draft content for introduction with [1].", | |
| ), | |
| ReportDraftSection( | |
| section_title="Methods", | |
| section_content="Draft content for methods with [2].", | |
| ), | |
| ReportDraftSection( | |
| section_title="Results", | |
| section_content="Draft content for results with [3].", | |
| ), | |
| ] | |
| ) | |
| # Generate full report | |
| report = await long_writer.write_report( | |
| original_query="What are the main features of Python?", | |
| report_title="Python Programming Language Overview", | |
| report_draft=report_draft, | |
| ) | |
| print(report) | |
| ``` | |
| ### Writing Individual Sections | |
| You can also write sections one at a time: | |
| ```python | |
| # Write first section | |
| section_output = await long_writer.write_next_section( | |
| original_query="What is Python?", | |
| report_draft="", # No existing draft | |
| next_section_title="Introduction", | |
| next_section_draft="Python is a programming language...", | |
| ) | |
| print(section_output.next_section_markdown) | |
| print(section_output.references) | |
| # Write second section with existing draft | |
| section_output = await long_writer.write_next_section( | |
| original_query="What is Python?", | |
| report_draft="# Report\n\n## Introduction\n\nContent...", | |
| next_section_title="Features", | |
| next_section_draft="Python features include...", | |
| ) | |
| ``` | |
| ### Integration with DeepResearchFlow | |
| The `LongWriterAgent` is automatically used by `DeepResearchFlow`: | |
| ```python | |
| from src.agent_factory.agents import create_deep_flow | |
| flow = create_deep_flow( | |
| max_iterations=5, | |
| max_time_minutes=10, | |
| use_long_writer=True, # Use long writer (default) | |
| ) | |
| report = await flow.run("What are the main features of Python programming language?") | |
| ``` | |
| ## ProofreaderAgent | |
| The `ProofreaderAgent` finalizes and polishes report drafts by removing duplicates, adding summaries, and refining wording. | |
| ### Basic Usage | |
| ```python | |
| from src.agent_factory.agents import create_proofreader_agent | |
| from src.utils.models import ReportDraft, ReportDraftSection | |
| # Create proofreader agent | |
| proofreader = create_proofreader_agent() | |
| # Create report draft | |
| report_draft = ReportDraft( | |
| sections=[ | |
| ReportDraftSection( | |
| section_title="Introduction", | |
| section_content="Python is a programming language [1].", | |
| ), | |
| ReportDraftSection( | |
| section_title="Features", | |
| section_content="Python has many features [2].", | |
| ), | |
| ] | |
| ) | |
| # Proofread and finalize | |
| final_report = await proofreader.proofread( | |
| query="What is Python?", | |
| report_draft=report_draft, | |
| ) | |
| print(final_report) | |
| ``` | |
| ### Integration with DeepResearchFlow | |
| Use `ProofreaderAgent` instead of `LongWriterAgent`: | |
| ```python | |
| from src.agent_factory.agents import create_deep_flow | |
| flow = create_deep_flow( | |
| max_iterations=5, | |
| max_time_minutes=10, | |
| use_long_writer=False, # Use proofreader instead | |
| ) | |
| report = await flow.run("What are the main features of Python?") | |
| ``` | |
| ## Error Handling | |
| All writer agents include robust error handling: | |
| ### Handling Empty Inputs | |
| ```python | |
| # WriterAgent handles empty findings gracefully | |
| report = await writer.write_report( | |
| query="Test query", | |
| findings="", # Empty findings | |
| ) | |
| # Returns a fallback report | |
| # LongWriterAgent handles empty sections | |
| report = await long_writer.write_report( | |
| original_query="Test", | |
| report_title="Test Report", | |
| report_draft=ReportDraft(sections=[]), # Empty draft | |
| ) | |
| # Returns minimal report | |
| # ProofreaderAgent handles empty drafts | |
| report = await proofreader.proofread( | |
| query="Test", | |
| report_draft=ReportDraft(sections=[]), | |
| ) | |
| # Returns minimal report | |
| ``` | |
| ### Retry Logic | |
| All agents automatically retry on transient errors (timeouts, connection errors): | |
| ```python | |
| # Automatically retries up to 3 times on transient failures | |
| report = await writer.write_report( | |
| query="Test query", | |
| findings=findings, | |
| ) | |
| ``` | |
| ### Fallback Reports | |
| If all retries fail, agents return fallback reports: | |
| ```python | |
| # Returns fallback report with query and findings | |
| report = await writer.write_report( | |
| query="Test query", | |
| findings=findings, | |
| ) | |
| # Fallback includes: "# Research Report\n\n## Query\n...\n\n## Findings\n..." | |
| ``` | |
| ## Citation Validation | |
| ### For Markdown Reports | |
| Use the markdown citation validator: | |
| ```python | |
| from src.utils.citation_validator import validate_markdown_citations | |
| from src.utils.models import Evidence, Citation | |
| # Collect evidence during research | |
| evidence = [ | |
| Evidence( | |
| content="Paris is the capital of France", | |
| citation=Citation( | |
| source="web", | |
| title="France Information", | |
| url="https://example.com/france", | |
| date="2024-01-01", | |
| ), | |
| ), | |
| ] | |
| # Generate report | |
| report = await writer.write_report(query="What is the capital of France?", findings=findings) | |
| # Validate citations | |
| validated_report, removed_count = validate_markdown_citations(report, evidence) | |
| if removed_count > 0: | |
| print(f"Removed {removed_count} invalid citations") | |
| ``` | |
| ### For ResearchReport Objects | |
| Use the structured citation validator: | |
| ```python | |
| from src.utils.citation_validator import validate_references | |
| # For ResearchReport objects (from ReportAgent) | |
| validated_report = validate_references(report, evidence) | |
| ``` | |
| ## Custom Model Configuration | |
| All writer agents support custom model configuration: | |
| ```python | |
| from pydantic_ai import Model | |
| # Create custom model | |
| custom_model = Model("openai", "gpt-4") | |
| # Use with writer agents | |
| writer = create_writer_agent(model=custom_model) | |
| long_writer = create_long_writer_agent(model=custom_model) | |
| proofreader = create_proofreader_agent(model=custom_model) | |
| ``` | |
| ## Best Practices | |
| 1. **Use WriterAgent for simple reports** - When you have findings as a string and need a quick report | |
| 2. **Use LongWriterAgent for structured reports** - When you need multiple sections with proper citation management | |
| 3. **Use ProofreaderAgent for final polish** - When you have draft sections and need a polished final report | |
| 4. **Validate citations** - Always validate citations against collected evidence | |
| 5. **Handle errors gracefully** - All agents return fallback reports on failure | |
| 6. **Specify output length** - Use `output_length` parameter to control report size | |
| 7. **Provide instructions** - Use `output_instructions` for specific formatting requirements | |
| ## Integration Examples | |
| ### Full Iterative Research Flow | |
| ```python | |
| from src.agent_factory.agents import create_iterative_flow | |
| flow = create_iterative_flow( | |
| max_iterations=5, | |
| max_time_minutes=10, | |
| ) | |
| report = await flow.run( | |
| query="What is machine learning?", | |
| output_length="A comprehensive 1000-word explanation", | |
| output_instructions="Include practical examples and use cases", | |
| ) | |
| ``` | |
| ### Full Deep Research Flow with Long Writer | |
| ```python | |
| from src.agent_factory.agents import create_deep_flow | |
| flow = create_deep_flow( | |
| max_iterations=5, | |
| max_time_minutes=10, | |
| use_long_writer=True, | |
| ) | |
| report = await flow.run("What are the main features of Python programming language?") | |
| ``` | |
| ### Full Deep Research Flow with Proofreader | |
| ```python | |
| from src.agent_factory.agents import create_deep_flow | |
| flow = create_deep_flow( | |
| max_iterations=5, | |
| max_time_minutes=10, | |
| use_long_writer=False, # Use proofreader | |
| ) | |
| report = await flow.run("Explain quantum computing basics") | |
| ``` | |
| ## Troubleshooting | |
| ### Empty Reports | |
| If you get empty reports, check: | |
| - Input validation logs (agents log warnings for empty inputs) | |
| - LLM API key configuration | |
| - Network connectivity | |
| ### Citation Issues | |
| If citations are missing or invalid: | |
| - Use `validate_markdown_citations()` to check citations | |
| - Ensure Evidence objects are properly collected during research | |
| - Check that URLs in findings match Evidence URLs | |
| ### Performance Issues | |
| For large reports: | |
| - Use `LongWriterAgent` for better section management | |
| - Consider truncating very long findings (agents do this automatically) | |
| - Use appropriate `max_time_minutes` settings | |
| ## See Also | |
| - [Research Flows Documentation](../orchestrator/research_flows.md) | |
| - [Citation Validation](../utils/citation_validation.md) | |
| - [Agent Factory](../agent_factory/agents.md) | |