mirror of
				https://github.com/songquanpeng/one-api.git
				synced 2025-11-04 15:53:42 +08:00 
			
		
		
		
	Merge commit '96d7a993120d54f7d7c85528bbae6eacc6c82e10'
This commit is contained in:
		@@ -197,7 +197,7 @@ func testChannels(notify bool, scope string) error {
 | 
			
		||||
		testAllChannelsRunning = false
 | 
			
		||||
		testAllChannelsLock.Unlock()
 | 
			
		||||
		if notify {
 | 
			
		||||
			err := message.Notify(message.ByAll, "通道测试完成", "", "通道测试完成,如果没有收到禁用通知,说明所有通道都正常")
 | 
			
		||||
			err := message.Notify(message.ByAll, "渠道测试完成", "", "渠道测试完成,如果没有收到禁用通知,说明所有渠道都正常")
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				logger.SysError(fmt.Sprintf("failed to send email: %s", err.Error()))
 | 
			
		||||
			}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										34
									
								
								i18n/en.json
									
									
									
									
									
								
							
							
						
						
									
										34
									
								
								i18n/en.json
									
									
									
									
									
								
							@@ -8,12 +8,12 @@
 | 
			
		||||
  "确认删除": "Confirm Delete",
 | 
			
		||||
  "确认绑定": "Confirm Binding",
 | 
			
		||||
  "您正在删除自己的帐户,将清空所有数据且不可恢复": "You are deleting your account, all data will be cleared and unrecoverable.",
 | 
			
		||||
  "\"通道「%s」(#%d)已被禁用\"": "\"Channel %s (#%d) has been disabled\"",
 | 
			
		||||
  "通道「%s」(#%d)已被禁用,原因:%s": "Channel %s (#%d) has been disabled, reason: %s",
 | 
			
		||||
  "\"渠道「%s」(#%d)已被禁用\"": "\"Channel %s (#%d) has been disabled\"",
 | 
			
		||||
  "渠道「%s」(#%d)已被禁用,原因:%s": "Channel %s (#%d) has been disabled, reason: %s",
 | 
			
		||||
  "测试已在运行中": "Test is already running",
 | 
			
		||||
  "响应时间 %.2fs 超过阈值 %.2fs": "Response time %.2fs exceeds threshold %.2fs",
 | 
			
		||||
  "通道测试完成": "Channel test completed",
 | 
			
		||||
  "通道测试完成,如果没有收到禁用通知,说明所有通道都正常": "Channel test completed, if you have not received the disable notification, it means that all channels are normal",
 | 
			
		||||
  "渠道测试完成": "Channel test completed",
 | 
			
		||||
  "渠道测试完成,如果没有收到禁用通知,说明所有渠道都正常": "Channel test completed, if you have not received the disable notification, it means that all channels are normal",
 | 
			
		||||
  "无法连接至 GitHub 服务器,请稍后重试!": "Unable to connect to GitHub server, please try again later!",
 | 
			
		||||
  "返回值非法,用户字段为空,请稍后重试!": "The return value is illegal, the user field is empty, please try again later!",
 | 
			
		||||
  "管理员未开启通过 GitHub 登录以及注册": "The administrator did not turn on login and registration via GitHub",
 | 
			
		||||
@@ -119,11 +119,11 @@
 | 
			
		||||
  " 个月 ": " M ",
 | 
			
		||||
  " 年 ": " y ",
 | 
			
		||||
  "未测试": "Not tested",
 | 
			
		||||
  "通道 ${name} 测试成功,耗时 ${time.toFixed(2)} 秒。": "Channel ${name} test succeeded, time consumed ${time.toFixed(2)} s.",
 | 
			
		||||
  "已成功开始测试所有通道,请刷新页面查看结果。": "All channels have been successfully tested, please refresh the page to view the results.",
 | 
			
		||||
  "已成功开始测试所有已启用通道,请刷新页面查看结果。": "All enabled channels have been successfully tested, please refresh the page to view the results.",
 | 
			
		||||
  "通道 ${name} 余额更新成功!": "Channel ${name} balance updated successfully!",
 | 
			
		||||
  "已更新完毕所有已启用通道余额!": "The balance of all enabled channels has been updated!",
 | 
			
		||||
  "渠道 ${name} 测试成功,耗时 ${time.toFixed(2)} 秒。": "Channel ${name} test succeeded, time consumed ${time.toFixed(2)} s.",
 | 
			
		||||
  "已成功开始测试所有渠道,请刷新页面查看结果。": "All channels have been successfully tested, please refresh the page to view the results.",
 | 
			
		||||
  "已成功开始测试所有已启用渠道,请刷新页面查看结果。": "All enabled channels have been successfully tested, please refresh the page to view the results.",
 | 
			
		||||
  "渠道 ${name} 余额更新成功!": "Channel ${name} balance updated successfully!",
 | 
			
		||||
  "已更新完毕所有已启用渠道余额!": "The balance of all enabled channels has been updated!",
 | 
			
		||||
  "搜索渠道的 ID,名称和密钥 ...": "Search for channel ID, name and key ...",
 | 
			
		||||
  "名称": "Name",
 | 
			
		||||
  "分组": "Group",
 | 
			
		||||
@@ -141,9 +141,9 @@
 | 
			
		||||
  "启用": "Enable",
 | 
			
		||||
  "编辑": "Edit",
 | 
			
		||||
  "添加新的渠道": "Add a new channel",
 | 
			
		||||
  "测试所有通道": "Test all channels",
 | 
			
		||||
  "测试所有已启用通道": "Test all enabled channels",
 | 
			
		||||
  "更新所有已启用通道余额": "Update the balance of all enabled channels",
 | 
			
		||||
  "测试所有渠道": "Test all channels",
 | 
			
		||||
  "测试所有已启用渠道": "Test all enabled channels",
 | 
			
		||||
  "更新所有已启用渠道余额": "Update the balance of all enabled channels",
 | 
			
		||||
  "刷新": "Refresh",
 | 
			
		||||
  "处理中...": "Processing...",
 | 
			
		||||
  "绑定成功!": "Binding succeeded!",
 | 
			
		||||
@@ -207,11 +207,11 @@
 | 
			
		||||
  "监控设置": "Monitoring Settings",
 | 
			
		||||
  "最长响应时间": "Longest Response Time",
 | 
			
		||||
  "单位秒": "Unit in seconds",
 | 
			
		||||
  "当运行通道全部测试时": "When all operating channels are tested",
 | 
			
		||||
  "超过此时间将自动禁用通道": "Channels will be automatically disabled if this time is exceeded",
 | 
			
		||||
  "当运行渠道全部测试时": "When all operating channels are tested",
 | 
			
		||||
  "超过此时间将自动禁用渠道": "Channels will be automatically disabled if this time is exceeded",
 | 
			
		||||
  "额度提醒阈值": "Quota reminder threshold",
 | 
			
		||||
  "低于此额度时将发送邮件提醒用户": "Email will be sent to remind users when the quota is below this",
 | 
			
		||||
  "失败时自动禁用通道": "Automatically disable the channel when it fails",
 | 
			
		||||
  "失败时自动禁用渠道": "Automatically disable the channel when it fails",
 | 
			
		||||
  "保存监控设置": "Save Monitoring Settings",
 | 
			
		||||
  "额度设置": "Quota Settings",
 | 
			
		||||
  "新用户初始额度": "Initial quota for new users",
 | 
			
		||||
@@ -405,7 +405,7 @@
 | 
			
		||||
  "镜像": "Mirror",
 | 
			
		||||
  "请输入镜像站地址,格式为:https://domain.com,可不填,不填则使用渠道默认值": "Please enter the mirror site address, the format is: https://domain.com, it can be left blank, if left blank, the default value of the channel will be used",
 | 
			
		||||
  "模型": "Model",
 | 
			
		||||
  "请选择该通道所支持的模型": "Please select the model supported by the channel",
 | 
			
		||||
  "请选择该渠道所支持的模型": "Please select the model supported by the channel",
 | 
			
		||||
  "填入基础模型": "Fill in the basic model",
 | 
			
		||||
  "填入所有模型": "Fill in all models",
 | 
			
		||||
  "清除所有模型": "Clear all models",
 | 
			
		||||
@@ -515,7 +515,7 @@
 | 
			
		||||
  "请输入自定义渠道的 Base URL": "Please enter the Base URL of the custom channel",
 | 
			
		||||
  "Homepage URL 填": "Fill in the Homepage URL",
 | 
			
		||||
  "Authorization callback URL 填": "Fill in the Authorization callback URL",
 | 
			
		||||
  "请为通道命名": "Please name the channel",
 | 
			
		||||
  "请为渠道命名": "Please name the channel",
 | 
			
		||||
  "此项可选,用于修改请求体中的模型名称,为一个 JSON 字符串,键为请求中模型名称,值为要替换的模型名称,例如:": "This is optional, used to modify the model name in the request body, it's a JSON string, the key is the model name in the request, and the value is the model name to be replaced, for example:",
 | 
			
		||||
  "模型重定向": "Model redirection",
 | 
			
		||||
  "请输入渠道对应的鉴权密钥": "Please enter the authentication key corresponding to the channel",
 | 
			
		||||
 
 | 
			
		||||
@@ -31,17 +31,17 @@ func notifyRootUser(subject string, content string) {
 | 
			
		||||
func DisableChannel(channelId int, channelName string, reason string) {
 | 
			
		||||
	model.UpdateChannelStatusById(channelId, common.ChannelStatusAutoDisabled)
 | 
			
		||||
	logger.SysLog(fmt.Sprintf("channel #%d has been disabled: %s", channelId, reason))
 | 
			
		||||
	subject := fmt.Sprintf("通道「%s」(#%d)已被禁用", channelName, channelId)
 | 
			
		||||
	content := fmt.Sprintf("通道「%s」(#%d)已被禁用,原因:%s", channelName, channelId, reason)
 | 
			
		||||
	subject := fmt.Sprintf("渠道「%s」(#%d)已被禁用", channelName, channelId)
 | 
			
		||||
	content := fmt.Sprintf("渠道「%s」(#%d)已被禁用,原因:%s", channelName, channelId, reason)
 | 
			
		||||
	notifyRootUser(subject, content)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func MetricDisableChannel(channelId int, successRate float64) {
 | 
			
		||||
	model.UpdateChannelStatusById(channelId, common.ChannelStatusAutoDisabled)
 | 
			
		||||
	logger.SysLog(fmt.Sprintf("channel #%d has been disabled due to low success rate: %.2f", channelId, successRate*100))
 | 
			
		||||
	subject := fmt.Sprintf("通道 #%d 已被禁用", channelId)
 | 
			
		||||
	content := fmt.Sprintf("该渠道在最近 %d 次调用中成功率为 %.2f%%,低于阈值 %.2f%%,因此被系统自动禁用。",
 | 
			
		||||
		config.MetricQueueSize, successRate*100, config.MetricSuccessRateThreshold*100)
 | 
			
		||||
	subject := fmt.Sprintf("渠道 #%d 已被禁用", channelId)
 | 
			
		||||
	content := fmt.Sprintf("该渠道(#%d)在最近 %d 次调用中成功率为 %.2f%%,低于阈值 %.2f%%,因此被系统自动禁用。",
 | 
			
		||||
		channelId, config.MetricQueueSize, successRate*100, config.MetricSuccessRateThreshold*100)
 | 
			
		||||
	notifyRootUser(subject, content)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -49,7 +49,7 @@ func MetricDisableChannel(channelId int, successRate float64) {
 | 
			
		||||
func EnableChannel(channelId int, channelName string) {
 | 
			
		||||
	model.UpdateChannelStatusById(channelId, common.ChannelStatusEnabled)
 | 
			
		||||
	logger.SysLog(fmt.Sprintf("channel #%d has been enabled", channelId))
 | 
			
		||||
	subject := fmt.Sprintf("通道「%s」(#%d)已被启用", channelName, channelId)
 | 
			
		||||
	content := fmt.Sprintf("通道「%s」(#%d)已被启用", channelName, channelId)
 | 
			
		||||
	subject := fmt.Sprintf("渠道「%s」(#%d)已被启用", channelName, channelId)
 | 
			
		||||
	content := fmt.Sprintf("渠道「%s」(#%d)已被启用", channelName, channelId)
 | 
			
		||||
	notifyRootUser(subject, content)
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -437,7 +437,7 @@ const ChannelsTable = () => {
 | 
			
		||||
    if (success) {
 | 
			
		||||
      record.response_time = time * 1000;
 | 
			
		||||
      record.test_time = Date.now() / 1000;
 | 
			
		||||
      showInfo(`通道 ${record.name} 测试成功,耗时 ${time.toFixed(2)} 秒。`);
 | 
			
		||||
      showInfo(`渠道 ${record.name} 测试成功,耗时 ${time.toFixed(2)} 秒。`);
 | 
			
		||||
    } else {
 | 
			
		||||
      showError(message);
 | 
			
		||||
    }
 | 
			
		||||
@@ -447,7 +447,7 @@ const ChannelsTable = () => {
 | 
			
		||||
    const res = await API.get(`/api/channel/test?scope=${scope}`);
 | 
			
		||||
    const { success, message } = res.data;
 | 
			
		||||
    if (success) {
 | 
			
		||||
      showInfo('已成功开始测试通道,请刷新页面查看结果。');
 | 
			
		||||
      showInfo('已成功开始测试渠道,请刷新页面查看结果。');
 | 
			
		||||
    } else {
 | 
			
		||||
      showError(message);
 | 
			
		||||
    }
 | 
			
		||||
@@ -470,7 +470,7 @@ const ChannelsTable = () => {
 | 
			
		||||
    if (success) {
 | 
			
		||||
      record.balance = balance;
 | 
			
		||||
      record.balance_updated_time = Date.now() / 1000;
 | 
			
		||||
      showInfo(`通道 ${record.name} 余额更新成功!`);
 | 
			
		||||
      showInfo(`渠道 ${record.name} 余额更新成功!`);
 | 
			
		||||
    } else {
 | 
			
		||||
      showError(message);
 | 
			
		||||
    }
 | 
			
		||||
@@ -481,7 +481,7 @@ const ChannelsTable = () => {
 | 
			
		||||
    const res = await API.get(`/api/channel/update_balance`);
 | 
			
		||||
    const { success, message } = res.data;
 | 
			
		||||
    if (success) {
 | 
			
		||||
      showInfo('已更新完毕所有已启用通道余额!');
 | 
			
		||||
      showInfo('已更新完毕所有已启用渠道余额!');
 | 
			
		||||
    } else {
 | 
			
		||||
      showError(message);
 | 
			
		||||
    }
 | 
			
		||||
@@ -490,7 +490,7 @@ const ChannelsTable = () => {
 | 
			
		||||
 | 
			
		||||
  const batchDeleteChannels = async () => {
 | 
			
		||||
    if (selectedChannels.length === 0) {
 | 
			
		||||
      showError('请先选择要删除的通道!');
 | 
			
		||||
      showError('请先选择要删除的渠道!');
 | 
			
		||||
      return;
 | 
			
		||||
    }
 | 
			
		||||
    setLoading(true);
 | 
			
		||||
@@ -501,7 +501,7 @@ const ChannelsTable = () => {
 | 
			
		||||
    const res = await API.post(`/api/channel/batch`, { ids: ids });
 | 
			
		||||
    const { success, message, data } = res.data;
 | 
			
		||||
    if (success) {
 | 
			
		||||
      showSuccess(`已删除 ${data} 个通道!`);
 | 
			
		||||
      showSuccess(`已删除 ${data} 个渠道!`);
 | 
			
		||||
      await refresh();
 | 
			
		||||
    } else {
 | 
			
		||||
      showError(message);
 | 
			
		||||
@@ -513,7 +513,7 @@ const ChannelsTable = () => {
 | 
			
		||||
    const res = await API.post(`/api/channel/fix`);
 | 
			
		||||
    const { success, message, data } = res.data;
 | 
			
		||||
    if (success) {
 | 
			
		||||
      showSuccess(`已修复 ${data} 个通道!`);
 | 
			
		||||
      showSuccess(`已修复 ${data} 个渠道!`);
 | 
			
		||||
      await refresh();
 | 
			
		||||
    } else {
 | 
			
		||||
      showError(message);
 | 
			
		||||
@@ -633,7 +633,7 @@ const ChannelsTable = () => {
 | 
			
		||||
              onConfirm={() => { testChannels("all") }}
 | 
			
		||||
              position={isMobile() ? 'top' : 'left'}
 | 
			
		||||
            >
 | 
			
		||||
              <Button theme="light" type="warning" style={{ marginRight: 8 }}>测试所有通道</Button>
 | 
			
		||||
              <Button theme="light" type="warning" style={{ marginRight: 8 }}>测试所有渠道</Button>
 | 
			
		||||
            </Popconfirm>
 | 
			
		||||
            <Popconfirm
 | 
			
		||||
              title="确定?"
 | 
			
		||||
@@ -648,16 +648,16 @@ const ChannelsTable = () => {
 | 
			
		||||
            okType={'secondary'}
 | 
			
		||||
            onConfirm={updateAllChannelsBalance}
 | 
			
		||||
          >
 | 
			
		||||
            <Button theme="light" type="secondary" style={{ marginRight: 8 }}>更新所有已启用通道余额</Button>
 | 
			
		||||
            <Button theme="light" type="secondary" style={{ marginRight: 8 }}>更新所有已启用渠道余额</Button>
 | 
			
		||||
          </Popconfirm> */}
 | 
			
		||||
            <Popconfirm
 | 
			
		||||
              title="确定是否要删除禁用通道?"
 | 
			
		||||
              title="确定是否要删除禁用渠道?"
 | 
			
		||||
              content="此修改将不可逆"
 | 
			
		||||
              okType={'danger'}
 | 
			
		||||
              onConfirm={deleteAllDisabledChannels}
 | 
			
		||||
              position={isMobile() ? 'top' : 'left'}
 | 
			
		||||
            >
 | 
			
		||||
              <Button theme="light" type="danger" style={{ marginRight: 8 }}>删除禁用通道</Button>
 | 
			
		||||
              <Button theme="light" type="danger" style={{ marginRight: 8 }}>删除禁用渠道</Button>
 | 
			
		||||
            </Popconfirm>
 | 
			
		||||
 | 
			
		||||
            <Button theme="light" type="primary" style={{ marginRight: 8 }} onClick={refresh}>刷新</Button>
 | 
			
		||||
@@ -673,7 +673,7 @@ const ChannelsTable = () => {
 | 
			
		||||
              setEnableBatchDelete(v);
 | 
			
		||||
            }}></Switch>
 | 
			
		||||
            <Popconfirm
 | 
			
		||||
              title="确定是否要删除所选通道?"
 | 
			
		||||
              title="确定是否要删除所选渠道?"
 | 
			
		||||
              content="此修改将不可逆"
 | 
			
		||||
              okType={'danger'}
 | 
			
		||||
              onConfirm={batchDeleteChannels}
 | 
			
		||||
@@ -681,7 +681,7 @@ const ChannelsTable = () => {
 | 
			
		||||
              position={'top'}
 | 
			
		||||
            >
 | 
			
		||||
              <Button disabled={!enableBatchDelete} theme="light" type="danger"
 | 
			
		||||
                style={{ marginRight: 8 }}>删除所选通道</Button>
 | 
			
		||||
                style={{ marginRight: 8 }}>删除所选渠道</Button>
 | 
			
		||||
            </Popconfirm>
 | 
			
		||||
            <Popconfirm
 | 
			
		||||
              title="确定是否要修复数据库一致性?"
 | 
			
		||||
 
 | 
			
		||||
@@ -261,7 +261,7 @@ const OperationSetting = () => {
 | 
			
		||||
              value={inputs.ChannelDisableThreshold}
 | 
			
		||||
              type='number'
 | 
			
		||||
              min='0'
 | 
			
		||||
              placeholder='单位秒,当运行通道全部测试时,超过此时间将自动禁用通道'
 | 
			
		||||
              placeholder='单位秒,当运行渠道全部测试时,超过此时间将自动禁用渠道'
 | 
			
		||||
            />
 | 
			
		||||
            <Form.Input
 | 
			
		||||
              label='额度提醒阈值'
 | 
			
		||||
@@ -277,13 +277,13 @@ const OperationSetting = () => {
 | 
			
		||||
          <Form.Group inline>
 | 
			
		||||
            <Form.Checkbox
 | 
			
		||||
              checked={inputs.AutomaticDisableChannelEnabled === 'true'}
 | 
			
		||||
              label='失败时自动禁用通道'
 | 
			
		||||
              label='失败时自动禁用渠道'
 | 
			
		||||
              name='AutomaticDisableChannelEnabled'
 | 
			
		||||
              onChange={handleInputChange}
 | 
			
		||||
            />
 | 
			
		||||
            <Form.Checkbox
 | 
			
		||||
              checked={inputs.AutomaticEnableChannelEnabled === 'true'}
 | 
			
		||||
              label='成功时自动启用通道'
 | 
			
		||||
              label='成功时自动启用渠道'
 | 
			
		||||
              name='AutomaticEnableChannelEnabled'
 | 
			
		||||
              onChange={handleInputChange}
 | 
			
		||||
            />
 | 
			
		||||
 
 | 
			
		||||
@@ -93,7 +93,7 @@ export default function ChannelTableRow({
 | 
			
		||||
        test_time: Date.now() / 1000,
 | 
			
		||||
        response_time: time * 1000,
 | 
			
		||||
      });
 | 
			
		||||
      showInfo(`通道 ${item.name} 测试成功,耗时 ${time.toFixed(2)} 秒。`);
 | 
			
		||||
      showInfo(`渠道 ${item.name} 测试成功,耗时 ${time.toFixed(2)} 秒。`);
 | 
			
		||||
    }
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
@@ -243,9 +243,9 @@ export default function ChannelTableRow({
 | 
			
		||||
      </Popover>
 | 
			
		||||
 | 
			
		||||
      <Dialog open={openDelete} onClose={handleDeleteClose}>
 | 
			
		||||
        <DialogTitle>删除通道</DialogTitle>
 | 
			
		||||
        <DialogTitle>删除渠道</DialogTitle>
 | 
			
		||||
        <DialogContent>
 | 
			
		||||
          <DialogContentText>是否删除通道 {item.name}?</DialogContentText>
 | 
			
		||||
          <DialogContentText>是否删除渠道 {item.name}?</DialogContentText>
 | 
			
		||||
        </DialogContent>
 | 
			
		||||
        <DialogActions>
 | 
			
		||||
          <Button onClick={handleDeleteClose}>关闭</Button>
 | 
			
		||||
 
 | 
			
		||||
@@ -135,7 +135,7 @@ export default function ChannelPage() {
 | 
			
		||||
    const res = await API.get(`/api/channel/test`);
 | 
			
		||||
    const { success, message } = res.data;
 | 
			
		||||
    if (success) {
 | 
			
		||||
      showInfo('已成功开始测试所有通道,请刷新页面查看结果。');
 | 
			
		||||
      showInfo('已成功开始测试所有渠道,请刷新页面查看结果。');
 | 
			
		||||
    } else {
 | 
			
		||||
      showError(message);
 | 
			
		||||
    }
 | 
			
		||||
@@ -159,7 +159,7 @@ export default function ChannelPage() {
 | 
			
		||||
    const res = await API.get(`/api/channel/update_balance`);
 | 
			
		||||
    const { success, message } = res.data;
 | 
			
		||||
    if (success) {
 | 
			
		||||
      showInfo('已更新完毕所有已启用通道余额!');
 | 
			
		||||
      showInfo('已更新完毕所有已启用渠道余额!');
 | 
			
		||||
    } else {
 | 
			
		||||
      showError(message);
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -371,7 +371,7 @@ const OperationSetting = () => {
 | 
			
		||||
                value={inputs.ChannelDisableThreshold}
 | 
			
		||||
                onChange={handleInputChange}
 | 
			
		||||
                label="最长响应时间"
 | 
			
		||||
                placeholder="单位秒,当运行通道全部测试时,超过此时间将自动禁用通道"
 | 
			
		||||
                placeholder="单位秒,当运行渠道全部测试时,超过此时间将自动禁用渠道"
 | 
			
		||||
                disabled={loading}
 | 
			
		||||
              />
 | 
			
		||||
            </FormControl>
 | 
			
		||||
@@ -392,7 +392,7 @@ const OperationSetting = () => {
 | 
			
		||||
            </FormControl>
 | 
			
		||||
          </Stack>
 | 
			
		||||
          <FormControlLabel
 | 
			
		||||
            label="失败时自动禁用通道"
 | 
			
		||||
            label="失败时自动禁用渠道"
 | 
			
		||||
            control={
 | 
			
		||||
              <Checkbox
 | 
			
		||||
                checked={inputs.AutomaticDisableChannelEnabled === "true"}
 | 
			
		||||
@@ -402,7 +402,7 @@ const OperationSetting = () => {
 | 
			
		||||
            }
 | 
			
		||||
          />
 | 
			
		||||
          <FormControlLabel
 | 
			
		||||
            label="成功时自动启用通道"
 | 
			
		||||
            label="成功时自动启用渠道"
 | 
			
		||||
            control={
 | 
			
		||||
              <Checkbox
 | 
			
		||||
                checked={inputs.AutomaticEnableChannelEnabled === "true"}
 | 
			
		||||
 
 | 
			
		||||
@@ -234,7 +234,7 @@ const ChannelsTable = () => {
 | 
			
		||||
      newChannels[realIdx].response_time = time * 1000;
 | 
			
		||||
      newChannels[realIdx].test_time = Date.now() / 1000;
 | 
			
		||||
      setChannels(newChannels);
 | 
			
		||||
      showInfo(`通道 ${name} 测试成功,耗时 ${time.toFixed(2)} 秒。`);
 | 
			
		||||
      showInfo(`渠道 ${name} 测试成功,耗时 ${time.toFixed(2)} 秒。`);
 | 
			
		||||
    } else {
 | 
			
		||||
      showError(message);
 | 
			
		||||
    }
 | 
			
		||||
@@ -244,7 +244,7 @@ const ChannelsTable = () => {
 | 
			
		||||
    const res = await API.get(`/api/channel/test?scope=${scope}`);
 | 
			
		||||
    const { success, message } = res.data;
 | 
			
		||||
    if (success) {
 | 
			
		||||
      showInfo('已成功开始测试通道,请刷新页面查看结果。');
 | 
			
		||||
      showInfo('已成功开始测试渠道,请刷新页面查看结果。');
 | 
			
		||||
    } else {
 | 
			
		||||
      showError(message);
 | 
			
		||||
    }
 | 
			
		||||
@@ -270,7 +270,7 @@ const ChannelsTable = () => {
 | 
			
		||||
      newChannels[realIdx].balance = balance;
 | 
			
		||||
      newChannels[realIdx].balance_updated_time = Date.now() / 1000;
 | 
			
		||||
      setChannels(newChannels);
 | 
			
		||||
      showInfo(`通道 ${name} 余额更新成功!`);
 | 
			
		||||
      showInfo(`渠道 ${name} 余额更新成功!`);
 | 
			
		||||
    } else {
 | 
			
		||||
      showError(message);
 | 
			
		||||
    }
 | 
			
		||||
@@ -281,7 +281,7 @@ const ChannelsTable = () => {
 | 
			
		||||
    const res = await API.get(`/api/channel/update_balance`);
 | 
			
		||||
    const { success, message } = res.data;
 | 
			
		||||
    if (success) {
 | 
			
		||||
      showInfo('已更新完毕所有已启用通道余额!');
 | 
			
		||||
      showInfo('已更新完毕所有已启用渠道余额!');
 | 
			
		||||
    } else {
 | 
			
		||||
      showError(message);
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -261,7 +261,7 @@ const OperationSetting = () => {
 | 
			
		||||
              value={inputs.ChannelDisableThreshold}
 | 
			
		||||
              type='number'
 | 
			
		||||
              min='0'
 | 
			
		||||
              placeholder='单位秒,当运行通道全部测试时,超过此时间将自动禁用通道'
 | 
			
		||||
              placeholder='单位秒,当运行渠道全部测试时,超过此时间将自动禁用渠道'
 | 
			
		||||
            />
 | 
			
		||||
            <Form.Input
 | 
			
		||||
              label='额度提醒阈值'
 | 
			
		||||
@@ -277,13 +277,13 @@ const OperationSetting = () => {
 | 
			
		||||
          <Form.Group inline>
 | 
			
		||||
            <Form.Checkbox
 | 
			
		||||
              checked={inputs.AutomaticDisableChannelEnabled === 'true'}
 | 
			
		||||
              label='失败时自动禁用通道'
 | 
			
		||||
              label='失败时自动禁用渠道'
 | 
			
		||||
              name='AutomaticDisableChannelEnabled'
 | 
			
		||||
              onChange={handleInputChange}
 | 
			
		||||
            />
 | 
			
		||||
            <Form.Checkbox
 | 
			
		||||
              checked={inputs.AutomaticEnableChannelEnabled === 'true'}
 | 
			
		||||
              label='成功时自动启用通道'
 | 
			
		||||
              label='成功时自动启用渠道'
 | 
			
		||||
              name='AutomaticEnableChannelEnabled'
 | 
			
		||||
              onChange={handleInputChange}
 | 
			
		||||
            />
 | 
			
		||||
 
 | 
			
		||||
@@ -83,6 +83,7 @@ const EditChannel = () => {
 | 
			
		||||
        data.model_mapping = JSON.stringify(JSON.parse(data.model_mapping), null, 2);
 | 
			
		||||
      }
 | 
			
		||||
      setInputs(data);
 | 
			
		||||
      setBasicModels(getChannelModels(data.type));
 | 
			
		||||
    } else {
 | 
			
		||||
      showError(message);
 | 
			
		||||
    }
 | 
			
		||||
@@ -99,9 +100,6 @@ const EditChannel = () => {
 | 
			
		||||
      }));
 | 
			
		||||
      setOriginModelOptions(localModelOptions);
 | 
			
		||||
      setFullModels(res.data.data.map((model) => model.id));
 | 
			
		||||
      setBasicModels(res.data.data.filter((model) => {
 | 
			
		||||
        return model.id.startsWith('gpt-3') || model.id.startsWith('text-');
 | 
			
		||||
      }).map((model) => model.id));
 | 
			
		||||
    } catch (error) {
 | 
			
		||||
      showError(error.message);
 | 
			
		||||
    }
 | 
			
		||||
@@ -137,6 +135,9 @@ const EditChannel = () => {
 | 
			
		||||
  useEffect(() => {
 | 
			
		||||
    if (isEdit) {
 | 
			
		||||
      loadChannel().then();
 | 
			
		||||
    } else {
 | 
			
		||||
      let localModels = getChannelModels(inputs.type);
 | 
			
		||||
      setBasicModels(localModels);
 | 
			
		||||
    }
 | 
			
		||||
    fetchModels().then();
 | 
			
		||||
    fetchGroups().then();
 | 
			
		||||
@@ -355,7 +356,7 @@ const EditChannel = () => {
 | 
			
		||||
          <div style={{ lineHeight: '40px', marginBottom: '12px' }}>
 | 
			
		||||
            <Button type={'button'} onClick={() => {
 | 
			
		||||
              handleInputChange(null, { name: 'models', value: basicModels });
 | 
			
		||||
            }}>填入基础模型</Button>
 | 
			
		||||
            }}>填入相关模型</Button>
 | 
			
		||||
            <Button type={'button'} onClick={() => {
 | 
			
		||||
              handleInputChange(null, { name: 'models', value: fullModels });
 | 
			
		||||
            }}>填入所有模型</Button>
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user