Merge pull request #502 from mrhblfx/new_code_fun
解析项目源代码(手动指定和筛选源代码文件类型)
This commit is contained in:
		
						commit
						7d14de79bf
					
				@ -197,5 +197,16 @@ def get_crazy_functions():
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    from crazy_functions.解析项目源代码 import 解析任意code项目
 | 
				
			||||||
 | 
					    function_plugins.update({
 | 
				
			||||||
 | 
					        "解析项目源代码(手动指定和筛选源代码文件类型)": {
 | 
				
			||||||
 | 
					            "Color": "stop",
 | 
				
			||||||
 | 
					            "AsButton": False,
 | 
				
			||||||
 | 
					            "AdvancedArgs": True, # 调用时,唤起高级参数输入区(默认False)
 | 
				
			||||||
 | 
					            "ArgsReminder": "输入时用逗号隔开, *代表通配符, 加了^代表不匹配; 不输入代表全部匹配。例如: \"*.c, ^*.cpp, config.toml, ^*.toml\"", # 高级参数输入区的显示提示
 | 
				
			||||||
 | 
					            "Function": HotReload(解析任意code项目)
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					    })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ###################### 第n组插件 ###########################
 | 
					    ###################### 第n组插件 ###########################
 | 
				
			||||||
    return function_plugins
 | 
					    return function_plugins
 | 
				
			||||||
 | 
				
			|||||||
@ -264,3 +264,44 @@ def 解析一个CSharp项目(txt, llm_kwargs, plugin_kwargs, chatbot, history, s
 | 
				
			|||||||
        yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
 | 
					        yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
 | 
				
			||||||
        return
 | 
					        return
 | 
				
			||||||
    yield from 解析源代码新(file_manifest, project_folder, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt)
 | 
					    yield from 解析源代码新(file_manifest, project_folder, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@CatchException
 | 
				
			||||||
 | 
					def 解析任意code项目(txt, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt, web_port):
 | 
				
			||||||
 | 
					    txt_pattern = plugin_kwargs.get("advanced_arg")
 | 
				
			||||||
 | 
					    txt_pattern = txt_pattern.replace(",", ",")
 | 
				
			||||||
 | 
					    # 将要匹配的模式(例如: *.c, *.cpp, *.py, config.toml)
 | 
				
			||||||
 | 
					    pattern_include = [_.lstrip(" ,").rstrip(" ,") for _ in txt_pattern.split(",") if _ != "" and not _.strip().startswith("^")]
 | 
				
			||||||
 | 
					    if not pattern_include: pattern_include = ["*"] # 不输入即全部匹配
 | 
				
			||||||
 | 
					    # 将要忽略匹配的文件后缀(例如: ^*.c, ^*.cpp, ^*.py)
 | 
				
			||||||
 | 
					    pattern_except_suffix = [_.lstrip(" ^*.,").rstrip(" ,") for _ in txt_pattern.split(" ") if _ != "" and _.strip().startswith("^*.")]
 | 
				
			||||||
 | 
					    pattern_except_suffix += ['zip', 'rar', '7z', 'tar', 'gz'] # 避免解析压缩文件
 | 
				
			||||||
 | 
					    # 将要忽略匹配的文件名(例如: ^README.md)
 | 
				
			||||||
 | 
					    pattern_except_name = [_.lstrip(" ^*,").rstrip(" ,").replace(".", "\.") for _ in txt_pattern.split(" ") if _ != "" and _.strip().startswith("^") and not _.strip().startswith("^*.")]
 | 
				
			||||||
 | 
					    # 生成正则表达式
 | 
				
			||||||
 | 
					    pattern_except = '/[^/]+\.(' + "|".join(pattern_except_suffix) + ')$'
 | 
				
			||||||
 | 
					    pattern_except += '|/(' + "|".join(pattern_except_name) + ')$' if pattern_except_name != [] else ''
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    history.clear()
 | 
				
			||||||
 | 
					    import glob, os, re
 | 
				
			||||||
 | 
					    if os.path.exists(txt):
 | 
				
			||||||
 | 
					        project_folder = txt
 | 
				
			||||||
 | 
					    else:
 | 
				
			||||||
 | 
					        if txt == "": txt = '空空如也的输入栏'
 | 
				
			||||||
 | 
					        report_execption(chatbot, history, a = f"解析项目: {txt}", b = f"找不到本地项目或无权访问: {txt}")
 | 
				
			||||||
 | 
					        yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
 | 
				
			||||||
 | 
					        return
 | 
				
			||||||
 | 
					    # 若上传压缩文件, 先寻找到解压的文件夹路径, 从而避免解析压缩文件
 | 
				
			||||||
 | 
					    maybe_dir = [f for f in glob.glob(f'{project_folder}/*') if os.path.isdir(f)]
 | 
				
			||||||
 | 
					    if len(maybe_dir)>0 and maybe_dir[0].endswith('.extract'):
 | 
				
			||||||
 | 
					        extract_folder_path = maybe_dir[0]
 | 
				
			||||||
 | 
					    else:
 | 
				
			||||||
 | 
					        extract_folder_path = project_folder
 | 
				
			||||||
 | 
					    # 按输入的匹配模式寻找上传的非压缩文件和已解压的文件
 | 
				
			||||||
 | 
					    file_manifest = [f for pattern in pattern_include for f in glob.glob(f'{extract_folder_path}/**/{pattern}', recursive=True) if "" != extract_folder_path and \
 | 
				
			||||||
 | 
					                      os.path.isfile(f) and (not re.search(pattern_except, f) or pattern.endswith('.' + re.search(pattern_except, f).group().split('.')[-1]))]
 | 
				
			||||||
 | 
					    if len(file_manifest) == 0:
 | 
				
			||||||
 | 
					        report_execption(chatbot, history, a = f"解析项目: {txt}", b = f"找不到任何文件: {txt}")
 | 
				
			||||||
 | 
					        yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
 | 
				
			||||||
 | 
					        return
 | 
				
			||||||
 | 
					    yield from 解析源代码新(file_manifest, project_folder, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt)
 | 
				
			||||||
							
								
								
									
										23
									
								
								main.py
									
									
									
									
									
								
							
							
						
						
									
										23
									
								
								main.py
									
									
									
									
									
								
							@ -88,9 +88,12 @@ def main():
 | 
				
			|||||||
                    with gr.Row():
 | 
					                    with gr.Row():
 | 
				
			||||||
                        with gr.Accordion("更多函数插件", open=True):
 | 
					                        with gr.Accordion("更多函数插件", open=True):
 | 
				
			||||||
                            dropdown_fn_list = [k for k in crazy_fns.keys() if not crazy_fns[k].get("AsButton", True)]
 | 
					                            dropdown_fn_list = [k for k in crazy_fns.keys() if not crazy_fns[k].get("AsButton", True)]
 | 
				
			||||||
                            with gr.Column(scale=1):
 | 
					                            with gr.Row():
 | 
				
			||||||
                                dropdown = gr.Dropdown(dropdown_fn_list, value=r"打开插件列表", label="").style(container=False)
 | 
					                                dropdown = gr.Dropdown(dropdown_fn_list, value=r"打开插件列表", label="").style(container=False)
 | 
				
			||||||
                            with gr.Column(scale=1):
 | 
					                            with gr.Row():
 | 
				
			||||||
 | 
					                                plugin_advanced_arg = gr.Textbox(show_label=True, label="高级参数输入区", visible=False, 
 | 
				
			||||||
 | 
					                                                                 placeholder="这里是特殊函数插件的高级参数输入区").style(container=False)
 | 
				
			||||||
 | 
					                            with gr.Row():
 | 
				
			||||||
                                switchy_bt = gr.Button(r"请先从插件列表中选择", variant="secondary")
 | 
					                                switchy_bt = gr.Button(r"请先从插件列表中选择", variant="secondary")
 | 
				
			||||||
                    with gr.Row():
 | 
					                    with gr.Row():
 | 
				
			||||||
                        with gr.Accordion("点击展开“文件上传区”。上传本地文件可供红色函数插件调用。", open=False) as area_file_up:
 | 
					                        with gr.Accordion("点击展开“文件上传区”。上传本地文件可供红色函数插件调用。", open=False) as area_file_up:
 | 
				
			||||||
@ -100,7 +103,7 @@ def main():
 | 
				
			|||||||
                    top_p = gr.Slider(minimum=-0, maximum=1.0, value=1.0, step=0.01,interactive=True, label="Top-p (nucleus sampling)",)
 | 
					                    top_p = gr.Slider(minimum=-0, maximum=1.0, value=1.0, step=0.01,interactive=True, label="Top-p (nucleus sampling)",)
 | 
				
			||||||
                    temperature = gr.Slider(minimum=-0, maximum=2.0, value=1.0, step=0.01, interactive=True, label="Temperature",)
 | 
					                    temperature = gr.Slider(minimum=-0, maximum=2.0, value=1.0, step=0.01, interactive=True, label="Temperature",)
 | 
				
			||||||
                    max_length_sl = gr.Slider(minimum=256, maximum=4096, value=512, step=1, interactive=True, label="Local LLM MaxLength",)
 | 
					                    max_length_sl = gr.Slider(minimum=256, maximum=4096, value=512, step=1, interactive=True, label="Local LLM MaxLength",)
 | 
				
			||||||
                    checkboxes = gr.CheckboxGroup(["基础功能区", "函数插件区", "底部输入区", "输入清除键"], value=["基础功能区", "函数插件区"], label="显示/隐藏功能区")
 | 
					                    checkboxes = gr.CheckboxGroup(["基础功能区", "函数插件区", "底部输入区", "输入清除键", "插件参数区"], value=["基础功能区", "函数插件区"], label="显示/隐藏功能区")
 | 
				
			||||||
                    md_dropdown = gr.Dropdown(AVAIL_LLM_MODELS, value=LLM_MODEL, label="更换LLM模型/请求源").style(container=False)
 | 
					                    md_dropdown = gr.Dropdown(AVAIL_LLM_MODELS, value=LLM_MODEL, label="更换LLM模型/请求源").style(container=False)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    gr.Markdown(description)
 | 
					                    gr.Markdown(description)
 | 
				
			||||||
@ -122,11 +125,12 @@ def main():
 | 
				
			|||||||
            ret.update({area_input_secondary: gr.update(visible=("底部输入区" in a))})
 | 
					            ret.update({area_input_secondary: gr.update(visible=("底部输入区" in a))})
 | 
				
			||||||
            ret.update({clearBtn: gr.update(visible=("输入清除键" in a))})
 | 
					            ret.update({clearBtn: gr.update(visible=("输入清除键" in a))})
 | 
				
			||||||
            ret.update({clearBtn2: gr.update(visible=("输入清除键" in a))})
 | 
					            ret.update({clearBtn2: gr.update(visible=("输入清除键" in a))})
 | 
				
			||||||
 | 
					            ret.update({plugin_advanced_arg: gr.update(visible=("插件参数区" in a))})
 | 
				
			||||||
            if "底部输入区" in a: ret.update({txt: gr.update(value="")})
 | 
					            if "底部输入区" in a: ret.update({txt: gr.update(value="")})
 | 
				
			||||||
            return ret
 | 
					            return ret
 | 
				
			||||||
        checkboxes.select(fn_area_visibility, [checkboxes], [area_basic_fn, area_crazy_fn, area_input_primary, area_input_secondary, txt, txt2, clearBtn, clearBtn2] )
 | 
					        checkboxes.select(fn_area_visibility, [checkboxes], [area_basic_fn, area_crazy_fn, area_input_primary, area_input_secondary, txt, txt2, clearBtn, clearBtn2, plugin_advanced_arg] )
 | 
				
			||||||
        # 整理反复出现的控件句柄组合
 | 
					        # 整理反复出现的控件句柄组合
 | 
				
			||||||
        input_combo = [cookies, max_length_sl, md_dropdown, txt, txt2, top_p, temperature, chatbot, history, system_prompt]
 | 
					        input_combo = [cookies, max_length_sl, md_dropdown, txt, txt2, top_p, temperature, chatbot, history, system_prompt, plugin_advanced_arg]
 | 
				
			||||||
        output_combo = [cookies, chatbot, history, status]
 | 
					        output_combo = [cookies, chatbot, history, status]
 | 
				
			||||||
        predict_args = dict(fn=ArgsGeneralWrapper(predict), inputs=input_combo, outputs=output_combo)
 | 
					        predict_args = dict(fn=ArgsGeneralWrapper(predict), inputs=input_combo, outputs=output_combo)
 | 
				
			||||||
        # 提交按钮、重置按钮
 | 
					        # 提交按钮、重置按钮
 | 
				
			||||||
@ -153,8 +157,13 @@ def main():
 | 
				
			|||||||
        # 函数插件-下拉菜单与随变按钮的互动
 | 
					        # 函数插件-下拉菜单与随变按钮的互动
 | 
				
			||||||
        def on_dropdown_changed(k):
 | 
					        def on_dropdown_changed(k):
 | 
				
			||||||
            variant = crazy_fns[k]["Color"] if "Color" in crazy_fns[k] else "secondary"
 | 
					            variant = crazy_fns[k]["Color"] if "Color" in crazy_fns[k] else "secondary"
 | 
				
			||||||
            return {switchy_bt: gr.update(value=k, variant=variant)}
 | 
					            ret = {switchy_bt: gr.update(value=k, variant=variant)}
 | 
				
			||||||
        dropdown.select(on_dropdown_changed, [dropdown], [switchy_bt] )
 | 
					            if crazy_fns[k].get("AdvancedArgs", False): # 是否唤起高级插件参数区
 | 
				
			||||||
 | 
					                ret.update({plugin_advanced_arg: gr.update(visible=True,  label=f"插件[{k}]的高级参数说明:" + crazy_fns[k].get("ArgsReminder", [f"没有提供高级参数功能说明"]))})
 | 
				
			||||||
 | 
					            else:
 | 
				
			||||||
 | 
					                ret.update({plugin_advanced_arg: gr.update(visible=False, label=f"插件[{k}]不需要高级参数。")})
 | 
				
			||||||
 | 
					            return ret
 | 
				
			||||||
 | 
					        dropdown.select(on_dropdown_changed, [dropdown], [switchy_bt, plugin_advanced_arg] )
 | 
				
			||||||
        def on_md_dropdown_changed(k):
 | 
					        def on_md_dropdown_changed(k):
 | 
				
			||||||
            return {chatbot: gr.update(label="当前模型:"+k)}
 | 
					            return {chatbot: gr.update(label="当前模型:"+k)}
 | 
				
			||||||
        md_dropdown.select(on_md_dropdown_changed, [md_dropdown], [chatbot] )
 | 
					        md_dropdown.select(on_md_dropdown_changed, [md_dropdown], [chatbot] )
 | 
				
			||||||
 | 
				
			|||||||
@ -24,7 +24,7 @@ def ArgsGeneralWrapper(f):
 | 
				
			|||||||
    """
 | 
					    """
 | 
				
			||||||
    装饰器函数,用于重组输入参数,改变输入参数的顺序与结构。
 | 
					    装饰器函数,用于重组输入参数,改变输入参数的顺序与结构。
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
    def decorated(cookies, max_length, llm_model, txt, txt2, top_p, temperature, chatbot, history, system_prompt, *args):
 | 
					    def decorated(cookies, max_length, llm_model, txt, txt2, top_p, temperature, chatbot, history, system_prompt, plugin_advanced_arg, *args):
 | 
				
			||||||
        txt_passon = txt
 | 
					        txt_passon = txt
 | 
				
			||||||
        if txt == "" and txt2 != "": txt_passon = txt2
 | 
					        if txt == "" and txt2 != "": txt_passon = txt2
 | 
				
			||||||
        # 引入一个有cookie的chatbot
 | 
					        # 引入一个有cookie的chatbot
 | 
				
			||||||
@ -40,7 +40,7 @@ def ArgsGeneralWrapper(f):
 | 
				
			|||||||
            'temperature':temperature,
 | 
					            'temperature':temperature,
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        plugin_kwargs = {
 | 
					        plugin_kwargs = {
 | 
				
			||||||
            # 目前还没有
 | 
					            "advanced_arg": plugin_advanced_arg,
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        chatbot_with_cookie = ChatBotWithCookies(cookies)
 | 
					        chatbot_with_cookie = ChatBotWithCookies(cookies)
 | 
				
			||||||
        chatbot_with_cookie.write_list(chatbot)
 | 
					        chatbot_with_cookie.write_list(chatbot)
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user