Compare commits

...

16 Commits

Author SHA1 Message Date
JustSong
9b6d5f76e0 fix: enhance douban_notice_2 for clarity on model name conversion
Some checks are pending
CI / Unit tests (push) Waiting to run
CI / commit_lint (push) Waiting to run
2025-02-03 00:11:43 +08:00
JustSong
2250f311e1 feat: add latest version of Claude model to constants 2025-02-02 22:25:52 +08:00
lyj
e43f758623 Update model.go (#1963) 2025-02-02 22:24:31 +08:00
江南一根葱
6ded638f70 fix: audio transcription 400 error (#1882) (#2003) 2025-02-02 22:22:42 +08:00
jiz4oh
ea3331b79a fix: remove duplicated model (#2012)
the model `llama-3.2-11b-vision-preview` was declared at 3915ce9814/relay/adaptor/groq/constants.go (L11)
2025-02-02 22:21:30 +08:00
Jeremy JIANG
7a97ddc03c fix: fix hunyuan paramete & update price (#2019)
* fix: omit null TopP and Temperature fields in request body

* feat: update Hunyuan model ratios
2025-02-02 22:20:38 +08:00
JustSong
d7028b55fd feat: update model list in Zhipu constants for expanded options 2025-02-02 22:15:42 +08:00
Jeremy JIANG
36a03f465b feat: update Zhipu model prices (#2020) 2025-02-02 22:06:07 +08:00
JustSong
ae16647047 fix: change settings tab item color for improved visibility 2025-02-02 21:32:49 +08:00
JustSong
4dbc2ad86d fix: update tooltip keys in Dashboard for consistency in statistics display 2025-02-02 20:25:14 +08:00
JustSong
94479c2800 fix: add success message for completed operations in translation files 2025-02-02 20:07:08 +08:00
JustSong
614903b524 feat: comment out stat value displays in Dashboard for cleaner UI 2025-02-02 19:58:51 +08:00
JustSong
1dc255c219 feat: add Account ID input field for specific channel type and prevent potential bug with undefined key 2025-02-02 19:52:34 +08:00
JustSong
15c27e4b12 feat: increase toast notification timeouts for better user experience 2025-02-02 19:22:26 +08:00
JustSong
a910d3ba25 feat: increase global API and web rate limits for improved performance 2025-02-02 19:20:50 +08:00
JustSong
34f889437d feat: update Dashboard CSS to change active settings tab color to black for better visibility 2025-02-02 19:08:38 +08:00
12 changed files with 104 additions and 52 deletions

View File

@@ -126,10 +126,10 @@ var ValidThemes = map[string]bool{
// All duration's unit is seconds // All duration's unit is seconds
// Shouldn't larger then RateLimitKeyExpirationDuration // Shouldn't larger then RateLimitKeyExpirationDuration
var ( var (
GlobalApiRateLimitNum = env.Int("GLOBAL_API_RATE_LIMIT", 240) GlobalApiRateLimitNum = env.Int("GLOBAL_API_RATE_LIMIT", 480)
GlobalApiRateLimitDuration int64 = 3 * 60 GlobalApiRateLimitDuration int64 = 3 * 60
GlobalWebRateLimitNum = env.Int("GLOBAL_WEB_RATE_LIMIT", 120) GlobalWebRateLimitNum = env.Int("GLOBAL_WEB_RATE_LIMIT", 240)
GlobalWebRateLimitDuration int64 = 3 * 60 GlobalWebRateLimitDuration int64 = 3 * 60
UploadRateLimitNum = 10 UploadRateLimitNum = 10

View File

@@ -3,10 +3,11 @@ package common
import ( import (
"bytes" "bytes"
"encoding/json" "encoding/json"
"github.com/gin-gonic/gin"
"github.com/songquanpeng/one-api/common/ctxkey"
"io" "io"
"strings" "strings"
"github.com/gin-gonic/gin"
"github.com/songquanpeng/one-api/common/ctxkey"
) )
func GetRequestBody(c *gin.Context) ([]byte, error) { func GetRequestBody(c *gin.Context) ([]byte, error) {
@@ -31,7 +32,6 @@ func UnmarshalBodyReusable(c *gin.Context, v any) error {
contentType := c.Request.Header.Get("Content-Type") contentType := c.Request.Header.Get("Content-Type")
if strings.HasPrefix(contentType, "application/json") { if strings.HasPrefix(contentType, "application/json") {
err = json.Unmarshal(requestBody, &v) err = json.Unmarshal(requestBody, &v)
c.Request.Body = io.NopCloser(bytes.NewBuffer(requestBody))
} else { } else {
c.Request.Body = io.NopCloser(bytes.NewBuffer(requestBody)) c.Request.Body = io.NopCloser(bytes.NewBuffer(requestBody))
err = c.ShouldBind(&v) err = c.ShouldBind(&v)
@@ -40,6 +40,7 @@ func UnmarshalBodyReusable(c *gin.Context, v any) error {
return err return err
} }
// Reset request body // Reset request body
c.Request.Body = io.NopCloser(bytes.NewBuffer(requestBody))
return nil return nil
} }

View File

@@ -4,6 +4,7 @@ var ModelList = []string{
"claude-instant-1.2", "claude-2.0", "claude-2.1", "claude-instant-1.2", "claude-2.0", "claude-2.1",
"claude-3-haiku-20240307", "claude-3-haiku-20240307",
"claude-3-5-haiku-20241022", "claude-3-5-haiku-20241022",
"claude-3-5-haiku-latest",
"claude-3-sonnet-20240229", "claude-3-sonnet-20240229",
"claude-3-opus-20240229", "claude-3-opus-20240229",
"claude-3-5-sonnet-20240620", "claude-3-5-sonnet-20240620",

View File

@@ -11,7 +11,6 @@ var ModelList = []string{
"llama-3.2-11b-vision-preview", "llama-3.2-11b-vision-preview",
"llama-3.2-1b-preview", "llama-3.2-1b-preview",
"llama-3.2-3b-preview", "llama-3.2-3b-preview",
"llama-3.2-11b-vision-preview",
"llama-3.2-90b-text-preview", "llama-3.2-90b-text-preview",
"llama-3.2-90b-vision-preview", "llama-3.2-90b-vision-preview",
"llama-guard-3-8b", "llama-guard-3-8b",

View File

@@ -1,7 +1,14 @@
package zhipu package zhipu
// https://open.bigmodel.cn/pricing
var ModelList = []string{ var ModelList = []string{
"chatglm_turbo", "chatglm_pro", "chatglm_std", "chatglm_lite", "glm-zero-preview", "glm-4-plus", "glm-4-0520", "glm-4-airx",
"glm-4", "glm-4v", "glm-3-turbo", "embedding-2", "glm-4-air", "glm-4-long", "glm-4-flashx", "glm-4-flash",
"cogview-3", "glm-4", "glm-3-turbo",
"glm-4v-plus", "glm-4v", "glm-4v-flash",
"cogview-3-plus", "cogview-3", "cogview-3-flash",
"cogviewx", "cogviewx-flash",
"charglm-4", "emohaa", "codegeex-4",
"embedding-2", "embedding-3",
} }

View File

@@ -82,15 +82,17 @@ var ModelRatio = map[string]float64{
"text-moderation-latest": 0.1, "text-moderation-latest": 0.1,
"dall-e-2": 0.02 * USD, // $0.016 - $0.020 / image "dall-e-2": 0.02 * USD, // $0.016 - $0.020 / image
"dall-e-3": 0.04 * USD, // $0.040 - $0.120 / image "dall-e-3": 0.04 * USD, // $0.040 - $0.120 / image
// https://www.anthropic.com/api#pricing // https://docs.anthropic.com/en/docs/about-claude/models
"claude-instant-1.2": 0.8 / 1000 * USD, "claude-instant-1.2": 0.8 / 1000 * USD,
"claude-2.0": 8.0 / 1000 * USD, "claude-2.0": 8.0 / 1000 * USD,
"claude-2.1": 8.0 / 1000 * USD, "claude-2.1": 8.0 / 1000 * USD,
"claude-3-haiku-20240307": 0.25 / 1000 * USD, "claude-3-haiku-20240307": 0.25 / 1000 * USD,
"claude-3-5-haiku-20241022": 1.0 / 1000 * USD, "claude-3-5-haiku-20241022": 1.0 / 1000 * USD,
"claude-3-5-haiku-latest": 1.0 / 1000 * USD,
"claude-3-sonnet-20240229": 3.0 / 1000 * USD, "claude-3-sonnet-20240229": 3.0 / 1000 * USD,
"claude-3-5-sonnet-20240620": 3.0 / 1000 * USD, "claude-3-5-sonnet-20240620": 3.0 / 1000 * USD,
"claude-3-5-sonnet-20241022": 3.0 / 1000 * USD, "claude-3-5-sonnet-20241022": 3.0 / 1000 * USD,
"claude-3-5-sonnet-latest" : 3.0 / 1000 * USD,
"claude-3-opus-20240229": 15.0 / 1000 * USD, "claude-3-opus-20240229": 15.0 / 1000 * USD,
// https://cloud.baidu.com/doc/WENXINWORKSHOP/s/hlrk4akp7 // https://cloud.baidu.com/doc/WENXINWORKSHOP/s/hlrk4akp7
"ERNIE-4.0-8K": 0.120 * RMB, "ERNIE-4.0-8K": 0.120 * RMB,
@@ -121,15 +123,29 @@ var ModelRatio = map[string]float64{
"gemini-2.0-flash-thinking-exp-01-21": 1, "gemini-2.0-flash-thinking-exp-01-21": 1,
"aqa": 1, "aqa": 1,
// https://open.bigmodel.cn/pricing // https://open.bigmodel.cn/pricing
"glm-4": 0.1 * RMB, "glm-zero-preview": 0.01 * RMB,
"glm-4v": 0.1 * RMB, "glm-4-plus": 0.05 * RMB,
"glm-3-turbo": 0.005 * RMB, "glm-4-0520": 0.1 * RMB,
"embedding-2": 0.0005 * RMB, "glm-4-airx": 0.01 * RMB,
"chatglm_turbo": 0.3572, // ¥0.005 / 1k tokens "glm-4-air": 0.0005 * RMB,
"chatglm_pro": 0.7143, // ¥0.01 / 1k tokens "glm-4-long": 0.001 * RMB,
"chatglm_std": 0.3572, // ¥0.005 / 1k tokens "glm-4-flashx": 0.0001 * RMB,
"chatglm_lite": 0.1429, // ¥0.002 / 1k tokens "glm-4-flash": 0,
"cogview-3": 0.25 * RMB, "glm-4": 0.1 * RMB, // deprecated model, available until 2025/06
"glm-3-turbo": 0.001 * RMB, // deprecated model, available until 2025/06
"glm-4v-plus": 0.004 * RMB,
"glm-4v": 0.05 * RMB,
"glm-4v-flash": 0,
"cogview-3-plus": 0.06 * RMB,
"cogview-3": 0.1 * RMB,
"cogview-3-flash": 0,
"cogviewx": 0.5 * RMB,
"cogviewx-flash": 0,
"charglm-4": 0.001 * RMB,
"emohaa": 0.015 * RMB,
"codegeex-4": 0.0001 * RMB,
"embedding-2": 0.0005 * RMB,
"embedding-3": 0.0005 * RMB,
// https://help.aliyun.com/zh/dashscope/developer-reference/tongyi-thousand-questions-metering-and-billing // https://help.aliyun.com/zh/dashscope/developer-reference/tongyi-thousand-questions-metering-and-billing
"qwen-turbo": 1.4286, // ¥0.02 / 1k tokens "qwen-turbo": 1.4286, // ¥0.02 / 1k tokens
"qwen-turbo-latest": 1.4286, "qwen-turbo-latest": 1.4286,
@@ -216,9 +232,19 @@ var ModelRatio = map[string]float64{
"embedding-bert-512-v1": 0.0715, // ¥0.001 / 1k tokens "embedding-bert-512-v1": 0.0715, // ¥0.001 / 1k tokens
"embedding_s1_v1": 0.0715, // ¥0.001 / 1k tokens "embedding_s1_v1": 0.0715, // ¥0.001 / 1k tokens
"semantic_similarity_s1_v1": 0.0715, // ¥0.001 / 1k tokens "semantic_similarity_s1_v1": 0.0715, // ¥0.001 / 1k tokens
"hunyuan": 7.143, // ¥0.1 / 1k tokens // https://cloud.tencent.com/document/product/1729/97731#e0e6be58-60c8-469f-bdeb-6c264ce3b4d0 // https://cloud.tencent.com/document/product/1729/97731#e0e6be58-60c8-469f-bdeb-6c264ce3b4d0
"ChatStd": 0.01 * RMB, "hunyuan-turbo": 0.015 * RMB,
"ChatPro": 0.1 * RMB, "hunyuan-large": 0.004 * RMB,
"hunyuan-large-longcontext": 0.006 * RMB,
"hunyuan-standard": 0.0008 * RMB,
"hunyuan-standard-256K": 0.0005 * RMB,
"hunyuan-translation-lite": 0.005 * RMB,
"hunyuan-role": 0.004 * RMB,
"hunyuan-functioncall": 0.004 * RMB,
"hunyuan-code": 0.004 * RMB,
"hunyuan-turbo-vision": 0.08 * RMB,
"hunyuan-vision": 0.018 * RMB,
"hunyuan-embedding": 0.0007 * RMB,
// https://platform.moonshot.cn/pricing // https://platform.moonshot.cn/pricing
"moonshot-v1-8k": 0.012 * RMB, "moonshot-v1-8k": 0.012 * RMB,
"moonshot-v1-32k": 0.024 * RMB, "moonshot-v1-32k": 0.024 * RMB,

View File

@@ -1,7 +1,7 @@
export const toastConstants = { export const toastConstants = {
SUCCESS_TIMEOUT: 1500, SUCCESS_TIMEOUT: 5000,
INFO_TIMEOUT: 3000, INFO_TIMEOUT: 8000,
ERROR_TIMEOUT: 5000, ERROR_TIMEOUT: 10000,
WARNING_TIMEOUT: 10000, WARNING_TIMEOUT: 10000,
NOTICE_TIMEOUT: 20000 NOTICE_TIMEOUT: 20000,
}; };

View File

@@ -85,7 +85,8 @@
"test_all_started": "Channel testing started successfully, please refresh page to see results.", "test_all_started": "Channel testing started successfully, please refresh page to see results.",
"delete_disabled_success": "Deleted all disabled channels, total: {{count}}", "delete_disabled_success": "Deleted all disabled channels, total: {{count}}",
"balance_update_success": "Channel {{name}} balance updated successfully!", "balance_update_success": "Channel {{name}} balance updated successfully!",
"all_balance_updated": "All enabled channel balances have been updated!" "all_balance_updated": "All enabled channel balances have been updated!",
"operation_success": "Operation completed successfully!"
}, },
"edit": { "edit": {
"title_edit": "Update Channel Information", "title_edit": "Update Channel Information",

View File

@@ -85,7 +85,8 @@
"test_all_started": "已成功开始测试渠道,请刷新页面查看结果。", "test_all_started": "已成功开始测试渠道,请刷新页面查看结果。",
"delete_disabled_success": "已删除所有禁用渠道,共计 {{count}} 个", "delete_disabled_success": "已删除所有禁用渠道,共计 {{count}} 个",
"balance_update_success": "渠道 {{name}} 余额更新成功!", "balance_update_success": "渠道 {{name}} 余额更新成功!",
"all_balance_updated": "已更新完毕所有已启用渠道余额!" "all_balance_updated": "已更新完毕所有已启用渠道余额!",
"operation_success": "操作成功完成!"
}, },
"edit": { "edit": {
"title_edit": "更新渠道信息", "title_edit": "更新渠道信息",
@@ -133,7 +134,7 @@
"coze_notice": "对于 Coze 而言,模型名称即 Bot ID你可以添加一个前缀 `bot-`,例如:`bot-123456`。", "coze_notice": "对于 Coze 而言,模型名称即 Bot ID你可以添加一个前缀 `bot-`,例如:`bot-123456`。",
"douban_notice": "对于豆包而言,需要手动去", "douban_notice": "对于豆包而言,需要手动去",
"douban_notice_link": "模型推理页面", "douban_notice_link": "模型推理页面",
"douban_notice_2": "创建推理接入点,以接入点名称作为模型名称,例如:`ep-20240608051426-tkxvl`。", "douban_notice_2": "创建推理接入点,以接入点名称作为模型名称,例如:`ep-20240608051426-tkxvl`。你可以结合模型重定向功能将其转换为常规的模型名称例如doubao-lite-4k -> ep-20240608051426-tkxvl前者作为 JSON 的 key后者作为 value。注意doubao-lite-4k 和 ep-20240608051426-tkxvl 都需要通过自定义模型的方式填入到本渠道的模型列表中。",
"aws_region_placeholder": "region例如us-west-2", "aws_region_placeholder": "region例如us-west-2",
"aws_ak_placeholder": "AWS IAM Access Key", "aws_ak_placeholder": "AWS IAM Access Key",
"aws_sk_placeholder": "AWS IAM Secret Key", "aws_sk_placeholder": "AWS IAM Secret Key",

View File

@@ -207,6 +207,9 @@ const EditChannel = () => {
return; return;
} }
let localInputs = { ...inputs }; let localInputs = { ...inputs };
if (localInputs.key === 'undefined|undefined|undefined') {
localInputs.key = ''; // prevent potential bug
}
if (localInputs.base_url && localInputs.base_url.endsWith('/')) { if (localInputs.base_url && localInputs.base_url.endsWith('/')) {
localInputs.base_url = localInputs.base_url.slice( localInputs.base_url = localInputs.base_url.slice(
0, 0,
@@ -622,6 +625,21 @@ const EditChannel = () => {
/> />
</Form.Field> </Form.Field>
))} ))}
{inputs.type === 37 && (
<Form.Field>
<Form.Input
label='Account ID'
name='user_id'
required
placeholder={
'请输入 Account ID例如d8d7c61dbc334c32d3ced580e4bf42b4'
}
onChange={handleConfigChange}
value={config.user_id}
autoComplete=''
/>
</Form.Field>
)}
{inputs.type !== 33 && !isEdit && ( {inputs.type !== 33 && !isEdit && (
<Form.Checkbox <Form.Checkbox
checked={batch} checked={batch}

View File

@@ -91,15 +91,15 @@
} }
.settings-tab .item { .settings-tab .item {
color: #2B3674 !important; color: #000 !important;
font-weight: 500 !important; font-weight: 500 !important;
padding: 0.8rem 1.2rem !important; padding: 0.8rem 1.2rem !important;
} }
.settings-tab .active.item { .settings-tab .active.item {
color: #4318FF !important; color: #000 !important;
font-weight: 600 !important; font-weight: 600 !important;
border-color: #4318FF !important; border-color: #000 !important;
} }
.ui.tab.segment { .ui.tab.segment {

View File

@@ -1,19 +1,17 @@
import React, { useEffect, useState } from 'react'; import React, {useEffect, useState} from 'react';
import { useTranslation } from 'react-i18next'; import {useTranslation} from 'react-i18next';
import { Card, Grid, Header, Segment, Statistic } from 'semantic-ui-react'; import {Card, Grid} from 'semantic-ui-react';
import { API, showError } from '../../helpers';
import moment from 'moment';
import { import {
LineChart, Bar,
BarChart,
CartesianGrid,
Legend,
Line, Line,
LineChart,
ResponsiveContainer,
Tooltip,
XAxis, XAxis,
YAxis, YAxis,
CartesianGrid,
Tooltip,
ResponsiveContainer,
BarChart,
Bar,
Legend,
} from 'recharts'; } from 'recharts';
import axios from 'axios'; import axios from 'axios';
import './Dashboard.css'; import './Dashboard.css';
@@ -244,7 +242,7 @@ const Dashboard = () => {
<Card.Content> <Card.Content>
<Card.Header> <Card.Header>
{t('dashboard.charts.requests.title')} {t('dashboard.charts.requests.title')}
<span className='stat-value'>{summaryData.todayRequests}</span> {/* <span className='stat-value'>{summaryData.todayRequests}</span> */}
</Card.Header> </Card.Header>
<div className='chart-container'> <div className='chart-container'>
<ResponsiveContainer <ResponsiveContainer
@@ -273,7 +271,7 @@ const Dashboard = () => {
t('dashboard.charts.requests.tooltip'), t('dashboard.charts.requests.tooltip'),
]} ]}
labelFormatter={(label) => labelFormatter={(label) =>
`${t('dashboard.tooltip.date')}: ${formatDate(label)}` `${t('dashboard.statistics.tooltip.date')}: ${formatDate(label)}`
} }
/> />
<Line <Line
@@ -296,9 +294,9 @@ const Dashboard = () => {
<Card.Content> <Card.Content>
<Card.Header> <Card.Header>
{t('dashboard.charts.quota.title')} {t('dashboard.charts.quota.title')}
<span className='stat-value'> {/* <span className='stat-value'>
${summaryData.todayQuota.toFixed(3)} ${summaryData.todayQuota.toFixed(3)}
</span> </span> */}
</Card.Header> </Card.Header>
<div className='chart-container'> <div className='chart-container'>
<ResponsiveContainer <ResponsiveContainer
@@ -327,7 +325,7 @@ const Dashboard = () => {
t('dashboard.charts.quota.tooltip'), t('dashboard.charts.quota.tooltip'),
]} ]}
labelFormatter={(label) => labelFormatter={(label) =>
`${t('dashboard.tooltip.date')}: ${formatDate(label)}` `${t('dashboard.statistics.tooltip.date')}: ${formatDate(label)}`
} }
/> />
<Line <Line
@@ -350,7 +348,7 @@ const Dashboard = () => {
<Card.Content> <Card.Content>
<Card.Header> <Card.Header>
{t('dashboard.charts.tokens.title')} {t('dashboard.charts.tokens.title')}
<span className='stat-value'>{summaryData.todayTokens}</span> {/* <span className='stat-value'>{summaryData.todayTokens}</span> */}
</Card.Header> </Card.Header>
<div className='chart-container'> <div className='chart-container'>
<ResponsiveContainer <ResponsiveContainer
@@ -379,7 +377,7 @@ const Dashboard = () => {
t('dashboard.charts.tokens.tooltip'), t('dashboard.charts.tokens.tooltip'),
]} ]}
labelFormatter={(label) => labelFormatter={(label) =>
`${t('dashboard.tooltip.date')}: ${formatDate(label)}` `${t('dashboard.statistics.tooltip.date')}: ${formatDate(label)}`
} }
/> />
<Line <Line
@@ -424,7 +422,7 @@ const Dashboard = () => {
boxShadow: '0 2px 8px rgba(0,0,0,0.1)', boxShadow: '0 2px 8px rgba(0,0,0,0.1)',
}} }}
labelFormatter={(label) => labelFormatter={(label) =>
`${t('dashboard.tooltip.date')}: ${formatDate(label)}` `${t('dashboard.statistics.tooltip.date')}: ${formatDate(label)}`
} }
/> />
<Legend <Legend