import json import os from prompt.react import ReAct QWEN_TOOLS_LIST = [ { 'name_for_human': '代码解释器', 'name_for_model': 'code_interpreter', 'description_for_model': '代码解释器,可用于执行Python代码。', 'parameters': [{ 'name': 'code', 'type': 'string', 'description': '待执行的代码' }], 'args_format': 'code' }, ] TOOL_DESC = """{name_for_model}: Call this tool to interact with the {name_for_human} API. What is the {name_for_human} API useful for? {description_for_model} Parameters: {parameters}""" class QwenReAct(ReAct): def __init__(self, query, lang='en', upload_file_paths=[]): super().__init__(query, lang, upload_file_paths) self.upload_file_paths = [ f'{os.path.basename(fname)}' for fname in upload_file_paths ] self.list_of_plugin_info = QWEN_TOOLS_LIST self.fname_template = { 'zh': '[上传文件{fname_str}]', 'en': '[Upload file {fname_str}]', 'en_multi': '[Upload file {fname_str}]' } def build_prompt(self): im_start = '<|im_start|>' im_end = '<|im_end|>' prompt = f'{im_start}system\nYou are a helpful assistant.{im_end}' query = super().build_prompt() query = query.lstrip('\n').rstrip() prompt += f'\n{im_start}user\n{query}{im_end}' if f'{im_start}assistant' not in query: prompt += f'\n{im_start}assistant\n{im_end}' assert prompt.endswith(f'\n{im_start}assistant\n{im_end}') prompt = prompt[:-len(f'{im_end}')] self.prompt = prompt return prompt def _build_tools_text(self): # tool info tools_text = [] for plugin_info in self.list_of_plugin_info: tool = TOOL_DESC.format( name_for_model=plugin_info['name_for_model'], name_for_human=plugin_info['name_for_human'], description_for_model=plugin_info['description_for_model'], parameters=json.dumps(plugin_info['parameters'], ensure_ascii=False), ) if plugin_info.get('args_format', 'json') == 'json': tool += ' Format the arguments as a JSON object.' elif plugin_info['args_format'] == 'code': tool += ' Enclose the code within triple backticks (`) at the beginning and end of the code.' else: raise NotImplementedError tools_text.append(tool) tools_text = '\n\n'.join(tools_text) return tools_text def _build_tools_name_text(self): return ', '.join([ plugin_info['name_for_model'] for plugin_info in self.list_of_plugin_info ])