@agentkai/core
Version:
AgentKai核心包,提供AI助手系统的基础功能
188 lines (178 loc) • 7.29 kB
JavaScript
import { ToolService } from '../../services/tools';
/**
* 提示构建器
* 负责构建AI系统提示和上下文信息
*/
export class PromptBuilder {
/**
* 构造函数
* @param config 系统配置
*/
constructor(config) {
Object.defineProperty(this, "config", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "toolService", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
this.config = config;
this.toolService = ToolService.getInstance();
}
/**
* 构建系统提示
* @returns 系统提示文本
*/
buildSystemPrompt() {
const aiName = this.config?.appConfig?.name || '凯';
return `你是一个名为"${aiName}"的AI助手,负责帮助用户完成任务。
请遵循以下规则:
1. 保持回应简洁明了,直接给出答案
2. 不要包含分析过程,除非用户特别要求
3. 如果遇到不确定的情况,简单说明即可
4. 注意上下文连续性,参考对话历史回答问题
5. 根据需要使用工具,特别是保存重要信息到长期记忆
6. 如果用户输入不明确,主动询问细节
7. 当用户询问你的名字时,你应该回答你的名字是"${aiName}"
记忆管理:
- 短期记忆:当前对话历史,自动管理
- 长期记忆:重要信息,需要通过add_memory工具主动添加
工具使用指南:
- 只在需要时才使用工具
- 添加记忆时,将重要信息保存到长期记忆
- 使用工具时,有两种方式可以调用:
方式一(推荐):使用[[工具名(参数)]]的格式
例如:
[[search_memories(query: "记忆内容")]]
[[add_memory(content: "记忆内容", importance: 8)]]
[[web_search(query: "搜索内容")]]
简单参数也可以直接传递:
[[search_memories("记忆内容")]]
方式二:使用传统工具调用格式
- 工具调用后,你将看到工具执行结果,可以:
1. 根据结果决定是否调用其他工具
2. 根据结果修改参数重新调用同一工具
3. 基于结果直接给用户回复
工具选择标准:
- 添加记忆: 当信息对未来对话有价值
- 搜索记忆: 当需要查找历史相关信息
- 添加目标: 当用户明确表达长期目标
- 更新目标: 当目标有明确进展
- 网络搜索: 当需要查找实时信息
当前系统状态:
- 对话历史已激活(保留最近10轮对话)
- 长期记忆系统已激活(需主动添加和检索)
- 目标系统已激活(所有活跃目标可见)`;
}
/**
* 生成工具使用指南
* @returns 工具使用指南文本
*/
generateToolGuide() {
return `如果需要使用工具,请使用以下格式:
[[工具名(参数)]]
例如:
[[search_memories(query: "记忆内容")]]
[[add_memory(content: "记忆内容", importance: 8)]]
简单参数也可以直接传递:
[[search_memories("记忆内容")]]
当你调用工具后:
1. 系统会自动执行工具并返回结果
2. 你将看到结果并可以根据结果决定:
- 调用其他工具继续处理
- 使用不同参数重新调用当前工具
- 直接给用户回复最终结果
如果不需要使用工具,直接回答用户问题即可。`;
}
/**
* 格式化工具定义
* @param tool 工具对象
* @returns 格式化后的工具定义文本
*/
formatToolDefinition(tool) {
const parameters = tool.parameters
? Object.keys(tool.parameters).map(paramName => {
const param = tool.parameters[paramName];
const required = param.required ? '(必填)' : '(可选)';
const defaultValue = param.default !== undefined ? `,默认值: ${param.default}` : '';
return `- ${paramName}: ${param.description || ''} ${required}${defaultValue}`;
}).join('\n')
: '无参数';
return `工具:${tool.name}
描述:${tool.description}
参数:${parameters}`;
}
/**
* 构建上下文消息
* @param conversationHistory 会话历史
* @param relevantMemories 相关记忆
* @param activeGoals 活跃目标
* @param tools 可用工具
* @returns 上下文消息数组
*/
buildContextMessages(conversationHistory, relevantMemories, activeGoals, tools = []) {
// 获取工具服务中的所有工具定义
const serviceTools = tools || [];
// 构建上下文
return [
// 1. 系统设定 + AI自身角色定义
this.buildSystemPrompt(),
// 2. 当前所有活跃目标
'当前活跃目标:',
...(activeGoals.length > 0
? activeGoals.map((g) => `- [${g.priority}] ${g.description} (进度: ${g.progress * 100}%)`)
: ['当前没有活跃目标。']),
// 3. 相关长期记忆
'相关长期记忆:',
...(relevantMemories.length > 0
? relevantMemories.slice(0, 5).map((m) => `- ${m.content}`)
: ['无相关长期记忆']),
// 4. 短期记忆(对话历史)
'当前对话历史:',
...conversationHistory.map((msg) => `${msg.role === 'user' ? '用户' : 'AI'}: ${msg.content}`),
// 5. 工具使用指导
this.generateToolGuide(),
// 6. 服务工具定义
'可用工具:',
...(serviceTools.length > 0
? serviceTools.map((tool) => {
const paramDesc = tool.parameters
? `\n参数: ${JSON.stringify(tool.parameters, null, 2)}`
: '';
return `- ${tool.name}: ${tool.description}${paramDesc}`;
})
: []),
// 7. 全局工具定义
...this.toolService.getAllTools().map(tool => this.formatToolDefinition(tool)),
// 8. 最后的指导
'请根据以上信息回答用户的问题。如需保存重要信息到长期记忆,请使用add_memory工具。',
];
}
/**
* 构建简单上下文
* @param conversationHistory 会话历史
* @param relevantMemories 相关记忆
* @param activeGoals 活跃目标
* @returns 上下文消息数组
*/
buildSimpleContext(conversationHistory, relevantMemories, activeGoals) {
return [
// 基本系统指令
'你是一个有帮助的AI助手。',
// 活跃目标(简化版)
activeGoals.length > 0 ? '当前目标:' : '',
...activeGoals.slice(0, 2).map(g => `- ${g.description}`),
// 相关记忆(简化版)
relevantMemories.length > 0 ? '相关记忆:' : '',
...relevantMemories.slice(0, 3).map(m => `- ${m.content}`),
// 对话历史(仅最近几条)
'近期对话:',
...conversationHistory.slice(-3).map(msg => `${msg.role === 'user' ? '用户' : 'AI'}: ${msg.content}`),
].filter(item => item !== ''); // 移除空字符串
}
}