From a1904afbc8b41db307a1520ac23be268de807653 Mon Sep 17 00:00:00 2001 From: CakeCN Date: Thu, 2 Jan 2025 09:29:49 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../__pycache__/__init__.cpython-310.pyc | Bin 157 -> 154 bytes .../__pycache__/agent_manager.cpython-310.pyc | Bin 4960 -> 9038 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 184 -> 181 bytes .../__pycache__/algori_agent.cpython-310.pyc | Bin 11850 -> 17094 bytes .../flex_service_toolkit.cpython-310.pyc | Bin 731 -> 728 bytes .../algoriAgent/agent/algori_agent.py | 1052 +++++++++-------- .../projects/algoriAgent/agent/score_agent.py | 180 +++ .../algoriAgent/agent/total_score_agent.py | 152 +++ .../projects/algoriAgent/agent_manager.py | 564 +++++---- .../__pycache__/__init__.cpython-310.pyc | Bin 184 -> 181 bytes .../__pycache__/judge_tools.cpython-310.pyc | Bin 2193 -> 2732 bytes .../projects/algoriAgent/tools/file_tools.py | 54 + .../projects/algoriAgent/tools/judge_tools.py | 140 ++- .../__pycache__/__init__.cpython-310.pyc | Bin 689 -> 686 bytes .../__pycache__/_init.cpython-310.pyc | Bin 6377 -> 6374 bytes .../__pycache__/_runtime.cpython-310.pyc | Bin 2546 -> 2543 bytes .../__pycache__/_version.cpython-310.pyc | Bin 239 -> 236 bytes .../__pycache__/constants.cpython-310.pyc | Bin 1826 -> 1823 bytes .../__pycache__/exception.cpython-310.pyc | Bin 4566 -> 4563 bytes .../__pycache__/file_manager.cpython-310.pyc | Bin 7561 -> 7558 bytes .../__pycache__/logging.cpython-310.pyc | Bin 5942 -> 5939 bytes .../__pycache__/message.cpython-310.pyc | Bin 12058 -> 12055 bytes .../__pycache__/msghub.cpython-310.pyc | Bin 5030 -> 5027 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 762 -> 759 bytes .../agents/__pycache__/agent.cpython-310.pyc | Bin 15177 -> 15174 bytes .../__pycache__/dialog_agent.cpython-310.pyc | Bin 2683 -> 2680 bytes .../dict_dialog_agent.cpython-310.pyc | Bin 4193 -> 4190 bytes .../__pycache__/operator.cpython-310.pyc | Bin 970 -> 967 bytes .../__pycache__/rag_agent.cpython-310.pyc | Bin 5222 -> 5219 bytes .../__pycache__/react_agent.cpython-310.pyc | Bin 9326 -> 9323 bytes .../__pycache__/rpc_agent.cpython-310.pyc | Bin 5362 -> 5359 bytes .../text_to_image_agent.cpython-310.pyc | Bin 2309 -> 2306 bytes .../__pycache__/user_agent.cpython-310.pyc | Bin 4529 -> 4526 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 360 -> 357 bytes .../memory/__pycache__/memory.cpython-310.pyc | Bin 4813 -> 4810 bytes .../temporary_memory.cpython-310.pyc | Bin 10230 -> 10227 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 4554 -> 4551 bytes .../models/__pycache__/config.cpython-310.pyc | Bin 2210 -> 2207 bytes .../dashscope_model.cpython-310.pyc | Bin 23793 -> 23790 bytes .../__pycache__/gemini_model.cpython-310.pyc | Bin 10824 -> 10821 bytes .../__pycache__/litellm_model.cpython-310.pyc | Bin 7688 -> 7685 bytes .../models/__pycache__/model.cpython-310.pyc | Bin 9293 -> 9290 bytes .../__pycache__/ollama_model.cpython-310.pyc | Bin 12422 -> 12419 bytes .../__pycache__/openai_model.cpython-310.pyc | Bin 15196 -> 15193 bytes .../__pycache__/post_model.cpython-310.pyc | Bin 9962 -> 9959 bytes .../__pycache__/response.cpython-310.pyc | Bin 2737 -> 2734 bytes .../__pycache__/zhipu_model.cpython-310.pyc | Bin 10228 -> 10225 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 582 -> 579 bytes .../code_block_parser.cpython-310.pyc | Bin 2355 -> 2352 bytes .../json_object_parser.cpython-310.pyc | Bin 8375 -> 8372 bytes .../__pycache__/parser_base.cpython-310.pyc | Bin 7013 -> 7010 bytes .../tagged_content_parser.cpython-310.pyc | Bin 6813 -> 6810 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 663 -> 660 bytes .../__pycache__/functional.cpython-310.pyc | Bin 5447 -> 5444 bytes .../__pycache__/pipeline.cpython-310.pyc | Bin 9055 -> 9052 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 691 -> 688 bytes .../_prompt_comparer.cpython-310.pyc | Bin 6626 -> 6623 bytes .../_prompt_engine.cpython-310.pyc | Bin 6263 -> 6260 bytes .../_prompt_generator_base.cpython-310.pyc | Bin 8349 -> 8346 bytes .../_prompt_generator_en.cpython-310.pyc | Bin 3811 -> 3808 bytes .../_prompt_generator_zh.cpython-310.pyc | Bin 3882 -> 3879 bytes .../_prompt_optimizer.cpython-310.pyc | Bin 6381 -> 6378 bytes .../__pycache__/_prompt_utils.cpython-310.pyc | Bin 1682 -> 1679 bytes .../rag/__pycache__/__init__.cpython-310.pyc | Bin 442 -> 439 bytes .../rag/__pycache__/knowledge.cpython-310.pyc | Bin 4727 -> 4724 bytes .../knowledge_bank.cpython-310.pyc | Bin 5919 -> 5916 bytes .../llama_index_knowledge.cpython-310.pyc | Bin 17509 -> 17506 bytes .../rpc/__pycache__/__init__.cpython-310.pyc | Bin 803 -> 800 bytes .../rpc_agent_client.cpython-310.pyc | Bin 4976 -> 4973 bytes .../__pycache__/rpc_agent_pb2.cpython-310.pyc | Bin 1005 -> 1002 bytes .../rpc_agent_pb2_grpc.cpython-310.pyc | Bin 2578 -> 2575 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 408 -> 405 bytes .../__pycache__/launcher.cpython-310.pyc | Bin 14659 -> 14656 bytes .../__pycache__/servicer.cpython-310.pyc | Bin 10598 -> 10595 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 2595 -> 2592 bytes .../service_response.cpython-310.pyc | Bin 1285 -> 1282 bytes .../service_status.cpython-310.pyc | Bin 525 -> 522 bytes .../service_toolkit.cpython-310.pyc | Bin 15442 -> 15439 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 193 -> 190 bytes .../__pycache__/exec_python.cpython-310.pyc | Bin 10661 -> 10658 bytes .../__pycache__/exec_shell.cpython-310.pyc | Bin 1786 -> 1783 bytes .../file/__pycache__/__init__.cpython-310.pyc | Bin 185 -> 182 bytes .../file/__pycache__/common.cpython-310.pyc | Bin 6359 -> 6356 bytes .../file/__pycache__/json.cpython-310.pyc | Bin 2319 -> 2316 bytes .../file/__pycache__/text.cpython-310.pyc | Bin 2052 -> 2049 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 195 -> 192 bytes .../dashscope_services.cpython-310.pyc | Bin 6773 -> 6770 bytes .../openai_services.cpython-310.pyc | Bin 16705 -> 16702 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 190 -> 187 bytes .../retrieval_from_list.cpython-310.pyc | Bin 2918 -> 2915 bytes .../__pycache__/similarity.cpython-310.pyc | Bin 1086 -> 1083 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 190 -> 187 bytes .../__pycache__/mongodb.cpython-310.pyc | Bin 2158 -> 2155 bytes .../__pycache__/mysql.cpython-310.pyc | Bin 2550 -> 2547 bytes .../__pycache__/sqlite.cpython-310.pyc | Bin 2020 -> 2017 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 196 -> 193 bytes .../__pycache__/summarization.cpython-310.pyc | Bin 3179 -> 3176 bytes .../web/__pycache__/__init__.cpython-310.pyc | Bin 184 -> 181 bytes .../web/__pycache__/arxiv.cpython-310.pyc | Bin 7321 -> 7318 bytes .../web/__pycache__/dblp.cpython-310.pyc | Bin 10501 -> 10498 bytes .../web/__pycache__/download.cpython-310.pyc | Bin 2044 -> 2041 bytes .../web/__pycache__/search.cpython-310.pyc | Bin 6184 -> 6181 bytes .../__pycache__/web_digest.cpython-310.pyc | Bin 6942 -> 6939 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 295 -> 292 bytes .../studio/__pycache__/_app.cpython-310.pyc | Bin 16931 -> 16928 bytes .../__pycache__/_client.cpython-310.pyc | Bin 5982 -> 5979 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 385 -> 382 bytes .../utils/__pycache__/common.cpython-310.pyc | Bin 5669 -> 5666 bytes .../utils/__pycache__/monitor.cpython-310.pyc | Bin 21234 -> 21231 bytes .../__pycache__/token_utils.cpython-310.pyc | Bin 3416 -> 3413 bytes .../utils/__pycache__/tools.cpython-310.pyc | Bin 12168 -> 12165 bytes .../web/__pycache__/__init__.cpython-310.pyc | Bin 176 -> 173 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 183 -> 180 bytes .../gradio/__pycache__/utils.cpython-310.pyc | Bin 5587 -> 5584 bytes .../backboardManager.cpython-310.pyc | Bin 2868 -> 3122 bytes Html/app.py | 46 +- Html/backboardManager.py | 44 +- Html/db/data/course/CS101.json | 6 +- Html/db/data/course/course_list.json | 4 +- Html/db/data/course/data-structure.json | 6 +- Html/db/data/user/cake.json | 308 ++++- Html/db/user.py | 15 +- Html/static/css/desktop.css | 85 ++ Html/static/image/CS101/CS101.png | Bin 0 -> 19330 bytes .../book_cover-data-structure.png | Bin 0 -> 121813 bytes Html/static/js/chatbox.js | 37 +- Html/templates/desktop.html | 75 +- cake/binary_search/.config | 2 - cake/binary_search/binarySearch.py | 6 - cake/bootstrap.min.css.map/.config | 2 - cake/folder/.config | 4 - cake/folder/1 | 0 cake/folder/123 | 0 cake/folder/infolder/1 | 0 cake/folder/main.py | 1 - cake/twice_split/.config | 2 - wget-log | 6 + 137 files changed, 1906 insertions(+), 885 deletions(-) create mode 100644 AlgoriAgent/projects/algoriAgent/agent/score_agent.py create mode 100644 AlgoriAgent/projects/algoriAgent/agent/total_score_agent.py create mode 100644 AlgoriAgent/projects/algoriAgent/tools/file_tools.py create mode 100644 Html/static/image/CS101/CS101.png create mode 100644 Html/static/image/data-structure/book_cover-data-structure.png delete mode 100644 cake/binary_search/.config delete mode 100644 cake/binary_search/binarySearch.py delete mode 100644 cake/bootstrap.min.css.map/.config delete mode 100644 cake/folder/.config delete mode 100644 cake/folder/1 delete mode 100644 cake/folder/123 delete mode 100644 cake/folder/infolder/1 delete mode 100644 cake/folder/main.py delete mode 100644 cake/twice_split/.config create mode 100644 wget-log diff --git a/AlgoriAgent/__pycache__/__init__.cpython-310.pyc b/AlgoriAgent/__pycache__/__init__.cpython-310.pyc index 6000a78666ceeff868993e1316cdbd2e8fe6b15e..65ba710566944f63c0d6782bd9cbf53ed2cfc7ae 100644 GIT binary patch delta 74 zcmbQsIE#@xpO=@50SML{%%8|@V{EIRk)NBYpPZPPotm7HnwPGhn3JCGn4X$fqMw|f TlB$~sW;y}|i!vd?6KfR!O-UG~ delta 77 zcmbQmIG2$-pO=@50SI*Ghfd_SF>`RUigEW0$tX<#nOo;HrDg^*`A{nm$ diff --git a/AlgoriAgent/projects/algoriAgent/__pycache__/agent_manager.cpython-310.pyc b/AlgoriAgent/projects/algoriAgent/__pycache__/agent_manager.cpython-310.pyc index ac596df60d2e8d907ead920b360ee2322b14c62e..f76d2bd534eaf1efb652f2db06d406334a6afc35 100644 GIT binary patch literal 9038 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 m_NDommBCtsDzr(@I%QGQz$#=zgi6d diff --git a/AlgoriAgent/projects/algoriAgent/agent/__pycache__/__init__.cpython-310.pyc b/AlgoriAgent/projects/algoriAgent/agent/__pycache__/__init__.cpython-310.pyc index 34156525f6063b886099a026dacfea760a25b1df..b7372b7e0c47be98ed244446d2c7267653c9e5e5 100644 GIT binary patch delta 101 zcmdnNxRsGRpO=@50SInf%Ad$>;}@Zyk)NBYpPZPPotm7HnwPGhn3JCGn4X$fqMw|f hlB$~sW;y}|i!vd?1x5K;smUe9V3jaIh_Z<@6actyBisN0 delta 104 zcmdnWxPy^9pO=@50SI*Ghfd_S35<5LigEW0$tX<#nOo(tnQGQlxa!GMaB9b6P*~F;|0Pt8PFaQ7m diff --git a/AlgoriAgent/projects/algoriAgent/agent/__pycache__/algori_agent.cpython-310.pyc b/AlgoriAgent/projects/algoriAgent/agent/__pycache__/algori_agent.cpython-310.pyc index a5e1a54304f7284870c2fdfec2c98819b0bd3e72..145ae3aad5acb62639111bf07a31b49b498e3594 100644 GIT binary patch literal 17094 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 delta 4858 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 PriM4Er3aJgfr0-51X)zC diff --git a/AlgoriAgent/projects/algoriAgent/agent/__pycache__/flex_service_toolkit.cpython-310.pyc b/AlgoriAgent/projects/algoriAgent/agent/__pycache__/flex_service_toolkit.cpython-310.pyc index 01041943483c03459d4795cd96a6e05645212e9e..d9d8f262bdad31176f0384dd8826ee5175769e00 100644 GIT binary patch delta 104 zcmcc3dV`fapO=@50SInf%HPPH&*+z;pOK%Ns-K*gnVp)Pk(!sTpO}-L@0gyNSE8Ss kpOUJZ2xdA01&cBv!UaY7S*gh-#bA{%L5Q-=rx^tp0Y)Sw(EtDd delta 107 zcmcb?dYhFypO=@50SI*Ghi>G~XADetvx;%|49O@>3Q8@=FU~B None: - self.No = No - self.focus = focus - self.chapter = chapter - self.append_tools = append_tools - self.memory = None - def GetChapter(self): - if self.focus == CHAPTER_FINISH: f = "(Finished Chapter)" - elif self.focus == CHAPTER_FOCUS: f = "(Your Now Chapter)" - elif self.focus == CHAPTER_LATTER: f = "(Ignore for Latter Chapter)" - elif self.focus == CHAPTER_FAILED: f = "(Failed Chapter)" - return f"{f} Chapter {self.No}: {self.chapter}" - - def Finished(self, successful: bool = True): - if successful: self.focus = 0 - else: self.focus = 3 - - def Focus(self): - self.focus = 1 - -def record(content: str, name: str): - """Call it to save some important info for other chapters. Like file path, function call example. - - Args: - content (`str`): The content to be recorded. - name (`str`): The name of the agent to record. - Returns: - None - """ - ChapterChainAgent.Instance[name].memory.add(Msg( - "assistant", content, role="assistant" - )) - ChapterChainAgent.Instance[name].chapter_memory.add(Msg( - "assistant", "I recorded globally: "+content, role="assistant" - )) - status = ServiceExecStatus.SUCCESS - return ServiceResponse(status, None) - -def next_chapter(name: str): - """Call it to go to next chapter. - - Args: - name (`str`): The name of the agent to go to next chapter. - - Returns: - None - """ - try: - ChapterChainAgent.Instance[name].next_chapter() - except: - status = ServiceExecStatus.ERROR - return ServiceResponse(status, "Failed to go to next chapter. name '"+name+"' not found in ChapterChainAgent.Instance") - - status = ServiceExecStatus.SUCCESS - return ServiceResponse(status, None) - - - -class ChapterChainAgent(AgentBase): - """An agent class to preform chapter chain algorithm. - Project will be split to some chapters chained. - Each chapter will haave a main objective, having its own tools, and holding its own context. - """ - Instance = {} - def __init__( - self, - name: str, - model_config_name: str, - service_toolkit: FlexServiceToolkit = None, - sys_prompt: str = "You're a helpful assistant.", - max_iters: int = 10, - verbose: bool = True, - chapter_chain: Sequence[Chapter] = None, - stop_when_one_CHAPTER_failed: bool = True, - **kwargs: Any, - ) -> None: - """ - Args: - name (`str`): - The name of the agent. - sys_prompt (`str`): - The system prompt of the agent. - model_config_name (`str`): - The name of the model config, which is used to load model from - configuration. - service_toolkit (`ServiceToolkit`): - A `ServiceToolkit` object that contains the tool functions. - max_iters (`int`, defaults to `10`): - The maximum number of iterations of each chapter. - verbose (`bool`, defaults to `True`): - Whether to print the detailed information during reasoning and - acting steps. If `False`, only the content in speak field will - be print out. - chapter_chain (`Sequence[str]`): - The chapter chain to be performed. If None, the agent will add a - init chapter to construct the chapter chain. - """ - super().__init__( - name=name, - sys_prompt=sys_prompt, - model_config_name=model_config_name, - ) - - # TODO: To compatible with the old version, which will be deprecated - # soon - if "tools" in kwargs: - logger.warning( - "The argument `tools` will be deprecated soon. " - "Please use `service_toolkit` instead. Example refers to " - "https://github.com/modelscope/agentscope/blob/main/" - "examples/conversation_with_react_agent/code/" - "conversation_with_react_agent.py", - ) - - service_funcs = {} - for func, json_schema in kwargs["tools"]: - name = json_schema["function"]["name"] - service_funcs[name] = ServiceFunction( - name=name, - original_func=func, - processed_func=func, - json_schema=json_schema, - ) - - if service_toolkit is None: - service_toolkit = FlexServiceToolkit() - service_toolkit.service_funcs = service_funcs - else: - service_toolkit.service_funcs.update(service_funcs) - - elif service_toolkit is None: - raise ValueError( - "The argument `service_toolkit` is required to initialize " - "the ReActAgent.", - ) - - service_toolkit.add(record,name=name) - service_toolkit.add(next_chapter,name=name) - - self.service_toolkit = service_toolkit - self.service_toolkit.agent = self - self.verbose = verbose - self.max_iters = max_iters - - if not sys_prompt.endswith("\n"): - sys_prompt = sys_prompt + "\n" - - self.sys_prompt = "\n".join( - [ - # The brief intro of the role and target - sys_prompt.format(name=self.name), - # The detailed instruction prompt for the agent - INSTRUCTION_PROMPT, - ], - ) - - - # This memory is used to store all useful memory with the chapter chain switching - #self.memory_on_chain = TemporaryMemory() - self.memory.add(Msg("system", self.sys_prompt, role="system")) - self.chapter_memory = TemporaryMemory() - - # Initialize a parser object to formulate the response from the model - self.parser = MarkdownJsonDictParser( - content_hint={ - "thought": "what you thought", - "speak": "what you speak", - "function": service_toolkit.tools_calling_format, - }, - required_keys=["thought", "speak", "function"], - # Only print the speak field when verbose is False - keys_to_content=True if self.verbose else "speak", - ) - - - self.chapter_chain = chapter_chain - - self.chapter_chain_now = 0 - self.finish_now_chapter = False - - self.stop_when_one_CHAPTER_failed = stop_when_one_CHAPTER_failed - - - ChapterChainAgent.Instance[name] = self - - def chapter_chain_to_memory(self): - mem = "##The Chapter Chain##\n" - for chapter in self.chapter_chain: - mem+=chapter.GetChapter()+"\n" - mem+="\n" - mem+= "Remember your now chapter is "+ self.chapter_chain[self.chapter_chain_now].GetChapter()+"\n" - return Msg("system", mem, role="system") - - def _has_unfinished_chapter(self): - for chapter in self.chapter_chain: - if chapter.focus == CHAPTER_LATTER or chapter.focus == CHAPTER_FOCUS: - return True - return False - def next_chapter(self, successful: bool = True): - if self.chapter_chain[self.chapter_chain_now].append_tools is not None: - for callable_tools in self.chapter_chain[self.chapter_chain_now].append_tools: - self.service_toolkit.Remove(callable_tools) - - self.chapter_chain[self.chapter_chain_now].Finished(successful) - - for i in range(len(self.chapter_chain)): - if self.chapter_chain[i].focus == 2: - self.chapter_chain[i].Focus() - if self.chapter_chain[i].append_tools is not None: - for callable_tools in self.chapter_chain[i].append_tools: - self.service_toolkit.add(callable_tools) - self.chapter_chain_now = i - return - - def add_chapters_after(self, CHAPTER_No, chapters: Sequence[Chapter]): - for i in range(len(self.chapter_chain)): - if self.chapter_chain[i].No == CHAPTER_No: - for j in range(len(chapters)): - CHAPTER_to_insert = Chapter(No = CHAPTER_No + j + 1, chapter = chapters[j], focus = 2, append_tools= - self.chapter_chain[self.chapter_chain_now].append_tools) - self.chapter_chain.insert(i+1+j, CHAPTER_to_insert) - for j in range(i+len(chapters), len(self.chapter_chain)): - self.chapter_chain[j].No += len(chapters) - break - def reply(self, x: Optional[Union[Msg, Sequence[Msg]]] = None, user_backboard:str = "") -> Msg: - if self.chapter_memory.size() == 0: - - self.chapter_chain[self.chapter_chain_now].memory = self.chapter_memory - for msg in self.memory.get_memory(): - self.chapter_memory.add(msg) - self.chapter_memory.add(self.chapter_chain_to_memory()) - - self.chapter_memory.add(x) - - - for _ in range(1): - # Step 1: Thought - if self.verbose: - self.speak(f" ITER {_+1}, STEP 1: REASONING ".center(70, "#")) - - # Prepare hint to remind model what the response format is - # Won't be recorded in memory to save tokens - backboard_hint_msg = Msg( - "system", - user_backboard, - role="system", - echo=self.verbose, - ) - tools_hint_msg = Msg( - "system", - self.service_toolkit.tools_instruction, - role="system", - echo=self.verbose, - ) - hint_msg = Msg( - "system", - self.parser.format_instruction+"\n ####", - role="system", - echo=self.verbose, - ) - - prompt = self.model.format(self.chapter_memory.get_memory(), - backboard_hint_msg, - # The instruction prompt for tools - tools_hint_msg, - hint_msg) - print("*********************************************************************") - print(prompt) - if self.verbose: - self.speak(f"Prompt".center(70, "#")) - self.speak(str(self.chapter_memory.get_memory()[-1].content)) - # print(prompt) - - try: - res = self.model( - prompt, - parse_func=self.parser.parse, - max_retries=1, - ) - - - if self.verbose: - self.speak(f"Result Parsed".center(70, "#")) - self.speak(str(res.parsed)) - print(res.parsed) - - self.chapter_memory.add( - Msg( - self.name, - self.parser.to_memory(res.parsed), - "assistant", - ), - ) - - # Print out the response - msg_returned = Msg( - self.name, - self.parser.to_content(res.parsed), - "assistant", - ) - if self.verbose: - self.speak(f"Speak".center(70, "#")) - print(msg_returned) - self.speak(msg_returned) - return msg_returned - - if self.verbose: - self.speak(f"Function".center(70, "#")) - self.speak(str(res.parsed["function"])) - print(res.parsed["function"]) - - arg_function = res.parsed["function"] - if ( - isinstance(arg_function, str) - and arg_function in ["[]", ""] - or isinstance(arg_function, list) - and len(arg_function) == 0 - ): - # Only the speak field is exposed to users or other agents - continue - - # Only catch the response parsing error and expose runtime - # errors to developers for debugging - except ResponseParsingError as e: - # Print out raw response from models for developers to debug - response_msg = Msg(self.name, e.raw_response, "assistant") - self.speak(response_msg) - - # Re-correct by model itself - error_msg = Msg("system", str(e), "system") - self.speak(error_msg) - - self.chapter_memory.add([response_msg, error_msg]) - - # Skip acting step to re-correct the response - continue - - # 2. Acting - if self.verbose: - self.speak(f" ITER {_+1}, STEP 2: ACTING ".center(70, "#")) - - # Parse, check and execute the tool functions in service toolkit - try: - - - - execute_results = self.service_toolkit.parse_and_call_func( - res.parsed["function"], - ) - # 在这里补充任务结束行动 - if self.finish_now_chapter: - self.finish_now_chapter = False - hint_msg = Msg( - "system", - "You have finished your own chapter." - "Now generate a reply by summarizing the current " - "situation. Remember this summary will be recorded in global memory. Make sure keep important information.", - role="system", - echo=self.verbose, - ) - - # Generate a reply by summarizing the current situation - prompt = self.model.format(self.chapter_memory.get_memory(), hint_msg) - res = self.model(prompt) - res_msg = Msg(self.name, res.text, "assistant") - self.memory.add(res_msg) - self.speak(res_msg) - self.next_chapter(successful=True) - self.success_own_chapter = True - break - - # Note: Observing the execution results and generate response - # are finished in the next reasoning step. We just put the - # execution results into memory, and wait for the next loop - # to generate response. - - # Record execution results into memory as system message - msg_res = Msg("system", execute_results, "system") - self.speak(msg_res) - self.chapter_memory.add(msg_res) - - except FunctionCallError as e: - # Catch the function calling error that can be handled by - # the model - error_msg = Msg("system", str(e), "system") - self.speak(error_msg) - self.chapter_memory.add(error_msg) - continue - - except Exception as e: - # Catch the function calling error that can not be handled - error_msg = Msg("system", str(e), "system") - self.speak(error_msg) - self.chapter_memory.add(error_msg) - continue - - - - - def GetProcess(self): - process = [] - t = {} - t['topic'] = "Global Memory" - mems = [] - for msg in self.memory.get_memory(): - mems.append(msg.serialize()) - - t['memory'] = "$MEMORYMEMORY$".join(mems) - t['finish'] = "True" - ts = f"{t['topic']}$TOPICTOPIC${t['memory']}$TOPICTOPIC${t['finish']}" - process.append(ts) - for chapter in self.chapter_chain: - t = {} - t['topic'] = f'Chapter {chapter.No}' - mems = [] - if chapter.memory is not None: - for msg in self.memory.get_memory(): - mems.append(msg.serialize()) - t['memory'] = "$MEMORYMEMORY$".join(mems) - t['finish'] = "True" if chapter.focus == CHAPTER_FINISH else "False" - ts = f"{t['topic']}$TOPICTOPIC${t['memory']}$TOPICTOPIC${t['finish']}" - process.append(ts) - - returnString = "" - returnString = "$TASKTASK$".join(process) - return returnString +# -*- coding: utf-8 -*- +"""An agent class that implements the ReAct algorithm. The agent will reason +and act iteratively to solve problems. More details can be found in the paper +https://arxiv.org/abs/2210.03629. +""" +from typing import Any, Callable, Optional, Union, Sequence + +from loguru import logger +from agent.flex_service_toolkit import FlexServiceToolkit +from agentscope.exception import ResponseParsingError, FunctionCallError +from agentscope.agents import AgentBase +from agentscope.memory.temporary_memory import TemporaryMemory +from agentscope.message import Msg +from agentscope.parsers import MarkdownJsonDictParser +from agentscope.service.service_toolkit import ServiceFunction +from agentscope.service import ( + ServiceToolkit, + ServiceResponse, + ServiceExecStatus, +) +import json +from AlgoriAgent.projects.algoriAgent.agent.score_agent import ScoreAgent +from AlgoriAgent.projects.algoriAgent.agent.total_score_agent import TotalScoreAgent + +import re + + + + +# 这个INSTRUCTION_PROMPT 交给免费Agent进行使用,不包含评测与得分标准,但是会在没有自己注释的大段代码或复制粘贴代码是,通知学生进入一次理解性测试。 +INSTRUCTION_PROMPT_EN = """## Your Role: +You need to help the student learn algorithms, verify the learning process, ensure that the student understands the current chapter's content, and then guide the student to the next chapter. + +## What You Should Do: +0. You MUST follow the teaching instructions made by human teacher with several chapters, ONLY focus on one chapter at a time. +1. Student may ask you some questions, DONT answer the question directly or completely, instead, based on context (like student's code) to answer only one step forward. +2. Each chapter in teaching instruction will specifically guide what to teach to student, follow the instruction. +3. System will gather student's infomation sometimes, you neet to analyze student's learning statement from student's history codes, call the necessary function we he is stuck. + +## Note: +1. Fully understand the tool functions and their arguments before using them. +2. Make sure the types and values of the arguments you provided to the tool functions are correct. +3. Don't take things for granted. For example, where you are, what's the time now, etc. You can try to use the tool functions to get information. +4. If the function execution fails, you should analyze the error and try to solve it. +5. Remember to decide whether the student's question or idea is regarding about current chapter, if not, you should not awnser and ask the student to focus on the chapter. + +## Resources: +1. The tool functions you can use. +2. The context, including the student's code, and teaching instructions. +""" # noqa +INSTRUCTION_PROMPT_CN = """## 你的角色: +你需要帮助学生学习算法,检验学习过程,确保学生理解当前章节的内容后,带领学生进入下一章 + +## 你需要做的: +0. 你必须根据老师提供的教学大纲,按照章节顺序,依次学习。 +1. 学生可能会提出一些问题,你无需回答问题,而是根据上下文(比如学生自己的代码)来分析,并给出一步的解决方案。 +2. 教学大纲中会指明每个章节的学习目标,你按照目标学习。 +3. 系统会occasionally gather学生信息,你需要分析学生学习记录,调用必要的函数。 + +## 注意事项: +1. 确保使用工具函数时,提供的参数类型和值是正确的。 +2. 不要太相信自己,例如,当前位置,当前时间等,你可以尝试使用工具函数获取信息。 +3. 如果函数执行失败,你需要分析错误并尝试解决。 +4. 确保学生提出的问题或想法是否与当前章节相关,如果不相关,你应答并提醒学生关注当前章节。 + +## 资源: +1. 你可以使用的工具函数。 +2. 上下文,包括学生的代码,和教学大纲。 +""" + + +LANGUAGE_HINT_EN = "Use English to reply" +LANGUAGE_HINT_CN = "使用中文回复" + + + +CHAPTER_FINISH = 0 +CHAPTER_FOCUS = 1 +CHAPTER_LATTER = 2 +CHAPTER_FAILED = 3 + +class Chapter(): + + def __init__(self, course_id, lesson_id, No = 1, focus = 2,title="", chapter = "", chapter_prompt = "", + score_prompt = "", append_tools : list[Callable[..., Any], dict] = None) -> None: + ''' + No : 序号 + focus : 0: Finished, 1: Focus, 2: Latter, 3: Failed + title : 子章节标题 + chapter : 教案子章节内容 + chapter_prompt : 教案的提示 + score_prompt : 评测标准 + append_tools : 追加工具函数 + ''' + self.No = No + self.focus = focus + self.chapter = chapter + self.chapter_prompt = chapter_prompt + self.score_prompt = score_prompt + self.append_tools = append_tools + self.memory = None + self.title =title + self.course_id = course_id + self.lesson_id = lesson_id + + + def GetChapter(self): + if self.focus == CHAPTER_FINISH: f = "(Finished Chapter)" + elif self.focus == CHAPTER_FOCUS: f = "(Your Now Chapter)" + elif self.focus == CHAPTER_LATTER: f = "(Ignore for Latter Chapter)" + elif self.focus == CHAPTER_FAILED: f = "(Failed Chapter)" + # des = f"{f} Chapter {self.No}: {self.chapter if self.focus else 'Hidden for further study.'}" + des = f"{f} Chapter {self.No}: " + if self.focus == CHAPTER_FINISH or self.focus == CHAPTER_FAILED: des += 'Hidden due to finished.' + if self.focus == CHAPTER_LATTER: des += 'Hidden for further study.' + if self.focus == CHAPTER_FOCUS: + des+=self.chapter + des+='\n' + des+='Here are some concrete instructions:\n' + des+=self.chapter_prompt+'\n' + + return des + + def Finished(self, successful: bool = True): + if successful: self.focus = 0 + else: self.focus = 3 + + def Focus(self): + self.focus = 1 + +def record(content: str, name: str): + """Call it to save some important info for other chapters. Like file path, function call example. + + Args: + content (`str`): The content to be recorded. + name (`str`): The name of the agent to record. + Returns: + None + """ + ChapterChainAgent.Instance[name].memory.add(Msg( + "assistant", content, role="assistant" + )) + ChapterChainAgent.Instance[name].chapter_memory.add(Msg( + "assistant", "I recorded globally: "+content, role="assistant" + )) + status = ServiceExecStatus.SUCCESS + return ServiceResponse(status, None) + +def next_chapter(name: str): + """Call it to go to next chapter. + + Args: + name (`str`): The name of the agent to go to next chapter. + + Returns: + message (`str`): The result of the operation. + """ + res="" + try: + print(ChapterChainAgent.Instance) + print(name in ChapterChainAgent.Instance) + res = ChapterChainAgent.Instance[name].next_chapter() + except Exception as e: + status = ServiceExecStatus.ERROR + return ServiceResponse(status, str(e)) + + status = ServiceExecStatus.SUCCESS + return ServiceResponse(status, res) + +from AlgoriAgent.projects.algoriAgent.tools.file_tools import file_tools + +class ChapterChainAgent(AgentBase): + """An agent class to preform chapter chain algorithm. + Project will be split to some chapters chained. + Each chapter will haave a main objective, having its own tools, and holding its own context. + """ + Instance = {} + def __init__( + self, + name: str, + model_config_name: str, + service_toolkit: FlexServiceToolkit = None, + sys_prompt: str = "You're a helpful assistant.", + max_iters: int = 10, + verbose: bool = True, + chapter_chain: Sequence[Chapter] = None, + stop_when_one_CHAPTER_failed: bool = True, + root_path: str = ".", + **kwargs: Any, + ) -> None: + """ + Args: + name (`str`): + The name of the agent. + sys_prompt (`str`): + The system prompt of the agent. + model_config_name (`str`): + The name of the model config, which is used to load model from + configuration. + service_toolkit (`ServiceToolkit`): + A `ServiceToolkit` object that contains the tool functions. + max_iters (`int`, defaults to `10`): + The maximum number of iterations of each chapter. + verbose (`bool`, defaults to `True`): + Whether to print the detailed information during reasoning and + acting steps. If `False`, only the content in speak field will + be print out. + chapter_chain (`Sequence[str]`): + The chapter chain to be performed. If None, the agent will add a + init chapter to construct the chapter chain. + """ + super().__init__( + name=name, + sys_prompt=sys_prompt, + model_config_name=model_config_name, + ) + self.model_config_name = model_config_name + # TODO: To compatible with the old version, which will be deprecated + # soon + self.name=name + if "tools" in kwargs: + logger.warning( + "The argument `tools` will be deprecated soon. " + "Please use `service_toolkit` instead. Example refers to " + "https://github.com/modelscope/agentscope/blob/main/" + "examples/conversation_with_react_agent/code/" + "conversation_with_react_agent.py", + ) + + service_funcs = {} + for func, json_schema in kwargs["tools"]: + name = json_schema["function"]["name"] + service_funcs[name] = ServiceFunction( + name=name, + original_func=func, + processed_func=func, + json_schema=json_schema, + ) + + if service_toolkit is None: + service_toolkit = FlexServiceToolkit() + service_toolkit.service_funcs = service_funcs + else: + service_toolkit.service_funcs.update(service_funcs) + + elif service_toolkit is None: + raise ValueError( + "The argument `service_toolkit` is required to initialize " + "the ReActAgent.", + ) + + service_toolkit.add(record,name=name) + service_toolkit.add(next_chapter,name=name) + for tool in file_tools: + service_toolkit.add(tool, root_path=root_path) + + self.service_toolkit = service_toolkit + self.service_toolkit.agent = self + self.verbose = verbose + self.max_iters = max_iters + + if not sys_prompt.endswith("\n"): + sys_prompt = sys_prompt + "\n" + + self.sys_prompt = "\n".join( + [ + # The brief intro of the role and target + sys_prompt.format(name=self.name), + # The detailed instruction prompt for the agent + INSTRUCTION_PROMPT_CN, + ], + ) + + + # This memory is used to store all useful memory with the chapter chain switching + #self.memory_on_chain = TemporaryMemory() + self.memory.add(Msg("system", self.sys_prompt, role="system")) + self.chapter_memory = TemporaryMemory() + + # Initialize a parser object to formulate the response from the model + self.parser = MarkdownJsonDictParser( + content_hint={ + "thought": "what you thought", + "speak": "what you speak", + "function": service_toolkit.tools_calling_format, + }, + required_keys=["thought", "speak", "function"], + # Only print the speak field when verbose is False + keys_to_content=True if self.verbose else "speak", + ) + self.language_hint = LANGUAGE_HINT_CN + + self.chapter_chain = chapter_chain + + self.chapter_chain_now = 0 + self.finish_now_chapter = False + + self.stop_when_one_CHAPTER_failed = stop_when_one_CHAPTER_failed + + + ChapterChainAgent.Instance[name] = self + self.agent_manager = None + self.root_path = root_path + + def chapter_chain_to_memory(self): + mem = "##The Chapter Chain##\n" + for chapter in self.chapter_chain: + if (chapter.focus == CHAPTER_FOCUS or chapter.focus == CHAPTER_FINISH): + mem+=chapter.GetChapter()+"\n" + mem+="\n" + # mem+= "Remember your now chapter is "+ self.chapter_chain[self.chapter_chain_now].GetChapter()+"\n" + return Msg("system", mem, role="system") + + def _has_unfinished_chapter(self): + for chapter in self.chapter_chain: + if chapter.focus == CHAPTER_LATTER or chapter.focus == CHAPTER_FOCUS: + return True + return False + def next_chapter(self, successful: bool = True): + if self.chapter_chain[self.chapter_chain_now].append_tools is not None or len(self.chapter_chain[self.chapter_chain_now].append_tools)==0: + for callable_tools, args in self.chapter_chain[self.chapter_chain_now].append_tools: + self.service_toolkit.Remove(callable_tools) + + self.chapter_chain[self.chapter_chain_now].Finished(successful) + try: + score_agent = ScoreAgent(name=self.name, model_config_name=self.model_config_name, memory=self.chapter_memory, + chapter_score_prompt=self.chapter_chain[self.chapter_chain_now].score_prompt, + service_toolkit=self.service_toolkit, sys_prompt="", max_iters=self.max_iters, verbose=self.verbose) + res = score_agent.reply() + + total_score_agent = TotalScoreAgent(name=self.name, model_config_name=self.model_config_name, input=res['content']['speak'], + service_toolkit=self.service_toolkit, sys_prompt="", max_iters=self.max_iters, verbose=self.verbose) + score = total_score_agent.reply() + + except Exception as e: + print("=*="*50) + print(e) + self.agent_manager.message_pass(self, "chapter_score", json.dumps({'chapter_id':self.chapter_chain_now+1, 'data':res})) + self.agent_manager.save_chapter_memory(self,self.chapter_chain[self.chapter_chain_now].course_id, self.chapter_chain[self.chapter_chain_now].lesson_id, + self.chapter_chain[self.chapter_chain_now].title, self.chapter_memory.export(to_mem = True), + score, is_rebuttal=False) + self.chapter_memory = TemporaryMemory() + self.agent_manager.message_pass(self, "next_chapter","") + self.agent_manager.system_message("进入下一节") + + for i in range(len(self.chapter_chain)): + if self.chapter_chain[i].focus == CHAPTER_LATTER: + self.chapter_chain[i].Focus() + if self.chapter_chain[i].append_tools is not None and len(self.chapter_chain[i].append_tools) > 0: + for callable_tools, args in self.chapter_chain[i].append_tools: + print("add tools:", callable_tools) + print("args:", args) + args['root_path'] = self.root_path + self.service_toolkit.add(callable_tools, **args) + self.chapter_chain_now = i + return "成功进入下一章" + # 找不到章节 + return "学生完成了本课所有章节,已经没有下一章了!" + + def add_chapters_after(self, CHAPTER_No, chapters: Sequence[Chapter]): + for i in range(len(self.chapter_chain)): + if self.chapter_chain[i].No == CHAPTER_No: + for j in range(len(chapters)): + CHAPTER_to_insert = Chapter(No = CHAPTER_No + j + 1, chapter = chapters[j], focus = 2, append_tools= + self.chapter_chain[self.chapter_chain_now].append_tools) + self.chapter_chain.insert(i+1+j, CHAPTER_to_insert) + for j in range(i+len(chapters), len(self.chapter_chain)): + self.chapter_chain[j].No += len(chapters) + break + def reply(self, x: Optional[Union[Msg, Sequence[Msg]]] = None, user_backboard:str = "") -> Msg: + if self.chapter_memory.size() <= 1: + self.chapter_chain[self.chapter_chain_now].memory = self.chapter_memory + for msg in self.memory.get_memory(): + self.chapter_memory.add(msg) + self.chapter_memory.add(self.chapter_chain_to_memory()) + + self.chapter_memory.add(x) + + + for _ in range(self.max_iters): + # Step 1: Thought + if self.verbose: + self.speak(f" ITER {_+1}, STEP 1: REASONING ".center(70, "#")) + + # Prepare hint to remind model what the response format is + # Won't be recorded in memory to save tokens + backboard_hint_msg = Msg( + "system", + user_backboard, + role="system", + echo=self.verbose, + ) + tools_hint_msg = Msg( + "system", + self.service_toolkit.tools_instruction, + role="system", + echo=self.verbose, + ) + hint_msg = Msg( + "system", + self.parser.format_instruction+"\n ####" + "!!"+ self.language_hint +"!!", + role="system", + echo=self.verbose, + ) + prompt = self.model.format(self.chapter_memory.get_memory(), + backboard_hint_msg, + # The instruction prompt for tools + tools_hint_msg, + hint_msg) + if self.verbose: + self.speak(f"Prompt".center(70, "#")) + self.speak(str(prompt)) + + try: + if self.verbose: + self.speak(f"API Trigger".center(70, "#")) + res = self.model( + prompt, + parse_func=self.parser.parse, + max_retries=2, + ###################### + ) + + if self.verbose: + self.speak(f"Result Parsed".center(70, "#")) + self.speak(str(res.parsed)) + print(res.parsed) + + self.chapter_memory.add( + Msg( + self.name, + self.parser.to_memory(res.parsed), + "assistant", + ), + ) + + # Print out the response + msg_returned = Msg( + self.name, + self.parser.to_content(res.parsed), + "assistant", + ) + if self.verbose: + self.speak(f"Speak".center(70, "#")) + print(msg_returned) + self.speak(msg_returned) + return msg_returned + + + if self.verbose: + self.speak(f"Function".center(70, "#")) + self.speak(str(res.parsed["function"])) + print(res.parsed["function"]) + + arg_function = res.parsed["function"] + if ( + isinstance(arg_function, str) + and arg_function in ["[]", ""] + or isinstance(arg_function, list) + and len(arg_function) == 0 + ): + # Only the speak field is exposed to users or other agents + continue + + # Only catch the response parsing error and expose runtime + # errors to developers for debugging + except ResponseParsingError as e: + # Print out raw response from models for developers to debug + response_msg = Msg(self.name, e.raw_response, "assistant") + self.speak(response_msg) + + # Re-correct by model itself + error_msg = Msg("system", str(e), "system") + self.speak(error_msg) + + self.chapter_memory.add([response_msg, error_msg]) + + + + def function_call(self, parsed_function) -> Msg: + if self.verbose: + self.speak(f"ACTING ".center(70, "#")) + print(str(parsed_function)) + + # Parse, check and execute the tool functions in service toolkit + try: + execute_results = self.service_toolkit.parse_and_call_func( + parsed_function# res.parsed["function"], + ) + # 在这里补充任务结束行动 + if self.finish_now_chapter: self.finish() + + + # Note: Observing the execution results and generate response + # are finished in the next reasoning step. We just put the + # execution results into memory, and wait for the next loop + # to generate response. + + # Record execution results into memory as system message + msg_res = Msg("system", execute_results, "system") + self.speak(msg_res) + self.chapter_memory.add(msg_res) + pattern = r"\[RESULT\]: (.*)" + match = re.search(pattern, msg_res['content']) + result_content='正则匹配失败' + if match: + result_content = match.group(1) + res = self.reply(Msg(name='system', content="命令执行结果如上,请总结并引导学生进行下一步操作", role="system")) + + self.agent_manager.system_message(parsed_function['name'] + "执行" + ("成功" if "[STATUS]: SUCCESS" in str(msg_res['content']) else "失败") + ",结果为:" + result_content) + self.agent_manager.message_pass(self, "message", res.content['speak']) + + except FunctionCallError as e: + # Catch the function calling error that can be handled by + # the model + error_msg = Msg("system", str(e), "system") + self.speak(error_msg) + self.chapter_memory.add(error_msg) + + except Exception as e: + # Catch the function calling error that can not be handled + error_msg = Msg("system", str(e), "system") + self.speak(error_msg) + self.chapter_memory.add(error_msg) + + def finish(self): + self.finish_now_chapter = False + hint_msg = Msg( + "system", + "You have finished your now chapter." + "Now generate a reply by summarizing the current " + "situation. Remember this summary will be recorded in global memory. Make sure keep important information.", + role="system", + echo=self.verbose, + ) + + # Generate a reply by summarizing the current situation + prompt = self.model.format(self.chapter_memory.get_memory(), hint_msg) + res = self.model(prompt) + res_msg = Msg(self.name, res.text, "assistant") + self.memory.add(res_msg) + self.speak(res_msg) + self.next_chapter(successful=True) + self.success_own_chapter = True + + def change_language(self, language): + if(language == "zh"):self.language_hint = LANGUAGE_HINT_CN + if(language == "en"):self.language_hint = LANGUAGE_HINT_EN + + def GetProcess(self): + process = [] + t = {} + t['topic'] = "Global Memory" + mems = [] + for msg in self.memory.get_memory(): + mems.append(msg.serialize()) + + t['memory'] = "$MEMORYMEMORY$".join(mems) + t['finish'] = "True" + ts = f"{t['topic']}$TOPICTOPIC${t['memory']}$TOPICTOPIC${t['finish']}" + process.append(ts) + for chapter in self.chapter_chain: + t = {} + t['topic'] = f'Chapter {chapter.No}' + mems = [] + if chapter.memory is not None: + for msg in self.memory.get_memory(): + mems.append(msg.serialize()) + t['memory'] = "$MEMORYMEMORY$".join(mems) + t['finish'] = "True" if chapter.focus == CHAPTER_FINISH else "False" + ts = f"{t['topic']}$TOPICTOPIC${t['memory']}$TOPICTOPIC${t['finish']}" + process.append(ts) + + returnString = "" + returnString = "$TASKTASK$".join(process) + return returnString diff --git a/AlgoriAgent/projects/algoriAgent/agent/score_agent.py b/AlgoriAgent/projects/algoriAgent/agent/score_agent.py new file mode 100644 index 0000000..67997bb --- /dev/null +++ b/AlgoriAgent/projects/algoriAgent/agent/score_agent.py @@ -0,0 +1,180 @@ + +from typing import Any, Callable, Optional, Union, Sequence + +from loguru import logger +from agent.flex_service_toolkit import FlexServiceToolkit +from agentscope.exception import ResponseParsingError, FunctionCallError +from agentscope.agents import AgentBase +from agentscope.memory.temporary_memory import TemporaryMemory +from agentscope.message import Msg +from agentscope.parsers import MarkdownJsonDictParser +from agentscope.service.service_toolkit import ServiceFunction +from agentscope.service import ( + ServiceToolkit, + ServiceResponse, + ServiceExecStatus, +) +import json + + +INSTRUCTION_SCORE_PROMPT_CN = """ +你是一名经验丰富的算法课程评分专家,你的任务是:基于学生对一个章节的学习日志、对话流,按照指定的评分标准进行评分。 +但是不同于普通老师,为了提高得分的区分度,你需要作为一名非常挑剔的专家,根据评分标准仔细挑剔学生的学习日志,并给出评分报告。 + +重要的挑剔点: +1. 存在错误的概念理解 +2. 存在矛盾的概念理解 +3. 存在不清晰、不连贯的概念表达 +4. 其他你认为可以挑剔的地方 + +下面是学生的整个学习日志和对话流: +""" + +CHAPTER_HINT_CN =""" +上面就是学生的整个学习日志和对话流,请进行下面的各条章节评分标准进行挑剔与评分。 +""" + +RESPONSE_HINT_CN = """ +你的返回必须包含: +对于每条章节评分标准,报告学生的得分以及挑剔的结果。 +例如: +``` +{'评分标准1': {'得分': 8, '挑剔报告': '答案正确,但对于xxx概念表述有误'} +} +``` +""" + +INSTRUCTION_SCORE_PROMPT_EN = """ +You are a experienced algorithm course scoring expert, your task is to: Based on the students' learning logs and dialogues, score them according to the specified scoring standard. +But unlike a normal teacher, to improve the distinction of the score, you need to be a very critical expert, carefully pick out the students' learning logs according to the scoring standard and give a score report. + +The important points to pick out: +1. There are errors in the concept understanding +2. There are contradictions in the concept understanding +3. There are unclear, incoherent concept expressions +4. Other places you think can be picked out +Below is the students' entire learning log and dialogue: +""" + +CHAPTER_HINT_EN = """ +Above is the students' entire learning log and dialogue, please pick out according to the following chapter scoring standard and score them. +""" + +RESPONSE_HINT_EN=""" +Your response must contain: +For each chapter scoring standard, report the students' score and pick out the results. +For example: +``` +{'Score standard 1': {'Score': 8, 'Pick out report': 'The answer is correct, but for the xxx concept expression is wrong'} +} +``` +""" + + +class ScoreAgent(AgentBase): + """ + ScoreAgent is a agent that can score students' learning logs. + """ + def __init__(self, name: str, model_config_name: str, memory: TemporaryMemory, + chapter_score_prompt: str, + service_toolkit: ServiceToolkit, + sys_prompt: str = "You're a helpful assistant.", + max_iters: int = 5, + verbose: bool = True, + **kwargs): + self.service_toolkit = service_toolkit + super().__init__( + name=name, + sys_prompt=sys_prompt, + model_config_name=model_config_name, + ) + self.max_iters = max_iters + self.verbose = verbose + if not sys_prompt.endswith("\n"): + sys_prompt = sys_prompt + "\n" + + self.sys_prompt = "\n".join( + [ + # The brief intro of the role and target + sys_prompt.format(name=self.name), + # The detailed instruction prompt for the agent + INSTRUCTION_SCORE_PROMPT_CN, + ], + ) + self.memory = TemporaryMemory() + self.memory.add(Msg("system", self.sys_prompt, role="system")) + + self.memory.add(memory.get_memory()) + + self.memory.add(Msg("system", CHAPTER_HINT_CN, role="system")) + + self.memory.add(Msg("system", chapter_score_prompt, role="system")) + + self.memory.add(Msg("system", RESPONSE_HINT_CN, role="system")) + + self.parser = MarkdownJsonDictParser( + content_hint={ + "thought": "what you thought", + "speak": "actual response in correct format mentioned above", + }, + required_keys=["thought", "speak"], + # Only print the speak field when verbose is False + keys_to_content=True if self.verbose else "speak", + ) + + def reply(self, x = None, user_backboard = ""): + for _ in range(self.max_iters): + if self.verbose: + self.speak(f" ITER {_+1} ".center(70, "#")) + try: + + hint_msg = Msg( + "system", + self.parser.format_instruction+"\n", + role="system", + echo=self.verbose, + ) + prompt = self.model.format(self.memory.get_memory(),hint_msg + ) + if self.verbose: + self.speak(f"API Trigger".center(70, "#")) + self.speak(str(prompt)) + res = self.model( + prompt, + parse_func=self.parser.parse, + max_retries=2, + ###################### + ) + + if self.verbose: + self.speak(f"Result Parsed".center(70, "#")) + self.speak(str(res.parsed)) + print(res.parsed) + self.memory.add( + Msg( + self.name, + self.parser.to_memory(res.parsed), + "assistant", + ), + ) + msg_returned = Msg( + self.name, + self.parser.to_content(res.parsed), + "assistant", + ) + return msg_returned + except ResponseParsingError as e: + # Print out raw response from models for developers to debug + response_msg = Msg(self.name, e.raw_response, "assistant") + self.speak(response_msg) + # Re-correct by model itself + error_msg = Msg("system", str(e), "system") + self.speak(error_msg) + self.memory.add([response_msg, error_msg]) + except Exception as e: + self.speak(f"Error: {e}".center(70, "#")) + self.speak(f"Retrying".center(70, "#")) + continue + + return Msg(self.name, "Error: Max iterations reached", "assistant") + diff --git a/AlgoriAgent/projects/algoriAgent/agent/total_score_agent.py b/AlgoriAgent/projects/algoriAgent/agent/total_score_agent.py new file mode 100644 index 0000000..26ce77c --- /dev/null +++ b/AlgoriAgent/projects/algoriAgent/agent/total_score_agent.py @@ -0,0 +1,152 @@ + +from typing import Any, Callable, Optional, Union, Sequence + +from loguru import logger +from agent.flex_service_toolkit import FlexServiceToolkit +from agentscope.exception import ResponseParsingError, FunctionCallError +from agentscope.agents import AgentBase +from agentscope.memory.temporary_memory import TemporaryMemory +from agentscope.message import Msg +from agentscope.parsers import MarkdownJsonDictParser +from agentscope.service.service_toolkit import ServiceFunction +from agentscope.service import ( + ServiceToolkit, + ServiceResponse, + ServiceExecStatus, +) +import json + + +INSTRUCTION_TOTAL_SCORE_PROMPT_CN = """ +你是一名精通文件处理的专家,你的本次任务非常简单,给你一段由其他老师给出的评分评价,你需要从中提取每一条标准下的得分,并计算总分,返回总分即可。 +""" + + +RESPONSE_TOTAL_SCORE_HINT_CN = """ +你的返回必须包含且仅包含一个整数,表示得分。 +例如: +输入: +``` +{'评分标准1': {'得分': 8, '挑剔报告': '答案正确,但对于xxx概念表述有误'}, + '评分标准2': {'得分': 3, '挑剔报告': '答案错误,对于xxx概念理解完全错误,导致回答有误'} +} +``` +输出: +11 +下面是真正的输入: +""" + +INSTRUCTION_TOTAL_SCORE_PROMPT_EN = """ +You are an expert in file processing. Your task is very simple. You will be given a segment of evaluation comments provided by another teacher. You need to extract the scores for each criterion and calculate the total score, returning only the total score. +""" + + +RESPONSE_TOTAL_SCORE_HINT_EN=""" +Your return must contain and only contain an integer representing the score. For example: +Input: +``` +{'Criterion 1': {'Score': 8, 'Critical Report': 'The answer is correct, but there is a mistake in the explanation of the xxx concept'}, + 'Criterion 2': {'Score': 3, 'Critical Report': 'The answer is incorrect, with a complete misunderstanding of the xxx concept, leading to an incorrect response'} +} +``` +Output: +``` +{'output': 11} +``` +Below is the actual input: +""" + + +class TotalScoreAgent(AgentBase): + """ + TotalScoreAgent is a agent that can gather students' all score. + """ + def __init__(self, name: str, model_config_name: str, input: str, + service_toolkit: ServiceToolkit, + sys_prompt: str = "You're a helpful assistant.", + max_iters: int = 5, + verbose: bool = True, + **kwargs): + self.service_toolkit = service_toolkit + super().__init__( + name=name, + sys_prompt=sys_prompt, + model_config_name=model_config_name, + ) + self.max_iters = max_iters + self.verbose = verbose + if not sys_prompt.endswith("\n"): + sys_prompt = sys_prompt + "\n" + + self.sys_prompt = "\n".join( + [ + # The brief intro of the role and target + sys_prompt.format(name=self.name), + # The detailed instruction prompt for the agent + INSTRUCTION_TOTAL_SCORE_PROMPT_CN, + RESPONSE_TOTAL_SCORE_HINT_CN + ], + ) + self.memory = TemporaryMemory() + self.memory.add(Msg("system", self.sys_prompt, role="system")) + + self.memory.add(Msg("User", input, role="system")) + self.parser = MarkdownJsonDictParser( + content_hint={ + "output": "total score", + }, + required_keys=["output"], + # Only print the speak field when verbose is False + keys_to_content=True if self.verbose else "speak", + ) + + def reply(self, x = None, user_backboard = ""): + for _ in range(self.max_iters): + if self.verbose: + self.speak(f" ITER {_+1} ".center(70, "#")) + try: + + hint_msg = Msg( + "system", + self.parser.format_instruction+"\n", + role="system", + echo=self.verbose, + ) + prompt = self.model.format(self.memory.get_memory(),hint_msg + ) + if self.verbose: + self.speak(f"API Trigger".center(70, "#")) + self.speak(str(prompt)) + res = self.model( + prompt, + parse_func=self.parser.parse, + max_retries=2, + ###################### + ) + + print('====-======-=====') + + return res.parsed['output'] + + + if self.verbose: + self.speak(f"Result Parsed".center(70, "#")) + self.speak(str(res)) + print(res) + + return res + except ResponseParsingError as e: + # Print out raw response from models for developers to debug + response_msg = Msg(self.name, e.raw_response, "assistant") + self.speak(response_msg) + # Re-correct by model itself + error_msg = Msg("system", str(e), "system") + self.speak(error_msg) + self.memory.add([response_msg, error_msg]) + except Exception as e: + self.speak(f"Error: {e}".center(70, "#")) + self.speak(f"Retrying".center(70, "#")) + continue + + return Msg(self.name, "Error: Max iterations reached", "assistant") + diff --git a/AlgoriAgent/projects/algoriAgent/agent_manager.py b/AlgoriAgent/projects/algoriAgent/agent_manager.py index 128e80b..a2f35bd 100644 --- a/AlgoriAgent/projects/algoriAgent/agent_manager.py +++ b/AlgoriAgent/projects/algoriAgent/agent_manager.py @@ -1,235 +1,329 @@ -import sys -import os -current_directory = os.path.dirname(os.path.abspath(__file__)) -sys.path.append(current_directory) - -import agentscope -from agentscope.message import Msg -import os -import asyncio -import threading -import json - -from agent.flex_service_toolkit import * -from AlgoriAgent.projects.algoriAgent.agent.algori_agent import * - -from agentscope.service import ( - ServiceToolkit, - ServiceResponse, - ServiceExecStatus, -) -import configparser - -config = configparser.ConfigParser() -config.read('config.ini') -openai_api_key = config['Global']['api_key'] - - - -OPENAI_CFG_DICT = { - "config_name": "openai_cfg", # 此配置的名称,必须保证唯一 - "model_type": "openai_chat", # 模型类型 - "model_name": "gpt-4o-mini", # 模型名称 - #"model_name": "gpt-4", # 模型名称 - #"model_name": "llama3", - - "api_key": openai_api_key, # OpenAI API key. 如果没有设置,将使用环境变量中的 OPENAI_API_KEY - - "client_args": { - "base_url": config['Global']['base_chat_url'] - }, - -} - -import uuid -from AlgoriAgent.projects.algoriAgent.tools.judge_tools import judge -EMPTY_CHAPTER_CHAIN = [ Chapter(1, CHAPTER_FOCUS, "本章是未打开某个具体章节时的默认章节。", "处于本章节时不会有任何章节跳转。请作为一名经验丰富的算法教师,回答用户的问题。") ] - -def tool_name_to_tool(tool_name_list): - tools = [] - for tool_name in tool_name_list: - if tool_name == "": - continue - if tool_name == "judge": - tools.append(judge) - - return tools - -class AgentManager: - def __init__(self): - - agentscope.init(model_configs=[OPENAI_CFG_DICT])#, studio_url="http://0.0.0.0:5000") - self.agents = {} - - def new_agent(self, markdown:str, markdown_prompt:str, score_prompt:str, id = None): - ''' - markdown: 教案的markdown文件内容 - markdown_prompt: 教案的prompt的markdown文件内容 - score_prompt: 评分的prompt的markdown文件内容 - 根据3个教案的prompt,生成一个agent,返回agent的id与agent - ''' - markdown_list = markdown.split("\n") - markdown_prompt_list = markdown_prompt.split("\n") - score_prompt_list = score_prompt.split("\n") - # 获取 H1 标题 - title = "" - for line in markdown_list: - if line.startswith("# "): - title = line[2:] - break - - # 对于 H3 标题 构造每一个 Chapter - # 首先找到所有的 H3 标题 - chapter_dict = {} - chapter_sequence = [] - for line in markdown_list: - if line.startswith("### "): - chapter_name = line[4:] - chapter_dict[chapter_name] = {} - chapter_sequence.append(chapter_name) - # 将 H3 标题 和 其对应的内容 构造成一个 Chapter - - h3_name = "" - content = "" - for i in range(len(markdown_list)): - if markdown_list[i].startswith("### "): - if(h3_name != ""): - chapter_dict[h3_name]["markdown"] = content - h3_name = markdown_list[i][4:] - content = "" - continue - if h3_name != "": - content += markdown_list[i]+"\n" - if(h3_name != ""): - chapter_dict[h3_name]["markdown"] = content - - - h3_name = "" - content = "" - require_tools = [] - for i in range(len(markdown_prompt_list)): - if markdown_prompt_list[i].startswith("### "): - if(h3_name != ""): - chapter_dict[h3_name]["markdown_prompt"] = content - chapter_dict[h3_name]["require_tools"] = tool_name_to_tool(require_tools) - h3_name = markdown_prompt_list[i][4:] - content = "" - continue - - if h3_name != "": - if markdown_prompt_list[i].startswith("_require_tools"): - require_tools.append(markdown_prompt_list[i].split("=")[1].strip()) - continue - content += markdown_prompt_list[i]+"\n" - if(h3_name != ""): - chapter_dict[h3_name]["markdown_prompt"] = content - chapter_dict[h3_name]["require_tools"] = tool_name_to_tool(require_tools) - - - h3_name = "" - content = "" - for i in range(len(score_prompt_list)): - if score_prompt_list[i].startswith("### "): - if(h3_name != ""): - chapter_dict[h3_name]["score_prompt"] = content - h3_name = score_prompt_list[i][4:] - content = "" - continue - - if h3_name != "": - content += score_prompt_list[i]+"\n" - if(h3_name != ""): - chapter_dict[h3_name]["score_prompt"] = content - - - chapter_chain = [] - No = 1 - print (chapter_dict) - for chapter_name in chapter_sequence: - chapter_chain.append(Chapter(No, CHAPTER_LATTER, title, chapter_dict[chapter_name]["markdown"], chapter_dict[chapter_name]["markdown_prompt"], chapter_dict[chapter_name]["score_prompt"],chapter_dict[chapter_name]["require_tools"])) - No+=1 - chapter_chain[0].Focus() - - - # Prepare the tools for the agent - service_toolkit = FlexServiceToolkit() - # for tool_function in unity_function_list: - # service_toolkit.add(tool_function) - agent = ChapterChainAgent( - name="assistant", - model_config_name="openai_cfg", - verbose=True, - service_toolkit=service_toolkit, - max_iters=5, - chapter_chain=chapter_chain - ) - self.agents[id] = agent - return id, agent - - - - def new_agent_with_chain(self, chapter_chain = None, id = None): - ''' - - ''' - if chapter_chain is None: - chapter_chain = EMPTY_CHAPTER_CHAIN - - # Prepare the tools for the agent - service_toolkit = FlexServiceToolkit() - # for tool_function in unity_function_list: - # service_toolkit.add(tool_function) - agent = ChapterChainAgent( - name="assistant", - model_config_name="openai_cfg", - verbose=True, - service_toolkit=service_toolkit, - max_iters=5, - chapter_chain=EMPTY_CHAPTER_CHAIN - ) - if id is None: id = uuid.uuid4() - self.agents[id] = agent - return id, agent - - - def get_agent(self, id=None): - ''' - 如果在get agent之前没有new agent,并用id进行访问,就返回一个章节链为空的agent - ''' - if id: - if id in self.agents: - return self.agents[id] - self.agents[id] = self.new_agent(id)[1] - else: - id = str(uuid.uuid4()) - self.agents[id] = self.new_agent()[1] - return id, self.agents[id] - - - def invoke(self,id, query, user_backboard): - msg = Msg("user", query, role="user") - return self.agents[id](msg, user_backboard = user_backboard) - - -import time -if __name__ == '__main__': - # tool_demo = ToolDemo("Lava") - # response = tool_demo.invoke("I want such a Gurouce, when use it, it will be thrown and fly towards the mouse position for a short time, and stop. And will damage Enemy who step on it. I call it Lava Gurouce.") - # print(response) - # Start the WebSocket server in a separate thread - manager = AgentManager() - id, agent = manager.new_agent() - - # Main thread logic - try: - # Your code that might be interrupted - while True: - input_data = input("用户:") - print(manager.invoke(id, input_data)) - - except KeyboardInterrupt: - print("Process interrupted by user.") - # You can add any cleanup code here if needed - finally: - print("Exiting program.") - # Code to run before the program exits +import sys +import os +current_directory = os.path.dirname(os.path.abspath(__file__)) +sys.path.append(current_directory) +from flask_socketio import SocketIO, join_room, emit, Namespace +import agentscope +from agentscope.message import Msg +import os +import asyncio +import threading +import json + +from agent.flex_service_toolkit import * +from AlgoriAgent.projects.algoriAgent.agent.algori_agent import * + +from agentscope.service import ( + ServiceToolkit, + ServiceResponse, + ServiceExecStatus, +) +import configparser + +config = configparser.ConfigParser() +config.read('config.ini') +openai_api_key = config['Global']['api_key'] + + + +OPENAI_CFG_DICT = { + "config_name": "openai_cfg", # 此配置的名称,必须保证唯一 + "model_type": "openai_chat", # 模型类型 + "model_name": "gpt-4o-mini", # 模型名称 + #"model_name": "gpt-4", # 模型名称 + #"model_name": "llama3", + "api_key": openai_api_key, # OpenAI API key. 如果没有设置,将使用环境变量中的 OPENAI_API_KEY + + "client_args": { + "base_url": config['Global']['base_chat_url'] + }, + +} + +import uuid +from AlgoriAgent.projects.algoriAgent.tools.judge_tools import judge +EMPTY_CHAPTER_CHAIN = [ Chapter(1, CHAPTER_FOCUS, "本章是未打开某个具体章节时的默认章节。", "处于本章节时不会有任何章节跳转。请作为一名经验丰富的算法教师,回答用户的问题。") ] + +def tool_name_to_tool(tool_name_list): + tools = [] + for tool_name in tool_name_list: + if tool_name == "": + continue + if tool_name == "judge": + tools.append(judge) + + return tools + +def tool_name_to_tool_with_args(tool_name_list, tool_args_list) -> list[tuple[Callable, dict]]: + tools = [] + for tool_name, tool_args in zip(tool_name_list, tool_args_list): + if tool_name == "": + continue + if tool_name == "judge": + tools.append((judge, {"course_id": tool_args[0], "lesson_id": tool_args[1], "name": tool_args[2]})) + + return tools +class AgentManager: + def __init__(self,max_iter = 5, app=None, socketio=None): + + agentscope.init(model_configs=[OPENAI_CFG_DICT])#, studio_url="http://0.0.0.0:5000") + self.agents = {} + self.max_iter = max_iter + self.agent_to_id = {} + self.app = app + self.socketio = socketio + def new_agent(self, course_id, lesson_id, markdown:str, markdown_prompt:str, score_prompt:str, id = "Defult Assistant", root_path="."): + ''' + markdown: 教案的markdown文件内容 + markdown_prompt: 教案的prompt的markdown文件内容 + score_prompt: 评分的prompt的markdown文件内容 + 根据3个教案的prompt,生成一个agent,返回agent的id与agent + ''' + markdown_list = markdown.split("\n") + markdown_prompt_list = markdown_prompt.split("\n") + score_prompt_list = score_prompt.split("\n") + # 获取 H1 标题 + title = "" + for line in markdown_list: + if line.startswith("# "): + title = line[2:] + break + + # 对于 H3 标题 构造每一个 Chapter + # 首先找到所有的 H3 标题 + chapter_dict = {} + chapter_sequence = [] + for line in markdown_list: + if line.startswith("### "): + chapter_name = line[4:] + chapter_dict[chapter_name] = {} + chapter_sequence.append(chapter_name) + # 将 H3 标题 和 其对应的内容 构造成一个 Chapter + + h3_name = "" + content = "" + for i in range(len(markdown_list)): + if markdown_list[i].startswith("### "): + if(h3_name != ""): + chapter_dict[h3_name]["markdown"] = content + h3_name = markdown_list[i][4:] + content = "" + continue + if h3_name != "": + content += markdown_list[i]+"\n" + if(h3_name != ""): + chapter_dict[h3_name]["markdown"] = content + + + h3_name = "" + content = "" + require_tools = [] + require_tools_args = [] + for i in range(len(markdown_prompt_list)): + if markdown_prompt_list[i].startswith("### "): + if(h3_name != ""): + chapter_dict[h3_name]["markdown_prompt"] = content + chapter_dict[h3_name]["require_tools"] = tool_name_to_tool_with_args(require_tools, require_tools_args) + h3_name = markdown_prompt_list[i][4:] + content = "" + require_tools=[] + require_tools_args = [] + continue + + if h3_name != "": + if markdown_prompt_list[i].startswith("_require_tools"): + require_tools.append(markdown_prompt_list[i].split("=")[1].strip().split(",")[0]) + require_tools_args.append((markdown_prompt_list[i].split("=")[1].strip().split(",")[1:])) + continue + content += markdown_prompt_list[i]+"\n" + if(h3_name != ""): + chapter_dict[h3_name]["markdown_prompt"] = content + chapter_dict[h3_name]["require_tools"] = tool_name_to_tool_with_args(require_tools, require_tools_args) + + + h3_name = "" + content = "" + for i in range(len(score_prompt_list)): + if score_prompt_list[i].startswith("### "): + if(h3_name != ""): + chapter_dict[h3_name]["score_prompt"] = content + h3_name = score_prompt_list[i][4:] + content = "" + continue + + if h3_name != "": + content += score_prompt_list[i]+"\n" + if(h3_name != ""): + chapter_dict[h3_name]["score_prompt"] = content + + + chapter_chain = [] + No = 1 + print (chapter_dict) + for chapter_name in chapter_sequence: + chapter_chain.append(Chapter(course_id, lesson_id, No, CHAPTER_LATTER, chapter_name, chapter_dict[chapter_name]["markdown"], chapter_dict[chapter_name]["markdown_prompt"], chapter_dict[chapter_name]["score_prompt"],chapter_dict[chapter_name]["require_tools"])) + No+=1 + chapter_chain[0].Focus() + + + # Prepare the tools for the agent + service_toolkit = FlexServiceToolkit() + # for tool_function in unity_function_list: + # service_toolkit.add(tool_function) + agent = ChapterChainAgent( + name=id, + model_config_name="openai_cfg", + verbose=True, + service_toolkit=service_toolkit, + max_iters=5, + chapter_chain=chapter_chain, + root_path = root_path, + ) + self.agents[id] = agent + self.agent_to_id[agent] = id + agent.agent_manager = self + return id, agent + + def message_pass(self, agent, messagetype, message): + id = self.agent_to_id[agent] + print("message_pass", id, messagetype, message) + with self.app.app_context(): + try: + self.socketio.emit(messagetype, message, room=id, namespace='/agent') + except Exception as e: + print("message_pass",e) + + def system_message(self, message): + with self.app.app_context(): + try: + self.socketio.emit('system_message', message, room=id, namespace='/agent') + except Exception as e: + print("ERROR: system_message",e) + + + def save_chapter_memory(self, agent,course_id, lesson_id, subchapter_title, mem_list, score, is_rebuttal): + id = self.agent_to_id[agent] + self.app.my_function.save_chapter_memory(id, course_id, lesson_id, subchapter_title, mem_list, score, is_rebuttal) + + + def new_agent_with_chain(self, chapter_chain = None, id = None): + if chapter_chain is None: + chapter_chain = EMPTY_CHAPTER_CHAIN + + # Prepare the tools for the agent + service_toolkit = FlexServiceToolkit() + # for tool_function in unity_function_list: + # service_toolkit.add(tool_function) + agent = ChapterChainAgent( + name="assistant", + model_config_name="openai_cfg", + verbose=True, + service_toolkit=service_toolkit, + max_iters=5, + chapter_chain=EMPTY_CHAPTER_CHAIN + ) + if id is None: id = uuid.uuid4() + self.agents[id] = agent + return id, agent + + + def get_agent(self, id=None): + ''' + 如果在get agent之前没有new agent,并用id进行访问,就返回一个章节链为空的agent + ''' + if id: + if id in self.agents: + return self.agents[id] + self.agents[id] = self.new_agent(id)[1] + else: + id = str(uuid.uuid4()) + self.agents[id] = self.new_agent()[1] + return id, self.agents[id] + + + def invoke(self,id, query, user_backboard, reset=False): + msg = Msg("user", query, role="user") + agent = self.agents[id] + res = agent(msg, user_backboard=user_backboard) + return res + # 暂时取消生成器的写法 + # 假设 agent 是一个生成器 + # if reset or not hasattr(agent, '_generator'): + # agent._generator = agent(msg, user_backboard=user_backboard) + + # try: + # response = next(agent._generator) + # yield response + # except StopIteration: + # return + + def function_call(self, id, arg_function): + agent = self.agents[id] + return agent.function_call(arg_function) + + def change_language(self, id, language): + agent = self.agents[id] + agent.change_language(language) + + def sample_judge(self, id, bb): + agent = self.agents[id] + + with self.app.app_context(): + try: + print(bb.get_active_file_reletive_path()) + assert bb is not None and bb.active_file_path != "" , "no path specified" + if bb.get_active_file_reletive_path().endswith(".py"): + self.socketio.emit('terminal', {'data': f"python {bb.get_active_file_reletive_path()}"}, room=id, namespace='/vscode') + self.socketio.emit('system_message', "代码试运行尚在建设,推荐直接通过命令行执行!", room=id, namespace='/agent') + else: + self.socketio.emit('system_message', "代码试运行尚仅支持python文件", room=id, namespace='/agent') + except Exception as e: + print(e) + if (str(e) == "no path specified"): + self.socketio.emit("system_message", "未加载IDE文件同步,请尝试重新打开IDE文件或刷新页面,并确保插件已连接", room=id, namespace='/agent') + + def judge(self, id, bb): + agent = self.agents[id] + with self.app.app_context(): + try: + if (agent.chapter_chain[agent.chapter_chain_now].append_tools is not None and len(agent.chapter_chain[agent.chapter_chain_now].append_tools)): + for tool, tool_kwargs in agent.chapter_chain[agent.chapter_chain_now].append_tools: + if tool.__name__ == "judge": + print(bb.get_active_file_reletive_path()) + assert bb is not None and bb.active_file_path != "" , "no path specified" + if bb.get_active_file_reletive_path().endswith(".py"): + # self.socketio.emit('terminal', {'data': f"python {bb.get_active_file_reletive_path()}"}, room=id, namespace='/vscode') + self.socketio.emit('system_message', "代码评测中,请稍后", room=id, namespace='/agent') + agent.function_call({'name':'judge','arguments':{'filepath': bb.get_active_file_reletive_path()}}) + else: + self.socketio.emit('system_message', "代码评测尚仅支持python文件", room=id, namespace='/agent') + + else: + with self.app.app_context(): + self.socketio.emit("system_message", "本章学习无需评测", room=id, namespace='/agent') + else: + with self.app.app_context(): + self.socketio.emit("system_message", "本章学习无需评测", room=id, namespace='/agent') + except Exception as e: + if (str(e) == "no path specified"): + self.socketio.emit("system_message", "未加载IDE文件同步,请尝试重新打开IDE文件或刷新页面,并确保插件已连接", room=id, namespace='/agent') + + +import time +if __name__ == '__main__': + manager = AgentManager() + id, agent = manager.new_agent() + + # Main thread logic + try: + # Your code that might be interrupted + while True: + input_data = input("用户:") + print(manager.invoke(id, input_data)) + + except KeyboardInterrupt: + print("Process interrupted by user.") + # You can add any cleanup code here if needed + finally: + print("Exiting program.") + # Code to run before the program exits diff --git a/AlgoriAgent/projects/algoriAgent/tools/__pycache__/__init__.cpython-310.pyc b/AlgoriAgent/projects/algoriAgent/tools/__pycache__/__init__.cpython-310.pyc index 36bf43a4d3f13de20625f391fd2be5d875c1f51d..bdca1704313e71cc62a2159bef4cde0ac79a7e9f 100644 GIT binary patch delta 101 zcmdnNxRsGRpO=@50SInf%Ad$>;}@Zyk)NBYpPZPPotm7HnwPGhn3JCGn4X$fqMw|f llB$~sW;y}|i!vd?1x5K;smUe9V3jbzlKlLfV*QCT6acx8BmMvY delta 104 zcmdnWxPy^9pO=@50SI*Ghfd_S35<5LigEW0$tX<#nOo(tnQGQlxa!GMaB9dT9etu4I%*3e*0P%PwQUCw| diff --git a/AlgoriAgent/projects/algoriAgent/tools/__pycache__/judge_tools.cpython-310.pyc b/AlgoriAgent/projects/algoriAgent/tools/__pycache__/judge_tools.cpython-310.pyc index 2cb70893ce9ac7958dddc799c25032f072bcaf2b..c90bb7768c4b5b830a1cdc6811a7f48746c01e9c 100644 GIT binary patch literal 2732 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 " + os.path.join(save_dir, f"_{name}.out") - os.system(cmd) - # 比较结果 - re = "" - if compare_file(os.path.join(save_dir, f"_{name}.out"), os.path.join(directory, file.replace(".in", ".out"))): - re = "Passed {file}" - passed_num += 1 - else: - re = "Failed {file}" - failed_num += 1 - Report = Report + re + "\n" - os.remove(os.path.join(save_dir, f"_{name}.out")) - score = int (100 * passed_num / (passed_num + failed_num)) - - - - status = ServiceExecStatus.SUCCESS - return ServiceResponse(status, (Report, score)) - - -def compare_file(path1:str, path2:str): - """ - Compare two files and return true if they are the same. - """ - with open(path1, 'r') as f1, open(path2, 'r') as f2: - # 逐行比较 - for line1, line2 in zip(f1, f2): - if line1.strip() != line2.strip(): - return False - return True - +from agentscope.service.service_toolkit import ServiceFunction +from agentscope.service import ( + ServiceToolkit, + ServiceResponse, + ServiceExecStatus, +) +import os +def judge(filepath:str, name: str, course_id: str, lesson_id: str, root_path:str): + """Call this method to judge the student's solution after they have completed the problem. + + Args: + filepath (`str`): The path to the file containing the student's solution. + name (`str`): The name of the problem. + course_id (`str`): The id of the course. + lesson_id (`str`): The id of the lesson. + root_path (`str`): The root path of the user's workspace project. + + Returns: + Report `tuple(int,str)`: The report of the student's solution. + """ + # 从books/code_tests/name/中获取所有.in文件 + + directory = 'books/code_tests/'+course_id+'/'+name + # 如果目录不存在,报错 + if not os.path.exists(directory): + status = ServiceExecStatus.FAILED + return ServiceResponse(status, f"The name {name} is not found.") + files = os.listdir(directory) + in_files = [file for file in files if file.endswith('.in')] + save_dir = root_path + Report = "" + passed_num=0 + failed_num=0 + erroroutput = "" + exceptoutput="" + for file in in_files: + file_path = os.path.join(save_dir, f"_{name}.out") + if os.path.exists(file_path): + os.remove(file_path) + with open(file_path, 'w') as ff: + ff.write("") + + cmd = "cat " + os.path.join(directory, file) + " | " + "python " + os.path.join(root_path, filepath) +" > " + os.path.join(save_dir, f"_{name}.out") + os.system(cmd) + # 比较结果 + re = "" + if compare_file(os.path.join(save_dir, f"_{name}.out"), os.path.join(directory, file.replace(".in", ".out"))): + re = f"Passed {file}" + passed_num += 1 + else: + re = f"Failed {file}" + failed_num += 1 + with open(os.path.join(directory, file.replace(".in", ".out")),'r') as f: exceptoutput = f.read() + with open(os.path.join(save_dir, f"_{name}.out"),'r') as f: erroroutput = f.read() + Report = Report + re + "\n" + os.remove(os.path.join(save_dir, f"_{name}.out")) + score = int (100 * passed_num / (passed_num + failed_num)) + + + + status = ServiceExecStatus.SUCCESS + return ServiceResponse(status, (score, f"评测得分为 {score}, 在 {passed_num + failed_num} 个测试用例中通过了 {passed_num}个。最后一个错误样例期望输出:'{exceptoutput}',但你的输出:'{erroroutput}")) + + +def compare_file(path1:str, path2:str): + """ + Compare two files and return true if they are the same. + """ + with open(path1, 'r') as f1, open(path2, 'r') as f2: + # 逐行比较 + print('-------------------COMPARE-------------------------') + for line1, line2 in zip(f1, f2): + print(line1.strip(), "||",line2.strip()) + if line1.strip() != line2.strip(): + return False + return True + judge_tools = [judge] \ No newline at end of file diff --git a/AlgoriAgent/src/agentscope/__pycache__/__init__.cpython-310.pyc b/AlgoriAgent/src/agentscope/__pycache__/__init__.cpython-310.pyc index 92a3bf902cc77c1585ad7422d94275fa6ede938a..40f996ace4572cfa3f387d6e25e56681ddf16c3d 100644 GIT binary patch delta 91 zcmdnUx{j4QpO=@50SML{%-_f@&*bEzpOK%Ns-K*gnVp)Pk(!sTpO}-L@0gyNSE8Ss hpOUJZ2xdA01&cBv!o@|&`e4!G*b9^U`} delta 94 zcmZ3-x{;MTpO=@50SI*Ghi>GSXL9v-vx;%|49O@>3Q8@=FU~BFP#OLbcW)FfXLj{>vx;%|49O@>3Q8@=FU~B*S-Kk)NBYpPZPPotm7HnwPGhn3JCGn4X$fqMw|f flB$~sW;y}|i!vd?#YM^bVA0~_{DM^diD#7nK`$T4 delta 92 zcmaFE_@0qFpO=@50SI*Ghfd_Kb@g|%igEW0$tX<#nOo(uCQF07ev^Y7xAT?&X6L?PJ# delta 102 zcmbQww}_8BpO=@50SI*Ghi>HdWOfa3vx;%|49O@>3Q8@=FU~BF3Q8@=FU~B7S;o_oXeXwY8a(+Ro{^sAzeUboyb0D4o delta 95 zcmZp(?zHC4=jG*M00Q0lp&PkZGrI=6S;e?}hGdi`1*I0`7iX5_7gfeM=clAPrl;nW l#3Tb*x`|+>V@`U0Q6@yVxF|UWELxnLUyvHJ`3G~KBmly5A_4#a diff --git a/AlgoriAgent/src/agentscope/__pycache__/logging.cpython-310.pyc b/AlgoriAgent/src/agentscope/__pycache__/logging.cpython-310.pyc index 9c2ee629f3ae2e7e8b3ada4f83a936905c491111..c007dff826182d26a5ca80a324f1f58a292d2ad1 100644 GIT binary patch delta 92 zcmdm{w^@%npO=@50SML{%-_g8fyK#NKO;XkRX;f~GdndoBQ-BwKQSjg-!VNkuS7pN jKP6Q+5zKT13KnHTgo}%k^}(XW$@vAT`kNoHgb4uvj)fp* delta 95 zcmdn2w@r^bpO=@50SI*Ghi>Gaz~buXW)HF$L{LqW);`{(*5+76m delta 95 zcmZ3izD%7vpO=@50SI*Ghi>GyXL0p)vx;%|49O@>3Q8@=FU~BG~XYvVivx;%|49O@>3Q8@=FU~BHF!R!<4W)pO=@50SML{%-_iUpT#p=KO;XkRX;f~GdndoBQ-BwKQSjg-!VNkuS7pN kKP6Q+5zKT13KnHTgo}%k^}(XW$@vATP^SLoFjiGo0K_&EpO=@50SI*Ghi>Hl&*Bs1W)F9WA}-7vx;%|49O@>3Q8@=FU~B{CVE_OC delta 102 zcmX@keu|wtpO=@50SI*Ghi>F9V)6-dvx;%|49O@>3Q8@=FU~BHd;PMG~vx;%|49O@>3Q8@=FU~Bo_L>*v};Q diff --git a/AlgoriAgent/src/agentscope/agents/__pycache__/react_agent.cpython-310.pyc b/AlgoriAgent/src/agentscope/agents/__pycache__/react_agent.cpython-310.pyc index dff44f692d9d32338604c790dbbfa6d7482b53c5..88236717d16ec2534901417c79b2dd96a1ad2c8b 100644 GIT binary patch delta 99 zcmaFo@!EqspO=@50SML{%-_iEE#VoapOK%Ns-K*gnVp)Pk(!sTpO}-L@0gyNSE8Ss kpOUJZ2xdA01&cBv!o@|&`e4!G%gpO=@50SI*Ghi>Hdmhg#mvx;%|49O@>3Q8@=FU~BFv&*c;DW)L({=W~U}+q~@jTC+4K*JEo`RmFOqu kr=;p8f|-s$!JI0ei!)2|iz;KB^HWkC(^KO@-9#|cF(*C0C=()FT$CIG7A;QBFGz(lV>Z{ZwlD(#akV3a diff --git a/AlgoriAgent/src/agentscope/agents/__pycache__/user_agent.cpython-310.pyc b/AlgoriAgent/src/agentscope/agents/__pycache__/user_agent.cpython-310.pyc index dbf965318ae96f7af9b6888f5cb4bff843df732b..03522472d7549c54e40ea01721d5323713e16029 100644 GIT binary patch delta 99 zcmdm}yiS=rpO=@50SML{%-_fz&*B-XpOK%Ns-K*gnVp)Pk(!sTpO}-L@0gyNSE8Ss kpOUJZ2xdA01&cBv!o@|&`e4!GGKXYq+}vx;%|49O@>3Q8@=FU~B>O%ya|_7G*+&i;I%=!J@^<`30%^xv9DNMV0!K?HIKHYKJ0u delta 100 zcmaFL^n!^ypO=@50SI*Ghfd^v?i1!_731z1l2MuzlvGSXYmPfvx;%|49O@>3Q8@=FU~BGSW%G%1vx;%|49O@>3Q8@=FU~BFnVe<)dvx;%|49O@>3Q8@=FU~BE!V(|%avx;%|49O@>3Q8@=FU~BW3l2asf diff --git a/AlgoriAgent/src/agentscope/models/__pycache__/dashscope_model.cpython-310.pyc b/AlgoriAgent/src/agentscope/models/__pycache__/dashscope_model.cpython-310.pyc index d96a15cda414874530de41ddca319e7fc20112c6..a823dfcd12319c06602c901e48b9d553d6064956 100644 GIT binary patch delta 101 zcmeyklkwe7M(%uGUM>b8SbH#kBljXU&nW$j{M=Oiu>(a_9GMkC;uhV delta 104 zcmaF2lkwwDM(%uGUM>b8(48N;k$VxFPpq3&jJsz@Mrl$|YC(Q+W=VcgWsGxvN~&Xe uYFLB2n7In5GP^) diff --git a/AlgoriAgent/src/agentscope/models/__pycache__/gemini_model.cpython-310.pyc b/AlgoriAgent/src/agentscope/models/__pycache__/gemini_model.cpython-310.pyc index 6f8884bd92383d79914cfc00510b076b9b7df098..39a3040785a4e21e82e291adf52bf1ebb2b080b5 100644 GIT binary patch delta 99 zcmX>Rax{cHpO=@50SML}%-_hppVc#5KO;XkRX;f~GdndoBQ-BwKQSjg-!VNkuS7pN oKP6Q+5zKT13KnHTgo}%k^}(XW$@vAT`nf<=ImP;$#n_Bg0J!WT^8f$< delta 102 zcmX>aaw3E~pO=@50SI*Ghi>HF&*~H9W)KlYam;36HX{`P2LL34 diff --git a/AlgoriAgent/src/agentscope/models/__pycache__/litellm_model.cpython-310.pyc b/AlgoriAgent/src/agentscope/models/__pycache__/litellm_model.cpython-310.pyc index 34e7155136a3e56ed2bd8e33b7e1bc8fffb89f01..ac519714f2675e8b5ce2ba34445f80c672b29a85 100644 GIT binary patch delta 99 zcmeCMX|>_b=jG*M0D`p#^EYxUa(YJSXXNLm>L({=W~U}+q~@jTC+4K*JEo`RmFOqu or=;p8f|-s$!Jt<8 delta 102 zcmZp*>9FC>=jG*M00Q0lp&PjsIentttYX|fLo!N}f>I0ei!)2|iz;KB^HWkC(^KO@-9#|cF(*C0C=()FT$CIG7A;QBFG!8a1**y^j@ewwIY9&fk+UQ1 diff --git a/AlgoriAgent/src/agentscope/models/__pycache__/model.cpython-310.pyc b/AlgoriAgent/src/agentscope/models/__pycache__/model.cpython-310.pyc index f5dc17186acb086d6120b7e31b190e06766f3999..d17ee41ddada82b5d87e7854e6649504bbf414d4 100644 GIT binary patch delta 99 zcmX@>ams@`pO=@50SML}%-_g;hu1SeKO;XkRX;f~GdndoBQ-BwKQSjg-!VNkuS7pN oKP6Q+5zKT13KnHTgo}%k^}(XW$@vAT`nf<=ImP;$jrpX+0KI`D0ssI2 delta 102 zcmX@*an^%7pO=@50SI*Ghi>G)!|N05W)KlYam;1|J}EH(3&kXo diff --git a/AlgoriAgent/src/agentscope/models/__pycache__/ollama_model.cpython-310.pyc b/AlgoriAgent/src/agentscope/models/__pycache__/ollama_model.cpython-310.pyc index cc86f6b9c286330e8871ae7fd3890ff40cf56dd7..6f7ea7ab1183f65aa6b2a4a676134365ca3c4aa2 100644 GIT binary patch delta 99 zcmZomY)<6P=jG*M0D`p#^EYzquz7~-XXNLm>L({=W~U}+q~@jTC+4K*JEo`RmFOqu or=;p8f|-s$!JI0ei!)2|iz;KB^HWkC(^KO@-9#|cF(*C0C=()FT$CIG7A;QBFG!8a1**y^j@jJ6#;gSZu6QHM diff --git a/AlgoriAgent/src/agentscope/models/__pycache__/openai_model.cpython-310.pyc b/AlgoriAgent/src/agentscope/models/__pycache__/openai_model.cpython-310.pyc index 1a116d464de074af260c2898d2bf7511ef10f9b6..b9e2f944323785eab023d288c30bf78901174338 100644 GIT binary patch delta 99 zcmcapcC(B-pO=@50SML}%-_iUmeVs_KO;XkRX;f~GdndoBQ-BwKQSjg-!VNkuS7pN oKP6Q+5zKT13KnHTgo}%k^}(XW$@vAT`nf<=ImP;$UAQC+0rG1jwg3PC delta 102 zcmcavcBhOxpO=@50SI*Ghi>G4%jpy4W)KlYam;2%E(t>bLRlq7 diff --git a/AlgoriAgent/src/agentscope/models/__pycache__/post_model.cpython-310.pyc b/AlgoriAgent/src/agentscope/models/__pycache__/post_model.cpython-310.pyc index d3c2c860560684730718b88c6a1632377b8a6a60..2c6c4f1797237a6c30b4b7b3f7541d9095a88ddd 100644 GIT binary patch delta 99 zcmaFm``nj1pO=@50SML}%-_h(&+QqipOK%Ns-K*gnVp)Pk(!sTpO}-L@0gyNSE8Ss opOUJZ2xdA01&cBv!o@|&`e4!GHN=k|$kvx;%|49O@>3Q8@=FU~B1xnpO=@50SI*Ghi>E!X7vekvx;%|49O@>3Q8@=FU~BpO=@50SI*Ghi>E+;P8obvx;%|49O@>3Q8@=FU~BQb`jcgtv;cdvB7gt@ delta 102 zcmX@ia*TyLpO=@50SI*Ghi>FP!sr|BW)Qb`kNKlgqZ=L9U_|m delta 103 zcmdlWv{{HdpO=@50SI*Ghi>FP!RnjfW)pO=@50SML}%-_h(!{!yIpOK%Ns-K*gnVp)Pk(!sTpO}-L@0gyNSE8Ss qpOUJZ2xdA01&cBv!o@|&`e4!GHNVe?INvx;%|49O@>3Q8@=FU~BE!Wb%!2vx;%|49O@>3Q8@=FU~BQb`kNhCV?_bBGb2*~ delta 103 zcmbPbI@gptpO=@50SI*Ghi>G4!Qz|ZW)E+XY!A9vx;%|49O@>3Q8@=FU~Bsm1!6^_V4v01dw*;s5{u delta 105 zcmX@2bzF-(pO=@50SI*Ghi>G)!sH+AW)GKWcH7Avx;%|49O@>3Q8@=FU~BH7WAX`evx;%|49O@>3Q8@=FU~BE!XYq-1vx;%|49O@>3Q8@=FU~B delta 102 zcmexj@ZEqrpO=@50SI*Ghi>Hl#pn~`W)Ga&Ek{dW)Q~&?~ diff --git a/AlgoriAgent/src/agentscope/prompt/__pycache__/_prompt_generator_en.cpython-310.pyc b/AlgoriAgent/src/agentscope/prompt/__pycache__/_prompt_generator_en.cpython-310.pyc index 590f2a623a530ab20ec6d476b7700e8b807ebae9..3632cd9ebc64b3daa538458d3edd47b6364e2089 100644 GIT binary patch delta 99 zcmaDX`#_dEpO=@50SML}%-_iE#N!#SpOK%Ns-K*gnVp)Pk(!sTpO}-L@0gyNSE8Ss ppOUJZ2xdA01&cBv!o@|&`e4!GF{;_*pxvx;%|49O@>3Q8@=FU~BSNXpOK%Ns-K*gnVp)Pk(!sTpO}-L@0gyNSE8Ss ppOUJZ2xdA01&cBv!o@|&`e4!GHV3Q8@=FU~BB>;RF8BOCw# delta 102 zcmaE5_|}j+pO=@50SI*Ghi>Fn67-38vx;%|49O@>3Q8@=FU~BD&&bbB)lW{$%uY?tNX<*vPs~ZrcT7*sE74ER pPf68H1T!6hf<>7S;o_oXeXwY8a(+RoenC-wZb6Cu=DW;WnE*_LBLV;b delta 102 zcmeC@oy5zX&&$ij00g@8LpO4_G5bWjS;e?}hGdi`1*I0`7iX5_7gfeM=clAPrl;nW s#3Tb*x`|+>V@`U0Q6@yVxF|UWELxnLUyvG8P?VorP!hBG7V}mn0G90}k^lez diff --git a/AlgoriAgent/src/agentscope/rag/__pycache__/__init__.cpython-310.pyc b/AlgoriAgent/src/agentscope/rag/__pycache__/__init__.cpython-310.pyc index 7d4481b5a3a558eafa7591643f421140628104cc..1db4bd3e2031844691b11920eb20a96421fd732b 100644 GIT binary patch delta 95 zcmdnRyq%dlpO=@50SML}%-_gu$LJQIpOK%Ns-K*gnVp)Pk(!sTpO}-L@0gyNSE8Ss lpOUJZ2xdA01&cBv!o@|&`e4!GGyWAqGmvx;%|49O@>3Q8@=FU~B6#xJL diff --git a/AlgoriAgent/src/agentscope/rag/__pycache__/knowledge.cpython-310.pyc b/AlgoriAgent/src/agentscope/rag/__pycache__/knowledge.cpython-310.pyc index e2bd24710cf84c105d838ae8c5a8e776669f00d2..78b45ffcebbae955f214c00bc9928af04f3af9f6 100644 GIT binary patch delta 96 zcmeya@^Kc delta 99 zcmeyO@?C{HpO=@50SI*Ghi>F%Ve<@evx;%|49O@>3Q8@=FU~BHNVD*f2vx;%|49O@>3Q8@=FU~B#8^BBKBR diff --git a/AlgoriAgent/src/agentscope/rag/__pycache__/llama_index_knowledge.cpython-310.pyc b/AlgoriAgent/src/agentscope/rag/__pycache__/llama_index_knowledge.cpython-310.pyc index 7f85c37bd855dc45f536cfa2b96c4bc11aac0a44..29458f2964ec09a301b31ccac3d21c8ccbf05f69 100644 GIT binary patch delta 98 zcmaFb!T6|ykvpH4mx}=i)*j5?$bE^;Eml7xKQ~oBIWaRkH8~?SFI_(|Cq3UWJvFaH oKRG`oRW}jLbOZ_(WkQ6Di<0%hqQ%Mi1*!T)iRt>A)!6NA0hPZZn*aa+ delta 101 zcmaFV!T7X;kvpH4mx}=ibmxa|G?&O5aHsYAs_$% delta 98 zcmZ3$wwR4OpO=@50SI*Ghi>HVX7UVnvx;%|49O@>3Q8@=FU~B_Cbw1pO=@50SI*Ghi>FHVDXH0vx;%|49O@>3Q8@=FU~BE!VD^k~vx;%|49O@>3Q8@=FU~B3Q8@=FU~BT3veY8|$wiE6002}WUjP6A delta 101 zcmbQrJcF4#pO=@50SI*Ghi>GSX7mYjvx;%|49O@>3Q8@=FU~BT3veY8|&8Ijk^#Qm7BlQ3P delta 102 zcmX?5bhwB+pO=@50SI*Ghi>F9=JW}3vx;%|49O@>3Q8@=FU~BT3veY8|&8aMmssNU3BBcNT delta 102 zcmaDH^el)wpO=@50SI*Ghi>HNWAO=dvx;%|49O@>3Q8@=FU~BG)%IX{LW)L({=W~U}+q~@jTC+4K*JEo`RmFOqu qr=;p8f|-s$!JI0ei!)2|iz;KB^HWkC(^KO@-9#|cF(*C0C=()FT$CIG7A;QBFG!6kPAw|SOiqp2JdHVr5dfDnBl7?N diff --git a/AlgoriAgent/src/agentscope/service/__pycache__/service_status.cpython-310.pyc b/AlgoriAgent/src/agentscope/service/__pycache__/service_status.cpython-310.pyc index e0c8fac54723d8c5746d33393c87861bba3034f9..6f114381681073758d0baa5bc4586ca993ee4cfd 100644 GIT binary patch delta 99 zcmeBW>0;r|=jG*M0D`p#^EYz4FnUGlXXNLm>L({=W~U}+q~@jTC+4K*JEo`RmFOqu pr=;p8f|-s$!J1E;0=jG*M00Q0lp&Pkf7=2^itYX|fLo!N}f>I0ei!)2|iz;KB^HWkC(^KO@-9#|cF(*C0C=()FT$CIG7A;QBFG!6kPAw|SOiqoNJd?2y0CXNB+W-In diff --git a/AlgoriAgent/src/agentscope/service/__pycache__/service_toolkit.cpython-310.pyc b/AlgoriAgent/src/agentscope/service/__pycache__/service_toolkit.cpython-310.pyc index c3807f3a356179038bde4a5e3ab3501a34ebaea9..c8c371d505d6f49210c6ac04f30163005b49cb9f 100644 GIT binary patch delta 100 zcmcaqalV2(pO=@50SL_5OE+?_X7-BK&&bbB)lW{$%uY?tNX<*vPs~ZrcT7*sE74ER qPf68H1T!6hf<>7S;o_oXeXwY8a(+RoesOA1S!Qyo{$^$te+vMX|010L delta 102 zcmX?KajAkkpO=@50SI*Ghi>Fv&FmZJW)#nOo(uCQF07ev^Y7xAT_2qwWusJIW;D=A~m_RBsCtSD`w(61ps0O BDIx#> diff --git a/AlgoriAgent/src/agentscope/service/execute_code/__pycache__/exec_python.cpython-310.pyc b/AlgoriAgent/src/agentscope/service/execute_code/__pycache__/exec_python.cpython-310.pyc index aeaad9bdfe61eaccdcbf2354f554e94b408fb457..881ab68728b87d75031ac5cf4360872517724764 100644 GIT binary patch delta 296 zcmX9(KTE?v6!%1bM2x_eV6!BCwX zB;fAihq%qrZ{b~h!|xxz$Kx%dm#8aze{03g`%g3~9UKtT{04JEYJEHC?>yVGHF#uJt9W)tX-R54NLS2e3EpMm zj8T*KtB7(%v8Ux1WfzoGMoqq_Vk{rUmX@56o1X%v^UL#Yv4XiE3doC^Y@jL$)aa!u z&)7RTOVv(#641d>oW-dnMLC(dnI%!2K|Y?oo+0s$!BLYBt12-@ZGNWO&d4}pa-O=Z e=v1KMqD&AW3nFHLh&huNsK+r*+WcRAF(UxUby@)c diff --git a/AlgoriAgent/src/agentscope/service/execute_code/__pycache__/exec_shell.cpython-310.pyc b/AlgoriAgent/src/agentscope/service/execute_code/__pycache__/exec_shell.cpython-310.pyc index 01e858574e31cf980bd915eb9f4d8888955e6cdb..1ff3dfd7ac26f0a915323afcd6c850a9078c1660 100644 GIT binary patch delta 113 zcmeyx`<<6NpO=@50SML}%-_h}#u}cipOK%Ns-K*gnVp)Pk(!sTpO}-L@0gyNSE8Ss zpOUJZ2xdA01&cBv!o@|&`e4!GT3vdrXE{nU!o# delta 116 zcmey)`-_)5pO=@50SI*Ghi>F3Q8@=FU~B#nOo(uCQF07ev^Y7xAT_2qwWusJIW;CNGbc4>;xq*S7&j%Y diff --git a/AlgoriAgent/src/agentscope/service/file/__pycache__/common.cpython-310.pyc b/AlgoriAgent/src/agentscope/service/file/__pycache__/common.cpython-310.pyc index ea841568045db6ca981c227b889d55f2d1868979..169b58db0fead4856f383a9125b290d1db1dcdc0 100644 GIT binary patch delta 105 zcmca^c*T%ApO=@50SML}%-_g8hs8f!KO;XkRX;f~GdndoBQ-BwKQSjg-!VNkuS7pN wKP6Q+5zKT13KnHTgo}%k^}(XW$@vAT`o*b5WtqvT`e~Utsrs9LvfL8}0D^-iWdHyG delta 108 zcmca&c-@dYpO=@50SI*Ghi>Ga!x9wbW)Jj43=jG*M0D`p#^EYyDXZ8=(&&bbB)lW{$%uY?tNX<*vPs~ZrcT7*sE74ER vPf68H1T!6hf<>7S;o_oXeXwY8a(+RoesOA1S!Qyoep+Tus{UpXmftJ@GuI^8 delta 108 zcmeAX>KEe9=jG*M00Q0lp&PlkGY3VuS;e?}hGdi`1*I0`7iX5_7gfeM=clAPrl;nW y#3Tb*x`|+>V@`U0Q6@yVxF|UWELxnLUyvG8oLW?tnVcGvmYI_pvssYkHwyrXJ0_I? diff --git a/AlgoriAgent/src/agentscope/service/file/__pycache__/text.cpython-310.pyc b/AlgoriAgent/src/agentscope/service/file/__pycache__/text.cpython-310.pyc index e2b3c54cf4c50e8c8d0430d1ad8afb3692610f8f..72780438ab22b766d7597e45820a3a51b3e7eeee 100644 GIT binary patch delta 104 zcmZn>XcXYi=jG*M0D`p#^EYxYX7&%&&&bbB)lW{$%uY?tNX<*vPs~ZrcT7*sE74ER uPf68H1T!6hf<>7S;o_oXeXwY8a(+RoesOA1S!Qyoep+Tus{SSx78U^fnV@`U0Q6@yVxF|UWELxnLUyvG8oLW?tnVcGvmYI_pv-vMG3kv{w7$#c) diff --git a/AlgoriAgent/src/agentscope/service/multi_modality/__pycache__/__init__.cpython-310.pyc b/AlgoriAgent/src/agentscope/service/multi_modality/__pycache__/__init__.cpython-310.pyc index b1ae23562df987600de841c6d1f8e326151876a5..e2347120039457053572fdbb8fee27a899a7891d 100644 GIT binary patch delta 141 zcmXBNQ3}E^5CqUh{18izqI-cN^duo{mvk}7mLx6Y7#_qsw0H|oW2o~n4DV+?YE!Lr z-L;VsCt}Ewa(2CiyAN9 delta 115 zcmX@Wc$kqppO=@50SI*Ghfd_SiAi&_igEW0$tX<#nOo(uCQF07ev^Y7xAT_2qwWusJIW;D?G^ZppJ~uxlF(T3vdrXE{oK-=lFazr{FKC;%#up|&1<<% G@B;uL(<)>D delta 118 zcmexl^3{YppO=@50SI*Ghi>F{3Q8@=FU~BizD)S|M?#nOo(uCQF07ev^Y7xAT_2qwWusJIW?vzwWKIBwJb3wX5wrG0OR>5 A^Z)<= diff --git a/AlgoriAgent/src/agentscope/service/retrieval/__pycache__/retrieval_from_list.cpython-310.pyc b/AlgoriAgent/src/agentscope/service/retrieval/__pycache__/retrieval_from_list.cpython-310.pyc index ad061c7badcf86c3db5b011a0b1733dc41e15dac..629ff64de92843d8b37fda1b49d437e6ebed5447 100644 GIT binary patch delta 110 zcmaDR_E?NNpO=@50SML}%-_hpfjuNsKO;XkRX;f~GdndoBQ-BwKQSjg-!VNkuS7pN zKP6Q+5zKT13KnHTgo}%k^}(XW$@vAT`o*b5WtqvT`bDWFMVYB(i8=b4g*ZZ(0ZJh! AEC2ui delta 113 zcmaDX_DqaBpO=@50SI*Ghi>HFz#g9CW)j0Uv56 Ang9R* delta 113 zcmdnZv5$j0pO=@50SI*Ghi>FP&J>>PW)H1} Deds7x diff --git a/AlgoriAgent/src/agentscope/service/sql_query/__pycache__/__init__.cpython-310.pyc b/AlgoriAgent/src/agentscope/service/sql_query/__pycache__/__init__.cpython-310.pyc index 4e90583366c89f94a89bb0756a9af6e40b65f537..1bd3de82ef071c2b4477e93a6d18f06ca969d3e6 100644 GIT binary patch delta 107 zcmdnTxSNqXpO=@50SML}%%8|@6B4JNk)NBYpPZPPotm7HnwPGhn3JCGn4X$fqMw|f wlB$~sW;y}|i!vd?#YM^bVA0~_{DM^d;?$zD%w!;4m=j-Enp#w;KXIM{0E+J>P5=M^ delta 110 zcmdnZxQ~%LpO=@50SI*Ghfd_S2~TvhigEW0$tX<#nOo(uCQF07ev^Y7xAT_2qwWusJ8AuoA#21#P0!^4WTLA#%cqj`1 diff --git a/AlgoriAgent/src/agentscope/service/sql_query/__pycache__/mongodb.cpython-310.pyc b/AlgoriAgent/src/agentscope/service/sql_query/__pycache__/mongodb.cpython-310.pyc index 8ee0f1475c49d96862c7b736e8bceaab939ae6e8..b871810a197f51caca7e5320b70e45a4975a8c92 100644 GIT binary patch delta 110 zcmaDS@LGU7pO=@50SML}%-_g;k}V`wKO;XkRX;f~GdndoBQ-BwKQSjg-!VNkuS7pN zKP6Q+5zKT13KnHTgo}%k^}(XW$@vAT`o*b5Wtqu9x-cicur#%(Qh&2HyE7vIQ9vhH delta 113 zcmaDY@J@g`pO=@50SI*Ghi>FP$rhgAW)T3vdm;4U6>PJSejZ?slRzLM=~P-CEq7s delta 113 zcmew?{7slUpO=@50SI*Ghi>FH3Q8@=FU~BT3vdm;4U6>PJSejZ?slRzTn=c~(6dWfa delta 113 zcmaFJ|Ae1ApO=@50SI*Ghi>FHWebmYvx;%|49O@>3Q8@=FU~B#nOo(uCQF07ev^Y7xAT_2qwWusJIW?vvwW1`xpeR2%wYWGlFFj`B GLInWla4Mw$ diff --git a/AlgoriAgent/src/agentscope/service/text_processing/__pycache__/summarization.cpython-310.pyc b/AlgoriAgent/src/agentscope/service/text_processing/__pycache__/summarization.cpython-310.pyc index 043ba7c7147a3cc7f8f5643c4718534c1e7addb1..1646d7a9ff1f4122881c2d927e7c79c923c80fd6 100644 GIT binary patch delta 116 zcmaDY@j`+-pO=@50SML}%-_h}#TAvQpOK%Ns-K*gnVp)Pk(!sTpO}-L@0gyNSE8Ss zpOUJZ2xdA01&cBv!o@|&`e4!GT3vdrXE{gTv*lK6t6{N&W);!L19n?G?? GG6Dca0V=fs delta 119 zcmaDM@mhjApO=@50SI*Ghi>HV;)>02vx;%|49O@>3Q8@=FU~BzMv>SIkmVrGcP@6 J^LwsJMgXntEOGz< diff --git a/AlgoriAgent/src/agentscope/service/web/__pycache__/__init__.cpython-310.pyc b/AlgoriAgent/src/agentscope/service/web/__pycache__/__init__.cpython-310.pyc index de27a576f9eea948a60998aa93ac7dbbdbf52e52..c8b7c9058cf8b2fcf6798eb6869fbbbc49091d61 100644 GIT binary patch delta 101 zcmdnNxRsGRpO=@50SML}%%8|@;}@Zyk)NBYpPZPPotm7HnwPGhn3JCGn4X$fqMw|f rlB$~sW;y}|i!vd?#YM^bVA0~_{DM^d;?$zD%;Z%4^3){#i8B-cp>HFJ delta 104 zcmdnWxPy^9pO=@50SI*Ghfd_S35<5LigEW0$tX<#nOo(uCQF07ev^Y7xAT_2qwWusJIW?v{H7RD|R0RO>J|#u~ diff --git a/AlgoriAgent/src/agentscope/service/web/__pycache__/arxiv.cpython-310.pyc b/AlgoriAgent/src/agentscope/service/web/__pycache__/arxiv.cpython-310.pyc index 9bc5c299a6da58cf0cb879cb60eebb2a7ff213aa..62660ac2053ae4483c7526aead619216aafb08b5 100644 GIT binary patch delta 104 zcmbPfIn9zgpO=@50SML}%-_g;p4Bf@KO;XkRX;f~GdndoBQ-BwKQSjg-!VNkuS7pN uKP6Q+5zKT13KnHTgo}%k^}(XW$@vAT`o*b5WtqvT`sJxf`kS@c^27i=tt5{C delta 107 zcmbPcIn$CmpO=@50SI*Ghi>FP&l(uvW)L({=W~U}+q~@jTC+4K*JEo`RmFOqu ur=;p8f|-s$!Jp}tYX|fLo!N}f>I0ei!)2|iz;KB^HWkC(^KO@-9#|cF(*C0C=()FT$CIG7A;QBFG!6kPAw|SOiqm{Pfd#1oF_0v0svbrCLRC) diff --git a/AlgoriAgent/src/agentscope/service/web/__pycache__/download.cpython-310.pyc b/AlgoriAgent/src/agentscope/service/web/__pycache__/download.cpython-310.pyc index 76df2748f5b000ed9bfb37c4d0ca28045297bf89..905d3539855f11d3e5195964c967131e28257328 100644 GIT binary patch delta 104 zcmeyv|C66PpO=@50SML}%-_g8hs`fSKO;XkRX;f~GdndoBQ-BwKQSjg-!VNkuS7pN vKP6Q+5zKT13KnHTgo}%k^}(XW$@vAT`o*b5WtqvT`sJxf`kQ~Su`mJvUREU_ delta 107 zcmey#|A(JDpO=@50SI*Ghi>Ga!xk9rW)$KO;XkRX;f~GdndoBQ-BwKQSjg-!VNkuS7pN zKP6Q+5zKT13KnHTgo}%k^}(XW$@vAT`o*b5WtqvT`sJxf`kR09eqv{g+WbaTpOH~# NvW)m*AbCJM0{}kgE06#H delta 126 zcmZ2#u)=^lpO=@50SI*Ghi>Ga%NrQ!W)HFz#JIsW)>O%ya|_7G*+&i;I%=!J@^<`30%^#U-UFnfdyYnHg08Cww7$ delta 99 zcmZ3&w48}MpO=@50SI*Ghfd^P;}hm)731z1l2MuzlvG?&O5aHsY diff --git a/AlgoriAgent/src/agentscope/studio/__pycache__/_client.cpython-310.pyc b/AlgoriAgent/src/agentscope/studio/__pycache__/_client.cpython-310.pyc index 27f756407fe35b5105daea74924f97130cd8242c..794aff7dc96655263f19553ab51168447c554655 100644 GIT binary patch delta 99 zcmcbocUzA;pO=@50SML}%-_hJ!|WNPpOK%Ns-K*gnVp)Pk(!sTpO}-L@0gyNSE8Ss qpOUJZ2xdA01&cBv!o@|&`e4!GG~VfG1ivx;%|49O@>3Q8@=FU~BOV diff --git a/AlgoriAgent/src/agentscope/utils/__pycache__/__init__.cpython-310.pyc b/AlgoriAgent/src/agentscope/utils/__pycache__/__init__.cpython-310.pyc index 60c0b41bf939d171868fa277140504320808d9ad..a09358d1453826fb3ddc072791863bdd2a1f022a 100644 GIT binary patch delta 97 zcmZo<{>Q|f&&$ij00e6f=5OR?X7mWs&&bbB)lW{$%uY?tNX<*vPs~ZrcT7*sE74ER nPf68H1T!6hf<>7S;o_oXeXwY8a(+RoerZW&PO<*vNJb3+^Z+3l delta 100 zcmeyz)X2=8&&$ij00g@8LpO3WGkS-*S;e?}hGdi`1*I0`7iX5_7gfeM=clAPrl;nW q#3Tb*x`|+>V@`U0Q6@yVxF|UWELxnLUyvG8T9TPl95XqLQ3C)ww<4(k diff --git a/AlgoriAgent/src/agentscope/utils/__pycache__/common.cpython-310.pyc b/AlgoriAgent/src/agentscope/utils/__pycache__/common.cpython-310.pyc index 088aa7c2feba747105579bbbec1b36011a151581..d1389795fa172e2093b8dd502479d0a51121aa92 100644 GIT binary patch delta 363 zcmX|*F-yZh7>2zzt;UiLwV`Mf<4T*DUB$$VbZEY^+km0u~Gqi8IZkX3J@x zww=aa%-xg=jOZzqNPuGWGWh@srYI3>wnve3)`q*j+^O~3-A&S`FYZdICp9ZwNNhd88&tnja#3+$*ovkSl` zzsetj7XQqfdP#n4Nfab<67&2gUrw)!7?=2gZg5*~FBx)El-Q7vGKX7LVovx;%|49O@>3Q8@=FU~Bv*P!?yS4W?y$-b-sj1rsYu`)3+%5GlBK7~fr!r9Eis5)7KFPKdgsJuvRav@&=qsit=d=r^@%|IgNKthwT z$ZT?fkh_#ANCYl?i=!yDxFA2TIJL-V@{B5Xhe$jwD2K;jllN@j9Nkv*81l%Jndds$&WO diff --git a/AlgoriAgent/src/agentscope/utils/__pycache__/monitor.cpython-310.pyc b/AlgoriAgent/src/agentscope/utils/__pycache__/monitor.cpython-310.pyc index c400b93b11ddebe5cc2f9109d6184b5862ae1585..6cea86814ac62432c6c6de63993eee547fb3bd8f 100644 GIT binary patch delta 166 zcmeygl=1yiM(%uGUM>b8SbH#kBllNUk3jv5{M=Oi>u>gEyW-3kwOPUI87pJYX7&IU zMvh*fJ(`R~6DA7>Ml$wJ&J9#$n+OytnlyQyqy%I4b8(48N;k^3vFcZi!+jJsz@Mrl$|YC(Q+W=VcgWsGxvN~&Xe zYFlh Ib8ch?0RG7(`Tzg` delta 128 zcmcaAbwi3fpO=@50SI*Ghi>FnWATn~vx;%|49O@>3Q8@=FU~BL({=W~U}+q~@jTC+4K*JEo`RmFOqu or=;p8f|-s$!JI0ei!)2|iz;KB^HWkC(^KO@-9#|cF(*C0C=()FT$CIG7A;QBFG!6kEy>I&j@i6~`Jpxdm0cu} diff --git a/AlgoriAgent/src/agentscope/web/__pycache__/__init__.cpython-310.pyc b/AlgoriAgent/src/agentscope/web/__pycache__/__init__.cpython-310.pyc index d69998c35cfb467026eb3d09717c853b08019876..57e553563128e0e6dc21fb20ba568f5c426e9897 100644 GIT binary patch delta 93 zcmdnMxR#MSpO=@50SML}%%8|@;})Qwk)NBYpPZPPotm7HnwPGhn3JCGn4X$fqMw|f jlB$~sW;y}|i!vd?#YM^bVA0~_{DM^d^3){#i4zn6gk>N> delta 96 zcmZ3>xPg&7pO=@50SI*Ghfd_S@eFpeigEW0$tX<#nOo(uCQF07ev^Y7xAT_2uH7RCduL1zaJR#8l diff --git a/AlgoriAgent/src/agentscope/web/gradio/__pycache__/__init__.cpython-310.pyc b/AlgoriAgent/src/agentscope/web/gradio/__pycache__/__init__.cpython-310.pyc index 2db016a6d731d7355345cef2ee580091f31697b0..9d35ab578062fb8c31c2a4e3d564ba4b48686e10 100644 GIT binary patch delta 100 zcmdnaxP_5BpO=@50SML}%%8|@;~TD@k)NBYpPZPPotm7HnwPGhn3JCGn4X$fqMw|f qlB$~sW;y}|i!vd?#YM^bVA0~_{DM^d^3){#^rFO+%zXWc(-i=Ed?N_} delta 103 zcmdnOxSf$ZpO=@50SI*Ghfd_S35asDigEW0$tX<#nOo(uCQF07ev^Y7xAT_2uH7O>&C^027KW5?-1pvulB*p*$ diff --git a/AlgoriAgent/src/agentscope/web/gradio/__pycache__/utils.cpython-310.pyc b/AlgoriAgent/src/agentscope/web/gradio/__pycache__/utils.cpython-310.pyc index 87aefe1fb5c81fd7a359756e18ded727423b5795..21ceeb36a58d36acb8b8b2924cc2a38e404c974f 100644 GIT binary patch delta 103 zcmcbteLE!U=9d(vx;%|49O@>3Q8@=FU~BTW=dh6rRgoW;ec6PDtanDWXz91_4171xlK>K`p9)AT@{wBV=tov|0aBWh21ywpO*tS-EkK^yfL3DP zv+on2oGIn*AulAJ^CX`04K93Weg%U?Nx%xebHG0NG)HsXL9BG6EpvfH81z)`HKT!! z6)t*R6~|F%NF7B0FC9I;;hzH9q4;Ir zS|6Ps(VZI89!f2s6xEAJFHPYYpz=bfzDOF){h*&Hy^<~4ulrS4H^KQS+qJ*hNJ+<) z;LX>pO74)9-yyPKu$0ncz6>&AOy8}7*C%!~&sLq^vu$_%QUTTQJ(c7YfQD4vBuLsl z)#&x&SYzsEM(Pr>WrQL?&C-k65ANx;Iit&XQ9Eo!jlPb0{p2*r#@Dhx+?UR>zX}d} z!W`=fbFIfrut!W-k1UTpWS;Xd+Y+N8O6N{93R~?xO@aCKDU4jS+Ff;3wiCUI0xk$7 zDokoT=Uo+Q4UxH@Rj>7riE(B6G_SADAta3pM6DBx=Zv)*s9q% zi{jkE>d9TLx=4(piluUFc)bWakc7{bDYJRAS3k!1qDvrvQE7m^qPc%_(iCF70*C&g(I`XnuEG2> zdyk$Q&i4)EO&aj6CD=I_bPOxCZ$Yo}bFPC# zjIN%d2WK&++fk4`r6+s2qg67{VG}ne18JPb7<@yZ9?Ypul zR3Zxtksdho5WQoCM0>N;suJQKpm+X({R@Bt#{{TQJM-cskUr`C{G0K-ee;`{_jvNj z>2h2uc?{Q|Pvg$-`Q7r&;v!m#Dc)u4>>H+pk~>Vv`(mA=Whomi8!fTBevZ%Y-dnKN znD6T6`OjyEyguZaceC00@n+lvm7rxMLAO0*;OZrDL$7(Yfu!q3i#Y8oxRVKll=XRE z+!uXzoA>!8Ok|A#Mff7ie|`92u+cM=;NVZ@Y$gFTLY3v(aaRQZE_x3jPyd&iN;Qsh zDv&P`2ow6HcXrSsdbo(wHt9?v!DQHNw#C7rM2PqK)L}|sVT3PC7EnU|zneQjdVF&k zBa$3~$1U#h?KzU8?-piwPM^;&d`E473c)FYV-bGa*v(s*0w_+U}! zSGbdv-FvG8Y*7&kXtt=9hl}`;+-qo%+y?7o^&31DkHl{%xgn33)gjwf6qQpHeOwsfgP~}dX z%ZgF(Q`%_VYWC6q=Jl9d_NFn+wC`_Sm%n_WN`3h&HO^6G#eNo33@!8=_*JFPNA@X< zaS!;zX;d&)hY3Ayy;@mas$OoT;Z`#ZRJ9#;gK8^|(jZE!i>*xnB7q9iFzQq@GWq3Y)>y7H`|PCg$5^#+Hs=?@kTE_kFm*h z{g?e|&H6{=#M`1H-U!EfBV6mX$cufExArYh> Backboard: + return self.backboards[user_id] + + + diff --git a/Html/db/data/course/CS101.json b/Html/db/data/course/CS101.json index 8135c4a..5c7ba5e 100644 --- a/Html/db/data/course/CS101.json +++ b/Html/db/data/course/CS101.json @@ -2,7 +2,7 @@ "course_id": "CS101", "course_name": "Computer Science 101", "course_auther": "John Doe", - "course_img_path": "/static/image/algorithm/book_cover.png", + "course_img_path": "/static/image/CS101/CS101.png", "description":"这个老师很懒,没有写介绍", "lessons": [ { @@ -11,7 +11,7 @@ "markdown": "This is the introduction lesson.", "markdown_prompt": "What is Computer Science?", "score_prompt": "Please provide an overview of CS.", - "lesson_img_path": "/static/image/algorithm/book_cover.png" + "lesson_img_path": "/static/image/CS101/CS101.png" }, { "lesson_id": "L002", @@ -19,7 +19,7 @@ "markdown": "In this lesson, we cover Data Structures.", "markdown_prompt": "What is an array?", "score_prompt": "Explain how linked lists work.", - "lesson_img_path": "/static/image/algorithm/book_cover.png" + "lesson_img_path": "/static/image/CS101/CS101.png" } ] } diff --git a/Html/db/data/course/course_list.json b/Html/db/data/course/course_list.json index 9f695a2..5988d99 100644 --- a/Html/db/data/course/course_list.json +++ b/Html/db/data/course/course_list.json @@ -3,7 +3,7 @@ "course_id": "CS101", "course_name": "Computer Science 101", "course_description":"这个老师很懒,没有写介绍", - "course_img_path": "/static/image/algorithm/book_cover.png", + "course_img_path": "/static/image/CS101/CS101.png", "course_create_date": "2023-01-01", "course_update_data": "2023-01-01"}, @@ -19,7 +19,7 @@ "course_id": "data-structure", "course_name": "数据结构", "course_description":"这个老师很懒,没有写介绍", - "course_img_path": "/static/image/algorithm/book_cover.png", + "course_img_path": "/static/image/data-structure/book_cover-data-structure.png", "course_create_date": "2023-01-01", "course_update_data": "2023-01-01"} } \ No newline at end of file diff --git a/Html/db/data/course/data-structure.json b/Html/db/data/course/data-structure.json index ce96ac9..b1326b8 100644 --- a/Html/db/data/course/data-structure.json +++ b/Html/db/data/course/data-structure.json @@ -2,7 +2,7 @@ "course_id": "data-structure", "course_name": "data-structure", "course_auther": "Chao Peng", - "course_img_path": "/static/image/algorithm/book_cover.png", + "course_img_path": "/static/image/data-structure/book_cover-data-structure.png", "description":"这个老师很懒,没有写介绍", "lessons": [ { @@ -11,7 +11,7 @@ "markdown": "This is the introduction lesson.", "markdown_prompt": "What is Data structure?", "score_prompt": "Please provide an overview of CS.", - "lesson_img_path": "/static/image/algorithm/book_cover.png" + "lesson_img_path": "/static/image/data-structure/book_cover-data-structure.png" }, { "lesson_id": "L002", @@ -19,7 +19,7 @@ "markdown": "In this lesson, we cover Data Structures.", "markdown_prompt": "What is an array?", "score_prompt": "Explain how linked lists work.", - "lesson_img_path": "/static/image/algorithm/book_cover.png" + "lesson_img_path": "/static/image/data-structure/book_cover-data-structure.png" } ] } diff --git a/Html/db/data/user/cake.json b/Html/db/data/user/cake.json index 67e05bf..354c128 100644 --- a/Html/db/data/user/cake.json +++ b/Html/db/data/user/cake.json @@ -15,17 +15,17 @@ "title": "\u5f15\u5165", "dialog": [ { - "id": "0b26417b9a4a41c3a86a63e96ac279f7", - "timestamp": "2025-01-01 01:40:36", + "id": "c22798c82f664930aa74a06834e4310a", + "timestamp": "2025-01-01 18:47:30", "name": "system", - "content": "You're a helpful assistant.\n\n## \u4f60\u7684\u89d2\u8272\uff1a\n\u4f60\u9700\u8981\u5e2e\u52a9\u5b66\u751f\u5b66\u4e60\u7b97\u6cd5\uff0c\u5b8c\u6210\u7279\u5b9a\u7684\u7f16\u7a0b\u4efb\u52a1\u3002\n\n## \u4f60\u9700\u8981\u505a\u7684\uff1a\n0. \u4f60\u5fc5\u987b\u6839\u636e\u8001\u5e08\u63d0\u4f9b\u7684\u6559\u5b66\u5927\u7eb2\uff0c\u6309\u7167\u7ae0\u8282\u987a\u5e8f\uff0c\u4f9d\u6b21\u5b66\u4e60\u3002\n1. \u5b66\u751f\u53ef\u80fd\u4f1a\u63d0\u51fa\u4e00\u4e9b\u95ee\u9898\uff0c\u4f60\u65e0\u9700\u56de\u7b54\u95ee\u9898\uff0c\u800c\u662f\u6839\u636e\u4e0a\u4e0b\u6587\uff08\u6bd4\u5982\u5b66\u751f\u81ea\u5df1\u7684\u4ee3\u7801\uff09\u6765\u5206\u6790\uff0c\u5e76\u7ed9\u51fa\u4e00\u6b65\u7684\u89e3\u51b3\u65b9\u6848\u3002\n2. \u6559\u5b66\u5927\u7eb2\u4e2d\u4f1a\u6307\u660e\u6bcf\u4e2a\u7ae0\u8282\u7684\u5b66\u4e60\u76ee\u6807\uff0c\u4f60\u6309\u7167\u76ee\u6807\u5b66\u4e60\u3002\n3. \u7cfb\u7edf\u4f1aoccasionally gather\u5b66\u751f\u4fe1\u606f\uff0c\u4f60\u9700\u8981\u5206\u6790\u5b66\u751f\u5b66\u4e60\u8bb0\u5f55\uff0c\u8c03\u7528\u5fc5\u8981\u7684\u51fd\u6570\u3002\n\n## \u6ce8\u610f\u4e8b\u9879\uff1a\n1. \u786e\u4fdd\u4f7f\u7528\u5de5\u5177\u51fd\u6570\u65f6\uff0c\u63d0\u4f9b\u7684\u53c2\u6570\u7c7b\u578b\u548c\u503c\u662f\u6b63\u786e\u7684\u3002\n2. \u4e0d\u8981\u592a\u76f8\u4fe1\u81ea\u5df1\uff0c\u4f8b\u5982\uff0c\u5f53\u524d\u4f4d\u7f6e\uff0c\u5f53\u524d\u65f6\u95f4\u7b49\uff0c\u4f60\u53ef\u4ee5\u5c1d\u8bd5\u4f7f\u7528\u5de5\u5177\u51fd\u6570\u83b7\u53d6\u4fe1\u606f\u3002\n3. \u5982\u679c\u51fd\u6570\u6267\u884c\u5931\u8d25\uff0c\u4f60\u9700\u8981\u5206\u6790\u9519\u8bef\u5e76\u5c1d\u8bd5\u89e3\u51b3\u3002\n4. \u786e\u4fdd\u5b66\u751f\u63d0\u51fa\u7684\u95ee\u9898\u6216\u60f3\u6cd5\u662f\u5426\u4e0e\u5f53\u524d\u7ae0\u8282\u76f8\u5173\uff0c\u5982\u679c\u4e0d\u76f8\u5173\uff0c\u4f60\u5e94\u7b54\u5e76\u63d0\u9192\u5b66\u751f\u5173\u6ce8\u5f53\u524d\u7ae0\u8282\u3002\n\n## \u8d44\u6e90\uff1a\n1. \u4f60\u53ef\u4ee5\u4f7f\u7528\u7684\u5de5\u5177\u51fd\u6570\u3002\n2. \u4e0a\u4e0b\u6587\uff0c\u5305\u62ec\u5b66\u751f\u7684\u4ee3\u7801\uff0c\u548c\u6559\u5b66\u5927\u7eb2\u3002\n", + "content": "You're a helpful assistant.\n\n## \u4f60\u7684\u89d2\u8272\uff1a\n\u4f60\u9700\u8981\u5e2e\u52a9\u5b66\u751f\u5b66\u4e60\u7b97\u6cd5\uff0c\u68c0\u9a8c\u5b66\u4e60\u8fc7\u7a0b\uff0c\u786e\u4fdd\u5b66\u751f\u7406\u89e3\u5f53\u524d\u7ae0\u8282\u7684\u5185\u5bb9\u540e\uff0c\u5e26\u9886\u5b66\u751f\u8fdb\u5165\u4e0b\u4e00\u7ae0\n\n## \u4f60\u9700\u8981\u505a\u7684\uff1a\n0. \u4f60\u5fc5\u987b\u6839\u636e\u8001\u5e08\u63d0\u4f9b\u7684\u6559\u5b66\u5927\u7eb2\uff0c\u6309\u7167\u7ae0\u8282\u987a\u5e8f\uff0c\u4f9d\u6b21\u5b66\u4e60\u3002\n1. \u5b66\u751f\u53ef\u80fd\u4f1a\u63d0\u51fa\u4e00\u4e9b\u95ee\u9898\uff0c\u4f60\u65e0\u9700\u56de\u7b54\u95ee\u9898\uff0c\u800c\u662f\u6839\u636e\u4e0a\u4e0b\u6587\uff08\u6bd4\u5982\u5b66\u751f\u81ea\u5df1\u7684\u4ee3\u7801\uff09\u6765\u5206\u6790\uff0c\u5e76\u7ed9\u51fa\u4e00\u6b65\u7684\u89e3\u51b3\u65b9\u6848\u3002\n2. \u6559\u5b66\u5927\u7eb2\u4e2d\u4f1a\u6307\u660e\u6bcf\u4e2a\u7ae0\u8282\u7684\u5b66\u4e60\u76ee\u6807\uff0c\u4f60\u6309\u7167\u76ee\u6807\u5b66\u4e60\u3002\n3. \u7cfb\u7edf\u4f1aoccasionally gather\u5b66\u751f\u4fe1\u606f\uff0c\u4f60\u9700\u8981\u5206\u6790\u5b66\u751f\u5b66\u4e60\u8bb0\u5f55\uff0c\u8c03\u7528\u5fc5\u8981\u7684\u51fd\u6570\u3002\n\n## \u6ce8\u610f\u4e8b\u9879\uff1a\n1. \u786e\u4fdd\u4f7f\u7528\u5de5\u5177\u51fd\u6570\u65f6\uff0c\u63d0\u4f9b\u7684\u53c2\u6570\u7c7b\u578b\u548c\u503c\u662f\u6b63\u786e\u7684\u3002\n2. \u4e0d\u8981\u592a\u76f8\u4fe1\u81ea\u5df1\uff0c\u4f8b\u5982\uff0c\u5f53\u524d\u4f4d\u7f6e\uff0c\u5f53\u524d\u65f6\u95f4\u7b49\uff0c\u4f60\u53ef\u4ee5\u5c1d\u8bd5\u4f7f\u7528\u5de5\u5177\u51fd\u6570\u83b7\u53d6\u4fe1\u606f\u3002\n3. \u5982\u679c\u51fd\u6570\u6267\u884c\u5931\u8d25\uff0c\u4f60\u9700\u8981\u5206\u6790\u9519\u8bef\u5e76\u5c1d\u8bd5\u89e3\u51b3\u3002\n4. \u786e\u4fdd\u5b66\u751f\u63d0\u51fa\u7684\u95ee\u9898\u6216\u60f3\u6cd5\u662f\u5426\u4e0e\u5f53\u524d\u7ae0\u8282\u76f8\u5173\uff0c\u5982\u679c\u4e0d\u76f8\u5173\uff0c\u4f60\u5e94\u7b54\u5e76\u63d0\u9192\u5b66\u751f\u5173\u6ce8\u5f53\u524d\u7ae0\u8282\u3002\n\n## \u8d44\u6e90\uff1a\n1. \u4f60\u53ef\u4ee5\u4f7f\u7528\u7684\u5de5\u5177\u51fd\u6570\u3002\n2. \u4e0a\u4e0b\u6587\uff0c\u5305\u62ec\u5b66\u751f\u7684\u4ee3\u7801\uff0c\u548c\u6559\u5b66\u5927\u7eb2\u3002\n", "role": "system", "url": null, "metadata": null }, { - "id": "461938c9265547c9bd0187ece94d659d", - "timestamp": "2025-01-01 01:40:43", + "id": "b5f28da4edf74912878f3b0092f8db2f", + "timestamp": "2025-01-01 18:47:42", "name": "system", "content": "##The Chapter Chain##\n(Your Now Chapter) Chapter 1: \n\u4e8c\u5206\u662f\u4e00\u4e2a\u5f88\u7b80\u5355\u57fa\u7840\uff0c\u4f46\u5f88\u91cd\u8981\u7684\u77e5\u8bc6\u70b9\uff0c\u4e3a\u4ee5\u540e\u8bb8\u591a\u9ad8\u7ea7\u7684\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u94fa\u57ab\u3002\n\n\u4e0b\u9762\u662f\u4e00\u4e2a\u7528\u4e8c\u5206\u7684\u7b80\u5355\u573a\u666f\uff1a\n\n\u5047\u8bbe\u5c0f\u660e\u4ece0\u52301000\u4e4b\u95f4\u9009\u62e9\u4e86\u4e00\u4e2a\u6570\u5b57\u4f46\u4e0d\u544a\u8bc9\u4f60\uff0c\u4f60\u53ef\u4ee5\u4e0d\u65ad\u731c\u6d4b\u8fd9\u4e2a\u6570\uff0c\u6bcf\u6b21\u731c\u6d4b\u5c0f\u660e\u4f1a\u544a\u77e5\u4f60\u7684\u731c\u6d4b\u5f97\u8fc7\u5927\u8fd8\u662f\u8fc7\u5c0f\uff0c\u95ee\u6700\u591a\u51e0\u6b21\u5c31\u4e00\u5b9a\u80fd\u731c\u4e2d\uff1f\n\n\u7b54\u6848\u662f\u5229\u7528\u4e8c\u5206\u67e5\u627e\u7684\u539f\u7406\uff0c\u731c\u6d4b11\u6b21\u5373\u53ef\u3002\n\n1. \u5bf9\u4e8e0\u52301000\u7684\u7b54\u6848\u5907\u9009\u533a\uff0c\u731c\u6d4b\u4e2d\u4f4d\u6570500\uff0c\u5047\u8bbe\u8fc7\u5c0f\uff0c\n2. \u5219\u5bf9\u4e8e501\u52301000\u7684\u7b54\u6848\u5907\u9009\u533a\uff0c\u731c\u6d4b750\uff0c\u5047\u8bbe\u8fc7\u5927\n3. \u5219\u5bf9\u4e8e501\u5230749\u7684\u7b54\u6848\u5907\u9009\u533a\uff0c\u731c\u6d4b625\uff0c\u5047\u8bbe\u8fc7\u5c0f\uff0c\n4. \u5219\u5bf9\u4e8e626\u5230749\u533a\u95f4......\n5. \uff08688-749\uff09\n6. \uff08718-749\uff09\n7. \uff08734-749\uff09\n8. \uff08742-749\uff09\n9. \uff08746-749\uff09\n10. \uff08748-749\uff09\n11. \uff08749-749\uff09\n\n\u5728\u6700\u5dee\u7684\u60c5\u51b5\u4e0b\uff0c\u7b2c11\u6b21\u7684\u7b54\u6848\u5907\u9009\u533a\u5c31\u4e00\u5b9a\u957f\u5ea6\u4e3a1\u4e86\uff0c\u4e5f\u5c31\u662f\u5fc5\u7136\u662f\u7b54\u6848\u3002\n\n\u56e0\u6b64\u5982\u679c\u5e8f\u5217\u662f\u6709\u5e8f\u7684\uff0c\u5c31\u53ef\u4ee5\u901a\u8fc7\u4e8c\u5206\u67e5\u627e\u5feb\u901f\u5b9a\u4f4d\u6240\u9700\u8981\u7684\u6570\u636e\u3002\n\n#### \u601d\u8003\u9898\uff08\u8be2\u95eeAgent\u4ee5\u5b66\u4e60\u8ba1\u7b97\u65b9\u6cd5\uff0c\u6216\u9a8c\u8bc1\u4f60\u7684\u7b54\u6848\uff09\n\n\u5bf9\u4e8e\u4e0a\u9762\u90a3\u4e2a\u9898\u76ee\uff0c\u5982\u679c\u95ee\u9898\u533a\u95f4\u662f1\u52304000\uff0c\u6700\u5dee\u60c5\u51b5\u4e0b\u9700\u8981\u731c\u6d4b\u51e0\u6b21\uff1f\n\n\nHere are some concrete instructions:\n\n\u672c\u5c0f\u8282\u8fdb\u884c\u4e8c\u5206\u67e5\u627e\u7684\u5f15\u5165\uff0c\u9996\u5148\u5e2e\u52a9\u5b66\u751f\u7406\u89e3\u6559\u6848\u5f15\u5165\u7ae0\u8282\u7684\u6545\u4e8b\u3002\n\n\u786e\u4fdd\u5b66\u751f\u7406\u89e3\u4e86\u5f15\u5165\u540e\uff0c\u5728\u8fdb\u884c\u601d\u8003\u9898\u3002\n\n\u5982\u679c\u4e0d\u8fdb\u884c\u601d\u8003\u9898\uff0c\u5219\u8be2\u95ee\u4e00\u4e0b\u662f\u5426\u4e0d\u8fdb\u884c\u601d\u8003\u9898\uff0c\u786e\u8ba4\u540e\u8fdb\u5165\u4e0b\u4e00\u8282\u3002\n\n\u5982\u679c\u8fdb\u884c\u601d\u8003\u9898\uff0c\u544a\u77e5\u5b66\u751f\u8ba1\u7b97\u65b9\u6cd5\u5e76\u9a8c\u8bc1\u7b54\u6848\uff08\u7b54\u6848\u662f13\u6b21\uff09\n\n\u8ba1\u7b97\u65b9\u6cd5\uff1a\n\n4000\u662f\u521d\u59cb\u7b54\u6848\u533a\u95f4\u957f\u5ea6\uff0c\u6bcf\u6b21\u8be2\u95ee\u80fd\u591f\u6392\u9664\u4e00\u534a\u7684\u533a\u95f4\uff0c\u5f53\u533a\u95f4\u957f\u5ea6\u5c0f\u4e8e\u7b49\u4e8e1\u65f6\uff0c\u518d\u8fdb\u884c\u4e00\u6b21\u731c\u6d4b\u5c31\u4e00\u5b9a\u662f\u7b54\u6848\u3002\n\n4000\u4e0d\u65ad\u9664\u4ee52\uff0c\u966412\u6b21\u5c31\u5c0f\u4e8e\u7b49\u4e8e1\u4e86\uff0c\u518d\u52a0\u4e00\u6b21\u5c31\u4e00\u5b9a\u662f\u7b54\u6848\u3002\u6700\u540e\u662f12+1=13\u6b21\u3002\n\n\uff08\u6bd44000\u5927\u7684\u6700\u5c0f2\u7684\u6b21\u65b9\u6570\uff0c4096\u5c31\u662f2\u768412\u6b21\u65b9\uff0c\u8fd9\u91cc\u768412\u5c31\u662f\u7b54\u6848\u4e2d\u768412\uff0c\u6216\u8005\u5199\u4f5c\"\u4e0a\u53d6\u6574(log2(4000))\")\n\n\u8be2\u95ee\u5b66\u751f\uff0c\u5f53\u5b66\u751f\u544a\u77e5\u7406\u89e3\u540e\uff0c\u8fdb\u5165\u4e0b\u4e00\u8282\u3002\n\n\n\n\n", "role": "system", @@ -33,8 +33,8 @@ "metadata": null }, { - "id": "4d63161cb43344d79a2a27abde4a4439", - "timestamp": "2025-01-01 01:40:43", + "id": "23ac775d2b6446368059bba9636ffbdf", + "timestamp": "2025-01-01 18:47:42", "name": "user", "content": "\u7b54\u6848\u662f13\uff0clog2 4000+1", "role": "user", @@ -42,12 +42,12 @@ "metadata": null }, { - "id": "af2e4a0d68f34e61b977ee54f72acf63", - "timestamp": "2025-01-01 01:40:46", - "name": "user_342ee332-16c3-4722-a7aa-fd020088aba1", + "id": "50dc4cfcf0bd4eb7a47d818f5d7456ac", + "timestamp": "2025-01-01 18:47:45", + "name": "user_4eb13cc2-52ab-4281-ad32-83f1ccccadf7", "content": { - "thought": "\u5b66\u751f\u7406\u89e3\u4e86\u601d\u8003\u9898\u7684\u7b54\u6848\uff0c\u4e0b\u4e00\u6b65\u8fdb\u5165\u4e0b\u4e00\u8282\u3002", - "speak": "\u597d\u7684\uff0c\u4f60\u7684\u8ba1\u7b97\u65b9\u6cd5\u662f\u6b63\u786e\u7684\uff0c\u6700\u5dee\u60c5\u51b5\u4e0b\u9700\u8981\u731c\u6d4b13\u6b21\u3002\u6211\u4eec\u73b0\u5728\u53ef\u4ee5\u8fdb\u5165\u4e0b\u4e00\u8282\u3002", + "thought": "\u5b66\u751f\u5df2\u7ecf\u7406\u89e3\u4e86\u4e8c\u5206\u67e5\u627e\u7684\u601d\u8003\u9898\u548c\u8ba1\u7b97\u65b9\u6cd5\uff0c\u786e\u8ba4\u53ef\u4ee5\u8fdb\u5165\u4e0b\u4e00\u7ae0\u3002", + "speak": "\u4f60\u5df2\u7ecf\u7406\u89e3\u4e86\u8fd9\u4e2a\u95ee\u9898\u7684\u8ba1\u7b97\u65b9\u6cd5\uff0c\u7b54\u6848\u662f13\u6b21\u3002\u6211\u4eec\u53ef\u4ee5\u8fdb\u5165\u4e0b\u4e00\u8282\u5417\uff1f", "function": "[{\"name\": \"next_chapter\", \"arguments\": {}}]" }, "role": "assistant", @@ -58,6 +58,290 @@ "score": 10, "is_rebuttal": false, "rebuttal_score": 0 + }, + { + "title": "\u7ec3\u4e60\uff1a\u4e8c\u5206\u67e5\u627e", + "dialog": [ + { + "id": "ee78b4c3bc194a57b447eb6409bafd1f", + "timestamp": "2025-01-01 18:47:50", + "name": "system", + "content": "1. Execute function next_chapter\n [ARGUMENTS]:\n \n [STATUS]: SUCCESS\n [RESULT]: \u6210\u529f\u8fdb\u5165\u4e0b\u4e00\u7ae0\n", + "role": "system", + "url": null, + "metadata": null + }, + { + "id": "c22798c82f664930aa74a06834e4310a", + "timestamp": "2025-01-01 18:47:30", + "name": "system", + "content": "You're a helpful assistant.\n\n## \u4f60\u7684\u89d2\u8272\uff1a\n\u4f60\u9700\u8981\u5e2e\u52a9\u5b66\u751f\u5b66\u4e60\u7b97\u6cd5\uff0c\u68c0\u9a8c\u5b66\u4e60\u8fc7\u7a0b\uff0c\u786e\u4fdd\u5b66\u751f\u7406\u89e3\u5f53\u524d\u7ae0\u8282\u7684\u5185\u5bb9\u540e\uff0c\u5e26\u9886\u5b66\u751f\u8fdb\u5165\u4e0b\u4e00\u7ae0\n\n## \u4f60\u9700\u8981\u505a\u7684\uff1a\n0. \u4f60\u5fc5\u987b\u6839\u636e\u8001\u5e08\u63d0\u4f9b\u7684\u6559\u5b66\u5927\u7eb2\uff0c\u6309\u7167\u7ae0\u8282\u987a\u5e8f\uff0c\u4f9d\u6b21\u5b66\u4e60\u3002\n1. \u5b66\u751f\u53ef\u80fd\u4f1a\u63d0\u51fa\u4e00\u4e9b\u95ee\u9898\uff0c\u4f60\u65e0\u9700\u56de\u7b54\u95ee\u9898\uff0c\u800c\u662f\u6839\u636e\u4e0a\u4e0b\u6587\uff08\u6bd4\u5982\u5b66\u751f\u81ea\u5df1\u7684\u4ee3\u7801\uff09\u6765\u5206\u6790\uff0c\u5e76\u7ed9\u51fa\u4e00\u6b65\u7684\u89e3\u51b3\u65b9\u6848\u3002\n2. \u6559\u5b66\u5927\u7eb2\u4e2d\u4f1a\u6307\u660e\u6bcf\u4e2a\u7ae0\u8282\u7684\u5b66\u4e60\u76ee\u6807\uff0c\u4f60\u6309\u7167\u76ee\u6807\u5b66\u4e60\u3002\n3. \u7cfb\u7edf\u4f1aoccasionally gather\u5b66\u751f\u4fe1\u606f\uff0c\u4f60\u9700\u8981\u5206\u6790\u5b66\u751f\u5b66\u4e60\u8bb0\u5f55\uff0c\u8c03\u7528\u5fc5\u8981\u7684\u51fd\u6570\u3002\n\n## \u6ce8\u610f\u4e8b\u9879\uff1a\n1. \u786e\u4fdd\u4f7f\u7528\u5de5\u5177\u51fd\u6570\u65f6\uff0c\u63d0\u4f9b\u7684\u53c2\u6570\u7c7b\u578b\u548c\u503c\u662f\u6b63\u786e\u7684\u3002\n2. \u4e0d\u8981\u592a\u76f8\u4fe1\u81ea\u5df1\uff0c\u4f8b\u5982\uff0c\u5f53\u524d\u4f4d\u7f6e\uff0c\u5f53\u524d\u65f6\u95f4\u7b49\uff0c\u4f60\u53ef\u4ee5\u5c1d\u8bd5\u4f7f\u7528\u5de5\u5177\u51fd\u6570\u83b7\u53d6\u4fe1\u606f\u3002\n3. \u5982\u679c\u51fd\u6570\u6267\u884c\u5931\u8d25\uff0c\u4f60\u9700\u8981\u5206\u6790\u9519\u8bef\u5e76\u5c1d\u8bd5\u89e3\u51b3\u3002\n4. \u786e\u4fdd\u5b66\u751f\u63d0\u51fa\u7684\u95ee\u9898\u6216\u60f3\u6cd5\u662f\u5426\u4e0e\u5f53\u524d\u7ae0\u8282\u76f8\u5173\uff0c\u5982\u679c\u4e0d\u76f8\u5173\uff0c\u4f60\u5e94\u7b54\u5e76\u63d0\u9192\u5b66\u751f\u5173\u6ce8\u5f53\u524d\u7ae0\u8282\u3002\n\n## \u8d44\u6e90\uff1a\n1. \u4f60\u53ef\u4ee5\u4f7f\u7528\u7684\u5de5\u5177\u51fd\u6570\u3002\n2. \u4e0a\u4e0b\u6587\uff0c\u5305\u62ec\u5b66\u751f\u7684\u4ee3\u7801\uff0c\u548c\u6559\u5b66\u5927\u7eb2\u3002\n", + "role": "system", + "url": null, + "metadata": null + }, + { + "id": "f7a18a7080aa4dc7a4d8feb584d04e3d", + "timestamp": "2025-01-01 18:47:50", + "name": "system", + "content": "##The Chapter Chain##\n(Finished Chapter) Chapter 1: Hidden due to finished.\n(Your Now Chapter) Chapter 2: \n\u8bd5\u8bd5\u5bf9\u4e8e\u4e0b\u9762\u7684\u9898\u76ee\uff0c\u7528\u4ee3\u7801\u5b9e\u73b0\u4e00\u4e0b\u4e8c\u5206\u67e5\u627e\u3002\n\n#### \u9898\u76ee\uff1a\u6709\u5e8f\u6570\u7ec4\u5bfb\u5740\n\n\u7ed9\u51fa\u4e00\u4e2a\u957f\u5ea6\u4e3an\u7684\u6709\u5e8f\u6570\u7ec4\uff08\u4ece\u5c0f\u5230\u5927\uff09\uff0c\u6709q\u6b21\u8be2\u95ee\uff0c\u5bf9\u4e8e\u6bcf\u6b21\u8be2\u95ee\uff0c\u8f93\u51fa\u6307\u5b9a\u6570\u5728\u6570\u7ec4\u4e2d\u7684\u4e0b\u6807\u3002\u5982\u679c\u4e0d\u5b58\u5728\u5219\u8f93\u51fa-1\u3002\n\n##### \u8f93\u5165\n\n\u7b2c\u4e00\u884c\u4e00\u4e2a\u6574\u6570n\u3002(1<=n<=10^5)\n\n\u7b2c\u4e8c\u884cn\u4e2a\u7528\u7a7a\u683c\u5206\u5f00\u7684\u6574\u6570ai\u3002(0<=ai<=10^8)\n\n\u7b2c\u4e09\u884c\u4e00\u4e2a\u6574\u6570q\uff0c\u8868\u793a\u8be2\u95ee\u7684\u6b21\u6570\u3002(1<=q<=10^4)\n\n\u540eq\u884c\uff0c\u6bcf\u884c\u4e00\u4e2a\u6574\u6570b\uff0c\u8868\u793a\u8be2\u95ee\u7684\u6570\u3002(0<=b<=10^8)\n\n##### \u8f93\u51fa\n\nq\u884c\uff0c\u6bcf\u884c\u4e00\u4e2a\u6574\u6570\uff0c\u5bf9\u5e94\u6bcf\u6b21\u8be2\u95ee\u7684\u8fd4\u56de\u7ed3\u679c\u3002\n\n##### \u63d0\u793a\uff1a\n\n\u5b8c\u6210\u4ee3\u7801\u540e\uff0c\u901a\u77e5Agent\u8fdb\u884c\u8bc4\u6d4b\u3002\n\n\u5982\u679c\u4f60\u8fd8\u4e0d\u5b8c\u5168\u4f1a\u8fd9\u4e2a\u7b97\u6cd5\uff0c\u8be2\u95eeAgent\u83b7\u53d6\u63d0\u793a\u5e76\u8fdb\u884c\u5b66\u4e60\u3002\n\n\nHere are some concrete instructions:\n\n\u5982\u679c\u5b66\u751f\u5728\u5b9e\u73b0\u7684\u8fc7\u7a0b\u4e2d\u9047\u5230\u95ee\u9898\uff0c\u4e0d\u8981\u76f4\u63a5\u544a\u77e5\u5b8c\u6574\u4ee3\u7801\u5982\u4f55\u7f16\u5199\uff0c\u8be2\u95ee\u5176\u5f53\u524d\u9047\u5230\u7684\u662f\u4ec0\u4e48\u95ee\u9898\uff0c\u5e76\u5e2e\u52a9\u5b66\u751f\u4e00\u6b65\u6b65\u5b8c\u6210\u9898\u76ee\u3002\n\n\u5b9e\u73b0\u4ee3\u7801\u540e\uff0c\u5168\u90e8\u901a\u8fc7\u6d4b\u8bd5\u6570\u636e\u540e\u624d\u53ef\u4ee5\u8fdb\u5165\u4e0b\u4e00\u8282\u3002\n\n\u672c\u4f53\u6d4b\u8bd5\u70b9\u6587\u4ef6\u5939\u540d `twice_split\u3002`\n\n\n\n\n\n", + "role": "system", + "url": null, + "metadata": null + }, + { + "id": "55a91eb47a8e4f6a90f72c5b8adb62e7", + "timestamp": "2025-01-01 18:47:50", + "name": "system", + "content": "\u547d\u4ee4\u6267\u884c\u7ed3\u679c\u5982\u4e0a\uff0c\u8bf7\u603b\u7ed3\u5e76\u5f15\u5bfc\u5b66\u751f\u8fdb\u884c\u4e0b\u4e00\u6b65\u64cd\u4f5c", + "role": "system", + "url": null, + "metadata": null + }, + { + "id": "ddace8fbc1ca47dca894c3329b140a9f", + "timestamp": "2025-01-01 18:47:52", + "name": "user_4eb13cc2-52ab-4281-ad32-83f1ccccadf7", + "content": { + "thought": "\u5b66\u751f\u9700\u8981\u5b9e\u73b0\u4e8c\u5206\u67e5\u627e\uff0c\u5e76\u5728\u5b9e\u73b0\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u4f1a\u9047\u5230\u4e00\u4e9b\u95ee\u9898\u3002\u6211\u5e94\u8be5\u5f15\u5bfc\u4ed6\u4eec\u9010\u6b65\u5b8c\u6210\u8fd9\u4e2a\u7b97\u6cd5\u3002", + "speak": "\u8bf7\u5148\u5c1d\u8bd5\u5b9e\u73b0\u4e8c\u5206\u67e5\u627e\u7684\u903b\u8f91\u3002\u5982\u679c\u5728\u5b9e\u73b0\u8fc7\u7a0b\u4e2d\u9047\u5230\u95ee\u9898\uff0c\u53ef\u4ee5\u544a\u8bc9\u6211\u5177\u4f53\u662f\u4ec0\u4e48\u95ee\u9898\uff0c\u6211\u4f1a\u5e2e\u52a9\u4f60\u89e3\u51b3\u3002", + "function": [] + }, + "role": "assistant", + "url": null, + "metadata": null + }, + { + "id": "c742b1c3777d424e88f528e7240fa481", + "timestamp": "2025-01-01 18:48:29", + "name": "system", + "content": "1. Execute function judge\n [ARGUMENTS]:\n filepath: main.py\n [STATUS]: SUCCESS\n [RESULT]: (0, '\u8bc4\u6d4b\u5f97\u5206\u4e3a 0, \u5728 40 \u4e2a\u6d4b\u8bd5\u7528\u4f8b\u4e2d\u901a\u8fc7\u4e86 0\u4e2a\u3002')\n", + "role": "system", + "url": null, + "metadata": null + }, + { + "id": "0719f0912285479aaf2b2d40fa02ac98", + "timestamp": "2025-01-01 18:48:29", + "name": "system", + "content": "\u547d\u4ee4\u6267\u884c\u7ed3\u679c\u5982\u4e0a\uff0c\u8bf7\u603b\u7ed3\u5e76\u5f15\u5bfc\u5b66\u751f\u8fdb\u884c\u4e0b\u4e00\u6b65\u64cd\u4f5c", + "role": "system", + "url": null, + "metadata": null + }, + { + "id": "5518c0618077410ab32a36ecba13a3fa", + "timestamp": "2025-01-01 18:48:31", + "name": "user_4eb13cc2-52ab-4281-ad32-83f1ccccadf7", + "content": { + "thought": "\u5b66\u751f\u7684\u4e8c\u5206\u67e5\u627e\u5b9e\u73b0\u6ca1\u6709\u901a\u8fc7\u4efb\u4f55\u6d4b\u8bd5\u7528\u4f8b\uff0c\u8bf4\u660e\u4ee3\u7801\u53ef\u80fd\u5b58\u5728\u903b\u8f91\u9519\u8bef\u3002", + "speak": "\u4f60\u7684\u4ee3\u7801\u5728\u8bc4\u6d4b\u4e2d\u6ca1\u6709\u901a\u8fc7\u4efb\u4f55\u6d4b\u8bd5\u7528\u4f8b\uff0c\u53ef\u80fd\u5b58\u5728\u4e00\u4e9b\u95ee\u9898\u3002\u8bf7\u4ed4\u7ec6\u68c0\u67e5\u4f60\u7684\u4e8c\u5206\u67e5\u627e\u5b9e\u73b0\uff0c\u7279\u522b\u662f\u8fb9\u754c\u6761\u4ef6\u548c\u8fd4\u56de\u503c\u7684\u90e8\u5206\u3002\u9700\u8981\u5e2e\u52a9\u7684\u8bdd\uff0c\u53ef\u4ee5\u544a\u8bc9\u6211\u4f60\u9047\u5230\u7684\u5177\u4f53\u95ee\u9898\u3002", + "function": [] + }, + "role": "assistant", + "url": null, + "metadata": null + }, + { + "id": "4b186d3f172a4d3aaeb2481e43817922", + "timestamp": "2025-01-01 18:48:49", + "name": "user", + "content": "\u8bf7\u67e5\u770b\u6211\u7684\u4ee3\u7801\uff0c\u95ee\u9898\u5728\u4e8e\u54ea\u91cc\u5462\uff1f", + "role": "user", + "url": null, + "metadata": null + }, + { + "id": "351ace31a7984d13ab1ec11151c0aefe", + "timestamp": "2025-01-01 18:48:52", + "name": "user_4eb13cc2-52ab-4281-ad32-83f1ccccadf7", + "content": { + "thought": "\u9700\u8981\u67e5\u770b\u5b66\u751f\u7684\u4ee3\u7801\uff0c\u4ee5\u5e2e\u52a9\u4ed6\u4eec\u89e3\u51b3\u95ee\u9898\u3002", + "speak": "\u8ba9\u6211\u5148\u67e5\u770b\u4f60\u7684\u4ee3\u7801\u5185\u5bb9\uff0c\u7136\u540e\u6211\u4f1a\u7ed9\u51fa\u5177\u4f53\u7684\u53cd\u9988\u548c\u5efa\u8bae\u3002", + "function": [ + { + "name": "read_file", + "arguments": { + "filepath": "/home/caikecheng/algoAgent/study/cake/algorithm/binary_search/main.py" + } + } + ] + }, + "role": "assistant", + "url": null, + "metadata": null + }, + { + "id": "71da76256284416cbd6e19a62355d507", + "timestamp": "2025-01-01 18:48:53", + "name": "system", + "content": "1. Execute function read_file\n [ARGUMENTS]:\n filepath: /home/caikecheng/algoAgent/study/cake/algorithm/binary_search/main.py\n [STATUS]: SUCCESS\n [RESULT]: ```\ndef binary_search(arr, target):\n left, right = 0, len(arr) - 1\n while left <= right:\n mid = left + (right - left) // 2\n if arr[mid] == target:\n return mid\n elif arr[mid] < target:\n left = mid + 1\n else:\n right = mid - 1\n return -1\n\nif __name__ == '__main__':\n sorted_array = list(map(int, input(\"\u8f93\u5165\u6570\u636e\").split()))\n target_value = int(input())\n result = binary_search(sorted_array, target_value)\n print(result)```\n\n", + "role": "system", + "url": null, + "metadata": null + }, + { + "id": "a7b7256bddbc4b51a0828578008fa1fc", + "timestamp": "2025-01-01 18:48:53", + "name": "system", + "content": "\u547d\u4ee4\u6267\u884c\u7ed3\u679c\u5982\u4e0a\uff0c\u8bf7\u603b\u7ed3\u5e76\u5f15\u5bfc\u5b66\u751f\u8fdb\u884c\u4e0b\u4e00\u6b65\u64cd\u4f5c", + "role": "system", + "url": null, + "metadata": null + }, + { + "id": "b2ee66aabdeb40709c5c884df6f268cb", + "timestamp": "2025-01-01 18:48:55", + "name": "user_4eb13cc2-52ab-4281-ad32-83f1ccccadf7", + "content": { + "thought": "\u5b66\u751f\u7684\u4ee3\u7801\u5b9e\u73b0\u4e86\u4e8c\u5206\u67e5\u627e\u7684\u529f\u80fd\uff0c\u4f46\u5728\u8bfb\u53d6\u8f93\u5165\u548c\u6267\u884c\u591a\u6b21\u67e5\u8be2\u65f6\u8fd8\u6709\u95ee\u9898\u3002", + "speak": "\u4f60\u7684\u4e8c\u5206\u67e5\u627e\u51fd\u6570\u662f\u6b63\u786e\u7684\uff0c\u4f46\u5728\u4e3b\u7a0b\u5e8f\u4e2d\u4f60\u53ea\u8bfb\u53d6\u4e86\u4e00\u6b21\u8f93\u5165\uff0c\u4e14\u6ca1\u6709\u8fdb\u884c\u591a\u6b21\u67e5\u8be2\u5904\u7406\u3002\u4f60\u9700\u8981\u5148\u8bfb\u53d6\u6709\u5e8f\u6570\u7ec4\u7684\u957f\u5ea6\uff0c\u518d\u8bfb\u53d6\u6570\u7ec4\u5143\u7d20\uff0c\u63a5\u7740\u8bfb\u53d6\u67e5\u8be2\u6b21\u6570\u5e76\u5bf9\u6bcf\u4e2a\u67e5\u8be2\u8fdb\u884c\u5904\u7406\u3002\u8bf7\u5c1d\u8bd5\u4fee\u6539\u4f60\u7684\u4ee3\u7801\u4ee5\u652f\u6301\u591a\u4e2a\u67e5\u8be2\uff0c\u5e76\u786e\u4fdd\u8f93\u51fa\u6bcf\u6b21\u67e5\u8be2\u7684\u7ed3\u679c\u3002", + "function": [] + }, + "role": "assistant", + "url": null, + "metadata": null + }, + { + "id": "6fb06d9423464751999e735993fc7603", + "timestamp": "2025-01-01 18:49:19", + "name": "user", + "content": "\u6211\u5df2\u7ecf\u4fee\u6539\u4e86\uff0c\u8bf7\u518d\u8bc4\u6d4b\u4e00\u4e0b", + "role": "user", + "url": null, + "metadata": null + }, + { + "id": "4017e2d8ca9e4458bb44861e9899ba6b", + "timestamp": "2025-01-01 18:49:22", + "name": "user_4eb13cc2-52ab-4281-ad32-83f1ccccadf7", + "content": { + "thought": "\u5b66\u751f\u5df2\u7ecf\u505a\u4e86\u4fee\u6539\uff0c\u73b0\u5728\u9700\u8981\u5bf9\u4ed6\u4eec\u7684\u4ee3\u7801\u8fdb\u884c\u91cd\u65b0\u8bc4\u6d4b\u3002", + "speak": "\u597d\u7684\uff0c\u8ba9\u6211\u6765\u8bc4\u6d4b\u4f60\u7684\u4ee3\u7801\uff0c\u770b\u770b\u5b83\u662f\u5426\u80fd\u901a\u8fc7\u6d4b\u8bd5\u7528\u4f8b\u3002", + "function": [ + { + "name": "judge", + "arguments": { + "filepath": "/home/caikecheng/algoAgent/study/cake/algorithm/binary_search/main.py" + } + } + ] + }, + "role": "assistant", + "url": null, + "metadata": null + }, + { + "id": "b38cd9699d2e41169237621858ca32e5", + "timestamp": "2025-01-01 18:49:23", + "name": "system", + "content": "1. Execute function judge\n [ARGUMENTS]:\n filepath: /home/caikecheng/algoAgent/study/cake/algorithm/binary_search/main.py\n [STATUS]: SUCCESS\n [RESULT]: (100, '\u8bc4\u6d4b\u5f97\u5206\u4e3a 100, \u5728 40 \u4e2a\u6d4b\u8bd5\u7528\u4f8b\u4e2d\u901a\u8fc7\u4e86 40\u4e2a\u3002')\n", + "role": "system", + "url": null, + "metadata": null + }, + { + "id": "d39f4b43f0024a7eb14d8b760d847be5", + "timestamp": "2025-01-01 18:49:23", + "name": "system", + "content": "\u547d\u4ee4\u6267\u884c\u7ed3\u679c\u5982\u4e0a\uff0c\u8bf7\u603b\u7ed3\u5e76\u5f15\u5bfc\u5b66\u751f\u8fdb\u884c\u4e0b\u4e00\u6b65\u64cd\u4f5c", + "role": "system", + "url": null, + "metadata": null + }, + { + "id": "8192e17189b446978c6f1576d68942b1", + "timestamp": "2025-01-01 18:49:25", + "name": "user_4eb13cc2-52ab-4281-ad32-83f1ccccadf7", + "content": { + "thought": "\u5b66\u751f\u7684\u4ee3\u7801\u5df2\u7ecf\u6210\u529f\u901a\u8fc7\u4e86\u6240\u6709\u6d4b\u8bd5\u7528\u4f8b\uff0c\u8bf4\u660e\u4ed6\u4eec\u7684\u5b9e\u73b0\u662f\u6b63\u786e\u7684\u3002", + "speak": "\u606d\u559c\u4f60\uff01\u4f60\u7684\u4ee3\u7801\u5728\u8bc4\u6d4b\u4e2d\u5df2\u7ecf\u901a\u8fc7\u4e86\u6240\u6709\u6d4b\u8bd5\u7528\u4f8b\u3002\u73b0\u5728\u6211\u4eec\u53ef\u4ee5\u8fdb\u5165\u4e0b\u4e00\u7ae0\u5b66\u4e60\u65b0\u7684\u5185\u5bb9\u4e86\u3002", + "function": [ + { + "name": "next_chapter", + "arguments": {} + } + ] + }, + "role": "assistant", + "url": null, + "metadata": null + }, + { + "id": "be629f2384b0456bba664a6ec6aa550c", + "timestamp": "2025-01-01 18:49:32", + "name": "user", + "content": "\u8fdb\u5165\u4e0b\u4e00\u7ae0", + "role": "user", + "url": null, + "metadata": null + }, + { + "id": "7c508c59ded24fd6bf3fd7731c6c626e", + "timestamp": "2025-01-01 18:49:34", + "name": "user_4eb13cc2-52ab-4281-ad32-83f1ccccadf7", + "content": { + "thought": "\u6210\u529f\u8fdb\u5165\u4e0b\u4e00\u7ae0\uff0c\u63a5\u4e0b\u6765\u5b66\u751f\u5c06\u5b66\u4e60\u65b0\u7684\u5185\u5bb9\u3002", + "speak": "\u6211\u4eec\u5df2\u7ecf\u6210\u529f\u8fdb\u5165\u4e0b\u4e00\u7ae0\u3002\u8bf7\u51c6\u5907\u597d\u5b66\u4e60\u63a5\u4e0b\u6765\u7684\u7b97\u6cd5\u5185\u5bb9\uff01", + "function": [] + }, + "role": "assistant", + "url": null, + "metadata": null + }, + { + "id": "1fd1633a4e8540ab94952833e4b39ec8", + "timestamp": "2025-01-01 18:49:44", + "name": "user", + "content": "\u8fdb\u5165\u4e0b\u4e00\u7ae0", + "role": "user", + "url": null, + "metadata": null + }, + { + "id": "5964823bd2584d44ae8a3cbff51986c9", + "timestamp": "2025-01-01 18:49:46", + "name": "user_4eb13cc2-52ab-4281-ad32-83f1ccccadf7", + "content": { + "thought": "\u5df2\u7ecf\u8fdb\u5165\u4e0b\u4e00\u7ae0\uff0c\u5b66\u751f\u51c6\u5907\u5b66\u4e60\u65b0\u7684\u5185\u5bb9\u3002", + "speak": "\u6211\u4eec\u73b0\u5728\u5df2\u7ecf\u8fdb\u5165\u4e86\u4e0b\u4e00\u7ae0\uff0c\u8bf7\u51c6\u5907\u597d\u63a5\u53d7\u65b0\u7684\u7b97\u6cd5\u6311\u6218\uff01", + "function": [] + }, + "role": "assistant", + "url": null, + "metadata": null + }, + { + "id": "b4e1e59bf45640acb8d2c30bd46446b9", + "timestamp": "2025-01-01 18:49:55", + "name": "user", + "content": "\u8c03\u7528next_chapter\u547d\u4ee4", + "role": "user", + "url": null, + "metadata": null + }, + { + "id": "4547da79875d4e7fac620dd1c4001027", + "timestamp": "2025-01-01 18:49:57", + "name": "user_4eb13cc2-52ab-4281-ad32-83f1ccccadf7", + "content": { + "thought": "\u5b66\u751f\u8bf7\u6c42\u8fdb\u5165\u4e0b\u4e00\u7ae0\uff0c\u73b0\u5728\u9700\u8981\u6267\u884c\u76f8\u5173\u547d\u4ee4\u3002", + "speak": "\u6211\u5c06\u5e26\u4f60\u8fdb\u5165\u4e0b\u4e00\u7ae0\uff0c\u8bf7\u7a0d\u7b49\u3002", + "function": [ + { + "name": "next_chapter", + "arguments": {} + } + ] + }, + "role": "assistant", + "url": null, + "metadata": null + } + ], + "score": 35, + "is_rebuttal": false, + "rebuttal_score": 0 } ], "binary_search" diff --git a/Html/db/user.py b/Html/db/user.py index c389fc8..5ceb16b 100644 --- a/Html/db/user.py +++ b/Html/db/user.py @@ -2,7 +2,7 @@ import os # Example usage: import json from datetime import datetime - +import copy LOCAL_USER_DATA_DIR = "data/user/" # only use locally, not for other .py files class User: @@ -88,6 +88,19 @@ class User: 'course_process_dict': self.course_process_dict } + def to_json_without_dialog(self): + course_dict = copy.deepcopy(self.course_process_dict) + for course_id in course_dict.keys(): + for lep,lid in course_dict[course_id]['lesson_processs']: + for chapter_info in lep: + chapter_info['dialog']=[] + return json.dumps({ + 'user_id': self.user_id, + 'select_course': self.select_course, + 'head_icon': self.head_icon, + 'course_process_dict': course_dict + }, indent=1) + def to_json(self): return json.dumps(self.__json__(), indent=4) diff --git a/Html/static/css/desktop.css b/Html/static/css/desktop.css index 1694649..eb5d5fc 100644 --- a/Html/static/css/desktop.css +++ b/Html/static/css/desktop.css @@ -211,3 +211,88 @@ max-width: 200px; } +.button { + display: flex; + align-items: center; + padding: 15px; + border-bottom: 1px solid #eee; + cursor: pointer; + transition: background-color 0.3s ease; +} +.button:hover { + background-color: #f0f0f0; +} +.close-button { + width: auto; + height: auto; + text-align: center; + padding: 5px; + padding-bottom: 2px; + padding-top: 2px; + border-radius: 5px; +} +/* 新增的侧边工具栏样式 */ +.sidebar-tools { + position: fixed; + top: 50%; + transform: translateY(-50%); + right: -250px; /* 初始隐藏 */ + width: 250px; + background-color: #fff; + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); + border-radius: 10px 0 0 10px; + transition: right 0.3s ease-in-out; + z-index: 1000; +} +.sidebar-tools.open { + right: 0; +} +.sidebar-tools .tool-button { + display: flex; + align-items: center; + padding: 15px; + border-bottom: 1px solid #eee; + cursor: pointer; + transition: background-color 0.3s ease; +} +.sidebar-tools .tool-button:hover { + background-color: #f0f0f0; +} +.sidebar-tools .tool-button .icon { + width: 30px; + height: 30px; + margin-right: 10px; + background-color: #007bff; + border-radius: 5px; + display: flex; + align-items: center; + justify-content: center; + color: #fff; +} +.sidebar-tools .tool-button .description { + flex-grow: 1; +} +.toggle-button { + position: fixed; + top: 50%; + transform: translateY(-50%); + right: -10px; /* 初始隐藏 */ + width: 50px; + height: 50px; + background-color: #007bff; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + color: #fff; + cursor: pointer; + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); + transition: right 0.3s ease-in-out; + z-index: 1001; +} +.toggle-button.open { + right: 250px; +} +.toggle-button .icon { + font-size: 20px; +} \ No newline at end of file diff --git a/Html/static/image/CS101/CS101.png b/Html/static/image/CS101/CS101.png new file mode 100644 index 0000000000000000000000000000000000000000..b529ce4636eb723aa7a32de1ddb63a08c6dfc880 GIT binary patch literal 19330 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 JnS@dB{{aDNVt@bu literal 0 HcmV?d00001 diff --git a/Html/static/js/chatbox.js b/Html/static/js/chatbox.js index b6b492b..35612c4 100644 --- a/Html/static/js/chatbox.js +++ b/Html/static/js/chatbox.js @@ -1,5 +1,6 @@ var socket; +let system_message_idx=0 document.addEventListener('DOMContentLoaded', function() { data = window.appData; console.log(data); @@ -12,7 +13,7 @@ document.addEventListener('DOMContentLoaded', function() { socket.on('message', function(data) { // 显示服务器的回复消息 const serverMessage = document.createElement('div'); - serverMessage.innerHTML = `

