|
|
@@ -13,9 +13,6 @@ import { apiClient, type GenerationRequest, type JobInfo, type ModelInfo } from
|
|
|
import { Loader2, Download, X, Trash2, RotateCcw, Power } from 'lucide-react';
|
|
|
import { downloadImage, downloadAuthenticatedImage } from '@/lib/utils';
|
|
|
import { useLocalStorage } from '@/lib/hooks';
|
|
|
-import { ModelSelectionProvider, useModelSelection, useCheckpointSelection, useModelTypeSelection } from '@/contexts/model-selection-context';
|
|
|
-import { EnhancedModelSelect, EnhancedModelSelectGroup } from '@/components/enhanced-model-select';
|
|
|
-import { ModelSelectionWarning, AutoSelectionStatus } from '@/components/model-selection-indicator';
|
|
|
|
|
|
const defaultFormData: GenerationRequest = {
|
|
|
prompt: '',
|
|
|
@@ -31,26 +28,6 @@ const defaultFormData: GenerationRequest = {
|
|
|
};
|
|
|
|
|
|
function Text2ImgForm() {
|
|
|
- const { state, actions } = useModelSelection();
|
|
|
- const {
|
|
|
- checkpointModels,
|
|
|
- selectedCheckpointModel,
|
|
|
- selectedCheckpoint,
|
|
|
- setSelectedCheckpoint,
|
|
|
- isAutoSelecting,
|
|
|
- warnings,
|
|
|
- error: checkpointError
|
|
|
- } = useCheckpointSelection();
|
|
|
-
|
|
|
- const {
|
|
|
- availableModels: vaeModels,
|
|
|
- selectedModel: selectedVae,
|
|
|
- isUserOverride: isVaeUserOverride,
|
|
|
- isAutoSelected: isVaeAutoSelected,
|
|
|
- setSelectedModel: setSelectedVae,
|
|
|
- setUserOverride: setVaeUserOverride,
|
|
|
- clearUserOverride: clearVaeUserOverride,
|
|
|
- } = useModelTypeSelection('vae');
|
|
|
|
|
|
const [formData, setFormData] = useLocalStorage<GenerationRequest>(
|
|
|
'text2img-form-data',
|
|
|
@@ -69,16 +46,14 @@ function Text2ImgForm() {
|
|
|
useEffect(() => {
|
|
|
const loadOptions = async () => {
|
|
|
try {
|
|
|
- const [samplersData, schedulersData, modelsData, loras, embeds] = await Promise.all([
|
|
|
+ const [samplersData, schedulersData, loras, embeds] = await Promise.all([
|
|
|
apiClient.getSamplers(),
|
|
|
apiClient.getSchedulers(),
|
|
|
- apiClient.getModels(), // Get all models with enhanced info
|
|
|
apiClient.getModels('lora'),
|
|
|
apiClient.getModels('embedding'),
|
|
|
]);
|
|
|
setSamplers(samplersData);
|
|
|
setSchedulers(schedulersData);
|
|
|
- actions.setModels(modelsData.models);
|
|
|
setLoraModels(loras.models.map(m => m.name));
|
|
|
setEmbeddings(embeds.models.map(m => m.name));
|
|
|
} catch (err) {
|
|
|
@@ -86,17 +61,8 @@ function Text2ImgForm() {
|
|
|
}
|
|
|
};
|
|
|
loadOptions();
|
|
|
- }, [actions]);
|
|
|
+ }, []);
|
|
|
|
|
|
- // Update form data when checkpoint changes
|
|
|
- useEffect(() => {
|
|
|
- if (selectedCheckpoint) {
|
|
|
- setFormData(prev => ({
|
|
|
- ...prev,
|
|
|
- model: selectedCheckpoint,
|
|
|
- }));
|
|
|
- }
|
|
|
- }, [selectedCheckpoint, setFormData]);
|
|
|
|
|
|
const handleInputChange = (
|
|
|
e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement>
|
|
|
@@ -179,20 +145,8 @@ function Text2ImgForm() {
|
|
|
setJobInfo(null);
|
|
|
|
|
|
try {
|
|
|
- // Validate model selection
|
|
|
- if (selectedCheckpointModel) {
|
|
|
- const validation = actions.validateSelection(selectedCheckpointModel);
|
|
|
- if (!validation.isValid) {
|
|
|
- setError(`Missing required models: ${validation.missingRequired.join(', ')}`);
|
|
|
- setLoading(false);
|
|
|
- return;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
const requestData = {
|
|
|
...formData,
|
|
|
- model: selectedCheckpoint || undefined,
|
|
|
- vae: selectedVae || undefined,
|
|
|
};
|
|
|
|
|
|
const job = await apiClient.text2img(requestData);
|
|
|
@@ -229,9 +183,6 @@ function Text2ImgForm() {
|
|
|
|
|
|
const handleResetToDefaults = () => {
|
|
|
setFormData(defaultFormData);
|
|
|
- setSelectedCheckpoint(null);
|
|
|
- setSelectedVae('');
|
|
|
- actions.resetSelection();
|
|
|
};
|
|
|
|
|
|
const handleServerRestart = async () => {
|
|
|
@@ -434,61 +385,6 @@ function Text2ImgForm() {
|
|
|
</select>
|
|
|
</div>
|
|
|
|
|
|
- {/* Model Selection Section */}
|
|
|
- <EnhancedModelSelectGroup
|
|
|
- title="Model Selection"
|
|
|
- description="Select the checkpoint and additional models for generation"
|
|
|
- >
|
|
|
- {/* Checkpoint Selection */}
|
|
|
- <div className="space-y-2">
|
|
|
- <Label htmlFor="checkpoint">Checkpoint Model *</Label>
|
|
|
- <select
|
|
|
- id="checkpoint"
|
|
|
- value={selectedCheckpoint || ''}
|
|
|
- onChange={(e) => setSelectedCheckpoint(e.target.value || null)}
|
|
|
- className="flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm"
|
|
|
- disabled={isAutoSelecting}
|
|
|
- >
|
|
|
- <option value="">Select a checkpoint model...</option>
|
|
|
- {checkpointModels.map((model) => (
|
|
|
- <option key={model.id} value={model.name}>
|
|
|
- {model.name} {model.loaded ? '(Loaded)' : ''}
|
|
|
- </option>
|
|
|
- ))}
|
|
|
- </select>
|
|
|
- </div>
|
|
|
-
|
|
|
- {/* VAE Selection */}
|
|
|
- <EnhancedModelSelect
|
|
|
- modelType="vae"
|
|
|
- label="VAE Model"
|
|
|
- description="Optional VAE model for improved image quality"
|
|
|
- value={selectedVae}
|
|
|
- availableModels={vaeModels}
|
|
|
- isAutoSelected={isVaeAutoSelected}
|
|
|
- isUserOverride={isVaeUserOverride}
|
|
|
- isLoading={isAutoSelecting}
|
|
|
- onValueChange={setSelectedVae}
|
|
|
- onSetUserOverride={setVaeUserOverride}
|
|
|
- onClearOverride={clearVaeUserOverride}
|
|
|
- placeholder="Use default VAE"
|
|
|
- />
|
|
|
-
|
|
|
- {/* Auto-selection Status */}
|
|
|
- <div className="pt-2">
|
|
|
- <AutoSelectionStatus
|
|
|
- isAutoSelecting={isAutoSelecting}
|
|
|
- hasAutoSelection={Object.keys(state.autoSelectedModels).length > 0}
|
|
|
- />
|
|
|
- </div>
|
|
|
-
|
|
|
- {/* Warnings and Errors */}
|
|
|
- <ModelSelectionWarning
|
|
|
- warnings={warnings}
|
|
|
- errors={error ? [error] : []}
|
|
|
- onClearWarnings={actions.clearWarnings}
|
|
|
- />
|
|
|
- </EnhancedModelSelectGroup>
|
|
|
|
|
|
<div className="space-y-2">
|
|
|
<Label htmlFor="batch_count">Batch Count</Label>
|