|
from toolbox import CatchException, update_ui, gen_time_str |
|
from .crazy_utils import request_gpt_model_in_new_thread_with_ui_alive |
|
from .crazy_utils import input_clipping |
|
import copy, json |
|
|
|
def get_fn_lib(): |
|
return { |
|
"BatchTranslatePDFDocuments_MultiThreaded": { |
|
"module": "crazy_functions.批量翻译PDF文档_多线程", |
|
"function": "批量翻译PDF文档", |
|
"description": "Translate PDF Documents", |
|
"arg_1_description": "A path containing pdf files.", |
|
}, |
|
"SummarizingWordDocuments": { |
|
"module": "crazy_functions.总结word文档", |
|
"function": "总结word文档", |
|
"description": "Summarize Word Documents", |
|
"arg_1_description": "A path containing Word files.", |
|
}, |
|
"ImageGeneration": { |
|
"module": "crazy_functions.图片生成", |
|
"function": "图片生成", |
|
"description": "Generate a image that satisfies some description.", |
|
"arg_1_description": "Descriptions about the image to be generated.", |
|
}, |
|
"TranslateMarkdownFromEnglishToChinese": { |
|
"module": "crazy_functions.批量Markdown翻译", |
|
"function": "Markdown中译英", |
|
"description": "Translate Markdown Documents from English to Chinese.", |
|
"arg_1_description": "A path containing Markdown files.", |
|
}, |
|
"SummaryAudioVideo": { |
|
"module": "crazy_functions.总结音视频", |
|
"function": "总结音视频", |
|
"description": "Get text from a piece of audio and summarize this audio.", |
|
"arg_1_description": "A path containing audio files.", |
|
}, |
|
} |
|
|
|
functions = [ |
|
{ |
|
"name": k, |
|
"description": v['description'], |
|
"parameters": { |
|
"type": "object", |
|
"properties": { |
|
"plugin_arg_1": { |
|
"type": "string", |
|
"description": v['arg_1_description'], |
|
}, |
|
}, |
|
"required": ["plugin_arg_1"], |
|
}, |
|
} for k, v in get_fn_lib().items() |
|
] |
|
|
|
def inspect_dependency(chatbot, history): |
|
return True |
|
|
|
def eval_code(code, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt, web_port): |
|
import importlib |
|
try: |
|
tmp = get_fn_lib()[code['name']] |
|
fp, fn = tmp['module'], tmp['function'] |
|
fn_plugin = getattr(importlib.import_module(fp, fn), fn) |
|
arg = json.loads(code['arguments'])['plugin_arg_1'] |
|
yield from fn_plugin(arg, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt, web_port) |
|
except: |
|
from toolbox import trimmed_format_exc |
|
chatbot.append(["执行错误", f"\n```\n{trimmed_format_exc()}\n```\n"]) |
|
yield from update_ui(chatbot=chatbot, history=history) |
|
|
|
def get_code_block(reply): |
|
import re |
|
pattern = r"```([\s\S]*?)```" |
|
matches = re.findall(pattern, reply) |
|
if len(matches) != 1: |
|
raise RuntimeError("GPT is not generating proper code.") |
|
return matches[0].strip('python') |
|
|
|
@CatchException |
|
def 终端(txt, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt, web_port): |
|
""" |
|
txt 输入栏用户输入的文本, 例如需要翻译的一段话, 再例如一个包含了待处理文件的路径 |
|
llm_kwargs gpt模型参数, 如温度和top_p等, 一般原样传递下去就行 |
|
plugin_kwargs 插件模型的参数, 暂时没有用武之地 |
|
chatbot 聊天显示框的句柄, 用于显示给用户 |
|
history 聊天历史, 前情提要 |
|
system_prompt 给gpt的静默提醒 |
|
web_port 当前软件运行的端口号 |
|
""" |
|
|
|
history = [] |
|
|
|
|
|
chatbot.append(["虚空终端插件的功能?", "根据自然语言的描述, 执行任意插件的命令."]) |
|
yield from update_ui(chatbot=chatbot, history=history) |
|
|
|
|
|
i_say = txt |
|
|
|
llm_kwargs_function_call = copy.deepcopy(llm_kwargs) |
|
llm_kwargs_function_call['llm_model'] = 'gpt-call-fn' |
|
gpt_say = yield from request_gpt_model_in_new_thread_with_ui_alive( |
|
inputs=i_say, inputs_show_user=txt, |
|
llm_kwargs=llm_kwargs_function_call, chatbot=chatbot, history=[], |
|
sys_prompt=functions |
|
) |
|
|
|
|
|
res = json.loads(gpt_say)['choices'][0] |
|
if res['finish_reason'] == 'function_call': |
|
code = json.loads(gpt_say)['choices'][0] |
|
yield from eval_code(code['message']['function_call'], llm_kwargs, plugin_kwargs, chatbot, history, system_prompt, web_port) |
|
else: |
|
chatbot.append(["无法调用相关功能", res]) |
|
yield from update_ui(chatbot=chatbot, history=history) |
|
|
|
|
|
|