mirror of
https://github.com/memohai/Memoh.git
synced 2026-04-27 07:16:19 +09:00
deploy: e16304d065
This commit is contained in:
@@ -9,7 +9,7 @@
|
||||
<link rel="preload stylesheet" href="/assets/style.DyXNA_8d.css" as="style">
|
||||
<link rel="preload stylesheet" href="/vp-icons.css" as="style">
|
||||
|
||||
<script type="module" src="/assets/app.CxqLIhm3.js"></script>
|
||||
<script type="module" src="/assets/app.C3UDSdfi.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("{\"blogs_2026-02-16.md\":\"CVgn4GCU\",\"blogs_index.md\":\"DyCOc_Zm\",\"cli_auth.md\":\"C8ws3CHD\",\"cli_bot.md\":\"BnhEB6FG\",\"cli_channel.md\":\"BBEJiWrG\",\"cli_chat.md\":\"Cr9VFV7R\",\"cli_config.md\":\"B8bSu8j2\",\"cli_index.md\":\"CZsWbIpX\",\"cli_model.md\":\"DjdZHTvQ\",\"cli_provider.md\":\"D1oztYQ9\",\"cli_schedule.md\":\"D2s8Q1KC\",\"concepts_bot.md\":\"C_C3siLW\",\"concepts_channel.md\":\"DdS-uyu8\",\"concepts_container.md\":\"Djausou_\",\"concepts_conversation-and-history.md\":\"BS_PnG4v\",\"concepts_index.md\":\"Ci6EwNPX\",\"concepts_mcp.md\":\"B9KnE-R7\",\"concepts_memory.md\":\"BgBEcLnX\",\"concepts_provider-and-model.md\":\"DQq3j0ql\",\"concepts_schedule.md\":\"COs_2DXO\",\"concepts_skills.md\":\"HeUi2diL\",\"concepts_subagents.md\":\"C0_bz0wW\",\"getting-started.md\":\"C9lgqnN0\",\"getting-started_create-bot.md\":\"Da6WTI-u\",\"getting-started_platform-telegram.md\":\"BlTohjMj\",\"getting-started_provider-and-model.md\":\"hf8EhYPV\",\"index.md\":\"BXBUN2vU\",\"installation_config-toml.md\":\"BasYU7hp\",\"installation_docker.md\":\"Ce3JA8xc\",\"troubleshooting.md\":\"rkMlAGoL\",\"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\":\"/getting-started.md\"},{\"text\":\"Installation\",\"items\":[{\"text\":\"Docker\",\"link\":\"/installation/docker.md\"},{\"text\":\"config.toml\",\"link\":\"/installation/config-toml.md\"}]},{\"text\":\"Getting Started\",\"items\":[{\"text\":\"Provider and Model\",\"link\":\"/getting-started/provider-and-model.md\"},{\"text\":\"Create Bot\",\"link\":\"/getting-started/create-bot.md\"},{\"text\":\"telegram platform\",\"link\":\"/getting-started/platform-telegram.md\"}]},{\"text\":\"Concepts\",\"items\":[{\"text\":\"Overview\",\"link\":\"/concepts/index.md\"},{\"text\":\"Bot\",\"link\":\"/concepts/bot.md\"},{\"text\":\"Provider and Model\",\"link\":\"/concepts/provider-and-model.md\"},{\"text\":\"Schedule\",\"link\":\"/concepts/schedule.md\"},{\"text\":\"Memory\",\"link\":\"/concepts/memory.md\"},{\"text\":\"Channel\",\"link\":\"/concepts/channel.md\"},{\"text\":\"Container\",\"link\":\"/concepts/container.md\"},{\"text\":\"MCP\",\"link\":\"/concepts/mcp.md\"},{\"text\":\"Subagents\",\"link\":\"/concepts/subagents.md\"},{\"text\":\"Skills\",\"link\":\"/concepts/skills.md\"},{\"text\":\"Conversation and History\",\"link\":\"/concepts/conversation-and-history.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\":\"Ce_QDK5Z\",\"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\":\"CflRB8ov\",\"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\":\"DhIuIiDU\",\"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\":\"BA7jSLuf\",\"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\":\"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\":\"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>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
+26
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +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":1772359263000}'),n={name:"about.md"};function r(s,e,l,c,d,u){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.CVaJS-5R.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.C3TxVq5K.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};
|
||||
@@ -0,0 +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 "Discord Channel Configuration""></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 "Step 1: Create a Discord Application""></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 "Step 2: Configure Bot Settings""></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 "Step 3: Invite the Bot to Your Server""></a></h2><ol><li>Go to <strong>OAuth2</strong> > <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 "Step 4: Configure Memoh""></a></h2><ol><li>Go to your Bot'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 "Features Supported""></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's slash commands (if configured via MCP).</li></ul>',13)])])}const u=t(i,[["render",n]]);export{p as __pageData,u as default};
|
||||
@@ -0,0 +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};
|
||||
@@ -0,0 +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 "Feishu (Lark) Channel Configuration""></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 "Step 1: Create a Feishu App""></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> > <strong>Credentials & 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 "Step 2: Enable Bot Capability""></a></h2><ol><li>In the Feishu Developer Console, go to <strong>Capabilities</strong> > <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 "Step 3: Configure Permissions""></a></h2><ol><li>Go to <strong>Capabilities</strong> > <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 "Step 4: Configure Events (Webhook Mode)""></a></h2><ol><li>In Memoh, go to your Bot'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> > <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 "Step 5: Publish Your App""></a></h2><ol><li>In the Feishu Console, go to <strong>App Release</strong> > <strong>Version Management & 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};
|
||||
@@ -0,0 +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};
|
||||
@@ -0,0 +1 @@
|
||||
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 "Channels Overview""></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 "General Setup Flow""></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'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};
|
||||
@@ -0,0 +1 @@
|
||||
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};
|
||||
@@ -0,0 +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 "Telegram Channel Configuration""></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 "Step 1: Create a Telegram Bot""></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 "Step 2: Configure Memoh""></a></h2><ol><li>Go to your Bot'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 "Step 3: Bind Your Identity (Optional)""></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> > <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 "Features Supported""></a></h2><ul><li><strong>Streaming</strong>: Responses appear as the bot "thinks."</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};
|
||||
@@ -0,0 +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};
|
||||
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
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
|
||||
import{_ as e,o as s,c as t,ag as i}from"./chunks/framework.ePeAWSvT.js";const u=JSON.parse('{"title":"Auth Commands","description":"","frontmatter":{},"headers":[],"relativePath":"cli/auth.md","filePath":"cli/auth.md","lastUpdated":1771161622000}'),o={name:"cli/auth.md"};function n(l,a,h,r,d,p){return s(),t("div",null,[...a[0]||(a[0]=[i('<h1 id="auth-commands" tabindex="-1">Auth Commands <a class="header-anchor" href="#auth-commands" aria-label="Permalink to "Auth Commands""></a></h1><h2 id="login" tabindex="-1">login <a class="header-anchor" href="#login" aria-label="Permalink to "login""></a></h2><p>Log in to the Memoh server. Prompts for username and password, then stores the JWT token in <code>~/.memoh/token.json</code>.</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</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;">memoh</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> login</span></span></code></pre></div><p>Interactive prompts:</p><ul><li>Username</li><li>Password</li></ul><h2 id="logout" tabindex="-1">logout <a class="header-anchor" href="#logout" aria-label="Permalink to "logout""></a></h2><p>Clear the stored token and log out.</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</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;">memoh</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> logout</span></span></code></pre></div><h2 id="whoami" tabindex="-1">whoami <a class="header-anchor" href="#whoami" aria-label="Permalink to "whoami""></a></h2><p>Show the current logged-in user (username, display name, user ID, role). Falls back to token info if the API call fails.</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</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;">memoh</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> whoami</span></span></code></pre></div>',12)])])}const m=e(o,[["render",n]]);export{u as __pageData,m as default};
|
||||
@@ -1 +0,0 @@
|
||||
import{_ as e,o as s,c as t,ag as i}from"./chunks/framework.ePeAWSvT.js";const u=JSON.parse('{"title":"Auth Commands","description":"","frontmatter":{},"headers":[],"relativePath":"cli/auth.md","filePath":"cli/auth.md","lastUpdated":1771161622000}'),o={name:"cli/auth.md"};function n(l,a,h,r,d,p){return s(),t("div",null,[...a[0]||(a[0]=[i("",12)])])}const m=e(o,[["render",n]]);export{u as __pageData,m as default};
|
||||
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
|
||||
import{_ as a,o as e,c as s,ag as i}from"./chunks/framework.ePeAWSvT.js";const b=JSON.parse('{"title":"Bot Commands","description":"","frontmatter":{},"headers":[],"relativePath":"cli/bot.md","filePath":"cli/bot.md","lastUpdated":1771161622000}'),d={name:"cli/bot.md"};function o(h,t,l,n,p,r){return e(),s("div",null,[...t[0]||(t[0]=[i("",27)])])}const k=a(d,[["render",o]]);export{b as __pageData,k as default};
|
||||
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
|
||||
import{_ as a,o as e,c as i,ag as s}from"./chunks/framework.ePeAWSvT.js";const k=JSON.parse('{"title":"Channel Commands","description":"","frontmatter":{},"headers":[],"relativePath":"cli/channel.md","filePath":"cli/channel.md","lastUpdated":1771161622000}'),n={name:"cli/channel.md"};function h(l,t,d,o,p,c){return e(),i("div",null,[...t[0]||(t[0]=[s("",25)])])}const g=a(n,[["render",h]]);export{k as __pageData,g as default};
|
||||
@@ -1,3 +0,0 @@
|
||||
import{_ as a,o as s,c as i,ag as e}from"./chunks/framework.ePeAWSvT.js";const k=JSON.parse('{"title":"Chat Commands","description":"","frontmatter":{},"headers":[],"relativePath":"cli/chat.md","filePath":"cli/chat.md","lastUpdated":1771161622000}'),h={name:"cli/chat.md"};function n(o,t,l,d,p,r){return s(),i("div",null,[...t[0]||(t[0]=[e(`<h1 id="chat-commands" tabindex="-1">Chat Commands <a class="header-anchor" href="#chat-commands" aria-label="Permalink to "Chat Commands""></a></h1><h2 id="default-interactive-chat" tabindex="-1">Default: Interactive Chat <a class="header-anchor" href="#default-interactive-chat" aria-label="Permalink to "Default: Interactive Chat""></a></h2><p>Running <code>memoh</code> with no subcommand starts an interactive chat. Use <code>--bot <id></code> to specify which bot to chat with; otherwise you'll be prompted to select one.</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</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;">memoh</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> [options]</span></span>
|
||||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">memoh</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --bot</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> <</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">bot_i</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">d</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">></span></span></code></pre></div><table tabindex="0"><thead><tr><th>Option</th><th>Description</th></tr></thead><tbody><tr><td><code>--bot <id></code></td><td>Bot ID to chat with</td></tr></tbody></table><p>Type your message and press Enter. Type <code>exit</code> to quit. Responses stream in real time.</p><h2 id="tui" tabindex="-1">tui <a class="header-anchor" href="#tui" aria-label="Permalink to "tui""></a></h2><p>Terminal UI chat session. Same behavior as the default chat but explicitly invoked.</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</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;">memoh</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> tui</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> [options]</span></span>
|
||||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">memoh</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> tui</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --bot</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> <</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">bot_i</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">d</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">></span></span></code></pre></div><table tabindex="0"><thead><tr><th>Option</th><th>Description</th></tr></thead><tbody><tr><td><code>--bot <id></code></td><td>Bot ID to chat with</td></tr></tbody></table><h2 id="version" tabindex="-1">version <a class="header-anchor" href="#version" aria-label="Permalink to "version""></a></h2><p>Show the CLI version.</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</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;">memoh</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> version</span></span></code></pre></div>`,13)])])}const b=a(h,[["render",n]]);export{k as __pageData,b as default};
|
||||
@@ -1 +0,0 @@
|
||||
import{_ as a,o as s,c as i,ag as e}from"./chunks/framework.ePeAWSvT.js";const k=JSON.parse('{"title":"Chat Commands","description":"","frontmatter":{},"headers":[],"relativePath":"cli/chat.md","filePath":"cli/chat.md","lastUpdated":1771161622000}'),h={name:"cli/chat.md"};function n(o,t,l,d,p,r){return s(),i("div",null,[...t[0]||(t[0]=[e("",13)])])}const b=a(h,[["render",n]]);export{k as __pageData,b as default};
|
||||
@@ -1,4 +0,0 @@
|
||||
import{_ as a,o as i,c as t,ag as e}from"./chunks/framework.ePeAWSvT.js";const g=JSON.parse('{"title":"Config Commands","description":"","frontmatter":{},"headers":[],"relativePath":"cli/config.md","filePath":"cli/config.md","lastUpdated":1771161622000}'),n={name:"cli/config.md"};function o(p,s,h,l,d,c){return i(),t("div",null,[...s[0]||(s[0]=[e(`<h1 id="config-commands" tabindex="-1">Config Commands <a class="header-anchor" href="#config-commands" aria-label="Permalink to "Config Commands""></a></h1><p>The CLI stores its config in <code>~/.memoh/config.toml</code>. Use these commands to view or update it.</p><h2 id="config" tabindex="-1">config <a class="header-anchor" href="#config" aria-label="Permalink to "config""></a></h2><p>Show the current config (host and port).</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</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;">memoh</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> config</span></span></code></pre></div><p>Output example:</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>host = "127.0.0.1"</span></span>
|
||||
<span class="line"><span>port = 8080</span></span></code></pre></div><h2 id="config-set" tabindex="-1">config set <a class="header-anchor" href="#config-set" aria-label="Permalink to "config set""></a></h2><p>Update the config. Prompts for host and port if not provided via options.</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</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;">memoh</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> config</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> set</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> [options]</span></span></code></pre></div><table tabindex="0"><thead><tr><th>Option</th><th>Description</th></tr></thead><tbody><tr><td><code>--host <host></code></td><td>API host (e.g. <code>127.0.0.1</code> or <code>api.example.com</code>)</td></tr><tr><td><code>--port <port></code></td><td>API port (default: 8080)</td></tr></tbody></table><p>Examples:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</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;">memoh</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> config</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> set</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --host</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> 192.168.1.100</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --port</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> 8080</span></span>
|
||||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">memoh</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> config</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> set</span></span>
|
||||
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># Interactive prompts for host and port</span></span></code></pre></div>`,13)])])}const k=a(n,[["render",o]]);export{g as __pageData,k as default};
|
||||
@@ -1 +0,0 @@
|
||||
import{_ as a,o as i,c as t,ag as e}from"./chunks/framework.ePeAWSvT.js";const g=JSON.parse('{"title":"Config Commands","description":"","frontmatter":{},"headers":[],"relativePath":"cli/config.md","filePath":"cli/config.md","lastUpdated":1771161622000}'),n={name:"cli/config.md"};function o(p,s,h,l,d,c){return i(),t("div",null,[...s[0]||(s[0]=[e("",13)])])}const k=a(n,[["render",o]]);export{g as __pageData,k as default};
|
||||
@@ -1,7 +0,0 @@
|
||||
import{_ as a,o as e,c as s,ag as i}from"./chunks/framework.ePeAWSvT.js";const m=JSON.parse('{"title":"Memoh CLI","description":"","frontmatter":{},"headers":[],"relativePath":"cli/index.md","filePath":"cli/index.md","lastUpdated":1771161622000}'),n={name:"cli/index.md"};function h(o,t,l,d,r,p){return e(),s("div",null,[...t[0]||(t[0]=[i(`<h1 id="memoh-cli" tabindex="-1">Memoh CLI <a class="header-anchor" href="#memoh-cli" aria-label="Permalink to "Memoh CLI""></a></h1><p>The Memoh CLI (<code>memoh</code>) is a command-line tool for managing bots, channels, providers, models, schedules, and chatting with bots. It talks to a running Memoh server via its API.</p><h2 id="installation" tabindex="-1">Installation <a class="header-anchor" href="#installation" aria-label="Permalink to "Installation""></a></h2><p>The CLI is part of the Memoh monorepo. Install from source:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</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;">git</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> clone</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> https://github.com/memohai/Memoh.git</span></span>
|
||||
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">cd</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> Memoh</span></span>
|
||||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">pnpm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> install</span></span></code></pre></div><p>Run the CLI:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">cd</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> packages/cli</span></span>
|
||||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">pnpm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> start</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --help</span></span></code></pre></div><p>To use <code>memoh</code> as a global command:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">cd</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> packages/cli</span></span>
|
||||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">pnpm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> build</span></span>
|
||||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">pnpm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> link</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --global</span></span>
|
||||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">memoh</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --help</span></span></code></pre></div><p>Ensure your Memoh server is running (see <a href="/installation/docker.html">Docker installation</a>) and the API is reachable at the configured host/port (default: <code>127.0.0.1:8080</code>).</p><h2 id="configuration" tabindex="-1">Configuration <a class="header-anchor" href="#configuration" aria-label="Permalink to "Configuration""></a></h2><p>The CLI stores config in <code>~/.memoh/config.toml</code> and auth token in <code>~/.memoh/token.json</code>. Use <code>memoh config</code> to view and <code>memoh config set</code> to change host/port.</p><h2 id="commands" tabindex="-1">Commands <a class="header-anchor" href="#commands" aria-label="Permalink to "Commands""></a></h2><table tabindex="0"><thead><tr><th>Command</th><th>Description</th></tr></thead><tbody><tr><td><a href="./auth.html#login">login</a></td><td>Log in to the Memoh server</td></tr><tr><td><a href="./auth.html#logout">logout</a></td><td>Log out and clear token</td></tr><tr><td><a href="./auth.html#whoami">whoami</a></td><td>Show current user</td></tr><tr><td><a href="./config.html">config</a></td><td>Show or update CLI config (host, port)</td></tr><tr><td><a href="./provider.html">provider</a></td><td>List, create, delete LLM providers</td></tr><tr><td><a href="./model.html">model</a></td><td>List, create, delete models</td></tr><tr><td><a href="./bot.html">bot</a></td><td>List, create, update, delete bots; chat; set model</td></tr><tr><td><a href="./channel.html">channel</a></td><td>List channels; get/set bot channel config; get/set user binding</td></tr><tr><td><a href="./schedule.html">schedule</a></td><td>List, create, update, toggle, delete bot schedules</td></tr><tr><td><a href="./chat.html">chat</a></td><td>Interactive chat with a bot (default command)</td></tr><tr><td><a href="./chat.html#tui">tui</a></td><td>Terminal UI chat session</td></tr><tr><td><a href="./chat.html#version">version</a></td><td>Show CLI version</td></tr></tbody></table><p>Most commands require authentication. Run <code>memoh login</code> first.</p>`,15)])])}const k=a(n,[["render",h]]);export{m as __pageData,k as default};
|
||||
@@ -1 +0,0 @@
|
||||
import{_ as a,o as e,c as s,ag as i}from"./chunks/framework.ePeAWSvT.js";const m=JSON.parse('{"title":"Memoh CLI","description":"","frontmatter":{},"headers":[],"relativePath":"cli/index.md","filePath":"cli/index.md","lastUpdated":1771161622000}'),n={name:"cli/index.md"};function h(o,t,l,d,r,p){return e(),s("div",null,[...t[0]||(t[0]=[i("",15)])])}const k=a(n,[["render",h]]);export{m as __pageData,k as default};
|
||||
@@ -1,4 +0,0 @@
|
||||
import{_ as i,o as e,c as a,ag as t}from"./chunks/framework.ePeAWSvT.js";const c=JSON.parse('{"title":"Model Commands","description":"","frontmatter":{},"headers":[],"relativePath":"cli/model.md","filePath":"cli/model.md","lastUpdated":1771410627000}'),d={name:"cli/model.md"};function l(n,s,h,p,o,k){return e(),a("div",null,[...s[0]||(s[0]=[t(`<h1 id="model-commands" tabindex="-1">Model Commands <a class="header-anchor" href="#model-commands" aria-label="Permalink to "Model Commands""></a></h1><p>Manage chat and embedding models.</p><h2 id="model-list" tabindex="-1">model list <a class="header-anchor" href="#model-list" aria-label="Permalink to "model list""></a></h2><p>List all models with their provider, type, client type, and multimodal flag.</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</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;">memoh</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> model</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> list</span></span></code></pre></div><h2 id="model-create" tabindex="-1">model create <a class="header-anchor" href="#model-create" aria-label="Permalink to "model create""></a></h2><p>Create a new model. Prompts for provider, model ID, type, client type, and (for embedding models) dimensions.</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</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;">memoh</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> model</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> create</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> [options]</span></span></code></pre></div><table tabindex="0"><thead><tr><th>Option</th><th>Description</th></tr></thead><tbody><tr><td><code>--model_id <id></code></td><td>Model ID (e.g. <code>gpt-4</code>, <code>text-embedding-3-small</code>)</td></tr><tr><td><code>--name <name></code></td><td>Display name</td></tr><tr><td><code>--provider <provider></code></td><td>Provider name</td></tr><tr><td><code>--client_type <type></code></td><td>Client type: <code>openai-responses</code>, <code>openai-completions</code>, <code>anthropic-messages</code>, <code>google-generative-ai</code></td></tr><tr><td><code>--type <type></code></td><td><code>chat</code> or <code>embedding</code></td></tr><tr><td><code>--dimensions <n></code></td><td>Embedding dimensions (required for embedding models)</td></tr><tr><td><code>--multimodal</code></td><td>Mark as multimodal</td></tr></tbody></table><p>Examples:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</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;">memoh</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> model</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> create</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --model_id</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> gpt-4</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --provider</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> my-openai</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --client_type</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> openai-responses</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --type</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> chat</span></span>
|
||||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">memoh</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> model</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> create</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --model_id</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> text-embedding-3-small</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --provider</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> my-openai</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --client_type</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> openai-completions</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --type</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> embedding</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --dimensions</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> 1536</span></span>
|
||||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">memoh</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> model</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> create</span></span>
|
||||
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># Interactive prompts</span></span></code></pre></div><h2 id="model-delete" tabindex="-1">model delete <a class="header-anchor" href="#model-delete" aria-label="Permalink to "model delete""></a></h2><p>Delete a model by model ID.</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</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;">memoh</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> model</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> delete</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --model</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> <</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">model_i</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">d</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">></span></span></code></pre></div><p>Example:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</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;">memoh</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> model</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> delete</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --model</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> gpt-4</span></span></code></pre></div>`,16)])])}const m=i(d,[["render",l]]);export{c as __pageData,m as default};
|
||||
@@ -1 +0,0 @@
|
||||
import{_ as i,o as e,c as a,ag as t}from"./chunks/framework.ePeAWSvT.js";const c=JSON.parse('{"title":"Model Commands","description":"","frontmatter":{},"headers":[],"relativePath":"cli/model.md","filePath":"cli/model.md","lastUpdated":1771410627000}'),d={name:"cli/model.md"};function l(n,s,h,p,o,k){return e(),a("div",null,[...s[0]||(s[0]=[t("",16)])])}const m=i(d,[["render",l]]);export{c as __pageData,m as default};
|
||||
@@ -1,4 +0,0 @@
|
||||
import{_ as i,o as a,c as e,ag as t}from"./chunks/framework.ePeAWSvT.js";const c=JSON.parse('{"title":"Provider Commands","description":"","frontmatter":{},"headers":[],"relativePath":"cli/provider.md","filePath":"cli/provider.md","lastUpdated":1771410627000}'),p={name:"cli/provider.md"};function h(l,s,n,r,d,o){return a(),e("div",null,[...s[0]||(s[0]=[t(`<h1 id="provider-commands" tabindex="-1">Provider Commands <a class="header-anchor" href="#provider-commands" aria-label="Permalink to "Provider Commands""></a></h1><p>Manage LLM providers (API endpoints and credentials).</p><h2 id="provider-list" tabindex="-1">provider list <a class="header-anchor" href="#provider-list" aria-label="Permalink to "provider list""></a></h2><p>List all providers. Optionally filter by provider name.</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</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;">memoh</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> provider</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> list</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> [options]</span></span></code></pre></div><table tabindex="0"><thead><tr><th>Option</th><th>Description</th></tr></thead><tbody><tr><td><code>--provider <name></code></td><td>Filter by provider name</td></tr></tbody></table><p>Examples:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</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;">memoh</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> provider</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> list</span></span>
|
||||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">memoh</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> provider</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> list</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --provider</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> my-openai</span></span></code></pre></div><h2 id="provider-create" tabindex="-1">provider create <a class="header-anchor" href="#provider-create" aria-label="Permalink to "provider create""></a></h2><p>Create a new provider. Prompts for any missing fields.</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</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;">memoh</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> provider</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> create</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> [options]</span></span></code></pre></div><table tabindex="0"><thead><tr><th>Option</th><th>Description</th></tr></thead><tbody><tr><td><code>--name <name></code></td><td>Provider name</td></tr><tr><td><code>--base_url <url></code></td><td>Base URL for the API</td></tr><tr><td><code>--api_key <key></code></td><td>API key</td></tr></tbody></table><p>Examples:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</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;">memoh</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> provider</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> create</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --name</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> my-ollama</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --base_url</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> http://localhost:11434/v1</span></span>
|
||||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">memoh</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> provider</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> create</span></span>
|
||||
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># Interactive prompts</span></span></code></pre></div><h2 id="provider-delete" tabindex="-1">provider delete <a class="header-anchor" href="#provider-delete" aria-label="Permalink to "provider delete""></a></h2><p>Delete a provider by name.</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</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;">memoh</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> provider</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> delete</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --provider</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> <</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">nam</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">e</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">></span></span></code></pre></div><p>Example:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</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;">memoh</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> provider</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> delete</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --provider</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> my-ollama</span></span></code></pre></div>`,19)])])}const F=i(p,[["render",h]]);export{c as __pageData,F as default};
|
||||
@@ -1 +0,0 @@
|
||||
import{_ as i,o as a,c as e,ag as t}from"./chunks/framework.ePeAWSvT.js";const c=JSON.parse('{"title":"Provider Commands","description":"","frontmatter":{},"headers":[],"relativePath":"cli/provider.md","filePath":"cli/provider.md","lastUpdated":1771410627000}'),p={name:"cli/provider.md"};function h(l,s,n,r,d,o){return a(),e("div",null,[...s[0]||(s[0]=[t("",19)])])}const F=i(p,[["render",h]]);export{c as __pageData,F as default};
|
||||
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
|
||||
import{_ as t,o as i,c as a,ag as e}from"./chunks/framework.ePeAWSvT.js";const c=JSON.parse('{"title":"Schedule Commands","description":"","frontmatter":{},"headers":[],"relativePath":"cli/schedule.md","filePath":"cli/schedule.md","lastUpdated":1771161622000}'),d={name:"cli/schedule.md"};function h(l,s,n,p,k,r){return i(),a("div",null,[...s[0]||(s[0]=[e("",22)])])}const g=t(d,[["render",h]]);export{c as __pageData,g as default};
|
||||
@@ -1 +0,0 @@
|
||||
import{_ as t,o as a,c as o,ag as i}from"./chunks/framework.ePeAWSvT.js";const p=JSON.parse('{"title":"Bot","description":"","frontmatter":{},"headers":[],"relativePath":"concepts/bot.md","filePath":"concepts/bot.md","lastUpdated":1771163124000}'),n={name:"concepts/bot.md"};function r(l,e,s,d,c,h){return a(),o("div",null,[...e[0]||(e[0]=[i('<h1 id="bot" tabindex="-1">Bot <a class="header-anchor" href="#bot" aria-label="Permalink to "Bot""></a></h1><p>A <strong>bot</strong> is the primary runtime entity in Memoh.</p><p>Each bot has its own:</p><ul><li>Configuration</li><li>Container lifecycle</li><li>Memory scope</li><li>Channel bindings</li><li>Model assignments</li></ul><h2 id="key-settings" tabindex="-1">Key Settings <a class="header-anchor" href="#key-settings" aria-label="Permalink to "Key Settings""></a></h2><ul><li><strong>max-load-time</strong> (<code>max_context_load_time</code>): how many minutes of recent conversation context are loaded into prompts</li><li><strong>language</strong>: preferred language for interaction (default is <code>auto</code>)</li><li><strong>chat model / memory model / embedding model</strong>: model IDs used by this bot</li></ul><h2 id="why-it-matters" tabindex="-1">Why It Matters <a class="header-anchor" href="#why-it-matters" aria-label="Permalink to "Why It Matters""></a></h2><p>The bot abstraction allows Memoh to isolate behavior and resources per agent, while keeping management centralized in one Web UI.</p><h2 id="web-ui-path" tabindex="-1">Web UI Path <a class="header-anchor" href="#web-ui-path" aria-label="Permalink to "Web UI Path""></a></h2><ul><li><code>Bots > Select a bot > Settings</code></li></ul>',10)])])}const u=t(n,[["render",r]]);export{p as __pageData,u as default};
|
||||
@@ -1 +0,0 @@
|
||||
import{_ as t,o as a,c as o,ag as i}from"./chunks/framework.ePeAWSvT.js";const p=JSON.parse('{"title":"Bot","description":"","frontmatter":{},"headers":[],"relativePath":"concepts/bot.md","filePath":"concepts/bot.md","lastUpdated":1771163124000}'),n={name:"concepts/bot.md"};function r(l,e,s,d,c,h){return a(),o("div",null,[...e[0]||(e[0]=[i("",10)])])}const u=t(n,[["render",r]]);export{p as __pageData,u as default};
|
||||
@@ -1 +0,0 @@
|
||||
import{_ as e,o as t,c as n,ag as l}from"./chunks/framework.ePeAWSvT.js";const p=JSON.parse('{"title":"Channel","description":"","frontmatter":{},"headers":[],"relativePath":"concepts/channel.md","filePath":"concepts/channel.md","lastUpdated":1771163124000}'),o={name:"concepts/channel.md"};function r(i,a,s,c,h,d){return t(),n("div",null,[...a[0]||(a[0]=[l('<h1 id="channel" tabindex="-1">Channel <a class="header-anchor" href="#channel" aria-label="Permalink to "Channel""></a></h1><p>A <strong>channel</strong> connects a bot to an external communication platform.</p><p>Examples include:</p><ul><li>Telegram</li><li>Feishu (Lark)</li><li>Web chat</li></ul><h2 id="what-a-channel-configuration-defines" tabindex="-1">What a Channel Configuration Defines <a class="header-anchor" href="#what-a-channel-configuration-defines" aria-label="Permalink to "What a Channel Configuration Defines""></a></h2><ul><li>Platform type and credentials</li><li>Message routing from external users to a target bot</li><li>Reply delivery back to the source platform</li></ul><h2 id="why-it-matters" tabindex="-1">Why It Matters <a class="header-anchor" href="#why-it-matters" aria-label="Permalink to "Why It Matters""></a></h2><p>Channels decouple bot logic from transport, so one bot can serve users across multiple platforms.</p><h2 id="web-ui-path" tabindex="-1">Web UI Path <a class="header-anchor" href="#web-ui-path" aria-label="Permalink to "Web UI Path""></a></h2><ul><li><code>Bots > Select a bot > Channels</code></li></ul>',10)])])}const f=e(o,[["render",r]]);export{p as __pageData,f as default};
|
||||
@@ -1 +0,0 @@
|
||||
import{_ as e,o as t,c as n,ag as l}from"./chunks/framework.ePeAWSvT.js";const p=JSON.parse('{"title":"Channel","description":"","frontmatter":{},"headers":[],"relativePath":"concepts/channel.md","filePath":"concepts/channel.md","lastUpdated":1771163124000}'),o={name:"concepts/channel.md"};function r(i,a,s,c,h,d){return t(),n("div",null,[...a[0]||(a[0]=[l("",10)])])}const f=e(o,[["render",r]]);export{p as __pageData,f as default};
|
||||
@@ -1 +0,0 @@
|
||||
import{_ as e,o as a,c as o,ag as n}from"./chunks/framework.ePeAWSvT.js";const u=JSON.parse('{"title":"Container","description":"","frontmatter":{},"headers":[],"relativePath":"concepts/container.md","filePath":"concepts/container.md","lastUpdated":1771163124000}'),i={name:"concepts/container.md"};function r(s,t,l,c,h,d){return a(),o("div",null,[...t[0]||(t[0]=[n('<h1 id="container" tabindex="-1">Container <a class="header-anchor" href="#container" aria-label="Permalink to "Container""></a></h1><p>Each bot runs in its own <strong>isolated container</strong>.</p><h2 id="what-isolation-gives-you" tabindex="-1">What Isolation Gives You <a class="header-anchor" href="#what-isolation-gives-you" aria-label="Permalink to "What Isolation Gives You""></a></h2><ul><li>Separate filesystem per bot</li><li>Separate runtime process space</li><li>Controlled lifecycle (create/start/stop/delete)</li></ul><p>This prevents one bot from interfering with another bot's execution environment.</p><h2 id="why-it-matters" tabindex="-1">Why It Matters <a class="header-anchor" href="#why-it-matters" aria-label="Permalink to "Why It Matters""></a></h2><p>Container isolation is the foundation that allows bots to run tools, commands, and file operations safely in parallel.</p><h2 id="web-ui-path" tabindex="-1">Web UI Path <a class="header-anchor" href="#web-ui-path" aria-label="Permalink to "Web UI Path""></a></h2><ul><li><code>Bots > Select a bot > Container</code></li></ul>',9)])])}const m=e(i,[["render",r]]);export{u as __pageData,m as default};
|
||||
@@ -1 +0,0 @@
|
||||
import{_ as e,o as a,c as o,ag as n}from"./chunks/framework.ePeAWSvT.js";const u=JSON.parse('{"title":"Container","description":"","frontmatter":{},"headers":[],"relativePath":"concepts/container.md","filePath":"concepts/container.md","lastUpdated":1771163124000}'),i={name:"concepts/container.md"};function r(s,t,l,c,h,d){return a(),o("div",null,[...t[0]||(t[0]=[n("",9)])])}const m=e(i,[["render",r]]);export{u as __pageData,m as default};
|
||||
@@ -1 +0,0 @@
|
||||
import{_ as e,o as a,c as o,ag as i}from"./chunks/framework.ePeAWSvT.js";const p=JSON.parse('{"title":"Conversation and History","description":"","frontmatter":{},"headers":[],"relativePath":"concepts/conversation-and-history.md","filePath":"concepts/conversation-and-history.md","lastUpdated":1771163124000}'),n={name:"concepts/conversation-and-history.md"};function s(r,t,l,c,h,d){return a(),o("div",null,[...t[0]||(t[0]=[i('<h1 id="conversation-and-history" tabindex="-1">Conversation and History <a class="header-anchor" href="#conversation-and-history" aria-label="Permalink to "Conversation and History""></a></h1><p>Memoh organizes interactions as <strong>conversations</strong> with preserved <strong>history</strong>.</p><h2 id="what-this-includes" tabindex="-1">What This Includes <a class="header-anchor" href="#what-this-includes" aria-label="Permalink to "What This Includes""></a></h2><ul><li>Ongoing chat context between users and bots</li><li>Message-level timeline and traceability</li><li>Source context for memory extraction and debugging</li></ul><h2 id="why-it-matters" tabindex="-1">Why It Matters <a class="header-anchor" href="#why-it-matters" aria-label="Permalink to "Why It Matters""></a></h2><p>Conversation history powers:</p><ul><li>Better response continuity</li><li>Auditing and troubleshooting</li><li>Post-hoc analysis of bot behavior</li></ul><h2 id="web-ui-path" tabindex="-1">Web UI Path <a class="header-anchor" href="#web-ui-path" aria-label="Permalink to "Web UI Path""></a></h2><ul><li><code>Chat > Select conversation</code></li><li><code>Bots > Select a bot > History</code></li></ul>',9)])])}const _=e(n,[["render",s]]);export{p as __pageData,_ as default};
|
||||
@@ -1 +0,0 @@
|
||||
import{_ as e,o as a,c as o,ag as i}from"./chunks/framework.ePeAWSvT.js";const p=JSON.parse('{"title":"Conversation and History","description":"","frontmatter":{},"headers":[],"relativePath":"concepts/conversation-and-history.md","filePath":"concepts/conversation-and-history.md","lastUpdated":1771163124000}'),n={name:"concepts/conversation-and-history.md"};function s(r,t,l,c,h,d){return a(),o("div",null,[...t[0]||(t[0]=[i("",9)])])}const _=e(n,[["render",s]]);export{p as __pageData,_ as default};
|
||||
@@ -1 +0,0 @@
|
||||
import{_ as t,o,c as n,ag as a}from"./chunks/framework.ePeAWSvT.js";const m=JSON.parse('{"title":"Concepts Overview","description":"","frontmatter":{},"headers":[],"relativePath":"concepts/index.md","filePath":"concepts/index.md","lastUpdated":1771163124000}'),r={name:"concepts/index.md"};function i(l,e,s,c,d,h){return o(),n("div",null,[...e[0]||(e[0]=[a('<h1 id="concepts-overview" tabindex="-1">Concepts Overview <a class="header-anchor" href="#concepts-overview" aria-label="Permalink to "Concepts Overview""></a></h1><p>This section explains the core design concepts behind Memoh.</p><p>Use these pages when you want to understand how Memoh is designed, why features exist, and how different parts work together.</p><h2 id="concept-map" tabindex="-1">Concept Map <a class="header-anchor" href="#concept-map" aria-label="Permalink to "Concept Map""></a></h2><ul><li><strong>Bot</strong>: the core runtime unit</li><li><strong>Provider and Model</strong>: how LLM capability is plugged in</li><li><strong>Memory</strong>: how long-term knowledge is stored and retrieved</li><li><strong>Channel</strong>: how external platforms connect to bots</li><li><strong>Schedule</strong>: how tasks are triggered automatically</li><li><strong>Container</strong>: isolated execution environment per bot</li><li><strong>MCP</strong>: external tool and service integration protocol</li><li><strong>Subagents</strong>: specialized delegated agents</li><li><strong>Skills</strong>: reusable capability prompts/instructions</li><li><strong>Conversation and History</strong>: chat context and traceability</li></ul><h2 id="recommended-reading-order" tabindex="-1">Recommended Reading Order <a class="header-anchor" href="#recommended-reading-order" aria-label="Permalink to "Recommended Reading Order""></a></h2><ol><li><a href="/concepts/bot.html">Bot</a></li><li><a href="/concepts/provider-and-model.html">Provider and Model</a></li><li><a href="/concepts/memory.html">Memory</a></li><li><a href="/concepts/channel.html">Channel</a></li><li><a href="/concepts/container.html">Container</a></li><li><a href="/concepts/schedule.html">Schedule</a></li><li><a href="/concepts/mcp.html">MCP</a></li><li><a href="/concepts/subagents.html">Subagents</a></li><li><a href="/concepts/skills.html">Skills</a></li><li><a href="/concepts/conversation-and-history.html">Conversation and History</a></li></ol>',7)])])}const g=t(r,[["render",i]]);export{m as __pageData,g as default};
|
||||
@@ -1 +0,0 @@
|
||||
import{_ as t,o,c as n,ag as a}from"./chunks/framework.ePeAWSvT.js";const m=JSON.parse('{"title":"Concepts Overview","description":"","frontmatter":{},"headers":[],"relativePath":"concepts/index.md","filePath":"concepts/index.md","lastUpdated":1771163124000}'),r={name:"concepts/index.md"};function i(l,e,s,c,d,h){return o(),n("div",null,[...e[0]||(e[0]=[a("",7)])])}const g=t(r,[["render",i]]);export{m as __pageData,g as default};
|
||||
@@ -1 +0,0 @@
|
||||
import{_ as a,o as e,c as o,ag as i}from"./chunks/framework.ePeAWSvT.js";const m=JSON.parse('{"title":"MCP","description":"","frontmatter":{},"headers":[],"relativePath":"concepts/mcp.md","filePath":"concepts/mcp.md","lastUpdated":1771163124000}'),s={name:"concepts/mcp.md"};function n(r,t,c,l,d,h){return e(),o("div",null,[...t[0]||(t[0]=[i('<h1 id="mcp" tabindex="-1">MCP <a class="header-anchor" href="#mcp" aria-label="Permalink to "MCP""></a></h1><p><strong>MCP (Model Context Protocol)</strong> connects Memoh bots to external tool services.</p><h2 id="what-mcp-adds" tabindex="-1">What MCP Adds <a class="header-anchor" href="#what-mcp-adds" aria-label="Permalink to "What MCP Adds""></a></h2><ul><li>Standardized tool discovery and invocation</li><li>Remote capability extension without changing core bot code</li><li>Per-bot integration flexibility</li></ul><p>Memoh supports MCP connections so bots can access external systems through a unified protocol.</p><h2 id="why-it-matters" tabindex="-1">Why It Matters <a class="header-anchor" href="#why-it-matters" aria-label="Permalink to "Why It Matters""></a></h2><p>MCP makes capability extension modular. You can add or swap tool backends with minimal coupling.</p><h2 id="web-ui-path" tabindex="-1">Web UI Path <a class="header-anchor" href="#web-ui-path" aria-label="Permalink to "Web UI Path""></a></h2><ul><li><code>Bots > Select a bot > MCP</code></li></ul>',9)])])}const u=a(s,[["render",n]]);export{m as __pageData,u as default};
|
||||
@@ -1 +0,0 @@
|
||||
import{_ as a,o as e,c as o,ag as i}from"./chunks/framework.ePeAWSvT.js";const m=JSON.parse('{"title":"MCP","description":"","frontmatter":{},"headers":[],"relativePath":"concepts/mcp.md","filePath":"concepts/mcp.md","lastUpdated":1771163124000}'),s={name:"concepts/mcp.md"};function n(r,t,c,l,d,h){return e(),o("div",null,[...t[0]||(t[0]=[i("",9)])])}const u=a(s,[["render",n]]);export{m as __pageData,u as default};
|
||||
@@ -1 +0,0 @@
|
||||
import{_ as t,o as a,c as o,ag as r}from"./chunks/framework.ePeAWSvT.js";const p=JSON.parse('{"title":"Memory","description":"","frontmatter":{},"headers":[],"relativePath":"concepts/memory.md","filePath":"concepts/memory.md","lastUpdated":1771163124000}'),i={name:"concepts/memory.md"};function s(n,e,l,m,c,d){return a(),o("div",null,[...e[0]||(e[0]=[r('<h1 id="memory" tabindex="-1">Memory <a class="header-anchor" href="#memory" aria-label="Permalink to "Memory""></a></h1><p><strong>Memory</strong> is Memoh's long-term knowledge system for each bot.</p><h2 id="how-it-works" tabindex="-1">How It Works <a class="header-anchor" href="#how-it-works" aria-label="Permalink to "How It Works""></a></h2><ul><li>Important facts are extracted from conversations</li><li>Memories are stored and indexed</li><li>Relevant memories are retrieved by semantic similarity when needed</li></ul><p>Memoh combines vector retrieval with keyword-style retrieval for better recall and precision.</p><h2 id="why-it-matters" tabindex="-1">Why It Matters <a class="header-anchor" href="#why-it-matters" aria-label="Permalink to "Why It Matters""></a></h2><p>Memory enables continuity across long timelines, so bots can maintain context beyond short prompt windows.</p><h2 id="web-ui-path" tabindex="-1">Web UI Path <a class="header-anchor" href="#web-ui-path" aria-label="Permalink to "Web UI Path""></a></h2><ul><li><code>Bots > Select a bot > Memory</code></li></ul>',9)])])}const y=t(i,[["render",s]]);export{p as __pageData,y as default};
|
||||
@@ -1 +0,0 @@
|
||||
import{_ as t,o as a,c as o,ag as r}from"./chunks/framework.ePeAWSvT.js";const p=JSON.parse('{"title":"Memory","description":"","frontmatter":{},"headers":[],"relativePath":"concepts/memory.md","filePath":"concepts/memory.md","lastUpdated":1771163124000}'),i={name:"concepts/memory.md"};function s(n,e,l,m,c,d){return a(),o("div",null,[...e[0]||(e[0]=[r("",9)])])}const y=t(i,[["render",s]]);export{p as __pageData,y as default};
|
||||
@@ -1 +0,0 @@
|
||||
import{_ as t,o,c as d,ag as a}from"./chunks/framework.ePeAWSvT.js";const m=JSON.parse('{"title":"Provider and Model","description":"","frontmatter":{},"headers":[],"relativePath":"concepts/provider-and-model.md","filePath":"concepts/provider-and-model.md","lastUpdated":1771410627000}'),i={name:"concepts/provider-and-model.md"};function r(n,e,l,s,c,p){return o(),d("div",null,[...e[0]||(e[0]=[a('<h1 id="provider-and-model" tabindex="-1">Provider and Model <a class="header-anchor" href="#provider-and-model" aria-label="Permalink to "Provider and Model""></a></h1><p>In Memoh, <strong>provider</strong> and <strong>model</strong> are separate but connected concepts:</p><ul><li>A <strong>provider</strong> is the LLM service configuration (API endpoint and key)</li><li>A <strong>model</strong> is the concrete chat or embedding model under that provider, including its <strong>client type</strong> which determines which API protocol to use</li></ul><h2 id="client-types" tabindex="-1">Client Types <a class="header-anchor" href="#client-types" aria-label="Permalink to "Client Types""></a></h2><p>Each model has a <code>client_type</code> that determines how Memoh communicates with the LLM service:</p><table tabindex="0"><thead><tr><th>Client Type</th><th>Description</th></tr></thead><tbody><tr><td><code>openai-responses</code></td><td>OpenAI Responses API</td></tr><tr><td><code>openai-completions</code></td><td>OpenAI Chat Completions API (also works with compatible services like Ollama, Mistral, etc.)</td></tr><tr><td><code>anthropic-messages</code></td><td>Anthropic Messages API</td></tr><tr><td><code>google-generative-ai</code></td><td>Google Generative AI API</td></tr></tbody></table><h2 id="typical-setup" tabindex="-1">Typical Setup <a class="header-anchor" href="#typical-setup" aria-label="Permalink to "Typical Setup""></a></h2><p>At minimum, a production-ready bot usually needs:</p><ul><li>One <strong>chat</strong> model for dialog generation</li><li>One <strong>embedding</strong> model for memory indexing and retrieval</li></ul><h2 id="model-assignment-to-bot" tabindex="-1">Model Assignment to Bot <a class="header-anchor" href="#model-assignment-to-bot" aria-label="Permalink to "Model Assignment to Bot""></a></h2><p>Bots reference model IDs in settings:</p><ul><li><code>chat_model_id</code></li><li><code>memory_model_id</code></li><li><code>embedding_model_id</code></li></ul><p>This enables per-bot customization (for quality, latency, or cost).</p><h2 id="web-ui-path" tabindex="-1">Web UI Path <a class="header-anchor" href="#web-ui-path" aria-label="Permalink to "Web UI Path""></a></h2><ul><li><code>Models > Add Provider > Select Provider > Add Model</code></li><li><code>Bots > Select a bot > Settings > Choose chat/memory/embedding models</code></li></ul>',15)])])}const g=t(i,[["render",r]]);export{m as __pageData,g as default};
|
||||
@@ -1 +0,0 @@
|
||||
import{_ as t,o,c as d,ag as a}from"./chunks/framework.ePeAWSvT.js";const m=JSON.parse('{"title":"Provider and Model","description":"","frontmatter":{},"headers":[],"relativePath":"concepts/provider-and-model.md","filePath":"concepts/provider-and-model.md","lastUpdated":1771410627000}'),i={name:"concepts/provider-and-model.md"};function r(n,e,l,s,c,p){return o(),d("div",null,[...e[0]||(e[0]=[a("",15)])])}const g=t(i,[["render",r]]);export{m as __pageData,g as default};
|
||||
@@ -1 +0,0 @@
|
||||
import{_ as a,o as t,c as o,ag as c}from"./chunks/framework.ePeAWSvT.js";const p=JSON.parse('{"title":"Schedule","description":"","frontmatter":{},"headers":[],"relativePath":"concepts/schedule.md","filePath":"concepts/schedule.md","lastUpdated":1771163124000}'),r={name:"concepts/schedule.md"};function l(s,e,d,i,n,u){return t(),o("div",null,[...e[0]||(e[0]=[c('<h1 id="schedule" tabindex="-1">Schedule <a class="header-anchor" href="#schedule" aria-label="Permalink to "Schedule""></a></h1><p>A <strong>schedule</strong> is a cron-based automation rule that runs bot commands at defined times.</p><h2 id="core-fields" tabindex="-1">Core Fields <a class="header-anchor" href="#core-fields" aria-label="Permalink to "Core Fields""></a></h2><ul><li><code>pattern</code>: cron expression</li><li><code>command</code>: command or task to execute</li><li><code>enabled</code>: whether the schedule is active</li><li><code>max_calls</code>: optional execution cap</li><li><code>current_calls</code>: current run count</li></ul><h2 id="why-it-matters" tabindex="-1">Why It Matters <a class="header-anchor" href="#why-it-matters" aria-label="Permalink to "Why It Matters""></a></h2><p>Schedules make bots proactive, not only reactive.<br> You can automate recurring operations like summaries, reminders, checks, and maintenance tasks.</p><h2 id="web-ui-path" tabindex="-1">Web UI Path <a class="header-anchor" href="#web-ui-path" aria-label="Permalink to "Web UI Path""></a></h2><ul><li><code>Not available in current Web UI</code></li></ul><blockquote><p>Schedule is supported by backend and CLI/API, but there is currently no dedicated schedule page in the Web UI.</p></blockquote>',9)])])}const m=a(r,[["render",l]]);export{p as __pageData,m as default};
|
||||
@@ -1 +0,0 @@
|
||||
import{_ as a,o as t,c as o,ag as c}from"./chunks/framework.ePeAWSvT.js";const p=JSON.parse('{"title":"Schedule","description":"","frontmatter":{},"headers":[],"relativePath":"concepts/schedule.md","filePath":"concepts/schedule.md","lastUpdated":1771163124000}'),r={name:"concepts/schedule.md"};function l(s,e,d,i,n,u){return t(),o("div",null,[...e[0]||(e[0]=[c("",9)])])}const m=a(r,[["render",l]]);export{p as __pageData,m as default};
|
||||
@@ -1 +0,0 @@
|
||||
import{_ as e,o as a,c as l,ag as i}from"./chunks/framework.ePeAWSvT.js";const d=JSON.parse('{"title":"Skills","description":"","frontmatter":{},"headers":[],"relativePath":"concepts/skills.md","filePath":"concepts/skills.md","lastUpdated":1771163124000}'),s={name:"concepts/skills.md"};function o(n,t,r,c,p,h){return a(),l("div",null,[...t[0]||(t[0]=[i('<h1 id="skills" tabindex="-1">Skills <a class="header-anchor" href="#skills" aria-label="Permalink to "Skills""></a></h1><p><strong>Skills</strong> are reusable capability instructions that guide how a bot (or subagent) solves specific classes of tasks.</p><h2 id="typical-skill-content" tabindex="-1">Typical Skill Content <a class="header-anchor" href="#typical-skill-content" aria-label="Permalink to "Typical Skill Content""></a></h2><ul><li>Scope and purpose</li><li>Input expectations</li><li>Execution steps</li><li>Constraints and output format</li></ul><h2 id="why-it-matters" tabindex="-1">Why It Matters <a class="header-anchor" href="#why-it-matters" aria-label="Permalink to "Why It Matters""></a></h2><p>Skills help keep behavior consistent, reduce prompt duplication, and make complex workflows easier to maintain.</p><h2 id="web-ui-path" tabindex="-1">Web UI Path <a class="header-anchor" href="#web-ui-path" aria-label="Permalink to "Web UI Path""></a></h2><ul><li><code>Bots > Select a bot > Subagents</code></li></ul><blockquote><p>Skills are currently primarily managed through agent/workspace configuration and runtime conventions, while subagent-related behavior is visible from the Subagents area.</p></blockquote>',9)])])}const k=e(s,[["render",o]]);export{d as __pageData,k as default};
|
||||
@@ -1 +0,0 @@
|
||||
import{_ as e,o as a,c as l,ag as i}from"./chunks/framework.ePeAWSvT.js";const d=JSON.parse('{"title":"Skills","description":"","frontmatter":{},"headers":[],"relativePath":"concepts/skills.md","filePath":"concepts/skills.md","lastUpdated":1771163124000}'),s={name:"concepts/skills.md"};function o(n,t,r,c,p,h){return a(),l("div",null,[...t[0]||(t[0]=[i("",9)])])}const k=e(s,[["render",o]]);export{d as __pageData,k as default};
|
||||
@@ -1 +0,0 @@
|
||||
import{_ as a,o as t,c as s,ag as o}from"./chunks/framework.ePeAWSvT.js";const b=JSON.parse('{"title":"Subagents","description":"","frontmatter":{},"headers":[],"relativePath":"concepts/subagents.md","filePath":"concepts/subagents.md","lastUpdated":1771163124000}'),r={name:"concepts/subagents.md"};function i(n,e,l,c,u,d){return t(),s("div",null,[...e[0]||(e[0]=[o('<h1 id="subagents" tabindex="-1">Subagents <a class="header-anchor" href="#subagents" aria-label="Permalink to "Subagents""></a></h1><p><strong>Subagents</strong> are specialized helper agents that a bot can delegate tasks to.</p><h2 id="core-idea" tabindex="-1">Core Idea <a class="header-anchor" href="#core-idea" aria-label="Permalink to "Core Idea""></a></h2><ul><li>The main bot acts as coordinator</li><li>Subagents focus on narrower tasks</li><li>Results are combined back into the main workflow</li></ul><p>This supports decomposition of complex requests into smaller, more reliable execution units.</p><h2 id="why-it-matters" tabindex="-1">Why It Matters <a class="header-anchor" href="#why-it-matters" aria-label="Permalink to "Why It Matters""></a></h2><p>Subagent architecture improves scalability for multi-step tasks and helps separate responsibilities by role.</p><h2 id="web-ui-path" tabindex="-1">Web UI Path <a class="header-anchor" href="#web-ui-path" aria-label="Permalink to "Web UI Path""></a></h2><ul><li><code>Bots > Select a bot > Subagents</code></li></ul>',9)])])}const p=a(r,[["render",i]]);export{b as __pageData,p as default};
|
||||
@@ -1 +0,0 @@
|
||||
import{_ as a,o as t,c as s,ag as o}from"./chunks/framework.ePeAWSvT.js";const b=JSON.parse('{"title":"Subagents","description":"","frontmatter":{},"headers":[],"relativePath":"concepts/subagents.md","filePath":"concepts/subagents.md","lastUpdated":1771163124000}'),r={name:"concepts/subagents.md"};function i(n,e,l,c,u,d){return t(),s("div",null,[...e[0]||(e[0]=[o("",9)])])}const p=a(r,[["render",i]]);export{b as __pageData,p as default};
|
||||
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
|
||||
import{_ as t,o as a,c as o,ag as i}from"./chunks/framework.ePeAWSvT.js";const u=JSON.parse('{"title":"About Memoh","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started.md","filePath":"getting-started.md","lastUpdated":1771410627000}'),n={name:"getting-started.md"};function r(l,e,s,c,d,h){return a(),o("div",null,[...e[0]||(e[0]=[i("",31)])])}const p=t(n,[["render",r]]);export{u as __pageData,p as default};
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
import{_ as e,o,c as a,ag as n}from"./chunks/framework.ePeAWSvT.js";const m=JSON.parse('{"title":"Bot Management","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/bot.md","filePath":"getting-started/bot.md","lastUpdated":1772359263000}'),r={name:"getting-started/bot.md"};function i(s,t,l,d,g,h){return o(),a("div",null,[...t[0]||(t[0]=[n("",23)])])}const b=e(r,[["render",i]]);export{m as __pageData,b as default};
|
||||
@@ -0,0 +1 @@
|
||||
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 "Bot Channels""></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 "Concept: Unified Communication""></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 "Supported Channels""></a></h2><p>Configure your bot'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 "Popular Platforms""></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 "Configuration Flow""></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 "1. Adding a Channel""></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 "2. Common Fields""></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 "3. Special Case: Feishu Webhook""></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'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 "Operations""></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's active status.</li><li><strong>Delete</strong>: Permanently remove a channel's configuration.</li></ul>',22)])])}const p=a(i,[["render",r]]);export{g as __pageData,p as default};
|
||||
@@ -0,0 +1 @@
|
||||
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};
|
||||
@@ -0,0 +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 "Bot Container Management""></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 "Concept: The Isolated Workspace""></a></h2><p>The container acts as the bot's private "computer." 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 "Operations""></a></h2><p>Manage the lifecycle of your bot'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 "Lifecycle Actions""></a></h3><ul><li><strong>Create</strong>: Initialize the container if it doesn'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 "Container Information""></a></h2><p>The <strong>Container</strong> tab displays real-time data about the bot's runtime:</p><ul><li><strong>Container ID</strong>: Unique identifier for the instance.</li><li><strong>Status</strong>: Whether it'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 "Snapshots""></a></h2><p>Snapshots allow you to capture the current state of the bot's container and restore it later. This is useful for:</p><ul><li>Saving a known good configuration</li><li>Versioning the bot'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 "Creating a Snapshot""></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 "Restoring a Snapshot""></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 "Managing Snapshots""></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};
|
||||
@@ -0,0 +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};
|
||||
@@ -1 +0,0 @@
|
||||
import{_ as e,o,c as a,ag as r}from"./chunks/framework.ePeAWSvT.js";const n="/getting-started/bots-01-sidebar.png",s="/getting-started/bots-02-create-bot.png",i="/getting-started/bots-03-config.png",c="/getting-started/bots-04-setting.png",d="/getting-started/bots-05-chat.png",_=JSON.parse('{"title":"Create Bot","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/create-bot.md","filePath":"getting-started/create-bot.md","lastUpdated":1771405736000}'),p={name:"getting-started/create-bot.md"};function l(g,t,h,b,u,m){return o(),a("div",null,[...t[0]||(t[0]=[r('<h1 id="create-bot" tabindex="-1">Create Bot <a class="header-anchor" href="#create-bot" aria-label="Permalink to "Create Bot""></a></h1><h2 id="prerequisites" tabindex="-1">Prerequisites <a class="header-anchor" href="#prerequisites" aria-label="Permalink to "Prerequisites""></a></h2><ul><li>Complete the provider and model configuration.</li></ul><h2 id="step-1-open-the-bot-page" tabindex="-1">Step 1: Open the Bot Page <a class="header-anchor" href="#step-1-open-the-bot-page" aria-label="Permalink to "Step 1: Open the Bot Page""></a></h2><p>Click <strong>Bots</strong> in the left sidebar to open the Bots configuration page.</p><p><img src="'+n+'" alt="Bots page - sidebar"></p><h2 id="step-2-create-a-bot" tabindex="-1">Step 2: create a Bot <a class="header-anchor" href="#step-2-create-a-bot" aria-label="Permalink to "Step 2: create a Bot""></a></h2><p>Click the <strong>New Bot</strong> button (with a plus icon)</p><p><img src="'+s+'" alt="Create Bot button"></p><p>In the dialog, fill in:</p><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 this bot (e.g. <code>my-bot</code>, <code>telegram-public-bot</code>)</td></tr><tr><td><strong>Avatar URL</strong></td><td>The API base Avatar (e.g.<code>https://gravatar.com/avatar/***</code>)</td></tr><tr><td><strong>Type</strong></td><td>Bots type: <code>person</code>, <code>public</code>, public for channel(e.g. <code>telegram</code> group, <code>qq</code> group, <code>discord</code> channel, person for bind user)</td></tr></tbody></table><h2 id="step-3-bot-configuration" tabindex="-1">Step 3: Bot Configuration <a class="header-anchor" href="#step-3-bot-configuration" aria-label="Permalink to "Step 3: Bot Configuration""></a></h2><p>Click one <strong>bot</strong> Card in Bots page</p><p><img src="'+i+'" alt="Bot Configuration"></p><p>open <strong>settings</strong> section</p><p><img src="'+c+'" alt="setting"></p><p>select your available <code>Chat Model</code>, <code>Memory Model</code>, <code>Embedding Model</code> and save for basic Configuration</p><h2 id="step-4-check-bot" tabindex="-1">Step 4: Check Bot <a class="header-anchor" href="#step-4-check-bot" aria-label="Permalink to "Step 4: Check Bot""></a></h2><p>Click <strong>Chat</strong> in the left sidebar to open chat page. then type your prompt to test the Bot configuration</p><p><img src="'+d+'" alt="alt text"></p><h2 id="next-steps" tabindex="-1">Next Steps <a class="header-anchor" href="#next-steps" aria-label="Permalink to "Next Steps""></a></h2><ul><li>add <a href="/concepts/channel.html">channel</a> to <code>Platform</code>(e.g. <a href="/getting-started/platform-telegram.html">telegram</a>, <code>feishu(lark)</code>, <code>wechat</code>, <code>discord</code>)</li><li>manage your bot <a href="/concepts/memory.html">Memory</a></li></ul>',22)])])}const B=e(p,[["render",l]]);export{_ as __pageData,B as default};
|
||||
@@ -1 +0,0 @@
|
||||
import{_ as e,o,c as a,ag as r}from"./chunks/framework.ePeAWSvT.js";const n="/getting-started/bots-01-sidebar.png",s="/getting-started/bots-02-create-bot.png",i="/getting-started/bots-03-config.png",c="/getting-started/bots-04-setting.png",d="/getting-started/bots-05-chat.png",_=JSON.parse('{"title":"Create Bot","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/create-bot.md","filePath":"getting-started/create-bot.md","lastUpdated":1771405736000}'),p={name:"getting-started/create-bot.md"};function l(g,t,h,b,u,m){return o(),a("div",null,[...t[0]||(t[0]=[r("",22)])])}const B=e(p,[["render",l]]);export{_ as __pageData,B as default};
|
||||
@@ -0,0 +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 "Email Providers and Bindings""></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 "Concept: Email as a Bot Channel""></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 "Email Provider""></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 "Creating a Provider""></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 "Bot Email Bindings""></a></h2><p>Configure your bot'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 "Adding a Binding""></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'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 "Outbox and History""></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's email address.</li><li><strong>Subject</strong>: The email'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 "Bot Interaction""></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 "converse" via email just as it does via chat.</li></ul>',22)])])}const u=i(n,[["render",r]]);export{m as __pageData,u as default};
|
||||
@@ -0,0 +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};
|
||||
@@ -0,0 +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 "Bot Files Management""></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 "Operations""></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 "Browsing and Navigation""></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 "Managing Files""></a></h3><ul><li><strong>Upload</strong>: Select files from your local computer to transfer them into the bot'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'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 "Viewing and Editing""></a></h2><p>The integrated <strong>FileViewer</strong> allows you to interact with the bot'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 "Text Files""></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's content and click <strong>Save</strong> to apply the changes to the bot's filesystem.</li></ul><h3 id="images" tabindex="-1">Images <a class="header-anchor" href="#images" aria-label="Permalink to "Images""></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 "Bot Interaction with Files""></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's workspace.</li></ul>',20)])])}const f=t(n,[["render",r]]);export{m as __pageData,f as default};
|
||||
@@ -0,0 +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};
|
||||
@@ -0,0 +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 "Bot Heartbeat""></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'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 "Concept: Scheduled Autonomy""></a></h2><p>A <strong>Heartbeat</strong> is a recurring trigger that prompts the bot to "think" 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 "Configuration""></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 "Logs and Monitoring""></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'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 "Managing Logs""></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 "Bot Interaction""></a></h2><ul><li>During a heartbeat, the bot receives a special system prompt that it should perform its "routine" 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 "memory" of the bot's autonomous activities.</li></ul>',18)])])}const b=e(n,[["render",i]]);export{c as __pageData,b as default};
|
||||
@@ -0,0 +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};
|
||||
@@ -0,0 +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 "MCP Connections""></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 "Concept: Extending Bot Capabilities""></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 "Connection Types""></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 "1. Stdio (Local Process)""></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 "2. Remote (HTTP/SSE)""></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 "Operations""></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 "Bot Interaction""></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};
|
||||
@@ -0,0 +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};
|
||||
@@ -0,0 +1 @@
|
||||
import{_ as t,o,c as a,ag as r}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":1772359263000}'),i={name:"getting-started/memory.md"};function n(s,e,m,l,c,h){return o(),a("div",null,[...e[0]||(e[0]=[r('<h1 id="bot-memory-management" tabindex="-1">Bot Memory Management <a class="header-anchor" href="#bot-memory-management" aria-label="Permalink to "Bot Memory Management""></a></h1><p>Memoh's structured long-term memory system allows Bots to remember information across multiple conversations, providing contextually relevant and personalized interactions.</p><h2 id="concept-semantic-search" tabindex="-1">Concept: Semantic Search <a class="header-anchor" href="#concept-semantic-search" aria-label="Permalink to "Concept: Semantic Search""></a></h2><p>Memories are stored in a <strong>Qdrant</strong> vector database. When a user asks a question, Memoh performs a semantic search to find the most relevant "memories" and includes them in the bot's system prompt.</p><hr><h2 id="operations" tabindex="-1">Operations <a class="header-anchor" href="#operations" aria-label="Permalink to "Operations""></a></h2><p>Manage your bot's memories from the <strong>Memory</strong> tab in the Bot Detail page.</p><h3 id="_1-creating-memories" tabindex="-1">1. Creating Memories <a class="header-anchor" href="#_1-creating-memories" aria-label="Permalink to "1. Creating Memories""></a></h3><ul><li><strong>New Memory</strong>: Manually enter a memory's content in the provided textarea.</li><li><strong>From Conversation</strong>: Select specific messages from the bot's conversation history to "extract" into memory.</li></ul><h3 id="_2-searching-and-managing" tabindex="-1">2. Searching and Managing <a class="header-anchor" href="#_2-searching-and-managing" aria-label="Permalink to "2. Searching and Managing""></a></h3><ul><li><strong>Search</strong>: Filter memories by ID or text content.</li><li><strong>Edit</strong>: Modify existing memory entries directly in the list.</li><li><strong>Delete</strong>: Remove memories that are no longer needed.</li></ul><hr><h2 id="memory-compression-compact" tabindex="-1">Memory Compression (Compact) <a class="header-anchor" href="#memory-compression-compact" aria-label="Permalink to "Memory Compression (Compact)""></a></h2><p>Over time, memories can accumulate and become redundant. The <strong>Compact</strong> feature helps optimize the memory pool.</p><ul><li><strong>Ratio</strong>: Set the compression ratio (e.g., <code>0.8</code>, <code>0.5</code>, <code>0.3</code>) to determine how much information is retained.</li><li><strong>Decay Days</strong>: Optionally specify a time window to only compact memories older than a certain number of days.</li></ul><hr><h2 id="visualization-vector-manifold" tabindex="-1">Visualization: Vector Manifold <a class="header-anchor" href="#visualization-vector-manifold" aria-label="Permalink to "Visualization: Vector Manifold""></a></h2><p>The Memory tab includes advanced visual tools to help you understand how the memory system is performing:</p><h3 id="top-k-bucket-chart" tabindex="-1">Top-K Bucket Chart <a class="header-anchor" href="#top-k-bucket-chart" aria-label="Permalink to "Top-K Bucket Chart""></a></h3><p>Shows the distribution of relevant memories retrieved for the most recent queries.</p><h3 id="cdf-curve-cumulative-distribution-function" tabindex="-1">CDF Curve (Cumulative Distribution Function) <a class="header-anchor" href="#cdf-curve-cumulative-distribution-function" aria-label="Permalink to "CDF Curve (Cumulative Distribution Function)""></a></h3><p>Visualizes the scoring threshold of retrieved memories, helping you fine-tune how much "relevant" information the bot should consider.</p><hr><h2 id="bot-interaction" tabindex="-1">Bot Interaction <a class="header-anchor" href="#bot-interaction" aria-label="Permalink to "Bot Interaction""></a></h2><ul><li>The bot will automatically search for and retrieve memories during every interaction.</li><li>The <strong>Memory Model</strong> configured in the <strong>Settings</strong> tab is used for extracting and summarizing these memories.</li><li>Memories provide the "long-term knowledge" that makes each bot unique to its owner.</li></ul>',25)])])}const g=t(i,[["render",n]]);export{u as __pageData,g as default};
|
||||
@@ -0,0 +1 @@
|
||||
import{_ as t,o,c as a,ag as r}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":1772359263000}'),i={name:"getting-started/memory.md"};function n(s,e,m,l,c,h){return o(),a("div",null,[...e[0]||(e[0]=[r("",25)])])}const g=t(i,[["render",n]]);export{u as __pageData,g as default};
|
||||
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
|
||||
import{_ as t,o,c as a,ag as r}from"./chunks/framework.ePeAWSvT.js";const n="/getting-started/platform-telegram-01-platforms.png",l="/getting-started/platform-telegram-02-bindcode.png",u=JSON.parse('{"title":"Configure Telegram Channel","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/platform-telegram.md","filePath":"getting-started/platform-telegram.md","lastUpdated":1771405736000}'),s={name:"getting-started/platform-telegram.md"};function i(d,e,c,h,p,g){return o(),a("div",null,[...e[0]||(e[0]=[r("",32)])])}const b=t(s,[["render",i]]);export{u as __pageData,b as default};
|
||||
@@ -0,0 +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 "LLM Provider and Model""></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 "LLM Provider""></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 "Creating a Provider""></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., "OpenAI").</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 "Managing Providers""></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 "Model""></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 "Adding a Model""></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 "Managing Models""></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 "Next Steps""></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};
|
||||
@@ -0,0 +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};
|
||||
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
|
||||
import{_ as t,o,c as d,ag as r}from"./chunks/framework.ePeAWSvT.js";const a="/getting-started/provider-model-01-sidebar.png",i="/getting-started/provider-model-02-add-provider.png",l="/getting-started/provider-model-03-provider-dialog.png",n="/getting-started/provider-model-04-provider-selected.png",v=JSON.parse('{"title":"Configure Provider and Model","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/provider-and-model.md","filePath":"getting-started/provider-and-model.md","lastUpdated":1771410627000}'),s={name:"getting-started/provider-and-model.md"};function p(c,e,g,h,m,u){return o(),d("div",null,[...e[0]||(e[0]=[r("",34)])])}const f=t(s,[["render",p]]);export{v as __pageData,f as default};
|
||||
@@ -0,0 +1,14 @@
|
||||
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 "Scheduled Tasks""></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 "Concept: Cron-Based Automation""></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 "Schedule Fields""></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., "Morning News Summary").</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., "Summarize today's top tech news and send it to the Telegram channel").</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 "Cron Pattern Reference""></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 (0–59)</span></span>
|
||||
<span class="line"><span>│ ┌───────────── hour (0–23)</span></span>
|
||||
<span class="line"><span>│ │ ┌───────────── day of month (1–31)</span></span>
|
||||
<span class="line"><span>│ │ │ ┌───────────── month (1–12)</span></span>
|
||||
<span class="line"><span>│ │ │ │ ┌───────────── day of week (0–6, Sun=0)</span></span>
|
||||
<span class="line"><span>│ │ │ │ │</span></span>
|
||||
<span class="line"><span>* * * * *</span></span></code></pre></div><p><strong>Common examples:</strong></p><table tabindex="0"><thead><tr><th>Pattern</th><th>Meaning</th></tr></thead><tbody><tr><td><code>0 9 * * *</code></td><td>Every day at 9:00 AM</td></tr><tr><td><code>*/30 * * * *</code></td><td>Every 30 minutes</td></tr><tr><td><code>0 0 * * 1</code></td><td>Every Monday at midnight</td></tr><tr><td><code>0 8,20 * * *</code></td><td>Every day at 8:00 AM and 8:00 PM</td></tr><tr><td><code>0 0 1 * *</code></td><td>First day of every month at midnight</td></tr></tbody></table><hr><h2 id="viewing-schedules" tabindex="-1">Viewing Schedules <a class="header-anchor" href="#viewing-schedules" aria-label="Permalink to "Viewing Schedules""></a></h2><ol><li>Navigate to the Bot <strong>Detail Page</strong>.</li><li>Select the <strong>Schedule</strong> tab.</li><li>The list shows all schedules for this bot, including their name, cron pattern, enabled status, and execution counts.</li><li>Click <strong>Refresh</strong> to reload the list.</li></ol><hr><h2 id="creating-schedules" tabindex="-1">Creating Schedules <a class="header-anchor" href="#creating-schedules" aria-label="Permalink to "Creating Schedules""></a></h2><p>Schedules are primarily created in two ways:</p><h3 id="via-the-bot-conversational" tabindex="-1">Via the Bot (Conversational) <a class="header-anchor" href="#via-the-bot-conversational" aria-label="Permalink to "Via the Bot (Conversational)""></a></h3><p>The bot itself has access to a <code>schedule</code> tool. You can ask the bot to create a schedule in natural language:</p><blockquote><p>"Create a schedule called 'Daily Digest' that runs every day at 8 AM and sends me a summary of my unread emails."</p></blockquote><p>The bot will translate this into a cron expression and register the schedule automatically.</p><h3 id="via-the-api" tabindex="-1">Via the API <a class="header-anchor" href="#via-the-api" aria-label="Permalink to "Via the API""></a></h3><p>You can also create schedules programmatically using the REST API:</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>POST /api/bots/{bot_id}/schedule</span></span></code></pre></div><div class="language-json vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">json</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">{</span></span>
|
||||
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> "name"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"Daily Digest"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
|
||||
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> "description"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"Summarize unread emails every morning"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
|
||||
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> "pattern"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"0 8 * * *"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
|
||||
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> "command"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"Summarize my unread emails and send the result to Telegram."</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
|
||||
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> "enabled"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">true</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
|
||||
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> "max_calls"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">null</span></span>
|
||||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></div><hr><h2 id="execution-flow" tabindex="-1">Execution Flow <a class="header-anchor" href="#execution-flow" aria-label="Permalink to "Execution Flow""></a></h2><p>When a schedule fires:</p><ol><li>The cron service triggers the schedule.</li><li>The <code>current_calls</code> counter is incremented.</li><li>If <code>max_calls</code> is set and reached, the schedule is automatically disabled.</li><li>The agent receives the <code>command</code> along with the schedule context.</li><li>The agent executes the command using its tools (e.g., web search, file read, send message).</li><li>Results can be delivered to any connected channel.</li></ol><hr><h2 id="schedule-vs-heartbeat" tabindex="-1">Schedule vs. Heartbeat <a class="header-anchor" href="#schedule-vs-heartbeat" aria-label="Permalink to "Schedule vs. Heartbeat""></a></h2><table tabindex="0"><thead><tr><th>Feature</th><th>Schedule</th><th>Heartbeat</th></tr></thead><tbody><tr><td><strong>Trigger</strong></td><td>Cron expression (flexible timing)</td><td>Fixed interval (minutes)</td></tr><tr><td><strong>Command</strong></td><td>Custom natural-language instruction</td><td>Generic "routine check" prompt</td></tr><tr><td><strong>Max Calls</strong></td><td>Optional execution limit</td><td>Unlimited</td></tr><tr><td><strong>Use Case</strong></td><td>Specific recurring tasks</td><td>Periodic autonomous thinking</td></tr></tbody></table><p>Both features complement each other: use <strong>Heartbeat</strong> for general-purpose periodic activity and <strong>Schedule</strong> for precise, task-oriented automation.</p>`,35)])])}const g=t(i,[["render",r]]);export{u as __pageData,g as default};
|
||||
@@ -0,0 +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};
|
||||
@@ -0,0 +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 "Search Providers""></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 "Concept: Real-Time Knowledge""></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 "Supported Search Engines""></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 "Configuration Flow""></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 "1. Adding a Search Provider""></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., "My Brave Search").</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 "2. Managing Providers""></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 "Assigning a Search Provider to a Bot""></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 "Bot Interaction""></a></h2><ul><li>When a user'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};
|
||||
@@ -0,0 +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};
|
||||
@@ -0,0 +1,8 @@
|
||||
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 "Bot Skills""></a></h1><p>Skills are the "personality" and "capabilities" 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 "Concept: Skills as Markdown""></a></h2><p>A <strong>Skill</strong> is represented as a Markdown document with YAML frontmatter. These files are stored within the bot'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 "Example Skill Structure""></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>
|
||||
<span class="line"></span>
|
||||
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># Coder Skill</span></span>
|
||||
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">As a coder, you always follow best practices and write clean, documented code.</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> </span></span>
|
||||
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">You can use the \`edit_file\` and \`run_command\` tools to assist the user.</span></span></code></pre></div><hr><h2 id="managing-skills" tabindex="-1">Managing Skills <a class="header-anchor" href="#managing-skills" aria-label="Permalink to "Managing Skills""></a></h2><p>Manage your bot's skill set from the <strong>Skills</strong> tab in the Bot Detail page.</p><h3 id="adding-a-skill" tabindex="-1">Adding a Skill <a class="header-anchor" href="#adding-a-skill" aria-label="Permalink to "Adding a Skill""></a></h3><ol><li>Click <strong>Add Skill</strong>.</li><li>A dialog with a basic template will open in the <strong>Monaco Editor</strong>.</li><li>Fill in the <code>name</code>, <code>description</code>, and content.</li><li>Click <strong>Save</strong>.</li></ol><h3 id="editing-and-deleting" tabindex="-1">Editing and Deleting <a class="header-anchor" href="#editing-and-deleting" aria-label="Permalink to "Editing and Deleting""></a></h3><ul><li><strong>Edit</strong>: Click the pencil icon next to a skill card to modify its content or frontmatter.</li><li><strong>Delete</strong>: Click the trash icon to remove a skill from the bot's container.</li></ul><hr><h2 id="how-bots-use-skills" tabindex="-1">How Bots Use Skills <a class="header-anchor" href="#how-bots-use-skills" aria-label="Permalink to "How Bots Use Skills""></a></h2><ul><li>Skills are injected into the bot's system prompt during conversation.</li><li>The YAML frontmatter helps the system categorize and manage the skills as tools.</li><li>Modular skills allow you to easily "swap" behaviors or capabilities without rewriting the entire bot.</li></ul>`,16)])])}const g=s(l,[["render",n]]);export{c as __pageData,g as default};
|
||||
@@ -0,0 +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};
|
||||
@@ -0,0 +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 "Bot Subagents""></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 "Concept: Task Specialization""></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 "Fields""></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., "Research Assistant").</td></tr><tr><td><strong>Description</strong></td><td>A brief explanation of the subagent's purpose and role.</td></tr><tr><td><strong>Skills</strong></td><td>A list of specific <strong>Skills</strong> assigned from the bot'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 "Operations""></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'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 "Bot Interaction""></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's container permissions but operate with their own "mental workspace."</li><li>This modular approach allows for building multi-agent systems within a single Bot's scope.</li></ul>',14)])])}const p=e(i,[["render",s]]);export{u as __pageData,p as default};
|
||||
@@ -0,0 +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};
|
||||
@@ -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":1772071426000}'),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 "Memoh Documentation""></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 "Documentation""></a></h2><ul><li><strong><a href="/getting-started.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> — Configure provider and model.</li><li><strong><a href="/cli/">CLI</a></strong> — Command-line tool for bots, channels, providers, models, schedules, and chat.</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.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 "Memoh Documentation""></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 "Documentation""></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":1772071426000}'),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.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};
|
||||
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
|
||||
import{_ as s,o as e,c as a,ag as i}from"./chunks/framework.ePeAWSvT.js";const k=JSON.parse('{"title":"config.toml Reference","description":"","frontmatter":{},"headers":[],"relativePath":"installation/config-toml.md","filePath":"installation/config-toml.md","lastUpdated":1772108429000}'),d={name:"installation/config-toml.md"};function n(o,t,r,h,l,c){return e(),a("div",null,[...t[0]||(t[0]=[i("",27)])])}const E=s(d,[["render",n]]);export{k as __pageData,E as default};
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
import{_ as i,o as a,c as e,ag as t}from"./chunks/framework.ePeAWSvT.js";const k=JSON.parse('{"title":"Docker Installation","description":"","frontmatter":{},"headers":[],"relativePath":"installation/docker.md","filePath":"installation/docker.md","lastUpdated":1772359263000}'),n={name:"installation/docker.md"};function o(l,s,d,r,h,p){return a(),e("div",null,[...s[0]||(s[0]=[t("",60)])])}const g=i(n,[["render",o]]);export{k as __pageData,g as default};
|
||||
@@ -1,10 +0,0 @@
|
||||
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":1772108429000}'),n={name:"installation/docker.md"};function l(o,s,h,r,p,d){return a(),e("div",null,[...s[0]||(s[0]=[t(`<h1 id="docker-installation" tabindex="-1">Docker Installation <a class="header-anchor" href="#docker-installation" aria-label="Permalink to "Docker Installation""></a></h1><p>Docker is the recommended way to run Memoh. The stack includes PostgreSQL, Qdrant, the main server (with embedded Containerd), agent gateway, and web UI — all orchestrated via Docker Compose. You do not need to install containerd, nerdctl, or buildkit on your host; everything runs inside containers.</p><h2 id="prerequisites" tabindex="-1">Prerequisites <a class="header-anchor" href="#prerequisites" aria-label="Permalink to "Prerequisites""></a></h2><ul><li><a href="https://docs.docker.com/get-docker/" target="_blank" rel="noreferrer">Docker</a></li><li><a href="https://docs.docker.com/compose/install/" target="_blank" rel="noreferrer">Docker Compose v2</a></li><li>Git</li></ul><h2 id="one-click-install-recommended" tabindex="-1">One-Click Install (Recommended) <a class="header-anchor" href="#one-click-install-recommended" aria-label="Permalink to "One-Click Install (Recommended)""></a></h2><p>Run the official install script (requires Docker and Docker Compose):</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</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;">curl</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -fsSL</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> https://memoh.sh</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> sh</span></span></code></pre></div><p>The script will:</p><ol><li>Check for Docker and Docker Compose</li><li>Prompt for configuration (workspace, data directory, admin credentials, JWT secret, Postgres password, China mirror)</li><li>Clone the repository</li><li>Generate <code>config.toml</code> from the Docker template with your settings</li><li>Pull images and start all services</li></ol><p><strong>Silent install</strong> (use all defaults, no prompts):</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</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;">curl</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -fsSL</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> https://memoh.sh</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> sh</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -s</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -y</span></span></code></pre></div><p>Defaults when running silently:</p><ul><li>Workspace: <code>~/memoh</code></li><li>Data directory: <code>~/memoh/data</code></li><li>Admin: <code>admin</code> / <code>admin123</code></li><li>JWT secret: auto-generated</li><li>Postgres password: <code>memoh123</code></li></ul><h2 id="manual-install" tabindex="-1">Manual Install <a class="header-anchor" href="#manual-install" aria-label="Permalink to "Manual Install""></a></h2><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</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;">git</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> clone</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> https://github.com/memohai/Memoh.git</span></span>
|
||||
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">cd</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> Memoh</span></span>
|
||||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">cp</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> conf/app.docker.toml</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> config.toml</span></span></code></pre></div><p>Edit <code>config.toml</code> — at minimum change:</p><ul><li><code>admin.password</code> — Admin password</li><li><code>auth.jwt_secret</code> — Generate with <code>openssl rand -base64 32</code></li><li><code>postgres.password</code> — Database password (also set <code>POSTGRES_PASSWORD</code> env var to match)</li></ul><p>Then start:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</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;">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> POSTGRES_PASSWORD=your-db-password</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> compose</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> up</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -d</span></span></code></pre></div><blockquote><p>On macOS or if your user is in the <code>docker</code> group, <code>sudo</code> is not required.</p></blockquote><blockquote><p><strong>Important</strong>: <code>docker-compose.yml</code> mounts <code>./config.toml</code> by default. You must create this file before starting — running without it will fail.</p></blockquote><h3 id="china-mainland-mirror" tabindex="-1">China Mainland Mirror <a class="header-anchor" href="#china-mainland-mirror" aria-label="Permalink to "China Mainland Mirror""></a></h3><p>For users in mainland China who cannot access Docker Hub directly, uncomment the <code>registry</code> line in <code>config.toml</code>:</p><div class="language-toml vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">toml</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">[</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">mcp</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">]</span></span>
|
||||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">registry = </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"memoh.cn"</span></span></code></pre></div><p>And use the China mirror compose overlay:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</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;">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> compose</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -f</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> docker-compose.yml</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -f</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> docker/docker-compose.cn.yml</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> up</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -d</span></span></code></pre></div><p>The install script handles this automatically when you answer "yes" to the China mirror prompt.</p><h2 id="access-points" tabindex="-1">Access Points <a class="header-anchor" href="#access-points" aria-label="Permalink to "Access Points""></a></h2><p>After startup:</p><table tabindex="0"><thead><tr><th>Service</th><th>URL</th></tr></thead><tbody><tr><td>Web UI</td><td><a href="http://localhost:8082" target="_blank" rel="noreferrer">http://localhost:8082</a></td></tr><tr><td>API</td><td><a href="http://localhost:8080" target="_blank" rel="noreferrer">http://localhost:8080</a></td></tr><tr><td>Agent Gateway</td><td><a href="http://localhost:8081" target="_blank" rel="noreferrer">http://localhost:8081</a></td></tr></tbody></table><p>Default login: <code>admin</code> / <code>admin123</code> (change this in <code>config.toml</code>).</p><p>First startup may take 1–2 minutes while images are pulled and services initialize.</p><h2 id="common-commands" tabindex="-1">Common Commands <a class="header-anchor" href="#common-commands" aria-label="Permalink to "Common Commands""></a></h2><blockquote><p>Prefix with <code>sudo</code> on Linux if your user is not in the <code>docker</code> group.</p></blockquote><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</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;">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> compose</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> up</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -d</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # Start</span></span>
|
||||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> compose</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> down</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # Stop</span></span>
|
||||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> compose</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> logs</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -f</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # View logs</span></span>
|
||||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> compose</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> ps</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # Status</span></span>
|
||||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> compose</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> pull</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> && </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> compose</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> up</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -d</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # Update to latest images</span></span></code></pre></div><h2 id="production-checklist" tabindex="-1">Production Checklist <a class="header-anchor" href="#production-checklist" aria-label="Permalink to "Production Checklist""></a></h2><ol><li><strong>Passwords</strong> — Change all default passwords and secrets in <code>config.toml</code></li><li><strong>HTTPS</strong> — Configure SSL (e.g. via <code>docker-compose.override.yml</code> with certs or a reverse proxy)</li><li><strong>Firewall</strong> — Restrict access to necessary ports</li><li><strong>Resource limits</strong> — Set memory/CPU limits for containers</li><li><strong>Backups</strong> — Regular backups of Postgres and Qdrant data</li></ol><h2 id="troubleshooting" tabindex="-1">Troubleshooting <a class="header-anchor" href="#troubleshooting" aria-label="Permalink to "Troubleshooting""></a></h2><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</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;">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> compose</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> logs</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> server</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # View main service logs</span></span>
|
||||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> compose</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> config</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # Validate configuration</span></span>
|
||||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> compose</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> build</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --no-cache</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> && </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> compose</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> up</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -d</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # Full rebuild</span></span></code></pre></div><h2 id="security-warnings" tabindex="-1">Security Warnings <a class="header-anchor" href="#security-warnings" aria-label="Permalink to "Security Warnings""></a></h2><ul><li>The main service runs with privileged container access — only run in trusted environments</li><li>You must change all default passwords and secrets before production use</li><li>Use HTTPS in production</li></ul>`,41)])])}const g=i(n,[["render",l]]);export{c as __pageData,g as default};
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user