PageSourceSearch

https://loothing.xyz/assets/AiGuide-C7PW3Uce.js

js loothing.xyz collected 2026-09-24 15:16:50 UTC 41,041 bytes, 1 lines download raw bytes

1import{j as e,r as s,R as t}from"./react-vendor-BR2bEzcq.js";import{G as a}from"./GuideCallout-CfyKpKJQ.js";import{G as r}from"./GuideDemoFrame-DyxETMxm.js";import{e as i,d as o,M as l,c as n,a as d}from"./MobileDemo-LSYJxnfm.js";import{G as c}from"./GuideLayout-ngyQaTpG.js";import{M as m,a as p,C as g}from"./ModelVariantSelector-pE6Rt9my.js";import{E as x}from"./eye-BcoJl0Iv.js";import{C as h}from"./cpu-BIJO1NLL.js";import{S as u}from"./sparkles-GpUrlamX.js";import{M as b}from"./message-square-4YQyNQjT.js";import{l as y,Z as f,K as v,a7 as j,M as w,S as N,ay as k,Q as M,G as A,U as I,F as C,C as T}from"./index-We6CJOzg.js";import{I as S}from"./image-TK_6Ysaq.js";import{I as D}from"./image-plus-CfD0WPB2.js";import{W as P}from"./wrench-CNcYFiNJ.js";import{B as F}from"./brain--xKcjCKQ.js";import{S as R}from"./Guide-DT93yHxA.js";import{C as L}from"./clock-Dwg2y7-m.js";import{M as G}from"./mic-OaWmVihB.js";import{D as E}from"./dollar-sign-CCzJILA6.js";import{G as O}from"./gamepad-2-CGHIoxXn.js";import{V as z}from"./vote-CdbxuLnj.js";import"./GuideStep-CLlbqK_X.js";import"./share-2-DEVRy_sG.js";import"./EyeIcon-D3kwsJLA.js";import"./axios-DY9rj2-D.js";import"./layout-grid-CZwZJ9I-.js";import"./chart-column-YeWoEYQN.js";import"./box-BtkAKNFA.js";import"./building-2-Bp3go63I.js";import"./upload-BldTnQgg.js";import"./hammer-BdRsdib4.js";import"./calendar-DQKFALGA.js";import"./package-Bs7x5-pZ.js";import"./user-CZciFs5h.js";import"./git-branch-Bps8h-Jg.js";import"./send-DflEmAU2.js";import"./bell-DtEb6Sen.js";import"./copy-DrhQdk7A.js";import"./pen-line-p9DXehOM.js";import"./type-C7yf5ZK-.js";import"./layers-Dc281HID.js";import"./palette-DFcpaOU8.js";import"./circle-plus-Cg3If7CU.js";import"./shield-check-C3H4N-LO.js";import"./trophy-3eG86JXm.js";import"./bot-B6pRbAav.js";import"./circle-check-hSBb0kHo.js";import"./radio-OwJybX8D.js";import"./user-check-BjgZdXYc.js";import"./panels-top-left-DJS3Mtyp.js";import"./funnel-C9A7i15j.js";import"./wifi-BjQTb7a8.js";import"./award-vkDyPs2G.js";import"./flask-conical-BR19wjjz.js";import"./database-D5jEPgJK.js";import"./shield-alert-DWB0OVQQ.js";import"./hash-BdyiKRBq.js";import"./arrow-left-Dk9ydCFh.js";const W=y("gauge",[["path",{d:"m12 14 4-4",key:"9kzdfg"}],["path",{d:"M3.34 19a10 10 0 1 1 17.32 0",key:"19p75a"}]]),q=y("paintbrush",[["path",{d:"m14.622 17.897-10.68-2.913",key:"vj2p1u"}],["path",{d:"M18.376 2.622a1 1 0 1 1 3.002 3.002L17.36 9.643a.5.5 0 0 0 0 .707l.944.944a2.41 2.41 0 0 1 0 3.408l-.944.944a.5.5 0 0 1-.707 0L8.354 7.348a.5.5 0 0 1 0-.707l.944-.944a2.41 2.41 0 0 1 3.408 0l.944.944a.5.5 0 0 0 .707 0z",key:"18tc5c"}],["path",{d:"M9 8c-1.804 2.71-3.97 3.46-6.583 3.948a.507.507 0 0 0-.302.819l7.32 8.883a1 1 0 0 0 1.185.204C12.735 20.405 16 16.792 16 15",key:"ytzfxy"}]]),H={id:"anthropic/claude-sonnet-4.6",capabilities:{reasoning:!0,vision:!0,tools:!0},isFree:!1},U=[{name:"anthropic/claude-sonnet-4.6",label:"Claude Sonnet 4.6",provider:"Anthropic",caps:{reasoning:!0,vision:!0,tools:!0},free:!1,context:2e5,inputPrice:3},{name:"z-ai/glm-5",label:"GLM 5",provider:"Zhipu AI",caps:{reasoning:!0,vision:!0,tools:!0},free:!1,context:128e3,inputPrice:.5},{name:"x-ai/grok-4.1-fast",label:"Grok 4.1 Fast",provider:"xAI",caps:{reasoning:!0,tools:!0},free:!1,context:131072,inputPrice:2},{name:"openai/gpt-5.4-mini",label:"GPT 5.4 Mini",provider:"OpenAI",caps:{reasoning:!0,vision:!0,tools:!0},free:!1,context:128e3,inputPrice:.4},{name:"xiaomi/mimo-v2-omni",label:"MiMo v2 Omni",provider:"Xiaomi",caps:{vision:!0,tools:!0},free:!1,context:128e3,inputPrice:.15}];function K(e){return 0===e?"Free":`$${e<1?e.toFixed(2):e.toFixed(1)}/M`}const V={name:"Loothing",keyFacts:["Heroic raiding guild on Stormrage-US","Raid nights are Tue/Thu 8pm ET","Currently progressing March on Quel'Danas"],alwaysDo:["Be helpful and concise","Use WoW terminology members know","Celebrate achievements enthusiastically"],neverDo:["Share loot council decisions publicly","Reveal officer-only info in public channels","Give financial or legal advice"],responseStyle:"Casual, friendly, uses WoW slang and guild in-jokes",additionalInstructions:"When asked about raid times, always mention the timezone. Prefer embeds for data-heavy responses."}
1,$=[{name:"Combat Analysis",icon:w,keywords:["parse","logs","rio","rankings"]},{name:"Event Management",icon:N,keywords:["signup","schedule","attendance"]},{name:"Loot Tracking",icon:k,keywords:["loot","drops","who got"]},{name:"Roster Audit",icon:M,keywords:["roster","gear check","enchants"]},{name:"Image Creation",icon:S,keywords:["generate","draw","image"]},{name:"Voice",icon:G,keywords:["voice","speak","tts"]},{name:"Memory Recall",icon:F,keywords:["remember","recall","last time"]},{name:"Sports Betting",icon:E,keywords:["bet","odds","parlay"]},{name:"Web Research",icon:A,keywords:["search","google","latest"]},{name:"Discord People",icon:I,keywords:["user info","who is","lookup"]},{name:"Guild Data",icon:j,keywords:["guild","server info"]},{name:"Gaming",icon:O,keywords:["game","steam","xbox"]},{name:"Polls",icon:z,keywords:["poll","vote","survey"]},{name:"Forms",icon:C,keywords:["form","application","submission"]}],B=["photorealistic","anime","oil painting","watercolor","sketch","digital art","3d render","pixel art"],_=[{title:"AI System at a Glance",shortTitle:"Overview",icon:x,description:"The AI Configuration panel controls your Discord bot — an AI assistant powered by OpenRouter with access to 400+ models. The master toggle turns AI on or off for your entire guild. When enabled, the bot processes messages in your monitored Discord channels, uses tools to look up guild data, and generates contextual responses.",tip:"Start by getting an API key from openrouter.ai/keys — the bot needs one before it can respond to anything.",component:()=>{const s=[{icon:v,label:"Model & Connection",desc:"Provider, API key, model, timezone"},{icon:b,label:"Bot Personality",desc:"Name, facts, behavior rules"},{icon:f,label:"Reasoning Mode",desc:"Extended thinking for complex queries"},{icon:S,label:"Image Capabilities",desc:"Generation, editing, rate limits"},{icon:j,label:"Memory System",desc:"Long-term context via embeddings"},{icon:R,label:"Response Tuning",desc:"Temperature, tokens, thresholds"}];return e.jsxs(e.Fragment,{children:[e.jsx(r,{label:"Master Toggle",children:e.jsxs("div",{className:"flex items-center justify-between p-4 rounded-lg border border-gray-700/60 bg-gray-800/30",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("div",{className:"p-2 rounded-lg bg-cyan-500/10",children:e.jsx(h,{className:"w-5 h-5 text-cyan-400"})}),e.jsxs("div",{children:[e.jsx("h3",{className:"text-sm font-bold text-white",children:"AI Configuration"}),e.jsx("p",{className:"text-[11px] text-gray-400",children:"Control the AI assistant in your Discord server"})]})]}),e.jsxs("div",{className:"flex items-center gap-2.5",children:[e.jsx("span",{className:"text-xs font-medium text-green-400",children:"Active"}),e.jsx("div",{className:"w-11 h-6 rounded-full bg-green-600 relative",children:e.jsx("div",{className:"absolute right-0.5 top-0.5 w-5 h-5 rounded-full bg-white shadow-sm"})})]})]})}),e.jsx(r,{label:"Configuration Sections",mobileContent:e.jsx(i,{items:s.map(({label:e,desc:s})=>({label:e,desc:s}))}),children:e.jsx("div",{className:"grid grid-cols-2 sm:grid-cols-3 gap-2",children:s.map(({icon:s,label:t,desc:a})=>e.jsxs("div",{className:"p-3 rounded-lg border border-gray-700/40 bg-gray-800/20 space-y-1",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(s,{className:"w-3.5 h-3.5 text-cyan-400"}),e.jsx("span",{className:"text-xs font-medium text-gray-200 truncate",children:t})]}),e.jsx("p",{className:"text-[10px] text-gray-500 leading-relaxed",children:a})]},t))})}),e.jsxs(a,{type:"info",children:["Requires one of: ",e.jsx("code",{className:"text-cyan-300 break-all",children:"bot.configure"}),", ",e.jsx("code",{className:"text-cyan-300 break-all",children:"settings.manage"}),", ",e.jsx("code",{className:"text-cyan-300 break-all",children:"admin.full_access"}),", or ",e.jsx("code",{className:"text-cyan-300 break-all",children:"admin.system_config"})," permission. When AI is disabled, all sections below the toggle are greyed out but settings can still be saved for later."]})]})}}
1,{title:"Choosing Your AI Model",shortTitle:"Models",icon:h,description:"OpenRouter gives you access to 400+ AI models from Anthropic, OpenAI, Zhipu (GLM), xAI, Xiaomi, and more. The searchable Model Selector lets you compare context windows, output limits, and pricing. Routing Variants modify how OpenRouter handles requests — :free uses free providers, :nitro gets premium speed, :online enables web search, and :exacto optimizes tool-calling accuracy.",tip:"Tested recommendations: Claude Sonnet 4.6 and GLM 5 for best tool accuracy, GPT 5.4 Mini and Grok 4.1 Fast for speed, MiMo v2 Omni for budget-friendly vision. Use the :free variant to experiment at zero cost.",component:()=>{const[t,i]=s.useState(null);return e.jsxs(e.Fragment,{children:[e.jsx(r,{label:"Model Details",mobileContent:e.jsx(o,{stats:[{label:"Model",value:"Claude Sonnet 4.6"},{label:"Context",value:"200K"},{label:"Max Output",value:"64K"},{label:"Input Price",value:"$3.00/M",color:"text-yellow-400"},{label:"Output Price",value:"$15.00/M",color:"text-orange-400"},{label:"Provider",value:"Anthropic"}]}),children:e.jsxs("div",{className:"space-y-3",children:[e.jsxs("div",{className:"flex items-center justify-between gap-2",children:[e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsx("p",{className:"text-sm font-semibold text-white truncate",children:"anthropic/claude-sonnet-4.6"}),e.jsx("p",{className:"text-[11px] text-gray-500",children:"Anthropic"})]}),e.jsx(m,{capabilities:{reasoning:!0,vision:!0,tools:!0},size:"sm",showLabels:!1})]}),e.jsx("div",{className:"grid grid-cols-2 sm:grid-cols-4 gap-2",children:[{label:"Context",value:"200K",color:"text-gray-200"},{label:"Max Output",value:"64K",color:"text-gray-200"},{label:"Input Price",value:"$3.00/M",color:"text-yellow-400"},{label:"Output Price",value:"$15.00/M",color:"text-orange-400"}].map(({label:s,value:t,color:a})=>e.jsxs("div",{className:"text-center p-2 rounded-lg bg-gray-800/50 border border-gray-700/30",children:[e.jsx("p",{className:"text-[10px] text-gray-500 uppercase tracking-wider leading-tight",children:s}),e.jsx("p",{className:`text-xs sm:text-sm font-semibold mt-0.5 ${a}`,children:t})]},s))})]})}),e.jsx(r,{label:"Routing Variants",interactive:!0,children:e.jsx(p,{value:t,onChange:i,disabled:!1,selectedModelData:H})}),e.jsxs(a,{type:"info",children:["After picking a model, a ",e.jsx("strong",{children:"Provider"})," dropdown lets you choose which OpenRouter provider serves it — the same model can be offered at very different context windows, max output, and prices by different providers (e.g. one provider serves a 1M context, another only 256K). Each option shows that provider's context, max output, and price. Leave it on ",e.jsx("strong",{children:"Automatic"})," to let OpenRouter route, or pin a provider to lock in its window and pricing; the bot then sizes conversation history against that provider's real context. The model selector also supports a ",e.jsx("strong",{children:"Browse All"})," button that opens a full searchable modal with filtering by provider and capability. A separate ",e.jsx("strong",{children:"timezone dropdown"}),' (16 presets across US, Europe, Asia-Pacific) sets the guild-wide timezone — it c
1ontrols how the bot interprets naked times like "8pm Friday", the zone used for scheduled wakes, event start times, reminders, heartbeat quiet hours, and roster audits. When the agent posts a time in chat it now uses Discord ',e.jsx("code",{children:"<t:>"})," timestamp tags so each viewer sees it in their own local zone automatically."]})]})}},{title:"Model Capability Badges",shortTitle:"Capabilities",icon:u,description:"Every model advertises its capabilities via colored badges. Reasoning models think before responding for complex questions. Vision models accept image inputs. Tool-calling models can use Loothing's 14 tool groups to query guild data, manage events, generate images, and more. Not all models support all features.",tip:"Tool calling is the most important capability for Loothing. Without it, the bot can only chat — it cannot look up loot, roster data, events, or use any guild features.",component:()=>e.jsx(r,{label:"Tested & Recommended Models",mobileContent:e.jsx(l,{items:U.map(({label:e,provider:s,context:t,inputPrice:a})=>({title:e,subtitle:s,meta:`${Math.round(t/1e3)}K ctx · ${K(a)}`}))}),children:e.jsx("div",{className:"space-y-2",children:U.map(({name:s,label:t,provider:a,caps:r,free:i,context:o,inputPrice:l})=>{return e.jsxs("div",{className:"flex items-start justify-between gap-2 p-2.5 rounded-lg border border-gray-700/30 bg-gray-800/20",children:[e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsx("p",{className:"text-sm font-medium text-gray-200 truncate",children:t}),e.jsxs("div",{className:"flex flex-wrap items-center gap-1.5 mt-0.5",children:[e.jsx("span",{className:"text-[10px] text-gray-500",children:a}),e.jsx("span",{className:"text-[10px] text-gray-600",children:"|"}),e.jsx(g,{contextLength:o,size:"xs"}),e.jsx("span",{className:"text-[10px] px-1.5 py-0.5 rounded-sm "+(n=l,0===n?"bg-emerald-900/30 text-emerald-400":n<.5?"bg-green-900/30 text-green-400":n<3?"bg-yellow-900/30 text-yellow-400":n<10?"bg-orange-900/30 text-orange-400":"bg-red-900/30 text-red-400"),children:K(l)})]})]}),e.jsx(m,{capabilities:r,size:"sm",showLabels:!0,isFree:i,className:"shrink-0"})]},s);var n})})})},{title:"Bot Personality Editor",shortTitle:"Personality",icon:b,description:"Shape how your AI assistant communicates by setting a custom name, key facts it should know (guild name, raid schedule), behaviors it should always or never do, a response style, and freeform instructions. The personality is injected into every conversation as part of the system prompt.",tip:"Keep the 'Never Do' list specific — 'Never share API keys or officer-only info in public channels' is more effective than vague rules like 'be careful'.",component:()=>{const s=[{label:"Name",value:V.name,span:!1},{label:"Response Style",value:V.responseStyle,span:!1},{label:"Key Facts",value:V.keyFacts,span:!0},{label:"Always Do",value:V.alwaysDo,span:!1},{label:"Never Do",value:V.neverDo,span:!1},{label:"Additional Instructions",value:V.additionalInstructions,span:!0}];return e.jsx(r,{label:"Personality Configuration",mobileContent:e.jsx(n,{pairs:[{label:"Name",value:V.name},{label:"Response Style",value:V.responseStyle},{label:"Key Facts",value:V.keyFacts.join(" · ")},{label:"Always Do",value:V.alwaysDo.join(" · ")},{label:"Never Do",value:V.neverDo.join(" · ")},{label:"Instructions",value:V.additionalInstructions}]}),children:e.jsx("div",{className:"grid grid-cols-1 sm:grid-cols-2 gap-2",children:s.map(({label:s,value:t,span:a})=>e.jsxs("div",{className:"p-3 rounded-lg border border-gray-700/30 bg-gray-800/20 "+(a?"sm:col-span-2":""),children:[e.jsx("span",{className:"text-[11px] font-semibold text-gray-400 uppercase tracking-wider block mb-1.5",children:s}),Array.isArray(t)?e.jsx("ul",{className:"space-y-0.5",children:t.map((s,t)=>e.jsxs("li",{className:"text-xs text-gray-300 leading-relaxed flex items-start gap-1.5",children:[e.jsx("span",{className:"text-gray-600 mt-0.5 shrink-0",children:"•"}),e.jsx("span",{children:s})]},t))}):e.jsx("p",{className:"text-xs text-gray-300 leading-relaxed",children:t})]},s))})})}},{title:"Reasoning & Extended Thinking",shortTitle:"Reasoning",icon:f,description:"Some models support extended reasoning — they think internally before responding, producing more accurate answers for complex questions. Loothing exposes one effort-based control with Low, Medium, High, and Max options. Each option maps to a derived reasoning token budget from the configured max token budget, so admins do not need to manage raw reasoning token counts. This section only appears when a reasoning-capable model is selected. DeepSeek reasoning models keep their provider-native reasoning continuity across multi-step tool turns.",tip:"Start with Medium for most use cases. Use High or Max only for complex analysis like comparing raid performances because they reserve more tokens for internal reasoning.",component:()=>e.jsxs(e.Fragment,{children:[e.jsx(r,{label:"Reasoning Effort",mobileContent:e.jsx(i,{items:[{label:"Low",desc:"About 20% of the available reasoning budget"},{label:"Medium",desc:"About 50% of the available reasoning budget"},{label:"High",desc:"About 80% of the available reasoning budget"},{label:"Max",desc:"All available reasoning budget, leaving room for the response"}],cols:1}),children:e.jsx("div",{className:"grid grid-cols-1 gap-3",children:e.jsxs("div",{className:"p-3 rounded-lg border border-cyan-700/30 bg-cyan-900/10",children:[e.jsx("h4",{className:"text-sm font-semibold text-cyan-300 mb-2",children:"Effort-Based Budget"}),e.jsx("p",{className:"text-[10px] text-gray-400 mb-3",children:"Loothing converts each effort level into provider reasoning tokens from your max token budget."}),e.jsx("div",{className:"space-y-1.5",children:[{level:"Low",pct:"~20%",active:!1},{level:"Medium",pct:"~50%",active:!0},{level:"High",pct:"~80%",active:!1},{level:"Max",pct:"Available max",active:!1}].map(({level:s,pct:t,active:a})=>e.jsxs("div",{className:"flex items-center gap-2 px-2.5 py-1.5 rounded-md text-xs "+(a?"bg-cyan-500/15 border border-cyan-500/40 text-cyan-300":"border border-gray-700/30 text-gray-400"),children:[e.jsx("div",{className:"w-2 h-2 rounded-full "+(a?"bg-cyan-400":"bg-gray-600")}),e.jsx("span",{className:"font-medium",children:s}),e.jsxs("span",{className:"text-gray-500 ml-auto",children:[t," budget"]})]},s))})]})})}),e.jsx(a,{type:"info",children:"This section only appears when a reasoning-capable model is selected. Non-reasoning models skip it entirely. Low, Medium, High, and Max are the only reasoning controls;
1 Loothing derives the exact token budget at request time and preserves DeepSeek's provider-native reasoning continuity across multi-step tool calls."})]})},{title:"Image Generation & Editing",shortTitle:"Images",icon:S,description:"The Image Capabilities section lets you enable AI image generation and editing. Users can ask the bot to create images from text prompts in Discord. A separate model selector filters to image-capable models only. Image editing lets users refine generated images with follow-up prompts and apply artistic styles. Role-based rate limiting controls how many images each Discord role can generate per time interval.",tip:"Use a separate API key for image generation if you want different billing or rate limits from your main AI key. The default image model (Gemini Flash Preview) is free.",component:()=>e.jsxs(e.Fragment,{children:[e.jsx(r,{label:"Image Generation & Editing",children:e.jsxs("div",{className:"space-y-3",children:[e.jsxs("div",{className:"p-3 rounded-lg border border-pink-700/30 bg-pink-900/10",children:[e.jsxs("div",{className:"flex items-center justify-between mb-2",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(D,{className:"w-4 h-4 text-pink-400"}),e.jsx("span",{className:"text-sm font-semibold text-pink-300",children:"Image Generation"})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"text-[10px] text-green-400",children:"Enabled"}),e.jsx("div",{className:"w-8 h-[18px] rounded-full bg-green-600 relative",children:e.jsx("div",{className:"absolute right-0.5 top-0.5 w-3.5 h-3.5 rounded-full bg-white shadow-sm"})})]})]}),e.jsx("p",{className:"text-[10px] text-gray-400 mb-2",children:"Users can ask the bot to create images from text descriptions in Discord."}),e.jsxs("div",{className:"flex items-center gap-2 min-w-0",children:[e.jsx("span",{className:"text-[10px] text-gray-500 shrink-0",children:"Model:"}),e.jsx("span",{className:"text-[10px] text-gray-300 bg-gray-800/60 px-2 py-0.5 rounded-sm truncate",children:"google/gemini-2.5-flash-image-preview:free"})]})]}),e.jsxs("div",{className:"p-3 rounded-lg border border-purple-700/30 bg-purple-900/10",children:[e.jsxs("div",{className:"flex items-center gap-2 mb-2",children:[e.jsx(q,{className:"w-4 h-4 text-purple-400"}),e.jsx("span",{className:"text-sm font-semibold text-purple-300",children:"Image Editing"})]}),e.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-2 gap-1.5 text-[10px]",children:[e.jsxs("div",{className:"flex justify-between gap-2",children:[e.jsx("span",{className:"text-gray-500",children:"Max edits per image"}),e.jsx("span",{className:"text-gray-300 shrink-0",children:"10"})]}),e.jsxs("div",{className:"flex justify-between gap-2",children:[e.jsx("span",{className:"text-gray-500",children:"Style transfer"}),e.jsx("span",{className:"text-green-400 shrink-0",children:"Allowed"})]}),e.jsxs("div",{className:"flex justify-between gap-2",children:[e.jsx("span",{className:"text-gray-500",children:"Shared rate limits"}),e.jsx("span",{className:"text-green-400 shrink-0",children:"Yes"})]}),e.jsxs("div",{className:"flex justify-between gap-2",children:[e.jsx("span",{className:"text-gray-500",children:"Separate API key"}),e.jsx("span",{className:"text-gray-400 shrink-0",children:"Optional"})]})]})]}),e.jsxs("div",{className:"p-3 rounded-lg border border-gray-700/30 bg-gray-800/20",children:[e.jsx("span",{className:"text-[10px] text-gray-500 uppercase tracking-wider block mb-2",children:"Allowed Styles"}),e.jsx("div",{className:"flex flex-wrap gap-1.5",children:B.map(s=>e.jsx("span",{className:"text-[10px] px-2 py-1 rounded-md bg-gray-700/40 text-gray-300 border border-gray-600/30 capitalize",children:s},s))})]})]})}),e.jsx(r,{label:"Rate Limiting",mobileContent:e.jsx(o,{stats:[{label:"Global Limit",value:"100 / day"},{label:"Per-Role Limit",value:"Configurable"},{label:"Default Limit",value:"10 / day"}]}),children:e.jsx("div",{className:"grid grid-cols-1 sm:grid-cols-3 gap-2",children:[{label:"Global Limit",value:"100 / day",desc:"Guild-wide cap"},{label:"Per-Role Limit",value:"Configurable",desc:"Different quotas per Discord role"},{label:"Default Limit",value:"10 / day",desc:"Fallback for unassigned roles"}].map(({label:s,value:t,desc:a})=>e.jsxs("div",{className:"text-center p-2.5 rounded-lg bg-gray-800/40 border border-gray-700/30",children:[e.jsx("p",{className:"text-[10px] text-gray-500 uppercase tracking-wider leading-tight",children:s}),e.jsx("p",{className:"text-xs sm:text-sm font-semibold text-gray-200 mt-0.5",children:t}),e.jsx("p",{className:"text-[9px] text-gray-500 mt-0.5",children:a})]},s))})}),e.jsx(a,{type:"warning",children:"Rate limits support hourly, daily, weekly, and monthly intervals. When rate limits are disabled, image generation is unlimited for all users. The per-role configuration uses your Discord server roles."})]})},{title:"Vision and Image Routing",shortTitle:"Vision",icon:D,description:"Image Handling controls what happens when Discord users upload screenshots and the main model lacks vision. Fallback routes the whole image turn to the selected vision model. Description mode strips raw image URLs and relies only on cached descriptions. Hybrid, the default, keeps normal turns on the main model with descriptions and lets the agent call analyze_image_with_vision when it needs higher visual fidelity.",tip:"Pick Hybrid unless you want every image turn handled by the vision model. Use the advanced description-model override only when you want cheaper or faster descriptions than your fallback vision model.",component:()=>e.jsxs(e.Fragment,{children:[e.jsx(r,{label:"Image Handling Modes",mobileContent:e.jsx(l,{items:[{title:"Fallback",subtitle:"Vision model handles image turns"},{title:"Description",subtitle:"Main model reads cached descriptions"},{title:"Hybrid",subtitle:"Descriptions first, vision escalation when needed"}]}),children:e.jsx("div",{className:"grid grid-cols-1 md:grid-cols-3 gap-2",children:[{title:"Fallback",tone:"border-blue-700/40 bg-blue-900/10 text-blue-300",de
1sc:"Image turns bypass a text-only main model and run on the configured vision model."},{title:"Description",tone:"border-emerald-700/40 bg-emerald-900/10 text-emerald-300",desc:"Image URLs are stripped and the main model receives stored visual descriptions only."},{title:"Hybrid",tone:"border-amber-700/40 bg-amber-900/10 text-amber-300",desc:"Default: descriptions keep cost low, and the bot can escalate exact visual questions to vision."}].map(({title:s,tone:t,desc:a})=>e.jsxs("div",{className:`p-3 rounded-lg border ${t}`,children:[e.jsx("p",{className:"text-sm font-semibold",children:s}),e.jsx("p",{className:"text-[10px] text-gray-400 mt-1 leading-relaxed",children:a})]},s))})}),e.jsx(r,{label:"Model Routing",children:e.jsxs("div",{className:"space-y-2",children:[e.jsxs("div",{className:"flex items-center gap-2 p-2.5 rounded-lg border border-gray-700/30 bg-gray-800/30",children:[e.jsx(S,{className:"w-4 h-4 text-cyan-400 shrink-0"}),e.jsxs("div",{className:"min-w-0",children:[e.jsx("p",{className:"text-xs font-semibold text-gray-200",children:"Vision model"}),e.jsx("p",{className:"text-[10px] text-gray-500",children:"Used for fallback, hybrid escalation, and descriptions by default."})]}),e.jsx("span",{className:"ml-auto text-[10px] text-gray-300 bg-gray-900/60 border border-gray-700/40 px-2 py-1 rounded-md truncate max-w-[12rem]",children:"xiaomi/mimo-v2-omni"})]}),e.jsxs("div",{className:"flex items-center gap-2 p-2.5 rounded-lg border border-gray-700/30 bg-gray-800/30",children:[e.jsx(R,{className:"w-4 h-4 text-purple-400 shrink-0"}),e.jsxs("div",{className:"min-w-0",children:[e.jsx("p",{className:"text-xs font-semibold text-gray-200",children:"Advanced override"}),e.jsx("p",{className:"text-[10px] text-gray-500",children:"Optional separate description model and historical full-fidelity policy."})]})]})]})}),e.jsx(a,{type:"tip",children:"Hybrid is the recommended default for most guilds. Descriptions keep normal conversation cheap, and the bot can still call view_image or analyze_image_with_vision on demand — both transparently route through your configured vision model when the main model lacks vision. If the configured Vision Model itself can't process images (e.g. you accidentally pick a text-only model), the bot retries once on a platform default and surfaces a clear error asking you to update the setting."})]})},{title:"AI Tool System",shortTitle:"Tools",icon:P,description:"The bot has access to 14 tool groups that let it interact with Loothing's systems. When someone asks 'who got loot last raid?', the bot uses loot-tracking tools to look up the answer. Smart Tool Filtering and Conversation Intent Detection are two performance features that reduce token costs and false positive responses, with Smart Tool Filtering using a safety fallback when the request is ambiguous.",tip:"Enable Smart Tool Filtering if you want lower token usage without aggressively restricting the bot. It narrows tools when confidence is high and falls back to the full permitted set when it is not.",component:()=>e.jsxs(e.Fragment,{children:[e.jsx(r,{label:"Tool Groups (14 Active)",mobileContent:e.jsx(d,{items:$.map(({name:e,keywords:s})=>({label:e,desc:s.join(", ")}))}),children:e.jsx("div",{className:"grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-4 gap-1.5 max-h-72 overflow-y-auto pr-1",children:$.map(({name:s,icon:t,keywords:a})=>e.jsxs("div",{className:"p-2.5 rounded-lg border border-gray-700/30 bg-gray-800/20 space-y-1.5",children:[e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx(t,{className:"w-3.5 h-3.5 text-cyan-400 shrink-0"}),e.jsx("span",{className:"text-[11px] font-medium text-gray-200 truncate",children:s})]}),e.jsx("div",{className:"flex flex-wrap gap-1",children:a.map(s=>e.jsx("span",{className:"text-[9px] px-1.5 py-0.5 rounded-sm bg-gray-700/50 text-gray-400",children:s},s))})]},s))})}),e.jsx(r,{label:"Smart Features",children:e.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-2 gap-2",children:[e.jsxs("div",{className:"p-3 rounded-lg border border-cyan-700/30 bg-cyan-900/10",children:[e.jsxs("div",{className:"flex items-center gap-2 mb-1.5",children:[e.jsx(W,{className:"w-3.5 h-3.5 text-cyan-400"}),e.jsx("span",{className:"text-xs font-semibold text-cyan-300",children:"Smart Tool Filtering"})]}),e.jsx("p",{className:"text-[10px] text-gray-400 leading-relaxed",children:"Conservatively narrows the tool list based on the latest user message. If no safe group match is found, Loothing falls back to the full permitted tool set instead of risking missing tools."})]}),e.jsxs("div",{className:"p-3 rounded-lg border border-yellow-700/30 bg-yellow-900/10",children:[e.jsxs("div",{className:"flex items-center gap-2 mb-1.5",children:[e.jsx(x,{className:"w-3.5 h-3.5 text-yellow-400"}),e.jsx("span",{className:"text-xs font-semibold text-yellow-300",children:"Intent Detection"})]}),e.jsx("p",{className:"text-[10px] text-gray-400 leading-relaxed",children:"Configurable threshold. Uses a lightweight model to determine if the bot should respond."})]})]})}),e.jsx(a,{type:"info",children:"Each tool group has permission requirements. For example, Loot Tracking tools require the Loot View permission, while Image Creation requires Bot Admin access. Permissions can be customized per guild via the MCP Tool Configuration panel."})]})},{title:"Temporal Memory System",shortTitle:"Memory",icon:F,description:"The temporal memory system gives the bot long-term context without treating old facts as immortal truth. It stores subject-explicit facts and notable events, retrieves active records, and scores them at read time using semantic relevance, confidence, freshness, importance, and pin state. A completed turn is reconciled in one structured pass: repeated facts are confirmed, changed facts supersede old versions, and false facts are invalidated. Admins can inspect and manage every version in the Memory browser. Separately, the bot persists each turn's tool calls, tool results, and reasoning to an encrypted artifact store keyed by Discord message ID. Artifacts use AES-256-GCM, are retained for 30 days, and surface when token budget allows.",tip:"Keep the default retrieval controls unless recall is too broad or too narrow. Enable retention so stale events and volatile facts age out; pin only records that should require explicit admin review before automatic change.",component:()=>{const s=[{label:"Message",color:"bg-blue-500/20 border-blue-500/40 text-blue-300"},{label:"Intent Check",color:"bg-yellow-500/20 border-yellow-500/40 text-yellow-300"},{label:"Active Memory Search",color:"bg-cyan-500/20 border-cyan-500/40 text-cyan-300"},{label:"AI Response",color:"bg-green-500/20 border-green-500/40 text-green-300"},{label:"Reconcile Completed Turn",color:"bg-purple-500/20 border-purple-500/40 text-purple-300"},{label:"Vector Store",color:"bg-pink-500/20 border-pink-500/40 text-pink-300"}];return e.jsxs(e.Fragment,{children:[e.jsx(r,{label:"Memory Pipeline",children:e.jsx("div",{className:"flex items-center gap-1 overflow-x-auto pb-1",children:s.map(({label:a,color:r},i)=>e.jsxs(t.Fragment,{children:[e.jsx("div",{className:`shrink-0 px-2.5 py-1.5 rounded-lg border text-[10px] font-medium ${r}`,children:a}),i<s.length-1&&e.jsx(T,{className:"w-3 h-3 text-gray-600 shrink-0"})]},a))})}),e.jsx(r,{label:"Configuration",mobileContent:e.jsx(o,{stats:[{label:"Search Limit",value:"5"}
1,{label:"Min Relevance",value:"0.6"},{label:"Write Importance",value:"3"},{label:"Retention",value:"Enabled"}]}),children:e.jsx("div",{className:"grid grid-cols-2 sm:grid-cols-3 gap-2",children:[{label:"Search Limit",value:"5",desc:"Memories retrieved per message"},{label:"Min Relevance",value:"0.6",desc:"Lowest accepted retrieval score (0-1)"},{label:"Write Importance",value:"3",desc:"Minimum importance to store (1-10)"},{label:"Retention",value:"Enabled",desc:"Expire stale events and volatile facts"}].map(({label:s,value:t,desc:a})=>e.jsxs("div",{className:"p-2 rounded-lg bg-gray-800/40 border border-gray-700/30",children:[e.jsx("p",{className:"text-[10px] text-gray-500 uppercase tracking-wider leading-tight",children:s}),e.jsx("p",{className:"text-xs sm:text-sm font-semibold text-gray-200 mt-0.5",children:t}),e.jsx("p",{className:"text-[9px] text-gray-500 mt-0.5 leading-tight",children:a})]},s))})}),e.jsx(a,{type:"info",children:"Memory v2 stores subject-explicit facts and notable events. Active records are ranked by meaning, confidence, freshness, importance, and pin state; replacements preserve their prior versions as history."})]})}},{title:"Response Tuning",shortTitle:"Tuning",icon:R,description:"Advanced parameters that most users can leave at defaults. Temperature controls creativity (lower = focused, higher = varied). Top P controls word diversity. Frequency and Presence Penalties reduce repetition. The Context Utilization slider controls how much of the model's context window is allocated to conversation history — Loothing fetches the model's real context size from OpenRouter and walks history newest-to-oldest summing actual per-message token cost until the share you set is reached. The remaining context is reserved for the system prompt, the model's response, and a 10% safety buffer. Max Tool Iterations Per Turn caps how many tool-call rounds the agent may run within a single turn before the loop forcibly ends — default 30, range 5–100. Other limits control max output length and participation confidence threshold.",tip:"For a guild bot, Temperature 0.5-0.7 works best — creative enough to be engaging but predictable enough to give accurate WoW data. Default Context Utilization is 50%; raise to 70-80% on long-context models (DeepSeek 1M, Claude 200K, GPT 128K) for richer history, lower on tight-budget models or when you want faster, cheaper turns. Default Max Tool Iterations is 30; raise for guilds running heavy investigative workflows (e.g., full roster audits chaining many tool calls), lower if you want to cap API spend per turn.",component:()=>{const s=[{label:"Max Output",value:"16K tokens"},{label:"Context Window",value:"10 messages"},{label:"Participation",value:"0.7 confidence"},{label:"Tool Iterations",value:"30 per turn"}];return e.jsxs(e.Fragment,{children:[e.jsx(r,{label:"Creativity Controls",children:e.jsx("div",{className:"space-y-3",children:[{label:"Temperature",min:"0 Focused",max:"2 Creative",value:.7,pct:35},{label:"Top P",min:"0 Narrow",max:"1 Diverse",value:.95,pct:95},{label:"Frequency Penalty",min:"-2 Repeat",max:"2 Vary",value:0,pct:50},{label:"Presence Penalty",min:"-2 Stay",max:"2 Explore",value:0,pct:50}].map(({label:s,min:t,max:a,value:r,pct:i})=>e.jsxs("div",{children:[e.jsx("div",{className:"flex items-center justify-between mb-1",children:e.jsxs("span",{className:"text-xs font-medium text-gray-300",children:[s,": ",r]})}),e.jsxs("div",{className:"relative w-full h-1.5 bg-gray-700 rounded-full",children:[e.jsx("div",{className:"h-full bg-linear-to-r from-cyan-600 to-cyan-400 rounded-full",style:{width:`${i}%`}}),e.jsx("div",{className:"absolute top-1/2 -translate-y-1/2 w-3 h-3 rounded-full bg-white shadow-sm border-2 border-cyan-400",style:{left:`calc(${i}% - 6px)`}})]}),e.jsxs("div",{className:"flex justify-between text-[9px] text-gray-600 mt-0.5",children:[e.jsx("span",{children:t}),e.jsx("span",{children:a})]})]},s))})}),e.jsx(r,{label:"Response Limits",mobileContent:e.jsx(o,{stats:s.map(({label:e,value:s})=>({label:e,value:s}))}),children:e.jsx("div",{className:"grid grid-cols-2 sm:grid-cols-4 gap-2",children:s.map(({label:s,value:t})=>e.jsxs("div",{className:"text-center p-2.5 rounded-lg bg-gray-800/40 border border-gray-700/30",children:[e.jsx("p",{className:"text-[10px] text-gray-500 uppercase tracking-wider leading-tight",children:s}),e.jsx("p",{className:"text-xs sm:text-sm font-semibold text-gray-200 mt-0.5 wrap-break-word",children:t})]},s))})}
1),e.jsxs(a,{type:"info",children:["Use the ",e.jsx("strong",{children:"Save Configuration"})," button to save all settings, and the ",e.jsx("strong",{children:"Test"})," button to verify the model connection is working. Settings can be saved even when AI is disabled."]})]})}},{title:"Heartbeat & Scheduled Wake",shortTitle:"Heartbeat",icon:L,description:"The Heartbeat system lets the bot perform periodic autonomous check-ins on your monitored channels. It reviews recent activity, follows up on unanswered questions, and executes tasks defined in your objectives. Scheduled Wake is a companion tool — during conversations, the bot can schedule itself to wake up at a future time to follow up or complete deferred tasks.",tip:'Start with a 1-hour interval and "Follow up on conversations" enabled. Add specific objectives as you learn what your guild needs — for example, "Check if raid signups are full for upcoming events".',component:()=>e.jsxs(e.Fragment,{children:[e.jsx(r,{label:"Heartbeat Configuration",children:e.jsx("div",{className:"space-y-2",children:[{label:"Enable Heartbeat",value:"On",type:"toggle"},{label:"Check-in Interval",value:"Every hour"},{label:"Channels",value:"All monitored"},{label:"Conversation Follow-ups",value:"On",type:"toggle"},{label:"Activity Summary",value:"Off",type:"toggle"},{label:"Task Execution",value:"Off",type:"toggle"}].map(({label:s,value:t,type:a})=>e.jsxs("div",{className:"flex items-center justify-between gap-2 py-1.5 px-2 rounded-sm bg-gray-800/30",children:[e.jsx("span",{className:"text-xs text-gray-300 min-w-0",children:s}),"toggle"===a?e.jsx("div",{className:`shrink-0 w-7 h-4 rounded-full ${"On"===t?"bg-green-600":"bg-gray-600"} relative`,children:e.jsx("div",{className:"absolute top-0.5 w-3 h-3 rounded-full bg-white shadow-sm transition-transform "+("On"===t?"left-3.5":"left-0.5")})}):e.jsx("span",{className:"shrink-0 text-xs text-cyan-400 font-medium",children:t})]},s))})}),e.jsx(r,{label:"Heartbeat Objectives",children:e.jsxs("div",{className:"space-y-1.5",children:[["Check if raid signups are full for upcoming events","Follow up on unanswered questions in officer chat"].map((s,t)=>e.jsxs("div",{className:"flex items-start gap-2 px-2 py-1.5 rounded-sm bg-gray-800/30",children:[e.jsxs("span",{className:"text-cyan-400 text-xs mt-px",children:[t+1,"."]}),e.jsx("span",{className:"text-xs text-gray-300",children:s})]},t)),e.jsx("p",{className:"text-[10px] text-gray-500 px-2 mt-1",children:"Up to 10 objectives. The bot checks these during each heartbeat."})]})}),e.jsx(r,{label:"Quiet Hours & Anti-Spam",mobileContent:e.jsx(o,{stats:[{label:"Quiet Hours",value:"2AM – 8AM"},{label:"Min Messages",value:"0 (always fire)"},{label:"Bot Cooldown",value:"0 (no cooldown)"},{label:"Sched. Wakes",value:"20 max / guild"}]}),children:e.jsxs("div",{className:"grid grid-cols-2 gap-2",children:[e.jsxs("div",{className:"text-center p-2 rounded-lg bg-gray-800/40 border border-gray-700/30",children:[e.jsx("p",{className:"text-[10px] text-gray-500 uppercase",children:"Quiet Hours"}),e.jsx("p",{className:"text-xs sm:text-sm font-semibold text-gray-200 mt-0.5 wrap-break-word",children:"2:00 AM – 8:00 AM"})]}),e.jsxs("div",{className:"text-center p-2 rounded-lg bg-gray-800/40 border border-gray-700/30",children:[e.jsx("p",{className:"text-[10px] text-gray-500 uppercase",children:"Min Messages"}),e.jsx("p",{className:"text-xs sm:text-sm font-semibold text-gray-200 mt-0.5",children:"0 (always fire)"})]}),e.jsxs("div",{className:"text-center p-2 rounded-lg bg-gray-800/40 border border-gray-700/30",children:[e.jsx("p",{className:"text-[10px] text-gray-500 uppercase",children:"Bot Cooldown"}),e.jsx("p",{className:"text-xs sm:text-sm font-semibold text-gray-200 mt-0.5",children:"0 (no cooldown)"})]}),e.jsxs("div",{className:"text-center p-2 rounded-lg bg-gray-800/40 border border-gray-700/30",children:[e.jsx("p",{className:"text-[10px] text-gray-500 uppercase",children:"Sched. Wakes"}),e.jsx("p",{className:"text-xs sm:text-sm font-semibold text-gray-200 mt-0.5",children:"20 max / guild"})]})]})}),e.jsxs(a,{type:"info",children:[e.jsx("strong",{children:"Scheduled Wake"}),' is a tool the AI can use during conversations to set its own future reminders. Ask the bot something like "remind me to check raid signups in 2 hours" and it will schedule itself to wake up and act on it. Wakes support relative times (',e.jsx("code",{className:"break-all",children:"30m"}),", ",e.jsx("code",{className:"break-all",children:"2h"}),", ",e.jsx("code",{className:"break-all",children:"1d"}),") and absolute datetimes in your guild's timezone."]}),e.jsx(a,{type:"tip",children:"The heartbeat system automatically skips channels where the bot is already in a conversation and respects quiet hours in your guild's timezone. If there's nothing useful to say, the bot stays silent — it won't spam generic greetings."})]})}];function Q({onDone:s,initialStep:t=0,guideId:a}){return e.jsx(c,{steps:_,onDone:s,initialStep:t,guideId:a})}export{Q as default};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.