Files
yoyo/internal/translator/prompt.go
z.to ad667fa782 feat: implement core architecture (v0.0.2)
- Implement Config class with YAML loading and environment variable support
- Implement Provider interface and factory pattern
- Implement SiliconFlow provider as example
- Implement Translator core class with prompt management
- Create CLI entry point
- Add configuration template and unit tests
- Update changelog and discussion records

Version: 0.0.2
2026-03-28 23:27:02 +08:00

132 lines
3.3 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package translator
import (
"fmt"
"strings"
)
// PromptManager Prompt管理器
type PromptManager struct {
prompts map[string]string
}
// NewPromptManager 创建Prompt管理器
func NewPromptManager(prompts map[string]string) *PromptManager {
if prompts == nil {
prompts = make(map[string]string)
}
return &PromptManager{
prompts: prompts,
}
}
// GetPrompt 获取指定名称的Prompt
func (pm *PromptManager) GetPrompt(name string) string {
prompt, exists := pm.prompts[name]
if !exists {
return ""
}
return prompt
}
// SetPrompt 设置Prompt
func (pm *PromptManager) SetPrompt(name, content string) {
pm.prompts[name] = content
}
// DeletePrompt 删除Prompt
func (pm *PromptManager) DeletePrompt(name string) {
delete(pm.prompts, name)
}
// HasPrompt 检查Prompt是否存在
func (pm *PromptManager) HasPrompt(name string) bool {
_, exists := pm.prompts[name]
return exists
}
// GetAllPrompts 获取所有Prompt名称
func (pm *PromptManager) GetAllPrompts() []string {
names := make([]string, 0, len(pm.prompts))
for name := range pm.prompts {
names = append(names, name)
}
return names
}
// GetPromptCount 获取Prompt数量
func (pm *PromptManager) GetPromptCount() int {
return len(pm.prompts)
}
// FormatPrompt 格式化Prompt替换变量
func (pm *PromptManager) FormatPrompt(name string, vars map[string]string) string {
prompt := pm.GetPrompt(name)
if prompt == "" {
return ""
}
// 替换变量
for key, value := range vars {
placeholder := fmt.Sprintf("{{%s}}", key)
prompt = strings.ReplaceAll(prompt, placeholder, value)
}
return prompt
}
// ValidatePrompt 验证Prompt是否包含必要变量
func (pm *PromptManager) ValidatePrompt(name string, requiredVars []string) error {
prompt := pm.GetPrompt(name)
if prompt == "" {
return fmt.Errorf("prompt '%s' 不存在", name)
}
for _, varName := range requiredVars {
placeholder := fmt.Sprintf("{{%s}}", varName)
if !strings.Contains(prompt, placeholder) {
return fmt.Errorf("prompt '%s' 缺少必要变量: %s", name, varName)
}
}
return nil
}
// AddDefaultPrompts 添加默认Prompts
func (pm *PromptManager) AddDefaultPrompts() {
defaults := map[string]string{
"technical": "你是一位专业的技术翻译,请准确翻译以下技术文档,保持专业术语的准确性。",
"creative": "你是一位富有创造力的翻译家,请用优美流畅的语言翻译以下内容。",
"academic": "你是一位学术翻译专家,请用严谨的学术语言翻译以下内容。",
"simple": "请用简单易懂的语言翻译以下内容。",
"code": "你是一位专业的代码翻译专家,请准确翻译以下代码注释和文档,保持代码结构和注释格式。",
}
for name, content := range defaults {
if !pm.HasPrompt(name) {
pm.SetPrompt(name, content)
}
}
}
// GetPromptWithFallback 获取Prompt如果不存在则返回默认Prompt
func (pm *PromptManager) GetPromptWithFallback(name, fallback string) string {
prompt := pm.GetPrompt(name)
if prompt == "" {
return fallback
}
return prompt
}
// MergePrompts 合并多个Prompt
func (pm *PromptManager) MergePrompts(names []string, separator string) string {
var prompts []string
for _, name := range names {
prompt := pm.GetPrompt(name)
if prompt != "" {
prompts = append(prompts, prompt)
}
}
return strings.Join(prompts, separator)
}