`; + serverMessage.innerHTML = `
华实君: ${marked.parse(data)}
`; document.getElementById('chatbox').appendChild(serverMessage); // 滚动到最新消息 @@ -32,7 +33,7 @@ document.addEventListener('DOMContentLoaded', function() { approveButton.innerText = '批准'; approveButton.data = element; approveButton.style.width = '100%'; - approveButton.style.maxHeight = '30px'; + approveButton.style.borderRadius = '4px'; approveButton.onclick = function(event) { console.log(element) socket.emit('message', JSON.stringify({type:'function', data:element})); @@ -65,7 +66,33 @@ document.addEventListener('DOMContentLoaded', function() { document.getElementById('chatbox').appendChild(scoreMessage); document.getElementById('chatbox').scrollTop = document.getElementById('chatbox').scrollHeight; }) - + socket.on('system_message',function(data){ + console.log(data) + let systemMessage = document.createElement('div'); + systemMessage.className = 'chat-message server-message'; + let closeButton = document.createElement('button'); + closeButton.className = 'close-button'; // 可以根据需要添加样式类 + closeButton.innerHTML = '×'; // 关闭按钮的文本内容 + closeButton.style.marginRight = '10px'; // 可选:设置关闭按钮的右边距 + + systemMessage.appendChild(closeButton); + systemMessage.innerHTML += `系统提示: ${data}`; + systemMessage.id = 'system_message_'+system_message_idx; + system_message_idx+=1 + document.getElementById('chatbox').appendChild(systemMessage); + document.getElementById('chatbox').scrollTop = document.getElementById('chatbox').scrollHeight; + $('.close-button').on('click', function(event) { + $(this).css({ + 'background-color': 'gray', + 'color': 'white', // 可选:设置文字颜色为白色,以便更清晰地显示 + 'border': 'none' // 可选:去掉边框 + }); + $(this).parent().remove(); + }); + setTimeout(function() { + $(systemMessage.id).remove(); + }, 5000); // 5000 毫秒 = 5 秒 + }) }); @@ -106,7 +133,9 @@ chineseRadio.addEventListener('change', function() { }); - +function sendInitiativeFunctionCall(function_name){ + socket.emit('initiative', {'name': function_name}); +} // 发送消息 function sendMessage() { const input = document.getElementById('messageInput').value; diff --git a/Html/templates/desktop.html b/Html/templates/desktop.html index 3a115df..accf0ef 100644 --- a/Html/templates/desktop.html +++ b/Html/templates/desktop.html @@ -14,6 +14,7 @@ +
@@ -68,10 +69,36 @@ chapter_id:"{{chapter_id}}" } -
+ + + + + +
+
+
+ + diff --git a/cake/binary_search/.config b/cake/binary_search/.config deleted file mode 100644 index b32515a..0000000 --- a/cake/binary_search/.config +++ /dev/null @@ -1,2 +0,0 @@ -user_id=cake -path=binary_search \ No newline at end of file diff --git a/cake/binary_search/binarySearch.py b/cake/binary_search/binarySearch.py deleted file mode 100644 index 90545a5..0000000 --- a/cake/binary_search/binarySearch.py +++ /dev/null @@ -1,6 +0,0 @@ -n = int(input()) -array = list(map(int, input().split())) -q = int(input()) -while q!=0: - q-=1 - \ No newline at end of file diff --git a/cake/bootstrap.min.css.map/.config b/cake/bootstrap.min.css.map/.config deleted file mode 100644 index 7716b86..0000000 --- a/cake/bootstrap.min.css.map/.config +++ /dev/null @@ -1,2 +0,0 @@ -user_id=cake -path=bootstrap.min.css.map \ No newline at end of file diff --git a/cake/folder/.config b/cake/folder/.config deleted file mode 100644 index b89ccf4..0000000 --- a/cake/folder/.config +++ /dev/null @@ -1,4 +0,0 @@ -{ - "user_id": "cake", - "path": "folder" -} diff --git a/cake/folder/1 b/cake/folder/1 deleted file mode 100644 index e69de29..0000000 diff --git a/cake/folder/123 b/cake/folder/123 deleted file mode 100644 index e69de29..0000000 diff --git a/cake/folder/infolder/1 b/cake/folder/infolder/1 deleted file mode 100644 index e69de29..0000000 diff --git a/cake/folder/main.py b/cake/folder/main.py deleted file mode 100644 index 7b57bd1..0000000 --- a/cake/folder/main.py +++ /dev/null @@ -1 +0,0 @@ -1 \ No newline at end of file diff --git a/cake/twice_split/.config b/cake/twice_split/.config deleted file mode 100644 index f65d3e5..0000000 --- a/cake/twice_split/.config +++ /dev/null @@ -1,2 +0,0 @@ -user_id=cake -path=twice_split \ No newline at end of file diff --git a/wget-log b/wget-log new file mode 100644 index 0000000..3785c08 --- /dev/null +++ b/wget-log @@ -0,0 +1,6 @@ +--2024-12-28 17:22:43-- https://objects.githubusercontent.com/github-production-release-asset-2e65be/172953845/6875198c-d2cb-49ac-acb8-ad936f434d57?X-Amz-Algorithm=AWS4-HMAC-SHA256 +Resolving objects.githubusercontent.com (objects.githubusercontent.com)... 185.199.110.133, 185.199.108.133, 185.199.111.133, ... +Connecting to objects.githubusercontent.com (objects.githubusercontent.com)|185.199.110.133|:443... connected. +HTTP request sent, awaiting response... 401 Unauthorized + +Username/Password Authentication Failed.