Files
geo/server/internal/tenant/prompts/runtime.go
T
root 1b01caac0f feat(prompts): add prompts loader and configuration management
- 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.
2026-04-13 16:08:12 +08:00

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)
}