Spaces:
Running
Running
import logging | |
import logging | |
import os | |
from pathlib import Path | |
from typing import List, Union | |
from llama_index.readers.file.docs import PDFReader | |
from agentreview.agent import Player | |
from .backends import IntelligenceBackend | |
from .config import BackendConfig | |
from .message import Message | |
class AreaChair(Player): | |
def __init__( | |
self, | |
name: str, | |
role_desc: str, | |
env_type: str, | |
backend: Union[BackendConfig, IntelligenceBackend], | |
global_prompt: str = None, | |
**kwargs, | |
): | |
super().__init__(name, role_desc, backend, global_prompt, **kwargs) | |
self.env_type = env_type | |
self.role_desc = role_desc | |
def act(self, observation: List[Message]) -> str: | |
# The author just finished their rebuttals (so last speaker is Author 1). | |
# The AC asks each reviewer to update their reviews. | |
if self.env_type == "paper_review": | |
if len(observation) > 0 and observation[-1].agent_name.startswith("Author"): | |
return "Dear reviewers, please update your reviews based on the author's rebuttals." | |
else: | |
return super().act(observation) | |
elif self.env_type == "paper_decision": | |
return super().act(observation) | |
else: | |
raise ValueError(f"Unknown env_type: {self.env_type}") | |
class Reviewer(Player): | |
def __init__( | |
self, | |
name: str, | |
role_desc: str, | |
backend: Union[BackendConfig, IntelligenceBackend], | |
global_prompt: str = None, | |
**kwargs, | |
): | |
print("kwargs") | |
print(kwargs) | |
super().__init__(name, role_desc, backend, global_prompt, **kwargs) | |
def act(self, observation: List[Message]) -> str: | |
return super().act(observation) | |
class PaperExtractorPlayer(Player): | |
"""A player for solely extracting contents from a paper. | |
No API calls are made by this player. | |
""" | |
def __init__( | |
self, | |
name: str, | |
role_desc: str, | |
paper_id: int, | |
paper_decision: str, | |
conference: str, | |
backend: Union[BackendConfig, IntelligenceBackend], | |
paper_pdf_path: str = None, | |
global_prompt: str = None, | |
**kwargs, | |
): | |
super().__init__(name, role_desc, backend, global_prompt, **kwargs) | |
self.paper_id = paper_id | |
self.paper_decision = paper_decision | |
self.conference: str = conference | |
if paper_pdf_path is not None: | |
self.paper_pdf_path = paper_pdf_path | |
def act(self, observation: List[Message]) -> str: | |
""" | |
Take an action based on the observation (Generate a response), which can later be parsed to actual actions that affect the game dynamics. | |
Parameters: | |
observation (List[Message]): The messages that the player has observed from the environment. | |
Returns: | |
str: The action (response) of the player. | |
""" | |
if self.paper_pdf_path is not None: | |
logging.info(f"Loading paper from {self.paper_pdf_path} ...") | |
else: | |
logging.info(f"Loading {self.conference} paper {self.paper_id} ({self.paper_decision}) ...") | |
loader = PDFReader() | |
if self.paper_pdf_path is not None: | |
document_path = Path(self.paper_pdf_path) | |
else: | |
document_path = Path(os.path.join(self.args.data_dir, self.conference, "paper", self.paper_decision, | |
f"{self.paper_id}.pdf")) # | |
documents = loader.load_data(file=document_path) | |
num_words = 0 | |
main_contents = "Contents of this paper:\n\n" | |
FLAG = False | |
for doc in documents: | |
text = doc.text.split(' ') | |
if len(text) + num_words > self.args.max_num_words: | |
text = text[:self.args.max_num_words - num_words] | |
FLAG = True | |
num_words += len(text) | |
text = " ".join(text) | |
main_contents += text + ' ' | |
if FLAG: | |
break | |
print(main_contents) | |
return main_contents | |