Commit ae8b09d4 by Calcium-Ion Committed by GitHub

Merge pull request #2190 from Sh1n3zZ/support-replicate-channel

feat: replicate channel flux model
parents 18b03600 af671d34
...@@ -71,6 +71,8 @@ func ChannelType2APIType(channelType int) (int, bool) { ...@@ -71,6 +71,8 @@ func ChannelType2APIType(channelType int) (int, bool) {
apiType = constant.APITypeSubmodel apiType = constant.APITypeSubmodel
case constant.ChannelTypeMiniMax: case constant.ChannelTypeMiniMax:
apiType = constant.APITypeMiniMax apiType = constant.APITypeMiniMax
case constant.ChannelTypeReplicate:
apiType = constant.APITypeReplicate
} }
if apiType == -1 { if apiType == -1 {
return constant.APITypeOpenAI, false return constant.APITypeOpenAI, false
......
...@@ -34,5 +34,6 @@ const ( ...@@ -34,5 +34,6 @@ const (
APITypeMoonshot APITypeMoonshot
APITypeSubmodel APITypeSubmodel
APITypeMiniMax APITypeMiniMax
APITypeReplicate
APITypeDummy // this one is only for count, do not add any channel after this APITypeDummy // this one is only for count, do not add any channel after this
) )
...@@ -53,6 +53,7 @@ const ( ...@@ -53,6 +53,7 @@ const (
ChannelTypeSubmodel = 53 ChannelTypeSubmodel = 53
ChannelTypeDoubaoVideo = 54 ChannelTypeDoubaoVideo = 54
ChannelTypeSora = 55 ChannelTypeSora = 55
ChannelTypeReplicate = 56
ChannelTypeDummy // this one is only for count, do not add any channel after this ChannelTypeDummy // this one is only for count, do not add any channel after this
) )
...@@ -114,6 +115,7 @@ var ChannelBaseURLs = []string{ ...@@ -114,6 +115,7 @@ var ChannelBaseURLs = []string{
"https://llm.submodel.ai", //53 "https://llm.submodel.ai", //53
"https://ark.cn-beijing.volces.com", //54 "https://ark.cn-beijing.volces.com", //54
"https://api.openai.com", //55 "https://api.openai.com", //55
"https://api.replicate.com", //56
} }
var ChannelTypeNames = map[int]string{ var ChannelTypeNames = map[int]string{
...@@ -169,6 +171,7 @@ var ChannelTypeNames = map[int]string{ ...@@ -169,6 +171,7 @@ var ChannelTypeNames = map[int]string{
ChannelTypeSubmodel: "Submodel", ChannelTypeSubmodel: "Submodel",
ChannelTypeDoubaoVideo: "DoubaoVideo", ChannelTypeDoubaoVideo: "DoubaoVideo",
ChannelTypeSora: "Sora", ChannelTypeSora: "Sora",
ChannelTypeReplicate: "Replicate",
} }
func GetChannelTypeName(channelType int) string { func GetChannelTypeName(channelType int) string {
......
package replicate
const (
// ChannelName identifies the replicate channel.
ChannelName = "replicate"
// ModelFlux11Pro is the default image generation model supported by this channel.
ModelFlux11Pro = "black-forest-labs/flux-1.1-pro"
)
var ModelList = []string{
ModelFlux11Pro,
}
package replicate
type PredictionResponse struct {
Status string `json:"status"`
Output any `json:"output"`
Error *PredictionError `json:"error"`
}
type PredictionError struct {
Code string `json:"code"`
Message string `json:"message"`
Detail string `json:"detail"`
}
type FileUploadResponse struct {
Urls struct {
Get string `json:"get"`
} `json:"urls"`
}
...@@ -8,6 +8,7 @@ import ( ...@@ -8,6 +8,7 @@ import (
"strings" "strings"
"github.com/QuantumNous/new-api/common" "github.com/QuantumNous/new-api/common"
"github.com/QuantumNous/new-api/constant"
"github.com/QuantumNous/new-api/dto" "github.com/QuantumNous/new-api/dto"
"github.com/QuantumNous/new-api/logger" "github.com/QuantumNous/new-api/logger"
relaycommon "github.com/QuantumNous/new-api/relay/common" relaycommon "github.com/QuantumNous/new-api/relay/common"
...@@ -92,12 +93,17 @@ func ImageHelper(c *gin.Context, info *relaycommon.RelayInfo) (newAPIError *type ...@@ -92,12 +93,17 @@ func ImageHelper(c *gin.Context, info *relaycommon.RelayInfo) (newAPIError *type
httpResp = resp.(*http.Response) httpResp = resp.(*http.Response)
info.IsStream = info.IsStream || strings.HasPrefix(httpResp.Header.Get("Content-Type"), "text/event-stream") info.IsStream = info.IsStream || strings.HasPrefix(httpResp.Header.Get("Content-Type"), "text/event-stream")
if httpResp.StatusCode != http.StatusOK { if httpResp.StatusCode != http.StatusOK {
if httpResp.StatusCode == http.StatusCreated && info.ApiType == constant.APITypeReplicate {
// replicate channel returns 201 Created when using Prefer: wait, treat it as success.
httpResp.StatusCode = http.StatusOK
} else {
newAPIError = service.RelayErrorHandler(c.Request.Context(), httpResp, false) newAPIError = service.RelayErrorHandler(c.Request.Context(), httpResp, false)
// reset status code 重置状态码 // reset status code 重置状态码
service.ResetStatusCode(newAPIError, statusCodeMappingStr) service.ResetStatusCode(newAPIError, statusCodeMappingStr)
return newAPIError return newAPIError
} }
} }
}
usage, newAPIError := adaptor.DoResponse(c, httpResp, info) usage, newAPIError := adaptor.DoResponse(c, httpResp, info)
if newAPIError != nil { if newAPIError != nil {
......
...@@ -26,6 +26,7 @@ import ( ...@@ -26,6 +26,7 @@ import (
"github.com/QuantumNous/new-api/relay/channel/openai" "github.com/QuantumNous/new-api/relay/channel/openai"
"github.com/QuantumNous/new-api/relay/channel/palm" "github.com/QuantumNous/new-api/relay/channel/palm"
"github.com/QuantumNous/new-api/relay/channel/perplexity" "github.com/QuantumNous/new-api/relay/channel/perplexity"
"github.com/QuantumNous/new-api/relay/channel/replicate"
"github.com/QuantumNous/new-api/relay/channel/siliconflow" "github.com/QuantumNous/new-api/relay/channel/siliconflow"
"github.com/QuantumNous/new-api/relay/channel/submodel" "github.com/QuantumNous/new-api/relay/channel/submodel"
taskali "github.com/QuantumNous/new-api/relay/channel/task/ali" taskali "github.com/QuantumNous/new-api/relay/channel/task/ali"
...@@ -113,6 +114,8 @@ func GetAdaptor(apiType int) channel.Adaptor { ...@@ -113,6 +114,8 @@ func GetAdaptor(apiType int) channel.Adaptor {
return &submodel.Adaptor{} return &submodel.Adaptor{}
case constant.APITypeMiniMax: case constant.APITypeMiniMax:
return &minimax.Adaptor{} return &minimax.Adaptor{}
case constant.APITypeReplicate:
return &replicate.Adaptor{}
} }
return nil return nil
} }
......
...@@ -272,6 +272,7 @@ var defaultModelPrice = map[string]float64{ ...@@ -272,6 +272,7 @@ var defaultModelPrice = map[string]float64{
"suno_lyrics": 0.01, "suno_lyrics": 0.01,
"dall-e-3": 0.04, "dall-e-3": 0.04,
"imagen-3.0-generate-002": 0.03, "imagen-3.0-generate-002": 0.03,
"black-forest-labs/flux-1.1-pro": 0.04,
"gpt-4-gizmo-*": 0.1, "gpt-4-gizmo-*": 0.1,
"mj_video": 0.8, "mj_video": 0.8,
"mj_imagine": 0.1, "mj_imagine": 0.1,
......
...@@ -179,6 +179,11 @@ export const CHANNEL_OPTIONS = [ ...@@ -179,6 +179,11 @@ export const CHANNEL_OPTIONS = [
color: 'green', color: 'green',
label: 'Sora', label: 'Sora',
}, },
{
value: 56,
color: 'blue',
label: 'Replicate',
},
]; ];
export const MODEL_TABLE_PAGE_SIZE = 10; export const MODEL_TABLE_PAGE_SIZE = 10;
...@@ -55,6 +55,7 @@ import { ...@@ -55,6 +55,7 @@ import {
Kling, Kling,
Jimeng, Jimeng,
Perplexity, Perplexity,
Replicate,
} from '@lobehub/icons'; } from '@lobehub/icons';
import { import {
...@@ -342,6 +343,8 @@ export function getChannelIcon(channelType) { ...@@ -342,6 +343,8 @@ export function getChannelIcon(channelType) {
return <Jimeng.Color size={iconSize} />; return <Jimeng.Color size={iconSize} />;
case 54: // 豆包视频 Doubao Video case 54: // 豆包视频 Doubao Video
return <Doubao.Color size={iconSize} />; return <Doubao.Color size={iconSize} />;
case 56: // Replicate
return <Replicate size={iconSize} />;
case 8: // 自定义渠道 case 8: // 自定义渠道
case 22: // 知识库:FastGPT case 22: // 知识库:FastGPT
return <FastGPT.Color size={iconSize} />; return <FastGPT.Color size={iconSize} />;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment