diff --git a/func_box.py b/func_box.py index b6283cb..8ad69ac 100644 --- a/func_box.py +++ b/func_box.py @@ -591,69 +591,5 @@ class JsonHandle: if __name__ == '__main__': - num = num_tokens_from_string([ - """ - You are jvs, 帮我做一篇关于chatgpt的分享,大纲为ChatGPT 的基本原理和应用、Prompt 的作用和优化、ChatGPT 和 Prompt 的案例研究、ChatGPT 和 Prompt 的挑战和限制、ChatGPT 和 Prompt 的未来发展 -Your decisions must always be made independently without seeking user assistance. Play to your strengths as an LLM and pursue simple strategies with no legal complications. -GOALS: -1. 在文后,将市面上的AI应用作比较,对每个部分进行适当调整和拓展 -Constraints: # 确定目标 -1. ~4000 word limit for short term memory. Your short term memory is short, so immediately save important information to files. -2. If you are unsure how you previously did something or want to recall past events, thinking about similar events will help you remember. -3. No user assistance -4. Exclusively use the commands listed below e.g. command_name -Commands: # 可执行的行动 -1. analyze_code: Analyze Code, args: "code": "" -2. execute_python_file: Execute Python File, args: "filename": "" -3. execute_shell: Execute Shell Command, non-interactive commands only, args: "command_line": "" -4. execute_shell_popen: Execute Shell Command, non-interactive commands only, args: "command_line": "" -5. append_to_file: Append to file, args: "filename": "", "text": "" -6. delete_file: Delete file, args: "filename": "" -7. list_files: List Files in Directory, args: "directory": "" -8. read_file: Read file, args: "filename": "" -9. write_to_file: Write to file, args: "filename": "", "text": "" -10. google: Google Search, args: "query": "" -11. generate_image: Generate Image, args: "prompt": "" -12. improve_code: Get Improved Code, args: "suggestions": "", "code": "" -13. send_tweet: Send Tweet, args: "tweet_text": "" -14. browse_website: Browse Website, args: "url": "", "question": "" -15. write_tests: Write Tests, args: "code": "", "focus": "" -16. delete_agent: Delete GPT Agent, args: "key": "" -17. get_hyperlinks: Get text summary, args: "url": "" -18. get_text_summary: Get text summary, args: "url": "", "question": "" -19. list_agents: List GPT Agents, args: () -> str -20. message_agent: Message GPT Agent, args: "key": "", "message": "" -21. start_agent: Start GPT Agent, args: "name": "", "task": "", "prompt": "" -22. task_complete: Task Complete (Shutdown), args: "reason": "" -Resources: # 可用资源 -1. Internet access for searches and information gathering. -2. Long Term memory management. -3. GPT-3.5 powered Agents for delegation of simple tasks. -4. File output. -Performance Evaluation: # 自我评估 -1. Continuously review and analyze your actions to ensure you are performing to the best of your abilities. -2. Constructively self-criticize your big-picture behavior constantly. -3. Reflect on past decisions and strategies to refine your approach. -4. Every command has a cost, so be smart and efficient. Aim to complete tasks in the least number of steps. -5. Write all code to a file. -You should only respond in JSON format as described below -Response Format: # 限制GPT的回答 -{ - "thoughts": { - "text": "thought", - "reasoning": "reasoning", - "plan": "- short bulleted\n- list that conveys\n- long-term plan", - "criticism": "constructive self-criticism", - "speak": "thoughts summary to say to user" - }, - "command": { - "name": "command name", - "args": { - "arg name": "value" - } - } -} -Ensure the response can be parsed by Python json.loads - """ - ]) + num = num_tokens_from_string(['你好', '您好,请问有什么可以帮助您的吗?']) print(num) \ No newline at end of file diff --git a/request_llm/bridge_all.py b/request_llm/bridge_all.py index 654ef3c..44620db 100644 --- a/request_llm/bridge_all.py +++ b/request_llm/bridge_all.py @@ -48,10 +48,11 @@ class LazyloadTiktoken(object): return encoder.decode(*args, **kwargs) # Endpoint 重定向 -API_URL_REDIRECT, = get_conf("API_URL_REDIRECT") +API_URL_REDIRECT, PROXY_API_URL = get_conf("API_URL_REDIRECT", 'PROXY_API_URL') openai_endpoint = "https://api.openai.com/v1/chat/completions" api2d_endpoint = "https://openai.api2d.net/v1/chat/completions" newbing_endpoint = "wss://sydney.bing.com/sydney/ChatHub" +proxy_endpoint = PROXY_API_URL # 兼容旧版的配置 try: API_URL, = get_conf("API_URL") @@ -66,6 +67,7 @@ if api2d_endpoint in API_URL_REDIRECT: api2d_endpoint = API_URL_REDIRECT[api2d_e if newbing_endpoint in API_URL_REDIRECT: newbing_endpoint = API_URL_REDIRECT[newbing_endpoint] + # 获取tokenizer tokenizer_gpt35 = LazyloadTiktoken("gpt-3.5-turbo") tokenizer_gpt4 = LazyloadTiktoken("gpt-4") @@ -93,6 +95,24 @@ model_info = { "token_cnt": get_token_num_gpt4, }, + "proxy-gpt-4": { + "fn_with_ui": chatgpt_ui, + "fn_without_ui": chatgpt_noui, + "endpoint": proxy_endpoint.replace('%v', 'gpt-4'), + "max_token": 8192, + "tokenizer": tokenizer_gpt4, + "token_cnt": get_token_num_gpt4, + }, + + "proxy-gpt-4-32k": { + "fn_with_ui": chatgpt_ui, + "fn_without_ui": chatgpt_noui, + "endpoint": proxy_endpoint.replace('%v', 'gpt-4-32k'), + "max_token": 32000, + "tokenizer": tokenizer_gpt4, + "token_cnt": get_token_num_gpt4, + }, + # api_2d "api2d-gpt-3.5-turbo": { "fn_with_ui": chatgpt_ui, diff --git a/request_llm/bridge_chatgpt.py b/request_llm/bridge_chatgpt.py index 4e28e69..aa2099f 100644 --- a/request_llm/bridge_chatgpt.py +++ b/request_llm/bridge_chatgpt.py @@ -208,7 +208,7 @@ def predict(inputs, llm_kwargs, plugin_kwargs, chatbot, history=[], system_promp error_msg = chunk_decoded if "reduce the length" in error_msg: if len(history) >= 2: history[-1] = ""; history[-2] = "" # 清除当前溢出的输入:history[-2] 是本次输入, history[-1] 是本次输出 - history = clip_history(inputs=inputs, history=history, tokenizer=model_info[llm_kwargs['llm_model']]['tokenizer'], + history = clip_history(inputs=inputs, history=history, tokenizer=model_info[llm_kwargs['llm_model']]['tokenizer'], max_token_limit=(model_info[llm_kwargs['llm_model']]['max_token'])) # history至少释放二分之一 chatbot[-1] = (chatbot[-1][0], "[Local Message] Reduce the length. 本次输入过长, 或历史数据过长. 历史缓存数据已部分释放, 您可以请再次尝试. (若再次失败则更可能是因为输入过长.)") # history = [] # 清除历史 @@ -238,13 +238,18 @@ def generate_payload(inputs, llm_kwargs, history, system_prompt, stream): """ if not is_any_api_key(llm_kwargs['api_key']): raise AssertionError("你提供了错误的API_KEY。\n\n1. 临时解决方案:直接在输入区键入api_key,然后回车提交。\n\n2. 长效解决方案:在config.py中配置。") - - api_key = select_api_key(llm_kwargs['api_key'], llm_kwargs['llm_model']) - - headers = { - "Content-Type": "application/json", - "Authorization": f"Bearer {api_key}" - } + if llm_kwargs['llm_model'].startswith('proxy-'): + api_key = select_api_key(llm_kwargs['api_key'], llm_kwargs['llm_model']) + headers = { + "Content-Type": "application/json", + "api-key": f"{api_key}" + } + else: + api_key = select_api_key(llm_kwargs['api_key'], llm_kwargs['llm_model']) + headers = { + "Content-Type": "application/json", + "Authorization": f"Bearer {api_key}" + } conversation_cnt = len(history) // 2 diff --git a/toolbox.py b/toolbox.py index 3a11d53..6987208 100644 --- a/toolbox.py +++ b/toolbox.py @@ -54,10 +54,13 @@ def ArgsGeneralWrapper(f): """""" # 引入一个有cookie的chatbot start_time = time.time() + encrypt, private = get_conf('switch_model')[0]['key'] + private_key, = get_conf('private_key') cookies.update({ 'top_p':top_p, 'temperature':temperature, }) + llm_kwargs = { 'api_key': cookies['api_key'], 'llm_model': llm_model, @@ -70,8 +73,6 @@ def ArgsGeneralWrapper(f): plugin_kwargs = { "advanced_arg": plugin_advanced_arg } - encrypt, private = get_conf('switch_model')[0]['key'] - private_key = get_conf('private_key')[0] if private in models: if chatbot == []: chatbot.append([None, f'隐私模式, 你的对话记录无法被他人检索

