{
    "plugins": [
        {
            "id": "ai.wingbot.disambiguation",
            "name": "Disambiguation",
            "description": "Put me into a fallback interaction to first position (if there'll be no options, output will continue below the plugin)",
            "availableSince": 2.22,
            "editable": true,
            "isFactory": false,
            "category": "conversation",
            "items": [
                { "id": "diambiguations", "description": "Disambiguation message - options will be added as quick replies" }
            ],
            "inputs": [
                {
                    "type": "select",
                    "name": "local",
                    "label": "Disambiguate local handlers",
                    "options": [
                        { "value": "false", "label": "no, only globals" },
                        { "value": "true", "label": "yes, only locals" }
                    ]
                },
                {
                    "type": "select",
                    "name": "min",
                    "label": "Minimum number of options",
                    "options": [
                        { "value": "1", "label": "1" },
                        { "value": "2", "label": "2" }
                    ]
                },
                {
                    "type": "select",
                    "name": "max",
                    "label": "Maximum number of options",
                    "options": [
                        { "value": "2", "label": "2" },
                        { "value": "3", "label": "3" },
                        { "value": "4", "label": "4" },
                        { "value": "5", "label": "5" }
                    ]
                }
            ]
        },
        {
            "id": "ai.wingbot.oneTimeNotificationRequest",
            "name": "wingbot: Facebook's one-time notification request",
            "description": "Ask user to subscribe to one time notification",
            "availableSince": 3.01,
            "editable": true,
            "isFactory": false,
            "category": "facebook",
            "items": [],
            "inputs": [
                {
                    "type": "text",
                    "name": "title",
                    "label": "Prompt text visible to user"
                },
                {
                    "type": "postback",
                    "name": "action",
                    "label": "Target interaction"
                },
                {
                    "type": "text",
                    "name": "tag",
                    "label": "Subscribe user to tag (must match with campaign)"
                }
            ]
        },
        {
            "id": "ai.wingbot.passThreadToBot",
            "name": "Handover to another bot",
            "description": "Pass thread to another application (keep action and intent empty to pass an input text)",
            "availableSince": 3.0,
            "editable": false,
            "isFactory": true,
            "category": "uberbot",
            "items": [],
            "inputs": [
                {
                    "type": "text",
                    "name": "targetAppId",
                    "label": "Target Application Id (required)"
                },
                {
                    "type": "text",
                    "name": "targetAction",
                    "label": "Target action"
                },
                {
                    "type": "text",
                    "name": "targetIntent",
                    "label": "Target intent"
                }
            ]
        },
        {
            "id": "ai.wingbot.setState",
            "name": "Set state variable",
            "description": "Set any value to user state (you can use dot notation for nested objects)",
            "availableSince": 2.26,
            "deprecatedSince": 3.0,
            "editable": false,
            "isFactory": false,
            "category": "conversation",
            "items": [],
            "inputs": [
                {
                    "type": "text",
                    "name": "attr",
                    "label": "Variable"
                },
                {
                    "type": "text",
                    "name": "value",
                    "label": "Value"
                }
            ]
        },
        {
            "id": "ai.wingbot.setStateFromInput",
            "name": "Set state variable from text message",
            "description": "Set a user message, or quick reply, to state variable (you can use dot notation for nested objects)",
            "availableSince": 2.26,
            "deprecatedSince": 3.0,
            "editable": false,
            "isFactory": false,
            "category": "conversation",
            "items": [],
            "inputs": [
                {
                    "name": "attr",
                    "type": "text",
                    "label": "Variable"
                }
            ]
        },
        {
            "id": "ai.wingbot.trackingEvent",
            "name": "Report tracking event",
            "description": "You can use handlebars templates here\nFrontend GA categories: generate_lead,view_item,purchase,tutorial_begin,tutorial_complete,sign_up,share\nFrontend GA action: item category\nFrontend GA label: currency (USD)",
            "availableSince": 3.13,
            "editable": false,
            "isFactory": false,
            "category": "conversation",
            "items": [],
            "inputs": [
                {
                    "name": "type",
                    "type": "select",
                    "label": "Event type",
                    "options": [
                        { "value": "report", "label": "report" },
                        { "value": "conversation", "label": "conversation" },
                        { "value": "audit", "label": "audit" },
                        { "value": "log", "label": "log" }
                    ]
                },
                {
                    "name": "category",
                    "type": "text",
                    "label": "Event category"
                },
                {
                    "name": "action",
                    "type": "text",
                    "label": "Event action (item category)"
                },
                {
                    "name": "label",
                    "type": "text",
                    "label": "Event label (currency)"
                },
                {
                    "name": "value",
                    "type": "text",
                    "label": "Event value (number)"
                }
            ]
        },
        {
            "id": "ai.wingbot.waitASecond",
            "name": "Wait a second",
            "description": "Make a short delay between bots messages",
            "availableSince": 3.06,
            "editable": true,
            "isFactory": false,
            "category": "conversation",
            "items": [],
            "inputs": []
        },
        {
            "id": "ai.wingbot.stopResponding",
            "name": "Stop responding",
            "description": "Make a short delay between bots messages",
            "availableSince": 3.06,
            "editable": true,
            "isFactory": false,
            "category": "conversation",
            "items": [],
            "inputs": []
        },
        {
            "id": "ai.wingbot.putABreadcrumb",
            "name": "Put a breadcrumb",
            "description": "Remember this step to be able to get back there later",
            "availableSince": 3.06,
            "editable": true,
            "isFactory": false,
            "category": "breadcrumbs",
            "items": [],
            "inputs": []
        },
        {
            "id": "ai.wingbot.goToLastBreadcrumb",
            "name": "Go to last breadcrumb",
            "description": "If there is a breadcrumb, go to it. If not, go to start.",
            "availableSince": 3.06,
            "editable": true,
            "isFactory": false,
            "category": "breadcrumbs",
            "items": [],
            "inputs": []
        },
        {
            "id": "ai.wingbot.goBack",
            "name": "Go back to previous interaction",
            "description": "If there is a previous interaction, go to it",
            "availableSince": 3.06,
            "editable": true,
            "isFactory": false,
            "category": "breadcrumbs",
            "items": [],
            "inputs": []
        },
        {
            "id": "ai.wingbot.keepInInteraction",
            "name": "Keep user in this interaction (use it as a fallback)",
            "description": "Users response will be processed by this interaction",
            "availableSince": 3.06,
            "editable": true,
            "isFactory": false,
            "category": "conversation",
            "items": [],
            "inputs": []
        },
        {
            "id": "ai.wingbot.keepInInteractionJustOnce",
            "name": "Keep user in this interaction (use it as a fallback just once)",
            "description": "Next response will be processed by this interaction, but the other not",
            "availableSince": 3.06,
            "editable": true,
            "isFactory": false,
            "category": "conversation",
            "items": [],
            "inputs": []
        },
        {
            "id": "ai.wingbot.keepPreviousHandlers",
            "name": "Keep previous NLP handlers and fallback (repeatedly)",
            "description": "Response will be processed same as in previous interaction - users can correct themselves",
            "availableSince": 3.06,
            "editable": true,
            "isFactory": false,
            "category": "conversation",
            "items": [],
            "inputs": []
        },
        {
            "id": "ai.wingbot.keepPreviousHandlersJustOnce",
            "name": "Keep previous NLP handlers and fallback (just once)",
            "description": "Response will be processed same as in previous interaction - users can correct themselves",
            "availableSince": 3.06,
            "editable": true,
            "isFactory": false,
            "category": "conversation",
            "items": [],
            "inputs": []
        },
        {
            "id": "ai.wingbot.conditionIfGoBackPossible",
            "name": "Show when there is a way back (lastInteraction)",
            "description": "Useful for link to 'go back' plugin.",
            "availableSince": 3.06,
            "editable": true,
            "isFactory": false,
            "category": "CONDITION",
            "items": [],
            "inputs": []
        },
        {
            "id": "ai.wingbot.ifImageDetected",
            "name": "If user sends an image",
            "description": "Continue, if request contains an image attachment",
            "availableSince": 3.06,
            "editable": true,
            "isFactory": false,
            "category": "detectors",
            "items": [],
            "inputs": []
        },
        {
            "id": "ai.wingbot.ifStickerDetected",
            "name": "If user sends a sticker",
            "description": "Continue, if request contains a Facebook sticker",
            "availableSince": 3.06,
            "editable": true,
            "isFactory": false,
            "category": "detectors",
            "items": [],
            "inputs": []
        },
        {
            "id": "ai.wingbot.jumpTo",
            "name": "Jump to: set return point",
            "description": "Use in combination with 'Jump back: go to return point'",
            "availableSince": 3.16,
            "editable": true,
            "isFactory": false,
            "category": "conversation",
            "items": [],
            "inputs": [
                {
                    "name": "whereToJump",
                    "type": "postback",
                    "label": "Where to jump"
                },
                {
                    "name": "whereToJumpBack",
                    "type": "postback",
                    "label": "Return point"
                }
            ]
        },
        {
            "id": "ai.wingbot.jumpBack",
            "name": "Jump back: go to return point",
            "description": "Makes the bot able to proceed some shared conversation process and then get user back to 'Return point'. Returns user to previously defined return point from plugin 'Jump to: set return point'",
            "availableSince": 3.16,
            "editable": true,
            "isFactory": false,
            "category": "conversation",
            "items": [],
            "inputs": []
        },
        {
            "id": "ai.wingbot.regexp",
            "name": "RegExp condition",
            "description": "Text to test can be specified using Handlebars, but it's optional.\nRegExp expression is mandatory.\nDiacritics in the input is removed before evaluating.",
            "availableSince": 3.16,
            "editable": false,
            "isFactory": true,
            "category": "uberbot",
            "items": [
                {
                    "id": "matches",
                    "description": "if input matches an expression"
                },
                {
                    "id": "not",
                    "description": "if not"
                }
            ],
            "inputs": [
                {
                    "name": "expression",
                    "type": "text",
                    "label": "RegExp expression"
                }, {
                    "name": "input",
                    "type": "text",
                    "label": "Text to test (keep empty to use user input)"
                }
            ]
        },
        {
            "id": "ai.wingbot.slotsRegister",
            "name": "Slot filling: register",
            "description": "Sets up slot filling conversation for a list of entities",
            "availableSince": 3.39,
            "editable": false,
            "isFactory": true,
            "category": "conversation",
            "inputs": [
                {
                    "type": "text",
                    "name": "intents",
                    "label": "Intent list (comma separated)",
                    "validations": [
                        { "type": "regexp", "value": "^[^\\s]+$", "message": "intent for slot filling should not be empty" }
                    ]
                },
                {
                    "type": "postback",
                    "name": "doneAction",
                    "label": "Continue here, when finished"
                },
                {
                    "type": "array",
                    "name": "steps",
                    "label": "Slot",
                    "keyPropertyName": "entity",
                    "inputs": [
                        {
                            "type": "text",
                            "name": "entity",
                            "label": "Entity (with @)",
                            "validations": [
                                { "type": "regexp", "value": "^@[a-zA-Z0-9-]+$", "message": "the entity for the slot filling should be valid" }
                            ]
                        },
                        {
                            "type": "select",
                            "name": "type",
                            "label": "Type",
                            "options": [
                                { "label": "Required", "value": "req" },
                                { "label": "Multi value", "value": "mul" },
                                { "label": "Additional", "value": "add" }
                            ]
                        },
                        {
                            "type": "postback",
                            "name": "askAction",
                            "label": "Question"
                        },
                        {
                            "type": "postback",
                            "optional": true,
                            "name": "validateAction",
                            "label": "Validation"
                        }
                    ]
                }
            ],
            "items": [
            ]
        },
        {
            "id": "ai.wingbot.slotsContinue",
            "name": "Slot filling: continue",
            "description": "Move the slot filling to the next step",
            "availableSince": 3.39,
            "editable": false,
            "isFactory": true,
            "category": "conversation",
            "inputs": [
                {
                    "name": "skip",
                    "label": "Skip back to entity (reset entities)",
                    "type": "text",
                    "validations": [
                        { "type": "regexp", "value": "^\\s*@[a-zA-Z0-9-]+\\s*(,\\s*@[a-zA-Z0-9-]+\\s*)*$", "message": "the entity for the slot filling should be valid" }
                    ]
                },
                {
                    "name": "fill",
                    "label": "Skip entity (mark as filled)",
                    "type": "text",
                    "validations": [
                        {
                            "type": "regexp",
                            "value": "^(\\s*@[a-zA-Z0-9-]+\\s*,?)*$",
                            "message": "the entity to skip should be valid"
                        }
                    ]
                }
            ],
            "items": [
            ]
        },
        {
            "id": "ai.wingbot.clearMessageSequences",
            "name": "Clear message sequences state",
            "description": "Put it in a first interaction of the process, where would you like to have clear states of messages sequences",
            "availableSince": 3.53,
            "editable": true,
            "isFactory": false,
            "category": "conversation",
            "inputs": [
            ],
            "items": [
            ]
        },
        {
            "id": "ai.wingbot.openai",
            "name": "OpenAI - Chat",
            "description": "Use within fallback to attach ChatGPT to your chatbot\n\nYou can use {{message}} variable in a message annotation.",
            "availableSince": 3.54,
            "editable": false,
            "isFactory": true,
            "category": "conversation",
            "inputs": [
                {
                    "name": "token",
                    "label": "API Key",
                    "type": "text",
                    "validations": [
                        { "type": "regexp", "value": "^.+$", "message": "the token should be filled" }
                    ]
                },
                {
                    "type": "select",
                    "name": "model",
                    "label": "Chat GPT model",
                    "options": [
                        { "value": "gpt-3.5-turbo", "label": "gpt-3.5-turbo" },
                        { "value": "gpt-3.5-turbo-0301", "label": "gpt-3.5-turbo-0301" }
                    ]
                },
                {
                    "type": "textarea",
                    "name": "system",
                    "label": "Initial preset message (system)"
                },
                {
                    "type": "text",
                    "name": "temperature",
                    "label": "Temperature: 0.0 - 2.0 (1.0) - randomness of answers",
                    "validations": [
                        {
                            "type": "regexp",
                            "value": "^[0-9]*([.,][0-9]+)?$",
                            "message": "Temperature should be a valid float number"
                        }
                    ]
                },
                {
                    "type": "text",
                    "name": "presence",
                    "label": "Presence: -2.0 - 2.0 (0.0) - likelihood to talk about new topics",
                    "validations": [
                        {
                            "type": "regexp",
                            "value": "^-?[0-9]*([.,][0-9]+)?$",
                            "message": "Presence should be a valid float number"
                        }
                    ]
                },
                {
                    "type": "text",
                    "name": "maxTokens",
                    "label": "Max Tokens: 0 - 4096 (512) - max. number of returned tokens",
                    "validations": [
                        {
                            "type": "regexp",
                            "value": "^[0-9]*$",
                            "message": "Max tokens should be a valid number"
                        }
                    ]
                },
                {
                    "type": "text",
                    "name": "limit",
                    "label": "History context limit: (10)",
                    "validations": [
                        {
                            "type": "regexp",
                            "value": "^-?[0-9]*$",
                            "message": "History context limit should be a valid number"
                        }
                    ]
                },
                {
                    "type": "text",
                    "name": "persona",
                    "label": "Message persona name"
                },
                {
                    "type": "text",
                    "name": "annotation",
                    "label": "Message annotation"
                },
                {
                    "type": "textarea",
                    "name": "systemAfter",
                    "label": "Current message (system)"
                },
                {
                    "type": "array",
                    "name": "continueConfig",
                    "label": "Continue quick reply",
                    "keyPropertyName": "lang",
                    "columns": [
                        {
                          "name": "title",
                          "label": "Quick Reply"
                        }
                    ],
                    "inputs": [
                        {
                            "type": "text",
                            "name": "lang",
                            "label": "Language (optional)"
                        },
                        {
                            "type": "text",
                            "name": "title",
                            "label": "Quick reply title"
                        }
                    ]
                }
            ],
            "items": [
                {
                    "id": "fallback",
                    "description": "If API call fails"
                }
            ]
        },
        {
            "id": "ai.wingbot.persona",
            "name": "Set persona",
            "description": "Use this persona for following messages.",
            "availableSince": 3.56,
            "editable": false,
            "isFactory": true,
            "category": "conversation",
            "inputs": [
                {
                    "name": "name",
                    "label": "Persona name",
                    "type": "text"
                },
                {
                    "name": "img",
                    "label": "Persona image",
                    "type": "text"
                }
            ],
            "items": [
            ]
        },
        {
            "id": "ai.wingbot.upload",
            "name": "Process upload",
            "description": "Plugin is intended to be used in an interaction plugin",
            "availableSince": 3.60,
            "editable": false,
            "isFactory": true,
            "category": "detectors",
            "inputs": [
                {
                    "name": "type",
                    "label": "Allowed attachment type",
                    "type": "select",
                    "options": [
                        { "value": "any", "label": "any attachment type" },
                        { "value": "image", "label": "image" },
                        { "value": "audio", "label": "audio" },
                        { "value": "video", "label": "video" },
                        { "value": "file", "label": "file" }
                    ]
                },
                {
                    "name": "variable",
                    "label": "Variable name to set attachment URL(s)",
                    "type": "text"
                },
                {
                    "name": "datatype",
                    "label": "Allowed attachment type",
                    "type": "select",
                    "options": [
                        { "value": "string", "label": "string" },
                        { "value": "array", "label": "array of strings" }
                    ]
                },
                {
                    "name": "allowSuffixes",
                    "label": "Allowed attachment suffixes (comma separated)",
                    "type": "text"
                }
            ],
            "items": [
                {
                    "id": "noAttachment",
                    "description": "No attachment uploaded"
                },
                {
                    "id": "badType",
                    "description": "Disallowed attachment type"
                },
                {
                    "id": "success",
                    "description": "Successfully uploaded"
                }
            ]
        }
    ],
    "categories": [
        {
            "id": "conversation",
            "name": "Conversation features"
        },
        {
            "id": "breadcrumbs",
            "name": "Moving in conversation"
        },
        {
            "id": "detectors",
            "name": "React to unusual messages"
        },
        {
            "id": "facebook",
            "name": "Facebook Messenger"
        },
        {
            "id": "uberbot",
            "name": "Masterbot architecture"
        }
    ]
}