mirror of
				https://github.com/songquanpeng/one-api.git
				synced 2025-11-04 15:53:42 +08:00 
			
		
		
		
	Compare commits
	
		
			7 Commits
		
	
	
		
			v0.6.0-alp
			...
			v0.6.0-alp
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					32387d9c20 | ||
| 
						 | 
					bd888f2eb7 | ||
| 
						 | 
					cece77e533 | ||
| 
						 | 
					2a5468e23c | ||
| 
						 | 
					d0e415893b | ||
| 
						 | 
					6cf5ce9a7a | ||
| 
						 | 
					f598b9df87 | 
@@ -23,7 +23,7 @@ ADD go.mod go.sum ./
 | 
			
		||||
RUN go mod download
 | 
			
		||||
COPY . .
 | 
			
		||||
COPY --from=builder /web/build ./web/build
 | 
			
		||||
RUN go build -ldflags "-s -w -X 'one-api/common.Version=$(cat VERSION)' -extldflags '-static'" -o one-api
 | 
			
		||||
RUN go build -ldflags "-s -w -X 'github.com/songquanpeng/one-api/common.Version=$(cat VERSION)' -extldflags '-static'" -o one-api
 | 
			
		||||
 | 
			
		||||
FROM alpine
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -112,6 +112,10 @@ var ModelRatio = map[string]float64{
 | 
			
		||||
	"qwen-max-longcontext":      1.4286, // ¥0.02 / 1k tokens
 | 
			
		||||
	"text-embedding-v1":         0.05,   // ¥0.0007 / 1k tokens
 | 
			
		||||
	"SparkDesk":                 1.2858, // ¥0.018 / 1k tokens
 | 
			
		||||
	"SparkDesk-v1.1":            1.2858, // ¥0.018 / 1k tokens
 | 
			
		||||
	"SparkDesk-v2.1":            1.2858, // ¥0.018 / 1k tokens
 | 
			
		||||
	"SparkDesk-v3.1":            1.2858, // ¥0.018 / 1k tokens
 | 
			
		||||
	"SparkDesk-v3.5":            1.2858, // ¥0.018 / 1k tokens
 | 
			
		||||
	"360GPT_S2_V9":              0.8572, // ¥0.012 / 1k tokens
 | 
			
		||||
	"embedding-bert-512-v1":     0.0715, // ¥0.001 / 1k tokens
 | 
			
		||||
	"embedding_s1_v1":           0.0715, // ¥0.001 / 1k tokens
 | 
			
		||||
 
 | 
			
		||||
@@ -58,6 +58,9 @@ func init() {
 | 
			
		||||
	})
 | 
			
		||||
	// https://platform.openai.com/docs/models/model-endpoint-compatibility
 | 
			
		||||
	for i := 0; i < constant.APITypeDummy; i++ {
 | 
			
		||||
		if i == constant.APITypeAIProxyLibrary {
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		adaptor := helper.GetAdaptor(i)
 | 
			
		||||
		channelName := adaptor.GetChannelName()
 | 
			
		||||
		modelNames := adaptor.GetModelList()
 | 
			
		||||
 
 | 
			
		||||
@@ -2,4 +2,8 @@ package xunfei
 | 
			
		||||
 | 
			
		||||
var ModelList = []string{
 | 
			
		||||
	"SparkDesk",
 | 
			
		||||
	"SparkDesk-v1.1",
 | 
			
		||||
	"SparkDesk-v2.1",
 | 
			
		||||
	"SparkDesk-v3.1",
 | 
			
		||||
	"SparkDesk-v3.5",
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -127,7 +127,7 @@ func buildXunfeiAuthUrl(hostUrl string, apiKey, apiSecret string) string {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func StreamHandler(c *gin.Context, textRequest model.GeneralOpenAIRequest, appId string, apiSecret string, apiKey string) (*model.ErrorWithStatusCode, *model.Usage) {
 | 
			
		||||
	domain, authUrl := getXunfeiAuthUrl(c, apiKey, apiSecret)
 | 
			
		||||
	domain, authUrl := getXunfeiAuthUrl(c, apiKey, apiSecret, textRequest.Model)
 | 
			
		||||
	dataChan, stopChan, err := xunfeiMakeRequest(textRequest, domain, authUrl, appId)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return openai.ErrorWrapper(err, "make xunfei request err", http.StatusInternalServerError), nil
 | 
			
		||||
@@ -157,7 +157,7 @@ func StreamHandler(c *gin.Context, textRequest model.GeneralOpenAIRequest, appId
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func Handler(c *gin.Context, textRequest model.GeneralOpenAIRequest, appId string, apiSecret string, apiKey string) (*model.ErrorWithStatusCode, *model.Usage) {
 | 
			
		||||
	domain, authUrl := getXunfeiAuthUrl(c, apiKey, apiSecret)
 | 
			
		||||
	domain, authUrl := getXunfeiAuthUrl(c, apiKey, apiSecret, textRequest.Model)
 | 
			
		||||
	dataChan, stopChan, err := xunfeiMakeRequest(textRequest, domain, authUrl, appId)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return openai.ErrorWrapper(err, "make xunfei request err", http.StatusInternalServerError), nil
 | 
			
		||||
@@ -242,20 +242,45 @@ func xunfeiMakeRequest(textRequest model.GeneralOpenAIRequest, domain, authUrl,
 | 
			
		||||
	return dataChan, stopChan, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func getXunfeiAuthUrl(c *gin.Context, apiKey string, apiSecret string) (string, string) {
 | 
			
		||||
func getAPIVersion(c *gin.Context, modelName string) string {
 | 
			
		||||
	query := c.Request.URL.Query()
 | 
			
		||||
	apiVersion := query.Get("api-version")
 | 
			
		||||
	if apiVersion == "" {
 | 
			
		||||
		apiVersion = c.GetString(common.ConfigKeyAPIVersion)
 | 
			
		||||
	if apiVersion != "" {
 | 
			
		||||
		return apiVersion
 | 
			
		||||
	}
 | 
			
		||||
	if apiVersion == "" {
 | 
			
		||||
		apiVersion = "v1.1"
 | 
			
		||||
		logger.SysLog("api_version not found, use default: " + apiVersion)
 | 
			
		||||
	parts := strings.Split(modelName, "-")
 | 
			
		||||
	if len(parts) == 2 {
 | 
			
		||||
		apiVersion = parts[1]
 | 
			
		||||
		return apiVersion
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
	domain := "general"
 | 
			
		||||
	if apiVersion != "v1.1" {
 | 
			
		||||
		domain += strings.Split(apiVersion, ".")[0]
 | 
			
		||||
	apiVersion = c.GetString(common.ConfigKeyAPIVersion)
 | 
			
		||||
	if apiVersion != "" {
 | 
			
		||||
		return apiVersion
 | 
			
		||||
	}
 | 
			
		||||
	apiVersion = "v1.1"
 | 
			
		||||
	logger.SysLog("api_version not found, using default: " + apiVersion)
 | 
			
		||||
	return apiVersion
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// https://www.xfyun.cn/doc/spark/Web.html#_1-%E6%8E%A5%E5%8F%A3%E8%AF%B4%E6%98%8E
 | 
			
		||||
func apiVersion2domain(apiVersion string) string {
 | 
			
		||||
	switch apiVersion {
 | 
			
		||||
	case "v1.1":
 | 
			
		||||
		return "general"
 | 
			
		||||
	case "v2.1":
 | 
			
		||||
		return "generalv2"
 | 
			
		||||
	case "v3.1":
 | 
			
		||||
		return "generalv3"
 | 
			
		||||
	case "v3.5":
 | 
			
		||||
		return "generalv3.5"
 | 
			
		||||
	}
 | 
			
		||||
	return "general" + apiVersion
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func getXunfeiAuthUrl(c *gin.Context, apiKey string, apiSecret string, modelName string) (string, string) {
 | 
			
		||||
	apiVersion := getAPIVersion(c, modelName)
 | 
			
		||||
	domain := apiVersion2domain(apiVersion)
 | 
			
		||||
	authUrl := buildXunfeiAuthUrl(fmt.Sprintf("wss://spark-api.xf-yun.com/%s/chat", apiVersion), apiKey, apiSecret)
 | 
			
		||||
	return domain, authUrl
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -39,6 +39,7 @@ func RelayTextHelper(c *gin.Context) *model.ErrorWithStatusCode {
 | 
			
		||||
	ratio := modelRatio * groupRatio
 | 
			
		||||
	// pre-consume quota
 | 
			
		||||
	promptTokens := getPromptTokens(textRequest, meta.Mode)
 | 
			
		||||
	meta.PromptTokens = promptTokens
 | 
			
		||||
	preConsumedQuota, bizErr := preConsumeQuota(ctx, textRequest, promptTokens, ratio, meta)
 | 
			
		||||
	if bizErr != nil {
 | 
			
		||||
		logger.Warnf(ctx, "preConsumeQuota failed: %+v", *bizErr)
 | 
			
		||||
 
 | 
			
		||||
@@ -227,9 +227,9 @@ export default function ChannelPage() {
 | 
			
		||||
                <Button onClick={testAllChannels} startIcon={<IconBrandSpeedtest width={'18px'} />}>
 | 
			
		||||
                  测试启用渠道
 | 
			
		||||
                </Button>
 | 
			
		||||
                <Button onClick={updateAllChannelsBalance} startIcon={<IconCoinYuan width={'18px'} />}>
 | 
			
		||||
                  更新启用余额
 | 
			
		||||
                </Button>
 | 
			
		||||
                {/*<Button onClick={updateAllChannelsBalance} startIcon={<IconCoinYuan width={'18px'} />}>*/}
 | 
			
		||||
                {/*  更新启用余额*/}
 | 
			
		||||
                {/*</Button>*/}
 | 
			
		||||
                <Button onClick={deleteAllDisabledChannels} startIcon={<IconHttpDelete width={'18px'} />}>
 | 
			
		||||
                  删除禁用渠道
 | 
			
		||||
                </Button>
 | 
			
		||||
 
 | 
			
		||||
@@ -94,7 +94,13 @@ const typeConfig = {
 | 
			
		||||
      other: "版本号",
 | 
			
		||||
    },
 | 
			
		||||
    input: {
 | 
			
		||||
      models: ["SparkDesk"],
 | 
			
		||||
      models: [
 | 
			
		||||
          "SparkDesk",
 | 
			
		||||
        'SparkDesk-v1.1',
 | 
			
		||||
        'SparkDesk-v2.1',
 | 
			
		||||
        'SparkDesk-v3.1',
 | 
			
		||||
        'SparkDesk-v3.5'
 | 
			
		||||
      ],
 | 
			
		||||
    },
 | 
			
		||||
    prompt: {
 | 
			
		||||
      key: "按照如下格式输入:APPID|APISecret|APIKey",
 | 
			
		||||
 
 | 
			
		||||
@@ -522,8 +522,8 @@ const ChannelsTable = () => {
 | 
			
		||||
              <Button size='small' loading={loading} onClick={testAllChannels}>
 | 
			
		||||
                测试所有渠道
 | 
			
		||||
              </Button>
 | 
			
		||||
              <Button size='small' onClick={updateAllChannelsBalance}
 | 
			
		||||
                      loading={loading || updatingBalance}>更新已启用渠道余额</Button>
 | 
			
		||||
              {/*<Button size='small' onClick={updateAllChannelsBalance}*/}
 | 
			
		||||
              {/*        loading={loading || updatingBalance}>更新已启用渠道余额</Button>*/}
 | 
			
		||||
              <Popup
 | 
			
		||||
                trigger={
 | 
			
		||||
                  <Button size='small' loading={loading}>
 | 
			
		||||
 
 | 
			
		||||
@@ -82,7 +82,13 @@ const EditChannel = () => {
 | 
			
		||||
          localModels = ['chatglm_turbo', 'chatglm_pro', 'chatglm_std', 'chatglm_lite'];
 | 
			
		||||
          break;
 | 
			
		||||
        case 18:
 | 
			
		||||
          localModels = ['SparkDesk'];
 | 
			
		||||
          localModels = [
 | 
			
		||||
            'SparkDesk',
 | 
			
		||||
            'SparkDesk-v1.1',
 | 
			
		||||
            'SparkDesk-v2.1',
 | 
			
		||||
            'SparkDesk-v3.1',
 | 
			
		||||
            'SparkDesk-v3.5'
 | 
			
		||||
          ];
 | 
			
		||||
          break;
 | 
			
		||||
        case 19:
 | 
			
		||||
          localModels = ['360GPT_S2_V9', 'embedding-bert-512-v1', 'embedding_s1_v1', 'semantic_similarity_s1_v1'];
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user