From ffc3efd167719d8859330aab128d36716abb7ab4 Mon Sep 17 00:00:00 2001 From: "DESKTOP-TVBJISQ\\Primere" Date: Fri, 27 Feb 2026 20:19:57 +0100 Subject: [PATCH] V 2.0.0 - Universal api #30 --- front_end/primere_uniapi.js | 58 +++++++++++++++++++++++-- terminal_helpers/api_snippet_to_json.py | 2 + terminal_helpers/result.json | 31 +++++++++---- terminal_helpers/snippet.py | 2 +- 4 files changed, 79 insertions(+), 14 deletions(-) diff --git a/front_end/primere_uniapi.js b/front_end/primere_uniapi.js index fb3c967..23a16ef 100644 --- a/front_end/primere_uniapi.js +++ b/front_end/primere_uniapi.js @@ -94,7 +94,53 @@ function ensureBooleanWidget(node, widgetName, values) { return markDynamicWidget(node, widgetName); } +function ensureNumberWidget(node, widgetName, valueType) { + const isInteger = valueType === "INT"; + const defaultValue = isInteger ? 1 : 1.0; + const expectedStep = isInteger ? 1 : 0.01; + const expectedPrecision = isInteger ? 0 : 4; + + let widget = getWidget(node, widgetName); + if (!widget || widget.type !== "number") { + removeWidgetByName(node, widgetName); + widget = node.addWidget("number", widgetName, defaultValue, () => {}, { + step: expectedStep, + precision: expectedPrecision, + }); + } + + widget.options = widget.options || {}; + widget.options.step = expectedStep; + widget.options.precision = expectedPrecision; + + if (typeof widget.value !== "number" || Number.isNaN(widget.value)) { + widget.value = defaultValue; + } else if (isInteger) { + widget.value = Math.round(widget.value); + } + + return markDynamicWidget(node, widgetName); +} + +function ensureStringWidget(node, widgetName) { + let widget = getWidget(node, widgetName); + if (!widget || widget.type !== "text") { + removeWidgetByName(node, widgetName); + widget = node.addWidget("text", widgetName, "", () => {}, {}); + } + + if (widget.value == null) { + widget.value = ""; + } + + return markDynamicWidget(node, widgetName); +} + function detectParameterType(values) { + if (values === "INT" || values === "FLOAT" || values === "STRING") { + return values; + } + if (!Array.isArray(values) || values.length === 0) { return "combo"; } @@ -103,10 +149,6 @@ function detectParameterType(values) { return "boolean"; } - if (values.every((value) => Number.isInteger(value))) { - return "integer"; - } - return "combo"; } @@ -231,6 +273,14 @@ function updateParameterWidgets(node, schemaRegistry) { ensureBooleanWidget(node, paramName, values); continue; } + if (paramType === "INT" || paramType === "FLOAT") { + ensureNumberWidget(node, paramName, paramType); + continue; + } + if (paramType === "STRING") { + ensureStringWidget(node, paramName); + continue; + } ensureComboWidget(node, paramName, values); } } diff --git a/terminal_helpers/api_snippet_to_json.py b/terminal_helpers/api_snippet_to_json.py index dd16e15..18f715c 100644 --- a/terminal_helpers/api_snippet_to_json.py +++ b/terminal_helpers/api_snippet_to_json.py @@ -52,6 +52,8 @@ def node_to_template(node: ast.AST, path: str) -> Any: if isinstance(node, ast.Constant): if node.value is None or isinstance(node.value, bool): return node.value + if isinstance(node.value, str) and node.value in {"INT", "FLOAT", "STRING"}: + return node.value return placeholder(path) if isinstance(node, ast.Name): diff --git a/terminal_helpers/result.json b/terminal_helpers/result.json index 3e775b4..35011f6 100644 --- a/terminal_helpers/result.json +++ b/terminal_helpers/result.json @@ -1,12 +1,25 @@ { "BlackForest": { - "FluxFillPro": { + "FluxExpandPro": { "provider": "BlackForest", - "service": "FluxFillPro", + "service": "FluxExpandPro", "possible_parameters": { - "blackforest_guidance": "FLOAT", - "blackforest_steps": "INT", - "safety_tolerance": [1, 2, 3, 4, 5, 6] + "aspect_ratio": [ + "fake_aspect_ratio_value_1", + "fake_aspect_ratio_value_2" + ], + "mask_images": [ + "fake_mask_images_value_1", + "fake_mask_images_value_2" + ], + "output_format": [ + "fake_output_format_value_1", + "fake_output_format_value_2" + ], + "safety_tolerance": [ + "fake_safety_tolerance_value_1", + "fake_safety_tolerance_value_2" + ] }, "request": { "method": "SDK", @@ -17,16 +30,16 @@ ], "kwargs": { "payload": { - "output_format": "png", + "output_format": "{{output_format}}", "image": "{{reference_images}}", "mask": "{{mask_images}}", "safety_tolerance": "{{safety_tolerance}}", "prompt": "{{prompt}}", "seed": "{{seed}}", "aspect_ratio": "{{aspect_ratio}}", - "prompt_upsampling": false, - "guidance": "{{guidance}}", - "steps": "{{blackforest_steps}}" + "prompt_upsampling": "STRING", + "guidance": "FLOAT", + "steps": "INT" } } } diff --git a/terminal_helpers/snippet.py b/terminal_helpers/snippet.py index 013baa9..3af6e9b 100644 --- a/terminal_helpers/snippet.py +++ b/terminal_helpers/snippet.py @@ -7,7 +7,7 @@ response = requests.post("https://api.bfl.ai/v1/flux-pro-1.0-fill", "prompt": prompt, "seed": seed, "aspect_ratio": aspect_ratio, - "prompt_upsampling": False, + "prompt_upsampling": "STRING", "guidance": "FLOAT", "steps": "INT" }