Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
14c55da
Run pipeline in a subprocess
leszko Nov 21, 2025
c168b91
Improve error handling
leszko Nov 21, 2025
4efffc1
Improve error handling
leszko Nov 21, 2025
a1da0f3
Move subprocess to frame processor
leszko Nov 21, 2025
1cdfc91
Remove pipeline proxy - no longer used
leszko Nov 21, 2025
cbf65ca
Add plugins module
yondonfu Dec 16, 2025
3e50419
Support loading plugin pipelines in PipelineManager
yondonfu Dec 16, 2025
7f60d48
Incl plugin pipelines when listing from server
yondonfu Dec 16, 2025
d1e914f
Rely on server for pipeline list in frontend
yondonfu Dec 16, 2025
5e9c447
Add plugins, pipelines CLI cmd with click
yondonfu Dec 16, 2025
e245628
Add install, uninstall (plugins) cmd in CLI
yondonfu Dec 16, 2025
955bf81
PipelineRegistry on server startup
yondonfu Dec 16, 2025
7c8b859
Rely on backend for all pipeline metadata and add conditional render …
yondonfu Dec 16, 2025
bd78ab7
Use default pipeline only if it meets the hardware requirements
leszko Dec 17, 2025
47ac7f5
Lazy import heavy model imports in pipeline init
yondonfu Dec 18, 2025
ceba9d0
Fix input mode bug when switching pipelines
yondonfu Dec 18, 2025
ab7db5f
Run worker in a separate process
leszko Dec 23, 2025
677e7e6
Remove unused dependencies
leszko Dec 23, 2025
fc3152e
Fix killing the main process
leszko Dec 23, 2025
3483cd1
Have separate pyproject.toml for eaech pipeline
leszko Dec 23, 2025
94378ba
Fix passthrough
leszko Dec 23, 2025
152fb5b
Merge yf/plugins with subprocess architecture for isolated plugin env…
leszko Dec 23, 2025
1e5d923
Fix: Make plugin imports lazy in scope.core to avoid requiring pluggy…
leszko Dec 23, 2025
fbbc7b3
Fix: Add get_output_fps method to FrameProcessorProxy
leszko Dec 23, 2025
5aece84
Update uv.lock
leszko Dec 23, 2025
54f02c2
Fix: Support git URLs in plugin install command
leszko Dec 23, 2025
5cc6bde
Fix: Add tomli fallback for Python 3.10 TOML parsing
leszko Dec 23, 2025
358585f
Fix: Add missing dependencies (omegaconf, transformers, etc.) to main…
leszko Dec 23, 2025
5725171
Fix plugins/pipelines
leszko Dec 23, 2025
f23001f
Fix test-generator
leszko Dec 23, 2025
d1cd975
Fix pipeline installation
leszko Dec 23, 2025
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
14 changes: 14 additions & 0 deletions frontend/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 4 additions & 2 deletions frontend/src/components/DownloadDialog.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,12 @@ import {
DialogTitle,
} from "./ui/dialog";
import { Progress } from "./ui/progress";
import { PIPELINES } from "../data/pipelines";
import type { PipelineId, DownloadProgress } from "../types";
import type { PipelineInfo } from "../hooks/usePipelines";

