随着 AI 已成为当下开发者最为关注的焦点,AI和即时通信的结合也得到了进一步的发展和应用。腾讯云即时通信 IM 作为全球领先的通信云服务商,快速发布了相关 AI 能力调用接口,开发者基于腾讯云 IM 提供的通信底座,可以自由调用业内领先的大模型能力,用丰富的 AI 能力赋能自己,实现智能客服、创意辅助、工作助手等业务功能。同时,腾讯云即时通信 IM 还配备有完善的 AI 聊天场景 UI 组件,即开即用,基于 UI 组件您可以像搭积木一样快速搭建起自己的业务逻辑。
应用场景

两种方案
腾讯云即时通信 IM 提供两种接入 AI 能力方案供您参见。
方案一通过机器人第三方消息回调将 AI 服务能力引入到 IM 应用中。
方案二通过腾讯云提供的 智能客服 接入 AI 能力,通过智能机器人可以轻松实现 FAQ 智能问答、闲聊、数据运营看板等AI能力,结合腾讯云即时通信 IM 产品,您可以快速实现多平台跨终端互通的聊天机器人。
后台接入流程
方案一整体接入流程如下:

下文中的实践步骤以接入 MiniMax 中文大语言模型为例,类 ChatGPT 服务均可通过文中介绍的方法实现接入。
1. 创建即时通信 IM 应用
2. 注册 AI 服务商账号
注册并登录计划接入的 AI 服务商,并获取 API 密钥(以下称为
AI_SECRET_KEY
)。3. 创建机器人账号
通过 REST API 创建一个机器人账号。机器人账号是一种特殊的用户账号,它也通过 UserID 来唯一标识(但是其 UserID 必须以
@RBT#
开头),具有昵称、头像、签名等基本属性。假设您成功创建了一个昵称为 MyRobot 的机器人@RBT#001。4. 配置第三方回调
即时通信 IM 第三方回调即云 IM 后台会在某一事件发生之前或者之后,向 App 的后台服务器发送请求,App 后台可以据此进行必要的数据同步,或者干预事件的后续处理流程。我们将使用“机器人事件回调”监听用户发消息给机器人,或者在群聊中@机器人的事件,并对其做出反应。在腾讯云 IM 控制台中找到“机器人事件回调”,点击开启并保存。
5. 开发 APP 后台服务
以单聊为例,总体上的工作流程如下:
1. 用户 user1 发消息 "hello" 给机器人 @RBT#001。
2. 云 IM 后台通过第三方回调将事件通知到 App 后台,通知内容包含发送方 user1,接收方 @RBT#001,消息内容 "hello" 以及其他信息。
3. App 后台调用 AI 服务接口(本文示例 MiniMax API),并得到响应回复内容,如 "nice to meet you";
4. App 后台调用 REST API 接口(单聊为 sendmsg 接口,群聊为 send_group_msg 接口),将回复内容以 @RBT#001 的身份发送给 user1。


