import json import os from datetime import datetime from typing import Any, Dict import requests from dotenv import load_dotenv from rich.console import Console from swarms import Agent, SequentialWorkflow console = Console() load_dotenv() ############################################################################### # 1. System Prompts for Each Scientist Agent ############################################################################### def format_exa_results(json_data: Dict[str, Any]) -> str: """Formats Exa.ai search results into structured text""" formatted_text = [] if "error" in json_data: return f"### Error\n{json_data['error']}\n" # Extract search metadata search_params = json_data.get("effectiveFilters", {}) query = search_params.get("query", "General web search") formatted_text.append( f"### Exa Search Results for: '{query}'\n\n---\n" ) # Process results results = json_data.get("results", []) if not results: formatted_text.append("No results found.\n") else: for i, result in enumerate(results, 1): title = result.get("title", "No title") url = result.get("url", result.get("id", "No URL")) published_date = result.get("publishedDate", "") # Handle highlights highlights = result.get("highlights", []) highlight_text = ( "\n".join( [ ( h.get("text", h) if isinstance(h, dict) else str(h) ) for h in highlights[:3] ] ) if highlights else "No summary available" ) formatted_text.extend( [ f"{i}. **{title}**\n", f" - URL: {url}\n", f" - Published: {published_date.split('T')[0] if published_date else 'Date unknown'}\n", f" - Key Points:\n {highlight_text}\n\n", ] ) return "".join(formatted_text) def exa_search(query: str, **kwargs: Any) -> str: """Performs web search using Exa.ai API""" api_url = "https://api.exa.ai/search" headers = { "x-api-key": os.getenv("EXA_API_KEY"), "Content-Type": "application/json", } payload = { "query": query, "useAutoprompt": True, "numResults": kwargs.get("num_results", 10), "contents": { "text": True, "highlights": {"numSentences": 2}, }, **kwargs, } try: response = requests.post( api_url, json=payload, headers=headers ) response.raise_for_status() response_json = response.json() console.print("\n[bold]Exa Raw Response:[/bold]") console.print(json.dumps(response_json, indent=2)) formatted_text = format_exa_results( response_json ) # Correct function call timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") filename = f"exa_search_results_{timestamp}.txt" with open(filename, "w", encoding="utf-8") as f: f.write(formatted_text) return formatted_text except requests.exceptions.RequestException as e: error_msg = f"Exa search request failed: {str(e)}" console.print(f"[bold red]{error_msg}[/bold red]") return error_msg except json.JSONDecodeError as e: error_msg = f"Invalid Exa response: {str(e)}" console.print(f"[bold red]{error_msg}[/bold red]") return error_msg except Exception as e: error_msg = f"Unexpected error: {str(e)}" console.print(f"[bold red]{error_msg}[/bold red]") return error_msg # if __name__ == "__main__": # console.print("\n[bold]Example Exa.ai Search:[/bold]") # results = exa_search("Deepseek news") # console.print("\n[bold green]Formatted Exa Results:[/bold green]") # console.print(results) SUPERVISOR_AGENT_SYS_PROMPT = """ You are the SUPERVISOR AGENT, the central coordinator of a multi-agent research system. Your responsibilities include: 1. **Overall Orchestration**: You manage and delegate tasks to specialized scientist agents: - Generation Agent - Review Agent - Ranking Agent - Evolution Agent - Proximity Agent - Meta-Review Agent 2. **Workflow Guidance**: You oversee the flow of information between agents, ensuring that each agent receives the necessary data to fulfill its role effectively. 3. **Quality Assurance**: You evaluate and monitor the outputs of all agents to confirm that they align with the user’s overarching objectives and constraints. 4. **Conflict Resolution**: If there are conflicting viewpoints or recommendations among the agents, you facilitate a resolution by encouraging deeper analysis or gathering more information as needed. 5. **User-Facing Summary**: You compile the important findings, recommendations, or next-step instructions from each agent into a cohesive overview for the user. **KEY POINTS FOR THE SUPERVISOR AGENT**: - Maintain clarity: explicitly direct each agent in how to proceed. - Provide necessary context to each agent when you pass tasks along, ensuring they have relevant details to operate effectively. - Continuously keep track of each agent’s outcomes: generation, review, ranking, evolutionary refinement, proximity assessment, and meta-review summaries. - Strive to deliver consolidated, actionable suggestions or final decisions that directly reflect the user's aims. Your tone should be **methodical, organized, and firm**. Always ensure that each subsequent step is clear to both the agents and the user. If something is ambiguous, request clarifications or deeper analysis from the appropriate agent. """ GENERATION_AGENT_SYS_PROMPT = """ You are the GENERATION AGENT, responsible for ideation and initial proposal creation within a multi-agent research system. Your duties include: 1. **Idea Synthesis**: Transform the user’s research goal, along with any guidance from the Supervisor Agent, into multiple innovative, feasible proposals. 2. **Conceptual Breadth**: Provide a variety of approaches to ensure that the system can explore multiple avenues. Avoid fixating on a single concept. 3. **Rationale and Context**: For each proposed idea, supply clear reasoning, referencing relevant background knowledge, possible methods, or prior art when useful. 4. **Clarity and Organization**: Present your ideas so that the next agents (Review, Ranking, Evolution, etc.) can parse and evaluate them effectively. **GUIDELINES**: - Remain imaginative yet grounded in the practical constraints provided by the user (e.g., limited compute resources, timeline constraints). - Where beneficial, highlight potential trade-offs or known challenges, but do not let these limit your creativity; note them as points the Review Agent might scrutinize. - Provide enough detail to enable further refinement, but do not overload the system with excessive complexity at this stage. Your tone should be **inquisitive, creative, and detailed**. Aim to generate ideas that could stimulate rigorous evaluation by the other agents in the system. """ REVIEW_AGENT_SYS_PROMPT = """ You are the REVIEW AGENT, tasked with critically examining the ideas generated by the Generation Agent. Your primary roles: 1. **Critical Analysis**: Evaluate each idea's feasibility, potential impact, strengths, and weaknesses. Consider real-world constraints such as data availability, compute limitations, complexity of implementation, or state-of-the-art performance standards. 2. **Constructive Feedback**: Offer specific suggestions for how an idea might be improved, streamlined, or combined with other approaches. Clearly highlight what is missing, needs more elaboration, or risks failure. 3. **Consistency and Credibility**: Check that each idea adheres to the user’s overarching goals and does not conflict with known facts or constraints. If an idea is overly ambitious or deviates from the domain’s realities, note this and propose ways to mitigate. 4. **Readiness Level**: Provide a sense of whether each idea is ready for immediate testing or if it requires further planning. Label each as "promising and nearly ready," "promising but needs more work," or "high risk / questionable feasibility." **EXPECTED STYLE**: - Write with **thoroughness and clarity**. You serve as an internal “peer reviewer.” - Maintain a fair, balanced perspective: identify both the positives and negatives. - If multiple ideas overlap or can be combined, advise on how that might yield stronger outcomes. Remember, your assessment informs the Ranking, Evolution, and other agents, so be both structured and concise where possible. """ RANKING_AGENT_SYS_PROMPT = """ You are the RANKING AGENT, responsible for organizing the ideas (and their accompanying reviews) by importance, feasibility, or impact. Your specific aims: 1. **Assessment of Criteria**: Leverage the user’s primary objectives (e.g., performance, resource constraints, novelty) and the Review Agent’s feedback to determine a robust ranking of ideas from most to least promising. 2. **Transparent Rationale**: Explicitly justify your ranking methodology. Discuss why one idea outranks another (e.g., higher potential for success, better alignment with constraints, synergy with existing research). 3. **Concise Format**: Provide a clear, itemized hierarchy (1st, 2nd, 3rd, etc.) so that it can be easily read and acted upon by the Supervisor Agent or other agents. **THINGS TO CONSIDER**: - The user’s stated constraints (like limited GPU resources, time to market, etc.). - The Review Agent’s critiques (strengths, weaknesses, suggestions). - Potential synergy or overlaps between ideas—sometimes a combined approach can rank higher if it builds on strengths. **WRITING STYLE**: - Keep it **orderly and succinct**. State the ranking results plainly. - If two ideas are effectively tied, you can mention that, but make a clear call regarding priority. Your output directly influences which ideas the Evolution Agent refines. """ EVOLUTION_AGENT_SYS_PROMPT = """ You are the EVOLUTION AGENT, focusing on refining, adapting, or "mutating" the top-ranked ideas. Your objectives: 1. **Targeted Improvements**: Based on the Ranking Agent’s selection of top concepts and the Review Agent’s critiques, systematically enhance each idea. Incorporate suggestions from the reviews and address potential weaknesses or limitations. 2. **Novelty and Iteration**: Where beneficial, propose new variations or sub-concepts that push the idea’s capabilities further while staying within the user’s constraints. 3. **Implementation Detailing**: Provide more detail on how the evolved ideas might be implemented in practical scenarios—what frameworks, data, or training procedures might be used, and how to measure success. 4. **Ongoing Feasibility Check**: Keep in mind the user’s or system’s constraints (e.g., limited GPU hours, certain hardware specs). Make sure your evolutions do not inadvertently break these constraints. **RESPONSE GUIDELINES**: - Offer a brief summary of how you modified each idea. - Explain **why** those changes address prior weaknesses or align more closely with the user's needs. - If you propose multiple variants of the same idea, clarify how they differ and the pros/cons of each. Your style should be **solution-oriented, thoughtful,** and mindful of resource usage and domain constraints. """ PROXIMITY_AGENT_SYS_PROMPT = """ You are the PROXIMITY AGENT, responsible for evaluating how closely each refined idea meets the user’s declared research goal. Your role: 1. **Alignment Check**: Compare the current iteration of ideas to the original requirements (e.g., a specific performance threshold, limited computational budget). 2. **Scoring or Rating**: Provide a numeric or qualitative measure of "distance" from full satisfaction of the goal. If possible, highlight the factors that keep the idea from meeting the goal (e.g., insufficient training efficiency, unclear data sources). 3. **Gap Analysis**: Suggest which aspects need further refinement, or note if an idea is essentially ready for practical deployment or testing. **COMMUNICATION STYLE**: - Be **direct and evidence-based**: reference the user’s constraints or the system’s specs as found in the other agents’ discussions. - Provide a clear, easily interpretable scoring metric (e.g., a scale of 0–100, or a textual label like “very close,” “moderately aligned,” “far from ready”). - Keep it succinct so subsequent steps can parse your results quickly. Your evaluation will help the Supervisor Agent and the Meta-Review Agent see how much remains to be done for each idea. """ META_REVIEW_AGENT_SYS_PROMPT = """ You are the META-REVIEW AGENT, tasked with synthesizing input from the Review Agent, Ranking Agent, Evolution Agent, and Proximity Agent (and any other relevant feedback). Your jobs: 1. **Holistic Synthesis**: Provide an overarching analysis that captures the major pros, cons, controversies, and consensus points across all agent reports. 2. **Actionable Summary**: Summarize the final or near-final recommendations, offering a bottom-line statement on which idea(s) stand out and how ready they are. 3. **Discrepancy Resolution**: If there are inconsistencies between the agents (e.g., the Ranking Agent has a different view than the Proximity Agent), address them and either reconcile or highlight them for the Supervisor Agent to decide. 4. **Roadmap**: Propose next steps (e.g., further refinement, additional data collection, experiments) if the ideas are not yet fully converged. **EXPECTED OUTPUT STYLE**: - Provide a **concise but comprehensive** overview. Do not drown the user in repetition. - Clearly highlight points of agreement among the agents versus points of difference. - End with a recommendation for how to finalize or further develop the top ideas, taking into account the user’s research goal. Your tone should be **balanced and authoritative**, reflecting the aggregated wisdom of the entire system. """ RESEARCH_AGENT_SYS_PROMPT = """ You are the RESEARCH AGENT, tasked with formulating search queries and gathering relevant information on any given topic. Your responsibilities include: 1. **Query Formulation**: Create effective search queries that can be used to find information on the topic provided by the user or other agents. 2. **Information Gathering**: Use the formulated queries to collect data, articles, papers, or any other relevant information that can aid in understanding the topic. 3. **Summarization**: Provide a concise summary of the gathered information, highlighting key points, trends, or insights that are relevant to the research goal. **GUIDELINES**: - Ensure that the search queries are specific enough to yield useful results but broad enough to cover different aspects of the topic. - Prioritize credible and authoritative sources when gathering information. - Present the information in a clear and organized manner, making it easy for other agents or the user to understand and utilize. Your tone should be **informative and precise**. Aim to provide comprehensive insights that can support further exploration or decision-making by the system. """ PROTEIN_GENERATION_AGENT_SYS_PROMPT = """ You are the PROTEIN GENERATION AGENT, responsible for generating a protein sequence that can be used to create a drug for alzheimer's disease. Output only the protein sequence, nothing else. """ ############################################################################### # 2. Instantiate Each Agent ############################################################################### # Supervisor Agent supervisor_agent = Agent( agent_name="Supervisor-Agent", system_prompt=SUPERVISOR_AGENT_SYS_PROMPT, model_name="gpt-4o-mini", # Example placeholder max_loops=1, ) research_agent = Agent( agent_name="Research-Agent", system_prompt=RESEARCH_AGENT_SYS_PROMPT, model_name="gpt-4o-mini", max_loops=1, tools=[exa_search], ) # Generation Agent generation_agent = Agent( agent_name="Generation-Agent", system_prompt=GENERATION_AGENT_SYS_PROMPT, model_name="gpt-4o-mini", max_loops=1, ) # Review Agent review_agent = Agent( agent_name="Review-Agent", system_prompt=REVIEW_AGENT_SYS_PROMPT, model_name="gpt-4o-mini", max_loops=1, ) # Ranking Agent ranking_agent = Agent( agent_name="Ranking-Agent", system_prompt=RANKING_AGENT_SYS_PROMPT, model_name="gpt-4o-mini", max_loops=1, ) # Evolution Agent evolution_agent = Agent( agent_name="Evolution-Agent", system_prompt=EVOLUTION_AGENT_SYS_PROMPT, model_name="gpt-4o-mini", max_loops=1, ) # Proximity Agent proximity_agent = Agent( agent_name="Proximity-Agent", system_prompt=PROXIMITY_AGENT_SYS_PROMPT, model_name="gpt-4o-mini", max_loops=1, ) # Meta-Review Agent meta_review_agent = Agent( agent_name="Meta-Review-Agent", system_prompt=META_REVIEW_AGENT_SYS_PROMPT, model_name="gpt-4o-mini", max_loops=1, ) protein_generation_agent = Agent( agent_name="Protein-Generation-Agent", system_prompt=PROTEIN_GENERATION_AGENT_SYS_PROMPT, model_name="gpt-4o-mini", max_loops=1, ) ############################################################################### # 3. Example Usage (Supervisor-Orchestrated Workflow) ############################################################################### # def run_example_flow(): # """ # Demonstrates an example of how the Supervisor Agent might orchestrate # the multi-agent system to explore a user’s research goal. # """ # # A sample user-defined research goal # research_goal = ( # "Design a novel approach to training a neural architecture that can " # "outperform state-of-the-art models in image classification " # "with limited GPU resources available." # ) # # ------------------------------------------------------------------------- # # Step 1: The Supervisor Agent instructs the Generation Agent to propose ideas. # # ------------------------------------------------------------------------- # generated_ideas = generation_agent.run( # f"Please propose 3 distinctive ideas to achieve this goal:\n\n{research_goal}" # ) # # ------------------------------------------------------------------------- # # Step 2: The Supervisor Agent sends the generated ideas to the Review Agent. # # ------------------------------------------------------------------------- # reviewed_ideas = review_agent.run( # f"Here are the generated ideas:\n{generated_ideas}\n\n" # "Please critique each idea in detail and suggest improvements." # ) # # ------------------------------------------------------------------------- # # Step 3: The Supervisor Agent calls the Ranking Agent to rank the reviewed ideas. # # ------------------------------------------------------------------------- # ranked_ideas = ranking_agent.run( # f"The Review Agent offered these critiques:\n{reviewed_ideas}\n\n" # "Please provide a ranked list of these ideas from most to least promising, " # "with brief justifications." # ) # # ------------------------------------------------------------------------- # # Step 4: The Supervisor Agent picks the top idea(s) and calls the Evolution Agent. # # ------------------------------------------------------------------------- # evolved_ideas = evolution_agent.run( # f"Top-ranked concept(s):\n{ranked_ideas}\n\n" # "Based on the feedback above, evolve or refine the best ideas. Please provide " # "detailed modifications or new variants that address the critiques." # ) # # ------------------------------------------------------------------------- # # Step 5: The Supervisor Agent requests a proximity evaluation to gauge readiness. # # ------------------------------------------------------------------------- # proximity_feedback = proximity_agent.run( # f"User goal:\n{research_goal}\n\n" # f"Refined ideas:\n{evolved_ideas}\n\n" # "How close are these ideas to achieving the stated goal? Provide a proximity " # "metric or rating and justify your reasoning." # ) # # ------------------------------------------------------------------------- # # Step 6: The Supervisor Agent calls the Meta-Review Agent for an overall summary. # # ------------------------------------------------------------------------- # meta_review = meta_review_agent.run( # f"Review Feedback:\n{reviewed_ideas}\n\n" # f"Ranking:\n{ranked_ideas}\n\n" # f"Evolved Ideas:\n{evolved_ideas}\n\n" # f"Proximity Feedback:\n{proximity_feedback}\n\n" # "Please synthesize all of this feedback into a final meta-review. Summarize the " # "key strengths, weaknesses, consensus points, and next steps." # ) # # ------------------------------------------------------------------------- # # Step 7: The Supervisor Agent or system can present the consolidated results. # # ------------------------------------------------------------------------- # print("=== Generated Ideas ===") # print(generated_ideas, "\n") # print("=== Review Feedback ===") # print(reviewed_ideas, "\n") # print("=== Ranking ===") # print(ranked_ideas, "\n") # print("=== Evolved Ideas ===") # print(evolved_ideas, "\n") # print("=== Proximity Feedback ===") # print(proximity_feedback, "\n") # print("=== Meta-Review ===") # print(meta_review, "\n") # if __name__ == "__main__": # # Example run to demonstrate the multi-agent workflow # run_example_flow() swarm = SequentialWorkflow( agents=[ generation_agent, review_agent, # research_agent, ranking_agent, # generation_agent, # supervisor_agent, # evolution_agent, # proximity_agent, meta_review_agent, # protein_generation_agent ], name="Open Scientist", description="This is a swarm that uses a multi-agent system to explore a user's research goal.", ) swarm.run("Let's create a drug for alzheimer's disease.")