使用vocechat搭建聊天服务,接入AI机器人

avatar
前端工程师 @天鹅到家

前言

VoceChat 是一款支持独立部署的个人云社交媒体聊天服务。15MB 的大小可部署在任何的服务器上,部署简单,很少需要维护。还可以内嵌到网站中,数据由自己掌握,比较安全。

技术选型:vocechat,智普ai,docker一键部署,便捷食用。项目效果如下:点击查看

新建项目 (1).png

一、搭建聊天室

使用docker一键部署,浏览器访问http://服务器ip:3009/,介绍一下docker命令行,Docker 中启动一个名为"vocechat-server"的容器,它将容器内部的端口3000映射到主机的端口3009,并且在容器退出时自动重新启动。

docker run -d --restart=always \
  -p 3009:3000 \
  --name vocechat-server \
  privoce/vocechat-server:latest

二、接入机器人与Webhook

机器人可以将消息发送到Vocechat,机器人可以配置Webhook;

Webhook可以监听Vocechat推送所有该机器人相关的消息数据,可以在这里调用智普API,实现智能对话

import express from "express";
import axios from "axios";

const app = express()
const port = process.env.PORT || 4080

import dotenv from 'dotenv-safe'
dotenv.config({
    allowEmptyValues: true
})

app.use(express.json()) // 把消息体解析为json
app.use(express.urlencoded({ extended: true })) // for parsing application/x-www-form-urlencoded

// 通过测试
app.get('/demo', async (req, res) => {
    res.status(200).send({ msg: 'scuccess' })
})

app.post('/demo', async (req, res) => {
    // 先发送一个200,表示收到了,避免后端再次发送
    res.status(200).send({ msg: 'scuccess' })

    let { from_uid: fromUid, created_at: createdAt, detail: { content, properties: { content_type: contentDetailType, mentions, name }, content_type: contentType, }, mid, target } = req.body;

    // 发送消息
    await sendMessage(fromUid, `get your message`)

    // 指定关键词
    if (content === 'ping') {
        await sendMessage(fromUid, `pong`)
    }
})

// 请自行模块化
async function sendMessage(fromUid, message) {
    const endpoint = `${process.env.BASE_URL}/api/bot/send_to_user/${fromUid}`
    const apiKey = process.env.BOT_API_KEY
    const response = await axios.post(endpoint, `${message}`, {
        headers: {
            "Content-Type": "text/markdown",
            "x-api-key": apiKey,
            "accept": 'application/json; charset=utf-8',
        },
    })
    // 返回消息id,当前无用
    return response.data
}

async function getZhiPuRes(msg) {
    const endpoint = `https://open.bigmodel.cn/api/paas/v4/chat/completions`
    const apiKey = '切换key'
    const params = {
        "model": "glm-4",
        "messages": [
            {
                "role": "user",
                "content": msg
            }
        ]
    }
    const response = await axios.post(endpoint, JSON.stringify(params), {
        headers: {
            "Content-Type": "application/json",
            "Authorization": apiKey,
        },
    })

    return response.data.choices.map(item => item.message.content).join("")
}
app.listen(port, () => {
    console.log(`service working on port ${port}`)
})

三、问题

  • node服务部署到服务器无法访问:因为linx系统搭建了宝塔面板,需要在安全->添加端口规则。在阿里云中防火墙添加是没办法直接生效的

四、后续改进

  • 支持发送图片,文件
  • 接入语音聊天

五、参考链接