小程序开放平台

文档中心
平台概述

sendMessage

更新时间:2025-10-31 14:41:28

sendMessage

方法概述

sendMessage
是智能体核心方法之一,用于处理用户与智能体之间的对话交互。该方法接收用户输入和历史消息,通过 AI 模型生成响应,并通过 Server-Sent Events (SSE) 实时返回给客户端。

基本信息

  1. 函数签名
    sendMessage(input: SendMessageInput): Promise<void>
  2. 服务 URI
    POST
    /v1/aiagent/agents/:agentId/send-message
  3. 返回类型
    Promise<void>
    - 异步方法,无返回值
  4. 调用方式 内部方法,由 AgentRuntime 框架自动调用

功能说明

  • 对话处理:接收用户消息并生成智能体响应
  • 流式输出:通过 SSE 实时推送响应内容给客户端
  • 历史管理:支持多轮对话,可处理历史消息上下文
  • 模型集成:内部调用 AI 模型进行文本生成

参数说明

SendMessageInput 参数数据结构:

字段
类型
描述
是否必传
示例
msg
string
用户输入的消息内容,通常为 JSON 字符串格式
'{"msg": "你好,请帮我写一首诗"}'
history
Array<Message>
历史对话消息数组,用于维护多轮对话上下文是(可传空数组
[]
[{"role": "user", "content": "之前的问题"}, {"role": "assistant", "content": "之前的回答"}]

参数详细说明

msg 字段

  • 类型:字符串
  • 格式:通常为 JSON 字符串,包含用户的实际消息内容
  • 解析:在方法内部需要使用
    JSON.parse(input.msg)
    解析获取实际消息
  • 示例
    {
      "msg": "请帮我分析一下这个数据",
      "type": "text"
    }
    

history 字段

  • 类型:消息对象数组
  • 作用:维护对话历史,确保 AI 模型能够理解上下文
  • 格式:每个消息对象包含
    role
    content
    字段
  • 角色类型
    • user
      :用户消息
    • assistant
      :智能体回复
    • system
      :系统提示(可选)

实现要点

1. SSE 流式输出

javascript
// 通过 this.sseSender 发送流式数据
for await (const chunk of modelResponse) {
    this.sseSender.send({ data: chunk });
}
this.sseSender.end(); // 结束流式输出

2. 消息格式处理

javascript
// 解析用户输入
const messageText = JSON.parse(input.msg).msg || '';

// 构建消息数组
const messages = [
    { role: 'system', content: systemPrompt },
    ...input.history, // 添加历史消息
    { role: 'user', content: messageText }
];

3. 模型调用

javascript
// 创建模型实例
const model = this.createModel('qwen-turbo');

// 流式调用
const modelResponse = await model.streamText({ messages });

注意事项

⚠️ 重要提醒

  1. 必须调用
    this.sseSender.end()
    :在方法结束前必须调用此方法结束 SSE 连接
  2. 错误处理:建议添加 try-catch 块处理可能的异常
  3. 消息格式:确保发送给客户端的数据格式符合前端预期
  4. 性能考虑:流式输出可以提高用户体验,避免长时间等待

使用示例

基础实现示例

class MyAgent extends AgentRuntime {
    async sendMessage(input) {
        try {
            // 1. 解析用户输入
            const messageText = JSON.parse(input.msg).msg || '';
            const model = this.createModel('qwen-turbo');
            
            // 2. 构建消息数组
            const messages = [
                {
                    role: 'system',
                    content: '你是一个有用的AI助手,请用中文回答问题。'
                }
            ];
            
            // 3. 添加历史消息
            if (input.history && input.history.length) {
                messages.push(...input.history);
            }
            
            // 4. 添加当前用户消息
            messages.push({
                role: 'user',
                content: messageText
            });
            
            // 5. 调用模型生成响应
            const modelResponse = await model.streamText({
                messages
            });
            
            // 6. 流式输出响应
            for await (const chunk of modelResponse) {
                this.sseSender.send({ data: chunk });
            }
            
        } catch (error) {
            // 7. 错误处理
            console.error('sendMessage error:', error);
            this.sseSender.send({ 
                data: { 
                    error: '处理消息时发生错误,请稍后重试' 
                } 
            });
        } finally {
            // 8. 结束连接
            this.sseSender.end();
        }
    }
}

高级实现示例(带多模态支持)

class AdvancedAgent extends AgentRuntime {
    async sendMessage(input) {
        try {
            const parsedInput = JSON.parse(input.msg);
            const messageText = parsedInput.msg || '';
            const hasImage = parsedInput.image; // 检查是否包含图片
            
            const model = this.createModel('qwen-vl-plus'); // 多模态模型
            
            const messages = [
                {
                    role: 'system',
                    content: '你是一个智能助手,可以处理文本和图片。'
                }
            ];
            
            // 添加历史消息
            if (input.history && input.history.length) {
                messages.push(...input.history);
            }
            
            // 构建当前消息
            const currentMessage = {
                role: 'user',
                content: hasImage ? [
                    { type: 'text', text: messageText },
                    { type: 'image_url', image_url: { url: hasImage } }
                ] : messageText
            };
            
            messages.push(currentMessage);
            
            // 流式调用模型
            const modelResponse = await model.streamText({ messages });
            
            // 处理流式响应
            for await (const chunk of modelResponse) {
                // 可以在这里对响应进行额外处理
                const processedChunk = {
                    ...chunk,
                    timestamp: new Date().toISOString()
                };
                this.sseSender.send({ data: processedChunk });
            }
            
        } catch (error) {
            console.error('Advanced sendMessage error:', error);
            this.sseSender.send({ 
                data: { 
                    error: 'AI 服务暂时不可用,请稍后重试',
                    code: 'MODEL_ERROR'
                } 
            });
        } finally {
            this.sseSender.end();
        }
    }
}

响应数据格式

SSE 发送的数据格式示例(不同模型回复格式不同,这里以deepseek-r1为例):

{
  "choices": [
    {
      "message": {
        "role": "assistant",
        "content": "这是AI生成的回复内容",
        "type": "text"
      }
    }
  ],
  "usage": {
    "prompt_tokens": 100,
    "completion_tokens": 50,
    "total_tokens": 150
  }
}