From 8f1cf58af23a0621ecfa413adaf4af7f4ae899b2 Mon Sep 17 00:00:00 2001 From: didi <2020201387@ruc.edu.cn> Date: Sat, 29 Jun 2024 16:33:07 +0800 Subject: [PATCH] Update AGS --- examples/ags/demo/claude.py | 101 ++++++++ examples/ags/demo/claude_2.py | 82 ++++++ examples/ags/demo/graph.py | 37 +++ examples/ags/demo/operator.py | 109 ++++++++ examples/ags/demo/prompt.py | 57 ++++ examples/ags/w_action_node/graph.py | 46 ++++ examples/ags/w_action_node/operator.py | 78 ++++++ examples/ags/w_action_node/operator_an.py | 65 +++++ examples/ags/w_action_node/prompt.py | 30 +++ test.ipynb | 301 ++++++++++++++++++++++ test.py | 12 + 11 files changed, 918 insertions(+) create mode 100644 examples/ags/demo/claude.py create mode 100644 examples/ags/demo/claude_2.py create mode 100644 examples/ags/demo/graph.py create mode 100644 examples/ags/demo/operator.py create mode 100644 examples/ags/demo/prompt.py create mode 100644 examples/ags/w_action_node/graph.py create mode 100644 examples/ags/w_action_node/operator.py create mode 100644 examples/ags/w_action_node/operator_an.py create mode 100644 examples/ags/w_action_node/prompt.py create mode 100644 test.ipynb create mode 100644 test.py diff --git a/examples/ags/demo/claude.py b/examples/ags/demo/claude.py new file mode 100644 index 000000000..b4799939a --- /dev/null +++ b/examples/ags/demo/claude.py @@ -0,0 +1,101 @@ + +from typing import Any, Dict, List, Callable +from abc import ABC, abstractmethod + +class LLM: + def ask(self, text: str) -> str: + # Implement LLM query logic here + pass + +class Operator(ABC): + def __init__(self, llm: LLM): + self.llm = llm + + @abstractmethod + def forward(self, *args: Any, **kwargs: Any) -> Any: + pass + + def __call__(self, *args: Any, **kwargs: Any) -> Any: + return self.forward(*args, **kwargs) + +class Generate(Operator): + def __init__(self, llm: LLM, prompt: str): + super().__init__(llm) + self.prompt = prompt + + def forward(self, input_problem: str) -> str: + return self.llm.ask(f"{self.prompt}\n{input_problem}") + +class Review(Operator): + def __init__(self, llm: LLM, criteria: List[str]): + super().__init__(llm) + self.criteria = criteria + + def forward(self, solution: str) -> Dict[str, float]: + review_prompt = f"Review the following solution based on these criteria: {', '.join(self.criteria)}\n\nSolution: {solution}" + review_result = self.llm.ask(review_prompt) + # Parse the review_result to extract scores + return {criteria: float(review_result.split(criteria)[1].split()[0]) for criteria in self.criteria} + +class Module: + def __init__(self, llm: LLM): + self.llm = llm + + def forward(self, x: Any) -> Any: + raise NotImplementedError("Subclasses must implement forward method") + + def __call__(self, x: Any) -> Any: + return self.forward(x) + +class CodeGenerationModule(Module): + def __init__(self, llm: LLM): + super().__init__(llm) + self.generate = Generate(llm, "Generate a Python function for the following problem:") + self.review = Review(llm, ["correctness", "efficiency", "readability"]) + + def forward(self, problem: str) -> Dict[str, Any]: + solution = self.generate(problem) + review = self.review(solution) + return {"solution": solution, "review": review} + +def optimize(module: Module, loss_fn: Callable[[Dict[str, Any]], float], iterations: int = 10): + for _ in range(iterations): + # This is a placeholder for the optimization logic + # In a real implementation, you would: + # 1. Run the module on some input + # 2. Compute the loss + # 3. Use the loss to improve the module (e.g., by adjusting prompts or using LLM feedback) + pass + +# Usage +llm = LLM() +code_gen = CodeGenerationModule(llm) + +# Solve a problem +result = code_gen("Write a function to calculate the factorial of a number") +print(result) + +# Define a loss function +def loss_function(output: Dict[str, Any]) -> float: + # Implement your loss computation here + # For example, you might use the review scores + return 1.0 - output["review"].get("correctness", 0) + +# Optimize the module +optimize(code_gen, loss_function, iterations=10) + +# You can also create custom modules easily +class CustomModule(Module): + def __init__(self, llm: LLM): + super().__init__(llm) + self.op1 = Generate(llm, "Custom prompt 1") + self.op2 = Review(llm, ["custom_criteria"]) + + def forward(self, x: str) -> Dict[str, Any]: + intermediate = self.op1(x) + final = self.op2(intermediate) + return {"result": final} + +custom_module = CustomModule(llm) +custom_result = custom_module("Custom input") +print(custom_result) diff --git a/examples/ags/demo/claude_2.py b/examples/ags/demo/claude_2.py new file mode 100644 index 000000000..54a85e69b --- /dev/null +++ b/examples/ags/demo/claude_2.py @@ -0,0 +1,82 @@ +from metagpt import nn +import metagpt.functional as F + +class Generate(nn.Module): + def __init__(self, model_name): + super(Generate, self).__init__() + self.model = nn.LLM(model_name) + + def forward(self, prompt): + return self.model.generate(prompt) + +class Review(nn.Module): + def __init__(self, criteria): + super(Review, self).__init__() + self.criteria = criteria + + def forward(self, generated_code): + return F.analyze(generated_code, self.criteria) + +class Revise(nn.Module): + def __init__(self, model_name): + super(Revise, self).__init__() + self.model = nn.LLM(model_name) + + def forward(self, original_code, review_feedback): + prompt = f"Original code:\n{original_code}\n\nFeedback:\n{review_feedback}\n\nRevised code:" + return self.model.generate(prompt) + +class Ensemble(nn.Module): + def __init__(self, strategy='majority_vote'): + super(Ensemble, self).__init__() + self.strategy = strategy + + def forward(self, solutions): + return F.ensemble(solutions, strategy=self.strategy) + +class LLMAgent(nn.Module): + def __init__(self, generate_model, review_criteria, revise_model): + super(LLMAgent, self).__init__() + self.generate = Generate(generate_model) + self.review = Review(review_criteria) + self.revise = Revise(revise_model) + self.ensemble = Ensemble() + + def forward(self, problem_description, num_iterations=3): + solutions = [] + for _ in range(num_iterations): + # 生成初始解决方案 + initial_solution = self.generate(problem_description) + + # 审查解决方案 + review_feedback = self.review(initial_solution) + + # 根据反馈修改解决方案 + revised_solution = self.revise(initial_solution, review_feedback) + + solutions.append(revised_solution) + + # 整合多个解决方案 + final_solution = self.ensemble(solutions) + return final_solution + +# 示例使用 +problem = """ +Human: Write a function that takes a list of numbers and returns the sum of the numbers at even indices. + +Function Signature: +def sum_even_indices(numbers: List[int]) -> int: + +Example: +>>> sum_even_indices([1, 2, 3, 4, 5]) +9 # 1 + 3 + 5 = 9 +""" + +agent = LLMAgent( + generate_model="gpt-3.5-turbo", + review_criteria=["correctness", "efficiency", "readability"], + revise_model="gpt-4" +) + +solution = agent(problem) +print(solution) diff --git a/examples/ags/demo/graph.py b/examples/ags/demo/graph.py new file mode 100644 index 000000000..684497968 --- /dev/null +++ b/examples/ags/demo/graph.py @@ -0,0 +1,37 @@ +# -*- coding: utf-8 -*- +# @Date : 6/26/2024 17:07 PM +# @Author : didi +# @Desc : graph demo of ags + +from examples.ags.demo.operator import Generate, GenerateCode, Review, Revise, Ensemble, LLM + +class Graph: + def __init__(self, name:str, llm:str) -> None: + self.name = name + self.model = llm # TODO 抽象一个逻辑,用不同的model适配不同的算子 + + def __call__(): + NotImplementedError("Subclasses must implement __call__ method") + + +class HumanEvalGraph(Graph): + def __init__(self, name:str, llm: str, criteria:str) -> None: + super().__init__(name, llm) + self.criteria = criteria # TODO 有位置参数的生成逻辑是基于算子的要求 + self.generate_code = GenerateCode(llm=LLM(model=llm)) + self.review = Review(llm=LLM(model=llm), criteria=criteria) + self.revise = Revise(llm=LLM(model=llm)) + self.ensemble = Ensemble(llm=LLM(model=llm)) + + def __call__(self, problem): + # TODO 我先来实现一版不带Ensemble的版本 + solution = self.generate_code(problem) + # review & revise loop + for _ in range(3): + review_feedback = self.review(problem, solution) + if review_feedback['result']: + break + solution = self.revise(solution, review_feedback['feedback']) + return solution + + diff --git a/examples/ags/demo/operator.py b/examples/ags/demo/operator.py new file mode 100644 index 000000000..6fded8f05 --- /dev/null +++ b/examples/ags/demo/operator.py @@ -0,0 +1,109 @@ +# -*- coding: utf-8 -*- +# @Date : 6/26/2024 17:07 PM +# @Author : didi +# @Desc : operator demo of ags + +import json +from openai import OpenAI +from examples.ags.demo.prompt import GENERATE_PROMPT, GENERATE_CODE_PROMPT, REVIEW_PROMPT, REVISE_PROMPT, ENSEMBLE_PROMPT + +class LLM(): + def __init__(self, model:str='gpt-4-turbo', timeout:int=60): + self.model = model + self.timeout = timeout + self.api_key = 'sk-6uLg7KCASTHxoLIL00E0F0C0377449Bd9cE506B04791B23a' + self.base_url = 'https://api.aigcbest.top/v1' + self.client = OpenAI(api_key=self.api_key, base_url=self.base_url) + self.system_prompt = None + + def ask(self, text: str, json_mode: bool = False, temperature: float = 0.7, retries: int = 5): + response_type = "text" if not json_mode else "json_object" + messages = [{"role": "user", "content": text}] if self.system_prompt == None else [ + {"role": "system", "content": self.system_prompt}, {"role": "user", "content": text}] + for i in range(retries): + try: + response = self.client.chat.completions.create( + model=self.model, + messages=messages, + temperature=temperature, + response_format={"type": response_type} + ) + if json_mode: + result = response.choices[0].message.content + result = json.loads(result) + else: + result = response.choices[0].message.content + print(result) + return result + except Exception as e: + print(f"{__name__} occurs: {e}") + + +class Operator: + def __init__(self, name, llm:LLM=None): + self.name = name + self.llm = llm + + def __call__(self, *args, **kwargs): + raise NotImplementedError + +class Generate(Operator): + """ + Generate code & Generate text 应该被分开 + """ + def __init__(self, name:str ="Generator", llm: LLM = LLM()): + super().__init__(name, llm) + + def __call__(self, problem_description): + prompt = GENERATE_PROMPT.format(problem_description=problem_description) + response = self.llm.ask(prompt, json_mode=True) + return {"solution": response.get("solution")} + +class GenerateCode(Operator): + + def __init__(self, name:str ="Coder", llm: LLM = LLM()): + super().__init__(name, llm) + + def __call__(self, problem_description): + prompt = GENERATE_CODE_PROMPT.format(problem_description=problem_description) + response = self.llm.ask(prompt, json_mode=True) + return {"code": response.get("code")} + +class Review(Operator): + + def __init__(self, criteria, name:str ="Reviewer", llm: LLM = LLM()): + self.criteria = criteria + super().__init__(name, llm) + + # TODO 有点搞笑,我忘记加上criteria了 + def __call__(self, problem_description, solution): + prompt = REVIEW_PROMPT.format(problem_description=problem_description, solution=solution) + response = self.llm.ask(prompt, json_mode=True) + if response.get("result") == True: + return {"result": True} + else: + return {"result":False, "feedback":response.get('feedback')} + +class Revise(Operator): + + def __init__(self, name:str ="Reviser", llm: LLM = LLM()): + super().__init__(name, llm) + + def __call__(self, problem_description, solution, feedback): + prompt = REVISE_PROMPT.format(problem_description=problem_description, solution=solution, feedback=feedback) + response = self.llm.ask(prompt, json_mode=True) + return {"revised_solution": response.get("revised_solution")} + +class Ensemble(Operator): + + def __init__(self, name:str ="Ensembler", llm: LLM = LLM()): + super().__init__(name, llm) + + def __call__(self, *args, problem_description): + solutions = "" + for solution in args: + solutions += solution + "\n" + prompt = ENSEMBLE_PROMPT.format(solutions=solutions, problem_description=problem_description) + response = self.llm.ask(prompt, json_mode=True) + return {"ensembled_solution": response.get("ensembled_solution")} + diff --git a/examples/ags/demo/prompt.py b/examples/ags/demo/prompt.py new file mode 100644 index 000000000..b12957128 --- /dev/null +++ b/examples/ags/demo/prompt.py @@ -0,0 +1,57 @@ +# -*- coding: utf-8 -*- +# @Date : 6/26/2024 17:07 PM +# @Author : didi +# @Desc : prompts of operators + + +GENERATE_PROMPT = """ +Generate Solution for the following problem: {problem_description} + +Please structure your response in JSON format as follows: +{{ + "solution": "" +}} +""" + +GENERATE_CODE_PROMPT = """ +Generate Code Solution for the following problem: {problem_description} + +Please structure your response in JSON format as follows: +{{ + "code": "" +}} +""" + +REVIEW_PROMPT = """ +For the question described as {problem_description}, +please review the following solution: {solution}, and provide a review result in boolean format. +If you believe the solution is capable of resolving the issue, return True; otherwise, return False, and include your comments + +Please structure your response in JSON format as follows: +{{ + "result": , + "comment": "" +}} +""" + +REVISE_PROMPT = """ +For the question described as {problem_description}, +please evaluate and revise the solution provided: {solution}, taking into account the review comments: {comment}." +Then output the revised solution. + +Please structure your response in JSON format as follows: +{{ + "revised_solution": "" +}} + +""" + +ENSEMBLE_PROMPT = """ +For the question described as {problem_description}, +please ensemble the following solutions: {solutions}, and provide an ensemble result. + +Please structure your response in JSON format as follows: +{{ + "ensembled_solution": "" +}} +""" diff --git a/examples/ags/w_action_node/graph.py b/examples/ags/w_action_node/graph.py new file mode 100644 index 000000000..37e51f5a3 --- /dev/null +++ b/examples/ags/w_action_node/graph.py @@ -0,0 +1,46 @@ +# -*- coding: utf-8 -*- +# @Date : 6/27/2024 22:07 PM +# @Author : didi +# @Desc : graph & an instance - humanevalgraph + +from metagpt.llm import LLM + +from examples.ags.w_action_node.operator import Generate, GenerateCode, Review, Revise, Ensemble + +class Graph: + def __init__(self, name:str, llm:LLM) -> None: + self.name = name + # TODO 是否需要对每一个算子使用不同的Graph? + self.model = llm + + def __call__(): + NotImplementedError("Subclasses must implement __call__ method") + + +class HumanEvalGraph(Graph): + def __init__(self, name:str, llm: LLM, criteria:str) -> None: + super().__init__(name, llm) + self.criteria = criteria # TODO 自动构建图时,图的初始参数与图所使用的算子要求的外部参数相关 + self.generate_code = GenerateCode(llm=llm) + self.review = Review(llm=llm, criteria=criteria) + self.revise = Revise(llm=llm) + self.ensemble = Ensemble(llm=llm) + + async def __call__(self, problem:str, ensemble_count:int = 2): + # TODO Ensemble Implamentation + solution_list = [] + for _ in range(ensemble_count): + solution = await self.single_solve(problem, 3) + solution = solution.get('code_solution') + solution_list.append(solution) + solution = await self.ensemble(solution_list, problem) + return solution + + async def single_solve(self, problem:str, max_loop:int): + solution = await self.generate_code(problem) + for _ in range(max_loop): + review_feedback = await self.review(problem, solution) + if review_feedback['review_result']: + break + solution = await self.revise(problem, solution, review_feedback['feedback']) + return solution \ No newline at end of file diff --git a/examples/ags/w_action_node/operator.py b/examples/ags/w_action_node/operator.py new file mode 100644 index 000000000..eb91bbd69 --- /dev/null +++ b/examples/ags/w_action_node/operator.py @@ -0,0 +1,78 @@ +# -*- coding: utf-8 -*- +# @Date : 6/27/2024 17:36 PM +# @Author : didi +# @Desc : operator demo of ags + +from typing import List + +from metagpt.actions.action_node import ActionNode +from metagpt.llm import LLM + +from examples.ags.w_action_node.operator_an import GENERATE_NODE, GENERATE_CODE_NODE, REVIEW_NODE, REVISE_NODE, ENSEMBLE_NODE +from examples.ags.w_action_node.prompt import GENERATE_PROMPT, GENERATE_CODE_PROMPT, REVIEW_PROMPT, REVISE_PROMPT, ENSEMBLE_PROMPT + +class Operator: + def __init__(self, name, llm:LLM=None): + self.name = name + self.llm = llm + + def __call__(self, *args, **kwargs): + raise NotImplementedError + +class Generate(Operator): + def __init__(self, name:str ="Generator", llm: LLM = LLM()): + super().__init__(name, llm) + + async def __call__(self, problem_description): + prompt = GENERATE_PROMPT.format(problem_description=problem_description) + node = await GENERATE_NODE.fill(context=prompt, llm=self.llm) + response = node.instruct_content.model_dump() + return response + +class GenerateCode(Operator): + + def __init__(self, name:str ="Coder", llm: LLM = LLM()): + super().__init__(name, llm) + + async def __call__(self, problem_description): + prompt = GENERATE_CODE_PROMPT.format(problem_description=problem_description) + node = await GENERATE_CODE_NODE.fill(context=prompt, llm=self.llm) + response = node.instruct_content.model_dump() + return response + +class Review(Operator): + + def __init__(self, criteria, name:str ="Reviewer", llm: LLM = LLM()): + self.criteria = criteria + super().__init__(name, llm) + + async def __call__(self, problem_description, solution): + prompt = REVIEW_PROMPT.format(problem_description=problem_description, solution=solution, criteria=self.criteria) + node = await REVIEW_NODE.fill(context=prompt, llm=self.llm) + response = node.instruct_content.model_dump() + return response + +class Revise(Operator): + + def __init__(self, name:str ="Reviser", llm: LLM = LLM()): + super().__init__(name, llm) + + async def __call__(self, problem_description, solution, feedback): + prompt = REVISE_PROMPT.format(problem_description=problem_description, solution=solution, feedback=feedback) + node = await REVISE_NODE.fill(context=prompt, llm=self.llm) + response = node.instruct_content.model_dump() + return response + +class Ensemble(Operator): + + def __init__(self, name:str ="Ensembler", llm: LLM = LLM()): + super().__init__(name, llm) + + async def __call__(self, solutions:List, problem_description): + solution_text = "" + for solution in solutions: + solution_text += solution + "\n" + prompt = ENSEMBLE_PROMPT.format(solutions=solution_text, problem_description=problem_description) + node = await ENSEMBLE_NODE.fill(context=prompt, llm=self.llm) + response = node.instruct_content.model_dump() + return response \ No newline at end of file diff --git a/examples/ags/w_action_node/operator_an.py b/examples/ags/w_action_node/operator_an.py new file mode 100644 index 000000000..1f989db35 --- /dev/null +++ b/examples/ags/w_action_node/operator_an.py @@ -0,0 +1,65 @@ +# -*- coding: utf-8 -*- +# @Date : 6/27/2024 19:46 PM +# @Author : didi +# @Desc : action nodes for operator + +from pydantic import BaseModel, Field +from metagpt.actions.action_node import ActionNode + +SOLUTION = ActionNode( + key="solution", + expected_type=str, + instruction="Your Solution for this problem", + example="" +) + +CODE_SOLUTION = ActionNode( + key="code_solution", + expected_type=str, + instruction="Your Code Solution for this problem", + example="" +) + +REVIEW_RESULT = ActionNode( + key="review_result", + expected_type=bool, + instruction="The Review Result (Bool). If you think this solution looks good for you, return 'true'; If not, return 'false'", + example="" +) + +FEEDBACK = ActionNode( + key="feedback", + expected_type=str, + instruction="Your FeedBack for this problem based on the criteria. If the review result is true, you can put it 'nothing here'.", + example="" +) + +GENERATE_NODE = ActionNode.from_children("Generate", [SOLUTION]) +GENERATE_CODE_NODE = ActionNode.from_children("GenerateCode", [CODE_SOLUTION]) +REVIEW_NODE = ActionNode.from_children("Review", [REVIEW_RESULT, FEEDBACK]) +REVISE_NODE = ActionNode.from_children("Revise", [SOLUTION]) +ENSEMBLE_NODE = ActionNode.from_children("Ensemble", [SOLUTION]) + +class Generate(BaseModel): + solution: str = Field(default="", description="Your Solution for this problem") + +class GenerateCode(BaseModel): + code_solution: str = Field(default="", description="Your Code Solution for this problem") + +class Review(BaseModel): + review_result: bool = Field(default=False, description="The Review Result (Bool). If you think this solution looks good for you, return 'true'; If not, return 'false'") + feedback: str = Field(default="", description="Your FeedBack for this problem based on the criteria. If the review result is true, you can put it 'nothing here'.") + +class Revise(BaseModel): + revised_solution: str = Field(default="", description="Revised solution for this problem") + +class Ensemble(BaseModel): + final_solution: str = Field(default="", description="Final ensemble solution for this problem") + + + + +# 接下来我将给予你两段代码,请你按照我的要求对其进行改写 +# 第一段代码是一个利用子ActionNode通过From_children方法实现的多个Node聚合 +# 第二段代码是一个利用Pydantic与From_pydantic方法实现的Node +# 现在,我希望你能够通过From Pydantic方法,通过第二段代码的风格,完成我第一段代码中的GENERATE -> ENSEMBLE 五个Node的实现,每一个实现都应该像是第二段代码中的一个Class一样 \ No newline at end of file diff --git a/examples/ags/w_action_node/prompt.py b/examples/ags/w_action_node/prompt.py new file mode 100644 index 000000000..46d851923 --- /dev/null +++ b/examples/ags/w_action_node/prompt.py @@ -0,0 +1,30 @@ +# -*- coding: utf-8 -*- +# @Date : 6/26/2024 17:07 PM +# @Author : didi +# @Desc : prompts of operators + + +GENERATE_PROMPT = """ +Generate Solution for the following problem: {problem_description} +""" + +GENERATE_CODE_PROMPT = """ +Generate Code Solution for the following problem: {problem_description} +""" + +REVIEW_PROMPT = """ +For the question described as {problem_description}, +please review the following solution: {solution}, and provide a review result in boolean format. +If you believe the solution is capable of resolving the issue, return True; otherwise, return False, and include your comments +""" + +REVISE_PROMPT = """ +For the question described as {problem_description}, +please evaluate and revise the solution provided: {solution}, taking into account the review comments: {comment}." +Then output the revised solution. +""" + +ENSEMBLE_PROMPT = """ +For the question described as {problem_description}, +please ensemble the following solutions: {solutions}, and provide an ensemble solution. +""" diff --git a/test.ipynb b/test.ipynb new file mode 100644 index 000000000..352e0bc68 --- /dev/null +++ b/test.ipynb @@ -0,0 +1,301 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: metagpt in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (0.8.1)\n", + "Requirement already satisfied: aiohttp==3.8.6 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from metagpt) (3.8.6)\n", + "Requirement already satisfied: channels==4.0.0 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from metagpt) (4.0.0)\n", + "Requirement already satisfied: faiss-cpu==1.7.4 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from metagpt) (1.7.4)\n", + "Requirement already satisfied: fire==0.4.0 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from metagpt) (0.4.0)\n", + "Requirement already satisfied: typer==0.9.0 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from metagpt) (0.9.0)\n", + "Requirement already satisfied: lancedb==0.4.0 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from metagpt) (0.4.0)\n", + "Requirement already satisfied: loguru==0.6.0 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from metagpt) (0.6.0)\n", + "Requirement already satisfied: meilisearch==0.21.0 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from metagpt) (0.21.0)\n", + "Requirement already satisfied: numpy==1.24.3 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from metagpt) (1.24.3)\n", + "Requirement already satisfied: openai==1.6.1 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from metagpt) (1.6.1)\n", + "Requirement already satisfied: openpyxl in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from metagpt) (3.0.10)\n", + "Requirement already satisfied: beautifulsoup4==4.12.3 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from metagpt) (4.12.3)\n", + "Requirement already satisfied: pandas==2.1.1 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from metagpt) (2.1.1)\n", + "Requirement already satisfied: pydantic==2.6.4 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from metagpt) (2.6.4)\n", + "Requirement already satisfied: python-docx==0.8.11 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from metagpt) (0.8.11)\n", + "Requirement already satisfied: PyYAML==6.0.1 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from metagpt) (6.0.1)\n", + "Requirement already satisfied: setuptools==65.6.3 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from metagpt) (65.6.3)\n", + "Requirement already satisfied: tenacity==8.2.3 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from metagpt) (8.2.3)\n", + "Requirement already satisfied: tiktoken==0.6.0 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from metagpt) (0.6.0)\n", + "Requirement already satisfied: tqdm==4.66.2 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from metagpt) (4.66.2)\n", + "Requirement already satisfied: anthropic==0.18.1 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from metagpt) (0.18.1)\n", + "Requirement already satisfied: typing-inspect==0.8.0 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from metagpt) (0.8.0)\n", + "Requirement already satisfied: libcst==1.0.1 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from metagpt) (1.0.1)\n", + "Requirement already satisfied: qdrant-client==1.7.0 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from metagpt) (1.7.0)\n", + "Requirement already satisfied: ta==0.10.2 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from metagpt) (0.10.2)\n", + "Requirement already satisfied: semantic-kernel==0.4.3.dev0 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from metagpt) (0.4.3.dev0)\n", + "Requirement already satisfied: wrapt==1.15.0 in /Users/mac/Library/Python/3.9/lib/python/site-packages (from metagpt) (1.15.0)\n", + "Requirement already satisfied: aioredis~=2.0.1 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from metagpt) (2.0.1)\n", + "Requirement already satisfied: websocket-client==1.6.2 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from metagpt) (1.6.2)\n", + "Requirement already satisfied: aiofiles==23.2.1 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from metagpt) (23.2.1)\n", + "Requirement already satisfied: gitpython==3.1.40 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from metagpt) (3.1.40)\n", + "Requirement already satisfied: zhipuai==2.0.1 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from metagpt) (2.0.1)\n", + "Requirement already satisfied: rich==13.6.0 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from metagpt) (13.6.0)\n", + "Requirement already satisfied: nbclient==0.9.0 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from metagpt) (0.9.0)\n", + "Requirement already satisfied: nbformat==5.9.2 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from metagpt) (5.9.2)\n", + "Requirement already satisfied: ipython==8.17.2 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from metagpt) (8.17.2)\n", + "Requirement already satisfied: ipykernel==6.27.1 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from metagpt) (6.27.1)\n", + "Requirement already satisfied: scikit-learn==1.3.2 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from metagpt) (1.3.2)\n", + "Requirement already satisfied: typing-extensions==4.9.0 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from metagpt) (4.9.0)\n", + "Requirement already satisfied: socksio~=1.0.0 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from metagpt) (1.0.0)\n", + "Requirement already satisfied: gitignore-parser==0.1.9 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from metagpt) (0.1.9)\n", + "Requirement already satisfied: websockets~=11.0 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from metagpt) (11.0.3)\n", + "Requirement already satisfied: networkx~=3.2.1 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from metagpt) (3.2.1)\n", + "Requirement already satisfied: google-generativeai==0.4.1 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from metagpt) (0.4.1)\n", + "Requirement already satisfied: playwright>=1.26 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from metagpt) (1.44.0)\n", + "Requirement already satisfied: anytree in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from metagpt) (2.12.1)\n", + "Requirement already satisfied: ipywidgets==8.1.1 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from metagpt) (8.1.1)\n", + "Requirement already satisfied: Pillow in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from metagpt) (9.4.0)\n", + "Requirement already satisfied: imap-tools==1.5.0 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from metagpt) (1.5.0)\n", + "Requirement already satisfied: qianfan==0.3.2 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from metagpt) (0.3.2)\n", + "Requirement already satisfied: dashscope==1.14.1 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from metagpt) (1.14.1)\n", + "Requirement already satisfied: rank-bm25==0.2.2 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from metagpt) (0.2.2)\n", + "Requirement already satisfied: jieba==0.42.1 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from metagpt) (0.42.1)\n", + "Requirement already satisfied: attrs>=17.3.0 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from aiohttp==3.8.6->metagpt) (22.2.0)\n", + "Requirement already satisfied: charset-normalizer<4.0,>=2.0 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from aiohttp==3.8.6->metagpt) (3.1.0)\n", + "Requirement already satisfied: multidict<7.0,>=4.5 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from aiohttp==3.8.6->metagpt) (6.0.4)\n", + "Requirement already satisfied: async-timeout<5.0,>=4.0.0a3 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from aiohttp==3.8.6->metagpt) (4.0.2)\n", + "Requirement already satisfied: yarl<2.0,>=1.0 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from aiohttp==3.8.6->metagpt) (1.8.2)\n", + "Requirement already satisfied: frozenlist>=1.1.1 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from aiohttp==3.8.6->metagpt) (1.3.3)\n", + "Requirement already satisfied: aiosignal>=1.1.2 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from aiohttp==3.8.6->metagpt) (1.3.1)\n", + "Requirement already satisfied: anyio<5,>=3.5.0 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from anthropic==0.18.1->metagpt) (3.6.2)\n", + "Requirement already satisfied: distro<2,>=1.7.0 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from anthropic==0.18.1->metagpt) (1.8.0)\n", + "Requirement already satisfied: httpx<1,>=0.23.0 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from anthropic==0.18.1->metagpt) (0.23.3)\n", + "Requirement already satisfied: sniffio in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from anthropic==0.18.1->metagpt) (1.3.0)\n", + "Requirement already satisfied: tokenizers>=0.13.0 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from anthropic==0.18.1->metagpt) (0.19.1)\n", + "Requirement already satisfied: soupsieve>1.2 in /Users/mac/Library/Python/3.9/lib/python/site-packages (from beautifulsoup4==4.12.3->metagpt) (2.3.2.post1)\n", + "Requirement already satisfied: Django>=3.2 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from channels==4.0.0->metagpt) (4.1.3)\n", + "Requirement already satisfied: asgiref<4,>=3.5.0 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from channels==4.0.0->metagpt) (3.8.1)\n", + "Requirement already satisfied: requests in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from dashscope==1.14.1->metagpt) (2.32.3)\n", + "Requirement already satisfied: six in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from fire==0.4.0->metagpt) (1.16.0)\n", + "Requirement already satisfied: termcolor in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from fire==0.4.0->metagpt) (2.4.0)\n", + "Requirement already satisfied: gitdb<5,>=4.0.1 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from gitpython==3.1.40->metagpt) (4.0.11)\n", + "Requirement already satisfied: google-ai-generativelanguage==0.4.0 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from google-generativeai==0.4.1->metagpt) (0.4.0)\n", + "Requirement already satisfied: google-auth>=2.15.0 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from google-generativeai==0.4.1->metagpt) (2.30.0)\n", + "Requirement already satisfied: google-api-core in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from google-generativeai==0.4.1->metagpt) (2.19.1)\n", + "Requirement already satisfied: protobuf in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from google-generativeai==0.4.1->metagpt) (4.25.3)\n", + "Requirement already satisfied: appnope in /Users/mac/Library/Python/3.9/lib/python/site-packages (from ipykernel==6.27.1->metagpt) (0.1.3)\n", + "Requirement already satisfied: comm>=0.1.1 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from ipykernel==6.27.1->metagpt) (0.2.2)\n", + "Requirement already satisfied: debugpy>=1.6.5 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from ipykernel==6.27.1->metagpt) (1.8.2)\n", + "Requirement already satisfied: jupyter-client>=6.1.12 in /Users/mac/Library/Python/3.9/lib/python/site-packages (from ipykernel==6.27.1->metagpt) (7.4.7)\n", + "Requirement already satisfied: jupyter-core!=5.0.*,>=4.12 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from ipykernel==6.27.1->metagpt) (5.7.2)\n", + "Requirement already satisfied: matplotlib-inline>=0.1 in /Users/mac/Library/Python/3.9/lib/python/site-packages (from ipykernel==6.27.1->metagpt) (0.1.6)\n", + "Requirement already satisfied: nest-asyncio in /Users/mac/Library/Python/3.9/lib/python/site-packages (from ipykernel==6.27.1->metagpt) (1.5.6)\n", + "Requirement already satisfied: packaging in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from ipykernel==6.27.1->metagpt) (23.0)\n", + "Requirement already satisfied: psutil in /Users/mac/Library/Python/3.9/lib/python/site-packages (from ipykernel==6.27.1->metagpt) (5.9.4)\n", + "Requirement already satisfied: pyzmq>=20 in /Users/mac/Library/Python/3.9/lib/python/site-packages (from ipykernel==6.27.1->metagpt) (24.0.1)\n", + "Requirement already satisfied: tornado>=6.1 in /Users/mac/Library/Python/3.9/lib/python/site-packages (from ipykernel==6.27.1->metagpt) (6.2)\n", + "Requirement already satisfied: traitlets>=5.4.0 in /Users/mac/Library/Python/3.9/lib/python/site-packages (from ipykernel==6.27.1->metagpt) (5.5.0)\n", + "Requirement already satisfied: decorator in /Users/mac/Library/Python/3.9/lib/python/site-packages (from ipython==8.17.2->metagpt) (5.1.1)\n", + "Requirement already satisfied: jedi>=0.16 in /Users/mac/Library/Python/3.9/lib/python/site-packages (from ipython==8.17.2->metagpt) (0.18.2)\n", + "Requirement already satisfied: prompt-toolkit!=3.0.37,<3.1.0,>=3.0.30 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from ipython==8.17.2->metagpt) (3.0.47)\n", + "Requirement already satisfied: pygments>=2.4.0 in /Users/mac/Library/Python/3.9/lib/python/site-packages (from ipython==8.17.2->metagpt) (2.13.0)\n", + "Requirement already satisfied: stack-data in /Users/mac/Library/Python/3.9/lib/python/site-packages (from ipython==8.17.2->metagpt) (0.6.1)\n", + "Requirement already satisfied: exceptiongroup in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from ipython==8.17.2->metagpt) (1.2.1)\n", + "Requirement already satisfied: pexpect>4.3 in /Users/mac/Library/Python/3.9/lib/python/site-packages (from ipython==8.17.2->metagpt) (4.8.0)\n", + "Requirement already satisfied: widgetsnbextension~=4.0.9 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from ipywidgets==8.1.1->metagpt) (4.0.11)\n", + "Requirement already satisfied: jupyterlab-widgets~=3.0.9 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from ipywidgets==8.1.1->metagpt) (3.0.11)\n", + "Requirement already satisfied: deprecation in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from lancedb==0.4.0->metagpt) (2.1.0)\n", + "Requirement already satisfied: pylance==0.9.0 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from lancedb==0.4.0->metagpt) (0.9.0)\n", + "Requirement already satisfied: ratelimiter~=1.0 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from lancedb==0.4.0->metagpt) (1.2.0.post0)\n", + "Requirement already satisfied: retry>=0.9.2 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from lancedb==0.4.0->metagpt) (0.9.2)\n", + "Requirement already satisfied: semver>=3.0 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from lancedb==0.4.0->metagpt) (3.0.2)\n", + "Requirement already satisfied: cachetools in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from lancedb==0.4.0->metagpt) (5.3.3)\n", + "Requirement already satisfied: click>=8.1.7 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from lancedb==0.4.0->metagpt) (8.1.7)\n", + "Requirement already satisfied: overrides>=0.7 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from lancedb==0.4.0->metagpt) (7.7.0)\n", + "Requirement already satisfied: camel-converter[pydantic] in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from meilisearch==0.21.0->metagpt) (3.1.2)\n", + "Requirement already satisfied: fastjsonschema in /Users/mac/Library/Python/3.9/lib/python/site-packages (from nbformat==5.9.2->metagpt) (2.16.2)\n", + "Requirement already satisfied: jsonschema>=2.6 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from nbformat==5.9.2->metagpt) (4.22.0)\n", + "Requirement already satisfied: python-dateutil>=2.8.2 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from pandas==2.1.1->metagpt) (2.8.2)\n", + "Requirement already satisfied: pytz>=2020.1 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from pandas==2.1.1->metagpt) (2022.7.1)\n", + "Requirement already satisfied: tzdata>=2022.1 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from pandas==2.1.1->metagpt) (2024.1)\n", + "Requirement already satisfied: annotated-types>=0.4.0 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from pydantic==2.6.4->metagpt) (0.7.0)\n", + "Requirement already satisfied: pydantic-core==2.16.3 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from pydantic==2.6.4->metagpt) (2.16.3)\n", + "Requirement already satisfied: lxml>=2.3.2 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from python-docx==0.8.11->metagpt) (4.9.2)\n", + "Requirement already satisfied: grpcio>=1.41.0 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from qdrant-client==1.7.0->metagpt) (1.64.1)\n", + "Requirement already satisfied: grpcio-tools>=1.41.0 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from qdrant-client==1.7.0->metagpt) (1.62.2)\n", + "Requirement already satisfied: portalocker<3.0.0,>=2.7.0 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from qdrant-client==1.7.0->metagpt) (2.10.0)\n", + "Requirement already satisfied: urllib3<2.0.0,>=1.26.14 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from qdrant-client==1.7.0->metagpt) (1.26.14)\n", + "Requirement already satisfied: aiolimiter>=1.1.0 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from qianfan==0.3.2->metagpt) (1.1.0)\n", + "Requirement already satisfied: bce-python-sdk>=0.8.79 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from qianfan==0.3.2->metagpt) (0.9.17)\n", + "Requirement already satisfied: multiprocess in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from qianfan==0.3.2->metagpt) (0.70.16)\n", + "Requirement already satisfied: pyarrow>=14.0.1 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from qianfan==0.3.2->metagpt) (16.1.0)\n", + "Requirement already satisfied: python-dotenv>=1.0 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from qianfan==0.3.2->metagpt) (1.0.0)\n", + "Requirement already satisfied: markdown-it-py>=2.2.0 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from rich==13.6.0->metagpt) (2.2.0)\n", + "Requirement already satisfied: scipy>=1.5.0 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from scikit-learn==1.3.2->metagpt) (1.13.1)\n", + "Requirement already satisfied: joblib>=1.1.1 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from scikit-learn==1.3.2->metagpt) (1.4.2)\n", + "Requirement already satisfied: threadpoolctl>=2.0.0 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from scikit-learn==1.3.2->metagpt) (3.5.0)\n", + "Requirement already satisfied: motor<4.0.0,>=3.3.1 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from semantic-kernel==0.4.3.dev0->metagpt) (3.5.0)\n", + "Requirement already satisfied: openapi_core<0.19.0,>=0.18.0 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from semantic-kernel==0.4.3.dev0->metagpt) (0.18.2)\n", + "Requirement already satisfied: prance<24.0.0.0,>=23.6.21.0 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from semantic-kernel==0.4.3.dev0->metagpt) (23.6.21.0)\n", + "Requirement already satisfied: regex<2024.0.0,>=2023.6.3 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from semantic-kernel==0.4.3.dev0->metagpt) (2023.12.25)\n", + "Requirement already satisfied: mypy-extensions>=0.3.0 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from typing-inspect==0.8.0->metagpt) (1.0.0)\n", + "Requirement already satisfied: pyjwt~=2.8.0 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from zhipuai==2.0.1->metagpt) (2.8.0)\n", + "Requirement already satisfied: proto-plus<2.0.0dev,>=1.22.3 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from google-ai-generativelanguage==0.4.0->google-generativeai==0.4.1->metagpt) (1.24.0)\n", + "Requirement already satisfied: greenlet==3.0.3 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from playwright>=1.26->metagpt) (3.0.3)\n", + "Requirement already satisfied: pyee==11.1.0 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from playwright>=1.26->metagpt) (11.1.0)\n", + "Requirement already satisfied: et-xmlfile in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from openpyxl->metagpt) (1.1.0)\n", + "Requirement already satisfied: idna>=2.8 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from anyio<5,>=3.5.0->anthropic==0.18.1->metagpt) (3.4)\n", + "Requirement already satisfied: pycryptodome>=3.8.0 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from bce-python-sdk>=0.8.79->qianfan==0.3.2->metagpt) (3.17)\n", + "Requirement already satisfied: future>=0.6.0 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from bce-python-sdk>=0.8.79->qianfan==0.3.2->metagpt) (1.0.0)\n", + "Requirement already satisfied: sqlparse>=0.2.2 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from Django>=3.2->channels==4.0.0->metagpt) (0.4.3)\n", + "Requirement already satisfied: smmap<6,>=3.0.1 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from gitdb<5,>=4.0.1->gitpython==3.1.40->metagpt) (5.0.1)\n", + "Requirement already satisfied: googleapis-common-protos<2.0.dev0,>=1.56.2 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from google-api-core->google-generativeai==0.4.1->metagpt) (1.63.2)\n", + "Requirement already satisfied: pyasn1-modules>=0.2.1 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from google-auth>=2.15.0->google-generativeai==0.4.1->metagpt) (0.2.8)\n", + "Requirement already satisfied: rsa<5,>=3.1.4 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from google-auth>=2.15.0->google-generativeai==0.4.1->metagpt) (4.9)\n", + "Requirement already satisfied: certifi in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from httpx<1,>=0.23.0->anthropic==0.18.1->metagpt) (2022.12.7)\n", + "Requirement already satisfied: httpcore<0.17.0,>=0.15.0 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from httpx<1,>=0.23.0->anthropic==0.18.1->metagpt) (0.16.3)\n", + "Requirement already satisfied: rfc3986<2,>=1.3 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from rfc3986[idna2008]<2,>=1.3->httpx<1,>=0.23.0->anthropic==0.18.1->metagpt) (1.5.0)\n", + "Requirement already satisfied: h2<5,>=3 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from httpx[http2]>=0.14.0->qdrant-client==1.7.0->metagpt) (4.1.0)\n", + "Requirement already satisfied: parso<0.9.0,>=0.8.0 in /Users/mac/Library/Python/3.9/lib/python/site-packages (from jedi>=0.16->ipython==8.17.2->metagpt) (0.8.3)\n", + "Requirement already satisfied: jsonschema-specifications>=2023.03.6 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from jsonschema>=2.6->nbformat==5.9.2->metagpt) (2023.7.1)\n", + "Requirement already satisfied: referencing>=0.28.4 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from jsonschema>=2.6->nbformat==5.9.2->metagpt) (0.30.2)\n", + "Requirement already satisfied: rpds-py>=0.7.1 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from jsonschema>=2.6->nbformat==5.9.2->metagpt) (0.18.1)\n", + "Requirement already satisfied: entrypoints in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from jupyter-client>=6.1.12->ipykernel==6.27.1->metagpt) (0.4)\n", + "Requirement already satisfied: platformdirs>=2.5 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from jupyter-core!=5.0.*,>=4.12->ipykernel==6.27.1->metagpt) (2.5.4)\n", + "Requirement already satisfied: mdurl~=0.1 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from markdown-it-py>=2.2.0->rich==13.6.0->metagpt) (0.1.2)\n", + "Requirement already satisfied: pymongo<5,>=4.5 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from motor<4.0.0,>=3.3.1->semantic-kernel==0.4.3.dev0->metagpt) (4.7.3)\n", + "Requirement already satisfied: isodate in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from openapi_core<0.19.0,>=0.18.0->semantic-kernel==0.4.3.dev0->metagpt) (0.6.1)\n", + "Requirement already satisfied: jsonschema-spec<0.3.0,>=0.2.3 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from openapi_core<0.19.0,>=0.18.0->semantic-kernel==0.4.3.dev0->metagpt) (0.2.4)\n", + "Requirement already satisfied: more-itertools in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from openapi_core<0.19.0,>=0.18.0->semantic-kernel==0.4.3.dev0->metagpt) (10.3.0)\n", + "Requirement already satisfied: openapi-schema-validator<0.7.0,>=0.6.0 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from openapi_core<0.19.0,>=0.18.0->semantic-kernel==0.4.3.dev0->metagpt) (0.6.2)\n", + "Requirement already satisfied: openapi-spec-validator<0.8.0,>=0.7.1 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from openapi_core<0.19.0,>=0.18.0->semantic-kernel==0.4.3.dev0->metagpt) (0.7.1)\n", + "Requirement already satisfied: parse in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from openapi_core<0.19.0,>=0.18.0->semantic-kernel==0.4.3.dev0->metagpt) (1.20.2)\n", + "Requirement already satisfied: werkzeug in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from openapi_core<0.19.0,>=0.18.0->semantic-kernel==0.4.3.dev0->metagpt) (3.0.3)\n", + "Requirement already satisfied: ptyprocess>=0.5 in /Users/mac/Library/Python/3.9/lib/python/site-packages (from pexpect>4.3->ipython==8.17.2->metagpt) (0.7.0)\n", + "Requirement already satisfied: chardet>=3.0 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from prance<24.0.0.0,>=23.6.21.0->semantic-kernel==0.4.3.dev0->metagpt) (5.2.0)\n", + "Requirement already satisfied: ruamel.yaml>=0.17.10 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from prance<24.0.0.0,>=23.6.21.0->semantic-kernel==0.4.3.dev0->metagpt) (0.18.6)\n", + "Requirement already satisfied: wcwidth in /Users/mac/Library/Python/3.9/lib/python/site-packages (from prompt-toolkit!=3.0.37,<3.1.0,>=3.0.30->ipython==8.17.2->metagpt) (0.2.5)\n", + "Requirement already satisfied: py<2.0.0,>=1.4.26 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from retry>=0.9.2->lancedb==0.4.0->metagpt) (1.11.0)\n", + "Requirement already satisfied: huggingface-hub<1.0,>=0.16.4 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from tokenizers>=0.13.0->anthropic==0.18.1->metagpt) (0.23.4)\n", + "Requirement already satisfied: dill>=0.3.8 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from multiprocess->qianfan==0.3.2->metagpt) (0.3.8)\n", + "Requirement already satisfied: executing>=1.2.0 in /Users/mac/Library/Python/3.9/lib/python/site-packages (from stack-data->ipython==8.17.2->metagpt) (1.2.0)\n", + "Requirement already satisfied: asttokens>=2.1.0 in /Users/mac/Library/Python/3.9/lib/python/site-packages (from stack-data->ipython==8.17.2->metagpt) (2.1.0)\n", + "Requirement already satisfied: pure-eval in /Users/mac/Library/Python/3.9/lib/python/site-packages (from stack-data->ipython==8.17.2->metagpt) (0.2.2)\n", + "Requirement already satisfied: grpcio-status<2.0.dev0,>=1.33.2 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from google-api-core[grpc]!=2.0.*,!=2.1.*,!=2.10.*,!=2.2.*,!=2.3.*,!=2.4.*,!=2.5.*,!=2.6.*,!=2.7.*,!=2.8.*,!=2.9.*,<3.0.0dev,>=1.34.0->google-ai-generativelanguage==0.4.0->google-generativeai==0.4.1->metagpt) (1.62.2)\n", + "Requirement already satisfied: hyperframe<7,>=6.0 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from h2<5,>=3->httpx[http2]>=0.14.0->qdrant-client==1.7.0->metagpt) (6.0.1)\n", + "Requirement already satisfied: hpack<5,>=4.0 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from h2<5,>=3->httpx[http2]>=0.14.0->qdrant-client==1.7.0->metagpt) (4.0.0)\n", + "Requirement already satisfied: h11<0.15,>=0.13 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from httpcore<0.17.0,>=0.15.0->httpx<1,>=0.23.0->anthropic==0.18.1->metagpt) (0.14.0)\n", + "Requirement already satisfied: filelock in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from huggingface-hub<1.0,>=0.16.4->tokenizers>=0.13.0->anthropic==0.18.1->metagpt) (3.8.0)\n", + "Requirement already satisfied: fsspec>=2023.5.0 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from huggingface-hub<1.0,>=0.16.4->tokenizers>=0.13.0->anthropic==0.18.1->metagpt) (2024.6.0)\n", + "Requirement already satisfied: pathable<0.5.0,>=0.4.1 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from jsonschema-spec<0.3.0,>=0.2.3->openapi_core<0.19.0,>=0.18.0->semantic-kernel==0.4.3.dev0->metagpt) (0.4.3)\n", + "Requirement already satisfied: rfc3339-validator in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from openapi-schema-validator<0.7.0,>=0.6.0->openapi_core<0.19.0,>=0.18.0->semantic-kernel==0.4.3.dev0->metagpt) (0.1.4)\n", + "Requirement already satisfied: jsonschema-path<0.4.0,>=0.3.1 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from openapi-spec-validator<0.8.0,>=0.7.1->openapi_core<0.19.0,>=0.18.0->semantic-kernel==0.4.3.dev0->metagpt) (0.3.3)\n", + "Requirement already satisfied: lazy-object-proxy<2.0.0,>=1.7.1 in /Users/mac/Library/Python/3.9/lib/python/site-packages (from openapi-spec-validator<0.8.0,>=0.7.1->openapi_core<0.19.0,>=0.18.0->semantic-kernel==0.4.3.dev0->metagpt) (1.9.0)\n", + "Requirement already satisfied: pyasn1<0.5.0,>=0.4.6 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from pyasn1-modules>=0.2.1->google-auth>=2.15.0->google-generativeai==0.4.1->metagpt) (0.4.8)\n", + "Requirement already satisfied: dnspython<3.0.0,>=1.16.0 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from pymongo<5,>=4.5->motor<4.0.0,>=3.3.1->semantic-kernel==0.4.3.dev0->metagpt) (2.6.1)\n", + "Requirement already satisfied: ruamel.yaml.clib>=0.2.7 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from ruamel.yaml>=0.17.10->prance<24.0.0.0,>=23.6.21.0->semantic-kernel==0.4.3.dev0->metagpt) (0.2.8)\n", + "Requirement already satisfied: MarkupSafe>=2.1.1 in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (from werkzeug->openapi_core<0.19.0,>=0.18.0->semantic-kernel==0.4.3.dev0->metagpt) (2.1.2)\n", + "\n", + "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m23.3.1\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m24.1\u001b[0m\n", + "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpip install --upgrade pip\u001b[0m\n" + ] + } + ], + "source": [ + "!pip install --upgrade metagpt" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "# Usage\n", + "\n", + "human_eval_example = \"\"\"\n", + "from typing import List\\n\\n\\ndef has_close_elements(numbers: List[float], threshold: float) -> bool:\\n \\\"\\\"\\\" Check if in given list of numbers, are any two numbers closer to each other than\\n given threshold.\\n >>> has_close_elements([1.0, 2.0, 3.0], 0.5)\\n False\\n >>> has_close_elements([1.0, 2.8, 3.0, 4.0, 5.0, 2.0], 0.3)\\n True\\n \\\"\\\"\\\"\\n\n", + "\"\"\"\n", + "\n", + "problem = \"\"\"\n", + "Human: Write a function that takes a list of numbers and returns the sum of the numbers at even indices.\n", + "\n", + "Function Signature:\n", + "def sum_even_indices(numbers: List[int]) -> int:\n", + "\n", + "Example:\n", + ">>> sum_even_indices([1, 2, 3, 4, 5])\n", + "9 # 1 + 3 + 5 = 9\n", + "\"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'code': 'from typing import List\\n\\ndef has_close_elements(numbers: List[float], threshold: float) -> bool:\\n \"\"\" Check if in given list of numbers, are any two numbers closer to each other than\\n given threshold.\\n >>> has_close_elements([1.0, 2.0, 3.0], 0.5)\\n False\\n >>> has_close_elements([1.0, 2.8, 3.0, 4.0, 5.0, 2.0], 0.3)\\n True\\n \"\"\"\\n numbers_sorted = sorted(numbers)\\n for i in range(len(numbers_sorted) - 1):\\n if abs(numbers_sorted[i] - numbers_sorted[i + 1]) < threshold:\\n return True\\n return False'}\n", + "{'result': True}\n" + ] + }, + { + "data": { + "text/plain": [ + "{'code': 'from typing import List\\n\\ndef has_close_elements(numbers: List[float], threshold: float) -> bool:\\n \"\"\" Check if in given list of numbers, are any two numbers closer to each other than\\n given threshold.\\n >>> has_close_elements([1.0, 2.0, 3.0], 0.5)\\n False\\n >>> has_close_elements([1.0, 2.8, 3.0, 4.0, 5.0, 2.0], 0.3)\\n True\\n \"\"\"\\n numbers_sorted = sorted(numbers)\\n for i in range(len(numbers_sorted) - 1):\\n if abs(numbers_sorted[i] - numbers_sorted[i + 1]) < threshold:\\n return True\\n return False'}" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Test\n", + "\n", + "from examples.ags.demo.graph import HumanEvalGraph\n", + "solver = HumanEvalGraph(name=\"solver\", llm='gpt-4-turbo', criteria='correctness, efficiency, readability')\n", + "result = solver(human_eval_example)\n", + "result" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# TODO\n", + "# 1. 改成MG\n", + "# 2. 添加HumanEval" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.7" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/test.py b/test.py new file mode 100644 index 000000000..78db8c0b4 --- /dev/null +++ b/test.py @@ -0,0 +1,12 @@ +import asyncio +from examples.ags.w_action_node.graph import HumanEvalGraph +from metagpt.llm import LLM + +human_eval_example = """ +from typing import List\n\n\ndef has_close_elements(numbers: List[float], threshold: float) -> bool:\n \"\"\" Check if in given list of numbers, are any two numbers closer to each other than\n given threshold.\n >>> has_close_elements([1.0, 2.0, 3.0], 0.5)\n False\n >>> has_close_elements([1.0, 2.8, 3.0, 4.0, 5.0, 2.0], 0.3)\n True\n \"\"\"\n +""" + +solver = HumanEvalGraph(name="solver", llm=LLM(), criteria='correctness, efficiency, readability') + +final_result = asyncio.run(solver(human_eval_example)) +print(final_result) \ No newline at end of file