Moltbot(Clawdbot)对接本地大模型完整配置指南(一)

3,558 阅读6分钟

image.png

Moltbot(Clawdbot)对接本地大模型完整配置指南

近期,开源AI智能体Moltbot(原名Clawdbot)凭借“可执行、可扩展、本地化”的特性爆火开源圈,GitHub星标快速飙升至95k+,被不少开发者称为“个人开源贾维斯”。不同于传统只能聊天的AI助手,Moltbot具备完整的“手、脚、脑”能力,既能对接云端API,更能适配本地大模型部署,完美解决数据隐私保护与离线使用需求。本文将从Moltbot核心能力、演示效果入手,一步步带你完成从环境搭建到本地大模型对接的全流程配置,新手也能轻松上手。

一、Moltbot(Clawdbot)核心能力与演示效果

1.1 核心能力解析

Moltbot(原Clawdbot)是一款开源个人AI助手框架,核心定位是“连接AI大模型与本地系统的桥梁”,通过Gateway网关架构,实现从自然语言指令到实际任务执行的完整闭环。其核心能力可概括为“手、脚、脑”三大模块,兼顾实用性与扩展性:

“手”——本地执行能力:可直接读写电脑本地文件、执行终端代码、操控命令行,支持批量处理文件、自动化脚本运行等场景,无需手动操作即可完成复杂本地任务。

“脚”——联网交互能力:可自主联网搜索、访问网页并分析内容,支持提取网页关键信息、同步网络数据,打破本地资源限制,实现“在线获取+本地执行”的联动。

“脑”——灵活适配能力:支持对接OpenAI、Qwen、MiniMax、GLM等主流云端API,更能适配本地大模型(如Llama 3、Qwen本地版、GLM4.7等),数据全程在本地流转,兼顾隐私安全与离线使用需求。

除此之外,Moltbot还具备可扩展的技能系统、多渠道交互(Telegram、Slack等)、本地记忆存储等特性,支持自定义Agent和插件开发,面向技术极客、隐私敏感用户和开发者群体,可根据需求灵活定制。

1.2 演示效果展示

本文作为Molbot的入门教程,重点在基于“Moltbot + 本地qwen3-30b-a3b大模型”部署完整运行程序。以下是简单的让Molbot写一篇日记。

image.png

二、前置说明与环境准备

2.1 前置说明

  1. 系统兼容:本文以ubuntu系统为例(macOS、windows流程类似参考官方文档);

  2. 硬件要求:对接本地大模型需满足基础硬件条件——CPU≥8核、内存≥16GB(推荐32GB),大模型是Nvidia 4090 8卡机器单独部署的;

  3. 核心依赖:Moltbot运行依赖Node.js环境(版本≥v22.0.0,推荐v22.x或v24.x稳定版),本地大模型需提前部署完成(本文以qwen3-30b-a3b本地版为例);

2.2 环境准备(必做)

