Files
CavinHuang-comfyui-nodes-docs/docs/IF_SaveText.md
2024-07-04 08:39:03 +08:00

5.2 KiB

Documentation

IF_SaveText节点旨在处理并可选择性保存与交互相关的文本数据,如问题、回答和负面反馈,并支持多种文件格式。该节点的功能包括为每次交互生成唯一标识符、格式化交互数据,以及以指定格式和模式将数据保存到文件中,从而增强数据管理和检索能力,便于进一步分析或记录保存。

Input types

Required

  • question_input
    • 交互中的问题部分,作为生成交互记录的关键输入。
    • Comfy dtype: STRING
    • Python dtype: str
  • response_input
    • 对问题的回答,对记录交互至关重要。
    • Comfy dtype: STRING
    • Python dtype: str
  • negative_input
    • 与交互相关的负面反馈或输入,提供额外的上下文信息。
    • Comfy dtype: STRING
    • Python dtype: str

Optional

  • save_file
    • 布尔标志,指示是否将交互数据保存到文件中。
    • Comfy dtype: BOOLEAN
    • Python dtype: bool
  • file_format
    • 指定保存交互数据的文件格式(csv、txt、json)。
    • Comfy dtype: COMBO[STRING]
    • Python dtype: str
  • save_mode
    • 决定文件的保存方式:创建新文件、覆盖现有文件或追加到现有文件。
    • Comfy dtype: COMBO[STRING]
    • Python dtype: str

Output types

  • Question
    • Comfy dtype: STRING
    • 返回交互中的问题部分。
    • Python dtype: str
  • Response
    • Comfy dtype: STRING
    • 返回交互中的回答部分。
    • Python dtype: str
  • Negative
    • Comfy dtype: STRING
    • 返回与交互相关的负面反馈或输入。
    • Python dtype: str
  • Turn
    • Comfy dtype: STRING
    • 返回一个格式化的字符串,包含交互的唯一标识符、问题、回答和负面输入。
    • Python dtype: str

Usage tips

  • Infra type: CPU
  • Common nodes: unknown

Source code

class IFSaveText:
    def __init__(self):
        pass

    @classmethod
    def INPUT_TYPES(cls):
        return {
            "required": {
                "question_input": ("STRING", {"forceInput": True}),
                "response_input": ("STRING", {"forceInput": True}),
                "negative_input": ("STRING", {"forceInput": True}),
                #"turn": ("STRING", {"forceInput": True}),
            },
            "optional": {                
                "save_file": ("BOOLEAN", {"default": False, "label_on": "Save Text", "label_off": "Don't Save"}),
                "file_format": (["csv", "txt", "json"],),
                "save_mode": (["create", "overwrite", "append"],),
            },
            #"hidden": {"prompt": "PROMPT", "extra_pnginfo": "EXTRA_PNGINFO"},
        }

    RETURN_TYPES = ("STRING", "STRING", "STRING", "STRING",)
    RETURN_NAMES = ("Question", "Response", "Negative", "Turn",)
    FUNCTION = "process_text"
    OUTPUT_NODE = True
    CATEGORY = "ImpactFrames💥🎞️"

    def process_text(self, question_input, negative_input, response_input, save_file=False, file_format="txt", save_mode="create"):
        turn_id = str(uuid.uuid4()) 
        turn_data = {"id": turn_id, "question": question_input, "response": response_input, "negative": negative_input}
        if save_file:
            self.save_text_to_file(turn_data, file_format, save_mode)

        turn = f"ID: {turn_id}\nQuestion: {question_input}\nResponse: {response_input}\nNegative: {negative_input}"
        return (question_input, response_input, negative_input, turn)

    def save_text_to_file(self, turn_data, file_format, save_mode):
        save_text_dir = folder_paths.get_output_directory()
        os.makedirs(save_text_dir, exist_ok=True)
        file_path = os.path.join(save_text_dir, f"output.{file_format}")

        file_mode = "w" if save_mode in ["create", "overwrite"] else "a"

        if file_format == "csv":
            with open(file_path, file_mode, newline='') as csvfile:
                fieldnames = ['question', 'response']
                writer = csv.DictWriter(csvfile, fieldnames=fieldnames)

                if save_mode == "create" or save_mode == "overwrite":
                    writer.writeheader()
                writer.writerow(turn_data)

        elif file_format == "txt":
            with open(file_path, file_mode) as txtfile:
                txtfile.write(f"{turn_data}\n")

        elif file_format == "json":
            with open(file_path, file_mode) as jsonfile:
                if save_mode == "append":
                    try:
                        data = json.load(jsonfile)
                    except:
                        data = []
                    data.append(turn_data)
                    jsonfile.seek(0)
                else:
                    data = [turn_data]
                json.dump(data, jsonfile, indent=4)

    """@classmethod
    def IS_CHANGED(cls, turn_id, question_input, negative_input, response_input, turn, save_file, file_format, save_mode, unique_id=None, prompt=None, extra_pnginfo=None):
        turn = f"ID: {turn_id}\nQuestion: {question_input}\nResponse: {response_input}\nNegative: {negative_input}"
        return {"ui": {"string": [turn]}, "result": (turn,)}"""