This commit is contained in:
sheepbox8646
2026-03-09 15:38:06 +00:00
parent 31e37e6f06
commit 08b4f67eda
103 changed files with 281 additions and 253 deletions
+2 -2
View File
@@ -9,7 +9,7 @@
<link rel="preload stylesheet" href="/assets/style.COoKA1-f.css" as="style">
<link rel="preload stylesheet" href="/vp-icons.css" as="style">
<script type="module" src="/assets/app.BC6GRvcN.js"></script>
<script type="module" src="/assets/app.CFQrAvF4.js"></script>
<link rel="preload" href="/assets/inter-roman-latin.Di8DUHzh.woff2" as="font" type="font/woff2" crossorigin="">
<link rel="icon" href="/logo.png">
<script id="check-dark-mode">(()=>{const e=localStorage.getItem("vitepress-theme-appearance")||"auto",a=window.matchMedia("(prefers-color-scheme: dark)").matches;(!e||e==="auto"?a:e==="dark")&&document.documentElement.classList.add("dark")})();</script>
@@ -17,7 +17,7 @@
</head>
<body>
<div id="app"></div>
<script>window.__VP_HASH_MAP__=JSON.parse("{\"about.md\":\"gLogz9hP\",\"blogs_2026-02-16.md\":\"CVgn4GCU\",\"blogs_index.md\":\"DyCOc_Zm\",\"channels_discord.md\":\"DBWQl28b\",\"channels_feishu.md\":\"-Rc8F8IG\",\"channels_index.md\":\"Cd1GuQFE\",\"channels_telegram.md\":\"URjBaQHx\",\"getting-started_bot.md\":\"CxYqtI4G\",\"getting-started_browser.md\":\"CHy6pyTr\",\"getting-started_channels.md\":\"DiSUpicV\",\"getting-started_container.md\":\"CiSK-fMx\",\"getting-started_email.md\":\"CKJOqdzG\",\"getting-started_files.md\":\"Cl6keVS-\",\"getting-started_heartbeat.md\":\"CgIS9a7z\",\"getting-started_mcp.md\":\"DyRwe04F\",\"getting-started_memory.md\":\"CVd8M6Eu\",\"getting-started_provider-and-model.md\":\"BGpLYgEh\",\"getting-started_schedule.md\":\"B0pL41RB\",\"getting-started_search-provider.md\":\"CWTVwyy0\",\"getting-started_skills.md\":\"EnvAtRea\",\"getting-started_subagents.md\":\"B79V3Ppa\",\"index.md\":\"7vMrZCVa\",\"installation_docker.md\":\"Bk_onHJi\",\"memory-providers_builtin.md\":\"Cgc3R-Wx\",\"memory-providers_index.md\":\"DLe5Y0PL\",\"zh_concepts_identity-and-binding.md\":\"B6I6pSqI\",\"zh_concepts_index.md\":\"uaZIblvt\",\"zh_index.md\":\"DbGu2QT1\",\"zh_style_terminology.md\":\"C89A7q1C\"}");window.__VP_SITE_DATA__=JSON.parse("{\"lang\":\"en-US\",\"dir\":\"ltr\",\"title\":\"Memoh Documentation\",\"description\":\"Multi-Member, Structured Long-Memory, Containerized AI Agent System.\",\"base\":\"/\",\"head\":[],\"router\":{\"prefetchLinks\":true},\"appearance\":true,\"themeConfig\":{\"siteTitle\":\"Memoh\",\"sidebar\":{\"/blogs/\":[{\"text\":\"Blogs\",\"link\":\"/blogs/index.md\",\"items\":[{\"text\":\"Introduction (Feb 2026)\",\"link\":\"/blogs/2026-02-16.md\"}]}],\"/\":[{\"text\":\"Overview\",\"link\":\"/index.md\"},{\"text\":\"About Memoh\",\"link\":\"/about.md\"},{\"text\":\"Installation\",\"items\":[{\"text\":\"Docker\",\"link\":\"/installation/docker.md\"}]},{\"text\":\"Getting Started\",\"items\":[{\"text\":\"LLM Provider and Model\",\"link\":\"/getting-started/provider-and-model.md\"},{\"text\":\"Bot Management\",\"link\":\"/getting-started/bot.md\"},{\"text\":\"Container Management\",\"link\":\"/getting-started/container.md\"},{\"text\":\"Files Management\",\"link\":\"/getting-started/files.md\"},{\"text\":\"Bot Skills\",\"link\":\"/getting-started/skills.md\"},{\"text\":\"MCP Connections\",\"link\":\"/getting-started/mcp.md\"},{\"text\":\"Bot Channels\",\"link\":\"/getting-started/channels.md\"},{\"text\":\"Browser Contexts\",\"link\":\"/getting-started/browser.md\"},{\"text\":\"Memory Management\",\"link\":\"/getting-started/memory.md\"},{\"text\":\"Subagents\",\"link\":\"/getting-started/subagents.md\"},{\"text\":\"Heartbeat\",\"link\":\"/getting-started/heartbeat.md\"},{\"text\":\"Scheduled Tasks\",\"link\":\"/getting-started/schedule.md\"},{\"text\":\"Search Providers\",\"link\":\"/getting-started/search-provider.md\"},{\"text\":\"Email Providers\",\"link\":\"/getting-started/email.md\"}]},{\"text\":\"Memory Providers\",\"items\":[{\"text\":\"Overview\",\"link\":\"/memory-providers/index.md\"},{\"text\":\"Built-in\",\"link\":\"/memory-providers/builtin.md\"}]},{\"text\":\"Channels\",\"items\":[{\"text\":\"Overview\",\"link\":\"/channels/index.md\"},{\"text\":\"Telegram\",\"link\":\"/channels/telegram.md\"},{\"text\":\"Feishu (Lark)\",\"link\":\"/channels/feishu.md\"},{\"text\":\"Discord\",\"link\":\"/channels/discord.md\"}]}],\"/zh/\":[{\"text\":\"文档总览\",\"link\":\"/zh/index.md\"}]},\"nav\":[{\"text\":\"Guides\",\"link\":\"/\"},{\"text\":\"Blogs\",\"link\":\"/blogs/\"}],\"logo\":{\"src\":\"/logo.png\",\"alt\":\"Memoh\"},\"socialLinks\":[{\"icon\":\"github\",\"link\":\"https://github.com/memohai/Memoh\"}],\"footer\":{\"message\":\"Published under AGPLv3\",\"copyright\":\"Copyright © 2024 Memoh\"},\"search\":{\"provider\":\"local\"},\"editLink\":{\"pattern\":\"https://github.com/memohai/Memoh/edit/main/docs/docs/:path\",\"text\":\"Edit on GitHub\"},\"lastUpdated\":{\"text\":\"Last Updated\",\"formatOptions\":{\"dateStyle\":\"short\",\"timeStyle\":\"medium\"}}},\"locales\":{\"root\":{\"label\":\"English\",\"lang\":\"en\"},\"zh\":{\"label\":\"简体中文\",\"lang\":\"zh\"}},\"scrollOffset\":134,\"cleanUrls\":false}");</script>
<script>window.__VP_HASH_MAP__=JSON.parse("{\"about.md\":\"Dtv0dtOs\",\"blogs_2026-02-16.md\":\"cjgZmunL\",\"blogs_index.md\":\"B2P01evP\",\"channels_discord.md\":\"WNpdGj29\",\"channels_feishu.md\":\"BBJ8KQPd\",\"channels_index.md\":\"T_VHXXZf\",\"channels_qq.md\":\"B_4bodh-\",\"channels_telegram.md\":\"B9i-uoiX\",\"getting-started_bot.md\":\"AR4RHnpe\",\"getting-started_browser.md\":\"B8YEEooM\",\"getting-started_channels.md\":\"C0YPWL-y\",\"getting-started_container.md\":\"D49M0dHe\",\"getting-started_email.md\":\"BRkUZLh2\",\"getting-started_files.md\":\"CczR71or\",\"getting-started_heartbeat.md\":\"B-SMiJUD\",\"getting-started_mcp.md\":\"Bb2toM2o\",\"getting-started_memory.md\":\"Dt7Ez9Lk\",\"getting-started_provider-and-model.md\":\"BquaPnJe\",\"getting-started_schedule.md\":\"CNDu3SiN\",\"getting-started_search-provider.md\":\"R9B5DkBj\",\"getting-started_skills.md\":\"DzSZ-qiC\",\"getting-started_subagents.md\":\"6oBLlW8a\",\"index.md\":\"D1yGsPie\",\"installation_docker.md\":\"qkaakAVc\",\"memory-providers_builtin.md\":\"BDxazTz6\",\"memory-providers_index.md\":\"DNPBOVmb\",\"zh_concepts_identity-and-binding.md\":\"7e9GdoK6\",\"zh_concepts_index.md\":\"Brd21jcS\",\"zh_index.md\":\"CZQRt_rQ\",\"zh_style_terminology.md\":\"DLv5QofI\"}");window.__VP_SITE_DATA__=JSON.parse("{\"lang\":\"en-US\",\"dir\":\"ltr\",\"title\":\"Memoh Documentation\",\"description\":\"Multi-Member, Structured Long-Memory, Containerized AI Agent System.\",\"base\":\"/\",\"head\":[],\"router\":{\"prefetchLinks\":true},\"appearance\":true,\"themeConfig\":{\"siteTitle\":\"Memoh\",\"sidebar\":{\"/blogs/\":[{\"text\":\"Blogs\",\"link\":\"/blogs/index.md\",\"items\":[{\"text\":\"Introduction (Feb 2026)\",\"link\":\"/blogs/2026-02-16.md\"}]}],\"/\":[{\"text\":\"Overview\",\"link\":\"/index.md\"},{\"text\":\"About Memoh\",\"link\":\"/about.md\"},{\"text\":\"Installation\",\"items\":[{\"text\":\"Docker\",\"link\":\"/installation/docker.md\"}]},{\"text\":\"Getting Started\",\"items\":[{\"text\":\"LLM Provider and Model\",\"link\":\"/getting-started/provider-and-model.md\"},{\"text\":\"Bot Management\",\"link\":\"/getting-started/bot.md\"},{\"text\":\"Container Management\",\"link\":\"/getting-started/container.md\"},{\"text\":\"Files Management\",\"link\":\"/getting-started/files.md\"},{\"text\":\"Bot Skills\",\"link\":\"/getting-started/skills.md\"},{\"text\":\"MCP Connections\",\"link\":\"/getting-started/mcp.md\"},{\"text\":\"Bot Channels\",\"link\":\"/getting-started/channels.md\"},{\"text\":\"Browser Contexts\",\"link\":\"/getting-started/browser.md\"},{\"text\":\"Memory Management\",\"link\":\"/getting-started/memory.md\"},{\"text\":\"Subagents\",\"link\":\"/getting-started/subagents.md\"},{\"text\":\"Heartbeat\",\"link\":\"/getting-started/heartbeat.md\"},{\"text\":\"Scheduled Tasks\",\"link\":\"/getting-started/schedule.md\"},{\"text\":\"Search Providers\",\"link\":\"/getting-started/search-provider.md\"},{\"text\":\"Email Providers\",\"link\":\"/getting-started/email.md\"}]},{\"text\":\"Memory Providers\",\"items\":[{\"text\":\"Overview\",\"link\":\"/memory-providers/index.md\"},{\"text\":\"Built-in\",\"link\":\"/memory-providers/builtin.md\"}]},{\"text\":\"Channels\",\"items\":[{\"text\":\"Overview\",\"link\":\"/channels/index.md\"},{\"text\":\"Telegram\",\"link\":\"/channels/telegram.md\"},{\"text\":\"Feishu (Lark)\",\"link\":\"/channels/feishu.md\"},{\"text\":\"Discord\",\"link\":\"/channels/discord.md\"},{\"text\":\"QQ\",\"link\":\"/channels/qq.md\"}]}],\"/zh/\":[{\"text\":\"文档总览\",\"link\":\"/zh/index.md\"}]},\"nav\":[{\"text\":\"Guides\",\"link\":\"/\"},{\"text\":\"Blogs\",\"link\":\"/blogs/\"}],\"logo\":{\"src\":\"/logo.png\",\"alt\":\"Memoh\"},\"socialLinks\":[{\"icon\":\"github\",\"link\":\"https://github.com/memohai/Memoh\"}],\"footer\":{\"message\":\"Published under AGPLv3\",\"copyright\":\"Copyright © 2024 Memoh\"},\"search\":{\"provider\":\"local\"},\"editLink\":{\"pattern\":\"https://github.com/memohai/Memoh/edit/main/docs/docs/:path\",\"text\":\"Edit on GitHub\"},\"lastUpdated\":{\"text\":\"Last Updated\",\"formatOptions\":{\"dateStyle\":\"short\",\"timeStyle\":\"medium\"}}},\"locales\":{\"root\":{\"label\":\"English\",\"lang\":\"en\"},\"zh\":{\"label\":\"简体中文\",\"lang\":\"zh\"}},\"scrollOffset\":134,\"cleanUrls\":false}");</script>
</body>
</html>
+6 -6
View File
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
import{_ as a,o as t,c as o,ag as i}from"./chunks/framework.ePeAWSvT.js";const h=JSON.parse('{"title":"About Memoh","description":"","frontmatter":{},"headers":[],"relativePath":"about.md","filePath":"about.md","lastUpdated":1772873936000}'),n={name:"about.md"};function r(s,e,l,c,d,m){return t(),o("div",null,[...e[0]||(e[0]=[i("",36)])])}const p=a(n,[["render",r]]);export{h as __pageData,p as default};
import{_ as a,o as t,c as o,ag as i}from"./chunks/framework.BZohXCq9.js";const h=JSON.parse('{"title":"About Memoh","description":"","frontmatter":{},"headers":[],"relativePath":"about.md","filePath":"about.md","lastUpdated":1772873936000}'),n={name:"about.md"};function r(s,e,l,c,d,m){return t(),o("div",null,[...e[0]||(e[0]=[i("",36)])])}const p=a(n,[["render",r]]);export{h as __pageData,p as default};
@@ -1 +1 @@
import{t as p}from"./chunks/theme.Dze9WHF4.js";import{R as s,a2 as i,a3 as u,a4 as c,a5 as l,a6 as f,a7 as d,a8 as m,a9 as h,aa as g,ab as A,d as v,u as y,v as C,s as P,ac as b,ad as w,ae as R,af as E}from"./chunks/framework.ePeAWSvT.js";function r(e){if(e.extends){const a=r(e.extends);return{...a,...e,async enhanceApp(t){a.enhanceApp&&await a.enhanceApp(t),e.enhanceApp&&await e.enhanceApp(t)}}}return e}const n=r(p),S=v({name:"VitePressApp",setup(){const{site:e,lang:a,dir:t}=y();return C(()=>{P(()=>{document.documentElement.lang=a.value,document.documentElement.dir=t.value})}),e.value.router.prefetchLinks&&b(),w(),R(),n.setup&&n.setup(),()=>E(n.Layout)}});async function T(){globalThis.__VITEPRESS__=!0;const e=_(),a=D();a.provide(u,e);const t=c(e.route);return a.provide(l,t),a.component("Content",f),a.component("ClientOnly",d),Object.defineProperties(a.config.globalProperties,{$frontmatter:{get(){return t.frontmatter.value}},$params:{get(){return t.page.value.params}}}),n.enhanceApp&&await n.enhanceApp({app:a,router:e,siteData:m}),{app:a,router:e,data:t}}function D(){return A(S)}function _(){let e=s;return h(a=>{let t=g(a),o=null;return t&&(e&&(t=t.replace(/\.js$/,".lean.js")),o=import(t)),s&&(e=!1),o},n.NotFound)}s&&T().then(({app:e,router:a,data:t})=>{a.go().then(()=>{i(a.route,t.site),e.mount("#app")})});export{T as createApp};
import{t as p}from"./chunks/theme.B0ckB4ri.js";import{R as s,a2 as i,a3 as u,a4 as c,a5 as l,a6 as f,a7 as d,a8 as m,a9 as h,aa as g,ab as A,d as v,u as y,v as C,s as P,ac as b,ad as w,ae as R,af as E}from"./chunks/framework.BZohXCq9.js";function r(e){if(e.extends){const a=r(e.extends);return{...a,...e,async enhanceApp(t){a.enhanceApp&&await a.enhanceApp(t),e.enhanceApp&&await e.enhanceApp(t)}}}return e}const n=r(p),S=v({name:"VitePressApp",setup(){const{site:e,lang:a,dir:t}=y();return C(()=>{P(()=>{document.documentElement.lang=a.value,document.documentElement.dir=t.value})}),e.value.router.prefetchLinks&&b(),w(),R(),n.setup&&n.setup(),()=>E(n.Layout)}});async function T(){globalThis.__VITEPRESS__=!0;const e=_(),a=D();a.provide(u,e);const t=c(e.route);return a.provide(l,t),a.component("Content",f),a.component("ClientOnly",d),Object.defineProperties(a.config.globalProperties,{$frontmatter:{get(){return t.frontmatter.value}},$params:{get(){return t.page.value.params}}}),n.enhanceApp&&await n.enhanceApp({app:a,router:e,siteData:m}),{app:a,router:e,data:t}}function D(){return A(S)}function _(){let e=s;return h(a=>{let t=g(a),o=null;return t&&(e&&(t=t.replace(/\.js$/,".lean.js")),o=import(t)),s&&(e=!1),o},n.NotFound)}s&&T().then(({app:e,router:a,data:t})=>{a.go().then(()=>{i(a.route,t.site),e.mount("#app")})});export{T as createApp};
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
import{_ as t,o as a,c as o,ag as n}from"./chunks/framework.ePeAWSvT.js";const r="/blogs/2026-02-16/01-multi-bots.png",i="/blogs/2026-02-16/02-containerized.png",s="/blogs/2026-02-16/03-memory-engineering.png",y=JSON.parse('{"title":"Introduction to Memoh - The Case for an Always-On, Containerized Home Agent","description":"","frontmatter":{"title":"Introduction to Memoh - The Case for an Always-On, Containerized Home Agent","author":"Team Memoh"},"headers":[],"relativePath":"blogs/2026-02-16.md","filePath":"blogs/2026-02-16.md","lastUpdated":1771238980000}'),l={name:"blogs/2026-02-16.md"};function h(c,e,d,u,m,p){return a(),o("div",null,[...e[0]||(e[0]=[n("",33)])])}const f=t(l,[["render",h]]);export{y as __pageData,f as default};
import{_ as t,o as a,c as o,ag as n}from"./chunks/framework.BZohXCq9.js";const r="/blogs/2026-02-16/01-multi-bots.png",i="/blogs/2026-02-16/02-containerized.png",s="/blogs/2026-02-16/03-memory-engineering.png",y=JSON.parse('{"title":"Introduction to Memoh - The Case for an Always-On, Containerized Home Agent","description":"","frontmatter":{"title":"Introduction to Memoh - The Case for an Always-On, Containerized Home Agent","author":"Team Memoh"},"headers":[],"relativePath":"blogs/2026-02-16.md","filePath":"blogs/2026-02-16.md","lastUpdated":1771238980000}'),l={name:"blogs/2026-02-16.md"};function h(c,e,d,u,m,p){return a(),o("div",null,[...e[0]||(e[0]=[n("",33)])])}const f=t(l,[["render",h]]);export{y as __pageData,f as default};
@@ -1 +1 @@
import{_ as a,o,c as s,j as e,a as l}from"./chunks/framework.ePeAWSvT.js";const g=JSON.parse('{"title":"Blogs","description":"","frontmatter":{},"headers":[],"relativePath":"blogs/index.md","filePath":"blogs/index.md","lastUpdated":1771238299000}'),n={name:"blogs/index.md"};function r(i,t,d,c,p,m){return o(),s("div",null,[...t[0]||(t[0]=[e("h1",{id:"blogs",tabindex:"-1"},[l("Blogs "),e("a",{class:"header-anchor",href:"#blogs","aria-label":'Permalink to "Blogs"'},"")],-1),e("p",null,"This section contains the latest blogs about Memoh.",-1),e("ul",null,[e("li",null,[e("a",{href:"/blogs/2026-02-16.html"},"Introduction (Feb 2026)")])],-1)])])}const h=a(n,[["render",r]]);export{g as __pageData,h as default};
import{_ as a,o,c as s,j as e,a as l}from"./chunks/framework.BZohXCq9.js";const g=JSON.parse('{"title":"Blogs","description":"","frontmatter":{},"headers":[],"relativePath":"blogs/index.md","filePath":"blogs/index.md","lastUpdated":1771238299000}'),n={name:"blogs/index.md"};function r(i,t,d,c,p,m){return o(),s("div",null,[...t[0]||(t[0]=[e("h1",{id:"blogs",tabindex:"-1"},[l("Blogs "),e("a",{class:"header-anchor",href:"#blogs","aria-label":'Permalink to "Blogs"'},"")],-1),e("p",null,"This section contains the latest blogs about Memoh.",-1),e("ul",null,[e("li",null,[e("a",{href:"/blogs/2026-02-16.html"},"Introduction (Feb 2026)")])],-1)])])}const h=a(n,[["render",r]]);export{g as __pageData,h as default};
@@ -1 +1 @@
import{_ as a,o,c as s,j as e,a as l}from"./chunks/framework.ePeAWSvT.js";const g=JSON.parse('{"title":"Blogs","description":"","frontmatter":{},"headers":[],"relativePath":"blogs/index.md","filePath":"blogs/index.md","lastUpdated":1771238299000}'),n={name:"blogs/index.md"};function r(i,t,d,c,p,m){return o(),s("div",null,[...t[0]||(t[0]=[e("h1",{id:"blogs",tabindex:"-1"},[l("Blogs "),e("a",{class:"header-anchor",href:"#blogs","aria-label":'Permalink to "Blogs"'},"")],-1),e("p",null,"This section contains the latest blogs about Memoh.",-1),e("ul",null,[e("li",null,[e("a",{href:"/blogs/2026-02-16.html"},"Introduction (Feb 2026)")])],-1)])])}const h=a(n,[["render",r]]);export{g as __pageData,h as default};
import{_ as a,o,c as s,j as e,a as l}from"./chunks/framework.BZohXCq9.js";const g=JSON.parse('{"title":"Blogs","description":"","frontmatter":{},"headers":[],"relativePath":"blogs/index.md","filePath":"blogs/index.md","lastUpdated":1771238299000}'),n={name:"blogs/index.md"};function r(i,t,d,c,p,m){return o(),s("div",null,[...t[0]||(t[0]=[e("h1",{id:"blogs",tabindex:"-1"},[l("Blogs "),e("a",{class:"header-anchor",href:"#blogs","aria-label":'Permalink to "Blogs"'},"")],-1),e("p",null,"This section contains the latest blogs about Memoh.",-1),e("ul",null,[e("li",null,[e("a",{href:"/blogs/2026-02-16.html"},"Introduction (Feb 2026)")])],-1)])])}const h=a(n,[["render",r]]);export{g as __pageData,h as default};
@@ -1 +1 @@
import{_ as t,o,c as r,ag as a}from"./chunks/framework.ePeAWSvT.js";const p=JSON.parse('{"title":"Discord Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/discord.md","filePath":"channels/discord.md","lastUpdated":1772359263000}'),i={name:"channels/discord.md"};function n(s,e,l,c,d,h){return o(),r("div",null,[...e[0]||(e[0]=[a('<h1 id="discord-channel-configuration" tabindex="-1">Discord Channel Configuration <a class="header-anchor" href="#discord-channel-configuration" aria-label="Permalink to &quot;Discord Channel Configuration&quot;"></a></h1><p>Connecting your Memoh Bot to Discord allows it to join servers and interact with community members.</p><h2 id="step-1-create-a-discord-application" tabindex="-1">Step 1: Create a Discord Application <a class="header-anchor" href="#step-1-create-a-discord-application" aria-label="Permalink to &quot;Step 1: Create a Discord Application&quot;"></a></h2><ol><li>Go to the <a href="https://discord.com/developers/applications" target="_blank" rel="noreferrer">Discord Developer Portal</a>.</li><li>Click <strong>New Application</strong> and give it a name.</li><li>In the left sidebar, go to <strong>Bot</strong>.</li><li>Click <strong>Reset Token</strong> to generate a <strong>Bot Token</strong>. Copy this token and store it securely.</li></ol><h2 id="step-2-configure-bot-settings" tabindex="-1">Step 2: Configure Bot Settings <a class="header-anchor" href="#step-2-configure-bot-settings" aria-label="Permalink to &quot;Step 2: Configure Bot Settings&quot;"></a></h2><ol><li>Scroll down to the <strong>Privileged Gateway Intents</strong> section.</li><li>Enable <strong>Message Content Intent</strong> (required for the bot to read user messages).</li><li>Save changes.</li></ol><h2 id="step-3-invite-the-bot-to-your-server" tabindex="-1">Step 3: Invite the Bot to Your Server <a class="header-anchor" href="#step-3-invite-the-bot-to-your-server" aria-label="Permalink to &quot;Step 3: Invite the Bot to Your Server&quot;"></a></h2><ol><li>Go to <strong>OAuth2</strong> &gt; <strong>URL Generator</strong>.</li><li>Select scopes: <code>bot</code>, <code>applications.commands</code>.</li><li>Select permissions: <code>Send Messages</code>, <code>Read Message History</code>, <code>Embed Links</code>, <code>Attach Files</code>.</li><li>Copy the generated URL and open it in your browser.</li><li>Select the server you want to add the bot to and authorize it.</li></ol><blockquote><p>Official Guide: <a href="https://discord.com/developers/docs/intro" target="_blank" rel="noreferrer">Discord Developer Portal - Bots</a></p></blockquote><h2 id="step-4-configure-memoh" tabindex="-1">Step 4: Configure Memoh <a class="header-anchor" href="#step-4-configure-memoh" aria-label="Permalink to &quot;Step 4: Configure Memoh&quot;"></a></h2><ol><li>Go to your Bot&#39;s <strong>Channels</strong> tab in the Memoh Web UI.</li><li>Click <strong>Add Channel</strong> and select <strong>Discord</strong>.</li><li>Paste your <strong>Bot Token</strong>.</li><li>Click <strong>Save and Enable</strong>.</li></ol><h2 id="features-supported" tabindex="-1">Features Supported <a class="header-anchor" href="#features-supported" aria-label="Permalink to &quot;Features Supported&quot;"></a></h2><ul><li><strong>Message Content</strong>: Full access to chat text.</li><li><strong>Attachments</strong>: Support for images and files.</li><li><strong>Commands</strong>: Integration with Discord&#39;s slash commands (if configured via MCP).</li></ul>',13)])])}const u=t(i,[["render",n]]);export{p as __pageData,u as default};
import{_ as t,o,c as r,ag as a}from"./chunks/framework.BZohXCq9.js";const p=JSON.parse('{"title":"Discord Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/discord.md","filePath":"channels/discord.md","lastUpdated":1772359263000}'),i={name:"channels/discord.md"};function n(s,e,l,c,d,h){return o(),r("div",null,[...e[0]||(e[0]=[a('<h1 id="discord-channel-configuration" tabindex="-1">Discord Channel Configuration <a class="header-anchor" href="#discord-channel-configuration" aria-label="Permalink to &quot;Discord Channel Configuration&quot;"></a></h1><p>Connecting your Memoh Bot to Discord allows it to join servers and interact with community members.</p><h2 id="step-1-create-a-discord-application" tabindex="-1">Step 1: Create a Discord Application <a class="header-anchor" href="#step-1-create-a-discord-application" aria-label="Permalink to &quot;Step 1: Create a Discord Application&quot;"></a></h2><ol><li>Go to the <a href="https://discord.com/developers/applications" target="_blank" rel="noreferrer">Discord Developer Portal</a>.</li><li>Click <strong>New Application</strong> and give it a name.</li><li>In the left sidebar, go to <strong>Bot</strong>.</li><li>Click <strong>Reset Token</strong> to generate a <strong>Bot Token</strong>. Copy this token and store it securely.</li></ol><h2 id="step-2-configure-bot-settings" tabindex="-1">Step 2: Configure Bot Settings <a class="header-anchor" href="#step-2-configure-bot-settings" aria-label="Permalink to &quot;Step 2: Configure Bot Settings&quot;"></a></h2><ol><li>Scroll down to the <strong>Privileged Gateway Intents</strong> section.</li><li>Enable <strong>Message Content Intent</strong> (required for the bot to read user messages).</li><li>Save changes.</li></ol><h2 id="step-3-invite-the-bot-to-your-server" tabindex="-1">Step 3: Invite the Bot to Your Server <a class="header-anchor" href="#step-3-invite-the-bot-to-your-server" aria-label="Permalink to &quot;Step 3: Invite the Bot to Your Server&quot;"></a></h2><ol><li>Go to <strong>OAuth2</strong> &gt; <strong>URL Generator</strong>.</li><li>Select scopes: <code>bot</code>, <code>applications.commands</code>.</li><li>Select permissions: <code>Send Messages</code>, <code>Read Message History</code>, <code>Embed Links</code>, <code>Attach Files</code>.</li><li>Copy the generated URL and open it in your browser.</li><li>Select the server you want to add the bot to and authorize it.</li></ol><blockquote><p>Official Guide: <a href="https://discord.com/developers/docs/intro" target="_blank" rel="noreferrer">Discord Developer Portal - Bots</a></p></blockquote><h2 id="step-4-configure-memoh" tabindex="-1">Step 4: Configure Memoh <a class="header-anchor" href="#step-4-configure-memoh" aria-label="Permalink to &quot;Step 4: Configure Memoh&quot;"></a></h2><ol><li>Go to your Bot&#39;s <strong>Channels</strong> tab in the Memoh Web UI.</li><li>Click <strong>Add Channel</strong> and select <strong>Discord</strong>.</li><li>Paste your <strong>Bot Token</strong>.</li><li>Click <strong>Save and Enable</strong>.</li></ol><h2 id="features-supported" tabindex="-1">Features Supported <a class="header-anchor" href="#features-supported" aria-label="Permalink to &quot;Features Supported&quot;"></a></h2><ul><li><strong>Message Content</strong>: Full access to chat text.</li><li><strong>Attachments</strong>: Support for images and files.</li><li><strong>Commands</strong>: Integration with Discord&#39;s slash commands (if configured via MCP).</li></ul>',13)])])}const u=t(i,[["render",n]]);export{p as __pageData,u as default};
@@ -1 +1 @@
import{_ as t,o,c as r,ag as a}from"./chunks/framework.ePeAWSvT.js";const p=JSON.parse('{"title":"Discord Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/discord.md","filePath":"channels/discord.md","lastUpdated":1772359263000}'),i={name:"channels/discord.md"};function n(s,e,l,c,d,h){return o(),r("div",null,[...e[0]||(e[0]=[a("",13)])])}const u=t(i,[["render",n]]);export{p as __pageData,u as default};
import{_ as t,o,c as r,ag as a}from"./chunks/framework.BZohXCq9.js";const p=JSON.parse('{"title":"Discord Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/discord.md","filePath":"channels/discord.md","lastUpdated":1772359263000}'),i={name:"channels/discord.md"};function n(s,e,l,c,d,h){return o(),r("div",null,[...e[0]||(e[0]=[a("",13)])])}const u=t(i,[["render",n]]);export{p as __pageData,u as default};
@@ -1 +1 @@
import{_ as o,o as t,c as i,ag as a}from"./chunks/framework.ePeAWSvT.js";const c=JSON.parse('{"title":"Feishu (Lark) Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/feishu.md","filePath":"channels/feishu.md","lastUpdated":1772359263000}'),n={name:"channels/feishu.md"};function s(r,e,l,p,h,g){return t(),i("div",null,[...e[0]||(e[0]=[a('<h1 id="feishu-lark-channel-configuration" tabindex="-1">Feishu (Lark) Channel Configuration <a class="header-anchor" href="#feishu-lark-channel-configuration" aria-label="Permalink to &quot;Feishu (Lark) Channel Configuration&quot;"></a></h1><p>Memoh supports integrating with Feishu (Lark) via the Open Platform. This allows your enterprise bots to interact with users in groups or private chats.</p><h2 id="step-1-create-a-feishu-app" tabindex="-1">Step 1: Create a Feishu App <a class="header-anchor" href="#step-1-create-a-feishu-app" aria-label="Permalink to &quot;Step 1: Create a Feishu App&quot;"></a></h2><ol><li>Go to the <a href="https://open.feishu.cn/app" target="_blank" rel="noreferrer">Feishu Open Platform</a> and log in.</li><li>Click <strong>Create Custom App</strong>.</li><li>Enter a name and description, then click <strong>Create</strong>.</li><li>In the left sidebar, go to <strong>App Settings</strong> &gt; <strong>Credentials &amp; Basic Info</strong>.</li><li>Copy your <strong>App ID</strong> and <strong>App Secret</strong>.</li></ol><h2 id="step-2-enable-bot-capability" tabindex="-1">Step 2: Enable Bot Capability <a class="header-anchor" href="#step-2-enable-bot-capability" aria-label="Permalink to &quot;Step 2: Enable Bot Capability&quot;"></a></h2><ol><li>In the Feishu Developer Console, go to <strong>Capabilities</strong> &gt; <strong>Bot</strong>.</li><li>Click <strong>Enable Bot</strong>.</li></ol><h2 id="step-3-configure-permissions" tabindex="-1">Step 3: Configure Permissions <a class="header-anchor" href="#step-3-configure-permissions" aria-label="Permalink to &quot;Step 3: Configure Permissions&quot;"></a></h2><ol><li>Go to <strong>Capabilities</strong> &gt; <strong>Permissions</strong>.</li><li>Search for and enable the following permissions (at minimum): <ul><li><code>im:message</code> (Receive and send messages)</li><li><code>im:chat</code> (Access group chat information)</li></ul></li><li>Click <strong>Apply for Permissions</strong> if required by your organization.</li></ol><h2 id="step-4-configure-events-webhook-mode" tabindex="-1">Step 4: Configure Events (Webhook Mode) <a class="header-anchor" href="#step-4-configure-events-webhook-mode" aria-label="Permalink to &quot;Step 4: Configure Events (Webhook Mode)&quot;"></a></h2><ol><li>In Memoh, go to your Bot&#39;s <strong>Channels</strong> tab and add a <strong>Feishu</strong> channel.</li><li>Choose <strong>Inbound Mode</strong>: <code>webhook</code>.</li><li>Fill in your <strong>App ID</strong> and <strong>App Secret</strong>.</li><li>Click <strong>Save</strong>. Memoh will generate a <strong>Webhook Callback URL</strong>.</li><li>Copy this URL.</li><li>In the Feishu Console, go to <strong>App Settings</strong> &gt; <strong>Event Subscriptions</strong>.</li><li>Paste the URL into the <strong>Verification URL</strong> field and save.</li><li>Add events like <code>Receive Message</code> (im.message.receive_v1).</li></ol><blockquote><p>Official Guide: <a href="https://open.feishu.cn/document/client-docs/bot-v3/add-custom-bot" target="_blank" rel="noreferrer">Feishu Custom Bot Guide</a></p></blockquote><h2 id="step-5-publish-your-app" tabindex="-1">Step 5: Publish Your App <a class="header-anchor" href="#step-5-publish-your-app" aria-label="Permalink to &quot;Step 5: Publish Your App&quot;"></a></h2><ol><li>In the Feishu Console, go to <strong>App Release</strong> &gt; <strong>Version Management &amp; Release</strong>.</li><li>Click <strong>Create a Version</strong>, fill in the details, and submit for approval.</li><li>Once approved and published, the bot is ready to use.</li></ol>',13)])])}const d=o(n,[["render",s]]);export{c as __pageData,d as default};
import{_ as o,o as t,c as i,ag as a}from"./chunks/framework.BZohXCq9.js";const c=JSON.parse('{"title":"Feishu (Lark) Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/feishu.md","filePath":"channels/feishu.md","lastUpdated":1772359263000}'),n={name:"channels/feishu.md"};function s(r,e,l,p,h,g){return t(),i("div",null,[...e[0]||(e[0]=[a('<h1 id="feishu-lark-channel-configuration" tabindex="-1">Feishu (Lark) Channel Configuration <a class="header-anchor" href="#feishu-lark-channel-configuration" aria-label="Permalink to &quot;Feishu (Lark) Channel Configuration&quot;"></a></h1><p>Memoh supports integrating with Feishu (Lark) via the Open Platform. This allows your enterprise bots to interact with users in groups or private chats.</p><h2 id="step-1-create-a-feishu-app" tabindex="-1">Step 1: Create a Feishu App <a class="header-anchor" href="#step-1-create-a-feishu-app" aria-label="Permalink to &quot;Step 1: Create a Feishu App&quot;"></a></h2><ol><li>Go to the <a href="https://open.feishu.cn/app" target="_blank" rel="noreferrer">Feishu Open Platform</a> and log in.</li><li>Click <strong>Create Custom App</strong>.</li><li>Enter a name and description, then click <strong>Create</strong>.</li><li>In the left sidebar, go to <strong>App Settings</strong> &gt; <strong>Credentials &amp; Basic Info</strong>.</li><li>Copy your <strong>App ID</strong> and <strong>App Secret</strong>.</li></ol><h2 id="step-2-enable-bot-capability" tabindex="-1">Step 2: Enable Bot Capability <a class="header-anchor" href="#step-2-enable-bot-capability" aria-label="Permalink to &quot;Step 2: Enable Bot Capability&quot;"></a></h2><ol><li>In the Feishu Developer Console, go to <strong>Capabilities</strong> &gt; <strong>Bot</strong>.</li><li>Click <strong>Enable Bot</strong>.</li></ol><h2 id="step-3-configure-permissions" tabindex="-1">Step 3: Configure Permissions <a class="header-anchor" href="#step-3-configure-permissions" aria-label="Permalink to &quot;Step 3: Configure Permissions&quot;"></a></h2><ol><li>Go to <strong>Capabilities</strong> &gt; <strong>Permissions</strong>.</li><li>Search for and enable the following permissions (at minimum): <ul><li><code>im:message</code> (Receive and send messages)</li><li><code>im:chat</code> (Access group chat information)</li></ul></li><li>Click <strong>Apply for Permissions</strong> if required by your organization.</li></ol><h2 id="step-4-configure-events-webhook-mode" tabindex="-1">Step 4: Configure Events (Webhook Mode) <a class="header-anchor" href="#step-4-configure-events-webhook-mode" aria-label="Permalink to &quot;Step 4: Configure Events (Webhook Mode)&quot;"></a></h2><ol><li>In Memoh, go to your Bot&#39;s <strong>Channels</strong> tab and add a <strong>Feishu</strong> channel.</li><li>Choose <strong>Inbound Mode</strong>: <code>webhook</code>.</li><li>Fill in your <strong>App ID</strong> and <strong>App Secret</strong>.</li><li>Click <strong>Save</strong>. Memoh will generate a <strong>Webhook Callback URL</strong>.</li><li>Copy this URL.</li><li>In the Feishu Console, go to <strong>App Settings</strong> &gt; <strong>Event Subscriptions</strong>.</li><li>Paste the URL into the <strong>Verification URL</strong> field and save.</li><li>Add events like <code>Receive Message</code> (im.message.receive_v1).</li></ol><blockquote><p>Official Guide: <a href="https://open.feishu.cn/document/client-docs/bot-v3/add-custom-bot" target="_blank" rel="noreferrer">Feishu Custom Bot Guide</a></p></blockquote><h2 id="step-5-publish-your-app" tabindex="-1">Step 5: Publish Your App <a class="header-anchor" href="#step-5-publish-your-app" aria-label="Permalink to &quot;Step 5: Publish Your App&quot;"></a></h2><ol><li>In the Feishu Console, go to <strong>App Release</strong> &gt; <strong>Version Management &amp; Release</strong>.</li><li>Click <strong>Create a Version</strong>, fill in the details, and submit for approval.</li><li>Once approved and published, the bot is ready to use.</li></ol>',13)])])}const d=o(n,[["render",s]]);export{c as __pageData,d as default};
@@ -1 +1 @@
import{_ as o,o as t,c as i,ag as a}from"./chunks/framework.ePeAWSvT.js";const c=JSON.parse('{"title":"Feishu (Lark) Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/feishu.md","filePath":"channels/feishu.md","lastUpdated":1772359263000}'),n={name:"channels/feishu.md"};function s(r,e,l,p,h,g){return t(),i("div",null,[...e[0]||(e[0]=[a("",13)])])}const d=o(n,[["render",s]]);export{c as __pageData,d as default};
import{_ as o,o as t,c as i,ag as a}from"./chunks/framework.BZohXCq9.js";const c=JSON.parse('{"title":"Feishu (Lark) Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/feishu.md","filePath":"channels/feishu.md","lastUpdated":1772359263000}'),n={name:"channels/feishu.md"};function s(r,e,l,p,h,g){return t(),i("div",null,[...e[0]||(e[0]=[a("",13)])])}const d=o(n,[["render",s]]);export{c as __pageData,d as default};
-1
View File
@@ -1 +0,0 @@
import{_ as t,o as a,c as n,ag as r}from"./chunks/framework.ePeAWSvT.js";const u=JSON.parse('{"title":"Channels Overview","description":"","frontmatter":{},"headers":[],"relativePath":"channels/index.md","filePath":"channels/index.md","lastUpdated":1772359263000}'),o={name:"channels/index.md"};function s(i,e,l,h,c,d){return a(),n("div",null,[...e[0]||(e[0]=[r('<h1 id="channels-overview" tabindex="-1">Channels Overview <a class="header-anchor" href="#channels-overview" aria-label="Permalink to &quot;Channels Overview&quot;"></a></h1><p>Channels are the gateways that connect your Memoh Bots to the outside world. By configuring channels, you can interact with your bots via your favorite messaging platforms.</p><p>Memoh currently supports the following channels:</p><ul><li><strong><a href="./telegram.html">Telegram</a></strong>: The most feature-rich integration with streaming and attachment support.</li><li><strong><a href="./feishu.html">Feishu (Lark)</a></strong>: Enterprise-ready integration for business workflows.</li><li><strong><a href="./discord.html">Discord</a></strong>: Community-focused integration for servers and direct messages.</li><li><strong>Email</strong>: Connect via standard SMTP and IMAP (configured through Email Providers).</li><li><strong>Web</strong>: Built-in chat interface for immediate access.</li></ul><h2 id="general-setup-flow" tabindex="-1">General Setup Flow <a class="header-anchor" href="#general-setup-flow" aria-label="Permalink to &quot;General Setup Flow&quot;"></a></h2><ol><li><strong>Create an external app/bot</strong>: Register your bot on the target platform (e.g., via BotFather on Telegram).</li><li><strong>Obtain credentials</strong>: Fetch API tokens, App IDs, or secrets.</li><li><strong>Configure in Memoh</strong>: Add the channel to your Bot&#39;s settings and paste the credentials.</li><li><strong>Enable</strong>: Activate the channel to start receiving and sending messages.</li></ol><p>Choose a channel from the sidebar to see detailed configuration guides for each platform.</p>',7)])])}const m=t(o,[["render",s]]);export{u as __pageData,m as default};
@@ -1 +0,0 @@
import{_ as t,o as a,c as n,ag as r}from"./chunks/framework.ePeAWSvT.js";const u=JSON.parse('{"title":"Channels Overview","description":"","frontmatter":{},"headers":[],"relativePath":"channels/index.md","filePath":"channels/index.md","lastUpdated":1772359263000}'),o={name:"channels/index.md"};function s(i,e,l,h,c,d){return a(),n("div",null,[...e[0]||(e[0]=[r("",7)])])}const m=t(o,[["render",s]]);export{u as __pageData,m as default};
+1
View File
@@ -0,0 +1 @@
import{_ as t,o as a,c as n,ag as r}from"./chunks/framework.BZohXCq9.js";const u=JSON.parse('{"title":"Channels Overview","description":"","frontmatter":{},"headers":[],"relativePath":"channels/index.md","filePath":"channels/index.md","lastUpdated":1773070648000}'),o={name:"channels/index.md"};function s(i,e,l,h,c,d){return a(),n("div",null,[...e[0]||(e[0]=[r('<h1 id="channels-overview" tabindex="-1">Channels Overview <a class="header-anchor" href="#channels-overview" aria-label="Permalink to &quot;Channels Overview&quot;"></a></h1><p>Channels are the gateways that connect your Memoh Bots to the outside world. By configuring channels, you can interact with your bots via your favorite messaging platforms.</p><p>Memoh currently supports the following channels:</p><ul><li><strong><a href="./telegram.html">Telegram</a></strong>: The most feature-rich integration with streaming and attachment support.</li><li><strong><a href="./feishu.html">Feishu (Lark)</a></strong>: Enterprise-ready integration for business workflows.</li><li><strong><a href="./discord.html">Discord</a></strong>: Community-focused integration for servers and direct messages.</li><li><strong><a href="./qq.html">QQ</a></strong>: Quick setup for personal DM bots via the dedicated AI bot registration portal.</li><li><strong>Email</strong>: Connect via standard SMTP and IMAP (configured through Email Providers).</li><li><strong>Web</strong>: Built-in chat interface for immediate access.</li></ul><h2 id="general-setup-flow" tabindex="-1">General Setup Flow <a class="header-anchor" href="#general-setup-flow" aria-label="Permalink to &quot;General Setup Flow&quot;"></a></h2><ol><li><strong>Create an external app/bot</strong>: Register your bot on the target platform (e.g., via BotFather on Telegram).</li><li><strong>Obtain credentials</strong>: Fetch API tokens, App IDs, or secrets.</li><li><strong>Configure in Memoh</strong>: Add the channel to your Bot&#39;s settings and paste the credentials.</li><li><strong>Enable</strong>: Activate the channel to start receiving and sending messages.</li></ol><p>Choose a channel from the sidebar to see detailed configuration guides for each platform.</p>',7)])])}const p=t(o,[["render",s]]);export{u as __pageData,p as default};
@@ -0,0 +1 @@
import{_ as t,o as a,c as n,ag as r}from"./chunks/framework.BZohXCq9.js";const u=JSON.parse('{"title":"Channels Overview","description":"","frontmatter":{},"headers":[],"relativePath":"channels/index.md","filePath":"channels/index.md","lastUpdated":1773070648000}'),o={name:"channels/index.md"};function s(i,e,l,h,c,d){return a(),n("div",null,[...e[0]||(e[0]=[r("",7)])])}const p=t(o,[["render",s]]);export{u as __pageData,p as default};
+1
View File
@@ -0,0 +1 @@
import{_ as e,o,c as a,ag as n}from"./chunks/framework.BZohXCq9.js";const u=JSON.parse('{"title":"QQ Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/qq.md","filePath":"channels/qq.md","lastUpdated":1773070648000}'),r={name:"channels/qq.md"};function i(l,t,s,c,p,d){return o(),a("div",null,[...t[0]||(t[0]=[n('<h1 id="qq-channel-configuration" tabindex="-1">QQ Channel Configuration <a class="header-anchor" href="#qq-channel-configuration" aria-label="Permalink to &quot;QQ Channel Configuration&quot;"></a></h1><p>Connecting your Memoh Bot to QQ allows it to interact with users through QQ&#39;s official Bot platform.</p><h2 id="step-1-create-a-qq-bot" tabindex="-1">Step 1: Create a QQ Bot <a class="header-anchor" href="#step-1-create-a-qq-bot" aria-label="Permalink to &quot;Step 1: Create a QQ Bot&quot;"></a></h2><ol><li>Go to the <a href="https://q.qq.com/qqbot/openclaw/" target="_blank" rel="noreferrer">QQ Bot Open Platform</a> and log in with your QQ account.</li><li>Click <strong>Create Bot</strong> (创建机器人) - no approval required. Each account can create up to 5 bots.</li><li>Copy the <strong>AppID</strong> and <strong>AppSecret</strong> displayed on the page.</li></ol><blockquote><p><strong>Important</strong>: AppSecret is only shown once. Save it securely - viewing it again will force a reset.</p></blockquote><h2 id="step-2-configure-memoh" tabindex="-1">Step 2: Configure Memoh <a class="header-anchor" href="#step-2-configure-memoh" aria-label="Permalink to &quot;Step 2: Configure Memoh&quot;"></a></h2><ol><li>Go to your Bot&#39;s <strong>Channels</strong> tab in the Memoh Web UI.</li><li>Click <strong>Add Channel</strong> and select <strong>QQ</strong>.</li><li>Paste your <strong>AppID</strong> and <strong>AppSecret</strong>.</li><li>Configure optional settings: <ul><li><strong>Markdown Support</strong>: Enable Markdown formatting (default: enabled).</li><li><strong>Enable Input Hint</strong>: Show typing indicators (default: enabled).</li></ul></li><li>Click <strong>Save and Enable</strong>.</li></ol><h2 id="step-3-bind-your-identity-optional" tabindex="-1">Step 3: Bind Your Identity (Optional) <a class="header-anchor" href="#step-3-bind-your-identity-optional" aria-label="Permalink to &quot;Step 3: Bind Your Identity (Optional)&quot;"></a></h2><p>If your bot is a <code>personal</code> type bot, bind your QQ identity to chat with it directly:</p><ol><li>In Memoh Web UI, go to <strong>Settings</strong> &gt; <strong>Bind Code</strong>.</li><li>Select <strong>QQ</strong> and click <strong>Generate</strong>.</li><li>Copy the code and send it to your bot in a QQ direct message.</li></ol><h2 id="features-supported" tabindex="-1">Features Supported <a class="header-anchor" href="#features-supported" aria-label="Permalink to &quot;Features Supported&quot;"></a></h2><ul><li><strong>Message Content</strong>: Full support for text messages.</li><li><strong>Markdown</strong>: Rich formatting with bold, italic, code blocks, and links.</li><li><strong>Attachments</strong>: Support for images and files.</li><li><strong>Typing Indicators</strong>: Visual feedback while generating responses.</li><li><strong>Target Types</strong>: C2C (direct message), group, and channel.</li></ul><h2 id="official-resources" tabindex="-1">Official Resources <a class="header-anchor" href="#official-resources" aria-label="Permalink to &quot;Official Resources&quot;"></a></h2><ul><li><a href="https://q.qq.com/" target="_blank" rel="noreferrer">QQ Bot Open Platform</a></li><li><a href="https://bot.q.qq.com/wiki/" target="_blank" rel="noreferrer">QQ Bot Documentation</a></li></ul>',14)])])}const h=e(r,[["render",i]]);export{u as __pageData,h as default};
+1
View File
@@ -0,0 +1 @@
import{_ as e,o,c as a,ag as n}from"./chunks/framework.BZohXCq9.js";const u=JSON.parse('{"title":"QQ Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/qq.md","filePath":"channels/qq.md","lastUpdated":1773070648000}'),r={name:"channels/qq.md"};function i(l,t,s,c,p,d){return o(),a("div",null,[...t[0]||(t[0]=[n("",14)])])}const h=e(r,[["render",i]]);export{u as __pageData,h as default};
@@ -1 +1 @@
import{_ as t,o,c as a,ag as n}from"./chunks/framework.ePeAWSvT.js";const u=JSON.parse('{"title":"Telegram Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/telegram.md","filePath":"channels/telegram.md","lastUpdated":1772359263000}'),r={name:"channels/telegram.md"};function l(i,e,s,d,g,h){return o(),a("div",null,[...e[0]||(e[0]=[n('<h1 id="telegram-channel-configuration" tabindex="-1">Telegram Channel Configuration <a class="header-anchor" href="#telegram-channel-configuration" aria-label="Permalink to &quot;Telegram Channel Configuration&quot;"></a></h1><p>This guide walks you through connecting your Memoh Bot to Telegram. Telegram is one of the most supported platforms in Memoh, featuring streaming responses, Markdown formatting, and attachment support.</p><h2 id="step-1-create-a-telegram-bot" tabindex="-1">Step 1: Create a Telegram Bot <a class="header-anchor" href="#step-1-create-a-telegram-bot" aria-label="Permalink to &quot;Step 1: Create a Telegram Bot&quot;"></a></h2><p>You need to create a bot on Telegram to get an API token.</p><ol><li>Open Telegram and search for the official <strong>@BotFather</strong> bot.</li><li>Send the <code>/newbot</code> command.</li><li>Follow the prompts: <ul><li><strong>Name</strong>: Choose a display name for your bot (e.g., <code>My Memoh Bot</code>).</li><li><strong>Username</strong>: Choose a unique username ending in <code>bot</code> (e.g., <code>my_memoh_bot</code>).</li></ul></li><li>BotFather will provide you with an <strong>API Token</strong> (e.g., <code>123456789:ABCdefGHIjklMNOpqrsTUVwxyz</code>). <strong>Keep this token secret.</strong></li></ol><blockquote><p>Official Guide: <a href="https://core.telegram.org/bots/tutorial" target="_blank" rel="noreferrer">Telegram Bot Tutorial</a></p></blockquote><h2 id="step-2-configure-memoh" tabindex="-1">Step 2: Configure Memoh <a class="header-anchor" href="#step-2-configure-memoh" aria-label="Permalink to &quot;Step 2: Configure Memoh&quot;"></a></h2><ol><li>Go to your Bot&#39;s <strong>Detail Page</strong> in the Memoh Web UI.</li><li>Select the <strong>Channels</strong> tab.</li><li>Click <strong>Add Channel</strong> and select <strong>Telegram</strong>.</li><li>Paste your <strong>API Token</strong> into the credentials field.</li><li>Click <strong>Save and Enable</strong>.</li></ol><h2 id="step-3-bind-your-identity-optional" tabindex="-1">Step 3: Bind Your Identity (Optional) <a class="header-anchor" href="#step-3-bind-your-identity-optional" aria-label="Permalink to &quot;Step 3: Bind Your Identity (Optional)&quot;"></a></h2><p>If your bot is a <code>personal</code> type bot, you need to bind your Telegram identity to your Memoh account to chat with it directly.</p><ol><li>In Memoh Web UI, go to <strong>Settings</strong> &gt; <strong>Bind Code</strong>.</li><li>Select <strong>Telegram</strong> and click <strong>Generate</strong>.</li><li>Copy the code.</li><li>Open a chat with your new bot on Telegram and send the bind code.</li><li>The bot should respond that your identity is successfully linked.</li></ol><h2 id="features-supported" tabindex="-1">Features Supported <a class="header-anchor" href="#features-supported" aria-label="Permalink to &quot;Features Supported&quot;"></a></h2><ul><li><strong>Streaming</strong>: Responses appear as the bot &quot;thinks.&quot;</li><li><strong>Markdown</strong>: Support for bold, italic, code blocks, and links.</li><li><strong>Attachments</strong>: Send images or files to the bot; the bot can also send files back.</li><li><strong>Replies</strong>: The bot understands context from message replies.</li></ul>',13)])])}const p=t(r,[["render",l]]);export{u as __pageData,p as default};
import{_ as t,o,c as a,ag as n}from"./chunks/framework.BZohXCq9.js";const u=JSON.parse('{"title":"Telegram Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/telegram.md","filePath":"channels/telegram.md","lastUpdated":1772359263000}'),r={name:"channels/telegram.md"};function l(i,e,s,d,g,h){return o(),a("div",null,[...e[0]||(e[0]=[n('<h1 id="telegram-channel-configuration" tabindex="-1">Telegram Channel Configuration <a class="header-anchor" href="#telegram-channel-configuration" aria-label="Permalink to &quot;Telegram Channel Configuration&quot;"></a></h1><p>This guide walks you through connecting your Memoh Bot to Telegram. Telegram is one of the most supported platforms in Memoh, featuring streaming responses, Markdown formatting, and attachment support.</p><h2 id="step-1-create-a-telegram-bot" tabindex="-1">Step 1: Create a Telegram Bot <a class="header-anchor" href="#step-1-create-a-telegram-bot" aria-label="Permalink to &quot;Step 1: Create a Telegram Bot&quot;"></a></h2><p>You need to create a bot on Telegram to get an API token.</p><ol><li>Open Telegram and search for the official <strong>@BotFather</strong> bot.</li><li>Send the <code>/newbot</code> command.</li><li>Follow the prompts: <ul><li><strong>Name</strong>: Choose a display name for your bot (e.g., <code>My Memoh Bot</code>).</li><li><strong>Username</strong>: Choose a unique username ending in <code>bot</code> (e.g., <code>my_memoh_bot</code>).</li></ul></li><li>BotFather will provide you with an <strong>API Token</strong> (e.g., <code>123456789:ABCdefGHIjklMNOpqrsTUVwxyz</code>). <strong>Keep this token secret.</strong></li></ol><blockquote><p>Official Guide: <a href="https://core.telegram.org/bots/tutorial" target="_blank" rel="noreferrer">Telegram Bot Tutorial</a></p></blockquote><h2 id="step-2-configure-memoh" tabindex="-1">Step 2: Configure Memoh <a class="header-anchor" href="#step-2-configure-memoh" aria-label="Permalink to &quot;Step 2: Configure Memoh&quot;"></a></h2><ol><li>Go to your Bot&#39;s <strong>Detail Page</strong> in the Memoh Web UI.</li><li>Select the <strong>Channels</strong> tab.</li><li>Click <strong>Add Channel</strong> and select <strong>Telegram</strong>.</li><li>Paste your <strong>API Token</strong> into the credentials field.</li><li>Click <strong>Save and Enable</strong>.</li></ol><h2 id="step-3-bind-your-identity-optional" tabindex="-1">Step 3: Bind Your Identity (Optional) <a class="header-anchor" href="#step-3-bind-your-identity-optional" aria-label="Permalink to &quot;Step 3: Bind Your Identity (Optional)&quot;"></a></h2><p>If your bot is a <code>personal</code> type bot, you need to bind your Telegram identity to your Memoh account to chat with it directly.</p><ol><li>In Memoh Web UI, go to <strong>Settings</strong> &gt; <strong>Bind Code</strong>.</li><li>Select <strong>Telegram</strong> and click <strong>Generate</strong>.</li><li>Copy the code.</li><li>Open a chat with your new bot on Telegram and send the bind code.</li><li>The bot should respond that your identity is successfully linked.</li></ol><h2 id="features-supported" tabindex="-1">Features Supported <a class="header-anchor" href="#features-supported" aria-label="Permalink to &quot;Features Supported&quot;"></a></h2><ul><li><strong>Streaming</strong>: Responses appear as the bot &quot;thinks.&quot;</li><li><strong>Markdown</strong>: Support for bold, italic, code blocks, and links.</li><li><strong>Attachments</strong>: Send images or files to the bot; the bot can also send files back.</li><li><strong>Replies</strong>: The bot understands context from message replies.</li></ul>',13)])])}const p=t(r,[["render",l]]);export{u as __pageData,p as default};
@@ -1 +1 @@
import{_ as t,o,c as a,ag as n}from"./chunks/framework.ePeAWSvT.js";const u=JSON.parse('{"title":"Telegram Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/telegram.md","filePath":"channels/telegram.md","lastUpdated":1772359263000}'),r={name:"channels/telegram.md"};function l(i,e,s,d,g,h){return o(),a("div",null,[...e[0]||(e[0]=[n("",13)])])}const p=t(r,[["render",l]]);export{u as __pageData,p as default};
import{_ as t,o,c as a,ag as n}from"./chunks/framework.BZohXCq9.js";const u=JSON.parse('{"title":"Telegram Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/telegram.md","filePath":"channels/telegram.md","lastUpdated":1772359263000}'),r={name:"channels/telegram.md"};function l(i,e,s,d,g,h){return o(),a("div",null,[...e[0]||(e[0]=[n("",13)])])}const p=t(r,[["render",l]]);export{u as __pageData,p as default};
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
import{_ as e,o,c as r,ag as a}from"./chunks/framework.ePeAWSvT.js";const b=JSON.parse('{"title":"Bot Management","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/bot.md","filePath":"getting-started/bot.md","lastUpdated":1772873936000}'),i={name:"getting-started/bot.md"};function n(s,t,l,d,g,h){return o(),r("div",null,[...t[0]||(t[0]=[a("",25)])])}const m=e(i,[["render",n]]);export{b as __pageData,m as default};
import{_ as e,o,c as r,ag as a}from"./chunks/framework.BZohXCq9.js";const b=JSON.parse('{"title":"Bot Management","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/bot.md","filePath":"getting-started/bot.md","lastUpdated":1772873936000}'),i={name:"getting-started/bot.md"};function n(s,t,l,d,g,h){return o(),r("div",null,[...t[0]||(t[0]=[a("",25)])])}const m=e(i,[["render",n]]);export{b as __pageData,m as default};
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
import{_ as e,o,c as r,ag as a}from"./chunks/framework.ePeAWSvT.js";const b=JSON.parse('{"title":"Browser Contexts","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/browser.md","filePath":"getting-started/browser.md","lastUpdated":1772873936000}'),n={name:"getting-started/browser.md"};function s(i,t,l,d,c,g){return o(),r("div",null,[...t[0]||(t[0]=[a("",30)])])}const p=e(n,[["render",s]]);export{b as __pageData,p as default};
import{_ as e,o,c as r,ag as a}from"./chunks/framework.BZohXCq9.js";const b=JSON.parse('{"title":"Browser Contexts","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/browser.md","filePath":"getting-started/browser.md","lastUpdated":1772873936000}'),n={name:"getting-started/browser.md"};function s(i,t,l,d,c,g){return o(),r("div",null,[...t[0]||(t[0]=[a("",30)])])}const p=e(n,[["render",s]]);export{b as __pageData,p as default};
@@ -0,0 +1 @@
import{_ as a,o as t,c as n,ag as o}from"./chunks/framework.BZohXCq9.js";const g=JSON.parse('{"title":"Bot Channels","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/channels.md","filePath":"getting-started/channels.md","lastUpdated":1773070648000}'),i={name:"getting-started/channels.md"};function r(l,e,s,h,d,c){return t(),n("div",null,[...e[0]||(e[0]=[o('<h1 id="bot-channels" tabindex="-1">Bot Channels <a class="header-anchor" href="#bot-channels" aria-label="Permalink to &quot;Bot Channels&quot;"></a></h1><p>Channels connect your Bot to various messaging platforms, allowing you to interact with it using your favorite chat applications.</p><h2 id="concept-unified-communication" tabindex="-1">Concept: Unified Communication <a class="header-anchor" href="#concept-unified-communication" aria-label="Permalink to &quot;Concept: Unified Communication&quot;"></a></h2><p>Memoh acts as a hub that bridges different messaging services. You can configure multiple channels for a single bot, enabling it to chat on Telegram, Discord, and more simultaneously.</p><hr><h2 id="supported-channels" tabindex="-1">Supported Channels <a class="header-anchor" href="#supported-channels" aria-label="Permalink to &quot;Supported Channels&quot;"></a></h2><p>Configure your bot&#39;s connections from the <strong>Channels</strong> tab in the Bot Detail page.</p><h3 id="popular-platforms" tabindex="-1">Popular Platforms <a class="header-anchor" href="#popular-platforms" aria-label="Permalink to &quot;Popular Platforms&quot;"></a></h3><p>For detailed step-by-step guides on how to create and configure bots for each platform, see:</p><ul><li><strong><a href="/channels/telegram.html">Telegram Configuration</a></strong></li><li><strong><a href="/channels/feishu.html">Feishu (Lark) Configuration</a></strong></li><li><strong><a href="/channels/discord.html">Discord Configuration</a></strong></li><li><strong><a href="/channels/qq.html">QQ Configuration</a></strong></li></ul><hr><h2 id="configuration-flow" tabindex="-1">Configuration Flow <a class="header-anchor" href="#configuration-flow" aria-label="Permalink to &quot;Configuration Flow&quot;"></a></h2><h3 id="_1-adding-a-channel" tabindex="-1">1. Adding a Channel <a class="header-anchor" href="#_1-adding-a-channel" aria-label="Permalink to &quot;1. Adding a Channel&quot;"></a></h3><ol><li>Click <strong>Add Channel</strong>.</li><li>Select the platform from the list.</li><li>Fill in the required credentials and configuration. The fields are dynamic and change based on the selected channel.</li></ol><h3 id="_2-common-fields" tabindex="-1">2. Common Fields <a class="header-anchor" href="#_2-common-fields" aria-label="Permalink to &quot;2. Common Fields&quot;"></a></h3><table tabindex="0"><thead><tr><th>Field</th><th>Description</th></tr></thead><tbody><tr><td><strong>Credentials</strong></td><td>API tokens, secrets, or bot keys provided by the platform.</td></tr><tr><td><strong>Disabled</strong></td><td>Quickly enable or disable a channel without removing its configuration.</td></tr><tr><td><strong>Routing</strong></td><td>Configure how messages are mapped between the platform and Memoh.</td></tr></tbody></table><h3 id="_3-special-case-feishu-webhook" tabindex="-1">3. Special Case: Feishu Webhook <a class="header-anchor" href="#_3-special-case-feishu-webhook" aria-label="Permalink to &quot;3. Special Case: Feishu Webhook&quot;"></a></h3><p>If using <strong>Feishu</strong> in <code>webhook</code> inbound mode:</p><ol><li>Memoh will generate a <strong>Webhook Callback URL</strong>.</li><li>Copy this URL and paste it into your Feishu App&#39;s event configuration.</li><li>This allows Feishu to send messages directly to Memoh.</li></ol><hr><h2 id="operations" tabindex="-1">Operations <a class="header-anchor" href="#operations" aria-label="Permalink to &quot;Operations&quot;"></a></h2><ul><li><strong>Save</strong>: Update the configuration.</li><li><strong>Save and Enable</strong>: Update and immediately activate the channel.</li><li><strong>Enable/Disable Toggle</strong>: Switch the channel&#39;s active status.</li><li><strong>Delete</strong>: Permanently remove a channel&#39;s configuration.</li></ul>',22)])])}const m=a(i,[["render",r]]);export{g as __pageData,m as default};
@@ -0,0 +1 @@
import{_ as a,o as t,c as n,ag as o}from"./chunks/framework.BZohXCq9.js";const g=JSON.parse('{"title":"Bot Channels","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/channels.md","filePath":"getting-started/channels.md","lastUpdated":1773070648000}'),i={name:"getting-started/channels.md"};function r(l,e,s,h,d,c){return t(),n("div",null,[...e[0]||(e[0]=[o("",22)])])}const m=a(i,[["render",r]]);export{g as __pageData,m as default};
@@ -1 +0,0 @@
import{_ as a,o as t,c as n,ag as o}from"./chunks/framework.ePeAWSvT.js";const g=JSON.parse('{"title":"Bot Channels","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/channels.md","filePath":"getting-started/channels.md","lastUpdated":1772359263000}'),i={name:"getting-started/channels.md"};function r(l,e,s,h,d,c){return t(),n("div",null,[...e[0]||(e[0]=[o('<h1 id="bot-channels" tabindex="-1">Bot Channels <a class="header-anchor" href="#bot-channels" aria-label="Permalink to &quot;Bot Channels&quot;"></a></h1><p>Channels connect your Bot to various messaging platforms, allowing you to interact with it using your favorite chat applications.</p><h2 id="concept-unified-communication" tabindex="-1">Concept: Unified Communication <a class="header-anchor" href="#concept-unified-communication" aria-label="Permalink to &quot;Concept: Unified Communication&quot;"></a></h2><p>Memoh acts as a hub that bridges different messaging services. You can configure multiple channels for a single bot, enabling it to chat on Telegram, Discord, and more simultaneously.</p><hr><h2 id="supported-channels" tabindex="-1">Supported Channels <a class="header-anchor" href="#supported-channels" aria-label="Permalink to &quot;Supported Channels&quot;"></a></h2><p>Configure your bot&#39;s connections from the <strong>Channels</strong> tab in the Bot Detail page.</p><h3 id="popular-platforms" tabindex="-1">Popular Platforms <a class="header-anchor" href="#popular-platforms" aria-label="Permalink to &quot;Popular Platforms&quot;"></a></h3><p>For detailed step-by-step guides on how to create and configure bots for each platform, see:</p><ul><li><strong><a href="/channels/telegram.html">Telegram Configuration</a></strong></li><li><strong><a href="/channels/feishu.html">Feishu (Lark) Configuration</a></strong></li><li><strong><a href="/channels/discord.html">Discord Configuration</a></strong></li></ul><hr><h2 id="configuration-flow" tabindex="-1">Configuration Flow <a class="header-anchor" href="#configuration-flow" aria-label="Permalink to &quot;Configuration Flow&quot;"></a></h2><h3 id="_1-adding-a-channel" tabindex="-1">1. Adding a Channel <a class="header-anchor" href="#_1-adding-a-channel" aria-label="Permalink to &quot;1. Adding a Channel&quot;"></a></h3><ol><li>Click <strong>Add Channel</strong>.</li><li>Select the platform from the list.</li><li>Fill in the required credentials and configuration. The fields are dynamic and change based on the selected channel.</li></ol><h3 id="_2-common-fields" tabindex="-1">2. Common Fields <a class="header-anchor" href="#_2-common-fields" aria-label="Permalink to &quot;2. Common Fields&quot;"></a></h3><table tabindex="0"><thead><tr><th>Field</th><th>Description</th></tr></thead><tbody><tr><td><strong>Credentials</strong></td><td>API tokens, secrets, or bot keys provided by the platform.</td></tr><tr><td><strong>Disabled</strong></td><td>Quickly enable or disable a channel without removing its configuration.</td></tr><tr><td><strong>Routing</strong></td><td>Configure how messages are mapped between the platform and Memoh.</td></tr></tbody></table><h3 id="_3-special-case-feishu-webhook" tabindex="-1">3. Special Case: Feishu Webhook <a class="header-anchor" href="#_3-special-case-feishu-webhook" aria-label="Permalink to &quot;3. Special Case: Feishu Webhook&quot;"></a></h3><p>If using <strong>Feishu</strong> in <code>webhook</code> inbound mode:</p><ol><li>Memoh will generate a <strong>Webhook Callback URL</strong>.</li><li>Copy this URL and paste it into your Feishu App&#39;s event configuration.</li><li>This allows Feishu to send messages directly to Memoh.</li></ol><hr><h2 id="operations" tabindex="-1">Operations <a class="header-anchor" href="#operations" aria-label="Permalink to &quot;Operations&quot;"></a></h2><ul><li><strong>Save</strong>: Update the configuration.</li><li><strong>Save and Enable</strong>: Update and immediately activate the channel.</li><li><strong>Enable/Disable Toggle</strong>: Switch the channel&#39;s active status.</li><li><strong>Delete</strong>: Permanently remove a channel&#39;s configuration.</li></ul>',22)])])}const p=a(i,[["render",r]]);export{g as __pageData,p as default};
@@ -1 +0,0 @@
import{_ as a,o as t,c as n,ag as o}from"./chunks/framework.ePeAWSvT.js";const g=JSON.parse('{"title":"Bot Channels","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/channels.md","filePath":"getting-started/channels.md","lastUpdated":1772359263000}'),i={name:"getting-started/channels.md"};function r(l,e,s,h,d,c){return t(),n("div",null,[...e[0]||(e[0]=[o("",22)])])}const p=a(i,[["render",r]]);export{g as __pageData,p as default};
@@ -1 +1 @@
import{_ as e,o as a,c as n,ag as o}from"./chunks/framework.ePeAWSvT.js";const g=JSON.parse('{"title":"Bot Container Management","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/container.md","filePath":"getting-started/container.md","lastUpdated":1772359263000}'),i={name:"getting-started/container.md"};function s(r,t,l,h,c,p){return a(),n("div",null,[...t[0]||(t[0]=[o('<h1 id="bot-container-management" tabindex="-1">Bot Container Management <a class="header-anchor" href="#bot-container-management" aria-label="Permalink to &quot;Bot Container Management&quot;"></a></h1><p>Every Bot in Memoh operates within its own isolated container environment. This isolation ensures security, provides a dedicated filesystem, and allows the bot to execute code or commands without affecting other bots or the host system.</p><h2 id="concept-the-isolated-workspace" tabindex="-1">Concept: The Isolated Workspace <a class="header-anchor" href="#concept-the-isolated-workspace" aria-label="Permalink to &quot;Concept: The Isolated Workspace&quot;"></a></h2><p>The container acts as the bot&#39;s private &quot;computer.&quot; Within it, the bot can:</p><ul><li>Store and modify files</li><li>Install software via package managers</li><li>Execute scripts</li><li>Maintain state across multiple sessions</li></ul><hr><h2 id="operations" tabindex="-1">Operations <a class="header-anchor" href="#operations" aria-label="Permalink to &quot;Operations&quot;"></a></h2><p>Manage the lifecycle of your bot&#39;s environment from the <strong>Container</strong> tab in the Bot Detail page.</p><h3 id="lifecycle-actions" tabindex="-1">Lifecycle Actions <a class="header-anchor" href="#lifecycle-actions" aria-label="Permalink to &quot;Lifecycle Actions&quot;"></a></h3><ul><li><strong>Create</strong>: Initialize the container if it doesn&#39;t exist (using the configured image).</li><li><strong>Start</strong>: Launch the container. The bot must have a running container to perform many operations like file editing or executing tools.</li><li><strong>Stop</strong>: Gracefully shut down the container to save resources.</li><li><strong>Delete</strong>: Remove the container instance. This will delete the temporary state but preserve the data in persistent volumes.</li></ul><hr><h2 id="container-information" tabindex="-1">Container Information <a class="header-anchor" href="#container-information" aria-label="Permalink to &quot;Container Information&quot;"></a></h2><p>The <strong>Container</strong> tab displays real-time data about the bot&#39;s runtime:</p><ul><li><strong>Container ID</strong>: Unique identifier for the instance.</li><li><strong>Status</strong>: Whether it&#39;s currently running, stopped, or creating.</li><li><strong>Image</strong>: The Docker/Containerd image used as the base.</li><li><strong>Paths</strong>: Host and container paths for data persistence.</li><li><strong>Tasks</strong>: Number of active background tasks running in the container.</li></ul><hr><h2 id="snapshots" tabindex="-1">Snapshots <a class="header-anchor" href="#snapshots" aria-label="Permalink to &quot;Snapshots&quot;"></a></h2><p>Snapshots allow you to capture the current state of the bot&#39;s container and restore it later. This is useful for:</p><ul><li>Saving a known good configuration</li><li>Versioning the bot&#39;s environment</li><li>Testing complex changes safely</li></ul><h3 id="creating-a-snapshot" tabindex="-1">Creating a Snapshot <a class="header-anchor" href="#creating-a-snapshot" aria-label="Permalink to &quot;Creating a Snapshot&quot;"></a></h3><ol><li>Ensure the container is stopped or in a stable state.</li><li>Click <strong>Create Snapshot</strong>.</li><li>Provide a name for the snapshot.</li></ol><h3 id="restoring-a-snapshot" tabindex="-1">Restoring a Snapshot <a class="header-anchor" href="#restoring-a-snapshot" aria-label="Permalink to &quot;Restoring a Snapshot&quot;"></a></h3><ul><li>Find the desired snapshot in the list and click <strong>Restore</strong>. This will reset the container to the captured state.</li></ul><h3 id="managing-snapshots" tabindex="-1">Managing Snapshots <a class="header-anchor" href="#managing-snapshots" aria-label="Permalink to &quot;Managing Snapshots&quot;"></a></h3><ul><li>View a list of existing snapshots with their creation timestamps and parent relationships.</li><li>Use the <strong>Delete</strong> button next to a snapshot to remove it.</li></ul>',24)])])}const u=e(i,[["render",s]]);export{g as __pageData,u as default};
import{_ as e,o as a,c as n,ag as o}from"./chunks/framework.BZohXCq9.js";const g=JSON.parse('{"title":"Bot Container Management","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/container.md","filePath":"getting-started/container.md","lastUpdated":1772359263000}'),i={name:"getting-started/container.md"};function s(r,t,l,h,c,p){return a(),n("div",null,[...t[0]||(t[0]=[o('<h1 id="bot-container-management" tabindex="-1">Bot Container Management <a class="header-anchor" href="#bot-container-management" aria-label="Permalink to &quot;Bot Container Management&quot;"></a></h1><p>Every Bot in Memoh operates within its own isolated container environment. This isolation ensures security, provides a dedicated filesystem, and allows the bot to execute code or commands without affecting other bots or the host system.</p><h2 id="concept-the-isolated-workspace" tabindex="-1">Concept: The Isolated Workspace <a class="header-anchor" href="#concept-the-isolated-workspace" aria-label="Permalink to &quot;Concept: The Isolated Workspace&quot;"></a></h2><p>The container acts as the bot&#39;s private &quot;computer.&quot; Within it, the bot can:</p><ul><li>Store and modify files</li><li>Install software via package managers</li><li>Execute scripts</li><li>Maintain state across multiple sessions</li></ul><hr><h2 id="operations" tabindex="-1">Operations <a class="header-anchor" href="#operations" aria-label="Permalink to &quot;Operations&quot;"></a></h2><p>Manage the lifecycle of your bot&#39;s environment from the <strong>Container</strong> tab in the Bot Detail page.</p><h3 id="lifecycle-actions" tabindex="-1">Lifecycle Actions <a class="header-anchor" href="#lifecycle-actions" aria-label="Permalink to &quot;Lifecycle Actions&quot;"></a></h3><ul><li><strong>Create</strong>: Initialize the container if it doesn&#39;t exist (using the configured image).</li><li><strong>Start</strong>: Launch the container. The bot must have a running container to perform many operations like file editing or executing tools.</li><li><strong>Stop</strong>: Gracefully shut down the container to save resources.</li><li><strong>Delete</strong>: Remove the container instance. This will delete the temporary state but preserve the data in persistent volumes.</li></ul><hr><h2 id="container-information" tabindex="-1">Container Information <a class="header-anchor" href="#container-information" aria-label="Permalink to &quot;Container Information&quot;"></a></h2><p>The <strong>Container</strong> tab displays real-time data about the bot&#39;s runtime:</p><ul><li><strong>Container ID</strong>: Unique identifier for the instance.</li><li><strong>Status</strong>: Whether it&#39;s currently running, stopped, or creating.</li><li><strong>Image</strong>: The Docker/Containerd image used as the base.</li><li><strong>Paths</strong>: Host and container paths for data persistence.</li><li><strong>Tasks</strong>: Number of active background tasks running in the container.</li></ul><hr><h2 id="snapshots" tabindex="-1">Snapshots <a class="header-anchor" href="#snapshots" aria-label="Permalink to &quot;Snapshots&quot;"></a></h2><p>Snapshots allow you to capture the current state of the bot&#39;s container and restore it later. This is useful for:</p><ul><li>Saving a known good configuration</li><li>Versioning the bot&#39;s environment</li><li>Testing complex changes safely</li></ul><h3 id="creating-a-snapshot" tabindex="-1">Creating a Snapshot <a class="header-anchor" href="#creating-a-snapshot" aria-label="Permalink to &quot;Creating a Snapshot&quot;"></a></h3><ol><li>Ensure the container is stopped or in a stable state.</li><li>Click <strong>Create Snapshot</strong>.</li><li>Provide a name for the snapshot.</li></ol><h3 id="restoring-a-snapshot" tabindex="-1">Restoring a Snapshot <a class="header-anchor" href="#restoring-a-snapshot" aria-label="Permalink to &quot;Restoring a Snapshot&quot;"></a></h3><ul><li>Find the desired snapshot in the list and click <strong>Restore</strong>. This will reset the container to the captured state.</li></ul><h3 id="managing-snapshots" tabindex="-1">Managing Snapshots <a class="header-anchor" href="#managing-snapshots" aria-label="Permalink to &quot;Managing Snapshots&quot;"></a></h3><ul><li>View a list of existing snapshots with their creation timestamps and parent relationships.</li><li>Use the <strong>Delete</strong> button next to a snapshot to remove it.</li></ul>',24)])])}const u=e(i,[["render",s]]);export{g as __pageData,u as default};
@@ -1 +1 @@
import{_ as e,o as a,c as n,ag as o}from"./chunks/framework.ePeAWSvT.js";const g=JSON.parse('{"title":"Bot Container Management","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/container.md","filePath":"getting-started/container.md","lastUpdated":1772359263000}'),i={name:"getting-started/container.md"};function s(r,t,l,h,c,p){return a(),n("div",null,[...t[0]||(t[0]=[o("",24)])])}const u=e(i,[["render",s]]);export{g as __pageData,u as default};
import{_ as e,o as a,c as n,ag as o}from"./chunks/framework.BZohXCq9.js";const g=JSON.parse('{"title":"Bot Container Management","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/container.md","filePath":"getting-started/container.md","lastUpdated":1772359263000}'),i={name:"getting-started/container.md"};function s(r,t,l,h,c,p){return a(),n("div",null,[...t[0]||(t[0]=[o("",24)])])}const u=e(i,[["render",s]]);export{g as __pageData,u as default};
@@ -1 +1 @@
import{_ as i,o as a,c as o,ag as t}from"./chunks/framework.ePeAWSvT.js";const m=JSON.parse('{"title":"Email Providers and Bindings","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/email.md","filePath":"getting-started/email.md","lastUpdated":1772359263000}'),n={name:"getting-started/email.md"};function r(l,e,s,d,g,c){return a(),o("div",null,[...e[0]||(e[0]=[t('<h1 id="email-providers-and-bindings" tabindex="-1">Email Providers and Bindings <a class="header-anchor" href="#email-providers-and-bindings" aria-label="Permalink to &quot;Email Providers and Bindings&quot;"></a></h1><p>Memoh allows your Bot to send and receive emails, providing another powerful channel for communication and task management.</p><h2 id="concept-email-as-a-bot-channel" tabindex="-1">Concept: Email as a Bot Channel <a class="header-anchor" href="#concept-email-as-a-bot-channel" aria-label="Permalink to &quot;Concept: Email as a Bot Channel&quot;"></a></h2><p>Connecting email to your Bot involves two steps:</p><ol><li><strong>Email Provider</strong>: Configure a connection to an email service (like Mailgun or a generic SMTP server).</li><li><strong>Email Binding</strong>: Link a specific email address from a provider to a Bot.</li></ol><hr><h2 id="email-provider" tabindex="-1">Email Provider <a class="header-anchor" href="#email-provider" aria-label="Permalink to &quot;Email Provider&quot;"></a></h2><p>Manage your email service connections from the <strong>Email Provider</strong> page in the sidebar.</p><h3 id="creating-a-provider" tabindex="-1">Creating a Provider <a class="header-anchor" href="#creating-a-provider" aria-label="Permalink to &quot;Creating a Provider&quot;"></a></h3><ol><li>Navigate to the <strong>Email Provider</strong> page from the sidebar.</li><li>Click <strong>Add Email Provider</strong>.</li><li>Choose the provider type: <ul><li><strong>Mailgun</strong>: For high-volume delivery.</li><li><strong>Generic SMTP</strong>: For traditional email servers.</li></ul></li><li>Fill in the required fields (e.g., <code>domain</code>, <code>api_key</code>, <code>host</code>, <code>port</code>, <code>username</code>, <code>password</code>).</li><li>Click <strong>Create</strong>.</li></ol><hr><h2 id="bot-email-bindings" tabindex="-1">Bot Email Bindings <a class="header-anchor" href="#bot-email-bindings" aria-label="Permalink to &quot;Bot Email Bindings&quot;"></a></h2><p>Configure your bot&#39;s email capabilities from the <strong>Email</strong> tab in the Bot Detail page.</p><h3 id="adding-a-binding" tabindex="-1">Adding a Binding <a class="header-anchor" href="#adding-a-binding" aria-label="Permalink to &quot;Adding a Binding&quot;"></a></h3><ol><li>Click <strong>Add Binding</strong>.</li><li>Select the <strong>Email Provider</strong> you created.</li><li>Provide the <strong>Email Address</strong> to be associated with the bot.</li><li>Set the bot&#39;s permissions: <ul><li><strong>Can Read</strong>: If enabled, the bot can check and process incoming emails.</li><li><strong>Can Write</strong>: If enabled, the bot can compose and send outgoing emails.</li><li><strong>Can Delete</strong>: If enabled, the bot can manage its own email inbox.</li></ul></li><li>Click <strong>Create</strong>.</li></ol><hr><h2 id="outbox-and-history" tabindex="-1">Outbox and History <a class="header-anchor" href="#outbox-and-history" aria-label="Permalink to &quot;Outbox and History&quot;"></a></h2><p>The <strong>Email</strong> tab also provides an <strong>Outbox</strong> showing an audit log of all emails sent by the bot:</p><ul><li><strong>To</strong>: The recipient&#39;s email address.</li><li><strong>Subject</strong>: The email&#39;s subject line.</li><li><strong>Status</strong>: Whether the email was sent successfully.</li><li><strong>Sent At</strong>: The timestamp of the email delivery.</li></ul><hr><h2 id="bot-interaction" tabindex="-1">Bot Interaction <a class="header-anchor" href="#bot-interaction" aria-label="Permalink to &quot;Bot Interaction&quot;"></a></h2><ul><li>The bot can use its email permissions to <strong>send reports</strong>, <strong>respond to user inquiries</strong>, or <strong>trigger actions</strong> based on incoming mail.</li><li>Outgoing emails are tracked in the outbox for monitoring and troubleshooting.</li><li>The bot handles email in a structured way, allowing it to &quot;converse&quot; via email just as it does via chat.</li></ul>',22)])])}const u=i(n,[["render",r]]);export{m as __pageData,u as default};
import{_ as i,o as a,c as o,ag as t}from"./chunks/framework.BZohXCq9.js";const m=JSON.parse('{"title":"Email Providers and Bindings","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/email.md","filePath":"getting-started/email.md","lastUpdated":1772359263000}'),n={name:"getting-started/email.md"};function r(l,e,s,d,g,c){return a(),o("div",null,[...e[0]||(e[0]=[t('<h1 id="email-providers-and-bindings" tabindex="-1">Email Providers and Bindings <a class="header-anchor" href="#email-providers-and-bindings" aria-label="Permalink to &quot;Email Providers and Bindings&quot;"></a></h1><p>Memoh allows your Bot to send and receive emails, providing another powerful channel for communication and task management.</p><h2 id="concept-email-as-a-bot-channel" tabindex="-1">Concept: Email as a Bot Channel <a class="header-anchor" href="#concept-email-as-a-bot-channel" aria-label="Permalink to &quot;Concept: Email as a Bot Channel&quot;"></a></h2><p>Connecting email to your Bot involves two steps:</p><ol><li><strong>Email Provider</strong>: Configure a connection to an email service (like Mailgun or a generic SMTP server).</li><li><strong>Email Binding</strong>: Link a specific email address from a provider to a Bot.</li></ol><hr><h2 id="email-provider" tabindex="-1">Email Provider <a class="header-anchor" href="#email-provider" aria-label="Permalink to &quot;Email Provider&quot;"></a></h2><p>Manage your email service connections from the <strong>Email Provider</strong> page in the sidebar.</p><h3 id="creating-a-provider" tabindex="-1">Creating a Provider <a class="header-anchor" href="#creating-a-provider" aria-label="Permalink to &quot;Creating a Provider&quot;"></a></h3><ol><li>Navigate to the <strong>Email Provider</strong> page from the sidebar.</li><li>Click <strong>Add Email Provider</strong>.</li><li>Choose the provider type: <ul><li><strong>Mailgun</strong>: For high-volume delivery.</li><li><strong>Generic SMTP</strong>: For traditional email servers.</li></ul></li><li>Fill in the required fields (e.g., <code>domain</code>, <code>api_key</code>, <code>host</code>, <code>port</code>, <code>username</code>, <code>password</code>).</li><li>Click <strong>Create</strong>.</li></ol><hr><h2 id="bot-email-bindings" tabindex="-1">Bot Email Bindings <a class="header-anchor" href="#bot-email-bindings" aria-label="Permalink to &quot;Bot Email Bindings&quot;"></a></h2><p>Configure your bot&#39;s email capabilities from the <strong>Email</strong> tab in the Bot Detail page.</p><h3 id="adding-a-binding" tabindex="-1">Adding a Binding <a class="header-anchor" href="#adding-a-binding" aria-label="Permalink to &quot;Adding a Binding&quot;"></a></h3><ol><li>Click <strong>Add Binding</strong>.</li><li>Select the <strong>Email Provider</strong> you created.</li><li>Provide the <strong>Email Address</strong> to be associated with the bot.</li><li>Set the bot&#39;s permissions: <ul><li><strong>Can Read</strong>: If enabled, the bot can check and process incoming emails.</li><li><strong>Can Write</strong>: If enabled, the bot can compose and send outgoing emails.</li><li><strong>Can Delete</strong>: If enabled, the bot can manage its own email inbox.</li></ul></li><li>Click <strong>Create</strong>.</li></ol><hr><h2 id="outbox-and-history" tabindex="-1">Outbox and History <a class="header-anchor" href="#outbox-and-history" aria-label="Permalink to &quot;Outbox and History&quot;"></a></h2><p>The <strong>Email</strong> tab also provides an <strong>Outbox</strong> showing an audit log of all emails sent by the bot:</p><ul><li><strong>To</strong>: The recipient&#39;s email address.</li><li><strong>Subject</strong>: The email&#39;s subject line.</li><li><strong>Status</strong>: Whether the email was sent successfully.</li><li><strong>Sent At</strong>: The timestamp of the email delivery.</li></ul><hr><h2 id="bot-interaction" tabindex="-1">Bot Interaction <a class="header-anchor" href="#bot-interaction" aria-label="Permalink to &quot;Bot Interaction&quot;"></a></h2><ul><li>The bot can use its email permissions to <strong>send reports</strong>, <strong>respond to user inquiries</strong>, or <strong>trigger actions</strong> based on incoming mail.</li><li>Outgoing emails are tracked in the outbox for monitoring and troubleshooting.</li><li>The bot handles email in a structured way, allowing it to &quot;converse&quot; via email just as it does via chat.</li></ul>',22)])])}const u=i(n,[["render",r]]);export{m as __pageData,u as default};
@@ -1 +1 @@
import{_ as i,o as a,c as o,ag as t}from"./chunks/framework.ePeAWSvT.js";const m=JSON.parse('{"title":"Email Providers and Bindings","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/email.md","filePath":"getting-started/email.md","lastUpdated":1772359263000}'),n={name:"getting-started/email.md"};function r(l,e,s,d,g,c){return a(),o("div",null,[...e[0]||(e[0]=[t("",22)])])}const u=i(n,[["render",r]]);export{m as __pageData,u as default};
import{_ as i,o as a,c as o,ag as t}from"./chunks/framework.BZohXCq9.js";const m=JSON.parse('{"title":"Email Providers and Bindings","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/email.md","filePath":"getting-started/email.md","lastUpdated":1772359263000}'),n={name:"getting-started/email.md"};function r(l,e,s,d,g,c){return a(),o("div",null,[...e[0]||(e[0]=[t("",22)])])}const u=i(n,[["render",r]]);export{m as __pageData,u as default};
@@ -1 +1 @@
import{_ as t,o as i,c as a,ag as o}from"./chunks/framework.ePeAWSvT.js";const m=JSON.parse('{"title":"Bot Files Management","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/files.md","filePath":"getting-started/files.md","lastUpdated":1772359263000}'),n={name:"getting-started/files.md"};function r(s,e,l,g,d,h){return i(),a("div",null,[...e[0]||(e[0]=[o('<h1 id="bot-files-management" tabindex="-1">Bot Files Management <a class="header-anchor" href="#bot-files-management" aria-label="Permalink to &quot;Bot Files Management&quot;"></a></h1><p>Every Memoh Bot has its own dedicated filesystem inside its isolated container. You can manage this filesystem directly from the <strong>Files</strong> tab in the Bot Detail page.</p><hr><h2 id="operations" tabindex="-1">Operations <a class="header-anchor" href="#operations" aria-label="Permalink to &quot;Operations&quot;"></a></h2><p>The <strong>FileManager</strong> component provides a familiar file-browsing experience with a toolbar, directory tree, and integrated editor.</p><h3 id="browsing-and-navigation" tabindex="-1">Browsing and Navigation <a class="header-anchor" href="#browsing-and-navigation" aria-label="Permalink to &quot;Browsing and Navigation&quot;"></a></h3><ul><li><strong>Breadcrumb Navigation</strong>: Quickly move between parent directories.</li><li><strong>Refresh</strong>: Reload the file list to see the latest changes (e.g., files created by the bot).</li><li><strong>New Folder</strong>: Create a directory within the current path.</li></ul><h3 id="managing-files" tabindex="-1">Managing Files <a class="header-anchor" href="#managing-files" aria-label="Permalink to &quot;Managing Files&quot;"></a></h3><ul><li><strong>Upload</strong>: Select files from your local computer to transfer them into the bot&#39;s container.</li><li><strong>Rename</strong>: Click on a file or folder and use the rename action to update its identifier.</li><li><strong>Delete</strong>: Remove files or folders (with recursive support for directories).</li><li><strong>Download</strong>: Retrieve a file from the bot&#39;s container back to your local machine.</li></ul><hr><h2 id="viewing-and-editing" tabindex="-1">Viewing and Editing <a class="header-anchor" href="#viewing-and-editing" aria-label="Permalink to &quot;Viewing and Editing&quot;"></a></h2><p>The integrated <strong>FileViewer</strong> allows you to interact with the bot&#39;s files without leaving the web UI.</p><h3 id="text-files" tabindex="-1">Text Files <a class="header-anchor" href="#text-files" aria-label="Permalink to &quot;Text Files&quot;"></a></h3><ul><li><strong>Read/Edit</strong>: Click a text file (e.g., <code>.md</code>, <code>.js</code>, <code>.py</code>, <code>.toml</code>) to open it in the built-in <strong>Monaco Editor</strong>.</li><li><strong>Syntax Highlighting</strong>: Supports common programming languages and configuration formats.</li><li><strong>Save</strong>: Modify the file&#39;s content and click <strong>Save</strong> to apply the changes to the bot&#39;s filesystem.</li></ul><h3 id="images" tabindex="-1">Images <a class="header-anchor" href="#images" aria-label="Permalink to &quot;Images&quot;"></a></h3><ul><li><strong>Preview</strong>: Click an image file (e.g., <code>.png</code>, <code>.jpg</code>, <code>.webp</code>) to see a visual preview directly in the file manager.</li></ul><hr><h2 id="bot-interaction-with-files" tabindex="-1">Bot Interaction with Files <a class="header-anchor" href="#bot-interaction-with-files" aria-label="Permalink to &quot;Bot Interaction with Files&quot;"></a></h2><p>Remember that the bot itself can also perform these operations:</p><ul><li>Use its <strong>Skills</strong> or <strong>MCP tools</strong> to read, write, and manage its own files.</li><li>The <strong>Files</strong> tab is your portal to monitor and manually intervene in the bot&#39;s workspace.</li></ul>',20)])])}const f=t(n,[["render",r]]);export{m as __pageData,f as default};
import{_ as t,o as i,c as a,ag as o}from"./chunks/framework.BZohXCq9.js";const m=JSON.parse('{"title":"Bot Files Management","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/files.md","filePath":"getting-started/files.md","lastUpdated":1772359263000}'),n={name:"getting-started/files.md"};function r(s,e,l,g,d,h){return i(),a("div",null,[...e[0]||(e[0]=[o('<h1 id="bot-files-management" tabindex="-1">Bot Files Management <a class="header-anchor" href="#bot-files-management" aria-label="Permalink to &quot;Bot Files Management&quot;"></a></h1><p>Every Memoh Bot has its own dedicated filesystem inside its isolated container. You can manage this filesystem directly from the <strong>Files</strong> tab in the Bot Detail page.</p><hr><h2 id="operations" tabindex="-1">Operations <a class="header-anchor" href="#operations" aria-label="Permalink to &quot;Operations&quot;"></a></h2><p>The <strong>FileManager</strong> component provides a familiar file-browsing experience with a toolbar, directory tree, and integrated editor.</p><h3 id="browsing-and-navigation" tabindex="-1">Browsing and Navigation <a class="header-anchor" href="#browsing-and-navigation" aria-label="Permalink to &quot;Browsing and Navigation&quot;"></a></h3><ul><li><strong>Breadcrumb Navigation</strong>: Quickly move between parent directories.</li><li><strong>Refresh</strong>: Reload the file list to see the latest changes (e.g., files created by the bot).</li><li><strong>New Folder</strong>: Create a directory within the current path.</li></ul><h3 id="managing-files" tabindex="-1">Managing Files <a class="header-anchor" href="#managing-files" aria-label="Permalink to &quot;Managing Files&quot;"></a></h3><ul><li><strong>Upload</strong>: Select files from your local computer to transfer them into the bot&#39;s container.</li><li><strong>Rename</strong>: Click on a file or folder and use the rename action to update its identifier.</li><li><strong>Delete</strong>: Remove files or folders (with recursive support for directories).</li><li><strong>Download</strong>: Retrieve a file from the bot&#39;s container back to your local machine.</li></ul><hr><h2 id="viewing-and-editing" tabindex="-1">Viewing and Editing <a class="header-anchor" href="#viewing-and-editing" aria-label="Permalink to &quot;Viewing and Editing&quot;"></a></h2><p>The integrated <strong>FileViewer</strong> allows you to interact with the bot&#39;s files without leaving the web UI.</p><h3 id="text-files" tabindex="-1">Text Files <a class="header-anchor" href="#text-files" aria-label="Permalink to &quot;Text Files&quot;"></a></h3><ul><li><strong>Read/Edit</strong>: Click a text file (e.g., <code>.md</code>, <code>.js</code>, <code>.py</code>, <code>.toml</code>) to open it in the built-in <strong>Monaco Editor</strong>.</li><li><strong>Syntax Highlighting</strong>: Supports common programming languages and configuration formats.</li><li><strong>Save</strong>: Modify the file&#39;s content and click <strong>Save</strong> to apply the changes to the bot&#39;s filesystem.</li></ul><h3 id="images" tabindex="-1">Images <a class="header-anchor" href="#images" aria-label="Permalink to &quot;Images&quot;"></a></h3><ul><li><strong>Preview</strong>: Click an image file (e.g., <code>.png</code>, <code>.jpg</code>, <code>.webp</code>) to see a visual preview directly in the file manager.</li></ul><hr><h2 id="bot-interaction-with-files" tabindex="-1">Bot Interaction with Files <a class="header-anchor" href="#bot-interaction-with-files" aria-label="Permalink to &quot;Bot Interaction with Files&quot;"></a></h2><p>Remember that the bot itself can also perform these operations:</p><ul><li>Use its <strong>Skills</strong> or <strong>MCP tools</strong> to read, write, and manage its own files.</li><li>The <strong>Files</strong> tab is your portal to monitor and manually intervene in the bot&#39;s workspace.</li></ul>',20)])])}const f=t(n,[["render",r]]);export{m as __pageData,f as default};
@@ -1 +1 @@
import{_ as t,o as i,c as a,ag as o}from"./chunks/framework.ePeAWSvT.js";const m=JSON.parse('{"title":"Bot Files Management","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/files.md","filePath":"getting-started/files.md","lastUpdated":1772359263000}'),n={name:"getting-started/files.md"};function r(s,e,l,g,d,h){return i(),a("div",null,[...e[0]||(e[0]=[o("",20)])])}const f=t(n,[["render",r]]);export{m as __pageData,f as default};
import{_ as t,o as i,c as a,ag as o}from"./chunks/framework.BZohXCq9.js";const m=JSON.parse('{"title":"Bot Files Management","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/files.md","filePath":"getting-started/files.md","lastUpdated":1772359263000}'),n={name:"getting-started/files.md"};function r(s,e,l,g,d,h){return i(),a("div",null,[...e[0]||(e[0]=[o("",20)])])}const f=t(n,[["render",r]]);export{m as __pageData,f as default};
@@ -1 +1 @@
import{_ as e,o,c as a,ag as r}from"./chunks/framework.ePeAWSvT.js";const c=JSON.parse('{"title":"Bot Heartbeat","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/heartbeat.md","filePath":"getting-started/heartbeat.md","lastUpdated":1772359263000}'),n={name:"getting-started/heartbeat.md"};function i(s,t,l,h,d,g){return o(),a("div",null,[...t[0]||(t[0]=[r('<h1 id="bot-heartbeat" tabindex="-1">Bot Heartbeat <a class="header-anchor" href="#bot-heartbeat" aria-label="Permalink to &quot;Bot Heartbeat&quot;"></a></h1><p>The <strong>Heartbeat</strong> feature allows you to schedule periodic tasks for your Bot, enabling it to perform autonomous actions even when you aren&#39;t chatting with it.</p><h2 id="concept-scheduled-autonomy" tabindex="-1">Concept: Scheduled Autonomy <a class="header-anchor" href="#concept-scheduled-autonomy" aria-label="Permalink to &quot;Concept: Scheduled Autonomy&quot;"></a></h2><p>A <strong>Heartbeat</strong> is a recurring trigger that prompts the bot to &quot;think&quot; and execute its skills or tools at a set interval. This is useful for:</p><ul><li>Periodic status checks</li><li>Automatic data collection</li><li>Cleaning up the filesystem</li><li>Sending scheduled notifications</li></ul><hr><h2 id="configuration" tabindex="-1">Configuration <a class="header-anchor" href="#configuration" aria-label="Permalink to &quot;Configuration&quot;"></a></h2><p>Configure the heartbeat from the <strong>Heartbeat</strong> tab in the Bot Detail page.</p><table tabindex="0"><thead><tr><th>Field</th><th>Description</th></tr></thead><tbody><tr><td><strong>Enabled</strong></td><td>Toggle the heartbeat on or off.</td></tr><tr><td><strong>Interval</strong></td><td>How often (in minutes) the heartbeat should trigger. The default is <strong>30 minutes</strong>.</td></tr><tr><td><strong>Model</strong></td><td>The LLM used to execute the heartbeat task. This can be different from the main chat model.</td></tr></tbody></table><hr><h2 id="logs-and-monitoring" tabindex="-1">Logs and Monitoring <a class="header-anchor" href="#logs-and-monitoring" aria-label="Permalink to &quot;Logs and Monitoring&quot;"></a></h2><p>The Heartbeat tab provides a detailed audit log of every execution:</p><ul><li><strong>Status</strong>: Whether the heartbeat completed successfully (<code>ok</code>), encountered an issue (<code>alert</code>), or failed (<code>error</code>).</li><li><strong>Time</strong>: When the heartbeat was triggered.</li><li><strong>Duration</strong>: How long the bot took to process the task.</li><li><strong>Result</strong>: A summary of the bot&#39;s action or response during that heartbeat.</li></ul><h3 id="managing-logs" tabindex="-1">Managing Logs <a class="header-anchor" href="#managing-logs" aria-label="Permalink to &quot;Managing Logs&quot;"></a></h3><ul><li><strong>Filter by Status</strong>: Quickly find errors or alerts.</li><li><strong>Refresh</strong>: Load the latest log entries.</li><li><strong>Clear Logs</strong>: Remove old heartbeat records to keep the interface clean.</li><li><strong>Load More</strong>: View older history.</li></ul><hr><h2 id="bot-interaction" tabindex="-1">Bot Interaction <a class="header-anchor" href="#bot-interaction" aria-label="Permalink to &quot;Bot Interaction&quot;"></a></h2><ul><li>During a heartbeat, the bot receives a special system prompt that it should perform its &quot;routine&quot; tasks.</li><li>The bot can use any of its assigned <strong>Skills</strong> or <strong>MCP tools</strong> during a heartbeat.</li><li>Heartbeat logs provide the &quot;memory&quot; of the bot&#39;s autonomous activities.</li></ul>',18)])])}const b=e(n,[["render",i]]);export{c as __pageData,b as default};
import{_ as e,o,c as a,ag as r}from"./chunks/framework.BZohXCq9.js";const c=JSON.parse('{"title":"Bot Heartbeat","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/heartbeat.md","filePath":"getting-started/heartbeat.md","lastUpdated":1772359263000}'),n={name:"getting-started/heartbeat.md"};function i(s,t,l,h,d,g){return o(),a("div",null,[...t[0]||(t[0]=[r('<h1 id="bot-heartbeat" tabindex="-1">Bot Heartbeat <a class="header-anchor" href="#bot-heartbeat" aria-label="Permalink to &quot;Bot Heartbeat&quot;"></a></h1><p>The <strong>Heartbeat</strong> feature allows you to schedule periodic tasks for your Bot, enabling it to perform autonomous actions even when you aren&#39;t chatting with it.</p><h2 id="concept-scheduled-autonomy" tabindex="-1">Concept: Scheduled Autonomy <a class="header-anchor" href="#concept-scheduled-autonomy" aria-label="Permalink to &quot;Concept: Scheduled Autonomy&quot;"></a></h2><p>A <strong>Heartbeat</strong> is a recurring trigger that prompts the bot to &quot;think&quot; and execute its skills or tools at a set interval. This is useful for:</p><ul><li>Periodic status checks</li><li>Automatic data collection</li><li>Cleaning up the filesystem</li><li>Sending scheduled notifications</li></ul><hr><h2 id="configuration" tabindex="-1">Configuration <a class="header-anchor" href="#configuration" aria-label="Permalink to &quot;Configuration&quot;"></a></h2><p>Configure the heartbeat from the <strong>Heartbeat</strong> tab in the Bot Detail page.</p><table tabindex="0"><thead><tr><th>Field</th><th>Description</th></tr></thead><tbody><tr><td><strong>Enabled</strong></td><td>Toggle the heartbeat on or off.</td></tr><tr><td><strong>Interval</strong></td><td>How often (in minutes) the heartbeat should trigger. The default is <strong>30 minutes</strong>.</td></tr><tr><td><strong>Model</strong></td><td>The LLM used to execute the heartbeat task. This can be different from the main chat model.</td></tr></tbody></table><hr><h2 id="logs-and-monitoring" tabindex="-1">Logs and Monitoring <a class="header-anchor" href="#logs-and-monitoring" aria-label="Permalink to &quot;Logs and Monitoring&quot;"></a></h2><p>The Heartbeat tab provides a detailed audit log of every execution:</p><ul><li><strong>Status</strong>: Whether the heartbeat completed successfully (<code>ok</code>), encountered an issue (<code>alert</code>), or failed (<code>error</code>).</li><li><strong>Time</strong>: When the heartbeat was triggered.</li><li><strong>Duration</strong>: How long the bot took to process the task.</li><li><strong>Result</strong>: A summary of the bot&#39;s action or response during that heartbeat.</li></ul><h3 id="managing-logs" tabindex="-1">Managing Logs <a class="header-anchor" href="#managing-logs" aria-label="Permalink to &quot;Managing Logs&quot;"></a></h3><ul><li><strong>Filter by Status</strong>: Quickly find errors or alerts.</li><li><strong>Refresh</strong>: Load the latest log entries.</li><li><strong>Clear Logs</strong>: Remove old heartbeat records to keep the interface clean.</li><li><strong>Load More</strong>: View older history.</li></ul><hr><h2 id="bot-interaction" tabindex="-1">Bot Interaction <a class="header-anchor" href="#bot-interaction" aria-label="Permalink to &quot;Bot Interaction&quot;"></a></h2><ul><li>During a heartbeat, the bot receives a special system prompt that it should perform its &quot;routine&quot; tasks.</li><li>The bot can use any of its assigned <strong>Skills</strong> or <strong>MCP tools</strong> during a heartbeat.</li><li>Heartbeat logs provide the &quot;memory&quot; of the bot&#39;s autonomous activities.</li></ul>',18)])])}const b=e(n,[["render",i]]);export{c as __pageData,b as default};
@@ -1 +1 @@
import{_ as e,o,c as a,ag as r}from"./chunks/framework.ePeAWSvT.js";const c=JSON.parse('{"title":"Bot Heartbeat","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/heartbeat.md","filePath":"getting-started/heartbeat.md","lastUpdated":1772359263000}'),n={name:"getting-started/heartbeat.md"};function i(s,t,l,h,d,g){return o(),a("div",null,[...t[0]||(t[0]=[r("",18)])])}const b=e(n,[["render",i]]);export{c as __pageData,b as default};
import{_ as e,o,c as a,ag as r}from"./chunks/framework.BZohXCq9.js";const c=JSON.parse('{"title":"Bot Heartbeat","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/heartbeat.md","filePath":"getting-started/heartbeat.md","lastUpdated":1772359263000}'),n={name:"getting-started/heartbeat.md"};function i(s,t,l,h,d,g){return o(),a("div",null,[...t[0]||(t[0]=[r("",18)])])}const b=e(n,[["render",i]]);export{c as __pageData,b as default};
@@ -1 +1 @@
import{_ as e,o,c as n,ag as r}from"./chunks/framework.ePeAWSvT.js";const g=JSON.parse('{"title":"MCP Connections","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/mcp.md","filePath":"getting-started/mcp.md","lastUpdated":1772359263000}'),a={name:"getting-started/mcp.md"};function s(i,t,c,d,l,h){return o(),n("div",null,[...t[0]||(t[0]=[r('<h1 id="mcp-connections" tabindex="-1">MCP Connections <a class="header-anchor" href="#mcp-connections" aria-label="Permalink to &quot;MCP Connections&quot;"></a></h1><p>Memoh fully supports the <strong>Model Context Protocol (MCP)</strong>, allowing you to connect your Bot to external tool services and context providers.</p><h2 id="concept-extending-bot-capabilities" tabindex="-1">Concept: Extending Bot Capabilities <a class="header-anchor" href="#concept-extending-bot-capabilities" aria-label="Permalink to &quot;Concept: Extending Bot Capabilities&quot;"></a></h2><p>MCP provides a standardized way for bots to access external data sources and tools. Each Bot can have its own independent set of MCP connections.</p><hr><h2 id="connection-types" tabindex="-1">Connection Types <a class="header-anchor" href="#connection-types" aria-label="Permalink to &quot;Connection Types&quot;"></a></h2><p>Configure MCP connections from the <strong>MCP</strong> tab in the Bot Detail page.</p><h3 id="_1-stdio-local-process" tabindex="-1">1. Stdio (Local Process) <a class="header-anchor" href="#_1-stdio-local-process" aria-label="Permalink to &quot;1. Stdio (Local Process)&quot;"></a></h3><p>This type of connection executes a local command on the server and communicates via standard input/output.</p><table tabindex="0"><thead><tr><th>Field</th><th>Description</th></tr></thead><tbody><tr><td><strong>Command</strong></td><td>The executable to run (e.g., <code>npx</code>, <code>python3</code>).</td></tr><tr><td><strong>Arguments</strong></td><td>A list of command-line arguments (e.g., <code>-y</code>, <code>@modelcontextprotocol/server-filesystem</code>, <code>/opt/memoh/data</code>).</td></tr><tr><td><strong>Env</strong></td><td>Key-value pairs for environment variables.</td></tr><tr><td><strong>CWD</strong></td><td>Working directory for the process.</td></tr></tbody></table><h3 id="_2-remote-http-sse" tabindex="-1">2. Remote (HTTP/SSE) <a class="header-anchor" href="#_2-remote-http-sse" aria-label="Permalink to &quot;2. Remote (HTTP/SSE)&quot;"></a></h3><p>This type of connection connects to a remote MCP server over the network.</p><table tabindex="0"><thead><tr><th>Field</th><th>Description</th></tr></thead><tbody><tr><td><strong>URL</strong></td><td>The endpoint of the remote MCP server.</td></tr><tr><td><strong>Headers</strong></td><td>Custom HTTP headers (e.g., for authentication).</td></tr><tr><td><strong>Transport</strong></td><td>Choose between <code>http</code> or <code>sse</code> (Server-Sent Events).</td></tr></tbody></table><hr><h2 id="operations" tabindex="-1">Operations <a class="header-anchor" href="#operations" aria-label="Permalink to &quot;Operations&quot;"></a></h2><ul><li><strong>Add Connection</strong>: Click <strong>Add</strong>, choose the type, and fill in the configuration.</li><li><strong>Import JSON</strong>: Use the <strong>Import</strong> button to quickly add multiple connections from a standard <code>mcpServers</code> JSON config file.</li><li><strong>Toggle Active</strong>: Enable or disable specific connections without deleting them.</li><li><strong>Search</strong>: Quickly find a connection by name or ID.</li><li><strong>Export</strong>: Export a connection configuration to a JSON file.</li></ul><hr><h2 id="bot-interaction" tabindex="-1">Bot Interaction <a class="header-anchor" href="#bot-interaction" aria-label="Permalink to &quot;Bot Interaction&quot;"></a></h2><p>Once an MCP connection is active, the bot will automatically:</p><ul><li>Discover the tools and resources exposed by the MCP server.</li><li>Use these tools to perform tasks requested by the user.</li><li>Include the context provided by the MCP server in its reasoning process.</li></ul>',20)])])}const m=e(a,[["render",s]]);export{g as __pageData,m as default};
import{_ as e,o,c as n,ag as r}from"./chunks/framework.BZohXCq9.js";const g=JSON.parse('{"title":"MCP Connections","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/mcp.md","filePath":"getting-started/mcp.md","lastUpdated":1772359263000}'),a={name:"getting-started/mcp.md"};function s(i,t,c,d,l,h){return o(),n("div",null,[...t[0]||(t[0]=[r('<h1 id="mcp-connections" tabindex="-1">MCP Connections <a class="header-anchor" href="#mcp-connections" aria-label="Permalink to &quot;MCP Connections&quot;"></a></h1><p>Memoh fully supports the <strong>Model Context Protocol (MCP)</strong>, allowing you to connect your Bot to external tool services and context providers.</p><h2 id="concept-extending-bot-capabilities" tabindex="-1">Concept: Extending Bot Capabilities <a class="header-anchor" href="#concept-extending-bot-capabilities" aria-label="Permalink to &quot;Concept: Extending Bot Capabilities&quot;"></a></h2><p>MCP provides a standardized way for bots to access external data sources and tools. Each Bot can have its own independent set of MCP connections.</p><hr><h2 id="connection-types" tabindex="-1">Connection Types <a class="header-anchor" href="#connection-types" aria-label="Permalink to &quot;Connection Types&quot;"></a></h2><p>Configure MCP connections from the <strong>MCP</strong> tab in the Bot Detail page.</p><h3 id="_1-stdio-local-process" tabindex="-1">1. Stdio (Local Process) <a class="header-anchor" href="#_1-stdio-local-process" aria-label="Permalink to &quot;1. Stdio (Local Process)&quot;"></a></h3><p>This type of connection executes a local command on the server and communicates via standard input/output.</p><table tabindex="0"><thead><tr><th>Field</th><th>Description</th></tr></thead><tbody><tr><td><strong>Command</strong></td><td>The executable to run (e.g., <code>npx</code>, <code>python3</code>).</td></tr><tr><td><strong>Arguments</strong></td><td>A list of command-line arguments (e.g., <code>-y</code>, <code>@modelcontextprotocol/server-filesystem</code>, <code>/opt/memoh/data</code>).</td></tr><tr><td><strong>Env</strong></td><td>Key-value pairs for environment variables.</td></tr><tr><td><strong>CWD</strong></td><td>Working directory for the process.</td></tr></tbody></table><h3 id="_2-remote-http-sse" tabindex="-1">2. Remote (HTTP/SSE) <a class="header-anchor" href="#_2-remote-http-sse" aria-label="Permalink to &quot;2. Remote (HTTP/SSE)&quot;"></a></h3><p>This type of connection connects to a remote MCP server over the network.</p><table tabindex="0"><thead><tr><th>Field</th><th>Description</th></tr></thead><tbody><tr><td><strong>URL</strong></td><td>The endpoint of the remote MCP server.</td></tr><tr><td><strong>Headers</strong></td><td>Custom HTTP headers (e.g., for authentication).</td></tr><tr><td><strong>Transport</strong></td><td>Choose between <code>http</code> or <code>sse</code> (Server-Sent Events).</td></tr></tbody></table><hr><h2 id="operations" tabindex="-1">Operations <a class="header-anchor" href="#operations" aria-label="Permalink to &quot;Operations&quot;"></a></h2><ul><li><strong>Add Connection</strong>: Click <strong>Add</strong>, choose the type, and fill in the configuration.</li><li><strong>Import JSON</strong>: Use the <strong>Import</strong> button to quickly add multiple connections from a standard <code>mcpServers</code> JSON config file.</li><li><strong>Toggle Active</strong>: Enable or disable specific connections without deleting them.</li><li><strong>Search</strong>: Quickly find a connection by name or ID.</li><li><strong>Export</strong>: Export a connection configuration to a JSON file.</li></ul><hr><h2 id="bot-interaction" tabindex="-1">Bot Interaction <a class="header-anchor" href="#bot-interaction" aria-label="Permalink to &quot;Bot Interaction&quot;"></a></h2><p>Once an MCP connection is active, the bot will automatically:</p><ul><li>Discover the tools and resources exposed by the MCP server.</li><li>Use these tools to perform tasks requested by the user.</li><li>Include the context provided by the MCP server in its reasoning process.</li></ul>',20)])])}const m=e(a,[["render",s]]);export{g as __pageData,m as default};
@@ -1 +1 @@
import{_ as e,o,c as n,ag as r}from"./chunks/framework.ePeAWSvT.js";const g=JSON.parse('{"title":"MCP Connections","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/mcp.md","filePath":"getting-started/mcp.md","lastUpdated":1772359263000}'),a={name:"getting-started/mcp.md"};function s(i,t,c,d,l,h){return o(),n("div",null,[...t[0]||(t[0]=[r("",20)])])}const m=e(a,[["render",s]]);export{g as __pageData,m as default};
import{_ as e,o,c as n,ag as r}from"./chunks/framework.BZohXCq9.js";const g=JSON.parse('{"title":"MCP Connections","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/mcp.md","filePath":"getting-started/mcp.md","lastUpdated":1772359263000}'),a={name:"getting-started/mcp.md"};function s(i,t,c,d,l,h){return o(),n("div",null,[...t[0]||(t[0]=[r("",20)])])}const m=e(a,[["render",s]]);export{g as __pageData,m as default};
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
import{_ as t,o,c as r,ag as a}from"./chunks/framework.ePeAWSvT.js";const u=JSON.parse('{"title":"Bot Memory Management","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/memory.md","filePath":"getting-started/memory.md","lastUpdated":1772873936000}'),i={name:"getting-started/memory.md"};function n(s,e,m,l,c,h){return o(),r("div",null,[...e[0]||(e[0]=[a("",30)])])}const g=t(i,[["render",n]]);export{u as __pageData,g as default};
import{_ as t,o,c as r,ag as a}from"./chunks/framework.BZohXCq9.js";const u=JSON.parse('{"title":"Bot Memory Management","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/memory.md","filePath":"getting-started/memory.md","lastUpdated":1772873936000}'),i={name:"getting-started/memory.md"};function n(s,e,m,l,c,h){return o(),r("div",null,[...e[0]||(e[0]=[a("",30)])])}const g=t(i,[["render",n]]);export{u as __pageData,g as default};
@@ -1 +1 @@
import{_ as t,o,c as r,ag as d}from"./chunks/framework.ePeAWSvT.js";const p=JSON.parse('{"title":"LLM Provider and Model","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/provider-and-model.md","filePath":"getting-started/provider-and-model.md","lastUpdated":1772359263000}'),a={name:"getting-started/provider-and-model.md"};function i(n,e,l,s,g,h){return o(),r("div",null,[...e[0]||(e[0]=[d('<h1 id="llm-provider-and-model" tabindex="-1">LLM Provider and Model <a class="header-anchor" href="#llm-provider-and-model" aria-label="Permalink to &quot;LLM Provider and Model&quot;"></a></h1><p>To use Memoh, you first need to configure at least one LLM Provider and at least one Model.</p><h2 id="llm-provider" tabindex="-1">LLM Provider <a class="header-anchor" href="#llm-provider" aria-label="Permalink to &quot;LLM Provider&quot;"></a></h2><p>An LLM Provider represents a connection to an AI service (like OpenAI, Anthropic, or a self-hosted compatible API). It stores the base URL and authentication credentials.</p><h3 id="creating-a-provider" tabindex="-1">Creating a Provider <a class="header-anchor" href="#creating-a-provider" aria-label="Permalink to &quot;Creating a Provider&quot;"></a></h3><ol><li>Navigate to the <strong>Models</strong> page from the sidebar.</li><li>Click the <strong>Add Provider</strong> button at the bottom of the sidebar.</li><li>Fill in the following fields: <ul><li><strong>Name</strong>: A display name for this provider (e.g., &quot;OpenAI&quot;).</li><li><strong>Base URL</strong>: The root URL of the API (e.g., <code>https://api.openai.com/v1</code>).</li><li><strong>API Key</strong>: Your authentication token for the service.</li></ul></li><li>Click <strong>Create</strong>.</li></ol><h3 id="managing-providers" tabindex="-1">Managing Providers <a class="header-anchor" href="#managing-providers" aria-label="Permalink to &quot;Managing Providers&quot;"></a></h3><ul><li><strong>Edit</strong>: Select a provider from the list and use the form on the right to update its name, URL, or API key.</li><li><strong>Delete</strong>: Use the <strong>Delete Provider</strong> button in the provider settings form.</li></ul><hr><h2 id="model" tabindex="-1">Model <a class="header-anchor" href="#model" aria-label="Permalink to &quot;Model&quot;"></a></h2><p>A Model is a specific AI instance (like <code>gpt-4o</code> or <code>text-embedding-3-small</code>) that belongs to a Provider. Memoh distinguishes between <strong>Chat</strong> models (for conversation) and <strong>Embedding</strong> models (for memory search).</p><h3 id="adding-a-model" tabindex="-1">Adding a Model <a class="header-anchor" href="#adding-a-model" aria-label="Permalink to &quot;Adding a Model&quot;"></a></h3><ol><li>Select a Provider from the list on the <strong>Models</strong> page.</li><li>Click <strong>Add Model</strong> in the model list section.</li><li>Configure the following fields:</li></ol><table tabindex="0"><thead><tr><th>Field</th><th>Required</th><th>Description</th></tr></thead><tbody><tr><td><strong>Type</strong></td><td>Yes</td><td><code>chat</code> for conversation, <code>embedding</code> for vector search.</td></tr><tr><td><strong>Model ID</strong></td><td>Yes</td><td>The exact identifier used by the provider (e.g., <code>gpt-4o</code>).</td></tr><tr><td><strong>Name</strong></td><td>No</td><td>A friendly display name (defaults to Model ID).</td></tr><tr><td><strong>Client Type</strong></td><td>Yes (Chat)</td><td>The API protocol: <code>openai-responses</code>, <code>openai-completions</code>, <code>anthropic-messages</code>, or <code>google-generative-ai</code>.</td></tr><tr><td><strong>Input Modalities</strong></td><td>Yes (Chat)</td><td>Capabilities supported: <code>text</code> (default), <code>image</code>, <code>audio</code>, <code>video</code>, <code>file</code>.</td></tr><tr><td><strong>Supports Reasoning</strong></td><td>No</td><td>Enable if the model supports internal reasoning steps (e.g., OpenAI o1).</td></tr><tr><td><strong>Dimensions</strong></td><td>Yes (Embed)</td><td>The vector size for embedding models (e.g., 1536).</td></tr></tbody></table><ol start="4"><li>Click <strong>Create</strong>.</li></ol><h3 id="managing-models" tabindex="-1">Managing Models <a class="header-anchor" href="#managing-models" aria-label="Permalink to &quot;Managing Models&quot;"></a></h3><ul><li><strong>Edit</strong>: Click the edit icon next to a model in the list.</li><li><strong>Delete</strong>: Click the trash icon next to a model to remove it.</li></ul><hr><h2 id="next-steps" tabindex="-1">Next Steps <a class="header-anchor" href="#next-steps" aria-label="Permalink to &quot;Next Steps&quot;"></a></h2><p>Now that you have configured your models, you can proceed to <a href="/getting-started/bot.html">Create and Configure a Bot</a>.</p>',20)])])}const m=t(a,[["render",i]]);export{p as __pageData,m as default};
import{_ as t,o,c as r,ag as d}from"./chunks/framework.BZohXCq9.js";const p=JSON.parse('{"title":"LLM Provider and Model","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/provider-and-model.md","filePath":"getting-started/provider-and-model.md","lastUpdated":1772359263000}'),a={name:"getting-started/provider-and-model.md"};function i(n,e,l,s,g,h){return o(),r("div",null,[...e[0]||(e[0]=[d('<h1 id="llm-provider-and-model" tabindex="-1">LLM Provider and Model <a class="header-anchor" href="#llm-provider-and-model" aria-label="Permalink to &quot;LLM Provider and Model&quot;"></a></h1><p>To use Memoh, you first need to configure at least one LLM Provider and at least one Model.</p><h2 id="llm-provider" tabindex="-1">LLM Provider <a class="header-anchor" href="#llm-provider" aria-label="Permalink to &quot;LLM Provider&quot;"></a></h2><p>An LLM Provider represents a connection to an AI service (like OpenAI, Anthropic, or a self-hosted compatible API). It stores the base URL and authentication credentials.</p><h3 id="creating-a-provider" tabindex="-1">Creating a Provider <a class="header-anchor" href="#creating-a-provider" aria-label="Permalink to &quot;Creating a Provider&quot;"></a></h3><ol><li>Navigate to the <strong>Models</strong> page from the sidebar.</li><li>Click the <strong>Add Provider</strong> button at the bottom of the sidebar.</li><li>Fill in the following fields: <ul><li><strong>Name</strong>: A display name for this provider (e.g., &quot;OpenAI&quot;).</li><li><strong>Base URL</strong>: The root URL of the API (e.g., <code>https://api.openai.com/v1</code>).</li><li><strong>API Key</strong>: Your authentication token for the service.</li></ul></li><li>Click <strong>Create</strong>.</li></ol><h3 id="managing-providers" tabindex="-1">Managing Providers <a class="header-anchor" href="#managing-providers" aria-label="Permalink to &quot;Managing Providers&quot;"></a></h3><ul><li><strong>Edit</strong>: Select a provider from the list and use the form on the right to update its name, URL, or API key.</li><li><strong>Delete</strong>: Use the <strong>Delete Provider</strong> button in the provider settings form.</li></ul><hr><h2 id="model" tabindex="-1">Model <a class="header-anchor" href="#model" aria-label="Permalink to &quot;Model&quot;"></a></h2><p>A Model is a specific AI instance (like <code>gpt-4o</code> or <code>text-embedding-3-small</code>) that belongs to a Provider. Memoh distinguishes between <strong>Chat</strong> models (for conversation) and <strong>Embedding</strong> models (for memory search).</p><h3 id="adding-a-model" tabindex="-1">Adding a Model <a class="header-anchor" href="#adding-a-model" aria-label="Permalink to &quot;Adding a Model&quot;"></a></h3><ol><li>Select a Provider from the list on the <strong>Models</strong> page.</li><li>Click <strong>Add Model</strong> in the model list section.</li><li>Configure the following fields:</li></ol><table tabindex="0"><thead><tr><th>Field</th><th>Required</th><th>Description</th></tr></thead><tbody><tr><td><strong>Type</strong></td><td>Yes</td><td><code>chat</code> for conversation, <code>embedding</code> for vector search.</td></tr><tr><td><strong>Model ID</strong></td><td>Yes</td><td>The exact identifier used by the provider (e.g., <code>gpt-4o</code>).</td></tr><tr><td><strong>Name</strong></td><td>No</td><td>A friendly display name (defaults to Model ID).</td></tr><tr><td><strong>Client Type</strong></td><td>Yes (Chat)</td><td>The API protocol: <code>openai-responses</code>, <code>openai-completions</code>, <code>anthropic-messages</code>, or <code>google-generative-ai</code>.</td></tr><tr><td><strong>Input Modalities</strong></td><td>Yes (Chat)</td><td>Capabilities supported: <code>text</code> (default), <code>image</code>, <code>audio</code>, <code>video</code>, <code>file</code>.</td></tr><tr><td><strong>Supports Reasoning</strong></td><td>No</td><td>Enable if the model supports internal reasoning steps (e.g., OpenAI o1).</td></tr><tr><td><strong>Dimensions</strong></td><td>Yes (Embed)</td><td>The vector size for embedding models (e.g., 1536).</td></tr></tbody></table><ol start="4"><li>Click <strong>Create</strong>.</li></ol><h3 id="managing-models" tabindex="-1">Managing Models <a class="header-anchor" href="#managing-models" aria-label="Permalink to &quot;Managing Models&quot;"></a></h3><ul><li><strong>Edit</strong>: Click the edit icon next to a model in the list.</li><li><strong>Delete</strong>: Click the trash icon next to a model to remove it.</li></ul><hr><h2 id="next-steps" tabindex="-1">Next Steps <a class="header-anchor" href="#next-steps" aria-label="Permalink to &quot;Next Steps&quot;"></a></h2><p>Now that you have configured your models, you can proceed to <a href="/getting-started/bot.html">Create and Configure a Bot</a>.</p>',20)])])}const m=t(a,[["render",i]]);export{p as __pageData,m as default};
@@ -1 +1 @@
import{_ as t,o,c as r,ag as d}from"./chunks/framework.ePeAWSvT.js";const p=JSON.parse('{"title":"LLM Provider and Model","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/provider-and-model.md","filePath":"getting-started/provider-and-model.md","lastUpdated":1772359263000}'),a={name:"getting-started/provider-and-model.md"};function i(n,e,l,s,g,h){return o(),r("div",null,[...e[0]||(e[0]=[d("",20)])])}const m=t(a,[["render",i]]);export{p as __pageData,m as default};
import{_ as t,o,c as r,ag as d}from"./chunks/framework.BZohXCq9.js";const p=JSON.parse('{"title":"LLM Provider and Model","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/provider-and-model.md","filePath":"getting-started/provider-and-model.md","lastUpdated":1772359263000}'),a={name:"getting-started/provider-and-model.md"};function i(n,e,l,s,g,h){return o(),r("div",null,[...e[0]||(e[0]=[d("",20)])])}const m=t(a,[["render",i]]);export{p as __pageData,m as default};
@@ -1,4 +1,4 @@
import{_ as t,o as a,c as s,ag as n}from"./chunks/framework.ePeAWSvT.js";const u=JSON.parse('{"title":"Scheduled Tasks","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/schedule.md","filePath":"getting-started/schedule.md","lastUpdated":1772359263000}'),i={name:"getting-started/schedule.md"};function r(o,e,l,d,h,c){return a(),s("div",null,[...e[0]||(e[0]=[n(`<h1 id="scheduled-tasks" tabindex="-1">Scheduled Tasks <a class="header-anchor" href="#scheduled-tasks" aria-label="Permalink to &quot;Scheduled Tasks&quot;"></a></h1><p>Scheduled Tasks allow you to automate recurring bot actions using cron expressions. This is useful for sending periodic reports, checking external data, performing maintenance, or triggering any routine task without manual intervention.</p><h2 id="concept-cron-based-automation" tabindex="-1">Concept: Cron-Based Automation <a class="header-anchor" href="#concept-cron-based-automation" aria-label="Permalink to &quot;Concept: Cron-Based Automation&quot;"></a></h2><p>A <strong>Schedule</strong> is a cron-triggered rule bound to a specific bot. When a schedule fires, it sends a command to the agent, which executes it using its available tools, skills, and context. The bot can then deliver results to any connected channel.</p><hr><h2 id="schedule-fields" tabindex="-1">Schedule Fields <a class="header-anchor" href="#schedule-fields" aria-label="Permalink to &quot;Schedule Fields&quot;"></a></h2><table tabindex="0"><thead><tr><th>Field</th><th>Description</th></tr></thead><tbody><tr><td><strong>Name</strong></td><td>A display name for the task (e.g., &quot;Morning News Summary&quot;).</td></tr><tr><td><strong>Description</strong></td><td>A brief explanation of what the task does.</td></tr><tr><td><strong>Pattern</strong></td><td>A cron expression that defines when the task runs (e.g., <code>0 9 * * *</code> for daily at 9:00 AM).</td></tr><tr><td><strong>Command</strong></td><td>The natural-language instruction sent to the agent when the schedule triggers (e.g., &quot;Summarize today&#39;s top tech news and send it to the Telegram channel&quot;).</td></tr><tr><td><strong>Enabled</strong></td><td>Whether the schedule is currently active.</td></tr><tr><td><strong>Max Calls</strong></td><td>Optional limit on the total number of executions. Leave empty for unlimited.</td></tr><tr><td><strong>Current Calls</strong></td><td>The number of times this schedule has already fired.</td></tr></tbody></table><hr><h2 id="cron-pattern-reference" tabindex="-1">Cron Pattern Reference <a class="header-anchor" href="#cron-pattern-reference" aria-label="Permalink to &quot;Cron Pattern Reference&quot;"></a></h2><p>The <code>pattern</code> field uses standard cron syntax with five fields:</p><div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>┌───────────── minute (059)</span></span>
import{_ as t,o as a,c as s,ag as n}from"./chunks/framework.BZohXCq9.js";const u=JSON.parse('{"title":"Scheduled Tasks","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/schedule.md","filePath":"getting-started/schedule.md","lastUpdated":1772359263000}'),i={name:"getting-started/schedule.md"};function r(o,e,l,d,h,c){return a(),s("div",null,[...e[0]||(e[0]=[n(`<h1 id="scheduled-tasks" tabindex="-1">Scheduled Tasks <a class="header-anchor" href="#scheduled-tasks" aria-label="Permalink to &quot;Scheduled Tasks&quot;"></a></h1><p>Scheduled Tasks allow you to automate recurring bot actions using cron expressions. This is useful for sending periodic reports, checking external data, performing maintenance, or triggering any routine task without manual intervention.</p><h2 id="concept-cron-based-automation" tabindex="-1">Concept: Cron-Based Automation <a class="header-anchor" href="#concept-cron-based-automation" aria-label="Permalink to &quot;Concept: Cron-Based Automation&quot;"></a></h2><p>A <strong>Schedule</strong> is a cron-triggered rule bound to a specific bot. When a schedule fires, it sends a command to the agent, which executes it using its available tools, skills, and context. The bot can then deliver results to any connected channel.</p><hr><h2 id="schedule-fields" tabindex="-1">Schedule Fields <a class="header-anchor" href="#schedule-fields" aria-label="Permalink to &quot;Schedule Fields&quot;"></a></h2><table tabindex="0"><thead><tr><th>Field</th><th>Description</th></tr></thead><tbody><tr><td><strong>Name</strong></td><td>A display name for the task (e.g., &quot;Morning News Summary&quot;).</td></tr><tr><td><strong>Description</strong></td><td>A brief explanation of what the task does.</td></tr><tr><td><strong>Pattern</strong></td><td>A cron expression that defines when the task runs (e.g., <code>0 9 * * *</code> for daily at 9:00 AM).</td></tr><tr><td><strong>Command</strong></td><td>The natural-language instruction sent to the agent when the schedule triggers (e.g., &quot;Summarize today&#39;s top tech news and send it to the Telegram channel&quot;).</td></tr><tr><td><strong>Enabled</strong></td><td>Whether the schedule is currently active.</td></tr><tr><td><strong>Max Calls</strong></td><td>Optional limit on the total number of executions. Leave empty for unlimited.</td></tr><tr><td><strong>Current Calls</strong></td><td>The number of times this schedule has already fired.</td></tr></tbody></table><hr><h2 id="cron-pattern-reference" tabindex="-1">Cron Pattern Reference <a class="header-anchor" href="#cron-pattern-reference" aria-label="Permalink to &quot;Cron Pattern Reference&quot;"></a></h2><p>The <code>pattern</code> field uses standard cron syntax with five fields:</p><div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>┌───────────── minute (059)</span></span>
<span class="line"><span> hour (023)</span></span>
<span class="line"><span> day of month (131)</span></span>
<span class="line"><span> month (112)</span></span>
@@ -1 +1 @@
import{_ as t,o as a,c as s,ag as n}from"./chunks/framework.ePeAWSvT.js";const u=JSON.parse('{"title":"Scheduled Tasks","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/schedule.md","filePath":"getting-started/schedule.md","lastUpdated":1772359263000}'),i={name:"getting-started/schedule.md"};function r(o,e,l,d,h,c){return a(),s("div",null,[...e[0]||(e[0]=[n("",35)])])}const g=t(i,[["render",r]]);export{u as __pageData,g as default};
import{_ as t,o as a,c as s,ag as n}from"./chunks/framework.BZohXCq9.js";const u=JSON.parse('{"title":"Scheduled Tasks","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/schedule.md","filePath":"getting-started/schedule.md","lastUpdated":1772359263000}'),i={name:"getting-started/schedule.md"};function r(o,e,l,d,h,c){return a(),s("div",null,[...e[0]||(e[0]=[n("",35)])])}const g=t(i,[["render",r]]);export{u as __pageData,g as default};
@@ -1 +1 @@
import{_ as r,o as t,c as o,ag as a}from"./chunks/framework.ePeAWSvT.js";const u=JSON.parse('{"title":"Search Providers","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/search-provider.md","filePath":"getting-started/search-provider.md","lastUpdated":1772359263000}'),i={name:"getting-started/search-provider.md"};function n(s,e,d,l,c,h){return t(),o("div",null,[...e[0]||(e[0]=[a('<h1 id="search-providers" tabindex="-1">Search Providers <a class="header-anchor" href="#search-providers" aria-label="Permalink to &quot;Search Providers&quot;"></a></h1><p>Memoh allows you to connect your Bot to various search engines, enabling it to browse the web for real-time information and external knowledge.</p><h2 id="concept-real-time-knowledge" tabindex="-1">Concept: Real-Time Knowledge <a class="header-anchor" href="#concept-real-time-knowledge" aria-label="Permalink to &quot;Concept: Real-Time Knowledge&quot;"></a></h2><p>A <strong>Search Provider</strong> is a connection to a specific search API (like Brave, Google, or Bing). Once configured, it becomes a tool that your Bot can use during conversation.</p><hr><h2 id="supported-search-engines" tabindex="-1">Supported Search Engines <a class="header-anchor" href="#supported-search-engines" aria-label="Permalink to &quot;Supported Search Engines&quot;"></a></h2><p>Configure your search engines from the <strong>Search Provider</strong> page in the sidebar.</p><table tabindex="0"><thead><tr><th>Supported Engines</th><th>Notes</th></tr></thead><tbody><tr><td><strong>Brave</strong></td><td>Highly recommended for privacy and performance.</td></tr><tr><td><strong>Bing</strong></td><td>Powerful global search capability.</td></tr><tr><td><strong>Google</strong></td><td>Comprehensive web search.</td></tr><tr><td><strong>Tavily</strong></td><td>Designed specifically for AI-powered research.</td></tr><tr><td><strong>SearxNG</strong></td><td>Connect to your own self-hosted search aggregator.</td></tr><tr><td><strong>DuckDuckGo</strong></td><td>Privacy-focused search.</td></tr><tr><td><strong>Other Providers</strong></td><td>Sogou, Serper, Jina, Exa, Bocha, Yandex.</td></tr></tbody></table><hr><h2 id="configuration-flow" tabindex="-1">Configuration Flow <a class="header-anchor" href="#configuration-flow" aria-label="Permalink to &quot;Configuration Flow&quot;"></a></h2><h3 id="_1-adding-a-search-provider" tabindex="-1">1. Adding a Search Provider <a class="header-anchor" href="#_1-adding-a-search-provider" aria-label="Permalink to &quot;1. Adding a Search Provider&quot;"></a></h3><ol><li>Navigate to the <strong>Search Provider</strong> page from the sidebar.</li><li>Click <strong>Add Search Provider</strong>.</li><li>Fill in the following: <ul><li><strong>Name</strong>: A friendly name (e.g., &quot;My Brave Search&quot;).</li><li><strong>API Key</strong>: Your credentials for the specific search engine API.</li><li><strong>Other Parameters</strong>: Depending on the engine, you may need to specify additional settings (e.g., <code>base_url</code> for SearxNG).</li></ul></li></ol><h3 id="_2-managing-providers" tabindex="-1">2. Managing Providers <a class="header-anchor" href="#_2-managing-providers" aria-label="Permalink to &quot;2. Managing Providers&quot;"></a></h3><ul><li><strong>Edit</strong>: Select a provider from the sidebar and update its configuration in the form on the right.</li><li><strong>Delete</strong>: Use the <strong>Delete Provider</strong> button in the provider settings form.</li></ul><hr><h2 id="assigning-a-search-provider-to-a-bot" tabindex="-1">Assigning a Search Provider to a Bot <a class="header-anchor" href="#assigning-a-search-provider-to-a-bot" aria-label="Permalink to &quot;Assigning a Search Provider to a Bot&quot;"></a></h2><ol><li>Navigate to the <strong>Bots</strong> page and select your bot.</li><li>Go to the <strong>Settings</strong> tab.</li><li>Find the <strong>Search Provider</strong> dropdown and select the provider you created.</li><li>Click <strong>Save</strong>.</li></ol><hr><h2 id="bot-interaction" tabindex="-1">Bot Interaction <a class="header-anchor" href="#bot-interaction" aria-label="Permalink to &quot;Bot Interaction&quot;"></a></h2><ul><li>When a user&#39;s question requires real-time information, the bot will automatically call its assigned <strong>Search Provider</strong>.</li><li>The bot will process the search results to provide a grounded and accurate response.</li><li>Multiple search results can be synthesized to provide a comprehensive answer.</li></ul>',20)])])}const p=r(i,[["render",n]]);export{u as __pageData,p as default};
import{_ as r,o as t,c as o,ag as a}from"./chunks/framework.BZohXCq9.js";const u=JSON.parse('{"title":"Search Providers","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/search-provider.md","filePath":"getting-started/search-provider.md","lastUpdated":1772359263000}'),i={name:"getting-started/search-provider.md"};function n(s,e,d,l,c,h){return t(),o("div",null,[...e[0]||(e[0]=[a('<h1 id="search-providers" tabindex="-1">Search Providers <a class="header-anchor" href="#search-providers" aria-label="Permalink to &quot;Search Providers&quot;"></a></h1><p>Memoh allows you to connect your Bot to various search engines, enabling it to browse the web for real-time information and external knowledge.</p><h2 id="concept-real-time-knowledge" tabindex="-1">Concept: Real-Time Knowledge <a class="header-anchor" href="#concept-real-time-knowledge" aria-label="Permalink to &quot;Concept: Real-Time Knowledge&quot;"></a></h2><p>A <strong>Search Provider</strong> is a connection to a specific search API (like Brave, Google, or Bing). Once configured, it becomes a tool that your Bot can use during conversation.</p><hr><h2 id="supported-search-engines" tabindex="-1">Supported Search Engines <a class="header-anchor" href="#supported-search-engines" aria-label="Permalink to &quot;Supported Search Engines&quot;"></a></h2><p>Configure your search engines from the <strong>Search Provider</strong> page in the sidebar.</p><table tabindex="0"><thead><tr><th>Supported Engines</th><th>Notes</th></tr></thead><tbody><tr><td><strong>Brave</strong></td><td>Highly recommended for privacy and performance.</td></tr><tr><td><strong>Bing</strong></td><td>Powerful global search capability.</td></tr><tr><td><strong>Google</strong></td><td>Comprehensive web search.</td></tr><tr><td><strong>Tavily</strong></td><td>Designed specifically for AI-powered research.</td></tr><tr><td><strong>SearxNG</strong></td><td>Connect to your own self-hosted search aggregator.</td></tr><tr><td><strong>DuckDuckGo</strong></td><td>Privacy-focused search.</td></tr><tr><td><strong>Other Providers</strong></td><td>Sogou, Serper, Jina, Exa, Bocha, Yandex.</td></tr></tbody></table><hr><h2 id="configuration-flow" tabindex="-1">Configuration Flow <a class="header-anchor" href="#configuration-flow" aria-label="Permalink to &quot;Configuration Flow&quot;"></a></h2><h3 id="_1-adding-a-search-provider" tabindex="-1">1. Adding a Search Provider <a class="header-anchor" href="#_1-adding-a-search-provider" aria-label="Permalink to &quot;1. Adding a Search Provider&quot;"></a></h3><ol><li>Navigate to the <strong>Search Provider</strong> page from the sidebar.</li><li>Click <strong>Add Search Provider</strong>.</li><li>Fill in the following: <ul><li><strong>Name</strong>: A friendly name (e.g., &quot;My Brave Search&quot;).</li><li><strong>API Key</strong>: Your credentials for the specific search engine API.</li><li><strong>Other Parameters</strong>: Depending on the engine, you may need to specify additional settings (e.g., <code>base_url</code> for SearxNG).</li></ul></li></ol><h3 id="_2-managing-providers" tabindex="-1">2. Managing Providers <a class="header-anchor" href="#_2-managing-providers" aria-label="Permalink to &quot;2. Managing Providers&quot;"></a></h3><ul><li><strong>Edit</strong>: Select a provider from the sidebar and update its configuration in the form on the right.</li><li><strong>Delete</strong>: Use the <strong>Delete Provider</strong> button in the provider settings form.</li></ul><hr><h2 id="assigning-a-search-provider-to-a-bot" tabindex="-1">Assigning a Search Provider to a Bot <a class="header-anchor" href="#assigning-a-search-provider-to-a-bot" aria-label="Permalink to &quot;Assigning a Search Provider to a Bot&quot;"></a></h2><ol><li>Navigate to the <strong>Bots</strong> page and select your bot.</li><li>Go to the <strong>Settings</strong> tab.</li><li>Find the <strong>Search Provider</strong> dropdown and select the provider you created.</li><li>Click <strong>Save</strong>.</li></ol><hr><h2 id="bot-interaction" tabindex="-1">Bot Interaction <a class="header-anchor" href="#bot-interaction" aria-label="Permalink to &quot;Bot Interaction&quot;"></a></h2><ul><li>When a user&#39;s question requires real-time information, the bot will automatically call its assigned <strong>Search Provider</strong>.</li><li>The bot will process the search results to provide a grounded and accurate response.</li><li>Multiple search results can be synthesized to provide a comprehensive answer.</li></ul>',20)])])}const p=r(i,[["render",n]]);export{u as __pageData,p as default};
@@ -1 +1 @@
import{_ as r,o as t,c as o,ag as a}from"./chunks/framework.ePeAWSvT.js";const u=JSON.parse('{"title":"Search Providers","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/search-provider.md","filePath":"getting-started/search-provider.md","lastUpdated":1772359263000}'),i={name:"getting-started/search-provider.md"};function n(s,e,d,l,c,h){return t(),o("div",null,[...e[0]||(e[0]=[a("",20)])])}const p=r(i,[["render",n]]);export{u as __pageData,p as default};
import{_ as r,o as t,c as o,ag as a}from"./chunks/framework.BZohXCq9.js";const u=JSON.parse('{"title":"Search Providers","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/search-provider.md","filePath":"getting-started/search-provider.md","lastUpdated":1772359263000}'),i={name:"getting-started/search-provider.md"};function n(s,e,d,l,c,h){return t(),o("div",null,[...e[0]||(e[0]=[a("",20)])])}const p=r(i,[["render",n]]);export{u as __pageData,p as default};
@@ -1,4 +1,4 @@
import{_ as s,o as i,c as t,ag as e}from"./chunks/framework.ePeAWSvT.js";const c=JSON.parse('{"title":"Bot Skills","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/skills.md","filePath":"getting-started/skills.md","lastUpdated":1772359263000}'),l={name:"getting-started/skills.md"};function n(o,a,r,d,h,k){return i(),t("div",null,[...a[0]||(a[0]=[e(`<h1 id="bot-skills" tabindex="-1">Bot Skills <a class="header-anchor" href="#bot-skills" aria-label="Permalink to &quot;Bot Skills&quot;"></a></h1><p>Skills are the &quot;personality&quot; and &quot;capabilities&quot; of a Memoh Bot. They define how the bot should behave and what tools it can use.</p><h2 id="concept-skills-as-markdown" tabindex="-1">Concept: Skills as Markdown <a class="header-anchor" href="#concept-skills-as-markdown" aria-label="Permalink to &quot;Concept: Skills as Markdown&quot;"></a></h2><p>A <strong>Skill</strong> is represented as a Markdown document with YAML frontmatter. These files are stored within the bot&#39;s container and parsed into tools and personality traits.</p><h3 id="example-skill-structure" tabindex="-1">Example Skill Structure <a class="header-anchor" href="#example-skill-structure" aria-label="Permalink to &quot;Example Skill Structure&quot;"></a></h3><div class="language-yaml vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">yaml</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">---</span></span>
import{_ as s,o as i,c as t,ag as e}from"./chunks/framework.BZohXCq9.js";const c=JSON.parse('{"title":"Bot Skills","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/skills.md","filePath":"getting-started/skills.md","lastUpdated":1772359263000}'),l={name:"getting-started/skills.md"};function n(o,a,r,d,h,k){return i(),t("div",null,[...a[0]||(a[0]=[e(`<h1 id="bot-skills" tabindex="-1">Bot Skills <a class="header-anchor" href="#bot-skills" aria-label="Permalink to &quot;Bot Skills&quot;"></a></h1><p>Skills are the &quot;personality&quot; and &quot;capabilities&quot; of a Memoh Bot. They define how the bot should behave and what tools it can use.</p><h2 id="concept-skills-as-markdown" tabindex="-1">Concept: Skills as Markdown <a class="header-anchor" href="#concept-skills-as-markdown" aria-label="Permalink to &quot;Concept: Skills as Markdown&quot;"></a></h2><p>A <strong>Skill</strong> is represented as a Markdown document with YAML frontmatter. These files are stored within the bot&#39;s container and parsed into tools and personality traits.</p><h3 id="example-skill-structure" tabindex="-1">Example Skill Structure <a class="header-anchor" href="#example-skill-structure" aria-label="Permalink to &quot;Example Skill Structure&quot;"></a></h3><div class="language-yaml vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">yaml</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">---</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">name</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">coder-skill</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">description</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">Enables advanced coding capabilities and tool use.</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">---</span></span>
@@ -1 +1 @@
import{_ as s,o as i,c as t,ag as e}from"./chunks/framework.ePeAWSvT.js";const c=JSON.parse('{"title":"Bot Skills","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/skills.md","filePath":"getting-started/skills.md","lastUpdated":1772359263000}'),l={name:"getting-started/skills.md"};function n(o,a,r,d,h,k){return i(),t("div",null,[...a[0]||(a[0]=[e("",16)])])}const g=s(l,[["render",n]]);export{c as __pageData,g as default};
import{_ as s,o as i,c as t,ag as e}from"./chunks/framework.BZohXCq9.js";const c=JSON.parse('{"title":"Bot Skills","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/skills.md","filePath":"getting-started/skills.md","lastUpdated":1772359263000}'),l={name:"getting-started/skills.md"};function n(o,a,r,d,h,k){return i(),t("div",null,[...a[0]||(a[0]=[e("",16)])])}const g=s(l,[["render",n]]);export{c as __pageData,g as default};
@@ -1 +1 @@
import{_ as e,o as a,c as n,ag as o}from"./chunks/framework.ePeAWSvT.js";const u=JSON.parse('{"title":"Bot Subagents","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/subagents.md","filePath":"getting-started/subagents.md","lastUpdated":1772359263000}'),i={name:"getting-started/subagents.md"};function s(r,t,d,l,c,g){return a(),n("div",null,[...t[0]||(t[0]=[o('<h1 id="bot-subagents" tabindex="-1">Bot Subagents <a class="header-anchor" href="#bot-subagents" aria-label="Permalink to &quot;Bot Subagents&quot;"></a></h1><p>Subagents are specialized AI entities with their own independent conversation context. They are managed by the main Bot to delegate complex tasks or focus on specific domains.</p><h2 id="concept-task-specialization" tabindex="-1">Concept: Task Specialization <a class="header-anchor" href="#concept-task-specialization" aria-label="Permalink to &quot;Concept: Task Specialization&quot;"></a></h2><p>A <strong>Subagent</strong> is like a specialized teammate for your Bot. While the main Bot handles general conversation, it can spin up and communicate with a Subagent to perform deep analysis, research, or execution.</p><hr><h2 id="fields" tabindex="-1">Fields <a class="header-anchor" href="#fields" aria-label="Permalink to &quot;Fields&quot;"></a></h2><p>Configure Subagents from the <strong>Subagents</strong> tab in the Bot Detail page.</p><table tabindex="0"><thead><tr><th>Field</th><th>Description</th></tr></thead><tbody><tr><td><strong>Name</strong></td><td>The identifier for the subagent (e.g., &quot;Research Assistant&quot;).</td></tr><tr><td><strong>Description</strong></td><td>A brief explanation of the subagent&#39;s purpose and role.</td></tr><tr><td><strong>Skills</strong></td><td>A list of specific <strong>Skills</strong> assigned from the bot&#39;s container.</td></tr><tr><td><strong>Messages</strong></td><td>The conversation history and context specific to this subagent.</td></tr><tr><td><strong>Usage</strong></td><td>Statistics on token consumption and activity.</td></tr></tbody></table><hr><h2 id="operations" tabindex="-1">Operations <a class="header-anchor" href="#operations" aria-label="Permalink to &quot;Operations&quot;"></a></h2><ul><li><strong>Add Subagent</strong>: Create a new entity by providing a name and description.</li><li><strong>Edit</strong>: Update the name or description of an existing subagent.</li><li><strong>Delete</strong>: Permanently remove a subagent and its independent context.</li><li><strong>View Context</strong>: Open a dialog to inspect the subagent&#39;s conversation history and usage metrics.</li></ul><hr><h2 id="bot-interaction" tabindex="-1">Bot Interaction <a class="header-anchor" href="#bot-interaction" aria-label="Permalink to &quot;Bot Interaction&quot;"></a></h2><ul><li>The main Bot uses the <strong>Subagent Tool</strong> to create, communicate with, and receive results from subagents.</li><li>Subagents inherit the main bot&#39;s container permissions but operate with their own &quot;mental workspace.&quot;</li><li>This modular approach allows for building multi-agent systems within a single Bot&#39;s scope.</li></ul>',14)])])}const p=e(i,[["render",s]]);export{u as __pageData,p as default};
import{_ as e,o as a,c as n,ag as o}from"./chunks/framework.BZohXCq9.js";const u=JSON.parse('{"title":"Bot Subagents","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/subagents.md","filePath":"getting-started/subagents.md","lastUpdated":1772359263000}'),i={name:"getting-started/subagents.md"};function s(r,t,d,l,c,g){return a(),n("div",null,[...t[0]||(t[0]=[o('<h1 id="bot-subagents" tabindex="-1">Bot Subagents <a class="header-anchor" href="#bot-subagents" aria-label="Permalink to &quot;Bot Subagents&quot;"></a></h1><p>Subagents are specialized AI entities with their own independent conversation context. They are managed by the main Bot to delegate complex tasks or focus on specific domains.</p><h2 id="concept-task-specialization" tabindex="-1">Concept: Task Specialization <a class="header-anchor" href="#concept-task-specialization" aria-label="Permalink to &quot;Concept: Task Specialization&quot;"></a></h2><p>A <strong>Subagent</strong> is like a specialized teammate for your Bot. While the main Bot handles general conversation, it can spin up and communicate with a Subagent to perform deep analysis, research, or execution.</p><hr><h2 id="fields" tabindex="-1">Fields <a class="header-anchor" href="#fields" aria-label="Permalink to &quot;Fields&quot;"></a></h2><p>Configure Subagents from the <strong>Subagents</strong> tab in the Bot Detail page.</p><table tabindex="0"><thead><tr><th>Field</th><th>Description</th></tr></thead><tbody><tr><td><strong>Name</strong></td><td>The identifier for the subagent (e.g., &quot;Research Assistant&quot;).</td></tr><tr><td><strong>Description</strong></td><td>A brief explanation of the subagent&#39;s purpose and role.</td></tr><tr><td><strong>Skills</strong></td><td>A list of specific <strong>Skills</strong> assigned from the bot&#39;s container.</td></tr><tr><td><strong>Messages</strong></td><td>The conversation history and context specific to this subagent.</td></tr><tr><td><strong>Usage</strong></td><td>Statistics on token consumption and activity.</td></tr></tbody></table><hr><h2 id="operations" tabindex="-1">Operations <a class="header-anchor" href="#operations" aria-label="Permalink to &quot;Operations&quot;"></a></h2><ul><li><strong>Add Subagent</strong>: Create a new entity by providing a name and description.</li><li><strong>Edit</strong>: Update the name or description of an existing subagent.</li><li><strong>Delete</strong>: Permanently remove a subagent and its independent context.</li><li><strong>View Context</strong>: Open a dialog to inspect the subagent&#39;s conversation history and usage metrics.</li></ul><hr><h2 id="bot-interaction" tabindex="-1">Bot Interaction <a class="header-anchor" href="#bot-interaction" aria-label="Permalink to &quot;Bot Interaction&quot;"></a></h2><ul><li>The main Bot uses the <strong>Subagent Tool</strong> to create, communicate with, and receive results from subagents.</li><li>Subagents inherit the main bot&#39;s container permissions but operate with their own &quot;mental workspace.&quot;</li><li>This modular approach allows for building multi-agent systems within a single Bot&#39;s scope.</li></ul>',14)])])}const p=e(i,[["render",s]]);export{u as __pageData,p as default};
@@ -1 +1 @@
import{_ as e,o as a,c as n,ag as o}from"./chunks/framework.ePeAWSvT.js";const u=JSON.parse('{"title":"Bot Subagents","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/subagents.md","filePath":"getting-started/subagents.md","lastUpdated":1772359263000}'),i={name:"getting-started/subagents.md"};function s(r,t,d,l,c,g){return a(),n("div",null,[...t[0]||(t[0]=[o("",14)])])}const p=e(i,[["render",s]]);export{u as __pageData,p as default};
import{_ as e,o as a,c as n,ag as o}from"./chunks/framework.BZohXCq9.js";const u=JSON.parse('{"title":"Bot Subagents","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/subagents.md","filePath":"getting-started/subagents.md","lastUpdated":1772359263000}'),i={name:"getting-started/subagents.md"};function s(r,t,d,l,c,g){return a(),n("div",null,[...t[0]||(t[0]=[o("",14)])])}const p=e(i,[["render",s]]);export{u as __pageData,p as default};
@@ -1 +1 @@
import{_ as t,o as a,c as o,ag as n}from"./chunks/framework.ePeAWSvT.js";const u=JSON.parse('{"title":"Memoh Documentation","description":"","frontmatter":{},"headers":[],"relativePath":"index.md","filePath":"index.md","lastUpdated":1772359263000}'),i={name:"index.md"};function r(s,e,l,m,d,c){return a(),o("div",null,[...e[0]||(e[0]=[n('<h1 id="memoh-documentation" tabindex="-1">Memoh Documentation <a class="header-anchor" href="#memoh-documentation" aria-label="Permalink to &quot;Memoh Documentation&quot;"></a></h1><p>Memoh(/ˈmemoʊ/) is a multi-member, structured long-memory, containerized AI agent system. Create your own AI bots, chat with them via Telegram, Lark (Feishu), Web, or CLI. Each bot runs in an isolated container with its own memory system — able to edit files, run commands, and access the network.</p><h2 id="documentation" tabindex="-1">Documentation <a class="header-anchor" href="#documentation" aria-label="Permalink to &quot;Documentation&quot;"></a></h2><ul><li><strong><a href="/about.html">About Memoh</a></strong> — What Memoh is, key features, and installation links.</li><li><strong><a href="/installation/docker.html">Installation</a></strong> — <a href="/installation/docker.html">Docker</a> (recommended) and <a href="/installation/config-toml.html">config.toml</a> reference.</li><li><strong><a href="/getting-started/provider-and-model.html">Getting Started</a></strong> — Step-by-step guide to configure models, bots, and channels.</li><li><strong><a href="/channels/index.html">Channels</a></strong> — Detailed guides for Telegram, Feishu, and Discord.</li></ul>',4)])])}const f=t(i,[["render",r]]);export{u as __pageData,f as default};
import{_ as t,o as a,c as o,ag as n}from"./chunks/framework.BZohXCq9.js";const u=JSON.parse('{"title":"Memoh Documentation","description":"","frontmatter":{},"headers":[],"relativePath":"index.md","filePath":"index.md","lastUpdated":1772359263000}'),i={name:"index.md"};function r(s,e,l,m,d,c){return a(),o("div",null,[...e[0]||(e[0]=[n('<h1 id="memoh-documentation" tabindex="-1">Memoh Documentation <a class="header-anchor" href="#memoh-documentation" aria-label="Permalink to &quot;Memoh Documentation&quot;"></a></h1><p>Memoh(/ˈmemoʊ/) is a multi-member, structured long-memory, containerized AI agent system. Create your own AI bots, chat with them via Telegram, Lark (Feishu), Web, or CLI. Each bot runs in an isolated container with its own memory system — able to edit files, run commands, and access the network.</p><h2 id="documentation" tabindex="-1">Documentation <a class="header-anchor" href="#documentation" aria-label="Permalink to &quot;Documentation&quot;"></a></h2><ul><li><strong><a href="/about.html">About Memoh</a></strong> — What Memoh is, key features, and installation links.</li><li><strong><a href="/installation/docker.html">Installation</a></strong> — <a href="/installation/docker.html">Docker</a> (recommended) and <a href="/installation/config-toml.html">config.toml</a> reference.</li><li><strong><a href="/getting-started/provider-and-model.html">Getting Started</a></strong> — Step-by-step guide to configure models, bots, and channels.</li><li><strong><a href="/channels/index.html">Channels</a></strong> — Detailed guides for Telegram, Feishu, and Discord.</li></ul>',4)])])}const f=t(i,[["render",r]]);export{u as __pageData,f as default};
@@ -1 +1 @@
import{_ as t,o as a,c as o,ag as n}from"./chunks/framework.ePeAWSvT.js";const u=JSON.parse('{"title":"Memoh Documentation","description":"","frontmatter":{},"headers":[],"relativePath":"index.md","filePath":"index.md","lastUpdated":1772359263000}'),i={name:"index.md"};function r(s,e,l,m,d,c){return a(),o("div",null,[...e[0]||(e[0]=[n("",4)])])}const f=t(i,[["render",r]]);export{u as __pageData,f as default};
import{_ as t,o as a,c as o,ag as n}from"./chunks/framework.BZohXCq9.js";const u=JSON.parse('{"title":"Memoh Documentation","description":"","frontmatter":{},"headers":[],"relativePath":"index.md","filePath":"index.md","lastUpdated":1772359263000}'),i={name:"index.md"};function r(s,e,l,m,d,c){return a(),o("div",null,[...e[0]||(e[0]=[n("",4)])])}const f=t(i,[["render",r]]);export{u as __pageData,f as default};
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
import{_ as i,o as a,c as e,ag as t}from"./chunks/framework.ePeAWSvT.js";const c=JSON.parse('{"title":"Docker Installation","description":"","frontmatter":{},"headers":[],"relativePath":"installation/docker.md","filePath":"installation/docker.md","lastUpdated":1772882768000}'),n={name:"installation/docker.md"};function l(o,s,h,r,d,p){return a(),e("div",null,[...s[0]||(s[0]=[t("",48)])])}const g=i(n,[["render",l]]);export{c as __pageData,g as default};
import{_ as i,o as a,c as e,ag as t}from"./chunks/framework.BZohXCq9.js";const c=JSON.parse('{"title":"Docker Installation","description":"","frontmatter":{},"headers":[],"relativePath":"installation/docker.md","filePath":"installation/docker.md","lastUpdated":1772882768000}'),n={name:"installation/docker.md"};function l(o,s,h,r,d,p){return a(),e("div",null,[...s[0]||(s[0]=[t("",48)])])}const g=i(n,[["render",l]]);export{c as __pageData,g as default};
@@ -1 +1 @@
import{_ as r,o as i,c as t,ag as o}from"./chunks/framework.ePeAWSvT.js";const h=JSON.parse('{"title":"Built-in Memory Provider","description":"","frontmatter":{},"headers":[],"relativePath":"memory-providers/builtin.md","filePath":"memory-providers/builtin.md","lastUpdated":1772873936000}'),a={name:"memory-providers/builtin.md"};function n(l,e,d,s,m,g){return i(),t("div",null,[...e[0]||(e[0]=[o('<h1 id="built-in-memory-provider" tabindex="-1">Built-in Memory Provider <a class="header-anchor" href="#built-in-memory-provider" aria-label="Permalink to &quot;Built-in Memory Provider&quot;"></a></h1><p>The built-in memory provider is the standard memory backend shipped with Memoh. It works with Memoh&#39;s memory pipeline and supports:</p><ul><li>Automatic memory extraction from conversations</li><li>Semantic memory retrieval during chat</li><li>Manual memory creation and editing</li><li>Memory compaction and rebuild workflows</li></ul><p>To configure it well, you usually assign:</p><ul><li><strong>Memory Model</strong>: The LLM used for memory extraction and decision making</li><li><strong>Embedding Model</strong>: The embedding model used for dense vector search</li></ul><hr><h2 id="creating-a-built-in-provider" tabindex="-1">Creating a Built-in Provider <a class="header-anchor" href="#creating-a-built-in-provider" aria-label="Permalink to &quot;Creating a Built-in Provider&quot;"></a></h2><p>Manage providers from the <strong>Memory Providers</strong> page in the sidebar.</p><ol><li>Navigate to the <strong>Memory Providers</strong> page.</li><li>Click <strong>Add Memory Provider</strong>.</li><li>Fill in the following fields: <ul><li><strong>Name</strong>: A display name for this provider.</li><li><strong>Provider Type</strong>: Select <code>builtin</code>.</li></ul></li><li>Click <strong>Create</strong>.</li></ol><hr><h2 id="configuring-a-built-in-provider" tabindex="-1">Configuring a Built-in Provider <a class="header-anchor" href="#configuring-a-built-in-provider" aria-label="Permalink to &quot;Configuring a Built-in Provider&quot;"></a></h2><p>After creating a provider, select it from the sidebar and configure its settings.</p><table tabindex="0"><thead><tr><th>Field</th><th>Description</th></tr></thead><tbody><tr><td><strong>Name</strong></td><td>The display name shown in the UI.</td></tr><tr><td><strong>Provider Type</strong></td><td>The provider implementation. Currently this is <code>builtin</code> only.</td></tr><tr><td><strong>Memory Model</strong></td><td>Optional chat model used for memory extraction and memory-related decisions.</td></tr><tr><td><strong>Embedding Model</strong></td><td>Optional embedding model used for semantic vector search.</td></tr></tbody></table><h3 id="managing-providers" tabindex="-1">Managing Providers <a class="header-anchor" href="#managing-providers" aria-label="Permalink to &quot;Managing Providers&quot;"></a></h3><ul><li><strong>Edit</strong>: Select a provider and update its name or model bindings.</li><li><strong>Delete</strong>: Remove a provider you no longer use.</li></ul><hr><h2 id="assigning-a-memory-provider-to-a-bot" tabindex="-1">Assigning a Memory Provider to a Bot <a class="header-anchor" href="#assigning-a-memory-provider-to-a-bot" aria-label="Permalink to &quot;Assigning a Memory Provider to a Bot&quot;"></a></h2><ol><li>Navigate to the <strong>Bots</strong> page and open your bot.</li><li>Go to the <strong>Settings</strong> tab.</li><li>Find the <strong>Memory Provider</strong> dropdown.</li><li>Select the provider you created.</li><li>Click <strong>Save</strong>.</li></ol><p>If no memory provider is selected, the bot will not use that provider configuration in its runtime settings.</p><hr><h2 id="using-memory-after-setup" tabindex="-1">Using Memory After Setup <a class="header-anchor" href="#using-memory-after-setup" aria-label="Permalink to &quot;Using Memory After Setup&quot;"></a></h2><p>Once a memory provider is assigned to the bot, you can manage actual memories from the bot&#39;s <strong>Memory</strong> tab:</p><ul><li>Create memories manually</li><li>Extract memories from conversations</li><li>Search, edit, and delete memories</li><li>Compact or rebuild the memory store</li></ul><p>For day-to-day memory operations, continue with <a href="/getting-started/memory.html">Bot Memory Management</a>.</p>',24)])])}const p=r(a,[["render",n]]);export{h as __pageData,p as default};
import{_ as r,o as i,c as t,ag as o}from"./chunks/framework.BZohXCq9.js";const h=JSON.parse('{"title":"Built-in Memory Provider","description":"","frontmatter":{},"headers":[],"relativePath":"memory-providers/builtin.md","filePath":"memory-providers/builtin.md","lastUpdated":1772873936000}'),a={name:"memory-providers/builtin.md"};function n(l,e,d,s,m,g){return i(),t("div",null,[...e[0]||(e[0]=[o('<h1 id="built-in-memory-provider" tabindex="-1">Built-in Memory Provider <a class="header-anchor" href="#built-in-memory-provider" aria-label="Permalink to &quot;Built-in Memory Provider&quot;"></a></h1><p>The built-in memory provider is the standard memory backend shipped with Memoh. It works with Memoh&#39;s memory pipeline and supports:</p><ul><li>Automatic memory extraction from conversations</li><li>Semantic memory retrieval during chat</li><li>Manual memory creation and editing</li><li>Memory compaction and rebuild workflows</li></ul><p>To configure it well, you usually assign:</p><ul><li><strong>Memory Model</strong>: The LLM used for memory extraction and decision making</li><li><strong>Embedding Model</strong>: The embedding model used for dense vector search</li></ul><hr><h2 id="creating-a-built-in-provider" tabindex="-1">Creating a Built-in Provider <a class="header-anchor" href="#creating-a-built-in-provider" aria-label="Permalink to &quot;Creating a Built-in Provider&quot;"></a></h2><p>Manage providers from the <strong>Memory Providers</strong> page in the sidebar.</p><ol><li>Navigate to the <strong>Memory Providers</strong> page.</li><li>Click <strong>Add Memory Provider</strong>.</li><li>Fill in the following fields: <ul><li><strong>Name</strong>: A display name for this provider.</li><li><strong>Provider Type</strong>: Select <code>builtin</code>.</li></ul></li><li>Click <strong>Create</strong>.</li></ol><hr><h2 id="configuring-a-built-in-provider" tabindex="-1">Configuring a Built-in Provider <a class="header-anchor" href="#configuring-a-built-in-provider" aria-label="Permalink to &quot;Configuring a Built-in Provider&quot;"></a></h2><p>After creating a provider, select it from the sidebar and configure its settings.</p><table tabindex="0"><thead><tr><th>Field</th><th>Description</th></tr></thead><tbody><tr><td><strong>Name</strong></td><td>The display name shown in the UI.</td></tr><tr><td><strong>Provider Type</strong></td><td>The provider implementation. Currently this is <code>builtin</code> only.</td></tr><tr><td><strong>Memory Model</strong></td><td>Optional chat model used for memory extraction and memory-related decisions.</td></tr><tr><td><strong>Embedding Model</strong></td><td>Optional embedding model used for semantic vector search.</td></tr></tbody></table><h3 id="managing-providers" tabindex="-1">Managing Providers <a class="header-anchor" href="#managing-providers" aria-label="Permalink to &quot;Managing Providers&quot;"></a></h3><ul><li><strong>Edit</strong>: Select a provider and update its name or model bindings.</li><li><strong>Delete</strong>: Remove a provider you no longer use.</li></ul><hr><h2 id="assigning-a-memory-provider-to-a-bot" tabindex="-1">Assigning a Memory Provider to a Bot <a class="header-anchor" href="#assigning-a-memory-provider-to-a-bot" aria-label="Permalink to &quot;Assigning a Memory Provider to a Bot&quot;"></a></h2><ol><li>Navigate to the <strong>Bots</strong> page and open your bot.</li><li>Go to the <strong>Settings</strong> tab.</li><li>Find the <strong>Memory Provider</strong> dropdown.</li><li>Select the provider you created.</li><li>Click <strong>Save</strong>.</li></ol><p>If no memory provider is selected, the bot will not use that provider configuration in its runtime settings.</p><hr><h2 id="using-memory-after-setup" tabindex="-1">Using Memory After Setup <a class="header-anchor" href="#using-memory-after-setup" aria-label="Permalink to &quot;Using Memory After Setup&quot;"></a></h2><p>Once a memory provider is assigned to the bot, you can manage actual memories from the bot&#39;s <strong>Memory</strong> tab:</p><ul><li>Create memories manually</li><li>Extract memories from conversations</li><li>Search, edit, and delete memories</li><li>Compact or rebuild the memory store</li></ul><p>For day-to-day memory operations, continue with <a href="/getting-started/memory.html">Bot Memory Management</a>.</p>',24)])])}const p=r(a,[["render",n]]);export{h as __pageData,p as default};
@@ -1 +1 @@
import{_ as r,o as i,c as t,ag as o}from"./chunks/framework.ePeAWSvT.js";const h=JSON.parse('{"title":"Built-in Memory Provider","description":"","frontmatter":{},"headers":[],"relativePath":"memory-providers/builtin.md","filePath":"memory-providers/builtin.md","lastUpdated":1772873936000}'),a={name:"memory-providers/builtin.md"};function n(l,e,d,s,m,g){return i(),t("div",null,[...e[0]||(e[0]=[o("",24)])])}const p=r(a,[["render",n]]);export{h as __pageData,p as default};
import{_ as r,o as i,c as t,ag as o}from"./chunks/framework.BZohXCq9.js";const h=JSON.parse('{"title":"Built-in Memory Provider","description":"","frontmatter":{},"headers":[],"relativePath":"memory-providers/builtin.md","filePath":"memory-providers/builtin.md","lastUpdated":1772873936000}'),a={name:"memory-providers/builtin.md"};function n(l,e,d,s,m,g){return i(),t("div",null,[...e[0]||(e[0]=[o("",24)])])}const p=r(a,[["render",n]]);export{h as __pageData,p as default};
@@ -1 +1 @@
import{_ as r,o,c as t,ag as i}from"./chunks/framework.ePeAWSvT.js";const c=JSON.parse('{"title":"Memory Providers","description":"","frontmatter":{},"headers":[],"relativePath":"memory-providers/index.md","filePath":"memory-providers/index.md","lastUpdated":1772873936000}'),a={name:"memory-providers/index.md"};function s(n,e,d,l,m,p){return o(),t("div",null,[...e[0]||(e[0]=[i('<h1 id="memory-providers" tabindex="-1">Memory Providers <a class="header-anchor" href="#memory-providers" aria-label="Permalink to &quot;Memory Providers&quot;"></a></h1><p>Memoh uses a <strong>Memory Provider</strong> to define how a bot stores, retrieves, and manages long-term memory. A bot can bind one memory provider in its <strong>Settings</strong> tab, and that provider becomes the backend for memory extraction and memory search.</p><h2 id="available-providers" tabindex="-1">Available Providers <a class="header-anchor" href="#available-providers" aria-label="Permalink to &quot;Available Providers&quot;"></a></h2><p>Memoh currently includes the following memory provider:</p><ul><li><a href="/memory-providers/builtin.html">Built-in</a>: The default memory system included with Memoh.</li></ul><p>More provider types may be added in future versions, but right now <code>builtin</code> is the only supported provider type in the product and web UI.</p><hr><h2 id="basic-flow" tabindex="-1">Basic Flow <a class="header-anchor" href="#basic-flow" aria-label="Permalink to &quot;Basic Flow&quot;"></a></h2><ol><li>Open the <strong>Memory Providers</strong> page from the sidebar.</li><li>Create a provider instance using one of the supported provider types.</li><li>Configure the provider settings.</li><li>Open a bot&#39;s <strong>Settings</strong> tab and assign that provider in <strong>Memory Provider</strong>.</li><li>Manage actual memories from the bot&#39;s <strong>Memory</strong> tab.</li></ol><hr><h2 id="next-steps" tabindex="-1">Next Steps <a class="header-anchor" href="#next-steps" aria-label="Permalink to &quot;Next Steps&quot;"></a></h2><ul><li>To configure the currently supported provider, continue with <a href="/memory-providers/builtin.html">Built-in Memory Provider</a>.</li><li>To manage memory entries after the provider is assigned, see <a href="/getting-started/memory.html">Bot Memory Management</a>.</li></ul>',12)])])}const u=r(a,[["render",s]]);export{c as __pageData,u as default};
import{_ as r,o,c as t,ag as i}from"./chunks/framework.BZohXCq9.js";const c=JSON.parse('{"title":"Memory Providers","description":"","frontmatter":{},"headers":[],"relativePath":"memory-providers/index.md","filePath":"memory-providers/index.md","lastUpdated":1772873936000}'),a={name:"memory-providers/index.md"};function s(n,e,d,l,m,p){return o(),t("div",null,[...e[0]||(e[0]=[i('<h1 id="memory-providers" tabindex="-1">Memory Providers <a class="header-anchor" href="#memory-providers" aria-label="Permalink to &quot;Memory Providers&quot;"></a></h1><p>Memoh uses a <strong>Memory Provider</strong> to define how a bot stores, retrieves, and manages long-term memory. A bot can bind one memory provider in its <strong>Settings</strong> tab, and that provider becomes the backend for memory extraction and memory search.</p><h2 id="available-providers" tabindex="-1">Available Providers <a class="header-anchor" href="#available-providers" aria-label="Permalink to &quot;Available Providers&quot;"></a></h2><p>Memoh currently includes the following memory provider:</p><ul><li><a href="/memory-providers/builtin.html">Built-in</a>: The default memory system included with Memoh.</li></ul><p>More provider types may be added in future versions, but right now <code>builtin</code> is the only supported provider type in the product and web UI.</p><hr><h2 id="basic-flow" tabindex="-1">Basic Flow <a class="header-anchor" href="#basic-flow" aria-label="Permalink to &quot;Basic Flow&quot;"></a></h2><ol><li>Open the <strong>Memory Providers</strong> page from the sidebar.</li><li>Create a provider instance using one of the supported provider types.</li><li>Configure the provider settings.</li><li>Open a bot&#39;s <strong>Settings</strong> tab and assign that provider in <strong>Memory Provider</strong>.</li><li>Manage actual memories from the bot&#39;s <strong>Memory</strong> tab.</li></ol><hr><h2 id="next-steps" tabindex="-1">Next Steps <a class="header-anchor" href="#next-steps" aria-label="Permalink to &quot;Next Steps&quot;"></a></h2><ul><li>To configure the currently supported provider, continue with <a href="/memory-providers/builtin.html">Built-in Memory Provider</a>.</li><li>To manage memory entries after the provider is assigned, see <a href="/getting-started/memory.html">Bot Memory Management</a>.</li></ul>',12)])])}const u=r(a,[["render",s]]);export{c as __pageData,u as default};
@@ -1 +1 @@
import{_ as r,o,c as t,ag as i}from"./chunks/framework.ePeAWSvT.js";const c=JSON.parse('{"title":"Memory Providers","description":"","frontmatter":{},"headers":[],"relativePath":"memory-providers/index.md","filePath":"memory-providers/index.md","lastUpdated":1772873936000}'),a={name:"memory-providers/index.md"};function s(n,e,d,l,m,p){return o(),t("div",null,[...e[0]||(e[0]=[i("",12)])])}const u=r(a,[["render",s]]);export{c as __pageData,u as default};
import{_ as r,o,c as t,ag as i}from"./chunks/framework.BZohXCq9.js";const c=JSON.parse('{"title":"Memory Providers","description":"","frontmatter":{},"headers":[],"relativePath":"memory-providers/index.md","filePath":"memory-providers/index.md","lastUpdated":1772873936000}'),a={name:"memory-providers/index.md"};function s(n,e,d,l,m,p){return o(),t("div",null,[...e[0]||(e[0]=[i("",12)])])}const u=r(a,[["render",s]]);export{c as __pageData,u as default};
@@ -1 +1 @@
import{_ as o,o as e,c as a,ag as i}from"./chunks/framework.ePeAWSvT.js";const u=JSON.parse('{"title":"账号模型与绑定","description":"","frontmatter":{},"headers":[],"relativePath":"zh/concepts/identity-and-binding.md","filePath":"zh/concepts/identity-and-binding.md","lastUpdated":1770887583000}'),l={name:"zh/concepts/identity-and-binding.md"};function n(r,t,d,s,c,h){return e(),a("div",null,[...t[0]||(t[0]=[i('<h1 id="账号模型与绑定" tabindex="-1">账号模型与绑定 <a class="header-anchor" href="#账号模型与绑定" aria-label="Permalink to &quot;账号模型与绑定&quot;"></a></h1><h2 id="账号模型" tabindex="-1">账号模型 <a class="header-anchor" href="#账号模型" aria-label="Permalink to &quot;账号模型&quot;"></a></h2><p>Memoh 将平台账号与系统账号视为两类不同实体:</p><ul><li><strong>平台账号(<code>ChannelIdentity</code></strong> 是用户在外部接入平台上的账号(例如飞书账号),不是 Memoh 内部账号。</li><li><strong>系统账号(<code>User</code></strong> 是 Memoh 系统内账号。</li></ul><p>平台账号在初始阶段可以不绑定系统账号。<br><code>bind</code> 的职责是完成这两类账号的关联。</p><h2 id="接入平台与-bot" tabindex="-1">接入平台与 Bot <a class="header-anchor" href="#接入平台与-bot" aria-label="Permalink to &quot;接入平台与 Bot&quot;"></a></h2><ul><li><strong>接入平台(<code>channel</code></strong> 是入站消息来源。</li><li><strong>Bot</strong> 是系统内的授权与资源边界。</li></ul><p>Bot 由系统账号管理,入站消息由平台账号产生。</p><h2 id="为什么账号绑定是账号作用域" tabindex="-1">为什么账号绑定是账号作用域 <a class="header-anchor" href="#为什么账号绑定是账号作用域" aria-label="Permalink to &quot;为什么账号绑定是账号作用域&quot;"></a></h2><p>账号绑定的目标是建立账号归属关系,而不是直接发放 bot 资源权限:</p><ul><li>它只负责平台账号与系统账号的绑定;</li><li>不把账号绑定与成员管理语义耦合在一起;</li><li>让 bot 访问控制保持独立、可演进。</li></ul><h2 id="账号绑定流程-当前共识" tabindex="-1">账号绑定流程(当前共识) <a class="header-anchor" href="#账号绑定流程-当前共识" aria-label="Permalink to &quot;账号绑定流程(当前共识)&quot;"></a></h2><ol><li>用户以自己的系统账号申请 bind code</li><li>平台账号在支持的接入平台会话中发送 code</li><li>系统校验 code,完成平台账号到系统账号的绑定;</li><li>bot 成员与授权由独立流程处理。</li></ol><h2 id="bot-类型语义" tabindex="-1">Bot 类型语义 <a class="header-anchor" href="#bot-类型语义" aria-label="Permalink to &quot;Bot 类型语义&quot;"></a></h2><ul><li><strong>Public bot</strong>:支持成员协作语义。</li><li><strong>Personal bot</strong>:语义上应为单 owner,不应依赖成员机制。</li></ul><blockquote><p>注:本文档记录的是产品语义与共识方向。<br> 部分运行时细节仍可能处于收敛阶段。</p></blockquote>',16)])])}const p=o(l,[["render",n]]);export{u as __pageData,p as default};
import{_ as o,o as e,c as a,ag as i}from"./chunks/framework.BZohXCq9.js";const u=JSON.parse('{"title":"账号模型与绑定","description":"","frontmatter":{},"headers":[],"relativePath":"zh/concepts/identity-and-binding.md","filePath":"zh/concepts/identity-and-binding.md","lastUpdated":1770887583000}'),l={name:"zh/concepts/identity-and-binding.md"};function n(r,t,d,s,c,h){return e(),a("div",null,[...t[0]||(t[0]=[i('<h1 id="账号模型与绑定" tabindex="-1">账号模型与绑定 <a class="header-anchor" href="#账号模型与绑定" aria-label="Permalink to &quot;账号模型与绑定&quot;"></a></h1><h2 id="账号模型" tabindex="-1">账号模型 <a class="header-anchor" href="#账号模型" aria-label="Permalink to &quot;账号模型&quot;"></a></h2><p>Memoh 将平台账号与系统账号视为两类不同实体:</p><ul><li><strong>平台账号(<code>ChannelIdentity</code></strong> 是用户在外部接入平台上的账号(例如飞书账号),不是 Memoh 内部账号。</li><li><strong>系统账号(<code>User</code></strong> 是 Memoh 系统内账号。</li></ul><p>平台账号在初始阶段可以不绑定系统账号。<br><code>bind</code> 的职责是完成这两类账号的关联。</p><h2 id="接入平台与-bot" tabindex="-1">接入平台与 Bot <a class="header-anchor" href="#接入平台与-bot" aria-label="Permalink to &quot;接入平台与 Bot&quot;"></a></h2><ul><li><strong>接入平台(<code>channel</code></strong> 是入站消息来源。</li><li><strong>Bot</strong> 是系统内的授权与资源边界。</li></ul><p>Bot 由系统账号管理,入站消息由平台账号产生。</p><h2 id="为什么账号绑定是账号作用域" tabindex="-1">为什么账号绑定是账号作用域 <a class="header-anchor" href="#为什么账号绑定是账号作用域" aria-label="Permalink to &quot;为什么账号绑定是账号作用域&quot;"></a></h2><p>账号绑定的目标是建立账号归属关系,而不是直接发放 bot 资源权限:</p><ul><li>它只负责平台账号与系统账号的绑定;</li><li>不把账号绑定与成员管理语义耦合在一起;</li><li>让 bot 访问控制保持独立、可演进。</li></ul><h2 id="账号绑定流程-当前共识" tabindex="-1">账号绑定流程(当前共识) <a class="header-anchor" href="#账号绑定流程-当前共识" aria-label="Permalink to &quot;账号绑定流程(当前共识)&quot;"></a></h2><ol><li>用户以自己的系统账号申请 bind code</li><li>平台账号在支持的接入平台会话中发送 code</li><li>系统校验 code,完成平台账号到系统账号的绑定;</li><li>bot 成员与授权由独立流程处理。</li></ol><h2 id="bot-类型语义" tabindex="-1">Bot 类型语义 <a class="header-anchor" href="#bot-类型语义" aria-label="Permalink to &quot;Bot 类型语义&quot;"></a></h2><ul><li><strong>Public bot</strong>:支持成员协作语义。</li><li><strong>Personal bot</strong>:语义上应为单 owner,不应依赖成员机制。</li></ul><blockquote><p>注:本文档记录的是产品语义与共识方向。<br> 部分运行时细节仍可能处于收敛阶段。</p></blockquote>',16)])])}const p=o(l,[["render",n]]);export{u as __pageData,p as default};
@@ -1 +1 @@
import{_ as o,o as e,c as a,ag as i}from"./chunks/framework.ePeAWSvT.js";const u=JSON.parse('{"title":"账号模型与绑定","description":"","frontmatter":{},"headers":[],"relativePath":"zh/concepts/identity-and-binding.md","filePath":"zh/concepts/identity-and-binding.md","lastUpdated":1770887583000}'),l={name:"zh/concepts/identity-and-binding.md"};function n(r,t,d,s,c,h){return e(),a("div",null,[...t[0]||(t[0]=[i("",16)])])}const p=o(l,[["render",n]]);export{u as __pageData,p as default};
import{_ as o,o as e,c as a,ag as i}from"./chunks/framework.BZohXCq9.js";const u=JSON.parse('{"title":"账号模型与绑定","description":"","frontmatter":{},"headers":[],"relativePath":"zh/concepts/identity-and-binding.md","filePath":"zh/concepts/identity-and-binding.md","lastUpdated":1770887583000}'),l={name:"zh/concepts/identity-and-binding.md"};function n(r,t,d,s,c,h){return e(),a("div",null,[...t[0]||(t[0]=[i("",16)])])}const p=o(l,[["render",n]]);export{u as __pageData,p as default};
@@ -1 +1 @@
import{_ as a,o as t,c as o,ag as n}from"./chunks/framework.ePeAWSvT.js";const _=JSON.parse('{"title":"核心概念","description":"","frontmatter":{},"headers":[],"relativePath":"zh/concepts/index.md","filePath":"zh/concepts/index.md","lastUpdated":1770887583000}'),r={name:"zh/concepts/index.md"};function i(l,e,d,s,c,h){return t(),o("div",null,[...e[0]||(e[0]=[n('<h1 id="核心概念" tabindex="-1">核心概念 <a class="header-anchor" href="#核心概念" aria-label="Permalink to &quot;核心概念&quot;"></a></h1><p>本章节用于定义 Memoh 的核心账号与访问概念。</p><h2 id="概念图" tabindex="-1">概念图 <a class="header-anchor" href="#概念图" aria-label="Permalink to &quot;概念图&quot;"></a></h2><ul><li><strong>系统账号(<code>User</code></strong>Memoh 系统内账号。</li><li><strong>平台账号(<code>ChannelIdentity</code></strong>:用户在外部接入平台上的账号,不是 Memoh 系统内账号(例如用户的飞书账号)。</li><li><strong>Bot</strong>:由系统账号管理的资源与访问边界。</li><li><strong>账号绑定(<code>bind</code></strong>:把平台账号关联到系统账号的过程。</li></ul><h2 id="为什么重要" tabindex="-1">为什么重要 <a class="header-anchor" href="#为什么重要" aria-label="Permalink to &quot;为什么重要&quot;"></a></h2><p>Memoh 需要同时处理外部接入平台消息与系统内权限控制。<br> 因此我们明确区分平台账号与系统账号,并将 bot 授权与账号绑定解耦。</p><p>术语说明:文档中的“平台账号”统一指用户在对应平台上的真实账号(如飞书账号),不指本项目内部账号。</p><h2 id="本章内容" tabindex="-1">本章内容 <a class="header-anchor" href="#本章内容" aria-label="Permalink to &quot;本章内容&quot;"></a></h2><ul><li><a href="/zh/concepts/identity-and-binding.html">账号模型与绑定</a></li></ul>',9)])])}const m=a(r,[["render",i]]);export{_ as __pageData,m as default};
import{_ as a,o as t,c as o,ag as n}from"./chunks/framework.BZohXCq9.js";const _=JSON.parse('{"title":"核心概念","description":"","frontmatter":{},"headers":[],"relativePath":"zh/concepts/index.md","filePath":"zh/concepts/index.md","lastUpdated":1770887583000}'),r={name:"zh/concepts/index.md"};function i(l,e,d,s,c,h){return t(),o("div",null,[...e[0]||(e[0]=[n('<h1 id="核心概念" tabindex="-1">核心概念 <a class="header-anchor" href="#核心概念" aria-label="Permalink to &quot;核心概念&quot;"></a></h1><p>本章节用于定义 Memoh 的核心账号与访问概念。</p><h2 id="概念图" tabindex="-1">概念图 <a class="header-anchor" href="#概念图" aria-label="Permalink to &quot;概念图&quot;"></a></h2><ul><li><strong>系统账号(<code>User</code></strong>Memoh 系统内账号。</li><li><strong>平台账号(<code>ChannelIdentity</code></strong>:用户在外部接入平台上的账号,不是 Memoh 系统内账号(例如用户的飞书账号)。</li><li><strong>Bot</strong>:由系统账号管理的资源与访问边界。</li><li><strong>账号绑定(<code>bind</code></strong>:把平台账号关联到系统账号的过程。</li></ul><h2 id="为什么重要" tabindex="-1">为什么重要 <a class="header-anchor" href="#为什么重要" aria-label="Permalink to &quot;为什么重要&quot;"></a></h2><p>Memoh 需要同时处理外部接入平台消息与系统内权限控制。<br> 因此我们明确区分平台账号与系统账号,并将 bot 授权与账号绑定解耦。</p><p>术语说明:文档中的“平台账号”统一指用户在对应平台上的真实账号(如飞书账号),不指本项目内部账号。</p><h2 id="本章内容" tabindex="-1">本章内容 <a class="header-anchor" href="#本章内容" aria-label="Permalink to &quot;本章内容&quot;"></a></h2><ul><li><a href="/zh/concepts/identity-and-binding.html">账号模型与绑定</a></li></ul>',9)])])}const m=a(r,[["render",i]]);export{_ as __pageData,m as default};
@@ -1 +1 @@
import{_ as a,o as t,c as o,ag as n}from"./chunks/framework.ePeAWSvT.js";const _=JSON.parse('{"title":"核心概念","description":"","frontmatter":{},"headers":[],"relativePath":"zh/concepts/index.md","filePath":"zh/concepts/index.md","lastUpdated":1770887583000}'),r={name:"zh/concepts/index.md"};function i(l,e,d,s,c,h){return t(),o("div",null,[...e[0]||(e[0]=[n("",9)])])}const m=a(r,[["render",i]]);export{_ as __pageData,m as default};
import{_ as a,o as t,c as o,ag as n}from"./chunks/framework.BZohXCq9.js";const _=JSON.parse('{"title":"核心概念","description":"","frontmatter":{},"headers":[],"relativePath":"zh/concepts/index.md","filePath":"zh/concepts/index.md","lastUpdated":1770887583000}'),r={name:"zh/concepts/index.md"};function i(l,e,d,s,c,h){return t(),o("div",null,[...e[0]||(e[0]=[n("",9)])])}const m=a(r,[["render",i]]);export{_ as __pageData,m as default};
@@ -1 +1 @@
import{_ as a,o as t,c as l,ag as i}from"./chunks/framework.ePeAWSvT.js";const _=JSON.parse('{"title":"Memoh 文档","description":"","frontmatter":{},"headers":[],"relativePath":"zh/index.md","filePath":"zh/index.md","lastUpdated":1770887583000}'),o={name:"zh/index.md"};function r(h,e,n,d,s,m){return t(),l("div",null,[...e[0]||(e[0]=[i('<h1 id="memoh-文档" tabindex="-1">Memoh 文档 <a class="header-anchor" href="#memoh-文档" aria-label="Permalink to &quot;Memoh 文档&quot;"></a></h1><p>Memoh 是一个多成员、长记忆、容器化的 AI Agent 系统。</p><h2 id="文档章节" tabindex="-1">文档章节 <a class="header-anchor" href="#文档章节" aria-label="Permalink to &quot;文档章节&quot;"></a></h2><ul><li><a href="/getting-started.html">快速开始</a></li><li><a href="/zh/concepts/">核心概念</a></li></ul><h2 id="面向文档贡献者" tabindex="-1">面向文档贡献者 <a class="header-anchor" href="#面向文档贡献者" aria-label="Permalink to &quot;面向文档贡献者&quot;"></a></h2><ul><li><a href="/zh/style/terminology.html">术语规范</a></li></ul><h2 id="当前维护范围" tabindex="-1">当前维护范围 <a class="header-anchor" href="#当前维护范围" aria-label="Permalink to &quot;当前维护范围&quot;"></a></h2><p>当前文档先聚焦账号语义与访问控制:</p><ul><li>区分系统账号与平台账号</li><li>解释为什么账号绑定是账号作用域</li><li>说明账号绑定与 bot 访问控制之间的关系</li></ul><p>说明:“平台账号”指用户在外部平台上的真实账号(例如飞书账号),不是 Memoh 系统账号。</p>',10)])])}const p=a(o,[["render",r]]);export{_ as __pageData,p as default};
import{_ as a,o as t,c as l,ag as i}from"./chunks/framework.BZohXCq9.js";const _=JSON.parse('{"title":"Memoh 文档","description":"","frontmatter":{},"headers":[],"relativePath":"zh/index.md","filePath":"zh/index.md","lastUpdated":1770887583000}'),o={name:"zh/index.md"};function r(h,e,n,d,s,m){return t(),l("div",null,[...e[0]||(e[0]=[i('<h1 id="memoh-文档" tabindex="-1">Memoh 文档 <a class="header-anchor" href="#memoh-文档" aria-label="Permalink to &quot;Memoh 文档&quot;"></a></h1><p>Memoh 是一个多成员、长记忆、容器化的 AI Agent 系统。</p><h2 id="文档章节" tabindex="-1">文档章节 <a class="header-anchor" href="#文档章节" aria-label="Permalink to &quot;文档章节&quot;"></a></h2><ul><li><a href="/getting-started.html">快速开始</a></li><li><a href="/zh/concepts/">核心概念</a></li></ul><h2 id="面向文档贡献者" tabindex="-1">面向文档贡献者 <a class="header-anchor" href="#面向文档贡献者" aria-label="Permalink to &quot;面向文档贡献者&quot;"></a></h2><ul><li><a href="/zh/style/terminology.html">术语规范</a></li></ul><h2 id="当前维护范围" tabindex="-1">当前维护范围 <a class="header-anchor" href="#当前维护范围" aria-label="Permalink to &quot;当前维护范围&quot;"></a></h2><p>当前文档先聚焦账号语义与访问控制:</p><ul><li>区分系统账号与平台账号</li><li>解释为什么账号绑定是账号作用域</li><li>说明账号绑定与 bot 访问控制之间的关系</li></ul><p>说明:“平台账号”指用户在外部平台上的真实账号(例如飞书账号),不是 Memoh 系统账号。</p>',10)])])}const p=a(o,[["render",r]]);export{_ as __pageData,p as default};
@@ -1 +1 @@
import{_ as a,o as t,c as l,ag as i}from"./chunks/framework.ePeAWSvT.js";const _=JSON.parse('{"title":"Memoh 文档","description":"","frontmatter":{},"headers":[],"relativePath":"zh/index.md","filePath":"zh/index.md","lastUpdated":1770887583000}'),o={name:"zh/index.md"};function r(h,e,n,d,s,m){return t(),l("div",null,[...e[0]||(e[0]=[i("",10)])])}const p=a(o,[["render",r]]);export{_ as __pageData,p as default};
import{_ as a,o as t,c as l,ag as i}from"./chunks/framework.BZohXCq9.js";const _=JSON.parse('{"title":"Memoh 文档","description":"","frontmatter":{},"headers":[],"relativePath":"zh/index.md","filePath":"zh/index.md","lastUpdated":1770887583000}'),o={name:"zh/index.md"};function r(h,e,n,d,s,m){return t(),l("div",null,[...e[0]||(e[0]=[i("",10)])])}const p=a(o,[["render",r]]);export{_ as __pageData,p as default};
@@ -1 +1 @@
import{_ as e,o as l,c as t,ag as a}from"./chunks/framework.ePeAWSvT.js";const u=JSON.parse('{"title":"术语规范","description":"","frontmatter":{},"headers":[],"relativePath":"zh/style/terminology.md","filePath":"zh/style/terminology.md","lastUpdated":1770887583000}'),i={name:"zh/style/terminology.md"};function r(n,o,s,d,c,h){return l(),t("div",null,[...o[0]||(o[0]=[a('<h1 id="术语规范" tabindex="-1">术语规范 <a class="header-anchor" href="#术语规范" aria-label="Permalink to &quot;术语规范&quot;"></a></h1><blockquote><p>适用对象:文档编写者与维护者。 本页用于统一写作语义,不是面向最终用户的功能说明。</p></blockquote><h2 id="规范术语" tabindex="-1">规范术语 <a class="header-anchor" href="#规范术语" aria-label="Permalink to &quot;规范术语&quot;"></a></h2><ul><li><strong>系统账号(<code>User</code></strong>Memoh 系统内账号。</li><li><strong>平台账号(<code>ChannelIdentity</code></strong>:用户在外部接入平台上的账号,不是 Memoh 内账号。</li><li><strong>接入平台(<code>channel</code></strong>:承载入站消息的外部平台。</li><li><strong>账号绑定(<code>bind</code></strong>:把平台账号关联到系统账号的过程。</li><li><strong>绑定码(Bind Code</strong>:用于账号绑定的一次性代码。</li><li><strong>Bot</strong>:由系统账号管理的资源与授权边界。</li></ul><h2 id="推荐写法" tabindex="-1">推荐写法 <a class="header-anchor" href="#推荐写法" aria-label="Permalink to &quot;推荐写法&quot;"></a></h2><ul><li>面向产品语义时,优先写 <strong>“平台账号”</strong>,不要直接写 actor。</li><li>描述业务行为时,优先写 <strong>“接入平台”</strong>,不要直接写 channel。</li><li>首次出现保留技术别名,后续可只用中文术语: <ul><li>平台账号(<code>ChannelIdentity</code></li><li>系统账号(<code>User</code></li><li>账号绑定(<code>bind</code></li></ul></li></ul><h2 id="禁用或不推荐写法" tabindex="-1">禁用或不推荐写法 <a class="header-anchor" href="#禁用或不推荐写法" aria-label="Permalink to &quot;禁用或不推荐写法&quot;"></a></h2><ul><li>在概念文档中直接使用 <strong>actor</strong>(除非明确引用代码符号)。</li><li>使用含糊表述如 <strong>“平台用户”</strong>(未区分系统账号与平台账号)。</li><li>写出“平台账号是 Memoh 内部账号”这类错误语义。</li></ul><h2 id="示例" tabindex="-1">示例 <a class="header-anchor" href="#示例" aria-label="Permalink to &quot;示例&quot;"></a></h2><ul><li>正确:<strong>“平台账号是用户在飞书上的账号,不是 Memoh 系统账号。”</strong></li><li>正确:<strong>“账号绑定用于把平台账号关联到系统账号。”</strong></li><li>错误:<strong>“Actor 是 Memoh 里的用户。”</strong></li></ul><h2 id="自检清单" tabindex="-1">自检清单 <a class="header-anchor" href="#自检清单" aria-label="Permalink to &quot;自检清单&quot;"></a></h2><ul><li>是否明确区分了系统账号与平台账号?</li><li>叙述中是否将 channel 表述为接入平台?</li><li>是否仅在首处保留技术别名?</li></ul>',12)])])}const m=e(i,[["render",r]]);export{u as __pageData,m as default};
import{_ as e,o as l,c as t,ag as a}from"./chunks/framework.BZohXCq9.js";const u=JSON.parse('{"title":"术语规范","description":"","frontmatter":{},"headers":[],"relativePath":"zh/style/terminology.md","filePath":"zh/style/terminology.md","lastUpdated":1770887583000}'),i={name:"zh/style/terminology.md"};function r(n,o,s,d,c,h){return l(),t("div",null,[...o[0]||(o[0]=[a('<h1 id="术语规范" tabindex="-1">术语规范 <a class="header-anchor" href="#术语规范" aria-label="Permalink to &quot;术语规范&quot;"></a></h1><blockquote><p>适用对象:文档编写者与维护者。 本页用于统一写作语义,不是面向最终用户的功能说明。</p></blockquote><h2 id="规范术语" tabindex="-1">规范术语 <a class="header-anchor" href="#规范术语" aria-label="Permalink to &quot;规范术语&quot;"></a></h2><ul><li><strong>系统账号(<code>User</code></strong>Memoh 系统内账号。</li><li><strong>平台账号(<code>ChannelIdentity</code></strong>:用户在外部接入平台上的账号,不是 Memoh 内账号。</li><li><strong>接入平台(<code>channel</code></strong>:承载入站消息的外部平台。</li><li><strong>账号绑定(<code>bind</code></strong>:把平台账号关联到系统账号的过程。</li><li><strong>绑定码(Bind Code</strong>:用于账号绑定的一次性代码。</li><li><strong>Bot</strong>:由系统账号管理的资源与授权边界。</li></ul><h2 id="推荐写法" tabindex="-1">推荐写法 <a class="header-anchor" href="#推荐写法" aria-label="Permalink to &quot;推荐写法&quot;"></a></h2><ul><li>面向产品语义时,优先写 <strong>“平台账号”</strong>,不要直接写 actor。</li><li>描述业务行为时,优先写 <strong>“接入平台”</strong>,不要直接写 channel。</li><li>首次出现保留技术别名,后续可只用中文术语: <ul><li>平台账号(<code>ChannelIdentity</code></li><li>系统账号(<code>User</code></li><li>账号绑定(<code>bind</code></li></ul></li></ul><h2 id="禁用或不推荐写法" tabindex="-1">禁用或不推荐写法 <a class="header-anchor" href="#禁用或不推荐写法" aria-label="Permalink to &quot;禁用或不推荐写法&quot;"></a></h2><ul><li>在概念文档中直接使用 <strong>actor</strong>(除非明确引用代码符号)。</li><li>使用含糊表述如 <strong>“平台用户”</strong>(未区分系统账号与平台账号)。</li><li>写出“平台账号是 Memoh 内部账号”这类错误语义。</li></ul><h2 id="示例" tabindex="-1">示例 <a class="header-anchor" href="#示例" aria-label="Permalink to &quot;示例&quot;"></a></h2><ul><li>正确:<strong>“平台账号是用户在飞书上的账号,不是 Memoh 系统账号。”</strong></li><li>正确:<strong>“账号绑定用于把平台账号关联到系统账号。”</strong></li><li>错误:<strong>“Actor 是 Memoh 里的用户。”</strong></li></ul><h2 id="自检清单" tabindex="-1">自检清单 <a class="header-anchor" href="#自检清单" aria-label="Permalink to &quot;自检清单&quot;"></a></h2><ul><li>是否明确区分了系统账号与平台账号?</li><li>叙述中是否将 channel 表述为接入平台?</li><li>是否仅在首处保留技术别名?</li></ul>',12)])])}const m=e(i,[["render",r]]);export{u as __pageData,m as default};
@@ -1 +1 @@
import{_ as e,o as l,c as t,ag as a}from"./chunks/framework.ePeAWSvT.js";const u=JSON.parse('{"title":"术语规范","description":"","frontmatter":{},"headers":[],"relativePath":"zh/style/terminology.md","filePath":"zh/style/terminology.md","lastUpdated":1770887583000}'),i={name:"zh/style/terminology.md"};function r(n,o,s,d,c,h){return l(),t("div",null,[...o[0]||(o[0]=[a("",12)])])}const m=e(i,[["render",r]]);export{u as __pageData,m as default};
import{_ as e,o as l,c as t,ag as a}from"./chunks/framework.BZohXCq9.js";const u=JSON.parse('{"title":"术语规范","description":"","frontmatter":{},"headers":[],"relativePath":"zh/style/terminology.md","filePath":"zh/style/terminology.md","lastUpdated":1770887583000}'),i={name:"zh/style/terminology.md"};function r(n,o,s,d,c,h){return l(),t("div",null,[...o[0]||(o[0]=[a("",12)])])}const m=e(i,[["render",r]]);export{u as __pageData,m as default};
File diff suppressed because one or more lines are too long
+5 -5
View File
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+6 -6
View File
File diff suppressed because one or more lines are too long
+6 -6
View File
File diff suppressed because one or more lines are too long
+26
View File
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -1 +1 @@
{"about.md":"gLogz9hP","blogs_2026-02-16.md":"CVgn4GCU","blogs_index.md":"DyCOc_Zm","channels_discord.md":"DBWQl28b","channels_feishu.md":"-Rc8F8IG","channels_index.md":"Cd1GuQFE","channels_telegram.md":"URjBaQHx","getting-started_bot.md":"CxYqtI4G","getting-started_browser.md":"CHy6pyTr","getting-started_channels.md":"DiSUpicV","getting-started_container.md":"CiSK-fMx","getting-started_email.md":"CKJOqdzG","getting-started_files.md":"Cl6keVS-","getting-started_heartbeat.md":"CgIS9a7z","getting-started_mcp.md":"DyRwe04F","getting-started_memory.md":"CVd8M6Eu","getting-started_provider-and-model.md":"BGpLYgEh","getting-started_schedule.md":"B0pL41RB","getting-started_search-provider.md":"CWTVwyy0","getting-started_skills.md":"EnvAtRea","getting-started_subagents.md":"B79V3Ppa","index.md":"7vMrZCVa","installation_docker.md":"Bk_onHJi","memory-providers_builtin.md":"Cgc3R-Wx","memory-providers_index.md":"DLe5Y0PL","zh_concepts_identity-and-binding.md":"B6I6pSqI","zh_concepts_index.md":"uaZIblvt","zh_index.md":"DbGu2QT1","zh_style_terminology.md":"C89A7q1C"}
{"about.md":"Dtv0dtOs","blogs_2026-02-16.md":"cjgZmunL","blogs_index.md":"B2P01evP","channels_discord.md":"WNpdGj29","channels_feishu.md":"BBJ8KQPd","channels_index.md":"T_VHXXZf","channels_qq.md":"B_4bodh-","channels_telegram.md":"B9i-uoiX","getting-started_bot.md":"AR4RHnpe","getting-started_browser.md":"B8YEEooM","getting-started_channels.md":"C0YPWL-y","getting-started_container.md":"D49M0dHe","getting-started_email.md":"BRkUZLh2","getting-started_files.md":"CczR71or","getting-started_heartbeat.md":"B-SMiJUD","getting-started_mcp.md":"Bb2toM2o","getting-started_memory.md":"Dt7Ez9Lk","getting-started_provider-and-model.md":"BquaPnJe","getting-started_schedule.md":"CNDu3SiN","getting-started_search-provider.md":"R9B5DkBj","getting-started_skills.md":"DzSZ-qiC","getting-started_subagents.md":"6oBLlW8a","index.md":"D1yGsPie","installation_docker.md":"qkaakAVc","memory-providers_builtin.md":"BDxazTz6","memory-providers_index.md":"DNPBOVmb","zh_concepts_identity-and-binding.md":"7e9GdoK6","zh_concepts_index.md":"Brd21jcS","zh_index.md":"CZQRt_rQ","zh_style_terminology.md":"DLv5QofI"}
+6 -6
View File
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long

Some files were not shown because too many files have changed in this diff Show More