diff --git a/config.py b/config.py index 34ac2f6..2d2970d 100644 --- a/config.py +++ b/config.py @@ -83,8 +83,11 @@ DEFAULT_FN_GROUPS = ['对话', '编程', '学术', '智能体'] # 模型选择是 (注意: LLM_MODEL是默认选中的模型, 它*必须*被包含在AVAIL_LLM_MODELS列表中 ) LLM_MODEL = "gpt-3.5-turbo" # 可选 ↓↓↓ -AVAIL_LLM_MODELS = ["gpt-3.5-turbo-16k", "gpt-3.5-turbo", "azure-gpt-3.5", "api2d-gpt-3.5-turbo", - "gpt-4", "gpt-4-32k", "azure-gpt-4", "api2d-gpt-4", "chatglm", "moss", "newbing", "stack-claude"] +AVAIL_LLM_MODELS = [ + "gpt-3.5-turbo-16k", "gpt-3.5-turbo", "azure-gpt-3.5", "api2d-gpt-3.5-turbo", + "gpt-4", "gpt-4-32k", "azure-gpt-4", "api2d-gpt-4", + "chatglm", "moss", "newbing", "stack-claude" +] # P.S. 其他可用的模型还包括 ["qianfan", "llama2", "qwen", "gpt-3.5-turbo-0613", "gpt-3.5-turbo-16k-0613", "gpt-3.5-random" # "spark", "sparkv2", "sparkv3", "chatglm_onnx", "claude-1-100k", "claude-2", "internlm", "jittorllms_pangualpha", "jittorllms_llama"] @@ -139,17 +142,15 @@ SLACK_CLAUDE_BOT_ID = '' SLACK_CLAUDE_USER_TOKEN = '' -# 如果需要使用AZURE 详情请见额外文档 docs\use_azure.md +# 如果需要使用AZURE(方法一:单个azure模型部署)详情请见额外文档 docs\use_azure.md AZURE_ENDPOINT = "https://你亲手写的api名称.openai.azure.com/" -AZURE_URL_VERSION = 'openai/deployments/{v}/chat/completions?api-version=2023-05-15' # {v}作为占位符 AZURE_API_KEY = "填入azure openai api的密钥" # 建议直接在API_KEY处填写,该选项即将被弃用 -AZURE_ENGINE_DICT = { - 'gpt-35-16k': 1024 * 16, - 'gpt-4': 1024 * 8 -} # 读 docs\use_azure.md key填入你的部署名,value请自行计算模型对应最大Token数,如3.5 = 4096 = 1024 * 4即可 -AVAIL_LLM_MODELS.extend([f"azure-{i}" for i in AZURE_ENGINE_DICT]) # 自动加入模型列表 +AZURE_ENGINE = "填入你亲手写的部署名" # 读 docs\use_azure.md +# 如果需要使用AZURE(方法二:多个azure模型部署+动态切换)详情请见额外文档 docs\use_azure.md +AZURE_CFG_ARRAY = {} + # 使用Newbing (不推荐使用,未来将删除) NEWBING_STYLE = "creative" # ["creative", "balanced", "precise"] @@ -222,13 +223,16 @@ NUM_CUSTOM_BASIC_BTN = 4 │ ├── API_ORG(不常用) │ └── API_URL_REDIRECT(不常用) │ -├── "azure-gpt-3.5" 等azure模型 +├── "azure-gpt-3.5" 等azure模型(单个azure模型,不需要动态切换) │ ├── API_KEY │ ├── AZURE_ENDPOINT │ ├── AZURE_API_KEY │ ├── AZURE_ENGINE │ └── API_URL_REDIRECT │ +├── "azure-gpt-3.5" 等azure模型(多个azure模型,需要动态切换) +│ └── AZURE_CFG_ARRAY +│ ├── "spark" 星火认知大模型 spark & sparkv2 │ ├── XFYUN_APPID │ ├── XFYUN_API_SECRET diff --git a/docs/use_azure.md b/docs/use_azure.md index 4c43a7e..041bc52 100644 --- a/docs/use_azure.md +++ b/docs/use_azure.md @@ -1,3 +1,42 @@ +# 微软Azure云接入指南 + +## 方法一(旧方法,只能接入一个Azure模型) + +- 通过以下教程,获取AZURE_ENDPOINT,AZURE_API_KEY,AZURE_ENGINE,直接修改 config 配置即可。配置的修改方法见本项目wiki。 + +## 方法二(新方法,接入多个Azure模型,并支持动态切换) + +- 在方法一的基础上,注册并获取多组 AZURE_ENDPOINT,AZURE_API_KEY,AZURE_ENGINE +- 修改config中的AZURE_CFG_ARRAY配置项,按照格式填入多个Azure模型的配置,如下所示: + +``` +AZURE_CFG_ARRAY = { + "azure-gpt-3.5": # 第一个模型,azure模型必须以"azure-"开头 + { + "AZURE_ENDPOINT": "https://你亲手写的api名称.openai.azure.com/", + "AZURE_API_KEY": "cccccccccccccccccccccccccccccccc", + "AZURE_ENGINE": "填入你亲手写的部署名1", + "AZURE_MODEL_MAX_TOKEN": 4096, + }, + "azure-gpt-4": # 第二个模型,azure模型必须以"azure-"开头 + { + "AZURE_ENDPOINT": "https://你亲手写的api名称.openai.azure.com/", + "AZURE_API_KEY": "dddddddddddddddddddddddddddddddd", + "AZURE_ENGINE": "填入你亲手写的部署名2", + "AZURE_MODEL_MAX_TOKEN": 8192, + }, + "azure-gpt-3.5-16k": # 第三个模型,azure模型必须以"azure-"开头 + { + "AZURE_ENDPOINT": "https://你亲手写的api名称.openai.azure.com/", + "AZURE_API_KEY": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "AZURE_ENGINE": "填入你亲手写的部署名3", + "AZURE_MODEL_MAX_TOKEN": 16384, + }, +} +``` + + + # 通过微软Azure云服务申请 Openai API 由于Openai和微软的关系,现在是可以通过微软的Azure云计算服务直接访问openai的api,免去了注册和网络的问题。 diff --git a/request_llm/bridge_all.py b/request_llm/bridge_all.py index a6c33a3..5cfceaa 100644 --- a/request_llm/bridge_all.py +++ b/request_llm/bridge_all.py @@ -48,10 +48,12 @@ class LazyloadTiktoken(object): return encoder.decode(*args, **kwargs) # Endpoint 重定向 -API_URL_REDIRECT, = get_conf("API_URL_REDIRECT") +API_URL_REDIRECT, AZURE_ENDPOINT, AZURE_ENGINE = get_conf("API_URL_REDIRECT", "AZURE_ENDPOINT", "AZURE_ENGINE") 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" +if not AZURE_ENDPOINT.endswith('/'): AZURE_ENDPOINT += '/' +azure_endpoint = AZURE_ENDPOINT + f'openai/deployments/{AZURE_ENGINE}/chat/completions?api-version=2023-05-15' # 兼容旧版的配置 try: API_URL, = get_conf("API_URL") @@ -141,6 +143,25 @@ model_info = { "tokenizer": tokenizer_gpt4, "token_cnt": get_token_num_gpt4, }, + + # azure openai + "azure-gpt-3.5":{ + "fn_with_ui": chatgpt_ui, + "fn_without_ui": chatgpt_noui, + "endpoint": azure_endpoint, + "max_token": 4096, + "tokenizer": tokenizer_gpt35, + "token_cnt": get_token_num_gpt35, + }, + + "azure-gpt-4":{ + "fn_with_ui": chatgpt_ui, + "fn_without_ui": chatgpt_noui, + "endpoint": azure_endpoint, + "max_token": 8192, + "tokenizer": tokenizer_gpt35, + "token_cnt": get_token_num_gpt35, + }, # api_2d "api2d-gpt-3.5-turbo": { @@ -187,21 +208,6 @@ model_info = { "token_cnt": get_token_num_gpt35, }, } -# Azure 多模型支持 -AZURE_ENDPOINT, AZURE_ENGINE_DICT, AZURE_URL_VERSION = get_conf('AZURE_ENDPOINT', 'AZURE_ENGINE_DICT', 'AZURE_URL_VERSION') -for azure in AZURE_ENGINE_DICT: - if not AZURE_ENDPOINT.endswith('/'): AZURE_ENDPOINT += '/' - azure_endpoint = AZURE_ENDPOINT + str(AZURE_URL_VERSION).replace('{v}', azure) - model_info.update({ - f"azure-{azure}": { - "fn_with_ui": chatgpt_ui, - "fn_without_ui": chatgpt_noui, - "endpoint": azure_endpoint, - "max_token": AZURE_ENGINE_DICT[azure], - "tokenizer": tokenizer_gpt35, - "token_cnt": get_token_num_gpt35, - }, - }) # -=-=-=-=-=-=- 以下部分是新加入的模型,可能附带额外依赖 -=-=-=-=-=-=- if "claude-1-100k" in AVAIL_LLM_MODELS or "claude-2" in AVAIL_LLM_MODELS: @@ -469,6 +475,30 @@ if "llama2" in AVAIL_LLM_MODELS: # llama2 except: print(trimmed_format_exc()) +# <-- 用于定义和切换多个azure模型 --> +AZURE_CFG_ARRAY, = get_conf("AZURE_CFG_ARRAY") +if len(AZURE_CFG_ARRAY) > 0: + for azure_model_name, azure_cfg_dict in AZURE_CFG_ARRAY.items(): + # 可能会覆盖之前的配置,但这是意料之中的 + if not azure_model_name.startswith('azure'): + raise ValueError("AZURE_CFG_ARRAY中配置的模型必须以azure开头") + endpoint_ = azure_cfg_dict["AZURE_ENDPOINT"] + \ + f'openai/deployments/{azure_cfg_dict["AZURE_ENGINE"]}/chat/completions?api-version=2023-05-15' + model_info.update({ + azure_model_name: { + "fn_with_ui": chatgpt_ui, + "fn_without_ui": chatgpt_noui, + "endpoint": endpoint_, + "azure_api_key": azure_cfg_dict["AZURE_API_KEY"], + "max_token": azure_cfg_dict["AZURE_MODEL_MAX_TOKEN"], + "tokenizer": tokenizer_gpt35, # tokenizer只用于粗估token数量 + "token_cnt": get_token_num_gpt35, + } + }) + if azure_model_name not in AVAIL_LLM_MODELS: + azure_model_name += [azure_model_name] + + def LLM_CATCH_EXCEPTION(f): diff --git a/request_llm/bridge_chatgpt.py b/request_llm/bridge_chatgpt.py index 660300e..505894b 100644 --- a/request_llm/bridge_chatgpt.py +++ b/request_llm/bridge_chatgpt.py @@ -23,8 +23,8 @@ import random # config_private.py放自己的秘密如API和代理网址 # 读取时首先看是否存在私密的config_private配置文件(不受git管控),如果有,则覆盖原config文件 from toolbox import get_conf, update_ui, is_any_api_key, select_api_key, what_keys, clip_history, trimmed_format_exc, is_the_upload_folder -proxies, TIMEOUT_SECONDS, MAX_RETRY, API_ORG = \ - get_conf('proxies', 'TIMEOUT_SECONDS', 'MAX_RETRY', 'API_ORG') +proxies, TIMEOUT_SECONDS, MAX_RETRY, API_ORG, AZURE_CFG_ARRAY = \ + get_conf('proxies', 'TIMEOUT_SECONDS', 'MAX_RETRY', 'API_ORG', 'AZURE_CFG_ARRAY') timeout_bot_msg = '[Local Message] Request timeout. Network error. Please check proxy settings in config.py.' + \ '网络错误,检查代理服务器是否可用,以及代理设置的格式是否正确,格式须是[协议]://[地址]:[端口],缺一不可。' @@ -289,7 +289,11 @@ def generate_payload(inputs, llm_kwargs, history, system_prompt, stream): "Authorization": f"Bearer {api_key}" } if API_ORG.startswith('org-'): headers.update({"OpenAI-Organization": API_ORG}) - if llm_kwargs['llm_model'].startswith('azure-'): headers.update({"api-key": api_key}) + if llm_kwargs['llm_model'].startswith('azure-'): + headers.update({"api-key": api_key}) + if llm_kwargs['llm_model'] in AZURE_CFG_ARRAY.keys(): + azure_api_key_unshared = AZURE_CFG_ARRAY[llm_kwargs['llm_model']]["AZURE_API_KEY"] + headers.update({"api-key": azure_api_key_unshared}) conversation_cnt = len(history) // 2