diff --git a/adapter/request.go b/adapter/request.go index 1b019dc..9f097e0 100644 --- a/adapter/request.go +++ b/adapter/request.go @@ -2,12 +2,24 @@ package adapter import ( "chat/globals" + "fmt" + "strings" + "time" ) func IsAvailableError(err error) bool { return err != nil && err.Error() != "signal" } +func isQPSOverLimit(model string, err error) bool { + switch model { + case globals.SparkDesk, globals.SparkDeskV2, globals.SparkDeskV3: + return strings.Contains(err.Error(), "AppIdQpsOverFlowError") + default: + return false + } +} + func getRetries(retries *int) int { if retries == nil { return defaultMaxRetries @@ -19,11 +31,23 @@ func getRetries(retries *int) int { func NewChatRequest(props *ChatProps, hook globals.Hook) error { err := createChatRequest(props, hook) - props.Current++ retries := getRetries(props.MaxRetries) + props.Current++ + if props.Current > 1 { + fmt.Println(fmt.Sprintf("retrying chat request for %s (attempt %d/%d, error: %s)", props.Model, props.Current, retries, err.Error())) + } - if IsAvailableError(err) && props.Current < retries { - return NewChatRequest(props, hook) + if IsAvailableError(err) { + if isQPSOverLimit(props.Model, err) { + // sleep for 0.5s to avoid qps limit + + time.Sleep(500 * time.Millisecond) + return NewChatRequest(props, hook) + } + + if props.Current < retries { + return NewChatRequest(props, hook) + } } return err diff --git a/addition/article/generate.go b/addition/article/generate.go index 23497bc..ec27fd1 100644 --- a/addition/article/generate.go +++ b/addition/article/generate.go @@ -48,11 +48,11 @@ func CreateGenerationWorker(c *gin.Context, user *auth.User, model string, promp titles := ParseTitle(title) result := make(chan Response, len(titles)) - go func() { - for _, title := range titles { + for _, title := range titles { + go func(title string) { result <- GenerateArticle(c, user, model, hash, title, prompt, enableWeb) - } - }() + }(title) + } return len(titles), result } diff --git a/app/src/admin/colors.ts b/app/src/admin/colors.ts index 842043f..15cc449 100644 --- a/app/src/admin/colors.ts +++ b/app/src/admin/colors.ts @@ -19,6 +19,7 @@ export const modelColorMapper: Record = { "gpt-4": "#8e43e7", "gpt-4-1106-preview": "#8e43e7", + "gpt-4-vision-preview": "#8e43e7", "gpt-4-0613": "#8e43e7", "gpt-4-0314": "#8e43e7", "gpt-4-all": "#8e43e7", @@ -64,6 +65,11 @@ export const modelColorMapper: Record = { hunyuan: "#0052d9", "360-gpt-v9": "#1db91e", + "baichuan-53b": "#ff9800", + "skylark-lite-public": "#a4f2ff", + "skylark-plus-public": "#a4f2ff", + "skylark-pro-public": "#a4f2ff", + "skylark-chat": "#a4f2ff", }; export function getModelColor(model: string): string { diff --git a/app/src/assets/main.less b/app/src/assets/main.less index 515ad7b..331776d 100644 --- a/app/src/assets/main.less +++ b/app/src/assets/main.less @@ -99,6 +99,19 @@ strong { transform: translate(var(--tw-translate-x), calc(var(--tw-translate-y) - 1rem)) !important; } } + + .link { + color: hsl(var(--text-secondary)); + text-decoration: none; + transition: color 0.2s ease-in-out; + user-select: none; + cursor: pointer; + margin: 0.5rem auto; + + &:hover { + color: hsl(var(--text)); + } + } } .cent { diff --git a/app/src/assets/pages/quota.less b/app/src/assets/pages/quota.less index 2ece261..788def9 100644 --- a/app/src/assets/pages/quota.less +++ b/app/src/assets/pages/quota.less @@ -21,6 +21,7 @@ flex-direction: column; gap: 6px; max-width: calc(90vw - 3rem); + margin: 0.5rem auto; } } @@ -35,7 +36,7 @@ } .quota-dialog { - max-width: min(90vw, 1044px) !important; + max-width: min(90vw, 844px) !important; } .amount-container { diff --git a/app/src/components/Message.tsx b/app/src/components/Message.tsx index 1ea4af6..6abdb3c 100644 --- a/app/src/components/Message.tsx +++ b/app/src/components/Message.tsx @@ -47,7 +47,11 @@ function MessageSegment(props: MessageProps) { -
+
{(message.quota < 0 ? 0 : message.quota).toFixed(2)} diff --git a/app/src/components/app/MenuBar.tsx b/app/src/components/app/MenuBar.tsx index 1a150bf..2c11b4f 100644 --- a/app/src/components/app/MenuBar.tsx +++ b/app/src/components/app/MenuBar.tsx @@ -12,10 +12,10 @@ import { } from "@/components/ui/dropdown-menu.tsx"; import { Button } from "@/components/ui/button.tsx"; import { - BadgeCent, Boxes, CalendarPlus, Cloud, + Cloudy, Gift, ListStart, Plug, @@ -52,7 +52,7 @@ function MenuBar({ children, className }: MenuBarProps) { {quota} dispatch(openQuotaDialog())}> - + {t("quota")} dispatch(openSub())}> diff --git a/app/src/components/home/assemblies/ChatInput.tsx b/app/src/components/home/assemblies/ChatInput.tsx index ad346be..8c1a69a 100644 --- a/app/src/components/home/assemblies/ChatInput.tsx +++ b/app/src/components/home/assemblies/ChatInput.tsx @@ -19,7 +19,7 @@ function ChatInput({ onEnterPressed, }: ChatInputProps) { const { t } = useTranslation(); - const [stamp, setStamp] = React.useState(0); + const [pressed, setPressed] = React.useState(false); return (