42 lines
1.1 KiB
Go
42 lines
1.1 KiB
Go
package runtimeconfig
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
|
|
"inbox/internal/domain/role"
|
|
)
|
|
|
|
// RenderInstructions flattens the resolved system prompt and bound skills into
|
|
// the markdown instructions that should be given to the runtime.
|
|
func RenderInstructions(resolved ResolvedRole, fallbackSystemPrompt string) string {
|
|
var builder strings.Builder
|
|
|
|
systemPrompt := strings.TrimSpace(fallbackSystemPrompt)
|
|
if prompt, ok := resolved.Prompts[role.PromptSystem]; ok && strings.TrimSpace(prompt.ContentMarkdown) != "" {
|
|
systemPrompt = strings.TrimSpace(prompt.ContentMarkdown)
|
|
}
|
|
if systemPrompt != "" {
|
|
builder.WriteString(systemPrompt)
|
|
}
|
|
|
|
if len(resolved.Skills) > 0 {
|
|
if builder.Len() > 0 {
|
|
builder.WriteString("\n\n")
|
|
}
|
|
builder.WriteString("## Skills\n")
|
|
for _, item := range resolved.Skills {
|
|
name := strings.TrimSpace(item.Skill.Name)
|
|
if name == "" {
|
|
name = strings.TrimSpace(item.Skill.SkillKey)
|
|
}
|
|
if name == "" {
|
|
name = strings.TrimSpace(item.Skill.ID)
|
|
}
|
|
builder.WriteString(fmt.Sprintf("### %s\n%s\n", name, strings.TrimSpace(item.Skill.ContentMarkdown)))
|
|
}
|
|
}
|
|
|
|
return strings.TrimSpace(builder.String())
|
|
}
|