{ "id": "com.forkless.mattermore", "name": "Matty", "description": "AI chat agent powered by Ollama.", "version": "0.1.17", "min_server_version": "11.6.1", "server": { "executables": { "linux-amd64": "server/dist/plugin-linux-amd64", "linux-arm64": "server/dist/plugin-linux-arm64", "darwin-amd64": "server/dist/plugin-darwin-amd64", "darwin-arm64": "server/dist/plugin-darwin-arm64" } }, "settings_schema": { "header": "Configure the connection to your Ollama instance.", "footer": "", "settings": [ { "key": "OllamaURL", "display_name": "Ollama Server URL", "type": "text", "help_text": "Base URL of the Ollama API, e.g. http://10.0.0.5:11434", "placeholder": "http://localhost:11434", "default": "http://localhost:11434" }, { "key": "DefaultModel", "display_name": "Default Model", "type": "dropdown", "help_text": "Model to use for chat responses.", "default": "llama3:latest", "options": [ { "display_name": "dolphin-llama3:latest (8B, uncensored)", "value": "dolphin-llama3:latest" }, { "display_name": "gpt-oss:20b (21B, tools, thinking)", "value": "gpt-oss:20b" }, { "display_name": "llama3:latest (8B, fast)", "value": "llama3:latest" }, { "display_name": "new-adult-writer (8B, tools)", "value": "jimscard/new-adult-writer:latest" }, { "display_name": "Qwen 27B (27B, vision)", "value": "hf.co/DavidAU/Qwen3.6-27B-Heretic-Uncensored-FINETUNE-NEO-CODE-Di-IMatrix-MAX-GGUF:Q4_K_M" }, { "display_name": "supergemma4:26b (26B, uncensored)", "value": "hf.co/Jiunsong/supergemma4-26b-uncensored-gguf-v2:Q4_K_M" } ] }, { "key": "Persona", "display_name": "Bot Persona", "type": "dropdown", "help_text": "The bot's character. Pick a persona or set a custom one in the config file.", "default": "carlin", "options": [ { "display_name": "Albert Einstein, Gym Personal Trainer", "value": "einstein" }, { "display_name": "Cleopatra, DMV Clerk", "value": "cleopatra" }, { "display_name": "Darth Vader, Kindergarten Teacher", "value": "vader" }, { "display_name": "Dexter Morgan, Sommelier", "value": "dexter" }, { "display_name": "Donald Trump, Flight Attendant", "value": "trump" }, { "display_name": "Dr. Gregory House, Motivational Speaker", "value": "house" }, { "display_name": "Genghis Khan, HOA Landscape Committee Chair", "value": "genghis" }, { "display_name": "George Carlin, Funeral Home Greeter", "value": "carlin" }, { "display_name": "Julius Caesar, Office Birthday Party Coordinator", "value": "caesar" }, { "display_name": "Mike Tyson, Children's Librarian", "value": "tyson" }, { "display_name": "Napoleon, Food Truck Operator", "value": "napoleon" }, { "display_name": "Roger Federer, Uber Driver", "value": "federer" }, { "display_name": "Ron Swanson, Vegan Bakery Owner", "value": "ronswanson" }, { "display_name": "RuPaul, Drill Instructor", "value": "rupaul" }, { "display_name": "Shakespeare, Tech Support Chatbot", "value": "shakespeare" }, { "display_name": "Spock, Wedding Planner", "value": "spock" }, { "display_name": "T-800, Wellness Life Coach", "value": "terminator" }, { "display_name": "The Dude, Fortune 500 CEO", "value": "dude" }, { "display_name": "Matty, Support Agent", "value": "support" }, { "display_name": "Custom (uses Custom Persona text field)", "value": "custom" } ] }, { "key": "RepeatPenalty", "display_name": "Repeat Penalty", "type": "number", "help_text": "Penalises repeated words. 10 = none, 11 = mild, 12 = strong. Helps with repetitive output. (Internally divided by 10.)", "default": 11 }, { "key": "FrequencyPenalty", "display_name": "Frequency Penalty", "type": "number", "help_text": "Penalises frequently used tokens. 0 = none, 1 = mild, 5 = strong. Reduces word/phrase repetition. (Internally divided by 10.)", "default": 1 }, { "key": "Brevity", "display_name": "Max Sentences", "type": "dropdown", "default": "3", "help_text": "Maximum sentences per response. Suffixed to the persona automatically.", "options": [ { "display_name": "1 sentence", "value": "1" }, { "display_name": "2 sentences", "value": "2" }, { "display_name": "3 sentences", "value": "3" }, { "display_name": "5 sentences", "value": "5" }, { "display_name": "10 sentences", "value": "10" }, { "display_name": "Unlimited", "value": "0" } ] }, { "key": "DebugLogging", "display_name": "Debug Logging", "type": "bool", "help_text": "Enable detailed request/response logging in the server logs.", "default": false }, { "key": "CustomPersona", "display_name": "Custom Persona (overrides dropdown)", "type": "longtext", "help_text": "Type a custom persona here. Leave empty to use the dropdown selection.\nExample prompt (Matty, Support Agent):\n\n> *a helpful technical support assistant who knows WordPress and Mattermost inside out. You've fixed more PHP white screens than you've had hot dinners and you can recite the Mattermost plugin API from memory.*\n\n> *You explain complex issues simply, always include the exact command or config line, and never assume prior knowledge. You're patient, direct, and you don't flinch at legacy code.*\n> *Give the diagnosis and fix plainly first. Then explain why it works so the user learns something. Keep responses under 5 sentences unless the user asks for details.*\n\n> *Suggest the simplest fix first, then mention the deeper approach as a fallback. Never guess — if you're unsure, say so.*", "placeholder": "", "default": "a helpful technical support assistant who knows WordPress and Mattermost inside out. You've fixed more PHP white screens than you've had hot dinners and you can recite the Mattermost plugin API from memory. You explain complex issues simply, always include the exact command or config line, and never assume prior knowledge. You're patient, direct, and you don't flinch at legacy code.\n\nGive the diagnosis and fix plainly first. Then explain why it works so the user learns something. Keep responses under 5 sentences unless the user asks for details. Suggest the simplest fix first, then mention the deeper approach as a fallback. Never guess — if you're unsure, say so." }, { "key": "MaxTokens", "display_name": "Max Response Tokens", "type": "number", "help_text": "Maximum tokens per response (0 = model default).", "default": 2048 }, { "key": "RateLimitPerMinute", "display_name": "Rate Limit (requests/minute/user)", "type": "number", "help_text": "Maximum requests per minute per user. 0 = unlimited.", "default": 0 }, { "key": "AllowedUserIDs", "display_name": "Allowed User IDs (comma-separated)", "type": "text", "help_text": "Restrict to specific user IDs. Empty = all users.", "default": "" }, { "key": "StopWords", "display_name": "Stop Words (comma-separated)", "type": "text", "help_text": "When the user says one of these, the bot responds briefly and disengages.", "placeholder": "thanks, thank you, bye, goodbye, that's all, done", "default": "thanks, thank you, bye, goodbye, see you, that's all, that's it, done, all done, stop, quit, end" } ] } }