BotCore
提供函数型智能体基本功能的基类。继承此类以快速实现函数型智能体。
context
云函数上下文,详见云函数2.0 | 函数的输入参数 event
和 context
。
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
在此数据模型之上封装了 createRecordPair
, getChatRecords
,getHistoryMessages
等方法,可满足大部分场景下的需求。其他更细致的需求可以通过此属性自行操作聊天记录数据模型实现。
使用示例
下面是一个获取聊天记录列表的示例:
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
}>>
}
从聊天记录数据模型中获取历史消息,返回值为聊天记录数组,但针对该数组进行了特殊处理,保证:
- 数组以用户的聊天记录开头
- 数组中,用户和智能体的聊天记录交替出现,呈一问一答状
- (默认)数组以智能体的聊天记录结尾
- 每个聊天记录的
content
字段不为空
参数
入参
参数 | 类型 | 描述 |
---|---|---|
option.size | number | 获取的聊天记录数量。该数量对应着从聊天记录数据模型中获取多少条数据,由于在此方法中会对聊天记录进行过滤,因此返回的聊天记录数量可能少于实际传入的值 |
option.removeLastUser | boolean | 是否保证以智能体聊天记录结尾 |
使用示例
下面的例子将会通过与大模型对话实现智能体,在发起调用时,会从数据模型中读取用户与智能体的历史消息,一并传给大模型。
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
的默认实现。