镜像自地址
https://github.com/binary-husky/gpt_academic.git
已同步 2025-12-06 06:26:47 +00:00
merge frontier branch (#1620)
* Zhipu sdk update 适配最新的智谱SDK,支持GLM4v (#1502) * 适配 google gemini 优化为从用户input中提取文件 * 适配最新的智谱SDK、支持glm-4v * requirements.txt fix * pending history check --------- Co-authored-by: binary-husky <qingxu.fu@outlook.com> * Update "生成多种Mermaid图表" plugin: Separate out the file reading function (#1520) * Update crazy_functional.py with new functionality deal with PDF * Update crazy_functional.py and Mermaid.py for plugin_kwargs * Update crazy_functional.py with new chart type: mind map * Update SELECT_PROMPT and i_say_show_user messages * Update ArgsReminder message in get_crazy_functions() function * Update with read md file and update PROMPTS * Return the PROMPTS as the test found that the initial version worked best * Update Mermaid chart generation function * version 3.71 * 解决issues #1510 * Remove unnecessary text from sys_prompt in 解析历史输入 function * Remove sys_prompt message in 解析历史输入 function * Update bridge_all.py: supports gpt-4-turbo-preview (#1517) * Update bridge_all.py: supports gpt-4-turbo-preview supports gpt-4-turbo-preview * Update bridge_all.py --------- Co-authored-by: binary-husky <96192199+binary-husky@users.noreply.github.com> * Update config.py: supports gpt-4-turbo-preview (#1516) * Update config.py: supports gpt-4-turbo-preview supports gpt-4-turbo-preview * Update config.py --------- Co-authored-by: binary-husky <96192199+binary-husky@users.noreply.github.com> * Refactor 解析历史输入 function to handle file input * Update Mermaid chart generation functionality * rename files and functions --------- Co-authored-by: binary-husky <qingxu.fu@outlook.com> Co-authored-by: hongyi-zhao <hongyi.zhao@gmail.com> Co-authored-by: binary-husky <96192199+binary-husky@users.noreply.github.com> * 接入mathpix ocr功能 (#1468) * Update Latex输出PDF结果.py 借助mathpix实现了PDF翻译中文并重新编译PDF * Update config.py add mathpix appid & appkey * Add 'PDF翻译中文并重新编译PDF' feature to plugins. --------- Co-authored-by: binary-husky <96192199+binary-husky@users.noreply.github.com> * fix zhipuai * check picture * remove glm-4 due to bug * 修改config * 检查MATHPIX_APPID * Remove unnecessary code and update function_plugins dictionary * capture non-standard token overflow * bug fix #1524 * change mermaid style * 支持mermaid 滚动放大缩小重置,鼠标滚动和拖拽 (#1530) * 支持mermaid 滚动放大缩小重置,鼠标滚动和拖拽 * 微调未果 先stage一下 * update --------- Co-authored-by: binary-husky <qingxu.fu@outlook.com> Co-authored-by: binary-husky <96192199+binary-husky@users.noreply.github.com> * ver 3.72 * change live2d * save the status of ``clear btn` in cookie * 前端选择保持 * js ui bug fix * reset btn bug fix * update live2d tips * fix missing get_token_num method * fix live2d toggle switch * fix persistent custom btn with cookie * fix zhipuai feedback with core functionality * Refactor button update and clean up functions * tailing space removal * Fix missing MATHPIX_APPID and MATHPIX_APPKEY configuration * Prompt fix、脑图提示词优化 (#1537) * 适配 google gemini 优化为从用户input中提取文件 * 脑图提示词优化 * Fix missing MATHPIX_APPID and MATHPIX_APPKEY configuration --------- Co-authored-by: binary-husky <qingxu.fu@outlook.com> * 优化“PDF翻译中文并重新编译PDF”插件 (#1602) * Add gemini_endpoint to API_URL_REDIRECT (#1560) * Add gemini_endpoint to API_URL_REDIRECT * Update gemini-pro and gemini-pro-vision model_info endpoints * Update to support new claude models (#1606) * Add anthropic library and update claude models * 更新bridge_claude.py文件,添加了对图片输入的支持。修复了一些bug。 * 添加Claude_3_Models变量以限制图片数量 * Refactor code to improve readability and maintainability * minor claude bug fix * more flexible one-api support * reformat config * fix one-api new access bug * dummy * compat non-standard api * version 3.73 --------- Co-authored-by: XIao <46100050+Kilig947@users.noreply.github.com> Co-authored-by: Menghuan1918 <menghuan2003@outlook.com> Co-authored-by: hongyi-zhao <hongyi.zhao@gmail.com> Co-authored-by: Hao Ma <893017927@qq.com> Co-authored-by: zeyuan huang <599012428@qq.com>
这个提交包含在:
@@ -1,7 +1,7 @@
|
||||
"""
|
||||
Translate this project to other languages (experimental, please open an issue if there is any bug)
|
||||
|
||||
|
||||
|
||||
|
||||
Usage:
|
||||
1. modify config.py, set your LLM_MODEL and API_KEY(s) to provide access to OPENAI (or any other LLM model provider)
|
||||
|
||||
@@ -11,20 +11,20 @@
|
||||
3. modify TransPrompt (below ↓)
|
||||
TransPrompt = f"Replace each json value `#` with translated results in English, e.g., \"原始文本\":\"TranslatedText\". Keep Json format. Do not answer #."
|
||||
|
||||
4. Run `python multi_language.py`.
|
||||
4. Run `python multi_language.py`.
|
||||
Note: You need to run it multiple times to increase translation coverage because GPT makes mistakes sometimes.
|
||||
(You can also run `CACHE_ONLY=True python multi_language.py` to use cached translation mapping)
|
||||
|
||||
5. Find the translated program in `multi-language\English\*`
|
||||
|
||||
|
||||
P.S.
|
||||
|
||||
|
||||
- The translation mapping will be stored in `docs/translation_xxxx.json`, you can revised mistaken translation there.
|
||||
|
||||
|
||||
- If you would like to share your `docs/translation_xxxx.json`, (so that everyone can use the cached & revised translation mapping), please open a Pull Request
|
||||
|
||||
- If there is any translation error in `docs/translation_xxxx.json`, please open a Pull Request
|
||||
|
||||
|
||||
- Welcome any Pull Request, regardless of language
|
||||
"""
|
||||
|
||||
@@ -58,7 +58,7 @@ if not os.path.exists(CACHE_FOLDER):
|
||||
|
||||
def lru_file_cache(maxsize=128, ttl=None, filename=None):
|
||||
"""
|
||||
Decorator that caches a function's return value after being called with given arguments.
|
||||
Decorator that caches a function's return value after being called with given arguments.
|
||||
It uses a Least Recently Used (LRU) cache strategy to limit the size of the cache.
|
||||
maxsize: Maximum size of the cache. Defaults to 128.
|
||||
ttl: Time-to-Live of the cache. If a value hasn't been accessed for `ttl` seconds, it will be evicted from the cache.
|
||||
@@ -151,7 +151,7 @@ def map_to_json(map, language):
|
||||
|
||||
def read_map_from_json(language):
|
||||
if os.path.exists(f'docs/translate_{language.lower()}.json'):
|
||||
with open(f'docs/translate_{language.lower()}.json', 'r', encoding='utf8') as f:
|
||||
with open(f'docs/translate_{language.lower()}.json', 'r', encoding='utf8') as f:
|
||||
res = json.load(f)
|
||||
res = {k:v for k, v in res.items() if v is not None and contains_chinese(k)}
|
||||
return res
|
||||
@@ -168,7 +168,7 @@ def advanced_split(splitted_string, spliter, include_spliter=False):
|
||||
splitted[i] += spliter
|
||||
splitted[i] = splitted[i].strip()
|
||||
for i in reversed(range(len(splitted))):
|
||||
if not contains_chinese(splitted[i]):
|
||||
if not contains_chinese(splitted[i]):
|
||||
splitted.pop(i)
|
||||
splitted_string_tmp.extend(splitted)
|
||||
else:
|
||||
@@ -183,12 +183,12 @@ def trans(word_to_translate, language, special=False):
|
||||
if len(word_to_translate) == 0: return {}
|
||||
from crazy_functions.crazy_utils import request_gpt_model_multi_threads_with_very_awesome_ui_and_high_efficiency
|
||||
from toolbox import get_conf, ChatBotWithCookies, load_chat_cookies
|
||||
|
||||
|
||||
cookies = load_chat_cookies()
|
||||
llm_kwargs = {
|
||||
'api_key': cookies['api_key'],
|
||||
'llm_model': cookies['llm_model'],
|
||||
'top_p':1.0,
|
||||
'top_p':1.0,
|
||||
'max_length': None,
|
||||
'temperature':0.4,
|
||||
}
|
||||
@@ -204,12 +204,12 @@ def trans(word_to_translate, language, special=False):
|
||||
sys_prompt_array = [f"Translate following sentences to {LANG}. E.g., You should translate sentences to the following format ['translation of sentence 1', 'translation of sentence 2']. Do NOT answer with Chinese!" for _ in inputs_array]
|
||||
chatbot = ChatBotWithCookies(llm_kwargs)
|
||||
gpt_say_generator = request_gpt_model_multi_threads_with_very_awesome_ui_and_high_efficiency(
|
||||
inputs_array,
|
||||
inputs_show_user_array,
|
||||
llm_kwargs,
|
||||
chatbot,
|
||||
history_array,
|
||||
sys_prompt_array,
|
||||
inputs_array,
|
||||
inputs_show_user_array,
|
||||
llm_kwargs,
|
||||
chatbot,
|
||||
history_array,
|
||||
sys_prompt_array,
|
||||
)
|
||||
while True:
|
||||
try:
|
||||
@@ -224,7 +224,7 @@ def trans(word_to_translate, language, special=False):
|
||||
try:
|
||||
res_before_trans = eval(result[i-1])
|
||||
res_after_trans = eval(result[i])
|
||||
if len(res_before_trans) != len(res_after_trans):
|
||||
if len(res_before_trans) != len(res_after_trans):
|
||||
raise RuntimeError
|
||||
for a,b in zip(res_before_trans, res_after_trans):
|
||||
translated_result[a] = b
|
||||
@@ -246,12 +246,12 @@ def trans_json(word_to_translate, language, special=False):
|
||||
if len(word_to_translate) == 0: return {}
|
||||
from crazy_functions.crazy_utils import request_gpt_model_multi_threads_with_very_awesome_ui_and_high_efficiency
|
||||
from toolbox import get_conf, ChatBotWithCookies, load_chat_cookies
|
||||
|
||||
|
||||
cookies = load_chat_cookies()
|
||||
llm_kwargs = {
|
||||
'api_key': cookies['api_key'],
|
||||
'llm_model': cookies['llm_model'],
|
||||
'top_p':1.0,
|
||||
'top_p':1.0,
|
||||
'max_length': None,
|
||||
'temperature':0.4,
|
||||
}
|
||||
@@ -261,18 +261,18 @@ def trans_json(word_to_translate, language, special=False):
|
||||
word_to_translate_split = split_list(word_to_translate, N_EACH_REQ)
|
||||
inputs_array = [{k:"#" for k in s} for s in word_to_translate_split]
|
||||
inputs_array = [ json.dumps(i, ensure_ascii=False) for i in inputs_array]
|
||||
|
||||
|
||||
inputs_show_user_array = inputs_array
|
||||
history_array = [[] for _ in inputs_array]
|
||||
sys_prompt_array = [TransPrompt for _ in inputs_array]
|
||||
chatbot = ChatBotWithCookies(llm_kwargs)
|
||||
gpt_say_generator = request_gpt_model_multi_threads_with_very_awesome_ui_and_high_efficiency(
|
||||
inputs_array,
|
||||
inputs_show_user_array,
|
||||
llm_kwargs,
|
||||
chatbot,
|
||||
history_array,
|
||||
sys_prompt_array,
|
||||
inputs_array,
|
||||
inputs_show_user_array,
|
||||
llm_kwargs,
|
||||
chatbot,
|
||||
history_array,
|
||||
sys_prompt_array,
|
||||
)
|
||||
while True:
|
||||
try:
|
||||
@@ -336,7 +336,7 @@ def step_1_core_key_translate():
|
||||
cached_translation = read_map_from_json(language=LANG_STD)
|
||||
cached_translation_keys = list(cached_translation.keys())
|
||||
for d in chinese_core_keys_norepeat:
|
||||
if d not in cached_translation_keys:
|
||||
if d not in cached_translation_keys:
|
||||
need_translate.append(d)
|
||||
|
||||
if CACHE_ONLY:
|
||||
@@ -379,7 +379,7 @@ def step_1_core_key_translate():
|
||||
# read again
|
||||
with open(file_path, 'r', encoding='utf-8') as f:
|
||||
content = f.read()
|
||||
|
||||
|
||||
for k, v in chinese_core_keys_norepeat_mapping.items():
|
||||
content = content.replace(k, v)
|
||||
|
||||
@@ -390,7 +390,7 @@ def step_1_core_key_translate():
|
||||
def step_2_core_key_translate():
|
||||
|
||||
# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
# step2
|
||||
# step2
|
||||
# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
|
||||
def load_string(strings, string_input):
|
||||
@@ -423,7 +423,7 @@ def step_2_core_key_translate():
|
||||
splitted_string = advanced_split(splitted_string, spliter=" ", include_spliter=False)
|
||||
splitted_string = advanced_split(splitted_string, spliter="- ", include_spliter=False)
|
||||
splitted_string = advanced_split(splitted_string, spliter="---", include_spliter=False)
|
||||
|
||||
|
||||
# --------------------------------------
|
||||
for j, s in enumerate(splitted_string): # .com
|
||||
if '.com' in s: continue
|
||||
@@ -457,7 +457,7 @@ def step_2_core_key_translate():
|
||||
comments_arr = []
|
||||
for code_sp in content.splitlines():
|
||||
comments = re.findall(r'#.*$', code_sp)
|
||||
for comment in comments:
|
||||
for comment in comments:
|
||||
load_string(strings=comments_arr, string_input=comment)
|
||||
string_literals.extend(comments_arr)
|
||||
|
||||
@@ -479,7 +479,7 @@ def step_2_core_key_translate():
|
||||
cached_translation = read_map_from_json(language=LANG)
|
||||
cached_translation_keys = list(cached_translation.keys())
|
||||
for d in chinese_literal_names_norepeat:
|
||||
if d not in cached_translation_keys:
|
||||
if d not in cached_translation_keys:
|
||||
need_translate.append(d)
|
||||
|
||||
if CACHE_ONLY:
|
||||
@@ -504,18 +504,18 @@ def step_2_core_key_translate():
|
||||
# read again
|
||||
with open(file_path, 'r', encoding='utf-8') as f:
|
||||
content = f.read()
|
||||
|
||||
|
||||
for k, v in cached_translation.items():
|
||||
if v is None: continue
|
||||
if '"' in v:
|
||||
if '"' in v:
|
||||
v = v.replace('"', "`")
|
||||
if '\'' in v:
|
||||
if '\'' in v:
|
||||
v = v.replace('\'', "`")
|
||||
content = content.replace(k, v)
|
||||
|
||||
with open(file_path, 'w', encoding='utf-8') as f:
|
||||
f.write(content)
|
||||
|
||||
|
||||
if file.strip('.py') in cached_translation:
|
||||
file_new = cached_translation[file.strip('.py')] + '.py'
|
||||
file_path_new = os.path.join(root, file_new)
|
||||
|
||||
在新工单中引用
屏蔽一个用户