{
  "nodes": [
    {
      "id": "de100f19-7dfb-4c8c-8a23-7b4c58806727",
      "name": "OpenAI Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        480,
        -64
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4.1",
          "cachedResultName": "gpt-4.1"
        },
        "options": {}
      },
      "credentials": {
        "openAiApi": {
          "id": "credential-id",
          "name": "openAiApi Credential"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "831601e5-29d4-4ab9-a1ec-499e62374d73",
      "name": "current_procedures",
      "type": "n8n-nodes-base.baserowTool",
      "position": [
        640,
        -64
      ],
      "parameters": {
        "tableId": "={{ $('Set table and field ids').item.json[\"Procedures table ID\"] }}",
        "databaseId": "={{ $('Set table and field ids').item.json[\"Database ID\"] }}",
        "additionalOptions": {}
      },
      "credentials": {
        "baserowApi": {
          "id": "credential-id",
          "name": "baserowApi Credential"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "5a617f0d-1bac-48a2-b789-26560a6fb781",
      "name": "current_procedure_steps",
      "type": "n8n-nodes-base.baserowTool",
      "position": [
        800,
        -64
      ],
      "parameters": {
        "tableId": "={{ $('Set table and field ids').item.json[\"Procedure steps table ID\"] }}",
        "databaseId": "={{ $('Set table and field ids').item.json[\"Database ID\"] }}",
        "additionalOptions": {}
      },
      "credentials": {
        "baserowApi": {
          "id": "credential-id",
          "name": "baserowApi Credential"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "9e0de906-b9cf-4720-a944-df509625df1c",
      "name": "When clicking ‘Execute workflow’",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        96,
        -288
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "2c29bcb9-a868-4653-b627-8df4a1dbd218",
      "name": "Set table and field ids",
      "type": "n8n-nodes-base.set",
      "position": [
        320,
        -288
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "a6d025c0-1755-43ee-8c1b-b856e1d245a2",
              "name": "API Host",
              "type": "string",
              "value": "https://api.baserow.io"
            },
            {
              "id": "05af1918-f38e-4454-b79e-051340e311eb",
              "name": "Token",
              "type": "string",
              "value": "e5bF6WyRLUsjvEFnP5NgVWq9rSDxZ1q6"
            },
            {
              "id": "71bfc6e0-6863-4e83-961e-ef06850dad74",
              "name": "Database ID",
              "type": "number",
              "value": 291010
            },
            {
              "id": "3dac59b1-a50f-4967-b162-eb57723ebd2b",
              "name": "Procedures table ID",
              "type": "number",
              "value": 677071
            },
            {
              "id": "646c3aa6-8b0a-44fa-8cd8-cd95acd52373",
              "name": "Procedure steps table ID",
              "type": "number",
              "value": 677072
            },
            {
              "id": "deca63bf-d8c2-4717-a6db-228cd8fccfe3",
              "name": "Tasks table ID",
              "type": "number",
              "value": 677073
            },
            {
              "id": "d9f63d5c-643b-4bee-b87b-b7fc1790e3c9",
              "name": "Improvement suggestions table ID",
              "type": "number",
              "value": 677074
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "90dd8dc6-ee48-43eb-87d6-54d56b0e1e26",
      "name": "Create improvement suggestions",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        1264,
        -288
      ],
      "parameters": {
        "url": "={{ $('Set table and field ids').item.json[\"API Host\"] }}/api/database/rows/table/{{ $('Set table and field ids').item.json[\"Improvement suggestions table ID\"] }}/batch/?user_field_names=true",
        "method": "POST",
        "options": {},
        "sendBody": true,
        "sendHeaders": true,
        "bodyParameters": {
          "parameters": [
            {
              "name": "items",
              "value": "={{ $json.output.items }}"
            }
          ]
        },
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "=Token {{ $('Set table and field ids').item.json.Token }}"
            }
          ]
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "5f6a9db0-c2a1-4e90-8302-14f63a793c62",
      "name": "Get non-processed feedback",
      "type": "n8n-nodes-base.baserow",
      "position": [
        1488,
        -288
      ],
      "parameters": {
        "tableId": "={{ $('Set table and field ids').item.json[\"Tasks table ID\"] }}",
        "returnAll": true,
        "databaseId": "={{ $('Set table and field ids').item.json[\"Database ID\"] }}",
        "additionalOptions": {
          "filters": {
            "fields": [
              {
                "field": 5584524,
                "value": "True",
                "operator": "not_empty"
              },
              {
                "field": 5584526,
                "value": "False",
                "operator": "boolean"
              }
            ]
          }
        }
      },
      "credentials": {
        "baserowApi": {
          "id": "credential-id",
          "name": "baserowApi Credential"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "afb30f1c-137c-43fb-a9b5-e2bbed1e3411",
      "name": "Set feedback to processed",
      "type": "n8n-nodes-base.set",
      "position": [
        1712,
        -288
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "4dfd48a9-949b-4d36-8b60-1aa1bdb2a882",
              "name": "id",
              "type": "number",
              "value": "={{ $json.id }}"
            },
            {
              "id": "a42712a5-a4fd-4885-b0cf-f2075a2fa65f",
              "name": "Feedback processed",
              "type": "boolean",
              "value": true
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "0b52a8b2-a076-4d66-a590-95f133259954",
      "name": "Aggregate records for input",
      "type": "n8n-nodes-base.aggregate",
      "position": [
        1936,
        -288
      ],
      "parameters": {
        "options": {},
        "aggregate": "aggregateAllItemData",
        "destinationFieldName": "items"
      },
      "typeVersion": 1
    },
    {
      "id": "b1a6abf1-1eea-40ec-b60b-5b3060cfb2ad",
      "name": "Update tasks to processed feedback",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        2160,
        -288
      ],
      "parameters": {
        "url": "={{ $('Set table and field ids').item.json[\"API Host\"] }}/api/database/rows/table/{{ $('Set table and field ids').item.json[\"Tasks table ID\"] }}/batch/?user_field_names=true",
        "method": "PATCH",
        "options": {},
        "sendBody": true,
        "sendHeaders": true,
        "bodyParameters": {
          "parameters": [
            {
              "name": "items",
              "value": "={{ $json.items }}"
            }
          ]
        },
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "=Token {{ $('Set table and field ids').item.json.Token }}"
            }
          ]
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "310ca97a-8361-4d9a-b577-5f26becb4029",
      "name": "Feedback processing agent",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        736,
        -288
      ],
      "parameters": {
        "text": "=Check the feedback on the current standard operation procedure steps and suggest improvements in the procedures",
        "options": {
          "systemMessage": "# Role\nYou are a Quality Assurance Manager at a digital services company. Your role is to review existing Standard Operating Procedures (SOPs) and their individual steps based on collected execution feedback from staff, and recommend actionable improvements.\n\n# Goals\n- Identify unclear instructions, missing details, unnecessary complexity, or steps that can be merged/split.\n- Retain effective steps that have positive feedback without introducing unnecessary changes.\n- Provide specific, actionable, and realistic recommendations for improvement.\n\n# Instructions\n1. Retrieve the SOP list and step details from the tools:\n   - `current_procedures` (procedure-level information)\n   - `current_procedures_steps` (step-level information)\n2. Retrieve all feedback from `tasks_feedback`.\n3. For each step:\n   - Summarize the feedback into key points (positive, negative, suggestions) using markdown syntax\n   - Decide whether to:\n     a) Keep as is,  \n     b) Modify instructions for clarity,  \n     c) Split into smaller steps,  \n     d) Merge with another step, or  \n     e) Remove the step entirely (rare case).\n4. For each suggested change:\n   - Reference the step using the unique id of the step.\n   - Make a short summary of the feedback\n   - Decide which action to take\n   - Explain the reasoning based on the feedback using markdown syntax\n4.1 In cases where the proposed action is Keep\n   - No further actions are required\n4.2 In cases where the proposed action is Update\n   - Suggest a new name for the step or use the same if no change is required\n   - Suggest a new checklist for the step or use the same if no change is required\n4.3 In case where the proposed action is Merge\n   - Specify the id's of the two steps that need to be merged\n   - Suggest a new name for the merged step or use the same of one of the original steps if this is more appropriate\n   - Suggest a new checklist for the merged step or simply merge the checklists of the original steps if this is more appropriate\n4.4 In case where the proposed action is Split\n   - Suggest a new name for the first and second step that need to be created.\n   - Suggest a new checklist the first and second step that need to be created.\n\n# Output\n<examples>\n<example>\n\"items\": [\n        {\n            \"Name\": \"Processed feedback since 2025-08-12\",\n            \"Step\": [\n                52980\n            ],\n            \"Proposed action\": \"Keep\",\n            \"Reason\": \"Everyone seems to understand this step completely\",\n            \"Feedback summary\": \"The purpose is clear, but specifics of what is being checked are not.\"\n        },\n        {\n            \"Name\": \"Processed feedback since 2025-08-02\",\n            \"Step\": [\n                53005\n            ],\n            \"Proposed action\": \"Merge\",\n            \"Steps to merge\": [53005, 53006],\n            \"Merged name\": \"Fill in the form including the attachments\",\n            \"Merged checklist\": \"- Scan each receipt. \n- Attach files to claim form.\n- Check readability of images.\n- Do not forget the attachments\",\n            \"Reason\": \"Employees want to know when funds will appear and what actions (if any) are needed from them prior to payment.\",\n            \"Feedback summary\": \"Closing the loop with automatic notifications would reduce uncertainty and manual checking.\"\n        }\n    ]\n</example>\n<example>\n\"items\": [\n        {\n            \"Name\": \"Processed feedback since 2025-06-01\",\n            \"Step\": [\n                53012\n            ],\n            \"Proposed action\": \"Update,\n            \"Reason\": \"Users want clarity on file formats and whether physical receipts must be retained. One user finds it inefficient to return separately just to upload files and suggests combining this step with the previous one.\",\n            \"Feedback summary\": \"- Several users find the instructions generally clear, but suggest that: - Examples would help, especially for new claimants. - Listing reimbursement codes in a quick-reference guide would be useful. - The form layout is not intuitive (lots of scrolling). - The step could be split into 'personal details' and 'expense details' to avoid overwhelming users.\",\n            \"Updated name\": \"Submit Restock Request into the system\",\n            \"Updated checklist\": \"- Complete restock request form. \n- Specify quantities needed. \n- Send to purchasing department.\",\n        },\n        {\n            \"Name\": \"Processed feedback since 2025-07-29\",\n            \"Step\": [\n                52990\n            ],\n            \"Proposed action\": \"Split\",\n            \"Reason\": \"Feedback indicates new claimants want more examples and a reference guide. Users found the current form’s layout unintuitive and overwhelming, suggesting it could be split into two simpler stages.\",\n            \"Feedback summary\": \"Clear task, but:- An estimate of the expected completion time would help set expectations. - Sometimes employees are unsure if they need to confirm their payment details. - Automatic notification when payment is sent would be helpful.\"\n        }\n    ]\n</example>\n\n</examples>\n\n# Notes\n- Only recommend changes that are justified by feedback.\n- If the feedback is conflicting, note the conflict and suggest the safest improvement.\n- Keep recommendations concise but specific enough for implementation.\n- Always use markdown syntax for text\n"
        },
        "promptType": "define",
        "hasOutputParser": true
      },
      "typeVersion": 1.7
    },
    {
      "id": "723829c4-8c38-404a-b95b-c3177ae21a3c",
      "name": "tasks_feedback",
      "type": "n8n-nodes-base.baserowTool",
      "position": [
        960,
        -64
      ],
      "parameters": {
        "tableId": "={{ $('Set table and field ids').item.json[\"Tasks table ID\"] }}",
        "returnAll": true,
        "databaseId": "={{ $('Set table and field ids').item.json[\"Database ID\"] }}",
        "additionalOptions": {
          "filters": {
            "fields": [
              {
                "field": 5584524,
                "value": "True",
                "operator": "not_empty"
              },
              {
                "field": 5584526,
                "value": "False",
                "operator": "boolean"
              }
            ]
          }
        }
      },
      "credentials": {
        "baserowApi": {
          "id": "credential-id",
          "name": "baserowApi Credential"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "ff442fad-d80c-4fd4-a080-143e0e6747b1",
      "name": "Required output schema",
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "position": [
        1120,
        -64
      ],
      "parameters": {
        "schemaType": "manual",
        "inputSchema": "{\n  \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n  \"type\": \"object\",\n  \"properties\": {\n    \"items\": {\n      \"type\": \"array\",\n      \"items\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"Step\": {\n            \"type\": \"array\",\n            \"description\": \"The unique id of the step that is reviewed.\",\n            \"items\": { \"type\": \"integer\", \"minimum\": 1 },\n            \"minItems\": 1,\n            \"maxItems\": 1\n          },\n          \"Proposed action\": {\n            \"type\": \"string\",\n            \"enum\": [\"Keep\", \"Update\", \"Split\", \"Merge\", \"Delete\"],\n            \"description\": \"The action that needs to be taken for the step.\"\n          },\n          \"Reason\": {\n            \"type\": \"string\"\n          },\n          \"Feedback summary\": {\n            \"type\": \"string\"\n          },\n          \"Updated name\": {\n            \"type\": \"string\",\n            \"description\": \"A new name for the existing step.\"\n          },\n          \"Updated checklist\": {\n            \"type\": \"string\",\n            \"description\": \"A new checklist for the existing step.\"\n          },\n          \"Steps to merge\": {\n            \"type\": \"array\",\n            \"description\": \"The unique id's of the two steps that need to be merged.\",\n            \"items\": { \"type\": \"integer\", \"minimum\": 2 },\n            \"minItems\": 2,\n            \"maxItems\": 2\n          },\n          \"Merged name\": {\n            \"type\": \"string\",\n            \"description\": \"The new name for the merged step.\"\n          },\n          \"Merged checklist\": {\n            \"type\": \"string\",\n            \"description\": \"The new checklist for the merged step.\"\n          },\n          \"New step 1 name\": {\n            \"type\": \"string\",\n            \"description\": \"A name for the first new step.\"\n          },\n          \"New step 1 checklist\": {\n            \"type\": \"string\",\n            \"description\": \"The checklist for the first new step.\"\n          },\n          \"New step 2 Name\": {\n            \"type\": \"string\",\n            \"description\": \"A name for the second new step.\"\n          },\n          \"New step 2 checklist\": {\n            \"type\": \"string\",\n            \"description\": \"The checklist for the second new step.\"\n          }\n        },\n        \"required\": [\n          \"Step\",\n          \"Proposed action\",\n          \"Reason\",\n          \"Feedback summary\"\n        ],\n        \"additionalProperties\": false,\n        \"allOf\": [\n          {\n            \"if\": { \"properties\": { \"Proposed action\": { \"const\": \"Keep\" } } },\n            \"then\": {\n              \"required\": [\"Step\", \"Proposed action\", \"Reason\", \"Feedback summary\", \"Updated name\", \"Updated checklist\"],\n              \"not\": { \"required\": [\"Steps to merge\", \"Merged name\", \"Merged checklist\",\"New step 1 name\", \"New step 1 checklist\", \"New step 2 name\", \"New step 2 checklist\"] }\n            }\n          },\n          {\n            \"if\": { \"properties\": { \"Proposed action\": { \"const\": \"Merge\" } } },\n            \"then\": {\n              \"required\": [\"Step\", \"Proposed action\", \"Reason\", \"Feedback summary\", \"Steps to merge\", \"Merged name\", \"Merged checklist\"],\n              \"not\": { \"required\": [\"Updated name\", \"Updated checklist\",\"New step 1 name\", \"New step 1 checklist\", \"New step 2 name\", \"New step 2 checklist\"] }\n            }\n          },\n          {\n            \"if\": { \"properties\": { \"Proposed action\": { \"const\": \"Split\" } } },\n            \"then\": {\n              \"required\": [\"Step\", \"Proposed action\", \"Reason\", \"Feedback summary\", \"New step 1 name\", \"New step 1 checklist\", \"New step 2 name\", \"New step 2 checklist\"],\n              \"not\": { \"required\": [\"Updated name\", \"Updated checklist\", \"Steps to merge\", \"Merged name\", \"Merged checklist\"] }\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"required\": [\"items\"],\n  \"additionalProperties\": false\n}\n"
      },
      "typeVersion": 1.3
    },
    {
      "id": "8efa66a4-c2b0-4cdd-852a-f34afbe42560",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -752,
        -1168
      ],
      "parameters": {
        "width": 704,
        "height": 2064,
        "content": "This n8n template demonstrates how to automatically process feedback on tasks and procedures using an **AI agent**. Employees provide feedback after completing a task, which is then analyzed by the AI to suggest improvements to the underlying procedures. Improvements can be to update how to execute a single tasks or to split or merge tasks within a procedure. The management reviews decides whether to implement those improvements.\n\nThis makes it easy to close the loop between execution, feedback, and continuous process improvement. Use cases are many:\n- Marketing (improve the process of approving advertising content)\n- Finance (optimize the process of expense reimbursement)\n- Operations (refine the process of equipment maintenance)\n\n## Good to know\n- The automation is based on the Baserow template for handling [Standard Operating Procedures](https://baserow.io/templates/standard-operating-procedures). However, it can also be implemented in other databases.\n- Baserow authentication is done through a database token. Check the [documentation](https://baserow.io/user-docs/personal-api-tokens) on how to create such a token.\n- Tasks are inserted using the HTTP request node instead of a dedicated Baserow node. This is to support batch import instead of importing records one by one.\n\n## Requirements\n- Baserow account (cloud or self-hosted)\n- The Baserow template for handling [Standard Operating Procedures](https://baserow.io/templates/standard-operating-procedures) or a similar database with the following tables and fields:\n    - `Procedures` table with general procedure information like to name or description .\n    - `Procedures steps` table with all the steps associated with a procedure.\n    - `Tasks` table that contains the actual tasks based on the procedure steps.\n        - must have a field to capture `Feedback`\n        - must have a boolean field to indicate if the feedback has been processed or not. This to avoid that the same feedback keeps getting used.\n    - `Improvement suggestions` table to store the suggestions that were made by the AI agent.\n\n## How it works\n- **Set table and field ids**\n    - Stores the ids of the involved Baserow database and tables, together with the information to make requests to the Baserow API\n- **Feedback processing agent**\n    \n    The prompt contains a small instruction to check the feedback and suggest improvements to the procedures. The system message is much more extensive to provide as much details and guidance to the agent as possible. It contains the following sections:\n    \n    - Role: giving the agent a clear professional perspective\n    - Goals: allowing the agent to focus on clarity, efficiency and actionable improvements.\n    - Instructions: guiding the agent to a step-by-step flow\n    - Output: showing the agent the expected format and details\n    - Notes: setting guardrails for the agent to make justified and practical suggestions.\n    \n    The agent uses the following nodes:\n    \n    - OpenAI Chat Model (Model): the template uses by default the gpt-4.1 model from OpenAI. But you can replace this with any LLM.\n    - current_procedures (Tool): provides information about all available  procedures to the agent\n    - current_procedure steps (Tool): provides information about every step in the procedures to the agent\n    - tasks_feedback (Tool): provides the feedback of the employees to the agent.\n    - Required output schema (Output parser): forces the agent to use a JSON schema that matches the `Improvement suggestions` table structure for the output. This allows to easily add them to the database in the next step.\n- **Create improvement suggestions**\n    - Calls the API endpoint `/api/database/rows/table/{table_id}/batch/` to insert multiple records at once in the `Improvement suggestions` table. The inserted records is the output generated by the AI agent. Check the [Baserow API documentation](https://api.baserow.io/api/redoc/#tag/Database-table-rows/operation/batch_create_database_table_rows) for further details.\n- **Get non-processed feedback**\n    - Gets all records from the `Tasks` table that contain feedback but that are not marked as processed yet.\n- **Set feedback to processed**\n    - Updates the boolean field for each task to true to indicate that the feedback has been processed\n- **Aggregate records for input**\n    - Aggregates the data from the previous nodes as an array in a property named `items`. This matches perfect with the Baserow API to insert new records in batch.\n- **Update tasks to processed feedback**\n    - Calls the API endpoint `/api/database/rows/table/{table_id}/batch/` to update multiple records at once in the `Tasks` table. The updated records will have their processed field set to true. Check the [Baserow API documentation](https://api.baserow.io/api/redoc/#tag/Database-table-rows/operation/update_database_table_row) for further details.\n\n## How to use\n- The **Manual Trigger** node is provided as an example, but you can replace it with other triggers such as a webhook\n- The included [Baserow SOP template](https://baserow.io/templates/standard-operating-procedures) works perfectly as a base schema to try out this workflow.\n- Set the corresponding ids in the `Configure settings and ids` node.\n- Check if the field names for the filters in the `tasks_feedback` tool node matches with the ones in your `Tasks` table.\n- Check if the field names for the filters in the `Get non-processed feedback` node matches with the ones in your `Tasks` table.\n- Check if the property name in the `Set feedback to processed` node matches with the ones in your `Tasks` table.\n\n## Customising this workflow\n- You can add a new workflow that updates the procedures based on the acceptance or rejection by the management\n- There is a lot of customization possible in the system prompt. For example: change the goal to prioritize security, cost savings or customer experience"
      },
      "typeVersion": 1
    },
    {
      "id": "b55e4475-6825-4dec-ba37-1f562ebcd5bd",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        0,
        -576
      ],
      "parameters": {
        "color": 7,
        "width": 800,
        "height": 224,
        "content": "## Set table and field ids\n* API host: the path to the API of your instance. This is https://api.baserow.io when using the cloud instance.\n* Token: a token you need to generate for the database. Check the [documentation](https://baserow.io/user-docs/personal-api-tokens) on how to create such a token.\n* Database ID: the unique id of the database you want to use\n* Procedures table ID: the unique id of the table containing the general information about the procedures\n* Procedure steps table ID: the unique  ID of the table containing the specific steps or tasks or each procedure.\n* Task table ID: the unique id of the table holding the tasks\n* Improvement suggestions table ID: the unique id of the table where the AI agent will store the suggestions."
      },
      "typeVersion": 1
    },
    {
      "id": "18da592d-b78a-4b6e-b8b3-5fe31df74772",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        464,
        96
      ],
      "parameters": {
        "color": 7,
        "width": 800,
        "height": 144,
        "content": "## Feedback processing agent\nSome additional tips about setting the system prompt:\n* Use an AI tool like Chat-gpt to help you setting up and improving the prompt\n* Check out the video [Building AI Agents: Prompt Engineering for Beginners](https://www.youtube.com/watch?v=77Z07QnLlB8) for good practises"
      },
      "typeVersion": 1
    }
  ],
  "connections": {
    "tasks_feedback": {
      "ai_tool": [
        [
          {
            "node": "Feedback processing agent",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "Feedback processing agent",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "current_procedures": {
      "ai_tool": [
        [
          {
            "node": "Feedback processing agent",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Required output schema": {
      "ai_outputParser": [
        [
          {
            "node": "Feedback processing agent",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    },
    "Set table and field ids": {
      "main": [
        [
          {
            "node": "Feedback processing agent",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "current_procedure_steps": {
      "ai_tool": [
        [
          {
            "node": "Feedback processing agent",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Feedback processing agent": {
      "main": [
        [
          {
            "node": "Create improvement suggestions",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Set feedback to processed": {
      "main": [
        [
          {
            "node": "Aggregate records for input",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get non-processed feedback": {
      "main": [
        [
          {
            "node": "Set feedback to processed",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Aggregate records for input": {
      "main": [
        [
          {
            "node": "Update tasks to processed feedback",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Create improvement suggestions": {
      "main": [
        [
          {
            "node": "Get non-processed feedback",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "When clicking ‘Execute workflow’": {
      "main": [
        [
          {
            "node": "Set table and field ids",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}