interface DownloadDialogProps {
open: boolean;
pipelines: Record<string, PipelineInfo> | null;
pipelineId: PipelineId;
onClose: () => void;
onDownload: () => void;
Expand All @@ -23,13 +24,14 @@ interface DownloadDialogProps {

export function DownloadDialog({
open,
pipelines,
pipelineId,
onClose,
onDownload,
isDownloading = false,
progress = null,
}: DownloadDialogProps) {
const pipelineInfo = PIPELINES[pipelineId];
const pipelineInfo = pipelines?.[pipelineId];
if (!pipelineInfo) return null;

return (
Expand Down
13 changes: 10 additions & 3 deletions frontend/src/components/InputAndControlsPanel.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ import { LabelWithTooltip } from "./ui/label-with-tooltip";
import type { VideoSourceMode } from "../hooks/useVideoSource";
import type { PromptItem, PromptTransition } from "../lib/api";
import type { InputMode } from "../types";
import { pipelineIsMultiMode } from "../data/pipelines";
import type { PipelineInfo } from "../hooks/usePipelines";
import { PromptInput } from "./PromptInput";
import { TimelinePromptEditor } from "./TimelinePromptEditor";
import type { TimelinePrompt } from "./PromptTimeline";
Expand All @@ -24,6 +24,7 @@ import { Button } from "./ui/button";

interface InputAndControlsPanelProps {
className?: string;
pipelines: Record<string, PipelineInfo> | null;
localStream: MediaStream | null;
isInitializing: boolean;
error: string | null;
Expand Down Expand Up @@ -73,6 +74,7 @@ interface InputAndControlsPanelProps {

export function InputAndControlsPanel({
className = "",
pipelines,
localStream,
isInitializing,
error,
Expand Down Expand Up @@ -128,7 +130,8 @@ export function InputAndControlsPanel({
const videoRef = useRef<HTMLVideoElement>(null);

// Check if this pipeline supports multiple input modes
const isMultiMode = pipelineIsMultiMode(pipelineId);
const pipeline = pipelines?.[pipelineId];
const isMultiMode = (pipeline?.supportedModes?.length ?? 0) > 1;

useEffect(() => {
if (videoRef.current && localStream) {
Expand Down Expand Up @@ -329,6 +332,11 @@ export function InputAndControlsPanel({
// The Input can have two states: Append (default) and Edit (when a prompt is selected and the video is paused)
const isEditMode = selectedTimelinePrompt && isVideoPaused;

// Hide prompts section if pipeline doesn't support prompts
if (pipeline?.supportsPrompts === false) {
return null;
}

return (
<div>
<div className="flex items-center justify-between mb-2">
Expand Down Expand Up @@ -358,7 +366,6 @@ export function InputAndControlsPanel({
onPromptsSubmit={onPromptsSubmit}
onTransitionSubmit={onTransitionSubmit}
disabled={
pipelineId === "passthrough" ||
(_isTimelinePlaying &&
!isVideoPaused &&
!isAtEndOfTimeline()) ||
Expand Down
53 changes: 15 additions & 38 deletions frontend/src/components/SettingsPanel.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,7 @@ import { Input } from "./ui/input";
import { Button } from "./ui/button";
import { Toggle } from "./ui/toggle";
import { SliderWithInput } from "./ui/slider-with-input";
import { Hammer, Info, Minus, Plus, RotateCcw } from "lucide-react";
import {
PIPELINES,
pipelineSupportsLoRA,
pipelineSupportsVACE,
} from "../data/pipelines";
import { Info, Minus, Plus, RotateCcw } from "lucide-react";
import { PARAMETER_METADATA } from "../data/parameterMetadata";
import { DenoisingStepsSlider } from "./DenoisingStepsSlider";
import { useLocalSliderValue } from "../hooks/useLocalSliderValue";
Expand All @@ -35,12 +30,14 @@ import type {
SettingsState,
InputMode,
} from "../types";
import type { PipelineInfo } from "../hooks/usePipelines";
import { LoRAManager } from "./LoRAManager";

const MIN_DIMENSION = 16;

interface SettingsPanelProps {
className?: string;
pipelines: Record<string, PipelineInfo> | null;
pipelineId: PipelineId;
onPipelineIdChange?: (pipelineId: PipelineId) => void;
isStreaming?: boolean;
Expand Down Expand Up @@ -89,6 +86,7 @@ interface SettingsPanelProps {

export function SettingsPanel({
className = "",
pipelines,
pipelineId,
onPipelineIdChange,
isStreaming = false,
Expand Down Expand Up @@ -141,7 +139,7 @@ export function SettingsPanel({
const [seedError, setSeedError] = useState<string | null>(null);

const handlePipelineIdChange = (value: string) => {
if (value in PIPELINES) {
if (pipelines && value in pipelines) {
onPipelineIdChange?.(value as PipelineId);
}
};
Expand Down Expand Up @@ -235,7 +233,7 @@ export function SettingsPanel({
handleSeedChange(newValue);
};

const currentPipeline = PIPELINES[pipelineId];
const currentPipeline = pipelines?.[pipelineId];

return (
<Card className={`h-full flex flex-col ${className}`}>
Expand All @@ -254,11 +252,12 @@ export function SettingsPanel({
<SelectValue placeholder="Select a pipeline" />
</SelectTrigger>
<SelectContent>
{Object.keys(PIPELINES).map(id => (
<SelectItem key={id} value={id}>
{id}
</SelectItem>
))}
{pipelines &&
Object.keys(pipelines).map(id => (
<SelectItem key={id} value={id}>
{id}
</SelectItem>
))}
</SelectContent>
</Select>
</div>
Expand All @@ -273,9 +272,7 @@ export function SettingsPanel({
</div>

<div>
{(currentPipeline.about ||
currentPipeline.docsUrl ||
currentPipeline.modified) && (
{(currentPipeline.about || currentPipeline.docsUrl) && (
<div className="flex items-stretch gap-1 h-6">
{currentPipeline.about && (
<TooltipProvider>
Expand All @@ -294,26 +291,6 @@ export function SettingsPanel({
</Tooltip>
</TooltipProvider>
)}
{currentPipeline.modified && (
<TooltipProvider>
<Tooltip>
<TooltipTrigger asChild>
<Badge
variant="outline"
className="cursor-help hover:bg-accent h-full flex items-center justify-center"
>
<Hammer className="h-3.5 w-3.5" />
</Badge>
</TooltipTrigger>
<TooltipContent>
<p>
This pipeline contains modifications based on the
original project.
</p>
</TooltipContent>
</Tooltip>
</TooltipProvider>
)}
{currentPipeline.docsUrl && (
<a
href={currentPipeline.docsUrl}
Expand All @@ -337,7 +314,7 @@ export function SettingsPanel({
)}

{/* VACE Toggle */}
{pipelineSupportsVACE(pipelineId) && (
{currentPipeline?.supportsVACE && (
<div className="space-y-2">
<div className="flex items-center justify-between gap-2">
<LabelWithTooltip
Expand Down Expand Up @@ -384,7 +361,7 @@ export function SettingsPanel({
</div>
)}

{pipelineSupportsLoRA(pipelineId) && (
{currentPipeline?.supportsLoRA && (
<div className="space-y-4">
<LoRAManager
loras={loras}
Expand Down
Loading