xzajyjs Keldos Chuan Hu commited on
Commit
dd740ac
1 Parent(s): 02f41f3

修复前端API用量查询显示功能 (#848)

Browse files

* fix billing_data

* 整合sensitive_id的获取方式到config.py中及未填写UI提示

* sensitive_id支持环境变量

* 调整ui中获取余额失败的提示词

* refactor: 整理config_example.json

顺便清理了palm的key

* 加入 Google PaLM API Key 配置项

* i18n: 更新用量获取失败翻译

---------

Co-authored-by: Keldos <i@keldos.me>
Co-authored-by: Chuan Hu <51039745+GaiZhenbiao@users.noreply.github.com>

config_example.json CHANGED
@@ -1,42 +1,40 @@
1
  {
2
- // 你的OpenAI API Key,一般必填,
3
- // 若缺省填为 "openai_api_key": "" 则必须再在图形界面中填入API Key
4
- "openai_api_key": "",
5
- "google_palm_api_key": "",
6
- "xmchat_api_key": "",
7
- "usage_limit": 120, // API Key的当月限额,单位:美元
8
- // 你的xmchat API Key,与OpenAI API Key不同
9
- // MiniMax的APIKey(见账户管理页面 https://api.minimax.chat/basic-information)和Group ID,用于MiniMax对话模型
10
- "minimax_api_key": "",
11
- "minimax_group_id": "",
12
- "language": "auto",
13
- // 支持自定义OpenAI API Base
14
- // "openai_api_base": "https://api.openai.com",
15
- // 如果使用代理,请取消注释下面的两行,并替换代理URL
16
- // "https_proxy": "http://127.0.0.1:1079",
17
- // "http_proxy": "http://127.0.0.1:1079",
18
  "users": [], // 用户列表,[[用户名1, 密码1], [用户名2, 密码2], ...]
19
  "local_embedding": false, //是否在本地编制索引
20
  "hide_history_when_not_logged_in": false, //未登录情况下是否不展示对话历史
21
  "check_update": true, //是否启用检查更新
22
  "default_model": "gpt-3.5-turbo", // 默认模型
23
 
24
- //川虎助理设置
25
- "default_chuanhu_assistant_model": "gpt-4", //川虎助理使用的模型,可选gpt-3.5-turbo或者gpt-4
26
  "GOOGLE_CSE_ID": "", //谷歌搜索引擎ID,用于川虎助理Pro模式,获取方式请看 https://stackoverflow.com/questions/37083058/programmatically-searching-google-in-python-using-custom-search
27
  "GOOGLE_API_KEY": "", //谷歌API Key,用于川虎助理Pro模式
28
  "WOLFRAM_ALPHA_APPID": "", //Wolfram Alpha API Key,用于川虎助理Pro模式,获取方式请看 https://products.wolframalpha.com/api/
29
  "SERPAPI_API_KEY": "", //SerpAPI API Key,用于川虎助理Pro模式,获取方式请看 https://serpapi.com/
30
 
31
- "latex_option": "default", // latex 公式显示方式,可选"default", "strict", "all"或者"disabled"
 
32
  "advance_docs": {
33
  "pdf": {
34
- // 是否认为PDF是双栏的
35
- "two_column": false,
36
- // 是否使用OCR识别PDF中的公式
37
- "formula_ocr": true
38
  }
39
  },
 
 
40
  // 是否多个API Key轮换使用
41
  "multi_api_key": false,
42
  "api_key_list": [
@@ -44,7 +42,12 @@
44
  "sk-xxxxxxxxxxxxxxxxxxxxxxxx2",
45
  "sk-xxxxxxxxxxxxxxxxxxxxxxxx3"
46
  ],
47
- // 如果使用自定义端口、自定义ip,请取消注释并替换对应内容
 
 
 
 
 
48
  // "server_name": "0.0.0.0",
49
  // "server_port": 7860,
50
  // 如果要share到gradio,设置为true
 
1
  {
2
+ // 各配置具体说明,见 [https://github.com/GaiZhenbiao/ChuanhuChatGPT/wiki/使用教程#配置-configjson]
3
+
4
+ //== API 配置 ==
5
+ "openai_api_key": "", // 你的 OpenAI API Key,一般必填,若空缺则需在图形界面中填入API Key
6
+ "sensitive_id": "", // 你 OpenAI 账户的 Sensitive ID,用于查询 API 用量
7
+ "usage_limit": 120, // 该 OpenAI API Key 的当月限额,单位:美元
8
+ "google_palm_api_key": "", // 你的 Google PaLM API Key,用于 Google PaLM 对话模型
9
+ "xmchat_api_key": "", // 你的 xmchat API Key,用于 XMChat 对话模型
10
+ "minimax_api_key": "", // 你的 MiniMax API Key,用于 MiniMax 对话模型
11
+ "minimax_group_id": "", // 你的 MiniMax Group ID,用于 MiniMax 对话模型
12
+
13
+ //== 基础配置 ==
14
+ "language": "auto", // 界面语言,可选"auto", "zh-CN", "en-US", "ja-JP", "ko-KR"
 
 
 
15
  "users": [], // 用户列表,[[用户名1, 密码1], [用户名2, 密码2], ...]
16
  "local_embedding": false, //是否在本地编制索引
17
  "hide_history_when_not_logged_in": false, //未登录情况下是否不展示对话历史
18
  "check_update": true, //是否启用检查更新
19
  "default_model": "gpt-3.5-turbo", // 默认模型
20
 
21
+ //== 川虎助理设置 ==
22
+ "default_chuanhu_assistant_model": "gpt-4", //川虎助理使用的模型,可选gpt-3.5-turbo或者gpt-4
23
  "GOOGLE_CSE_ID": "", //谷歌搜索引擎ID,用于川虎助理Pro模式,获取方式请看 https://stackoverflow.com/questions/37083058/programmatically-searching-google-in-python-using-custom-search
24
  "GOOGLE_API_KEY": "", //谷歌API Key,用于川虎助理Pro模式
25
  "WOLFRAM_ALPHA_APPID": "", //Wolfram Alpha API Key,用于川虎助理Pro模式,获取方式请看 https://products.wolframalpha.com/api/
26
  "SERPAPI_API_KEY": "", //SerpAPI API Key,用于川虎助理Pro模式,获取方式请看 https://serpapi.com/
27
 
28
+ //== 文档处理与显示 ==
29
+ "latex_option": "default", // LaTeX 公式渲染策略,可选"default", "strict", "all"或者"disabled"
30
  "advance_docs": {
31
  "pdf": {
32
+ "two_column": false, // 是否认为PDF是双栏的
33
+ "formula_ocr": true // 是否使用OCR识别PDF中的公式
 
 
34
  }
35
  },
36
+
37
+ //== 高级配置 ==
38
  // 是否多个API Key轮换使用
39
  "multi_api_key": false,
40
  "api_key_list": [
 
42
  "sk-xxxxxxxxxxxxxxxxxxxxxxxx2",
43
  "sk-xxxxxxxxxxxxxxxxxxxxxxxx3"
44
  ],
45
+ // 自定义OpenAI API Base
46
+ // "openai_api_base": "https://api.openai.com",
47
+ // 自定义使用代理(请替换代理URL)
48
+ // "https_proxy": "http://127.0.0.1:1079",
49
+ // "http_proxy": "http://127.0.0.1:1079",
50
+ // 自定义端口、自定义ip(请替换对应内容)
51
  // "server_name": "0.0.0.0",
52
  // "server_port": 7860,
53
  // 如果要share到gradio,设置为true
locale/en_US.json CHANGED
@@ -41,7 +41,7 @@
41
  "在这里输入API-Host...": "Type in API-Host here...",
42
  "🔄 切换API地址": "🔄 Switch API Address",
43
  "在这里输入代理地址...": "Type in proxy address here...",
44
- "代理地址(示例:http://127.0.0.1:10809)": "Proxy address (example: http://127.0.0.1:10809",
45
  "🔄 设置代理地址": "🔄 Set Proxy Address",
46
  "🔙 恢复网络默认设置": "🔙 Reset Network Settings",
47
  "🔄 检查更新...": "🔄 Check for Update...",
@@ -52,8 +52,10 @@
52
  "川虎Chat 🚀": "Chuanhu Chat 🚀",
53
  "开始实时传输回答……": "Start streaming output...",
54
  "Token 计数: ": "Token Count: ",
55
- ",本次对话累计消耗了 ": "Total cost for this dialogue is ",
56
  "**获取API使用情况失败**": "**Failed to get API usage**",
 
 
57
  "**本月使用金额** ": "**Monthly usage** ",
58
  "本月使用金额": "Monthly usage",
59
  "获取API使用情况失败:": "Failed to get API usage:",
 
41
  "在这里输入API-Host...": "Type in API-Host here...",
42
  "🔄 切换API地址": "🔄 Switch API Address",
43
  "在这里输入代理地址...": "Type in proxy address here...",
44
+ "代理地址(示例:http://127.0.0.1:10809)": "Proxy address (example: http://127.0.0.1:10809)",
45
  "🔄 设置代理地址": "🔄 Set Proxy Address",
46
  "🔙 恢复网络默认设置": "🔙 Reset Network Settings",
47
  "🔄 检查更新...": "🔄 Check for Update...",
 
52
  "川虎Chat 🚀": "Chuanhu Chat 🚀",
53
  "开始实时传输回答……": "Start streaming output...",
54
  "Token 计数: ": "Token Count: ",
55
+ ",本次对话累计消耗了 ": ", Total cost for this dialogue is ",
56
  "**获取API使用情况失败**": "**Failed to get API usage**",
57
+ "**获取API使用情况失败**,需在填写`config.json`中正确填写sensitive_id": "**Failed to get API usage**, correct sensitive_id needed in `config.json`",
58
+ "**获取API使用情况失败**,sensitive_id错误或已过期": "**Failed to get API usage**, wrong or expired sensitive_id",
59
  "**本月使用金额** ": "**Monthly usage** ",
60
  "本月使用金额": "Monthly usage",
61
  "获取API使用情况失败:": "Failed to get API usage:",
locale/ja_JP.json CHANGED
@@ -54,6 +54,8 @@
54
  "Token 计数: ": "Token数: ",
55
  ",本次对话累计消耗了 ": ", 今の会話で消費合計 ",
56
  "**获取API使用情况失败**": "**API使用状況の取得に失敗しました**",
 
 
57
  "**本月使用金额** ": "**今月の使用料金** ",
58
  "本月使用金额": "今月の使用料金",
59
  "获取API使用情况失败:": "API使用状況の取得に失敗しました:",
 
54
  "Token 计数: ": "Token数: ",
55
  ",本次对话累计消耗了 ": ", 今の会話で消費合計 ",
56
  "**获取API使用情况失败**": "**API使用状況の取得に失敗しました**",
57
+ "**获取API使用情况失败**,需在填写`config.json`中正确填写sensitive_id": "**API使用状況の取得に失敗しました**、`config.json`に正しい`sensitive_id`を入力する必要があります",
58
+ "**获取API使用情况失败**,sensitive_id错误或已过期": "**API使用状況の取得に失敗しました**、sensitive_idが間違っているか、期限切れです",
59
  "**本月使用金额** ": "**今月の使用料金** ",
60
  "本月使用金额": "今月の使用料金",
61
  "获取API使用情况失败:": "API使用状況の取得に失敗しました:",
locale/ko_KR.json CHANGED
@@ -55,6 +55,8 @@
55
  "Token 计数: ": "토큰 수: ",
56
  ",本次对话累计消耗了 ": ",이 대화의 전체 비용은 ",
57
  "**获取API使用情况失败**": "**API 사용량 가져오기 실패**",
 
 
58
  "**本月使用金额** ": "**이번 달 사용금액** ",
59
  "本月使用金额": "이번 달 사용금액",
60
  "获取API使用情况失败:": "API 사용량 가져오기 실패:",
 
55
  "Token 计数: ": "토큰 수: ",
56
  ",本次对话累计消耗了 ": ",이 대화의 전체 비용은 ",
57
  "**获取API使用情况失败**": "**API 사용량 가져오기 실패**",
58
+ "**获取API使用情况失败**,需在填写`config.json`中正确填写sensitive_id": "**API 사용량 가져오기 실패**. `config.json`에 올바른 `sensitive_id`를 입력해야 합니다",
59
+ "**获取API使用情况失败**,sensitive_id错误或已过期": "**API 사용량 가져오기 실패**. sensitive_id가 잘못되었거나 만료되었습니다",
60
  "**本月使用金额** ": "**이번 달 사용금액** ",
61
  "本月使用金额": "이번 달 사용금액",
62
  "获取API使用情况失败:": "API 사용량 가져오기 실패:",
modules/config.py CHANGED
@@ -11,6 +11,7 @@ from . import presets
11
 
12
  __all__ = [
13
  "my_api_key",
 
14
  "authflag",
15
  "auth_list",
16
  "dockerflag",
@@ -37,6 +38,9 @@ if os.path.exists("config.json"):
37
  else:
38
  config = {}
39
 
 
 
 
40
  lang_config = config.get("language", "auto")
41
  language = os.environ.get("LANGUAGE", lang_config)
42
 
 
11
 
12
  __all__ = [
13
  "my_api_key",
14
+ "sensitive_id",
15
  "authflag",
16
  "auth_list",
17
  "dockerflag",
 
38
  else:
39
  config = {}
40
 
41
+ sensitive_id = config.get("sensitive_id", "")
42
+ sensitive_id = os.environ.get("SENSITIVE_ID", sensitive_id)
43
+
44
  lang_config = config.get("language", "auto")
45
  language = os.environ.get("LANGUAGE", lang_config)
46
 
modules/models/models.py CHANGED
@@ -24,7 +24,7 @@ from ..presets import *
24
  from ..index_func import *
25
  from ..utils import *
26
  from .. import shared
27
- from ..config import retrieve_proxy, usage_limit
28
  from modules import config
29
  from .base_model import BaseLLMModel, ModelType
30
 
@@ -87,7 +87,11 @@ class OpenAIClient(BaseLLMModel):
87
  try:
88
  usage_data = self._get_billing_data(usage_url)
89
  except Exception as e:
90
- logging.error(f"获取API使用情况失败:" + str(e))
 
 
 
 
91
  return i18n("**获取API使用情况失败**")
92
  # rounded_usage = "{:.5f}".format(usage_data["total_usage"] / 100)
93
  rounded_usage = round(usage_data["total_usage"] / 100, 5)
@@ -176,8 +180,9 @@ class OpenAIClient(BaseLLMModel):
176
  def _refresh_header(self):
177
  self.headers = {
178
  "Content-Type": "application/json",
179
- "Authorization": f"Bearer {self.api_key}",
180
  }
 
181
 
182
  def _get_billing_data(self, billing_url):
183
  with retrieve_proxy():
 
24
  from ..index_func import *
25
  from ..utils import *
26
  from .. import shared
27
+ from ..config import retrieve_proxy, usage_limit, sensitive_id
28
  from modules import config
29
  from .base_model import BaseLLMModel, ModelType
30
 
 
87
  try:
88
  usage_data = self._get_billing_data(usage_url)
89
  except Exception as e:
90
+ logging.error(f"获取API使用情况失败: " + str(e))
91
+ if "Invalid authorization header" in str(e):
92
+ return i18n("**获取API使用情况失败**,需在填写`config.json`中正确填写sensitive_id")
93
+ elif "Incorrect API key provided: sess" in str(e):
94
+ return i18n("**获取API使用情况失败**,sensitive_id错误或已过期")
95
  return i18n("**获取API使用情况失败**")
96
  # rounded_usage = "{:.5f}".format(usage_data["total_usage"] / 100)
97
  rounded_usage = round(usage_data["total_usage"] / 100, 5)
 
180
  def _refresh_header(self):
181
  self.headers = {
182
  "Content-Type": "application/json",
183
+ "Authorization": f"Bearer {sensitive_id}",
184
  }
185
+
186
 
187
  def _get_billing_data(self, billing_url):
188
  with retrieve_proxy():