Spaces:
Running
Running
import os | |
import json | |
import logging | |
from datetime import datetime, timedelta | |
from langchain_google_genai import ChatGoogleGenerativeAI | |
from langchain.schema import SystemMessage, HumanMessage | |
logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s") | |
class Agent: | |
def __init__(self, role: str, goal: str, backstory: str, personality: str = "", llm=None) -> None: | |
""" | |
Initialize an Agent with role, goal, backstory, personality, and assigned LLM. | |
""" | |
self.role = role | |
self.goal = goal | |
self.backstory = backstory | |
self.personality = personality | |
self.tools = [] # Initialize with empty list for future tool integrations | |
self.llm = llm | |
class Task: | |
def __init__(self, description: str, agent: Agent, expected_output: str, context=None) -> None: | |
""" | |
Initialize a Task with its description, the responsible agent, expected output, and optional context. | |
""" | |
self.description = description | |
self.agent = agent | |
self.expected_output = expected_output | |
self.context = context or [] | |
google_api_key = os.getenv("GEMINI_API_KEY") # 실제 Google API 키 사용 | |
if not google_api_key: | |
logging.error("GEMINI_API_KEY is not set in the environment variables.") | |
llm = ChatGoogleGenerativeAI(model="gemini-2.0-flash", google_api_key=google_api_key) | |
# ------------------------------------------------------------------------------- | |
# Define Academic Research Agents | |
# ------------------------------------------------------------------------------- | |
literature_research_agent = Agent( | |
role="Literature Research Agent", | |
goal="Research and provide a comprehensive review of existing literature on the research topic.", | |
backstory="An experienced academic researcher specialized in literature reviews and meta-analyses.", | |
personality="Analytical, thorough, and detail-oriented.", | |
llm=llm, | |
) | |
outline_agent = Agent( | |
role="Outline Agent", | |
goal="Generate a structured and detailed outline for a research paper based on the research topic and literature.", | |
backstory="A methodical academic planner who organizes research findings into coherent paper structures.", | |
personality="Organized, systematic, and insightful.", | |
llm=llm, | |
) | |
draft_writing_agent = Agent( | |
role="Draft Writing Agent", | |
goal="Compose a first draft of the research paper based on the literature review and outline.", | |
backstory="A skilled academic writer capable of synthesizing research findings into well-structured drafts.", | |
personality="Articulate, precise, and scholarly.", | |
llm=llm, | |
) | |
citation_agent = Agent( | |
role="Citation Agent", | |
goal="Generate a list of relevant citations and references in the required format for the research paper.", | |
backstory="A detail-oriented bibliographic expert with extensive knowledge of citation standards.", | |
personality="Meticulous, accurate, and research-savvy.", | |
llm=llm, | |
) | |
editing_agent = Agent( | |
role="Editing Agent", | |
goal="Revise and polish the draft for clarity, coherence, and academic tone.", | |
backstory="An expert editor skilled in improving academic manuscripts and ensuring high-quality presentation.", | |
personality="Critical, precise, and supportive.", | |
llm=llm, | |
) | |
chatbot_agent = Agent( | |
role="Chatbot Agent", | |
goal="Engage in interactive conversation to answer queries related to the academic research process.", | |
backstory="A conversational AI assistant with extensive knowledge in academia and research methodologies.", | |
personality="Helpful, conversational, and knowledgeable.", | |
llm=llm, | |
) | |
# ------------------------------------------------------------------------------- | |
# Define Tasks for Academic Research and Writing | |
# ------------------------------------------------------------------------------- | |
literature_research_task = Task( | |
description="""Research academic literature on {topic} considering the keywords {keywords}. | |
Please provide: | |
- A summary of the current state of research, | |
- Key trends and gaps in the literature, | |
- Notable studies and their findings, | |
- Relevant theoretical frameworks and methodologies. | |
Format the response with bullet points and concise summaries.""", | |
agent=literature_research_agent, | |
expected_output="""A comprehensive literature review summary covering: | |
1. Summary of current research trends | |
2. Identification of gaps and controversies | |
3. Key studies with brief descriptions | |
4. Theoretical frameworks and methodologies used""" | |
) | |
outline_task = Task( | |
description="""Based on the research topic {topic} and literature review findings, generate a detailed outline for a research paper. | |
Include sections such as: | |
- Abstract | |
- Introduction (including research questions and objectives) | |
- Literature Review | |
- Methodology | |
- Results/Findings | |
- Discussion | |
- Conclusion | |
- References | |
Format the outline in a structured manner with bullet points and subheadings.""", | |
agent=outline_agent, | |
expected_output="A structured outline for a research paper including all major sections and key points to cover in each section." | |
) | |
draft_writing_task = Task( | |
description="""Using the research topic {topic}, the literature review, and the generated outline, compose a first draft of the research paper. | |
The draft should include: | |
- A coherent narrative flow, | |
- Detailed sections as per the outline, | |
- Integration of key findings from the literature review. | |
Ensure the tone is academic and the content is well-organized.""", | |
agent=draft_writing_agent, | |
expected_output="A complete first draft of the research paper covering all sections with sufficient academic detail." | |
) | |
citation_task = Task( | |
description="""Based on the literature review for {topic}, generate a list of key references and citations in APA format. | |
Include: | |
- Author names, publication year, title, and source, | |
- At least 10 key references relevant to the research topic. | |
Format the output as a numbered list of citations.""", | |
agent=citation_agent, | |
expected_output="A list of 10+ relevant citations in APA format." | |
) | |
editing_task = Task( | |
description="""Review and edit the draft for clarity, coherence, and academic tone. | |
Focus on: | |
- Improving sentence structure, | |
- Ensuring logical flow between sections, | |
- Correcting grammar and stylistic issues, | |
- Enhancing academic tone. | |
Provide the polished version of the paper.""", | |
agent=editing_agent, | |
expected_output="A refined and polished version of the research paper draft." | |
) | |
chatbot_task = Task( | |
description="Provide a conversational and detailed response to academic research-related queries.", | |
agent=chatbot_agent, | |
expected_output="A friendly, informative response addressing the query." | |
) | |
def run_task(task: Task, input_text: str) -> str: | |
""" | |
Executes the given task using the associated agent's LLM and returns the response content. | |
""" | |
try: | |
if not isinstance(task, Task): | |
raise ValueError(f"Expected 'task' to be an instance of Task, got {type(task)}") | |
if not hasattr(task, 'agent') or not isinstance(task.agent, Agent): | |
raise ValueError("Task must have a valid 'agent' attribute of type Agent.") | |
system_input = ( | |
f"Agent Details:\n" | |
f"Role: {task.agent.role}\n" | |
f"Goal: {task.agent.goal}\n" | |
f"Backstory: {task.agent.backstory}\n" | |
f"Personality: {task.agent.personality}\n" | |
) | |
task_input = ( | |
f"Task Details:\n" | |
f"Task Description: {task.description}\n" | |
f"Expected Output: {task.expected_output}\n" | |
f"Input for Task:\n{input_text}\n" | |
) | |
messages = [ | |
SystemMessage(content=system_input), | |
HumanMessage(content=task_input) | |
] | |
response = task.agent.llm.invoke(messages) | |
if not response or not response.content: | |
raise ValueError("Empty response from LLM.") | |
return response.content | |
except Exception as e: | |
logging.error(f"Error in task '{task.agent.role}': {e}") | |
return f"Error in {task.agent.role}: {e}" | |