\n{private_key}\n{ipaddr.client.host}\n

']) @@ -573,6 +574,12 @@ def is_api2d_key(key): else: return False +def is_proxy_key(key): + if 'proxy' in key: + return True + else: + return False + def is_any_api_key(key): if ',' in key: keys = key.split(',') @@ -580,7 +587,7 @@ def is_any_api_key(key): if is_any_api_key(k): return True return False else: - return is_openai_api_key(key) or is_api2d_key(key) + return is_openai_api_key(key) or is_api2d_key(key) or is_proxy_key(key) def what_keys(keys): avail_key_list = {'OpenAI Key':0, "API2D Key":0} @@ -609,6 +616,10 @@ def select_api_key(keys, llm_model): for k in key_list: if is_api2d_key(k): avail_key_list.append(k) + if llm_model.startswith('proxy'): + for k in key_list: + if is_proxy_key(k): avail_key_list.append(k.replace('proxy-', '')) + if len(avail_key_list) == 0: raise RuntimeError(f"您提供的api-key不满足要求,不包含任何可用于{llm_model}的api-key。您可能选择了错误的模型或请求源。") @@ -905,4 +916,3 @@ def objload(file='objdump.tmp'): return with open(file, 'rb') as f: return pickle.load(f) - \ No newline at end of file