From 6887165a9d657ced4f0122c0ca5368dc74125d80 Mon Sep 17 00:00:00 2001 From: Matt Miller Date: Tue, 19 May 2026 16:55:04 -0700 Subject: [PATCH 1/2] docs(openapi): tighten workspace API key description field (BE-1004) (#13996) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Aligns the OSS spec with the cloud-side BE-1004 contract: - createWorkspaceApiKey request body: add maxLength: 5000 to the description property (matches cloud's hub_profile.description MaxLen(5000) convention; enforced cloud-side via handler check). - WorkspaceApiKey + WorkspaceApiKeyCreated response schemas: mark description as required (cloud's handler always populates the field, defaulting to empty string when not supplied on create), drop nullable: true, add maxLength: 5000 for symmetry, and clarify the doc string ("Always present in responses; empty string when no description was supplied on create"). Both schemas are tagged x-runtime: [cloud] at the schema level so the tightening is correctly scoped — OSS-only implementations are not required to honor the workspace API keys endpoints at all. Related cloud PR: Comfy-Org/cloud#3747 --- openapi.yaml | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/openapi.yaml b/openapi.yaml index bc1ae16fa..2658b9b86 100644 --- a/openapi.yaml +++ b/openapi.yaml @@ -4162,7 +4162,8 @@ paths: description: Display name for the API key description: type: string - description: User-provided description for the key + description: User-provided description of the key's purpose + maxLength: 5000 responses: "201": description: API key created @@ -7680,6 +7681,7 @@ components: required: - id - name + - description properties: id: type: string @@ -7687,8 +7689,8 @@ components: type: string description: type: string - nullable: true - description: User-provided description + maxLength: 5000 + description: User-provided description of the key's purpose. Always present in responses; empty string when no description was supplied on create. prefix: type: string description: First few characters of the key for identification @@ -7709,6 +7711,7 @@ components: required: - id - name + - description - key properties: id: @@ -7717,8 +7720,8 @@ components: type: string description: type: string - nullable: true - description: User-provided description + maxLength: 5000 + description: User-provided description of the key's purpose. Always present in responses; empty string when no description was supplied on create. key: type: string description: Full API key value (only returned on creation) From 7ec7b6ffe93bb47d70c5fa1b702e387e4d545dae Mon Sep 17 00:00:00 2001 From: Pauan Date: Tue, 19 May 2026 19:25:49 -0700 Subject: [PATCH 2/2] Adding new StringFormat node (#13997) --- comfy_extras/nodes_string.py | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/comfy_extras/nodes_string.py b/comfy_extras/nodes_string.py index 925a40da8..97485c8c5 100644 --- a/comfy_extras/nodes_string.py +++ b/comfy_extras/nodes_string.py @@ -1,10 +1,41 @@ import re import json +import string from typing_extensions import override from comfy_api.latest import ComfyExtension, io +class StringFormat(io.ComfyNode): + @classmethod + def define_schema(cls) -> io.Schema: + autogrow = io.Autogrow.TemplateNames( + input=io.AnyType.Input("value"), + names=list(string.ascii_lowercase), + min=0, + ) + return io.Schema( + node_id="StringFormat", + display_name="Format Text", + category="text", + search_aliases=["string", "format"], + description="Same as Python's string format method. Supports all of Python's format options and features.", + inputs=[ + io.Autogrow.Input("values", template=autogrow), + io.String.Input("f_string", default="{a}", multiline=True), + ], + outputs=[ + io.String.Output(), + ], + ) + + @classmethod + def execute( + cls, values: io.Autogrow.Type, f_string: str + ) -> io.NodeOutput: + return io.NodeOutput(f_string.format(**values)) + + class StringConcatenate(io.ComfyNode): @classmethod def define_schema(cls): @@ -413,6 +444,7 @@ class StringExtension(ComfyExtension): @override async def get_node_list(self) -> list[type[io.ComfyNode]]: return [ + StringFormat, StringConcatenate, StringSubstring, StringLength,