2.2.1 部署本地大模型(以qwen3-30b-a3b为例)
  1. 下载模型:从阿里云ModelScope、Hugging Face等平台下载qwen3-30b-a3b本地模型;

  2. 部署模型:本文使用gpustack完成本地大模型部署,确保模型可正常运行,并记录模型部署后的本地接口地址(如http://127.0.0.1:8080/v1,后续对接需用到)和apikey(gpustack__xxxxx);

  3. 测试模型:打开浏览器或终端,访问本地模型接口,发送简单对话指令(如“你好”),若能正常接收响应,说明本地大模型部署成功。

2.2.2 安装Moltbot

从github下载最新源码github.com/moltbot/mol…。下载到ubuntu服务器后解压缩。然后执行下面的安装命令。

执行安装命令时候会弹出下面截图:

image.png 按n或其他键则安装结束,按y表示同意继续安装;选择安装模式,

image.png 第一个是快速开始,第二个是手动配置,选择第一个回车;然后让你配置一个模型。

image.png

列的国内外模型都需要收费的key和认证,本文对接本地大模型,选择最后一个Skip for now。接下来选择channel,

image.png

都是国外的app用不了,选择Skip for now;

image.png

然后选择技能安装配置都是yes,最后选择安装技能用npm。

image.png

然后让你安装 skill,这些技能也可以选择先不安装,后面用到的时候,会自行安装,所以也可以选择 Skip for now 跳过。空格选中复选框,回车下一步。

image.png

google和sag的配置都需要外网,选择no,不设置。

image.png

然后会看到是否启动 hooks,这里可以把这 3 个都选上,启动下。 至此,初步安装就完成了,会看到屏幕出现访问地址。

image.png

在本机curl命令curl http://127.0.0.1:18789/chat

image.png 可以看到有结果返回。表示启动正常。但是通过外网ip端口发下无法访问。经过查询官方文档需要打开配置gateway.bind为lan局域网。配置文件的默认位置在~/.clawdbot/clawdbot.json。在配置文件中添加配置。

image.png

再次通过服务器ip和端口发下可以访问页面。

image.png 接下来在chat页面对话时候发现连接失败报错。

image.png 打开Overview测试连接发现右侧提示连接失败,Gateway Token需要填写和配置文件中的gateway.auth.token保持一致,并且设置gateway.controlUi.allowInsecureAuth设置为ture允许http连接。注意此处只是测试环境,生产环境建议开启https安全认证。

到这一步发现能够连接成功,但是对话无返回结果。

2.2.3 修改源码和配置支持本地大模型

找到安装路径下的model.js文件,我服务器的路径为/xxx/moltbot-2026.1.24/dist/agents/pi-embedded-runner。 注释掉原有的if判断添加改造后的代码。

export function resolveModel(provider, modelId, agentDir, cfg) {
    const resolvedAgentDir = agentDir ?? resolveClawdbotAgentDir();
    const authStorage = discoverAuthStorage(resolvedAgentDir);
    const modelRegistry = discoverModels(authStorage, resolvedAgentDir);
    const model = modelRegistry.find(provider, modelId);
    // if (!model) {
    //     const providers = cfg?.models?.providers ?? {};
    //     const inlineModels = buildInlineProviderModels(providers);
    //     const normalizedProvider = normalizeProviderId(provider);
    //     const inlineMatch = inlineModels.find((entry) => normalizeProviderId(entry.provider) === normalizedProvider && entry.id === modelId);
    //     if (inlineMatch) {
    //         const normalized = normalizeModelCompat(inlineMatch);
    //         return {
    //             model: normalized,
    //             authStorage,
    //             modelRegistry,
    //         };
    //     }
    //     const providerCfg = providers[provider];
    //     if (providerCfg || modelId.startsWith("mock-")) {
    //         const fallbackModel = normalizeModelCompat({
    //             id: modelId,
    //             name: modelId,
    //             api: providerCfg?.api ?? "openai-responses",
    //             provider,
    //             reasoning: false,
    //             input: ["text"],
    //             cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
    //             contextWindow: providerCfg?.models?.[0]?.contextWindow ?? DEFAULT_CONTEXT_TOKENS,
    //             maxTokens: providerCfg?.models?.[0]?.maxTokens ?? DEFAULT_CONTEXT_TOKENS,
    //         });
    //         return { model: fallbackModel, authStorage, modelRegistry };
    //     }
    //     return {
    //         error: `Unknown model: ${provider}/${modelId}`,
    //         authStorage,
    //         modelRegistry,
    //     };
    // }
    // --- Custom Model Fallback Patch Start ---
    if (!model) {
        const providerCfg = cfg?.models?.providers?.[provider];
        if (providerCfg && providerCfg.baseUrl && Array.isArray(providerCfg.models) && providerCfg.models.length > 0) {
            // 尝试匹配 modelId,或 fallback 到第一个模型
            let matchedModelCfg = providerCfg.models.find(m => m.id === modelId);
            if (!matchedModelCfg) {
                matchedModelCfg = providerCfg.models[0]; // 默认用第一个
            }

            const customModel = normalizeModelCompat({
                id: matchedModelCfg.id,
                name: matchedModelCfg.name || ` $ {provider}/ $ {matchedModelCfg.id}`,
                api: providerCfg.api || "openai-completions",
                provider: provider,
                baseUrl: providerCfg.baseUrl,
                reasoning: matchedModelCfg.reasoning ?? false,
                input: matchedModelCfg.input || ["text"],
                cost: matchedModelCfg.cost || { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
                contextWindow: matchedModelCfg.contextWindow || 32768,
                maxTokens: matchedModelCfg.maxTokens || 8192,
            });
            return { model: customModel, authStorage, modelRegistry };
        }
    }
    // --- Custom Model Fallback Patch End ---
    return { model: normalizeModelCompat(model), authStorage, modelRegistry };
}

修改~/.clawdbot/clawdbot.json,指定本地大模型。

  "agents": {
    "defaults": {
      "workspace": "/root/clawd",
      "maxConcurrent": 4,
      "subagents": {
        "maxConcurrent": 8
      },
      "models": {
        "myllm/my-custom-model": {}
      },
      "model": {
        "primary": "myllm/qwen3-30b-a3b-instruct-2507"
      }
    }
  },
  "models": {
    "providers": {
      "myllm": {
        "api": "openai-completions",
        "apiKey": "gpustack_xxxx",
        "baseUrl": "http://127.0.0.1:8080/v1",
        "models": [
          {
            "id": "qwen3-30b-a3b-instruct-2507",
            "name": "qwen3-30b-a3b-instruct-2507",
            "contextWindow": 128000,
            "maxTokens": 16384,
            "cost": {
              "input": 0,
              "output": 0,
              "cacheRead": 0,
              "cacheWrite": 0
            },
            "reasoning": false,
            "input": ["text"]
          }
        ]
      }
    }

到此,在对话页面可以进行正常问答。

image.png

附属参考的帖子

看别的帖子还有对接飞书的能力,后面研究跑通了再发帖。 如果有问题可以留言咨询,共同进步。