当前位置: 首页 > news >正文

基于Ollama与Stable Diffusion的Discord AI机器人本地部署指南

1. 项目概述:一个能聊能画的Discord AI机器人

最近在折腾一个挺有意思的玩意儿:一个部署在自己电脑上的Discord机器人,它不仅能像ChatGPT一样跟你聊天,还能根据你的描述生成图片。这个项目的核心,是把两个当下很火的开源项目——Ollama(本地大语言模型运行工具)和Stable Diffusion WebUI(著名的AI绘画工具)——给“粘”到了一起,通过一个Discord机器人作为统一的交互界面。

想象一下,在你的游戏开黑群或者技术讨论群里,@一下这个机器人,它就能回答你的技术问题、帮你写段代码,或者根据你天马行空的想法“画”出一张图来。所有计算都在你自己的机器上完成,数据不出本地,既满足了隐私需求,又玩出了新花样。这个项目最初由 mekb-turtle 发起,现在社区还在持续维护,甚至正在用 TypeScript 进行重写以提升代码质量。对于想深入理解AI应用集成、Node.js后端开发,或者单纯想拥有一个私人AI助手的开发者来说,这是个绝佳的练手项目。

2. 核心组件与工具选型解析

在动手之前,我们得先搞清楚这个机器人是靠哪些“积木”搭起来的。每一块积木的选择,都直接关系到最终系统的能力、性能和部署复杂度。

2.1 大脑与画笔:Ollama 与 Stable Diffusion

这个机器人的“智力”和“艺术细胞”分别来源于两个独立的AI模型后端。

