fix: append routeID to model proxy URL and drop X-GPUStack-Model header

This commit is contained in:
jialin
2026-05-06 12:27:22 +08:00
committed by jialin
parent 9914db6b96
commit 2592f44bc2
14 changed files with 92 additions and 67 deletions
+1
View File
@@ -61,6 +61,7 @@ export default {
'models.table.layers': 'Layers',
'models.form.backend': 'Backend',
'models.form.backend_parameters': 'Backend Parameters',
'models.form.backend_parameters.injected': 'Injected Backend Parameters',
'models.search.gguf.tips':
'GGUF models use llama-box(supports Linux, macOS and Windows).',
'models.search.vllm.tips':
+1
View File
@@ -62,6 +62,7 @@ export default {
'models.table.layers': 'レイヤー',
'models.form.backend': 'バックエンド',
'models.form.backend_parameters': 'バックエンドパラメータ',
'models.form.backend_parameters.injected': '注入されたバックエンドパラメータ',
'models.search.gguf.tips':
'GGUFモデルはllama-boxを使用します(Linux、macOS、Windowsをサポート)。',
'models.search.vllm.tips':
+1
View File
@@ -63,6 +63,7 @@ export default {
'models.table.layers': 'Слои',
'models.form.backend': 'Бэкенд',
'models.form.backend_parameters': 'Параметры бэкенда',
'models.form.backend_parameters.injected': 'Внедрённые параметры бэкенда',
'models.search.gguf.tips':
'GGUF-модели используют llama-box (поддерживает Linux, macOS и Windows).',
'models.search.vllm.tips':
+2
View File
@@ -61,6 +61,8 @@ export default {
'models.table.layers': 'Katmanlar',
'models.form.backend': 'Altyapı',
'models.form.backend_parameters': 'Altyapı Parametreleri',
'models.form.backend_parameters.injected':
'Enjekte Edilen Altyapı Parametreleri',
'models.search.gguf.tips':
'GGUF modelleri llama-box kullanır (Linux, macOS ve Windows destekler).',
'models.search.vllm.tips':
+1
View File
@@ -61,6 +61,7 @@ export default {
'models.table.layers': '层',
'models.form.backend': '后端',
'models.form.backend_parameters': '后端参数',
'models.form.backend_parameters.injected': '注入的后端参数',
'models.search.gguf.tips':
'GGUF 模型用 llama-box(支持 Linux, macOS 和 Windows)。',
'models.search.vllm.tips':
@@ -55,35 +55,39 @@ const Instance: React.FC = () => {
const [instanceName, instanceData] =
Object.entries(snapshot?.instances || {})[0] || [];
const params = [
...(instanceData?.backend_parameters || []),
...(instanceData?.injected_backend_parameters || [])
];
const renderParams = (params: string[]) =>
params.length > 0 ? (
<Flex
gap={'4px 8px'}
wrap="wrap"
style={{
backgroundColor: 'var(--ant-color-fill-quaternary)',
padding: '4px 6px',
borderRadius: '2px'
}}
>
{params.map((param: string, index: number) => (
<span key={index} style={{ margin: 0 }}>
{param}
</span>
))}
</Flex>
) : (
'-'
);
return [
{
key: '1',
label: intl.formatMessage({ id: 'models.form.backend_parameters' }),
children:
params.length > 0 ? (
<Flex
gap={8}
wrap="wrap"
style={{
backgroundColor: 'var(--ant-color-fill-quaternary)',
padding: '4px',
borderRadius: '2px'
}}
>
{params?.map((param: string, index: number) => (
<span key={index} style={{ margin: 0 }}>
{param}
</span>
))}
</Flex>
) : (
'-'
)
children: renderParams(instanceData?.backend_parameters || [])
},
{
key: '1-1',
label: intl.formatMessage({
id: 'models.form.backend_parameters.injected'
}),
children: renderParams(instanceData?.injected_backend_parameters || [])
},
{
key: '3',
@@ -46,7 +46,6 @@ const API_MAP: Record<string, { api: string }> = {
const ApiAccessInfoWrapper = styled.div`
display: grid;
padding-left: 20px;
grid-template-columns: max-content 1fr max-content;
gap: 8px 0px;
justify-items: start;
@@ -103,7 +102,7 @@ const ApiAccessInfo = ({ open, data, onClose }: ApiAccessInfoProps) => {
if (!data.generic_proxy) {
return `${window.location.origin}/${OPENAI_COMPATIBLE}`;
}
return `${window.location.origin}${MODEL_PROXY}/<YOUR_API_PATH>`;
return `${window.location.origin}${MODEL_PROXY}/${data.id}/<YOUR_API_PATH>`;
}, [data]);
const isRanker = useMemo(() => {
@@ -114,29 +113,8 @@ const ApiAccessInfo = ({ open, data, onClose }: ApiAccessInfoProps) => {
onClose();
};
useEffect(() => {
if (open && data.generic_proxy) {
openProxyModal(data);
}
}, [open, data, openProxyModal]);
return (
<ScrollerModal
open={open}
style={{
top: '20%'
}}
title={intl.formatMessage({ id: 'models.table.button.apiAccessInfo' })}
width={600}
destroyOnHidden
closable={true}
mask={{
closable: false
}}
onOk={handleClose}
onCancel={handleClose}
footer={null}
>
const renderTips = () => {
return (
<Tips>
<dl className="tips">
<dt>
@@ -155,7 +133,36 @@ const ApiAccessInfo = ({ open, data, onClose }: ApiAccessInfoProps) => {
></dd>
</dl>
</Tips>
);
};
useEffect(() => {
if (open && data.generic_proxy) {
openProxyModal(data);
}
}, [open, data, openProxyModal]);
return (
<ScrollerModal
open={open}
style={{
top: '20%'
}}
title={
<span style={{ marginBottom: 8 }}>
{intl.formatMessage({ id: 'models.table.button.apiAccessInfo' })}
</span>
}
width={600}
destroyOnHidden
closable={true}
mask={{
closable: false
}}
onOk={handleClose}
onCancel={handleClose}
footer={null}
>
<ApiAccessInfoWrapper>
<span className="label">
{intl.formatMessage({ id: 'models.table.apiAccessInfo.endpoint' })}
@@ -212,9 +219,7 @@ const ApiAccessInfo = ({ open, data, onClose }: ApiAccessInfoProps) => {
</span>
</ApiAccessInfoWrapper>
{data.generic_proxy && (
<div style={{ paddingLeft: 20, marginTop: 12 }}>
{GenericProxyCommandCode}
</div>
<div style={{ marginTop: 12 }}>{GenericProxyCommandCode}</div>
)}
</ScrollerModal>
);
@@ -113,6 +113,7 @@ const useGenericProxy = () => {
codeValue: generateCurlCode({
api,
modelProxy: true,
routeID: data?.id || '',
parameters: {
model: data?.name || '',
...parameters
+6 -4
View File
@@ -5,17 +5,18 @@ import { fomatNodeJsParams, formatCurlArgs, formatPyParams } from './utils';
export const generateSpeechToTextCurlCode = ({
api: url,
modelProxy,
routeID,
parameters
}: Record<string, any>) => {
const host = window.location.origin;
// replace url OPENAI_COMPATIBLE with GPUSTACK
const api = modelProxy ? `${MODEL_PROXY}/\${YOUR_API_PATH}` : url;
const api = modelProxy ? `${MODEL_PROXY}/${routeID}/\${YOUR_API_PATH}` : url;
// ========================= Curl =========================
const curlCode = `
curl ${host}${api} \\
-H "Content-Type: multipart/form-data" \\
-H "Authorization: Bearer $\{YOUR_GPUSTACK_API_KEY}" \\${modelProxy ? `\n-H "X-GPUStack-Model: ${parameters.model}" \\` : ''}
-H "Authorization: Bearer $\{YOUR_GPUSTACK_API_KEY}" \\
-F model="${parameters.model}" \\
-F file="@/path/to/file/audio.mp3;type=audio/mpeg" \\
${formatCurlArgs(_.omit(parameters, 'model'), true)}`
@@ -85,16 +86,17 @@ main();`.trim();
export const generateTextToSpeechCurlCode = ({
api: url,
modelProxy,
routeID,
parameters
}: Record<string, any>) => {
const host = window.location.origin;
const api = modelProxy ? `${MODEL_PROXY}/\${YOUR_API_PATH}` : url;
const api = modelProxy ? `${MODEL_PROXY}/${routeID}/\${YOUR_API_PATH}` : url;
// ========================= Curl =========================
const curlCode = `
curl ${host}${api} \\
-H "Content-Type: application/json" \\
-H "Authorization: Bearer $\{YOUR_GPUSTACK_API_KEY}" \\${modelProxy ? `\n-H "X-GPUStack-Model: ${parameters.model}" \\` : ''}
-H "Authorization: Bearer $\{YOUR_GPUSTACK_API_KEY}" \\
${formatCurlArgs(parameters, false)} \\\n--output output.${parameters.response_format}`.trim();
return curlCode;
+3 -2
View File
@@ -4,16 +4,17 @@ import { fomatNodeJsParams, formatCurlArgs, formatPyParams } from './utils';
export const generateEmbeddingCurlCode = ({
api: url,
modelProxy,
routeID,
parameters
}: Record<string, any>) => {
const host = window.location.origin;
const api = modelProxy ? `${MODEL_PROXY}/\${YOUR_API_PATH}` : url;
const api = modelProxy ? `${MODEL_PROXY}/${routeID}/\${YOUR_API_PATH}` : url;
// ========================= Curl =========================
const curlCode = `
curl ${host}${api} \\
-H "Content-Type: application/json" \\
-H "Authorization: Bearer $\{YOUR_GPUSTACK_API_KEY}" \\${modelProxy ? `\n-H "X-GPUStack-Model: ${parameters.model}" \\` : ''}
-H "Authorization: Bearer $\{YOUR_GPUSTACK_API_KEY}" \\
${formatCurlArgs(parameters, false)}`.trim();
return curlCode;
+4 -3
View File
@@ -6,24 +6,25 @@ export const generateImageCurlCode = ({
api: url,
parameters,
modelProxy,
routeID,
isFormdata = false,
edit = false
}: Record<string, any>) => {
const host = window.location.origin;
const api = modelProxy ? `${MODEL_PROXY}/\${YOUR_API_PATH}` : url;
const api = modelProxy ? `${MODEL_PROXY}/${routeID}/\${YOUR_API_PATH}` : url;
// ========================= Curl =========================
let curlCode = `
curl ${host}${api} \\
-H "Content-Type: application/json" \\
-H "Authorization: Bearer $\{YOUR_GPUSTACK_API_KEY}" \\${modelProxy ? `\n-H "X-GPUStack-Model: ${parameters.model}" \\` : ''}
-H "Authorization: Bearer $\{YOUR_GPUSTACK_API_KEY}" \\
${formatCurlArgs(parameters, isFormdata)}`.trim();
if (edit) {
curlCode = `
curl ${host}${api} \\
-H "Content-Type: multipart/form-data" \\
-H "Authorization: Bearer $\{YOUR_GPUSTACK_API_KEY}" \\${modelProxy ? `\n-H "X-GPUStack-Model: ${parameters.model}" \\` : ''}
-H "Authorization: Bearer $\{YOUR_GPUSTACK_API_KEY}" \\
-F image="@image.png" \\
-F mask="@mask.png" \\
${formatCurlArgs(_.omit(parameters, ['mask', 'image']), isFormdata)}`
+3 -2
View File
@@ -4,16 +4,17 @@ import { fomatNodeJsParams, formatCurlArgs, formatPyParams } from './utils';
export const generateLLmCurlCode = ({
api: url,
modelProxy,
routeID,
parameters
}: Record<string, any>) => {
const host = window.location.origin;
const api = modelProxy ? `${MODEL_PROXY}/\${YOUR_API_PATH}` : url;
const api = modelProxy ? `${MODEL_PROXY}/${routeID}/\${YOUR_API_PATH}` : url;
// ========================= Curl =========================
const curlCode = `
curl ${host}${api} \\
-H "Content-Type: application/json" \\
-H "Authorization: Bearer $\{YOUR_GPUSTACK_API_KEY}" \\${modelProxy ? `\n-H "X-GPUStack-Model: ${parameters.model}" \\` : ''}
-H "Authorization: Bearer $\{YOUR_GPUSTACK_API_KEY}" \\
${formatCurlArgs(parameters, false)}`.trim();
return curlCode;
+5 -2
View File
@@ -4,16 +4,19 @@ import { formatCurlArgs } from './utils';
export const generateRerankCurlCode = ({
api,
modelProxy,
routeID,
parameters
}: Record<string, any>) => {
const host = window.location.origin;
const apiUrl = modelProxy ? `${MODEL_PROXY}/\${YOUR_API_PATH}` : api;
const apiUrl = modelProxy
? `${MODEL_PROXY}/${routeID}/\${YOUR_API_PATH}`
: api;
// ========================= Curl =========================
const curlCode = `
curl ${host}${apiUrl} \\
-H "Content-Type: application/json" \\
-H "Authorization: Bearer $\{YOUR_GPUSTACK_API_KEY}" \\${modelProxy ? `\n-H "X-GPUStack-Model: ${parameters.model}" \\` : ''}
-H "Authorization: Bearer $\{YOUR_GPUSTACK_API_KEY}" \\
${formatCurlArgs(parameters, false)}`.trim();
return curlCode;
+3 -2
View File
@@ -6,18 +6,19 @@ export const generateCurlCode = ({
api: url,
parameters,
modelProxy,
routeID,
isFormdata = false,
edit = false
}: Record<string, any>) => {
const host = window.location.origin;
const api = modelProxy ? `${MODEL_PROXY}/\${YOUR_API_PATH}` : url;
const api = modelProxy ? `${MODEL_PROXY}/${routeID}/\${YOUR_API_PATH}` : url;
// ========================= Curl =========================
const curlCode = `
curl ${host}${api} \\
-H "Content-Type: multipart/form-data" \\
-H "Authorization: Bearer $\{YOUR_GPUSTACK_API_KEY}" \\${modelProxy ? `\n-H "X-GPUStack-Model: ${parameters.model}" \\` : ''}
-H "Authorization: Bearer $\{YOUR_GPUSTACK_API_KEY}" \\
${formatCurlArgs(_.omit(parameters, ['mask', 'image']), isFormdata)}`
.trim()
.replace(/\\$/, '');