1 line
41 KiB
JSON
1 line
41 KiB
JSON
{"repo": "agi-fbhc/agentschallenge", "files": {"websocietysimulator/llm/llm.py": {"43cd745767b8b5e589a6a25460a13975af722c12": {"t": 1785595452.38894, "n": 5563, "h": "76dd4fbf6ccb9d81", "c": "from typing import Dict, List, Optional, Union\nfrom openai import OpenAI\nfrom langchain_openai import OpenAIEmbeddings\nfrom .infinigence_embeddings import InfinigenceEmbeddings\nfrom tenacity import retry, stop_after_attempt, wait_exponential, retry_if_exception_type\nimport logging\n\nlogger = logging.getLogger(\"websocietysimulator\")\n\n\nclass LLMBase:\n def __init__(self, model: str = \"qwen2.5-72b-instruct\"):\n \"\"\"\n Initialize LLM base class\n\n Args:\n model: Model name, defaults to deepseek-chat\n \"\"\"\n self.model = model\n\n def __call__(self, messages: List[Dict[str, str]], model: Optional[str] = None, temperature: float = 0.0,\n max_tokens: int = 500, stop_strs: Optional[List[str]] = None, n: int = 1) -> Union[str, List[str]]:\n \"\"\"\n Call LLM to get response\n\n Args:\n messages: List of input messages, each message is a dict containing role and content\n model: Optional model override\n max_tokens: Maximum tokens in response, defaults to 500\n stop_strs: Optional list of stop strings\n n: Number of responses to generate, defaults to 1\n\n Returns:\n Union[str, List[str]]: Response text from LLM, either a single string or list of strings\n \"\"\"\n raise NotImplementedError(\"Subclasses need to implement this method\")\n\n def get_embedding_model(self):\n \"\"\"\n Get the embedding model for text embeddings\n\n Returns:\n OpenAIEmbeddings: An instance of OpenAI's text embedding model\n \"\"\"\n raise NotImplementedError(\"Subclasses need to implement this method\")\n\n\nclass InfinigenceLLM(LLMBase):\n def __init__(self, api_key: str, model: str = \"qwen2.5-72b-instruct\"):\n \"\"\"\n Initialize Deepseek LLM\n\n Args:\n api_key: Deepseek API key\n model: Model name, defaults to qwen2.5-72b-instruct\n \"\"\"\n super().__init__(model)\n self.client = OpenAI(\n api_key=api_key,\n base_url=\"https://cloud.infini-ai.com/maas/v1\"\n )\n self.embedding_model = InfinigenceEmbeddings(api_key=api_key)\n\n @retry(\n retry=retry_if_exception_type(Exception),\n wait=wait_exponential(multiplier=1, min=10, max=300), # 等待时间从10秒开始,指数增长,最长300秒\n stop=stop_after_attempt(10) # 最多重试10次\n )\n def __call__(self, messages: List[Dict[str, str]], model: Optional[str] = None, temperature: float = 0.0,\n max_tokens: int = 500, stop_strs: Optional[List[str]] = None, n: int = 1) -> Union[str, List[str]]:\n \"\"\"\n Call Infinigence AI API to get response with rate limit handling\n\n Args:\n messages: List of input messages, each message is a dict containing role and content\n model: Optional model override\n max_tokens: Maximum tokens in response, defaults to 500\n stop_strs: Optional list of stop strings\n n: Number of responses to generate, defaults to 1\n\n Returns:\n Union[str, List[str]]: Response text from LLM, either a single string or list of strings\n \"\"\"\n try:\n response = self.client.chat.completions.create(\n model=model or self.model,\n messages=messages,\n temperature=temperature,\n max_tokens=max_tokens,\n stop=stop_strs,\n n=n,\n )\n\n if n == 1:\n return response.choices[0].message.content\n else:\n return [choice.message.content for choice in response.choices]\n except Exception as e:\n if \"429\" in str(e):\n logger.warning(\"Rate limit exceeded\")\n else:\n logger.error(f\"Other LLM Error: {e}\")\n raise e\n\n def get_embedding_model(self):\n return self.embedding_model\n\n\nclass OpenAILLM(LLMBase):\n def __init__(self, api_key: str, model: str = \"gpt-3.5-turbo\"):\n \"\"\"\n Initialize OpenAI LLM\n\n Args:\n api_key: OpenAI API key\n model: Model name, defaults to gpt-3.5-turbo\n \"\"\"\n super().__init__(model)\n self.client = OpenAI(api_key=api_key)\n self.embedding_model = OpenAIEmbeddings(api_key=api_key)\n\n def __call__(self, messages: List[Dict[str, str]], model: Optional[str] = None, temperature: float = 0.0,\n max_tokens: int = 500, stop_strs: Optional[List[str]] = None, n: int = 1) -> Union[str, List[str]]:\n \"\"\"\n Call OpenAI API to get response\n\n Args:\n messages: List of input messages, each message is a dict containing role and content\n model: Optional model override\n max_tokens: Maximum tokens in response, defaults to 500\n stop_strs: Optional list of stop strings\n n: Number of responses to generate, defaults to 1\n\n Returns:\n Union[str, List[str]]: Response text from LLM, either a single string or list of strings\n \"\"\"\n response = self.client.chat.completions.create(\n model=model or self.model,\n messages=messages,\n temperature=temperature,\n max_tokens=max_tokens,\n stop=stop_strs,\n n=n\n )\n\n if n == 1:\n return response.choices[0].message.content\n else:\n return [choice.message.content for choice in response.choices]\n\n def get_embedding_model(self):\n return self.embedding_model"}}, "agent.py": {"43cd745767b8b5e589a6a25460a13975af722c12": {"t": 1785595495.725667, "n": 5257, "h": "6431a16cf9efc800", "c": "from typing import Dict, List, Optional, Union\nfrom openai import OpenAI\nfrom tenacity import retry, stop_after_attempt, wait_exponential, retry_if_exception_type\nimport logging\nimport os\nlogger = logging.getLogger(\"websocietysimulator\")\n\n\nclass LLMBase:\n def __init__(self, model: str = \"qwen2.5-72b-instruct\"):\n \"\"\"\n Initialize LLM base class\n\n Args:\n model: Model name, defaults to qwen2.5-72b-instruct\n \"\"\"\n self.model = model\n\n def __call__(self, messages: List[Dict[str, str]], model: Optional[str] = None, temperature: float = 0.0,\n max_tokens: int = 500, stop_strs: Optional[List[str]] = None, n: int = 1) -> Union[str, List[str]]:\n \"\"\"\n Call LLM to get response\n\n Args:\n messages: List of input messages, each message is a dict containing role and content\n model: Optional model override\n temperature: Sampling temperature, defaults to 0.0\n max_tokens: Maximum tokens in response, defaults to 500\n stop_strs: Optional list of stop strings\n n: Number of responses to generate, defaults to 1\n\n Returns:\n Union[str, List[str]]: Response text from LLM, either a single string or list of strings\n \"\"\"\n raise NotImplementedError(\"Subclasses need to implement this method\")\n\n\nclass InfinigenceLLM(LLMBase):\n def __init__(self, api_key: str, model: str = \"qwen2.5-72b-instruct\"):\n \"\"\"\n Initialize Infinigence LLM\n\n Args:\n api_key: API key for authentication\n model: Model name, defaults to qwen2.5-72b-instruct\n \"\"\"\n super().__init__(model)\n self.client = OpenAI(\n api_key=api_key,\n base_url=\"https://cloud.infini-ai.com/maas/v1\"\n )\n\n @retry(\n retry=retry_if_exception_type(Exception),\n wait=wait_exponential(multiplier=1, min=4, max=60), # 等待时间从4秒开始,指数增长,最长60秒\n stop=stop_after_attempt(5) # 最多重试5次\n )\n def __call__(self, messages: List[Dict[str, str]], model: Optional[str] = None, temperature: float = 0.0,\n max_tokens: int = 500, stop_strs: Optional[List[str]] = None, n: int = 1) -> Union[str, List[str]]:\n \"\"\"\n Call Infinigence AI API to get response with rate limit handling\n\n Args:\n messages: List of input messages, each message is a dict containing role and content\n model: Optional model override\n temperature: Sampling temperature, defaults to 0.0\n max_tokens: Maximum tokens in response, defaults to 500\n stop_strs: Optional list of stop strings\n n: Number of responses to generate, defaults to 1\n\n Returns:\n Union[str, List[str]]: Response text from LLM, either a single string or list of strings\n \"\"\"\n try:\n response = self.client.chat.completions.create(\n model=model or self.model,\n messages=messages,\n temperature=temperature,\n max_tokens=max_tokens,\n stop=stop_strs,\n n=n\n )\n\n if n == 1:\n return response.choices[0].message.content\n else:\n return [choice.message.content for choice in response.choices]\n except Exception as e:\n if \"429\" in str(e):\n logger.warning(\"Rate limit exceeded\")\n else:\n logger.error(f\"Other LLM Error: {e}\")\n raise e\n\n\n\n\n\n\n\nclass LLMClient:\n def __init__(self, api_key=None, model=\"qwen2.5-72b-instruct\", system_message=\"You are a helpful assistant.\"):\n \"\"\"\n 初始化 LLM 客户端实例。\n :param api_key: API 密钥,可以直接传入,也可以从环境变量中读取。\n :param model: 模型名称,默认为 'qwen2.5-72b-instruct'。\n :param system_message: 系统消息,用于设置对话背景。\n \"\"\"\n self.api_key = api_key or os.getenv(\"API_KEY\")\n if not self.api_key:\n raise ValueError(\"API key is required. Please provide it or set it in the environment as 'API_KEY'.\")\n self.model = model\n self.system_message = system_message\n self.client = InfinigenceLLM(api_key=self.api_key, model=model)\n\n def generate_response(self, content, temperature=0.7, max_tokens=150):\n \"\"\"\n 调用模型生成响应。\n :param content: 用户输入的内容。\n :param temperature: 控制生成内容的随机性。\n :param max_tokens: 生成内容的最大 token 数量。\n :return: 模型响应。\n \"\"\"\n # 构建消息格式\n messages = [\n {\"role\": \"system\", \"content\": self.system_message},\n {\"role\": \"user\", \"content\": content}\n ]\n\n try:\n response = self.client(\n messages=messages,\n temperature=temperature,\n max_tokens=max_tokens\n )\n return response\n except Exception as e:\n return f\"Error: {e}\"\n\n\n# 使用示例\nif __name__ == \"__main__\":\n # 如果需要,可直接设置环境变量 API_KEY\n # os.environ[\"API_KEY\"] = \"your_api_key_here\"\n\n # 实例化类\n llm_client = LLMClient() # 或从环境变量中获取\n\n # 用户输入内容\n user_content = \"What is an LLM?\"\n\n # 调用模型生成响应\n response = llm_client.generate_response(content=user_content)\n print(\"Model Response:\", response)\n\n"}}, "docs/pages/overview.html": {"43cd745767b8b5e589a6a25460a13975af722c12": {"t": 1785595503.80511, "n": 28890, "h": "89274d2f67fff5d1", "c": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Overview - WWW'25 AgentSociety Challenge</title>\n <link rel=\"stylesheet\" href=\"../assets/css/style.css\">\n <script src=\"https://cdn.jsdelivr.net/npm/marked/marked.min.js\"></script>\n <style>\n .modal {\n display: none;\n position: fixed;\n z-index: 1000;\n left: 0;\n top: 0;\n width: 100%;\n height: 100%;\n background-color: rgba(0,0,0,0.5);\n }\n\n .modal-content {\n position: relative;\n margin: 2% auto;\n width: 80%;\n height: 90%;\n background-color: #fff;\n padding: 20px;\n }\n\n .close {\n position: absolute;\n right: 10px;\n top: 5px;\n font-size: 24px;\n cursor: pointer;\n }\n\n .registration-btn {\n position: fixed;\n top: 20px;\n right: 20px;\n padding: 10px 20px;\n background: linear-gradient(to right, #007bff, #00ff88);\n color: white;\n border: none;\n border-radius: 5px;\n font-size: 16px;\n cursor: pointer;\n transition: transform 0.2s ease;\n z-index: 1000;\n }\n\n .registration-btn:hover {\n transform: scale(1.05);\n }\n\n .modal {\n display: none;\n position: fixed;\n z-index: 1000;\n left: 0;\n top: 0;\n width: 100%;\n height: 100%;\n overflow: auto;\n background-color: rgba(0, 0, 0, 0.6);\n }\n\n .modal-content {\n background-color: #fff;\n margin: 10% auto;\n padding: 30px;\n border-radius: 10px;\n width: 40%;\n box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);\n text-align: center;\n }\n\n .modal-content h2 {\n margin-bottom: 20px;\n }\n\n .modal-content input {\n width: 80%;\n padding: 10px;\n margin: 10px 0;\n border: 1px solid #ccc;\n border-radius: 5px;\n font-size: 16px;\n }\n\n .modal-content button {\n background-color: #007bff;\n color: white;\n border: none;\n padding: 12px 24px;\n font-size: 16px;\n cursor: pointer;\n border-radius: 5px;\n margin-top: 20px;\n }\n\n .modal-content button:hover {\n background-color: #0056b3;\n }\n\n .close {\n color: #aaa;\n float: right;\n font-size: 24px;\n cursor: pointer;\n }\n\n .close:hover {\n color: black;\n }\n\n .modal-content {\n background-color: #fff;\n margin: 5% auto;\n padding: 40px;\n border-radius: 12px;\n width: 500px;\n max-width: 90%;\n box-shadow: 0 5px 15px rgba(0, 0, 0, 0.2);\n position: relative;\n animation: modalSlideIn 0.3s ease-out;\n }\n\n .modal-content h2 {\n color: #2c3e50;\n margin-bottom: 30px;\n text-align: center;\n font-size: 24px;\n }\n\n .registration-form {\n display: flex;\n flex-direction: column;\n gap: 20px;\n }\n\n .form-group {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .form-group label {\n color: #4a5568;\n font-size: 14px;\n font-weight: 500;\n }\n\n .form-group input {\n width: 100%;\n padding: 12px;\n border: 1px solid #e2e8f0;\n border-radius: 8px;\n font-size: 16px;\n transition: all 0.3s ease;\n }\n\n .form-group input:focus {\n outline: none;\n border-color: #4299e1;\n box-shadow: 0 0 0 3px rgba(66, 153, 225, 0.1);\n }\n\n .submit-btn {\n background-color: #4299e1;\n color: white;\n padding: 14px 24px;\n border: none;\n border-radius: 8px;\n font-size: 16px;\n font-weight: 500;\n cursor: pointer;\n transition: background-color 0.3s ease;\n margin-top: 10px;\n }\n\n .submit-btn:hover {\n background-color: #3182ce;\n }\n\n .close {\n position: absolute;\n right: 20px;\n top: 20px;\n font-size: 28px;\n color: #a0aec0;\n transition: color 0.3s ease;\n }\n\n .close:hover {\n color: #4a5568;\n }\n\n @keyframes modalSlideIn {\n from {\n transform: translateY(-20px);\n opacity: 0;\n }\n to {\n transform: translateY(0);\n opacity: 1;\n }\n }\n\n .submit-btn.loading {\n position: relative;\n color: transparent;\n }\n\n .submit-btn.loading::after {\n content: '';\n position: absolute;\n left: 50%;\n top: 50%;\n width: 20px;\n height: 20px;\n border: 2px solid #ffffff;\n border-radius: 50%;\n border-top-color: transparent;\n animation: spin 0.8s linear infinite;\n transform: translate(-50%, -50%);\n }\n\n @keyframes spin {\n to {\n transform: translate(-50%, -50%) rotate(360deg);\n }\n }\n\n .team-count-display {\n position: absolute;\n top: 60px;\n right: 20px;\n color: #4a5568;\n font-size: 14px;\n padding: 5px 10px;\n background-color: #f7fafc;\n border-radius: 5px;\n box-shadow: 0 1px 3px rgba(0,0,0,0.1);\n }\n\n /* 二级标题样式 */\n .section h2 {\n color: #34495e;\n font-size: 1.8em;\n margin: 30px 0 20px;\n padding-bottom: 10px;\n border-bottom: 2px solid #eee;\n position: relative;\n }\n\n .section h2:after {\n content: '';\n position: absolute;\n bottom: -2px;\n left: 0;\n width: 60px;\n height: 2px;\n background: linear-gradient(to right, #007bff, #00ff88);\n }\n\n /* 三级标题样式 */\n .section h3 {\n color: #2c3e50;\n font-size: 1.4em;\n margin: 25px 0 15px;\n padding-left: 15px;\n border-left: 4px solid #007bff;\n }\n\n /* 链接样式 */\n .section a {\n color: #007bff;\n text-decoration: none;\n position: relative;\n transition: color 0.3s ease;\n }\n\n .section a:hover {\n color: #0056b3;\n }\n\n .section a:after {\n content: '';\n position: absolute;\n width: 100%;\n height: 1px;\n bottom: -2px;\n left: 0;\n background-color: #0056b3;\n transform: scaleX(0);\n transition: transform 0.3s ease;\n }\n\n .section a:hover:after {\n transform: scaleX(1);\n }\n\n /* 列表样式 */\n .section ul, .section ol {\n padding-left: 20px;\n margin: 15px 0;\n }\n\n .section ul li, .section ol li {\n margin-bottom: 8px;\n line-height: 1.6;\n position: relative;\n }\n\n .section ul {\n list-style: none;\n }\n\n .section ul li:before {\n content: '•';\n color: #007bff;\n font-weight: bold;\n position: absolute;\n left: -15px;\n }\n\n .contact-info {\n position: absolute;\n bottom: 0;\n left: 0;\n width: 100%;\n padding: 15px 20px;\n background: linear-gradient(to right, #1a237e, #283593);\n color: rgba(255, 255, 255, 0.7);\n font-size: 14px;\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .contact-info span {\n white-space: nowrap;\n }\n\n .contact-info a {\n color: #ffffff;\n text-decoration: none;\n transition: all 0.3s ease;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .contact-info a:hover {\n color: #90caf9;\n text-decoration: underline;\n }\n\n /* 提交按钮样式 */\n .submit-button {\n position: fixed;\n top: 20px;\n right: 20px;\n padding: 10px 20px;\n background: linear-gradient(to right, #007bff, #00ff88);\n color: white;\n border: none;\n border-radius: 5px;\n font-size: 16px;\n cursor: pointer;\n transition: transform 0.2s ease;\n z-index: 1000;\n }\n\n .submit-button:hover {\n transform: scale(1.05);\n }\n\n .announcement-banner {\n background-color: #fff3cd;\n padding: 15px 20px;\n margin-bottom: 20px;\n border-radius: 8px;\n border: 1px solid #ffeeba;\n margin-left: 20px;\n margin-right: 20px;\n }\n\n .announcement-banner ul {\n list-style: none;\n padding: 0;\n margin: 0;\n }\n\n .announcement-banner li {\n display: flex;\n align-items: center;\n gap: 10px;\n margin-bottom: 10px;\n }\n\n .announcement-banner li:last-child {\n margin-bottom: 0;\n }\n </style>\n</head>\n<body>\n <button class=\"submit-button\" onclick=\"window.open('https://forms.gle/wisLykLK8eGB2X1PA', '_blank')\">\n Registration\n </button>\n\n <nav class=\"sidebar\">\n <div class=\"sidebar-logo\">\n <img src=\"../assets/images/ASC.jpg\" alt=\"Logo\">\n <h1>AgentSociety Challenge @ WWW 2025</h1>\n </div>\n <ul class=\"nav-links\">\n <li><a href=\"overview.html\">Overview</a></li>\n <li><a href=\"modeling-track.html\">User Modeling Track</a></li>\n <li><a href=\"recommendation-track.html\">Recommendation Track</a></li>\n <li><a href=\"leaderboards.html\">Leaderboards</a></li>\n <li><a href=\"submission-guidelines.html\">Submission Guidelines</a></li>\n <li><a href=\"discussion.html\">Discussion Forum</a></li>\n </ul>\n </nav>\n \n <div class=\"team-count-display\" style=\"position: fixed; top: 80px; right: 20px; padding: 10px 20px; background: linear-gradient(to right, #007bff, #00ff88); color: white; border-radius: 5px; font-size: 16px; z-index: 999;\">\n Current Registered Teams: <span id=\"teamCount\" style=\"font-weight: bold;\">Loading...</span>\n </div>\n\n <!-- 注册信息收集 Modal -->\n <div id=\"registrationFormModal\" class=\"modal\">\n <div class=\"modal-content\">\n <span class=\"close\" onclick=\"closeRegistrationForm()\">×</span>\n <h2>Information Precheck for AgentSociety Challenge</h2>\n <p style=\"color: #666; margin-bottom: 20px;\">Please note: This form helps prevent duplicate registrations. The email address and team name will be checked against existing registrations.</p>\n <form class=\"registration-form\">\n <div class=\"form-group\">\n <label for=\"emailInput\">Email Address</label>\n <input type=\"email\" id=\"emailInput\" required placeholder=\"Enter your email (will be checked for duplicates)\">\n </div>\n <div class=\"form-group\">\n <label for=\"teamNameInput\">Team Name</label>\n <input type=\"text\" id=\"teamNameInput\" required placeholder=\"Enter unique team name\">\n <small style=\"color: #666; display: block; margin-top: 5px;\">Team name must be unique and cannot be changed later</small>\n </div>\n <div class=\"form-group\">\n <label for=\"teamPasswordInput\">Team Password</label>\n <input type=\"password\" id=\"teamPasswordInput\" required placeholder=\"Enter team password\">\n <small style=\"color: #666; display: block; margin-top: 5px;\">Keep this password safe - you'll need it for submissions</small>\n </div>\n <button type=\"button\" class=\"submit-btn\" id=\"submitBtn\" onclick=\"preCheckRegistration()\">Check Registration</button>\n </form>\n </div>\n </div>\n\n <!-- Google Form 弹窗 -->\n <div id=\"registrationModal\" class=\"modal\">\n <div class=\"modal-content\">\n <span class=\"close\" onclick=\"closeModal()\">×</span>\n <iframe id=\"formFrame\"\n src=\"\"\n width=\"100%\" height=\"95%\" frameborder=\"0\" marginheight=\"0\" marginwidth=\"0\">正在加载…</iframe>\n </div>\n </div>\n\n <main class=\"main-content\">\n <section class=\"section\" id=\"content\">\n <h1>🌏 AgentSociety Challenge</h1>\n <div class=\"announcement-banner\">\n <ul>\n <li>🚩 This challenge is a part of <a href=\"https://www2025.thewebconf.org/accepted-competitions\" target=\"_blank\">The Web Conference 2025.</a></li>\n </ul>\n </div>\n <p>\n We are excited to announce the AgentSociety Challenge, a competition for designing large language model (LLM) agents to advance web experience. \n As organizers, we recognize the crucial role online review platforms play in today's web society, serving as vital spaces for experience sharing, \n advice seeking, and social interaction. We have carefully designed two competitive tracks to explore the potential of LLM agents: the User Modeling Track,\n which focuses on understanding user preferences and simulating online reviews, and the Recommendation Track, \n dedicated to delivering personalized recommendations across diverse scenarios. The Challenge utilizes large-scale public datasets from prominent online review platforms, \n complemented by a textual simulator to provide interactive feedback for LLM agents. Through this challenge, \n we aim to drive innovation and breakthrough in the integration of LLM technologies with real-world Web applications.\n </p>\n\n <h2>📍 Problem Statement</h2>\n <p>\n The participants are tasked to construct agentic workflows with LLM to process information, write reviews, and make recommendations \n by interacting with online review platforms. To facilitate this, we have built an interactive \n simulation environment that allows agents to engage with these platforms in a controlled setting.\n The interactive environment is built based on open-source datasets, including Yelp<sup><a href=\"#yelp-dataset\">[1]</a></sup>, \n Amazon<sup><a href=\"#amazon-dataset\">[2]</a></sup>, and Goodreads<sup><a href=\"#goodreads-dataset\">[3]</a></sup>, \n complemented by a textual simulator to provide interactive feedback for agents.\n Specifically, this challenge consists of two tracks: \n <ul>\n <li><strong><a href=\"modeling-track.html\">User Modeling Track</a></strong>: In this track, participants must design agents to simulate user reviews and star ratings, \n focusing on simulating user behavior in specific scenarios by leveraging their historical actions and accessible environmental data. \n By utilizing the text simulation environment, participants come up with new solutions to these problems in an interactive environment in agentic mode, \n ensuring a comprehensive and diverse evaluation of user behaviors. </li>\n <li><strong><a href=\"recommendation-track.html\">Recommendation Track</a></strong>: In this track, participants are tasked with using agents to generate rankings based on the current user's preferences, \n which emphasizes building personalized recommendation assistants that provide users with appropriate suggestions tailored to particular contexts. </li>\n </ul>\n </p>\n <p>\n Based on the concept of modular agent design, participants are encouraged to adopt an actionable modular design space with four key modules: \n <strong>Planning</strong>, <strong>Reasoning</strong>, <strong>Tool use</strong>, and <strong>Memory</strong><sup><a href=\"#agentsquare\">[4]</a></sup>. \n These modules have standardized interface to allow them cooperate with each other in a workflow: upon receiving a task query, the agent begins by decomposing it into sub-tasks through the Planning module. \n The Reasoning module then processes each sub-task, and when necessary, activates the Tool use module to select external tools for problem-solving. \n Additionally, the Memory module supports the reasoning process by accessing past observations and experiences, ensuring the agent continuously refines its actions based on feedback from the environment. \n Through this modular design approach, participants can not only create effective solutions for this challenge but also contribute reusable modules to the broader agent community, \n fostering innovation and collaboration in agent development.\n </p> \n\n <div class=\"announcement-banner\">\n <ul>\n <li>💎 The Resource & Code base for agent development: <a href=\"https://github.com/tsinghua-fib-lab/WebSocietySimulator\" target=\"_blank\">Official Github.</a></li>\n </ul>\n </div>\n\n <p>\n As a bonus, the top-ranking teams advancing to the Final Phase will receive assistance in deploying their agents on the <strong>OpenCity platform</strong><sup><a href=\"#opencity\">[5]</a></sup>. \n OpenCity is an open-source platform designed to simulate large-scale LLM agents within a digital city environment. \n Solutions submitted to the Recommendation and User Modeling tracks will be adapted to simulate offline movement and online reviews, \n respectively, offering a dynamic illustration of the Agent Society vision. Selected teams will be invited to present their work at the WWW Workshop, \n where they can compete for the Best Demo award.\n <!-- <div style=\"display: flex; justify-content: center; align-items: center; margin: 20px 0;\">\n <div style=\"width: 80%; text-align: center;\">\n <img src=\"../assets/images/large_scale_simulation.png\" alt=\"Agent Simulation Example\" style=\"width: 100%; border-radius: 8px; box-shadow: 0 4px 8px rgba(0,0,0,0.1);\">\n <p style=\"text-align: center; margin-top: 10px; color: #666;\">Large-scale LLM Agents Simulation in OpenCity</p>\n </div>\n </div> -->\n </p>\n\n <h2>📅 Timeline</h2>\n <p>\n The competition will be held from Jan 1st, 2025 to Feb 14th, 2025, following the timeline outlined below: \n <ul>\n <li><strong>Start of Development Phase:</strong> Jan 1st, 2025</li>\n <li><strong>Start of Final Phase:</strong> Feb 1st, 2025</li>\n <li><strong>Winner Notification and Paper Invitation:</strong> Feb 14th, 2025</li>\n </ul>\n Note: All submission deadlines are end-of-day in the Anywhere on Earth (AoE) time zone. Top 20 teams will be selected to participate in the Final Phase.\n </p>\n\n <h2 id=\"token-support\">💪🏻 Token Support</h2>\n <p>\n To support participants, we will provide API-key access during the development phase. \n This will be offered through InfinigenceAI, with the following specifications: <strong>RPM=100, TPM=60000, RPD=10000</strong>, and the ability to call models such as Qwen-72b-instruct. \n If you wish to use the API, please send your identification documents via email. \n Required documents include your full name, organization, proof of participation in this competition, track of participation and any other relevant identification details. \n Once your verification is completed, we will send you the API key. Please note that the number of API keys is <strong>limited</strong>.\n </p>\n\n <h2>🏆 Award</h2>\n <p>\n The total prize pool is 12,000 USD. To encourage and reward excellence, \n the competition will offer monetary prizes and certificates to top-3 winning teams of each track:\n <ul>\n <li>🥇 1st Place: 2,000 USD</li>\n <li>🥈 2nd Place: 1,000 USD</li>\n <li>🥉 3rd Place: 500 USD</li>\n </ul>\n Besides, challenge prizes also include the in-person <strong>travel grant</strong> for the top 2 winning teams each track. \n This remuneration is to be paid after the in-person presentation in our workshop the Web Conference:\n <ul>\n <li>🥇 1st Place: 1,500 USD</li>\n <li>🥈 2nd Place: 1,000 USD</li>\n </ul>\n <strong>We will recommend 1st & 2nd place of each track to submit a competition-related papers for inclusion in the conference's companion proceedings.</strong>\n </p>\n\n <h2>🏪 Organizing Committee</h2>\n <p>\n <strong>Hosting Organization:</strong> <a href=\"https://fi.ee.tsinghua.edu.cn/\" target=\"_blank\">Tsinghua University</a>, <a href=\"https://cloud.infini-ai.com/\" target=\"_blank\">Infinigence AI</a>, <a href=\"https://www2025.thewebconf.org/\" target=\"_blank\">the Web Conference</a>\n </p> <br>\n <p>\n <strong>Committee Members:</strong> Yuwei Yan (HKUST-gz); Yu Shang, Qingbing Zeng, Yu Li, Keyu Zhao, Zhiheng Zheng, Xuefei Ning (Tsinghua University); Tianji Wu, Shengen Yan (Infinigence AI)\n </p> <br>\n <p>\n <strong>Committee Chair:</strong> Fengli Xu, Yu Wang, Yong Li (Tsinghua University)\n </p>\n\n <h2>📬 Contact</h2>\n <p>\n For any questions or inquiries, please contact us at <a href=\"mailto:LLMSociety-Challenge@outlook.com\">LLMSociety-Challenge@outlook.com</a>.\n </p>\n\n <h2>📚 Reference</h2>\n <ol>\n <li id=\"yelp-dataset\">\n Nabiha Asghar. \n <strong>Yelp dataset challenge: Review rating prediction</strong>. \n arXiv preprint arXiv:1605.05362, 2016. \n <a href=\"https://arxiv.org/abs/1605.05362\">[arXiv]</a>\n </li>\n <li id=\"amazon-dataset\">\n Yupeng Hou, Jiacheng Li, Zhankui He, An Yan, Xiusi Chen, Julian McAuley. \n <strong>Bridging Language and Items for Retrieval and Recommendation</strong>. \n arXiv preprint arXiv:2403.03952, 2024.\n <a href=\"https://arxiv.org/abs/2403.03952\">[arXiv]</a>\n </li>\n <li id=\"goodreads-dataset\">\n Mengting Wan, Julian J. McAuley. \n <strong>Item recommendation on monotonic behavior chains</strong>. \n In <em>Proceedings of the 12th ACM Conference on Recommender Systems (RecSys 2018)</em>, \n Vancouver, BC, Canada, October 2-7, 2018, pp. 86–94. ACM, 2018. \n <a href=\"https://doi.org/10.1145/3240323.3240369\">[DOI]</a>\n </li>\n <li id=\"agentsquare\">\n Yu Shang, Yu Li, Keyu Zhao, Likai Ma, Jiahe Liu, Fengli Xu, Yong Li. \n <strong>AgentSquare: Automatic LLM Agent Search in Modular Design Space</strong>. \n arXiv preprint arXiv:2410.06153, 2024. \n <a href=\"https://arxiv.org/abs/2410.06153\">[arXiv]</a>.\n </li>\n <li id=\"opencity\">\n Yuwei Yan, Qingbin Zeng, Zhiheng Zheng, Jingzhe Yuan, Jie Feng, Jun Zhang, Fengli Xu, Yong Li. \n <strong>OpenCity: A Scalable Platform to Simulate Urban Activities with Massive LLM Agents</strong>. \n arXiv preprint arXiv:2410.21286, 2024. \n <a href=\"https://arxiv.org/abs/2410.21286\">[arXiv]</a>.\n </li>\n </ol>\n </section>\n </main>\n\n <script>\n async function fetchTeamCount() {\n try {\n const response = await fetch('https://script.google.com/macros/s/AKfycbxaS4QO9jiUs1fL0dzP2IN35_SnwBJCO2c4RqPdj3eegC6JMpQZd-J-cqvs21bQND7BaA/exec');\n const data = await response.json();\n document.getElementById('teamCount').textContent = data.count;\n } catch (error) {\n document.getElementById('teamCount').textContent = 'Network Error';\n }\n }\n\n // 修改现有的页面加载事件\n window.onload = function() {\n fetchTeamCount();\n };\n\n // 每5分钟刷新一次计数\n setInterval(fetchTeamCount, 300000);\n\n // 页面导航激活状态切换\n const currentPage = window.location.pathname.split('/').pop();\n document.querySelectorAll('.nav-links a').forEach(link => {\n link.classList.remove('active');\n link.removeAttribute('aria-current');\n });\n document.querySelector(`.nav-links a[href=\"${currentPage}\"]`)?.classList.add('active');\n document.querySelector(`.nav-links a[href=\"${currentPage}\"]`)?.setAttribute('aria-current', 'page');\n\n function openRegistrationForm() {\n document.getElementById('registrationFormModal').style.display = 'block';\n }\n\n // 关闭注册表单 Modal\n function closeRegistrationForm() {\n document.getElementById('registrationFormModal').style.display = 'none';\n }\n\n // 提交表单前检测\n async function preCheckRegistration() {\n const submitBtn = document.getElementById('submitBtn');\n submitBtn.classList.add('loading');\n submitBtn.disabled = true;\n\n try {\n const email = document.getElementById('emailInput').value.trim();\n const teamName = document.getElementById('teamNameInput').value.trim();\n const teamPassword = document.getElementById('teamPasswordInput').value.trim();\n\n if (!email || !teamName || !teamPassword) {\n alert(\"Please fill in all fields.\");\n return;\n }\n\n const apiUrl = 'https://script.google.com/macros/s/AKfycbwktE-eVb6_bWHcm62x3xxswtFv-hVEl9UOE_l0YdlbaYd21KJXyDvi0C0ZldzHUkCSFw/exec?'\n + 'email=' + encodeURIComponent(email)\n + '&teamName=' + encodeURIComponent(teamName)\n + '&teamPassword=' + encodeURIComponent(teamPassword);\n\n const response = await fetch(apiUrl);\n const result = await response.text();\n \n if (result.includes(\"already been registered\") || result.includes(\"taken\") || result.includes(\"used\")) {\n alert(result);\n } else {\n closeRegistrationForm();\n openModal();\n }\n } catch (error) {\n alert(\"An error occurred. Please try again.\");\n } finally {\n submitBtn.classList.remove('loading');\n submitBtn.disabled = false;\n }\n }\n\n // 打开 Google Form Modal\n function openModal() {\n document.getElementById('formFrame').src = \"https://docs.google.com/forms/d/e/1FAIpQLSfBLji0GPYMKSTuh3Nyl2x3kmtU2QHWhi4Wb2uHnh0cAqFlSQ/viewform?embedded=true\";\n document.getElementById('registrationModal').style.display = 'block';\n }\n\n // 关闭 Google Form Modal\n function closeModal() {\n document.getElementById('registrationModal').style.display = 'none';\n document.getElementById('formFrame').src = \"\";\n }\n </script>\n</body>\n</html>\n"}}}} |