Ollama:本地大语言模型的“懒人包”Ollama 解决了一个核心痛点:如何让普通人也能在个人电脑上轻松运行各种大型语言模型(如 LLaMA 2、Mistral、Orca 等)。它通过容器化技术,将模型文件、运行环境、必要的参数优化打包在一起。你只需要一句ollama pull llama2就能下载模型,一句ollama run llama2就能开始对话,无需关心复杂的Python环境、CUDA版本冲突或者显存优化。对于我们这个Discord机器人项目,Ollama 提供了干净的HTTP API(默认在http://localhost:11434),我们的机器人代码只需要向这个地址发送一个包含用户消息的POST请求,就能拿到模型生成的回复,极大地简化了集成工作。

注意:Ollama 拉取的模型默认是未经过指令微调的“基础模型”。虽然能生成文本,但在对话连贯性、遵循指令方面可能不如ChatGPT。推荐使用orca(一个基于LLaMA微调的指令遵循模型)或llama2:7b-chat这类对话专用模型,体验会好很多。

Stable Diffusion WebUI:功能最全的AI绘画前端AUTOMATIC1111 的 Stable Diffusion WebUI 几乎是玩AI绘画的标配。它本身是一个功能极其强大的Web图形界面。我们看中的是它的--api启动参数。开启后,WebUI会启动一套完整的RESTful API,允许外部程序发送文本描述(prompt),并接收生成好的图片。我们的Discord机器人就可以把用户说的“画一只戴着礼帽的猫”这样的消息,转发给WebUI的API,拿到图片后再传回Discord频道。选择它而不是其他SD封装,是因为其API稳定、功能支持最全面(包括各种采样器、模型切换、LoRA等),社区资源也最丰富。

2.2 交互中枢:Discord.js 与 Discord 开发者平台

机器人本身是用 Node.js 写的,核心通信库是Discord.js。这是一个成熟、文档完善的库,几乎封装了Discord官方API的所有功能。它采用事件驱动模型,例如,当监听到“有消息被创建”的事件时,我们的代码就会检查这条消息是否@了我们的机器人,然后触发相应的处理逻辑。

所有这一切的前提,是需要在Discord 开发者门户创建一个“应用程序”并将其转化为“机器人”。这个过程会生成一个至关重要的Bot Token,相当于机器人的密码。这里有几个关键设置直接影响机器人的能力:

  1. Message Content Intent(消息内容意图):必须开启。2022年后,Discord为了隐私调整了政策,机器人默认无法读取消息全文。开启此意图,机器人才能看到用户发送的具体文字内容。
  2. Server Members Intent(服务器成员意图):建议开启。这样机器人才能将消息中的用户ID(如<@123456789>)替换成实际的用户名,让对话更自然。否则,回复里可能是一串冰冷的数字。
  3. OAuth2 URL生成器:用于邀请机器人入群。需要勾选bot权限作用域,并在权限列表里至少勾选“发送消息”、“读取消息”、“查看频道”和“读取消息历史”。生成链接后,用浏览器打开,选择你的服务器即可邀请。

2.3 环境与部署:Node.js、Docker 与 Makefile

项目提供了两种部署方式:裸机运行和容器化运行,适应不同用户的需求。

基础方式:Node.js 环境直装这是最直接的方式,适合快速上手和在开发阶段进行调试。你需要安装Node.js(v14以上)和npm。项目的依赖(主要是discord.jsaxios用于HTTP请求等)通过package.json定义,运行npm i即可安装。这种方式让你对进程有完全的控制权,可以方便地用console.log调试,或者使用nodemon实现代码热重载。

进阶方式:Docker 容器化部署项目提供了docker-compose.yml文件,这是生产环境更优雅的部署方式。Docker 将机器人应用及其运行环境(特定版本的Node.js、项目代码、依赖包)打包成一个独立的容器。它与宿主机环境隔离,避免了“在我机器上好好的”这类问题。通过docker-compose命令,可以一键启动所有定义的服务(虽然本项目目前主要是机器人本身,但可以方便地扩展,比如把Ollama也容器化并纳入编排)。

Makefile的存在则进一步简化了操作。对于不熟悉Docker命令的用户,只需要执行make compose-up,Make工具就会自动执行背后那条较长的docker compose -p discord-ai up命令。这体现了良好的开发者体验设计。

3. 详细配置与实操步骤拆解

纸上谈兵终觉浅,我们一步步把它跑起来。这里我会融合两种安装方式的细节,并补充原文档中一笔带过但实际容易踩坑的地方。

3.1 前期准备:模型与Discord机器人创建

在配置机器人代码之前,有两项准备工作必须提前完成,因为它们产生的信息是机器人运行的“燃料”。

第一步:启动并测试Ollama后端

  1. 前往 Ollama 官网下载并安装对应你操作系统的版本。
  2. 打开终端,拉取一个合适的模型。对于初次尝试,orca模型是个不错的平衡点,它对指令的理解较好,且体积相对适中。
    ollama pull orca
  3. 在一个独立的终端窗口,启动Ollama服务:
    ollama serve
    保持这个窗口运行。你可以打开浏览器,访问http://localhost:11434,如果看到Ollama的欢迎页面,说明服务启动成功。更专业的测试是用curl发一个API请求:
    curl http://localhost:11434/api/generate -d '{ "model": "orca", "prompt": "Hello, how are you?", "stream": false }'
    如果收到一段JSON格式的回复,里面包含生成的文本,那么Ollama部分就完全准备好了。

第二步:创建并配置Discord机器人

  1. 登录 Discord开发者门户 ,点击 “New Application”,给它起个名字,比如 “MyAIBot”。
  2. 进入应用后,左侧菜单点击 “Bot”。
    • 点击 “Add Bot”,确认。
    • 在 “TOKEN” 下方,点击 “Copy” 复制令牌。立即将其妥善保存(例如放入密码管理器),这个令牌只会显示这一次,丢失后需要重置。
    • 在 “Privileged Gateway Intents” 下,打开MESSAGE CONTENT INTENTSERVER MEMBERS INTENT两个开关。
  3. 邀请机器人到你的服务器:
    • 左侧菜单点击 “OAuth2” -> “URL Generator”。
    • 在 “Scopes” 勾选bot
    • 在 “Bot Permissions” 勾选:Send Messages,Read Messages/View Channels,Read Message History。如果希望机器人能上传图片(这是必须的),还需要勾选Attach Files
    • 页面底部会生成一个URL,复制并在浏览器中打开。选择一个你有管理员权限的服务器,完成授权。

第三步:安装并配置Stable Diffusion WebUI(可选,如需画图功能)

  1. 按照 AUTOMATIC1111 的官方Wiki,克隆仓库并安装依赖(通常需要Python和Git)。
  2. 启动WebUI时,必须加上--api--listen参数
    ./webui.sh --api --listen
    --api是启用API接口,--listen允许非本地连接(这样Docker容器内的机器人才能访问到宿主机上的WebUI)。
  3. 启动后,你可以在浏览器通过http://你的本地IP:7860访问WebUI界面。API接口通常位于http://你的本地IP:7860/sdapi/v1/txt2img

3.2 核心配置:环境变量文件详解

项目根目录下的.env.example文件是一个模板,你需要将其复制并重命名为.env,这是配置机器人行为的核心。

# .env 配置文件示例与详解 DISCORD_TOKEN=你的机器人令牌 OLLAMA_URL=http://host.docker.internal:11434,http://192.168.1.100:11434 MODEL=orca CHANNELS=123456789012345678,987654321098765432 SYSTEM_MESSAGE=You are a helpful assistant. Answer concisely. STABLE_DIFFUSION_URL=http://host.docker.internal:7860 ENABLE_IMAGE_GENERATION=true
  • DISCORD_TOKEN: 填入你第二步复制的那个令牌。
  • OLLAMA_URL: 这是最易出错的配置之一。
    • 如果你使用Docker部署机器人:在Docker容器内部,localhost指的是容器自己,而不是宿主机。因此,你需要用host.docker.internal这个特殊的主机名来指向宿主机(Windows/macOS的Docker Desktop支持)。如果Ollama也在另一个Docker容器中,则需要配置Docker网络并使用容器服务名。
    • 如果你裸机运行Node.js:直接使用http://localhost:11434即可。
    • 多Ollama实例:你可以用英文逗号分隔多个URL,机器人可能会按顺序尝试或负载均衡(具体取决于代码实现)。
  • MODEL: 必须与你在Ollama中拉取并运行的模型名称完全一致,例如orca,llama2:7b-chat
  • CHANNELS: 你希望机器人在哪些频道响应。在Discord设置中开启“开发者模式”后,右键点击频道 -> “复制频道ID”。多个ID用逗号分隔。如果留空或注释掉,机器人可能会在所有频道响应(需代码支持)。
  • SYSTEM_MESSAGE: 系统提示词,用于设定机器人的角色和行为。例如,设置为“你是一个说话简洁的编程助手”,会让模型在回答技术问题时更倾向简短。设为空字符串可能禁用此功能。
  • STABLE_DIFFUSION_URL: 你的Stable Diffusion WebUI API地址。Docker部署时同样需要注意网络问题,使用host.docker.internal或宿主机IP。
  • ENABLE_IMAGE_GENERATION: 设置为truefalse来控制是否启用画图功能。

3.3 启动与验证

方式一:使用Node.js直接运行

  1. 在项目根目录下安装依赖:npm install。如果遇到网络问题,可以尝试设置npm镜像源npm config set registry https://registry.npmmirror.com
  2. 启动机器人:npm start。这通常会执行node index.jsnode bot.js
  3. 观察终端日志。成功的日志通常包括 “Logged in as [你的机器人名]!” 和 “Ready!”。
  4. 前往你设置了频道ID的Discord频道,@你的机器人并发送 “Hello”。你应该能收到来自Ollama模型的文字回复。
  5. (如果启用了画图)尝试发送 “画一张日式城堡的风景画”。机器人会回复一个“正在生成图片…”之类的提示,稍后会将图片作为附件发送。第一次生成可能较慢,因为WebUI需要加载模型。

方式二:使用Docker Compose运行

  1. 确保已安装Docker和Docker Compose。
  2. 在项目根目录(包含docker-compose.yml的目录)执行:
    docker-compose up -d
    -d参数表示在后台运行。
  3. 查看日志确认运行状态:
    docker-compose logs -f
  4. 验证方式同上,在Discord频道中测试聊天和画图功能。

实操心得:强烈建议在初次启动时,不要使用-d后台运行,而是直接运行docker-compose up,这样所有日志都会实时打印在终端,方便你第一时间看到连接错误、令牌无效、模型找不到等问题。

4. 代码逻辑与功能扩展探析

虽然项目提供了开箱即用的代码,但理解其核心逻辑能让你更好地调试和定制它。我们来看看这个机器人是如何工作的。

4.1 消息处理流程剖析

机器人的主循环大致遵循以下事件流:

  1. 登录与就绪:机器人使用DISCORD_TOKEN登录Discord网关。登录成功后,触发ready事件,打印上线信息。
  2. 监听消息:机器人监听messageCreate事件。每当Discord服务器中有新消息发出,这个事件就会被触发,事件对象中包含了完整的消息内容、发送者、频道等信息。
  3. 消息过滤:在事件处理函数中,首先进行一系列过滤:
    • 忽略机器人自己的消息:防止自问自答导致循环。
    • 检查频道白名单:如果CHANNELS环境变量有配置,则检查当前消息所在的频道ID是否在列表中,不在则忽略。
    • 检查是否被提及:检查消息内容中是否包含了机器人的用户ID(<@!机器人ID><@机器人ID>)。这是触发机器人回复的主要方式。
  4. 指令解析:从消息中提取出纯文本内容(去除@提及部分),并进行简单解析。例如,代码可能会检查消息是否以特定关键词(如“画”、“generate”)开头,以决定是调用文字生成还是图片生成功能。
  5. 任务分发
    • 文本聊天:将提取的文本(可能结合SYSTEM_MESSAGE)构造成符合Ollama API格式的JSON payload,通过HTTP POST发送到OLLAMA_URL/api/generate。收到流式或非流式响应后,将文本回复发送回Discord原频道。
    • 图片生成:将提取的文本作为prompt,构造成Stable Diffusion WebUI API(通常是/sdapi/v1/txt2img)所需的JSON payload(包含prompt、负向提示词、步数、尺寸等参数)。发送请求后,API返回的是base64编码的图片数据。机器人需要将其解码成二进制Buffer,然后作为附件(Discord.AttachmentBuilder)发送到频道。
  6. 错误处理:在整个过程中,任何网络错误、API错误、超时等都需要被try...catch捕获,并向Discord频道发送一条用户友好的错误提示,而不是让机器人静默失败。

4.2 关键代码片段示例与解读

以下是一个简化的、基于 Discord.js v14 的核心处理逻辑伪代码,帮助你理解:

// 伪代码,展示核心逻辑 const { Client, GatewayIntentBits } = require('discord.js'); const axios = require('axios'); const client = new Client({ intents: [GatewayIntentBits.Guilds, GatewayIntentBits.GuildMessages, GatewayIntentBits.MessageContent] }); client.on('ready', () => { console.log(`Logged in as ${client.user.tag}!`); }); client.on('messageCreate', async (message) => { // 1. 过滤:忽略机器人、非指定频道、未提及 if (message.author.bot) return; if (process.env.CHANNELS && !process.env.CHANNELS.split(',').includes(message.channelId)) return; if (!message.mentions.has(client.user)) return; // 2. 提取纯文本内容 const rawContent = message.content; const botMention = `<@!${client.user.id}>`; // 或 `<@${client.user.id}>` const userPrompt = rawContent.replace(botMention, '').trim(); // 3. 判断指令类型(此处为简单示例,实际可能更复杂) if (userPrompt.toLowerCase().startsWith('画')) { // 图片生成逻辑 const sdPrompt = userPrompt.substring(1).trim(); // 去掉“画”字 await message.channel.send('正在构思画面,请稍候...'); try { const response = await axios.post(`${process.env.STABLE_DIFFUSION_URL}/sdapi/v1/txt2img`, { prompt: sdPrompt, negative_prompt: 'ugly, blurry, low quality', steps: 20, width: 512, height: 512, }); const imageData = response.data.images[0]; const imageBuffer = Buffer.from(imageData, 'base64'); const attachment = new AttachmentBuilder(imageBuffer, { name: 'generation.png' }); await message.channel.send({ content: `根据“${sdPrompt}”生成:`, files: [attachment] }); } catch (error) { await message.channel.send('画画时出了点问题,可能是描述太抽象或者服务器忙。'); console.error('SD API Error:', error); } } else { // 文本聊天逻辑 await message.channel.sendTyping(); // 显示“机器人正在输入” try { const response = await axios.post(`${process.env.OLLAMA_URL}/api/generate`, { model: process.env.MODEL, prompt: `${process.env.SYSTEM_MESSAGE}\n\nUser: ${userPrompt}\nAssistant:`, stream: false, }); await message.reply(response.data.response); // 直接回复原消息 } catch (error) { await message.channel.send('思考的时候卡壳了,请稍后再试。'); console.error('Ollama API Error:', error); } } }); client.login(process.env.DISCORD_TOKEN);

4.3 潜在功能扩展方向

这个项目的基础框架已经搭好,你可以在此基础上添加更多有趣的功能:

  1. 多模型切换:修改代码,让用户可以通过指令切换Ollama模型,例如@bot /use llama2。这需要动态修改请求中的model参数,并可能维护一个可用的模型列表。
  2. 对话记忆/上下文:目前的每次问答很可能是独立的。你可以引入一个简单的内存机制(例如,为每个频道或用户维护一个最近N条对话的数组),在调用Ollama API时,将整个对话历史作为prompt的一部分发送,从而实现有上下文的连续对话。
  3. 图片生成参数定制:让用户能指定图片尺寸、采样步数、风格等。例如,指令可以设计为@bot 画 一只猫 --width 768 --steps 30。这需要更复杂的指令解析器。
  4. 其他AI服务集成:除了Ollama和SD,还可以集成语音合成(TTS)、语音识别(STT),或者调用在线AI API(如Google Gemini、Claude),让机器人能力更多元。
  5. 管理指令:增加仅管理员可用的指令,如/stats查看机器人状态,/reset清空某个频道的对话记忆等。

5. 常见问题与故障排查实录

在实际部署和运行过程中,你几乎一定会遇到下面这些问题。我把它们和解决方案整理成了表格,方便你快速对照排查。

问题现象可能原因排查步骤与解决方案
机器人登录失败,提示Invalid token4011. DISCORD_TOKEN 填写错误。
2. 令牌已泄露被重置,但仍在用旧令牌。
3. 环境变量文件.env未正确加载。
1. 去 Discord 开发者门户 Bot 页面点击 “Reset Token”,获取新令牌并更新.env文件。
2. 确认.env文件在项目根目录,且变量名正确。在代码开头加console.log(process.env.DISCORD_TOKEN?.substring(0,5))检查是否成功读取。
机器人上线了,但@它没反应1. 未开启MESSAGE CONTENT INTENT
2.CHANNELS环境变量限制了频道,当前频道不在列表中。
3. 代码中的消息过滤逻辑有误。
1. 去开发者门户确认意图已开启,修改后需要重新邀请机器人吗?不需要,意图开关实时生效。
2. 检查.env中的CHANNELS值,确认当前频道ID已包含在内。
3. 在messageCreate事件开头添加console.log(message.channelId, message.content)调试,看事件是否触发、内容是否正确。
机器人回复文字时提示“思考时卡壳了”或长时间无响应1.OLLAMA_URL配置错误,机器人连不上Ollama服务。
2. Ollama 服务未运行或崩溃。
3.MODEL指定的模型不存在或未下载。
4. 电脑资源(CPU/内存)不足,模型加载或生成缓慢。
1. 在终端用curl http://你的OLLAMA_URL/api/tags测试Ollama API是否通。Docker部署时特别注意用host.docker.internal或宿主机IP。
2. 检查运行ollama serve的终端是否正常。
3. 运行ollama list确认模型存在。用ollama pull <model>重新拉取。
4. 观察任务管理器。对于7B参数模型,至少需要8GB可用内存。尝试换更小的模型(如tinyllama)。
图片生成功能报错或无法生成1.STABLE_DIFFUSION_URL配置错误。
2. Stable Diffusion WebUI 未以--api --listen参数启动。
3. 网络防火墙/安全组阻止了访问。
4. WebUI 本身出错(如下载模型失败)。
1. 在浏览器或使用curl访问http://你的SD_URL/sdapi/v1/txt2img会返回方法不允许(405),但至少证明服务可达。访问http://你的SD_URL应能看到WebUI界面。
2. 确认启动命令正确。检查WebUI运行终端的日志,看是否有API相关错误。
3. Docker部署时,确保宿主机防火墙允许7860端口入站。在宿主机上curl http://localhost:7860测试。
4. 查看WebUI终端日志,常见问题是网络问题导致模型文件下载不完整。
Docker容器启动后立即退出1..env文件缺失或关键环境变量(如DISCORD_TOKEN)为空。
2. Docker容器内无法解析host.docker.internal主机名(某些Linux原生Docker环境)。
3. 容器内Node.js应用启动时遇到未捕获的异常。
1. 运行docker-compose logs查看退出前的错误日志,通常会明确提示缺失哪个变量。
2. 在Linux上,尝试将host.docker.internal替换为宿主机的实际IP地址(如172.17.0.1或通过ip addr show docker0查看)。更可靠的方式是将Ollama和SD也容器化,并用Docker Compose网络连接。
3. 根据日志错误信息修改代码或配置。可以尝试先不用-d参数运行,直接看输出。
生成图片速度极慢1. 未使用GPU加速。
2. 图片尺寸 (width,height) 设置过大。
3. 采样步数 (steps) 设置过高。
4. 模型文件首次加载。
1. 确保Stable Diffusion WebUI 启动日志中显示使用了CUDAROCm。这通常需要在安装时配置好PyTorch的GPU版本。
2. 将默认尺寸从 512x512 调整为 768x768 会显著增加计算量。非必要不提高分辨率。
3. 20-30步通常足够。在机器人代码或WebUI设置中降低步数。
4. 首次使用某个模型时,WebUI需要加载,会较慢,后续生成会缓存。

踩坑心得:超过一半的问题都出在网络连接环境变量上。Docker环境下的localhost问题尤为经典。一个黄金法则是:先确保每个后端服务(Ollama, SD WebUI)自身能独立通过API访问成功,再去调试机器人。用curlPostman工具先手动测试所有API端点,能极大缩小问题范围。

6. 性能优化与安全考量

当你的机器人开始稳定运行,甚至有几个朋友一起用时,就需要考虑得更远一些了。

6.1 性能与资源管理

  1. 模型选择与硬件平衡:Ollama 上的模型从几十亿到数百亿参数不等。对于个人使用的Discord机器人,一个7B(70亿)参数的模型(如llama2:7b-chat,mistral:7b)在速度和质量上是一个比较好的折衷,在16GB内存的电脑上可以流畅运行。13B模型则需要更强的硬件。时刻关注任务管理器中的内存和GPU显存占用。
  2. 请求队列与限流:当前的代码可能没有处理“多个用户同时@机器人”的情况。这可能导致请求堆积,内存激增,甚至Ollama/WebUI崩溃。一个简单的改进是引入一个任务队列,将收到的请求依次处理,并在机器人忙碌时回复“请稍等”。Discord.js 本身是异步的,但需要小心避免同时发起太多耗时的API调用。
  3. 响应超时设置:在调用Ollama和SD API的axios请求中,务必设置超时(timeout)参数。例如timeout: 300000(5分钟),防止因为某个生成任务卡死而导致机器人线程一直挂起。
  4. 图片生成优化:在SD WebUI的设置中,可以启用xformers来优化显存和速度(仅限NVIDIA显卡)。使用更高效的采样器,如DPM++ 2M Karras,可以用更少的步数获得不错的效果。

6.2 安全与隐私实践

  1. 令牌就是一切DISCORD_TOKEN一旦泄露,他人就能完全控制你的机器人。绝对不要将它提交到Git仓库(.env文件已在.gitignore中,但请再次确认)。不要在公开场合粘贴。考虑使用密码管理器存储。
  2. 频道白名单:务必使用CHANNELS环境变量将机器人限制在特定的频道。避免它在公开频道被陌生人滥用,消耗你的计算资源。
  3. 输入过滤与审查:虽然是在私人服务器,但也要考虑基本的过滤。可以对用户输入进行简单检查,过滤掉极端辱骂、大量刷屏的文本,或者在发送给SD的prompt中强制添加一些安全过滤词(NSFW),这可以在WebUI的设置中配置。
  4. 网络隔离:如果你在公网服务器上部署,确保Ollama(11434端口)和Stable Diffusion WebUI(7860端口)的API接口不要直接暴露在公网。它们应该只允许本地(127.0.0.1)或内部Docker网络访问。你的Discord机器人作为前端,对外只通过Discord的安全网关通信。
  5. 依赖安全:定期运行npm audit检查项目依赖是否存在已知安全漏洞,并及时更新package.json中的依赖版本。

这个项目就像一把瑞士军刀,它巧妙地拼接了几个强大的开源工具,打开了一扇门,让你能在熟悉的聊天环境里直接调用本地AI能力。从配置环境、理解组件交互,到排查故障、思考优化,整个过程本身就是一个全栈开发的微型演练。最让我有成就感的是,看到它第一次在群里回应我的召唤,并生成一张虽然粗糙但符合描述的图片时,那种“自己造的工具真的能用了”的感觉。你可以把它当成一个起点,代码结构清晰,完全可以根据你的想法,把它改造成专属的多模态AI助手,比如加上对本地文档的问答,或者连接智能家居。玩得开心,也别忘了控制一下它画图的瘾,不然你的显卡风扇可能会一直呼啸。

http://www.jsqmd.com/news/805431/

相关文章:

  • 2026年中式化妆培训可靠机构:技术与实力双维度解析 - 优质品牌商家
  • ncmdumpGUI完整使用手册:简单快速解锁网易云音乐NCM格式转换
  • D26: 向下负责——保护团队免受 AI 焦虑影响
  • 2026年国内玻璃钢格栅花纹盖板厂家TOP5客观盘点 - 优质品牌商家
  • Python 爬虫数据处理:特殊格式文档爬虫解析处理
  • AI Agent 的难点,不在搭 Demo,而在让人敢交任务
  • Mac鼠标滚轮终极优化指南:用Mos实现触控板般的丝滑滚动体验
  • 告别底噪与失真:手把手教你用STM32 I2C驱动WM8988音频Codec(附完整寄存器配置代码)
  • 【AI面试临阵磨枪-52】LLM 服务高并发、高可用设计:负载均衡、池化、扩容、容错
  • ESP32音频播放终极指南:从SD卡播放MP3到网络流媒体的完整解决方案
  • 别再自己写弹窗了!UniApp内置的showLoading、showToast、showModal用法全解析(附避坑点)
  • 5分钟搞定Mac Boot Camp驱动部署:Brigadier全攻略
  • 快手拟分拆可灵AI独立IPO,Pre - IPO轮拟融资20亿美元,目标估值200亿美元
  • Python 爬虫反爬突破:CDN 防护节点穿透采集
  • 在株洲如何根据个人需求选择合适的床垫?
  • 618.4V锂电池完整设计方案要求【浩博电池】
  • 2026上海办公室设计技术评测:上海办公室设计、上海办公室装修设计、上海办公室装修选择指南 - 优质品牌商家
  • 本地化YouTube视频转录:基于Whisper与Shell脚本的完整解决方案
  • 【开盘预测】2026年5月13日(周三)
  • AI自媒体自动化工作流搭建:从Claude技能到MCP服务器的实战指南
  • 2026年不锈钢水管选型推荐:靠谱供应商的判定标准 - 优质品牌商家
  • Netfilter内核 API 解析
  • 字节/Meta/OpenAI都在组建的Harness工程,比Scaling Laws更重要的,是Harness Engineering
  • Docker 的了解和使用
  • 基于浏览器自动化的LLM-API-Open项目:免费构建本地AI代理API
  • 为Node.js后端服务接入Taotoken多模型API的详细步骤
  • 在株洲如何选择护脊透气的床垫?
  • 对比直接使用厂商API体验Taotoken在路由容灾上的差异
  • ClawGuard:为Clawdbot AI智能体打造的安全监控与熔断防护系统
  • Python 爬虫进阶技巧:网页脚本阻断稳定抓取数据