Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions dto/openai_request.go
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,8 @@ type GeneralOpenAIRequest struct {
Input any `json:"input,omitempty"`
Instruction string `json:"instruction,omitempty"`
Size string `json:"size,omitempty"`
Seconds *int `json:"seconds,omitempty"`
Quality *string `json:"quality,omitempty"`
Functions json.RawMessage `json:"functions,omitempty"`
FrequencyPenalty *float64 `json:"frequency_penalty,omitempty"`
PresencePenalty *float64 `json:"presence_penalty,omitempty"`
Expand Down
61 changes: 61 additions & 0 deletions web/src/components/playground/SettingsPanel.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,23 @@ const SettingsPanel = ({
messages,
}) => {
const { t } = useTranslation();
const isVideoModel =
typeof inputs.model === 'string' && inputs.model.includes('video');
const videoSizeOptions = [
{ label: '1280x720', value: '1280x720' },
{ label: '720x1280', value: '720x1280' },
{ label: '1792x1024', value: '1792x1024' },
{ label: '1024x1792', value: '1024x1792' },
{ label: '1024x1024', value: '1024x1024' },
];
const videoSecondsOptions = [6, 8, 10, 12, 15, 20, 25, 30].map((v) => ({
label: `${v}s`,
value: String(v),
}));
const videoQualityOptions = [
{ label: 'standard', value: 'standard' },
{ label: 'high', value: 'high' },
];

const currentConfig = {
inputs,
Expand Down Expand Up @@ -200,6 +217,50 @@ const SettingsPanel = ({
/>
</div>

{/* 视频参数(仅视频模型显示) */}
{isVideoModel && (
<div className={customRequestMode ? 'opacity-50' : ''}>
<div className='space-y-4'>
<div>
<Typography.Text strong className='text-sm'>
{t('视频尺寸')}
</Typography.Text>
<Select
className='!rounded-lg mt-2'
optionList={videoSizeOptions}
value={inputs.videoSize}
onChange={(value) => onInputChange('videoSize', value)}
disabled={customRequestMode}
/>
</div>
<div>
<Typography.Text strong className='text-sm'>
{t('视频时长')}
</Typography.Text>
<Select
className='!rounded-lg mt-2'
optionList={videoSecondsOptions}
value={inputs.videoSeconds}
onChange={(value) => onInputChange('videoSeconds', value)}
disabled={customRequestMode}
/>
</div>
<div>
<Typography.Text strong className='text-sm'>
{t('视频质量')}
</Typography.Text>
<Select
className='!rounded-lg mt-2'
optionList={videoQualityOptions}
value={inputs.videoQuality}
onChange={(value) => onInputChange('videoQuality', value)}
disabled={customRequestMode}
/>
</div>
</div>
</div>
)}

{/* 流式输出开关 */}
<div className={customRequestMode ? 'opacity-50' : ''}>
<div className='flex items-center justify-between'>
Expand Down
3 changes: 3 additions & 0 deletions web/src/constants/playground.constants.js
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,9 @@ export const DEFAULT_CONFIG = {
stream: true,
imageEnabled: false,
imageUrls: [''],
videoSize: '1280x720',
videoSeconds: '10',
videoQuality: 'standard',
},
parameterEnabled: {
temperature: true,
Expand Down
17 changes: 17 additions & 0 deletions web/src/helpers/api.js
Original file line number Diff line number Diff line change
Expand Up @@ -155,6 +155,23 @@ export const buildApiPayload = (
}
});

const isVideoModel =
typeof inputs.model === 'string' && inputs.model.includes('video');
if (isVideoModel) {
if (inputs.videoSize) {
payload.size = inputs.videoSize;
}
if (inputs.videoSeconds) {
const parsedSeconds = Number.parseInt(inputs.videoSeconds, 10);
if (Number.isFinite(parsedSeconds)) {
payload.seconds = parsedSeconds;
}
}
if (inputs.videoQuality) {
payload.quality = inputs.videoQuality;
}
}

return payload;
};

Expand Down