🔌 feat(api): extend endpoint type support & expose in pricing UI

* backend
  - constant/endpoint_type.go
    • Add EndpointTypeMidjourney, EndpointTypeSuno, EndpointTypeKling, EndpointTypeJimeng.
  - common/endpoint_type.go
    • Map Midjourney / MidjourneyPlus, SunoAPI, Kling, Jimeng channel types to the new endpoint types.

* frontend
  - ModelPricing.js
    • Add “Supported Endpoint Type” column.
    • Implement renderSupportedEndpoints with `stringToColor` for consistent tag colors.

These changes allow `/api/pricing` and model lists to return accurate
`supported_endpoint_types` covering all non-OpenAI providers and display
them clearly in the UI.

No breaking changes.
This commit is contained in:
t0ng7u
2025-07-04 03:15:34 +08:00
parent 819290c9b8
commit bf577b8937
4 changed files with 44 additions and 3 deletions

View File

@@ -8,6 +8,14 @@ func GetEndpointTypesByChannelType(channelType int, modelName string) []constant
switch channelType {
case constant.ChannelTypeJina:
endpointTypes = []constant.EndpointType{constant.EndpointTypeJinaRerank}
case constant.ChannelTypeMidjourney, constant.ChannelTypeMidjourneyPlus:
endpointTypes = []constant.EndpointType{constant.EndpointTypeMidjourney}
case constant.ChannelTypeSunoAPI:
endpointTypes = []constant.EndpointType{constant.EndpointTypeSuno}
case constant.ChannelTypeKling:
endpointTypes = []constant.EndpointType{constant.EndpointTypeKling}
case constant.ChannelTypeJimeng:
endpointTypes = []constant.EndpointType{constant.EndpointTypeJimeng}
case constant.ChannelTypeAws:
fallthrough
case constant.ChannelTypeAnthropic:

View File

@@ -8,4 +8,8 @@ const (
EndpointTypeAnthropic EndpointType = "anthropic"
EndpointTypeGemini EndpointType = "gemini"
EndpointTypeJinaRerank EndpointType = "jina-rerank"
EndpointTypeMidjourney EndpointType = "midjourney-proxy"
EndpointTypeSuno EndpointType = "suno-proxy"
EndpointTypeKling EndpointType = "kling"
EndpointTypeJimeng EndpointType = "jimeng"
)

View File

@@ -1,5 +1,5 @@
import React, { useContext, useEffect, useRef, useMemo, useState } from 'react';
import { API, copy, showError, showInfo, showSuccess, getModelCategories, renderModelTag } from '../../helpers';
import { API, copy, showError, showInfo, showSuccess, getModelCategories, renderModelTag, stringToColor } from '../../helpers';
import { useTranslation } from 'react-i18next';
import {
@@ -106,6 +106,26 @@ const ModelPricing = () => {
) : null;
}
function renderSupportedEndpoints(endpoints) {
if (!endpoints || endpoints.length === 0) {
return null;
}
return (
<Space wrap>
{endpoints.map((endpoint, idx) => (
<Tag
key={endpoint}
color={stringToColor(endpoint)}
size='large'
shape='circle'
>
{endpoint}
</Tag>
))}
</Space>
);
}
const columns = [
{
title: t('可用性'),
@@ -120,6 +140,13 @@ const ModelPricing = () => {
},
defaultSortOrder: 'descend',
},
{
title: t('可用端点类型'),
dataIndex: 'supported_endpoint_types',
render: (text, record, index) => {
return renderSupportedEndpoints(text);
},
},
{
title: t('模型名称'),
dataIndex: 'model_name',
@@ -499,7 +526,7 @@ const ModelPricing = () => {
<div className="flex items-center">
<AlertCircle size={14} className="mr-1.5 flex-shrink-0" />
<span className="truncate">
{t('未登录,使用默认分组倍率')}: {groupRatio['default']}
{t('未登录,使用默认分组倍率')}{groupRatio['default']}
</span>
</div>
)}

View File

@@ -1750,5 +1750,7 @@
"批量创建时会在名称后自动添加随机后缀": "When creating in batches, a random suffix will be automatically added to the name",
"额度必须大于0": "Quota must be greater than 0",
"生成数量必须大于0": "Generation quantity must be greater than 0",
"创建后可在编辑渠道时获取上游模型列表": "After creation, you can get the upstream model list when editing the channel"
"创建后可在编辑渠道时获取上游模型列表": "After creation, you can get the upstream model list when editing the channel",
"可用端点类型": "Supported endpoint types",
"未登录,使用默认分组倍率:": "Not logged in, using default group ratio: "
}