diff --git a/examples/smart_minion/code_contests/evalute_code_contests_hard.py b/examples/smart_minion/code_contests/evalute_code_contests_hard.py index 65ee48b4..69d8eef5 100644 --- a/examples/smart_minion/code_contests/evalute_code_contests_hard.py +++ b/examples/smart_minion/code_contests/evalute_code_contests_hard.py @@ -242,8 +242,8 @@ async def solve_question(item): ) return answer -#model = "gpt-4o-mini" -model = "default" +model = "gpt-4o" +#model = "default" llm = create_llm_provider(config.models.get(model)) cost_manager = CostManager() @@ -253,6 +253,7 @@ async def main(): validation_data = load_dataset("deepmind/code_contests", split='valid') test_data = load_dataset("deepmind/code_contests", split='test') validation_data = [validation_data[1]] + #validation_data = [validation_data[0]] correct, count, matched_ids, mismatched_ids = await evaluate_dataset( validation_data, run_filename=f"run_code_contests_{model}_hard.json", continue_process=True, concurrency_count=1 ) diff --git a/minion/configs/config.py b/minion/configs/config.py index 3a85897f..72d915a7 100644 --- a/minion/configs/config.py +++ b/minion/configs/config.py @@ -34,6 +34,7 @@ class ImageDetail(str, Enum): class LLMConfig(BaseModel): api_type: str = "openai" api_key: str + api_version: Optional[str] = None # base_url: Optional[HttpUrl] = None base_url: Optional[str] = None model: str diff --git a/minion/main/improve.py b/minion/main/improve.py index 86b12a32..e4abd96f 100644 --- a/minion/main/improve.py +++ b/minion/main/improve.py @@ -1,7 +1,8 @@ from abc import ABC, abstractmethod from minion.actions.lmp_action_node import LmpActionNode from minion.main.minion import Minion, register_improver_minion -from minion.main.prompt import IMPROVE_CODE_PROMPT +from minion.main.prompt import IMPROVE_CODE_PROMPT, IMPROVE_PROMPT +from minion.utils.template import render_template_with_variables class ImproverMinion(Minion): """所有 improver minion 的基类""" @@ -15,26 +16,26 @@ async def execute(self): @register_improver_minion(name="feedback") class FeedbackMinion(ImproverMinion): + """基于反馈进行通用内容改进的 Minion""" async def execute(self): - # 使用测试用例来改进代码 - test_cases = self.worker.input.metadata.get("test_cases", []) - ai_test_cases = self.worker.input.metadata.get("ai_test_cases", []) - + """基于反馈进行通用内容改进的执行方法""" # 构建改进提示 - prompt = IMPROVE_CODE_PROMPT.format( - code=self.worker.answer, - test_cases=test_cases, - ai_test_cases=ai_test_cases, - entry_point=self.worker.input.entry_point + prompt = render_template_with_variables( + template_str=IMPROVE_PROMPT, + input={ + "answer": self.worker.input.answer, #todo, maybe stateful agent connections? + "feedback": self.worker.input.feedback, + **self.worker.input.__dict__ # 包含其他上下文信息 + } ) - # 使用 LLM 改进代码 + # 使用 LLM 改进内容 node = LmpActionNode(self.brain.llm) - improved_code = await node.execute(prompt) + improved_answer = await node.execute(prompt) # 更新 worker 的答案 - self.worker.answer = improved_code - return improved_code + self.worker.answer = improved_answer + return improved_answer @register_improver_minion(name="reasoning") class ReasoningMinion(ImproverMinion): diff --git a/minion/main/prompt.py b/minion/main/prompt.py index 79301f28..700ca13c 100644 --- a/minion/main/prompt.py +++ b/minion/main/prompt.py @@ -640,6 +640,26 @@ Reasoning: """ +IMPROVE_PROMPT = f"""Given the following problem details: + +{ASK_PROMPT_JINJA} +{ASK_ADDITIONAL_INFO_JINJA} + +Current answer: +{{ input.answer }} + +Feedback for improvement: +{{ input.feedback }} + +Based on the above feedback, please provide an improved answer. The improved answer should: +1. Address all points mentioned in the feedback +2. Maintain the strengths of the original answer +3. Be clear, accurate, and well-structured +4. Be complete and self-contained + +Return only the improved answer without any explanations or comments. +""" + IMPROVE_CODE_PROMPT = """You are a code improvement expert. Your task is to improve the given code based on the test cases. Current code: diff --git a/minion/main/worker.py b/minion/main/worker.py index ab92e466..87cb8e63 100644 --- a/minion/main/worker.py +++ b/minion/main/worker.py @@ -55,7 +55,7 @@ ) from minion.main.symbol_table import Symbol from minion.main.task_graph import convert_tasks_to_graph -from minion.utils.utils import most_similar_minion +from minion.utils.utils import most_similar_minion, camel_case_to_snake_case from minion.actions.lmp_action_node import LmpActionNode from minion.models.schemas import ( MetaPlan, @@ -746,7 +746,7 @@ async def get_minion_class_and_name(self): if self.input.execution_state.chosen_minion: # 从上次状态恢复 name = self.input.execution_state.chosen_minion - klass = MINION_REGISTRY.get(name, CotMinion) + klass = MINION_REGISTRY.get(camel_case_to_snake_case(name), CotMinion) #todo: tmp fix here, actually is other place's bug to store "CotMinion" return klass, name # 新的执行流程