(function agent_scheduler_init() { const head = document.head || document.querySelector('head'); window.__loaded_scripts = []; const insertStyleTag = (href) => { const style = document.createElement('link'); style.rel = 'stylesheet'; style.href = href; head.appendChild(style); }; const insertScriptTag = (src, onload) => { const script = document.createElement('script'); script.type = 'text/javascript'; head.appendChild(script); script.onload = onload; script.src = src; }; // load ag-grid insertStyleTag('https://cdn.jsdelivr.net/npm/ag-grid-community@29.3.3/styles/ag-grid.css'); insertStyleTag( 'https://cdn.jsdelivr.net/npm/ag-grid-community@29.3.3/styles/ag-theme-alpine.css', ); insertScriptTag( 'https://cdn.jsdelivr.net/npm/ag-grid-community@29.3.3/dist/ag-grid-community.min.noStyle.js', () => { window.__loaded_scripts.push('agGrid'); }, ); // load rxjs insertScriptTag('https://cdnjs.cloudflare.com/ajax/libs/rxjs/7.8.1/rxjs.umd.min.js', () => { window.__loaded_scripts.push('rxjs'); const observable = new rxjs.Observable((observer) => { function submit_enqueue() { var id = randomId(); var res = create_submit_args(arguments); res[0] = id; document.querySelector('#txt2img_enqueue').innerHTML = 'Queued'; setTimeout(() => { document.querySelector('#txt2img_enqueue').innerHTML = 'Enqueue'; observer.next({ type: 'txt2img', id }); }, 1000); return res; } function submit_enqueue_img2img() { var id = randomId(); var res = create_submit_args(arguments); res[0] = id; res[1] = get_tab_index('mode_img2img'); document.querySelector('#img2img_enqueue').innerHTML = 'Queued'; setTimeout(() => { document.querySelector('#img2img_enqueue').innerHTML = 'Enqueue'; observer.next({ type: 'txt2img', id }); }, 1000); return res; } submit_enqueue.subscribe = observable.subscribe.bind(observable); submit_enqueue_img2img.subscribe = observable.subscribe.bind(observable); window.submit_enqueue = submit_enqueue; window.submit_enqueue_img2img = submit_enqueue_img2img; }); // register a dummy subscriber observable.subscribe({ next: console.log, error: console.error, complete: console.log, }); }); // notyf insertStyleTag('https://cdn.jsdelivr.net/npm/notyf@3/notyf.min.css'); insertScriptTag('https://cdn.jsdelivr.net/npm/notyf@3/notyf.min.js', () => { window.__loaded_scripts.push('notyf'); }); })(); onUiLoaded(function initTaskScheduler() { if (window.__loaded_scripts.length < 3) { return setTimeout(() => { initTaskScheduler() }, 200); } // detect black-orange theme if (document.querySelector('link[href*="black-orange.css"]')) { document.body.classList.add('black-orange'); } // init notyf const notyf = new Notyf(); // init state const subject = new rxjs.Subject(); const store = { subject, init: (initialState) => { return (store.subject = subject.pipe(rxjs.startWith(initialState))); }, subscribe: (callback) => { return store.subject.pipe(rxjs.pairwise()).subscribe(callback); }, refresh: async () => { return fetch('/agent-scheduler/v1/queue?limit=1000') .then((response) => response.json()) .then((data) => { const pending_tasks = data.pending_tasks.map((item) => ({ ...item, params: JSON.parse(item.params), status: item.id === data.current_task_id ? 'running' : 'pending', })); store.subject.next({ ...data, pending_tasks, }); }); }, pauseQueue: async () => { return fetch('/agent-scheduler/v1/pause', { method: 'POST' }) .then((response) => response.json()) .then((data) => { if (data.success) { notyf.success(data.message); } else { notyf.error(data.message); } return store.refresh(); }) }, resumeQueue: async () => { return fetch('/agent-scheduler/v1/resume', { method: 'POST' }) .then((response) => response.json()) .then((data) => { if (data.success) { notyf.success(data.message); } else { notyf.error(data.message); } return store.refresh(); }) }, runTask: async (id) => { return fetch(`/agent-scheduler/v1/run/${id}`, { method: 'POST' }) .then((response) => response.json()) .then((data) => { if (data.success) { notyf.success(data.message); } else { notyf.error(data.message); } return store.refresh(); }); }, deleteTask: async (id) => { return fetch(`/agent-scheduler/v1/delete/${id}`, { method: 'POST' }) .then((response) => response.json()) .then((data) => { if (data.success) { notyf.success(data.message); } else { notyf.error(data.message); } return store.refresh(); }); }, moveTask: async (id, overId) => { return fetch(`/agent-scheduler/v1/move/${id}/${overId}`, { method: 'POST' }) .then((response) => response.json()) .then((data) => { if (data.success) { notyf.success(data.message); } else { notyf.error(data.message); } return store.refresh(); }); }, }; store.init({ current_task_id: null, total_pending_tasks: 0, pending_tasks: [], paused: false }); // init actions const refreshButton = gradioApp().querySelector('#agent_scheduler_action_refresh'); refreshButton.addEventListener('click', () => { store.refresh(); }); const pauseButton = gradioApp().querySelector('#agent_scheduler_action_pause'); pauseButton.addEventListener('click', () => { store.pauseQueue(); }); const resumeButton = gradioApp().querySelector('#agent_scheduler_action_resume'); resumeButton.addEventListener('click', () => { store.resumeQueue(); }); const searchContainer = gradioApp().querySelector('#agent_scheduler_action_search'); searchContainer.className = "ts-search"; searchContainer.innerHTML = `
`; // init grid const eGridDiv = gradioApp().querySelector('#agent_scheduler_pending_tasks_grid'); if (document.querySelector('.dark')) { eGridDiv.className = 'ag-theme-alpine-dark'; } const deleteIcon = ` `; const cancelIcon = ` `; const pendingTasksGridOptions = { domLayout: 'autoHeight', // each entry here represents one column columnDefs: [ { field: 'id', headerName: 'Task Id', minWidth: 240, maxWidth: 240, pinned: 'left', rowDrag: true, cellClass: ({ data }) => (data.status === 'running' ? 'task-running' : ''), }, { field: 'type', headerName: 'Type', minWidth: 80, maxWidth: 80 }, { field: 'priority', headerName: 'Priority', minWidth: 120, maxWidth: 120, filter: 'agNumberColumnFilter', valueGetter: ({ data }) => data.priority - 1_681_000_000_000, hide: true, }, { headerName: 'Params', children: [ { field: 'params.checkpoint', headerName: 'Checkpoint', minWidth: 150, maxWidth: 300, valueFormatter: ({ value }) => value || 'System' }, { field: 'params.prompt', headerName: 'Prompt', width: 400, minWidth: 200, wrapText: true, autoHeight: true, cellStyle: { 'line-height': '24px', 'padding-top': '8px', 'padding-bottom': '8px' }, }, { field: 'params.negative_prompt', headerName: 'Negative Prompt', width: 400, minWidth: 200, wrapText: true, autoHeight: true, cellStyle: { 'line-height': '24px', 'padding-top': '8px', 'padding-bottom': '8px' }, }, { field: 'params.sampler_name', headerName: 'Sampler', width: 150, minWidth: 150, }, { field: 'params.steps', headerName: 'Steps', minWidth: 80, maxWidth: 80, filter: 'agNumberColumnFilter', }, { field: 'params.cfg_scale', headerName: 'CFG Scale', width: 100, minWidth: 100, filter: 'agNumberColumnFilter', }, { field: 'params.size', headerName: 'Size', minWidth: 110, maxWidth: 110, valueGetter: ({ data }) => `${data.params.width}x${data.params.height}`, }, { field: 'params.batch', headerName: 'Batching', minWidth: 100, maxWidth: 100, valueGetter: ({ data }) => `${data.params.n_iter}x${data.params.batch_size}`, }, ], }, { field: 'created_at', headerName: 'Date', minWidth: 200 }, { headerName: 'Action', pinned: 'right', minWidth: 110, maxWidth: 110, resizable: false, valueGetter: ({ data }) => data.id, cellRenderer: ({ api, value, data }) => { const html = `