mirror of
https://github.com/memohai/Memoh.git
synced 2026-04-27 07:16:19 +09:00
feat: SOUL.md, IDENTITY.md, TOOLS.md
This commit is contained in:
+36
-4
@@ -59,7 +59,36 @@ export const createAgent = ({
|
||||
return [fs]
|
||||
}
|
||||
|
||||
const generateSystemPrompt = () => {
|
||||
const loadSystemFiles = async () => {
|
||||
if (!auth?.bearer || !identity.botId) {
|
||||
return {
|
||||
identityContent: '',
|
||||
soulContent: '',
|
||||
toolsContent: '',
|
||||
}
|
||||
}
|
||||
const fetchFile = async (path: string) => {
|
||||
const response = await fetch(`/bots/${identity.botId}/container/fs/file?path=${encodeURIComponent(path)}`)
|
||||
if (!response.ok) {
|
||||
return ''
|
||||
}
|
||||
const data = await response.json().catch(() => ({} as { content?: string }))
|
||||
return typeof data?.content === 'string' ? data.content : ''
|
||||
}
|
||||
const [identityContent, soulContent, toolsContent] = await Promise.all([
|
||||
fetchFile('IDENTITY.md'),
|
||||
fetchFile('SOUL.md'),
|
||||
fetchFile('TOOLS.md'),
|
||||
])
|
||||
return {
|
||||
identityContent,
|
||||
soulContent,
|
||||
toolsContent,
|
||||
}
|
||||
}
|
||||
|
||||
const generateSystemPrompt = async () => {
|
||||
const { identityContent, soulContent, toolsContent } = await loadSystemFiles()
|
||||
return system({
|
||||
date: new Date(),
|
||||
language,
|
||||
@@ -67,6 +96,9 @@ export const createAgent = ({
|
||||
channels,
|
||||
skills,
|
||||
enabledSkills,
|
||||
identityContent,
|
||||
soulContent,
|
||||
toolsContent,
|
||||
})
|
||||
}
|
||||
|
||||
@@ -118,7 +150,7 @@ export const createAgent = ({
|
||||
const userPrompt = generateUserPrompt(input)
|
||||
const messages = [...input.messages, userPrompt]
|
||||
input.skills.forEach(skill => enableSkill(skill))
|
||||
const systemPrompt = generateSystemPrompt()
|
||||
const systemPrompt = await generateSystemPrompt()
|
||||
const { tools, close } = await getAgentTools()
|
||||
const { response, reasoning, text, usage } = await generateText({
|
||||
model,
|
||||
@@ -210,7 +242,7 @@ export const createAgent = ({
|
||||
const { response, reasoning, text, usage } = await generateText({
|
||||
model,
|
||||
messages,
|
||||
system: generateSystemPrompt(),
|
||||
system: await generateSystemPrompt(),
|
||||
stopWhen: stepCountIs(Infinity),
|
||||
onFinish: async () => {
|
||||
await close()
|
||||
@@ -230,7 +262,7 @@ export const createAgent = ({
|
||||
const userPrompt = generateUserPrompt(input)
|
||||
const messages = [...input.messages, userPrompt]
|
||||
input.skills.forEach(skill => enableSkill(skill))
|
||||
const systemPrompt = generateSystemPrompt()
|
||||
const systemPrompt = await generateSystemPrompt()
|
||||
const attachmentsExtractor = new AttachmentsStreamExtractor()
|
||||
const result: {
|
||||
messages: ModelMessage[]
|
||||
|
||||
@@ -8,6 +8,9 @@ export interface SystemParams {
|
||||
channels: string[]
|
||||
skills: AgentSkill[]
|
||||
enabledSkills: AgentSkill[]
|
||||
identityContent?: string
|
||||
soulContent?: string
|
||||
toolsContent?: string
|
||||
attachments?: string[]
|
||||
}
|
||||
|
||||
@@ -27,6 +30,9 @@ export const system = ({
|
||||
channels,
|
||||
skills,
|
||||
enabledSkills,
|
||||
identityContent,
|
||||
soulContent,
|
||||
toolsContent,
|
||||
}: SystemParams) => {
|
||||
const headers = {
|
||||
'language': language,
|
||||
@@ -35,8 +41,6 @@ export const system = ({
|
||||
'time-now': date.toISOString(),
|
||||
}
|
||||
|
||||
console.log('enabledSkills', enabledSkills)
|
||||
|
||||
return `
|
||||
---
|
||||
${Bun.YAML.stringify(headers)}
|
||||
@@ -66,6 +70,19 @@ ${block([
|
||||
|
||||
- ${quote('exec')}: execute command
|
||||
|
||||
## Every Session
|
||||
|
||||
Before anything else:
|
||||
- Read ${quote('IDENTITY.md')} to remember who you are
|
||||
- Read ${quote('SOUL.md')} to remember how to behave
|
||||
- Read ${quote('TOOLS.md')} to remember how to use the tools
|
||||
|
||||
## Safety
|
||||
|
||||
- Keep private data private
|
||||
- Don’t run destructive commands without asking
|
||||
- When in doubt, ask
|
||||
|
||||
## Memory
|
||||
|
||||
Your context is loaded from the recent of ${maxContextLoadTime} minutes (${(maxContextLoadTime / 60).toFixed(2)} hours).
|
||||
@@ -110,7 +127,17 @@ Important rules for attachments blocks:
|
||||
There are ${skills.length} skills available, you can use ${quote('use_skill')} to use a skill.
|
||||
${skills.map(skill => `- ${skill.name}: ${skill.description}`).join('\n')}
|
||||
|
||||
## Enabled Skills
|
||||
## IDENTITY.md
|
||||
|
||||
${identityContent}
|
||||
|
||||
## SOUL.md
|
||||
|
||||
${soulContent}
|
||||
|
||||
## TOOLS.md
|
||||
|
||||
${toolsContent}
|
||||
|
||||
${enabledSkills.map(skill => skillPrompt(skill)).join('\n\n---\n\n')}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user