Merge remote-tracking branch 'origin/ui/refactor' into ui/refactor
This commit is contained in:
@@ -43,7 +43,7 @@ type GeneralOpenAIRequest struct {
|
|||||||
ResponseFormat *ResponseFormat `json:"response_format,omitempty"`
|
ResponseFormat *ResponseFormat `json:"response_format,omitempty"`
|
||||||
EncodingFormat any `json:"encoding_format,omitempty"`
|
EncodingFormat any `json:"encoding_format,omitempty"`
|
||||||
Seed float64 `json:"seed,omitempty"`
|
Seed float64 `json:"seed,omitempty"`
|
||||||
ParallelTooCalls bool `json:"parallel_tool_calls,omitempty"`
|
ParallelTooCalls *bool `json:"parallel_tool_calls,omitempty"`
|
||||||
Tools []ToolCallRequest `json:"tools,omitempty"`
|
Tools []ToolCallRequest `json:"tools,omitempty"`
|
||||||
ToolChoice any `json:"tool_choice,omitempty"`
|
ToolChoice any `json:"tool_choice,omitempty"`
|
||||||
User string `json:"user,omitempty"`
|
User string `json:"user,omitempty"`
|
||||||
|
|||||||
@@ -122,11 +122,13 @@ func doRequest(c *gin.Context, req *http.Request, info *common.RelayInfo) (*http
|
|||||||
var pingerWg sync.WaitGroup
|
var pingerWg sync.WaitGroup
|
||||||
if info.IsStream {
|
if info.IsStream {
|
||||||
helper.SetEventStreamHeaders(c)
|
helper.SetEventStreamHeaders(c)
|
||||||
pingInterval := time.Duration(generalSettings.PingIntervalSeconds) * time.Second
|
|
||||||
var pingerCtx context.Context
|
|
||||||
pingerCtx, stopPinger = context.WithCancel(c.Request.Context())
|
|
||||||
|
|
||||||
if pingEnabled {
|
if pingEnabled {
|
||||||
|
pingInterval := time.Duration(generalSettings.PingIntervalSeconds) * time.Second
|
||||||
|
var pingerCtx context.Context
|
||||||
|
pingerCtx, stopPinger = context.WithCancel(c.Request.Context())
|
||||||
|
// 退出时清理 pingerCtx 防止泄露
|
||||||
|
defer stopPinger()
|
||||||
pingerWg.Add(1)
|
pingerWg.Add(1)
|
||||||
gopool.Go(func() {
|
gopool.Go(func() {
|
||||||
defer pingerWg.Done()
|
defer pingerWg.Done()
|
||||||
@@ -166,9 +168,8 @@ func doRequest(c *gin.Context, req *http.Request, info *common.RelayInfo) (*http
|
|||||||
}
|
}
|
||||||
|
|
||||||
resp, err := client.Do(req)
|
resp, err := client.Do(req)
|
||||||
// request结束后停止ping
|
// request结束后等待 ping goroutine 完成
|
||||||
if info.IsStream && pingEnabled {
|
if info.IsStream && pingEnabled {
|
||||||
stopPinger()
|
|
||||||
pingerWg.Wait()
|
pingerWg.Wait()
|
||||||
}
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -46,11 +46,23 @@ func getAndValidImageRequest(c *gin.Context, info *relaycommon.RelayInfo) (*dto.
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if imageRequest.Model == "" {
|
||||||
|
imageRequest.Model = "dall-e-3"
|
||||||
|
}
|
||||||
|
|
||||||
|
if strings.Contains(imageRequest.Size, "×") {
|
||||||
|
return nil, errors.New("size an unexpected error occurred in the parameter, please use 'x' instead of the multiplication sign '×'")
|
||||||
|
}
|
||||||
|
|
||||||
// Not "256x256", "512x512", or "1024x1024"
|
// Not "256x256", "512x512", or "1024x1024"
|
||||||
if imageRequest.Model == "dall-e-2" || imageRequest.Model == "dall-e" {
|
if imageRequest.Model == "dall-e-2" || imageRequest.Model == "dall-e" {
|
||||||
if imageRequest.Size != "" && imageRequest.Size != "256x256" && imageRequest.Size != "512x512" && imageRequest.Size != "1024x1024" {
|
if imageRequest.Size != "" && imageRequest.Size != "256x256" && imageRequest.Size != "512x512" && imageRequest.Size != "1024x1024" {
|
||||||
return nil, errors.New("size must be one of 256x256, 512x512, or 1024x1024 for dall-e-2 or dall-e")
|
return nil, errors.New("size must be one of 256x256, 512x512, or 1024x1024 for dall-e-2 or dall-e")
|
||||||
}
|
}
|
||||||
|
if imageRequest.Size == "" {
|
||||||
|
imageRequest.Size = "1024x1024"
|
||||||
|
}
|
||||||
} else if imageRequest.Model == "dall-e-3" {
|
} else if imageRequest.Model == "dall-e-3" {
|
||||||
if imageRequest.Size != "" && imageRequest.Size != "1024x1024" && imageRequest.Size != "1024x1792" && imageRequest.Size != "1792x1024" {
|
if imageRequest.Size != "" && imageRequest.Size != "1024x1024" && imageRequest.Size != "1024x1792" && imageRequest.Size != "1792x1024" {
|
||||||
return nil, errors.New("size must be one of 1024x1024, 1024x1792 or 1792x1024 for dall-e-3")
|
return nil, errors.New("size must be one of 1024x1024, 1024x1792 or 1792x1024 for dall-e-3")
|
||||||
@@ -58,74 +70,24 @@ func getAndValidImageRequest(c *gin.Context, info *relaycommon.RelayInfo) (*dto.
|
|||||||
if imageRequest.Quality == "" {
|
if imageRequest.Quality == "" {
|
||||||
imageRequest.Quality = "standard"
|
imageRequest.Quality = "standard"
|
||||||
}
|
}
|
||||||
// N should between 1 and 10
|
if imageRequest.Size == "" {
|
||||||
//if imageRequest.N != 0 && (imageRequest.N < 1 || imageRequest.N > 10) {
|
imageRequest.Size = "1024x1024"
|
||||||
// return service.OpenAIErrorWrapper(errors.New("n must be between 1 and 10"), "invalid_field_value", http.StatusBadRequest)
|
}
|
||||||
//}
|
} else if imageRequest.Model == "gpt-image-1" {
|
||||||
|
if imageRequest.Quality == "" {
|
||||||
|
imageRequest.Quality = "auto"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if imageRequest.Prompt == "" {
|
||||||
|
return nil, errors.New("prompt is required")
|
||||||
|
}
|
||||||
|
|
||||||
|
if imageRequest.N == 0 {
|
||||||
|
imageRequest.N = 1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if imageRequest.Prompt == "" {
|
|
||||||
return nil, errors.New("prompt is required")
|
|
||||||
}
|
|
||||||
|
|
||||||
if imageRequest.Model == "" {
|
|
||||||
imageRequest.Model = "dall-e-2"
|
|
||||||
}
|
|
||||||
if strings.Contains(imageRequest.Size, "×") {
|
|
||||||
return nil, errors.New("size an unexpected error occurred in the parameter, please use 'x' instead of the multiplication sign '×'")
|
|
||||||
}
|
|
||||||
if imageRequest.N == 0 {
|
|
||||||
imageRequest.N = 1
|
|
||||||
}
|
|
||||||
if imageRequest.Size == "" {
|
|
||||||
imageRequest.Size = "1024x1024"
|
|
||||||
}
|
|
||||||
|
|
||||||
err := common.UnmarshalBodyReusable(c, imageRequest)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
if imageRequest.Prompt == "" {
|
|
||||||
return nil, errors.New("prompt is required")
|
|
||||||
}
|
|
||||||
if strings.Contains(imageRequest.Size, "×") {
|
|
||||||
return nil, errors.New("size an unexpected error occurred in the parameter, please use 'x' instead of the multiplication sign '×'")
|
|
||||||
}
|
|
||||||
if imageRequest.N == 0 {
|
|
||||||
imageRequest.N = 1
|
|
||||||
}
|
|
||||||
if imageRequest.Size == "" {
|
|
||||||
imageRequest.Size = "1024x1024"
|
|
||||||
}
|
|
||||||
if imageRequest.Model == "" {
|
|
||||||
imageRequest.Model = "dall-e-2"
|
|
||||||
}
|
|
||||||
// x.ai grok-2-image not support size, quality or style
|
|
||||||
if imageRequest.Size == "empty" {
|
|
||||||
imageRequest.Size = ""
|
|
||||||
}
|
|
||||||
|
|
||||||
// Not "256x256", "512x512", or "1024x1024"
|
|
||||||
if imageRequest.Model == "dall-e-2" || imageRequest.Model == "dall-e" {
|
|
||||||
if imageRequest.Size != "" && imageRequest.Size != "256x256" && imageRequest.Size != "512x512" && imageRequest.Size != "1024x1024" {
|
|
||||||
return nil, errors.New("size must be one of 256x256, 512x512, or 1024x1024, dall-e-3 1024x1792 or 1792x1024")
|
|
||||||
}
|
|
||||||
} else if imageRequest.Model == "dall-e-3" {
|
|
||||||
if imageRequest.Size != "" && imageRequest.Size != "1024x1024" && imageRequest.Size != "1024x1792" && imageRequest.Size != "1792x1024" {
|
|
||||||
return nil, errors.New("size must be one of 256x256, 512x512, or 1024x1024, dall-e-3 1024x1792 or 1792x1024")
|
|
||||||
}
|
|
||||||
if imageRequest.Quality == "" {
|
|
||||||
imageRequest.Quality = "standard"
|
|
||||||
}
|
|
||||||
//if imageRequest.N != 1 {
|
|
||||||
// return nil, errors.New("n must be 1")
|
|
||||||
//}
|
|
||||||
}
|
|
||||||
// N should between 1 and 10
|
|
||||||
//if imageRequest.N != 0 && (imageRequest.N < 1 || imageRequest.N > 10) {
|
|
||||||
// return service.OpenAIErrorWrapper(errors.New("n must be between 1 and 10"), "invalid_field_value", http.StatusBadRequest)
|
|
||||||
//}
|
|
||||||
if setting.ShouldCheckPromptSensitive() {
|
if setting.ShouldCheckPromptSensitive() {
|
||||||
words, err := service.CheckSensitiveInput(imageRequest.Prompt)
|
words, err := service.CheckSensitiveInput(imageRequest.Prompt)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -229,6 +191,10 @@ func ImageHelper(c *gin.Context) *dto.OpenAIErrorWithStatusCode {
|
|||||||
requestBody = bytes.NewBuffer(jsonData)
|
requestBody = bytes.NewBuffer(jsonData)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if common.DebugEnabled {
|
||||||
|
println(fmt.Sprintf("image request body: %s", requestBody))
|
||||||
|
}
|
||||||
|
|
||||||
statusCodeMappingStr := c.GetString("status_code_mapping")
|
statusCodeMappingStr := c.GetString("status_code_mapping")
|
||||||
|
|
||||||
resp, err := adaptor.DoRequest(c, relayInfo, requestBody)
|
resp, err := adaptor.DoRequest(c, relayInfo, requestBody)
|
||||||
|
|||||||
@@ -98,17 +98,6 @@ body {
|
|||||||
display: revert;
|
display: revert;
|
||||||
}
|
}
|
||||||
|
|
||||||
.semi-chat {
|
|
||||||
padding-top: 0 !important;
|
|
||||||
padding-bottom: 0 !important;
|
|
||||||
height: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.semi-chat-chatBox-content {
|
|
||||||
min-width: auto;
|
|
||||||
word-break: break-word;
|
|
||||||
}
|
|
||||||
|
|
||||||
.tableHiddle {
|
.tableHiddle {
|
||||||
display: none !important;
|
display: none !important;
|
||||||
}
|
}
|
||||||
@@ -158,4 +147,114 @@ code {
|
|||||||
|
|
||||||
.semi-tabs-content {
|
.semi-tabs-content {
|
||||||
padding: 0 !important;
|
padding: 0 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 聊天 */
|
||||||
|
.semi-chat {
|
||||||
|
padding-top: 0 !important;
|
||||||
|
padding-bottom: 0 !important;
|
||||||
|
height: 100%;
|
||||||
|
max-width: 100% !important;
|
||||||
|
width: 100% !important;
|
||||||
|
overflow: hidden !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.semi-chat-chatBox {
|
||||||
|
max-width: 100% !important;
|
||||||
|
overflow: hidden !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.semi-chat-chatBox-wrap {
|
||||||
|
max-width: 100% !important;
|
||||||
|
overflow: hidden !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.semi-chat-chatBox-content {
|
||||||
|
min-width: auto;
|
||||||
|
word-break: break-word;
|
||||||
|
max-width: 100% !important;
|
||||||
|
overflow-wrap: break-word !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.semi-chat-content {
|
||||||
|
max-width: 100% !important;
|
||||||
|
overflow: hidden !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.semi-chat-list {
|
||||||
|
max-width: 100% !important;
|
||||||
|
overflow-x: hidden !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.semi-chat-container {
|
||||||
|
overflow-x: hidden !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.semi-chat-container::-webkit-scrollbar {
|
||||||
|
width: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.semi-chat-container::-webkit-scrollbar-thumb {
|
||||||
|
background: rgba(0, 0, 0, 0.1);
|
||||||
|
border-radius: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.semi-chat-container::-webkit-scrollbar-thumb:hover {
|
||||||
|
background: rgba(0, 0, 0, 0.15);
|
||||||
|
}
|
||||||
|
|
||||||
|
.semi-chat-container::-webkit-scrollbar-track {
|
||||||
|
background: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 隐藏模型设置区域的滚动条 */
|
||||||
|
.model-settings-scroll::-webkit-scrollbar {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.model-settings-scroll {
|
||||||
|
-ms-overflow-style: none;
|
||||||
|
scrollbar-width: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 调试面板代码样式 */
|
||||||
|
.debug-code {
|
||||||
|
font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;
|
||||||
|
font-size: 11px;
|
||||||
|
line-height: 1.4;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 调试面板标签样式 */
|
||||||
|
.semi-tabs-content {
|
||||||
|
height: calc(100% - 40px) !important;
|
||||||
|
flex: 1 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.semi-tabs-content .semi-tabs-pane {
|
||||||
|
height: 100% !important;
|
||||||
|
overflow: hidden !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.semi-tabs-content .semi-tabs-pane>div {
|
||||||
|
height: 100% !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 调试面板特定样式 */
|
||||||
|
.debug-panel .semi-tabs {
|
||||||
|
height: 100% !important;
|
||||||
|
display: flex !important;
|
||||||
|
flex-direction: column !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.debug-panel .semi-tabs-bar {
|
||||||
|
flex-shrink: 0 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.debug-panel .semi-tabs-content {
|
||||||
|
flex: 1 !important;
|
||||||
|
overflow: hidden !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.semi-chat-chatBox-action {
|
||||||
|
column-gap: 0 !important;
|
||||||
}
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user