fix: append routeID to model proxy URL and drop X-GPUStack-Model header
This commit is contained in:
@@ -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':
|
||||
|
||||
@@ -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':
|
||||
|
||||
@@ -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':
|
||||
|
||||
@@ -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':
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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)}`
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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(/\\$/, '');
|
||||
|
||||
Reference in New Issue
Block a user