|  |  | 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.")
 |