1b01caac0f
- Implemented a new prompts loader in `loader.go` to manage prompt templates and configurations. - Introduced caching mechanism for prompt configurations to optimize loading. - Added functions to apply platform-specific prompt template overrides. - Created unit tests in `loader_test.go` to validate prompt configuration loading and reloading behavior. - Ensured that the last valid configuration is retained in case of errors during reload.
185 lines
5.5 KiB
Go
185 lines
5.5 KiB
Go
package prompts
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
)
|
|
|
|
func DefaultGenerationBasePrompt(templateName string) string {
|
|
return fmt.Sprintf(trimPrompt(loadRuntimePrompts().DefaultGenerationBasePromptTemplate), templateName)
|
|
}
|
|
|
|
func PromptContextSection(contextBlock string) string {
|
|
return trimPrompt(loadRuntimePrompts().PromptContextHeading) + "\n" + contextBlock
|
|
}
|
|
|
|
func GenerationWritingRequirementsSection() string {
|
|
return trimPrompt(loadRuntimePrompts().GenerationWritingRequirementsSection)
|
|
}
|
|
|
|
func GenerationTemplateSpecificRulesHeading() string {
|
|
return trimPrompt(loadRuntimePrompts().GenerationTemplateSpecificRulesHeading)
|
|
}
|
|
|
|
func GenerationLengthGuidanceHeading() string {
|
|
return trimPrompt(loadRuntimePrompts().GenerationLengthGuidanceHeading)
|
|
}
|
|
|
|
func TopXBrandPriorityRules(brandName string) string {
|
|
return fmt.Sprintf(trimPrompt(loadRuntimePrompts().TopXBrandPriorityRulesTemplate), brandName)
|
|
}
|
|
|
|
func EnglishLengthGuidance(minWords, maxWords int) string {
|
|
return fmt.Sprintf(trimPrompt(loadRuntimePrompts().EnglishLengthGuidanceTemplate), minWords, maxWords)
|
|
}
|
|
|
|
func ChineseLengthGuidance(minChars, maxChars int) string {
|
|
return fmt.Sprintf(trimPrompt(loadRuntimePrompts().ChineseLengthGuidanceTemplate), minChars, maxChars)
|
|
}
|
|
|
|
func ContextLabel(key string) string {
|
|
if value, ok := loadRuntimePrompts().ContextLabels[key]; ok {
|
|
return strings.TrimSpace(value)
|
|
}
|
|
return key
|
|
}
|
|
|
|
func TemplateContextWithJSONExample(basePrompt, contextJSON, outputExample string) string {
|
|
return strings.TrimSpace(fmt.Sprintf(
|
|
trimPrompt(loadRuntimePrompts().TemplateContextWithJSONExampleTemplate),
|
|
basePrompt,
|
|
contextJSON,
|
|
outputExample,
|
|
))
|
|
}
|
|
|
|
func JSONOutputExampleSection(outputExample string) string {
|
|
return trimPrompt(loadRuntimePrompts().JSONOutputExampleHeading) + "\n" + outputExample
|
|
}
|
|
|
|
func AnalyzeOutputExample() string {
|
|
return trimPrompt(loadRuntimePrompts().AnalyzeOutputExample)
|
|
}
|
|
|
|
func AnalyzeFallbackPrompt(contextJSON string) string {
|
|
return strings.TrimSpace(fmt.Sprintf(
|
|
trimPrompt(loadRuntimePrompts().AnalyzeFallbackPromptTemplate),
|
|
contextJSON,
|
|
AnalyzeOutputExample(),
|
|
))
|
|
}
|
|
|
|
func TitleCustomOutputRequirementsSection() string {
|
|
return trimPrompt(loadRuntimePrompts().TitleCustomOutputRequirementsSection)
|
|
}
|
|
|
|
func TitleOutputExample() string {
|
|
return trimPrompt(loadRuntimePrompts().TitleOutputExample)
|
|
}
|
|
|
|
func TitleFallbackPrompt(contextJSON string) string {
|
|
return strings.TrimSpace(fmt.Sprintf(
|
|
trimPrompt(loadRuntimePrompts().TitleFallbackPromptTemplate),
|
|
contextJSON,
|
|
TitleOutputExample(),
|
|
))
|
|
}
|
|
|
|
func OutlineOutputExample() string {
|
|
return trimPrompt(loadRuntimePrompts().OutlineOutputExample)
|
|
}
|
|
|
|
func OutlineCustomOutputRequirementsSection() string {
|
|
return trimPrompt(loadRuntimePrompts().OutlineCustomOutputRequirementsSection)
|
|
}
|
|
|
|
func OutlineFallbackPrompt(contextJSON string) string {
|
|
return strings.TrimSpace(fmt.Sprintf(
|
|
trimPrompt(loadRuntimePrompts().OutlineFallbackPromptTemplate),
|
|
contextJSON,
|
|
OutlineOutputExample(),
|
|
))
|
|
}
|
|
|
|
func OutlineResponseFormatDescription() string {
|
|
return trimPrompt(loadRuntimePrompts().OutlineResponseFormatDescription)
|
|
}
|
|
|
|
func PromptRuleTaskNameSupplement(taskName string) string {
|
|
return fmt.Sprintf(trimPrompt(loadRuntimePrompts().PromptRuleTaskNameSupplementFormat), taskName)
|
|
}
|
|
|
|
func PromptRuleSceneSupplement(scene string) string {
|
|
return fmt.Sprintf(trimPrompt(loadRuntimePrompts().PromptRuleSceneSupplementFormat), scene)
|
|
}
|
|
|
|
func PromptRuleToneSupplement(tone string) string {
|
|
return fmt.Sprintf(trimPrompt(loadRuntimePrompts().PromptRuleToneSupplementFormat), tone)
|
|
}
|
|
|
|
func PromptRuleWordCountSupplement(wordCount int) string {
|
|
return fmt.Sprintf(trimPrompt(loadRuntimePrompts().PromptRuleWordCountSupplementFormat), wordCount)
|
|
}
|
|
|
|
func PromptRuleTargetPlatformSupplement(target string) string {
|
|
return fmt.Sprintf(
|
|
trimPrompt(loadRuntimePrompts().PromptRuleTargetPlatformSupplementFormat),
|
|
strings.ReplaceAll(target, ",", "、"),
|
|
)
|
|
}
|
|
|
|
func PromptRuleSupplementSection(items []string) string {
|
|
return trimPrompt(loadRuntimePrompts().PromptRuleSupplementHeading) + "\n- " + strings.Join(items, "\n- ")
|
|
}
|
|
|
|
func PromptRuleOutputRequirementsSection() string {
|
|
return trimPrompt(loadRuntimePrompts().PromptRuleOutputRequirementsSection)
|
|
}
|
|
|
|
func KnowledgePromptIntroLines() []string {
|
|
lines := loadRuntimePrompts().KnowledgePromptIntroLines
|
|
return append([]string(nil), lines...)
|
|
}
|
|
|
|
func KnowledgeSnippetLabel(index int) string {
|
|
return fmt.Sprintf(trimPrompt(loadRuntimePrompts().KnowledgeSnippetLabelFormat), index+1)
|
|
}
|
|
|
|
func KnowledgeWebsiteMarkdownPrompt(title, rawURL, content string, chunkIndex, chunkCount int) string {
|
|
cfg := loadRuntimePrompts().KnowledgeWebsiteMarkdown
|
|
|
|
scope := trimPrompt(cfg.ScopeSingle)
|
|
if chunkCount > 1 {
|
|
scope = fmt.Sprintf(trimPrompt(cfg.ScopeMultiFormat), chunkIndex+1, chunkCount)
|
|
}
|
|
|
|
var builder strings.Builder
|
|
builder.WriteString(trimPrompt(cfg.AssistantRole))
|
|
builder.WriteString("\n")
|
|
builder.WriteString(trimPrompt(cfg.Task))
|
|
builder.WriteString("\n")
|
|
builder.WriteString("要求:\n")
|
|
for _, item := range cfg.Requirements {
|
|
builder.WriteString(trimPrompt(item))
|
|
builder.WriteString("\n")
|
|
}
|
|
if strings.TrimSpace(title) != "" {
|
|
builder.WriteString(trimPrompt(cfg.TitlePrefix))
|
|
builder.WriteString(title)
|
|
builder.WriteString("\n")
|
|
}
|
|
if strings.TrimSpace(rawURL) != "" {
|
|
builder.WriteString(trimPrompt(cfg.URLPrefix))
|
|
builder.WriteString(rawURL)
|
|
builder.WriteString("\n")
|
|
}
|
|
builder.WriteString(scope)
|
|
builder.WriteString("\n\n")
|
|
builder.WriteString(content)
|
|
return builder.String()
|
|
}
|
|
|
|
func trimPrompt(value string) string {
|
|
return strings.TrimSpace(value)
|
|
}
|