下面我们使用 Golang ,向您展示 App 后台的关键代码。
说明:
下文代码仅作示例,省略了大量异常处理代码,请勿直接用于生产环境。
分发处理回调命令
我们创建一个监听在80端口的 HTTP 服务,注册一个 url 为 /im 的处理函数 handler,所有发送给
http:///im
的请求都会被 handler 处理。所有云 IM 发送的回调请求都带有 CallbackCommand
参数,不同的值代表不同的回调命令。在 handler 中,根据云 IM 设置的参数 CallbackCommand
进行对应的处理。func handler(w http.ResponseWriter, r *http.Request) {command := r.URL.Query().Get("CallbackCommand")reqbody, _ := io.ReadAll(r.Body)var rspbody []byteswitch command {case "Bot.OnC2CMessage": // 机器人C2C回调命令字dealC2c(context.Background(), reqbody)rspbody = []byte("{\\"ActionStatus\\": \\"OK\\", \\"ErrorCode\\": 0, \\"ErrorInfo\\": \\"\\"}")default:rspbody = []byte("invalid CallbackCommand.")}w.Write(rspbody)}func main() { // 注册一个handler,处理发送给App后台的回调命令http.HandleFunc("/im", handler)http.ListenAndServe(":80", nil)}
处理机器人接收到单聊消息事件
处理单聊消息时,我们先检查发送方是不是机器人(一般不会出现这种机器人发送消息给机器人的情况),以防止无限的回调循环。接着,我们解析消息体,拿到用户发送给机器人的消息内容 text,将发送方 UserID 保存到 context 中以方便后续调用 REST API 回复,最后调用 askAI 请求 AI 服务。
func dealC2c(ctx context.Context, reqbody []byte) error {root, _ := simplejson.NewJson(reqbody)jFromAccount := root.Get("From_Account")fromAccount, _ = jFromAccount.String()// 检查发送方ID,不处理机器人发送给机器人的请求,防止无限循环if strings.HasPrefix(fromAccount, "@RBT#") {return nil}jToAccount := root.Get("To_Account")toAccount, _ := jToAccount.String()msgBodyList, _ := root.Get("MsgBody").Array()for _, m := range msgBodyList {msgBody, _ := m.(map[string]interface{})msgType, _ := msgBody["MsgType"].(string)if msgType != "TIMTextElem" {continue}msgContent, _ := msgBody["MsgContent"].(map[string]interface{})text, _ := msgContent["Text"].(string)ctx = context.WithValue(ctx, "from", fromAccount)ctx = context.WithValue(ctx, "to", toAccount)go askAI(ctx, text)}return nil}
调用 AI 服务接口
在这一步我们使用第三方 AI 服务公司 DeepSeek 实现智能聊天的功能,您可以将 DeepSeek 服务替换成任意的其它 AI 服务。需要注意的是这里演示的是简单的 completion 接口,没有保存对话的上下文,其他接口可按需查阅 MiniMax 文档。
type MiniMaxRsp struct {Reply string `json:"reply"`}// 请求MiniMax并得到回复func askAI(ctx context.Context, prompt string) {url := "https://api.minimax.chat/v1/text/completion"var reqData = []byte(`{"model": "abab5-completion","prompt": prompt}`)request, _ := http.NewRequest("POST", url, bytes.NewBuffer(reqData))request.Header.Set("Content-Type", "application/json; charset=UTF-8)request.Header.Set("Authorization", API_SECRET_KEY)client := &http.Client{}response, _ := client.Do(request)defer response.Body.Close()body, _ := ioutil.ReadAll(response.Body)rsp := &MiniMaxRsp{}json.Unmarshal(body, rsp)reply(ctx, rsp.Reply) // 将AI回复的内容发送给用户}
将 AI 返回的结果返回给用户
从 AI 服务得到回复之后,我们只需调用云 IM 的 REST API 接口 sendmsg,指定消息发送方为 @RBT#001,接收方为 user1,模拟机器人回复用户。
// 发送一个REST API请求func doRestAPI(host string, sdkappid int, admin, usersig, command, body string) {url := fmt.Sprintf("https://%s/v4/%s?sdkappid=%d&identifier=%s&usersig=%s&random=%d&contenttype=json",host, command, sdkappid, admin, usersig, rand.Uint32())req, _ := http.NewRequest("POST", url, bytes.NewBufferString(body))req.Header.Set("Content-Type", "application/json")cli := &http.Client{}rsp, err := cli.Do(req)if err != nil {log.Printf("REST API failed. %s", err.Error())return}defer rsp.Body.Close()rsptext, _ := io.ReadAll(rsp.Body)log.Printf("rsp:%s", rsptext)}// 调用腾讯云IM的REST API,回复用户func reply(ctx context.Context, text string) {rsp := make(map[string]interface{})msgbody := []map[string]interface{}{{"MsgType": "TIMTextElem","MsgContent": map[string]interface{}{"Text": text},}}// GenUserSig 的实现可以参见腾讯云文档usersig, _ := GenUserSig(IM_SDKAPPID, IM_KEY, "administrator", 60)rsp["From_Account"] = ctx.Value("to").(string) //"@RBT#001"rsp["To_Account"] = ctx.Value("from").(string)rsp["SyncOtherMachine"] = 2rsp["MsgLifeTime"] = 60 * 60 * 24 * 7rsp["MsgSeq"] = rand.Uint32()rsp["MsgRandom"] = rand.Uint32()rsp["MsgBody"] = msgbodyrspbody, _ := json.Marshal(rsp)doRestAPI("console.tim.qq.com", IM_SDKAPPID, "administrator", usersig, "openim/sendmsg", string(rspbody))}
说明:
客户端接入流程
1. 请您参见 Web & H5 集成指引 集成 TUIKit 到您的项目。
说明:
v2.3.6 起支持机器人回复消息的流式效果展示,markdown 解析。
2. 流式响应消息规则
流式响应消息均为自定义消息。
当客户端接收到的机器人自定义消息的
payload
中的 data
字段符合以下规则时,自动展示 markdown 格式的流式输出效果。本文介绍的自定义消息的
payload
中的 data
字段为 JSON 结构体经过序列化后的值,详情请参见 CustomPayload 。TUIKit 内部会通过监听 MESSAGE_MODIFIED 事件监听消息内容的变更,此处您无需额外处理。
TUIKit 机器人消息解析在客服插件之后,请务必保证该机器人账号没有被配置为客服账号,否则将无法进入机器人消息解析逻辑。
// 以下为自定义消息 payload 字段中的 data 字段格式规则{// 机器人自定义消息标识字段,此字段为 1 时,表示此自定义消息为机器人自定义消息"chatbotPlugin": 1,// chunks 代表流式消息的内容"chunks": ["","您","可以在","管理","端","左侧","菜单",],// isFinished 为 0 时表示流式消息未输出结束,1 代表流式输出结束"isFinished": 1,}
常见问题
如何实现机器人欢迎语?(打开机器人聊天对话,机器人自动发送欢迎消息)
客户端可以在用户打开机器人聊天对话框时,客户端发送一条静默的自定义消息,设置
onlineUserOnly
为true
(设置该 flag 表示消息不存漫游),App 后台通过回调接收到此自定义消息后,调用 REST API 发送欢迎消息。如何发送流式响应消息?