Skip to content

函数插件指南

binary-husky edited this page Apr 20, 2023 · 16 revisions

新增函数插件只需要改两个文件

  • crazy_functions 路径下,放置您编写的新插件。
  • crazy_functional.py 中,仿照其他插件的格式,把新插件加入到列表中。

函数插件热更新

小Tip: 函数插件支持热更新,您在改写的任何代码都会即刻生效,不需要重启项目。实现方法很简单,在crazy_functional.py中用HotReload修饰器包一下即可,例如:

"[仅供开发调试] 批量总结PDF文档": {
    "Color": "stop",
    "Function": HotReload(批量总结PDF文档)  # HotReload 的意思是热更新,修改函数插件代码后,不需要重启程序,代码直接生效
},

单线程插件Demo(只有20多行代码)

高级功能函数模板

i_say = f'历史中哪些事件发生在{currentMonth}{currentDay}日?列举两条并发送相关图片。发送图片时,请使用Markdown,将Unsplash API中的PUT_YOUR_QUERY_HERE替换成描述该事件的一个最重要的单词。'
gpt_say = yield from request_gpt_model_in_new_thread_with_ui_alive(
    inputs=i_say,             # 提问的内容,给chatgpt看的
    inputs_show_user=i_say,   # 提问的内容,给用户看的(可以隐藏啰嗦的细节)
    llm_kwargs=llm_kwargs,    # 无聊的chatgpt内部参数
    chatbot=chatbot,          # 聊天框句柄,原样传递
    history=[],               # 之前的聊天内容,只有之前的聊天内容中有值得抽取的信息时,才是必要的
    sys_prompt="当你想发送一张照片时,请使用Markdown, 并且不要有反斜线, 不要用代码块。使用 Unsplash API (https://source.unsplash.com/1280x720/? < PUT_YOUR_QUERY_HERE >)。"
)

多线程插件Demo

源代码解析_多线程

for index, fp in enumerate(file_manifest):   # 这个for循环历遍列表中的每一个文件
    with open(fp, 'r', encoding='utf-8', errors='replace') as f:
        file_content = f.read()  # 读取文件
    prefix = "接下来请你逐文件分析下面的工程" if index==0 else ""
    i_say = prefix + f'请对下面的程序文件做一个概述文件名是{os.path.relpath(fp, project_folder)},文件代码是 ```{file_content}```'
    i_say_show_user = prefix + f'[{index}/{len(file_manifest)}] 请对下面的程序文件做一个概述: {os.path.abspath(fp)}'
    # 装载请求内容,这里有四个列表,列表的长度就是子任务的数。比如10个文件,列表的长度就是10。
    inputs_array.append(i_say)   # 要求解读10个文件的指令
    inputs_show_user_array.append(i_say_show_user)  # 要求解读10个文件的指令,给用户看的时候,只显示一个文件名,避免被满屏代码糊脸上
    history_array.append([])  # 和读论文不一样,这里不需要上下文也能分析的很出色
    sys_prompt_array.append("你是一个程序架构分析师,正在分析一个源代码项目。你的回答必须简单明了。")

gpt_response_collection = yield from request_gpt_model_multi_threads_with_very_awesome_ui_and_high_efficiency(
    inputs_array = inputs_array,
    inputs_show_user_array = inputs_show_user_array,
    history_array = history_array,
    sys_prompt_array = sys_prompt_array,
    llm_kwargs = llm_kwargs,
    chatbot = chatbot,
    show_user_at_complete = True
)

插件快速调试

可在crazy_functions_test.py中编写测试代码。

插件PR小建议

  1. 函数插件如果能单独成立一个.py文件,把新写的函数都放在其中,再好不过了。如果新增函数很多,请在crazy_functions新建一个二级文件夹盛放您的工具。

  2. 新增的pip依赖不需要放进requirements.txt,但是需要在函数开头试着import一下,如果失败,给一下安装指令,比如crazy_functions/批量总结PDF文档.py当中:

    # 尝试导入依赖,如果缺少依赖,则给出安装建议
    try:
        import fitz # 尝试导入依赖
    except:
        # 如果缺少依赖fitz,则给出安装建议,这里是建议安装pymupdf,安装完pymupdf就有了fitz
        report_execption(chatbot, history, 
            a = f"解析项目: {txt}", 
            b = f"导入软件依赖失败。使用该模块需要额外依赖,安装方法```pip install --upgrade pymupdf```。")
        yield chatbot, history, '正常'
        return
  1. 在函数开头说明功能,如果您希望标注您的昵称、联系方式、合作声明或者更个性化一点的东西等都是完全ok的,比如crazy_functions/批量总结PDF文档.py当中:
    # 基本信息:功能、贡献者
    chatbot.append([
        "函数插件功能?",
        "批量总结PDF文档。函数插件贡献者: ValeriaWong"])
    yield chatbot, history, '正常'