mirror of
https://github.com/linux-do/new-api.git
synced 2025-09-17 16:06:38 +08:00
Merge pull request #53 from Calcium-Ion/fork/main
feat: 令牌聊天新增ChatGPT Web & Midjourney支持
This commit is contained in:
commit
5b2377eea9
@ -21,6 +21,7 @@ var Footer = ""
|
|||||||
var Logo = ""
|
var Logo = ""
|
||||||
var TopUpLink = ""
|
var TopUpLink = ""
|
||||||
var ChatLink = ""
|
var ChatLink = ""
|
||||||
|
var ChatLink2 = ""
|
||||||
var QuotaPerUnit = 500 * 1000.0 // $0.002 / 1K tokens
|
var QuotaPerUnit = 500 * 1000.0 // $0.002 / 1K tokens
|
||||||
var DisplayInCurrencyEnabled = true
|
var DisplayInCurrencyEnabled = true
|
||||||
var DisplayTokenStatEnabled = true
|
var DisplayTokenStatEnabled = true
|
||||||
|
@ -31,6 +31,7 @@ func GetStatus(c *gin.Context) {
|
|||||||
"turnstile_site_key": common.TurnstileSiteKey,
|
"turnstile_site_key": common.TurnstileSiteKey,
|
||||||
"top_up_link": common.TopUpLink,
|
"top_up_link": common.TopUpLink,
|
||||||
"chat_link": common.ChatLink,
|
"chat_link": common.ChatLink,
|
||||||
|
"chat_link2": common.ChatLink2,
|
||||||
"quota_per_unit": common.QuotaPerUnit,
|
"quota_per_unit": common.QuotaPerUnit,
|
||||||
"display_in_currency": common.DisplayInCurrencyEnabled,
|
"display_in_currency": common.DisplayInCurrencyEnabled,
|
||||||
"enable_batch_update": common.BatchUpdateEnabled,
|
"enable_batch_update": common.BatchUpdateEnabled,
|
||||||
|
@ -76,6 +76,7 @@ func InitOptionMap() {
|
|||||||
common.OptionMap["GroupRatio"] = common.GroupRatio2JSONString()
|
common.OptionMap["GroupRatio"] = common.GroupRatio2JSONString()
|
||||||
common.OptionMap["TopUpLink"] = common.TopUpLink
|
common.OptionMap["TopUpLink"] = common.TopUpLink
|
||||||
common.OptionMap["ChatLink"] = common.ChatLink
|
common.OptionMap["ChatLink"] = common.ChatLink
|
||||||
|
common.OptionMap["ChatLink2"] = common.ChatLink2
|
||||||
common.OptionMap["QuotaPerUnit"] = strconv.FormatFloat(common.QuotaPerUnit, 'f', -1, 64)
|
common.OptionMap["QuotaPerUnit"] = strconv.FormatFloat(common.QuotaPerUnit, 'f', -1, 64)
|
||||||
common.OptionMap["RetryTimes"] = strconv.Itoa(common.RetryTimes)
|
common.OptionMap["RetryTimes"] = strconv.Itoa(common.RetryTimes)
|
||||||
common.OptionMap["DataExportInterval"] = strconv.Itoa(common.DataExportInterval)
|
common.OptionMap["DataExportInterval"] = strconv.Itoa(common.DataExportInterval)
|
||||||
@ -241,6 +242,8 @@ func updateOptionMap(key string, value string) (err error) {
|
|||||||
common.TopUpLink = value
|
common.TopUpLink = value
|
||||||
case "ChatLink":
|
case "ChatLink":
|
||||||
common.ChatLink = value
|
common.ChatLink = value
|
||||||
|
case "ChatLink2":
|
||||||
|
common.ChatLink2 = value
|
||||||
case "ChannelDisableThreshold":
|
case "ChannelDisableThreshold":
|
||||||
common.ChannelDisableThreshold, _ = strconv.ParseFloat(value, 64)
|
common.ChannelDisableThreshold, _ = strconv.ParseFloat(value, 64)
|
||||||
case "QuotaPerUnit":
|
case "QuotaPerUnit":
|
||||||
|
@ -57,6 +57,11 @@ function App() {
|
|||||||
} else {
|
} else {
|
||||||
localStorage.removeItem('chat_link');
|
localStorage.removeItem('chat_link');
|
||||||
}
|
}
|
||||||
|
if (data.chat_link2) {
|
||||||
|
localStorage.setItem('chat_link2', data.chat_link2);
|
||||||
|
} else {
|
||||||
|
localStorage.removeItem('chat_link2');
|
||||||
|
}
|
||||||
// if (
|
// if (
|
||||||
// data.version !== process.env.REACT_APP_VERSION &&
|
// data.version !== process.env.REACT_APP_VERSION &&
|
||||||
// data.version !== 'v0.0.0' &&
|
// data.version !== 'v0.0.0' &&
|
||||||
|
@ -15,6 +15,7 @@ const OperationSetting = () => {
|
|||||||
GroupRatio: '',
|
GroupRatio: '',
|
||||||
TopUpLink: '',
|
TopUpLink: '',
|
||||||
ChatLink: '',
|
ChatLink: '',
|
||||||
|
ChatLink2: '', // 添加的新状态变量
|
||||||
QuotaPerUnit: 0,
|
QuotaPerUnit: 0,
|
||||||
AutomaticDisableChannelEnabled: '',
|
AutomaticDisableChannelEnabled: '',
|
||||||
ChannelDisableThreshold: 0,
|
ChannelDisableThreshold: 0,
|
||||||
@ -141,6 +142,9 @@ const OperationSetting = () => {
|
|||||||
if (originInputs['ChatLink'] !== inputs.ChatLink) {
|
if (originInputs['ChatLink'] !== inputs.ChatLink) {
|
||||||
await updateOption('ChatLink', inputs.ChatLink);
|
await updateOption('ChatLink', inputs.ChatLink);
|
||||||
}
|
}
|
||||||
|
if (originInputs['ChatLink2'] !== inputs.ChatLink2) {
|
||||||
|
await updateOption('ChatLink2', inputs.ChatLink2);
|
||||||
|
}
|
||||||
if (originInputs['QuotaPerUnit'] !== inputs.QuotaPerUnit) {
|
if (originInputs['QuotaPerUnit'] !== inputs.QuotaPerUnit) {
|
||||||
await updateOption('QuotaPerUnit', inputs.QuotaPerUnit);
|
await updateOption('QuotaPerUnit', inputs.QuotaPerUnit);
|
||||||
}
|
}
|
||||||
@ -179,7 +183,7 @@ const OperationSetting = () => {
|
|||||||
placeholder='例如发卡网站的购买链接'
|
placeholder='例如发卡网站的购买链接'
|
||||||
/>
|
/>
|
||||||
<Form.Input
|
<Form.Input
|
||||||
label='聊天页面链接'
|
label='默认聊天页面链接'
|
||||||
name='ChatLink'
|
name='ChatLink'
|
||||||
onChange={handleInputChange}
|
onChange={handleInputChange}
|
||||||
autoComplete='new-password'
|
autoComplete='new-password'
|
||||||
@ -187,6 +191,15 @@ const OperationSetting = () => {
|
|||||||
type='link'
|
type='link'
|
||||||
placeholder='例如 ChatGPT Next Web 的部署地址'
|
placeholder='例如 ChatGPT Next Web 的部署地址'
|
||||||
/>
|
/>
|
||||||
|
<Form.Input
|
||||||
|
label='聊天页面2链接'
|
||||||
|
name='ChatLink2'
|
||||||
|
onChange={handleInputChange}
|
||||||
|
autoComplete='new-password'
|
||||||
|
value={inputs.ChatLink2}
|
||||||
|
type='link'
|
||||||
|
placeholder='例如 ChatGPT Web & Midjourney 的部署地址'
|
||||||
|
/>
|
||||||
<Form.Input
|
<Form.Input
|
||||||
label='单位美元额度'
|
label='单位美元额度'
|
||||||
name='QuotaPerUnit'
|
name='QuotaPerUnit'
|
||||||
|
@ -22,12 +22,12 @@ import {
|
|||||||
import EditToken from "../pages/Token/EditToken";
|
import EditToken from "../pages/Token/EditToken";
|
||||||
const COPY_OPTIONS = [
|
const COPY_OPTIONS = [
|
||||||
{key: 'next', text: 'ChatGPT Next Web', value: 'next'},
|
{key: 'next', text: 'ChatGPT Next Web', value: 'next'},
|
||||||
{key: 'ama', text: 'AMA 问天', value: 'ama'},
|
{key: 'ama', text: 'ChatGPT Web & Midjourney', value: 'ama'},
|
||||||
{key: 'opencat', text: 'OpenCat', value: 'opencat'},
|
{key: 'opencat', text: 'OpenCat', value: 'opencat'},
|
||||||
];
|
];
|
||||||
|
|
||||||
const OPEN_LINK_OPTIONS = [
|
const OPEN_LINK_OPTIONS = [
|
||||||
{key: 'ama', text: 'AMA 问天', value: 'ama'},
|
{key: 'ama', text: 'ChatGPT Web & Midjourney', value: 'ama'},
|
||||||
{key: 'opencat', text: 'OpenCat', value: 'opencat'},
|
{key: 'opencat', text: 'OpenCat', value: 'opencat'},
|
||||||
];
|
];
|
||||||
|
|
||||||
@ -63,6 +63,7 @@ const TokensTable = () => {
|
|||||||
const link_menu = [
|
const link_menu = [
|
||||||
{node: 'item', key: 'next', name: 'ChatGPT Next Web', onClick: () => {onOpenLink('next')}},
|
{node: 'item', key: 'next', name: 'ChatGPT Next Web', onClick: () => {onOpenLink('next')}},
|
||||||
{node: 'item', key: 'ama', name: 'AMA 问天', value: 'ama'},
|
{node: 'item', key: 'ama', name: 'AMA 问天', value: 'ama'},
|
||||||
|
{node: 'item', key: 'next-mj', name: 'ChatGPT Web & Midjourney', value: 'next-mj', onClick: () => {onOpenLink('next-mj')}},
|
||||||
{node: 'item', key: 'opencat', name: 'OpenCat', value: 'opencat'},
|
{node: 'item', key: 'opencat', name: 'OpenCat', value: 'opencat'},
|
||||||
];
|
];
|
||||||
|
|
||||||
@ -150,7 +151,8 @@ const TokensTable = () => {
|
|||||||
<Button theme="light" style={{ color: 'rgba(var(--semi-teal-7), 1)' }} onClick={()=>{onOpenLink('next', record.key)}}>聊天</Button>
|
<Button theme="light" style={{ color: 'rgba(var(--semi-teal-7), 1)' }} onClick={()=>{onOpenLink('next', record.key)}}>聊天</Button>
|
||||||
<Dropdown trigger="click" position="bottomRight" menu={
|
<Dropdown trigger="click" position="bottomRight" menu={
|
||||||
[
|
[
|
||||||
{node: 'item', key: 'next', name: 'ChatGPT Next Web', onClick: () => {onOpenLink('next', record.key)}},
|
{node: 'item', key: 'next', disabled: !localStorage.getItem('chat_link'), name: 'ChatGPT Next Web', onClick: () => {onOpenLink('next', record.key)}},
|
||||||
|
{node: 'item', key: 'next-mj', disabled: !localStorage.getItem('chat_link2'), name: 'ChatGPT Web & Midjourney', onClick: () => {onOpenLink('next-mj', record.key)}},
|
||||||
{node: 'item', key: 'ama', name: 'AMA 问天(BotGrem)', onClick: () => {onOpenLink('ama', record.key)}},
|
{node: 'item', key: 'ama', name: 'AMA 问天(BotGrem)', onClick: () => {onOpenLink('ama', record.key)}},
|
||||||
{node: 'item', key: 'opencat', name: 'OpenCat', onClick: () => {onOpenLink('opencat', record.key)}},
|
{node: 'item', key: 'opencat', name: 'OpenCat', onClick: () => {onOpenLink('opencat', record.key)}},
|
||||||
]
|
]
|
||||||
@ -285,6 +287,7 @@ const TokensTable = () => {
|
|||||||
}
|
}
|
||||||
let encodedServerAddress = encodeURIComponent(serverAddress);
|
let encodedServerAddress = encodeURIComponent(serverAddress);
|
||||||
const nextLink = localStorage.getItem('chat_link');
|
const nextLink = localStorage.getItem('chat_link');
|
||||||
|
const mjLink = localStorage.getItem('chat_link2');
|
||||||
let nextUrl;
|
let nextUrl;
|
||||||
|
|
||||||
if (nextLink) {
|
if (nextLink) {
|
||||||
@ -296,7 +299,7 @@ const TokensTable = () => {
|
|||||||
let url;
|
let url;
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case 'ama':
|
case 'ama':
|
||||||
url = `ama://set-api-key?server=${encodedServerAddress}&key=sk-${key}`;
|
url = mjLink + `/#/?settings={"key":"sk-${key}","url":"${serverAddress}"}`;
|
||||||
break;
|
break;
|
||||||
case 'opencat':
|
case 'opencat':
|
||||||
url = `opencat://team/join?domain=${encodedServerAddress}&token=sk-${key}`;
|
url = `opencat://team/join?domain=${encodedServerAddress}&token=sk-${key}`;
|
||||||
@ -336,25 +339,28 @@ const TokensTable = () => {
|
|||||||
}
|
}
|
||||||
let encodedServerAddress = encodeURIComponent(serverAddress);
|
let encodedServerAddress = encodeURIComponent(serverAddress);
|
||||||
const chatLink = localStorage.getItem('chat_link');
|
const chatLink = localStorage.getItem('chat_link');
|
||||||
|
const mjLink = localStorage.getItem('chat_link2');
|
||||||
let defaultUrl;
|
let defaultUrl;
|
||||||
|
|
||||||
if (chatLink) {
|
if (chatLink) {
|
||||||
defaultUrl = chatLink + `/#/?settings={"key":"sk-${key}","url":"${serverAddress}"}`;
|
defaultUrl = chatLink + `/#/?settings={"key":"sk-${key}","url":"${serverAddress}"}`;
|
||||||
} else {
|
|
||||||
showError('管理员未设置聊天链接')
|
|
||||||
return
|
|
||||||
}
|
}
|
||||||
let url;
|
let url;
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case 'ama':
|
case 'ama':
|
||||||
url = `ama://set-api-key?server=${encodedServerAddress}&key=sk-${key}`;
|
url = `ama://set-api-key?server=${encodedServerAddress}&key=sk-${key}`;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'opencat':
|
case 'opencat':
|
||||||
url = `opencat://team/join?domain=${encodedServerAddress}&token=sk-${key}`;
|
url = `opencat://team/join?domain=${encodedServerAddress}&token=sk-${key}`;
|
||||||
break;
|
break;
|
||||||
|
case 'next-mj':
|
||||||
|
url = mjLink + `/#/?settings={"key":"sk-${key}","url":"${serverAddress}"}`;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
|
if (!chatLink) {
|
||||||
|
showError('管理员未设置聊天链接')
|
||||||
|
return;
|
||||||
|
}
|
||||||
url = defaultUrl;
|
url = defaultUrl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user