120 lines
3.2 KiB
JavaScript
120 lines
3.2 KiB
JavaScript
import { app } from '../../../scripts/app.js'
|
|
// import { api } from '../../../scripts/api.js'
|
|
import { ComfyWidgets } from '../../../scripts/widgets.js'
|
|
import { $el } from '../../../scripts/ui.js'
|
|
|
|
function getRandomElements (arr, num) {
|
|
var result = []
|
|
var len = arr.length
|
|
|
|
for (var i = 0; i < num; i++) {
|
|
var randomIndex = Math.floor(Math.random() * len)
|
|
result.push(arr[randomIndex])
|
|
}
|
|
|
|
return result
|
|
}
|
|
|
|
const createPrompt = (node, prompts, items, sample) => {
|
|
const w = ComfyWidgets['STRING'](
|
|
node,
|
|
'text',
|
|
['STRING', { multiline: true }],
|
|
app
|
|
).widget
|
|
w.inputEl.readOnly = true
|
|
w.inputEl.style.opacity = 0.6
|
|
|
|
w.value = typeof prompts === 'string' ? prompts : prompts.join('\n\n')
|
|
|
|
const w2 = ComfyWidgets['STRING'](
|
|
node,
|
|
'text',
|
|
['STRING', { multiline: true }],
|
|
app
|
|
).widget
|
|
w2.inputEl.readOnly = true
|
|
w2.inputEl.style.opacity = 0.6
|
|
|
|
w2.value = typeof items === 'string' ? items : JSON.stringify(items, null, 2)
|
|
|
|
const w3 = ComfyWidgets['STRING'](
|
|
node,
|
|
'text',
|
|
['STRING', { multiline: true }],
|
|
app
|
|
).widget
|
|
w3.inputEl.readOnly = true
|
|
w3.inputEl.style.opacity = 0.6
|
|
w3.value = typeof sample === 'string' ? sample : sample.join('\n\n')
|
|
}
|
|
|
|
app.registerExtension({
|
|
name: 'Mixlab.prompt.ClipInterrogator',
|
|
async beforeRegisterNodeDef (nodeType, nodeData, app) {
|
|
if (nodeData.name === 'ClipInterrogator') {
|
|
function populate (prompts, items, random_samples) {
|
|
if (this.widgets) {
|
|
for (let i = 0; i < this.widgets.length; i++) {
|
|
if (this.widgets[i].type !== 'combo') this.widgets[i].onRemove?.()
|
|
}
|
|
this.widgets.length = 2
|
|
}
|
|
|
|
createPrompt(this, prompts, items, random_samples)
|
|
|
|
// console.log('ClipInterrogator', w, w2)
|
|
requestAnimationFrame(() => {
|
|
const sz = this.computeSize()
|
|
if (sz[0] < this.size[0]) {
|
|
sz[0] = this.size[0]
|
|
}
|
|
if (sz[1] < this.size[1]) {
|
|
sz[1] = this.size[1]
|
|
}
|
|
this.onResize?.(sz)
|
|
app.graph.setDirtyCanvas(true, false)
|
|
})
|
|
}
|
|
|
|
// When the node is executed we will be sent the input text, display this in the widget
|
|
const onExecuted = nodeType.prototype.onExecuted
|
|
nodeType.prototype.onExecuted = function (message) {
|
|
onExecuted?.apply(this, arguments)
|
|
// console.log('##', message)
|
|
populate.call(
|
|
this,
|
|
message.prompt,
|
|
message.analysis,
|
|
message.random_samples
|
|
)
|
|
}
|
|
|
|
this.serialize_widgets = true //需要保存参数
|
|
}
|
|
},
|
|
async loadedGraphNode (node, app) {
|
|
// Fires every time a node is constructed
|
|
// You can modify widgets/add handlers/etc here
|
|
|
|
if (node.type === 'ClipInterrogator') {
|
|
try {
|
|
|
|
let widgets_values = node.widgets_values
|
|
console.log(widgets_values )
|
|
try {
|
|
if (widgets_values[2] && widgets_values[3] && widgets_values[4])
|
|
createPrompt(
|
|
node,
|
|
widgets_values[2],
|
|
widgets_values[3],
|
|
widgets_values[4]
|
|
)
|
|
} catch (error) {
|
|
console.log(error)
|
|
}
|
|
} catch (error) {}
|
|
}
|
|
}
|
|
})
|