跳到主要内容

BotCore

提供函数型智能体基本功能的基类。继承此类以快速实现函数型智能体。

context

云函数上下文,详见云函数2.0 | 函数的输入参数 eventcontext

botId

string

botId,即函数型智能体的 id。

botTag

string

函数型智能体的 botId 的格式为 ibot-xxx-botTag,以 - 为分隔,一共有三段,我们将第三段称为 botTag

sseSender

interface SSESender {
send(prop: {data: {content: string}}): void;
end(): void;
}

提供流式返回 SSE 消息的对象。提供两个方法:

  • send() 发送 SSE 消息,其中 prop.data.content 字段为智能体的文本输出。
  • end() 结束 SSE 并发送结尾消息。当所有内容都发送完毕后,可调用此方法结束 SSE 链接。

使用示例

下面是一个将字符串分字符流式传输给客户端的示例:

class MyBot extends BotCore {
async sendMessage() {
const ANSWER = "这是一条流式传输的内容。"

for (let i = 0; i < ANSWER.length; i++) {
// 发送消息给客户端
this.sseSender.send({ data: { content: ANSWER[i] } });
}
// 发送完毕
this.sseSender.end();
}
}

chatRecord

type ChatRecordDataModel = DataModelMethods<{
/** 异步回复内容 */
async_reply?: string
/** 是否异步回复 */
need_async_reply?: boolean
/** 请求 id */
trace_id?: string
/** 回复的消息id */
reply?: string
/** 被回复的消息id */
reply_to?: string
/** 原始消息内容 */
origin_msg?: string
/** 来源 */
trigger_src?: string
/** 会话 */
conversation?: string
/** 发送者 */
sender?: string
/** 推荐问题 */
recommend_questions?: string[]
/** 事件类型 */
event?: string
/** 图片地址 */
image?: string
/** 内容 */
content?: string
/** 消息类型 */
type?: string
/** 角色 */
role?: string
/** 对话记录ID */
record_id?: string
/** 智能体ID */
bot_id?: string
}>

聊天记录数据模型,提供增删改查等方法。详情可参考 数据模型 | SDK 类型声明 | DataModelMethods

提示

BotCore 在此数据模型之上封装了 createRecordPairgetChatRecordsgetHistoryMessages 等方法,可满足大部分场景下的需求。其他更细致的需求可以通过此属性自行操作聊天记录数据模型实现。

使用示例

下面是一个获取聊天记录列表的示例:

class MyBot extends BotCore {
getRecordList() {
return this.chatRecord.list({
pageSize: 10
})
}
}

更多数据模型使用示例可前往 数据模型 | SDK 类型声明 | DataModelMethods 查看。

createRecordPair()

interface CreateRecordPair {
({userContent: string}): Promise<{
updateBotRecord: ({content: string}) => Promise<void>
}>
}

创建一对 「用户 - 智能体」 的聊天记录,并存到数据模型中,返回值中提供更新智能体聊天记录的方法。

在智能体对话的场景中,聊天记录成对出现,用户发送一条信息后,智能体应该针对该信息进行回复。

该方法要求传入用户的聊天内容,会在数据模型中创建:

  • 用户的聊天记录,内容为传入的聊天内容
  • 智能体聊天记录,内容为空

开发者能从返回值中获取到 updateBotRecord 函数。在收集到完整的智能体聊天内容后,可以调用该函数更新智能体聊天记录。

使用示例

下面的例子将会通过与大模型对话实现智能体,并将用户的消息记录和大模型的回复都存入数据模型中。

import OpenAI from 'openai';

const client = new OpenAI();

class MyBot extends BotCore {
sendMessage({ msg }) {
// 创建一对 「用户 - 智能体」 的聊天记录
const { updateBotRecord } = await this.createRecordPair({ userContent: msg })

const chatCompletion = await client.chat.completions.create({
messages: [{ role: 'user', content: 'Say this is a test' }],
model: 'gpt-4o',
stream: true,
});

// 创建个变量存储智能体的消息
let content = '';
for await (const chunk of stream) {
const chunkContent = chunk.choices[0]?.delta?.content || '';
// 发送 SSE 消息给客户端
this.sseSender.send({ data: { content: chunkContent }});
// 将消息片段累加到 content 变量中
content += chunkContent;
}

// 结束 SSE 传输
this.sseSender.end()
// 更新智能体聊天记录
await updateBotRecord({content})
}
}

getHistoryMessages()

interface GetHistoryMessages {
(option?: {
size?: number;
removeLastUser?: boolean
}): Promise<Array<{
role: "user" | "assistant",
content: string
}>>
}

从聊天记录数据模型中获取历史消息,返回值为聊天记录数组,但针对该数组进行了特殊处理,保证:

  1. 数组以用户的聊天记录开头
  2. 数组中,用户和智能体的聊天记录交替出现,呈一问一答状
  3. (默认)数组以智能体的聊天记录结尾
  4. 每个聊天记录的 content 字段不为空

参数

入参

参数类型描述
option.sizenumber获取的聊天记录数量。该数量对应着从聊天记录数据模型中获取多少条数据,由于在此方法中会对聊天记录进行过滤,因此返回的聊天记录数量可能少于实际传入的值
option.removeLastUserboolean是否保证以智能体聊天记录结尾

使用示例

下面的例子将会通过与大模型对话实现智能体,在发起调用时,会从数据模型中读取用户与智能体的历史消息,一并传给大模型。

import OpenAI from 'openai';

const client = new OpenAI();

class MyBot extends BotCore {
sendMessage({ msg }) {
// 获取历史消息
const history = await this.getHistoryMessage()

const chatCompletion = await client.chat.completions.create({
messages: [
...history, // 在请求参数中加入历史消息
{ role: 'user', content: 'Say this is a test' }
],
model: 'gpt-4o',
stream: true,
});

for await (const chunk of stream) {
const chunkContent = chunk.choices[0]?.delta?.content || '';
// 发送 SSE 消息给客户端
this.sseSender.send({ data: { content: chunkContent }});
}

// 结束 SSE 传输
this.sseSender.end()
}
}

getChatRecords()

从数据模型中获取聊天记录,BotCore 提供的 IBot 接口定义的 getChatRecords 的默认实现。