from .utils.file_formats import \ write_md_to_pdf, \ write_md_to_word, \ write_text_to_md from .utils.views import print_agent_output class PublisherAgent: def __init__(self, output_dir: str, websocket=None, stream_output=None, headers=None): self.websocket = websocket self.stream_output = stream_output self.output_dir = output_dir self.headers = headers or {} async def publish_research_report(self, research_state: dict, publish_formats: dict): layout = self.generate_layout(research_state) await self.write_report_by_formats(layout, publish_formats) return layout def generate_layout(self, research_state: dict): sections = '\n\n'.join(f"{value}" for subheader in research_state.get("research_data") for key, value in subheader.items()) references = '\n'.join(f"{reference}" for reference in research_state.get("sources")) headers = research_state.get("headers") layout = f"""# {headers.get('title')} #### {headers.get("date")}: {research_state.get('date')} ## {headers.get("introduction")} {research_state.get('introduction')} ## {headers.get("table_of_contents")} {research_state.get('table_of_contents')} {sections} ## {headers.get("conclusion")} {research_state.get('conclusion')} ## {headers.get("references")} {references} """ return layout async def write_report_by_formats(self, layout:str, publish_formats: dict): if publish_formats.get("pdf"): await write_md_to_pdf(layout, self.output_dir) if publish_formats.get("docx"): await write_md_to_word(layout, self.output_dir) if publish_formats.get("markdown"): await write_text_to_md(layout, self.output_dir) async def run(self, research_state: dict): task = research_state.get("task") publish_formats = task.get("publish_formats") if self.websocket and self.stream_output: await self.stream_output("logs", "publishing", f"Publishing final research report based on retrieved data...", self.websocket) else: print_agent_output(output="Publishing final research report based on retrieved data...", agent="PUBLISHER") final_research_report = await self.publish_research_report(research_state, publish_formats) return {"report": final_research_report}