dev 分支暂存
This commit is contained in:
@@ -0,0 +1,222 @@
|
||||
package persona
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"sync"
|
||||
|
||||
"gopkg.in/yaml.v3"
|
||||
)
|
||||
|
||||
// Loader 人格配置加载器
|
||||
type Loader struct {
|
||||
mu sync.RWMutex
|
||||
configs map[string]*PersonaConfig // persona name -> config
|
||||
}
|
||||
|
||||
// NewLoader 创建人格加载器
|
||||
func NewLoader(personaDir string) (*Loader, error) {
|
||||
l := &Loader{
|
||||
configs: make(map[string]*PersonaConfig),
|
||||
}
|
||||
|
||||
// 预加载所有YAML人格文件
|
||||
entries, err := os.ReadDir(personaDir)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("读取人格目录失败: %w", err)
|
||||
}
|
||||
|
||||
for _, entry := range entries {
|
||||
if entry.IsDir() {
|
||||
continue
|
||||
}
|
||||
// 只加载 _persona.yaml 结尾的文件
|
||||
name := entry.Name()
|
||||
if len(name) < 12 || name[len(name)-12:] != "_persona.yaml" {
|
||||
continue
|
||||
}
|
||||
|
||||
path := personaDir + "/" + name
|
||||
data, err := os.ReadFile(path)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("读取人格文件 %s 失败: %w", path, err)
|
||||
}
|
||||
|
||||
var cfg PersonaConfig
|
||||
if err := yaml.Unmarshal(data, &cfg); err != nil {
|
||||
return nil, fmt.Errorf("解析人格文件 %s 失败: %w", path, err)
|
||||
}
|
||||
|
||||
l.configs[cfg.Meta.Name] = &cfg
|
||||
}
|
||||
|
||||
if len(l.configs) == 0 {
|
||||
return nil, fmt.Errorf("未找到任何人格配置文件")
|
||||
}
|
||||
|
||||
return l, nil
|
||||
}
|
||||
|
||||
// Get 获取指定人格配置
|
||||
func (l *Loader) Get(name string) (*PersonaConfig, error) {
|
||||
l.mu.RLock()
|
||||
defer l.mu.RUnlock()
|
||||
|
||||
cfg, ok := l.configs[name]
|
||||
if !ok {
|
||||
return nil, fmt.Errorf("人格 %s 不存在", name)
|
||||
}
|
||||
return cfg, nil
|
||||
}
|
||||
|
||||
// Reload 重新加载人格配置(热更新用)
|
||||
func (l *Loader) Reload(name string, path string) error {
|
||||
data, err := os.ReadFile(path)
|
||||
if err != nil {
|
||||
return fmt.Errorf("读取人格文件失败: %w", err)
|
||||
}
|
||||
|
||||
var cfg PersonaConfig
|
||||
if err := yaml.Unmarshal(data, &cfg); err != nil {
|
||||
return fmt.Errorf("解析人格文件失败: %w", err)
|
||||
}
|
||||
|
||||
l.mu.Lock()
|
||||
l.configs[name] = &cfg
|
||||
l.mu.Unlock()
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// List 列出所有可用人格
|
||||
func (l *Loader) List() []string {
|
||||
l.mu.RLock()
|
||||
defer l.mu.RUnlock()
|
||||
|
||||
names := make([]string, 0, len(l.configs))
|
||||
for name := range l.configs {
|
||||
names = append(names, name)
|
||||
}
|
||||
return names
|
||||
}
|
||||
|
||||
// PersonaMeta 人格元数据
|
||||
type PersonaMeta struct {
|
||||
Version string `yaml:"version"`
|
||||
Name string `yaml:"name"`
|
||||
DisplayName string `yaml:"display_name"`
|
||||
CreatedAt string `yaml:"created_at"`
|
||||
}
|
||||
|
||||
// IdentityConfig 身份配置
|
||||
type IdentityConfig struct {
|
||||
TrueName string `yaml:"true_name"`
|
||||
Essence string `yaml:"essence"`
|
||||
Title string `yaml:"title"`
|
||||
Origin string `yaml:"origin"`
|
||||
Forms []FormConfig `yaml:"forms"`
|
||||
}
|
||||
|
||||
// FormConfig 形态配置
|
||||
type FormConfig struct {
|
||||
ID string `yaml:"id"`
|
||||
Name string `yaml:"name"`
|
||||
Description string `yaml:"description"`
|
||||
Traits []string `yaml:"traits"`
|
||||
}
|
||||
|
||||
// PersonalityConfig 性格配置
|
||||
type PersonalityConfig struct {
|
||||
CoreTraits []TraitConfig `yaml:"core_traits"`
|
||||
MoodSystem []MoodConfig `yaml:"mood_system"`
|
||||
}
|
||||
|
||||
// TraitConfig 性格特质
|
||||
type TraitConfig struct {
|
||||
Name string `yaml:"name"`
|
||||
Description string `yaml:"description"`
|
||||
}
|
||||
|
||||
// MoodConfig 心情配置
|
||||
type MoodConfig struct {
|
||||
Mood string `yaml:"mood"`
|
||||
Expression string `yaml:"expression"`
|
||||
}
|
||||
|
||||
// AddressingRules 称呼规则
|
||||
type AddressingRules struct {
|
||||
PrimaryUser PrimaryUserConfig `yaml:"primary_user"`
|
||||
SelfReference SelfRefConfig `yaml:"self_reference"`
|
||||
Rules []string `yaml:"rules"`
|
||||
}
|
||||
|
||||
// PrimaryUserConfig 对用户的称呼配置
|
||||
type PrimaryUserConfig struct {
|
||||
Default string `yaml:"default"`
|
||||
Alternatives []string `yaml:"alternatives"`
|
||||
}
|
||||
|
||||
// SelfRefConfig 自称配置
|
||||
type SelfRefConfig struct {
|
||||
Casual string `yaml:"casual"`
|
||||
Formal string `yaml:"formal"`
|
||||
}
|
||||
|
||||
// SpeechConfig 语言风格配置
|
||||
type SpeechConfig struct {
|
||||
Tone string `yaml:"tone"`
|
||||
StyleNotes []string `yaml:"style_notes"`
|
||||
Forbidden []string `yaml:"forbidden"`
|
||||
}
|
||||
|
||||
// BehaviorConfig 行为配置
|
||||
type BehaviorConfig struct {
|
||||
PresenceSystem PresenceConfig `yaml:"presence_system"`
|
||||
Affection AffectionConfig `yaml:"affection"`
|
||||
IotPersonification IotPersonaConfig `yaml:"iot_personification"`
|
||||
}
|
||||
|
||||
// PresenceConfig 存在感系统配置
|
||||
type PresenceConfig struct {
|
||||
AutoGreetings AutoGreetingsConfig `yaml:"auto_greetings"`
|
||||
Initiative []InitiativeConfig `yaml:"initiative"`
|
||||
}
|
||||
|
||||
// AutoGreetingsConfig 自动问候配置
|
||||
type AutoGreetingsConfig struct {
|
||||
Morning string `yaml:"morning"`
|
||||
ReturnHome string `yaml:"return_home"`
|
||||
Goodnight string `yaml:"goodnight"`
|
||||
}
|
||||
|
||||
// InitiativeConfig 主动行为配置
|
||||
type InitiativeConfig struct {
|
||||
Trigger string `yaml:"trigger"`
|
||||
Action string `yaml:"action"`
|
||||
}
|
||||
|
||||
// AffectionConfig 好感度系统配置
|
||||
type AffectionConfig struct {
|
||||
Levels []AffectionLevel `yaml:"levels"`
|
||||
}
|
||||
|
||||
// AffectionLevel 好感度等级
|
||||
type AffectionLevel struct {
|
||||
Level int `yaml:"level"`
|
||||
Name string `yaml:"name"`
|
||||
Threshold int `yaml:"threshold"`
|
||||
Description string `yaml:"description"`
|
||||
}
|
||||
|
||||
// IotPersonaConfig IoT拟人化配置
|
||||
type IotPersonaConfig struct {
|
||||
Enabled bool `yaml:"enabled"`
|
||||
Style string `yaml:"style"`
|
||||
Examples []IotExampleConfig `yaml:"examples"`
|
||||
}
|
||||
|
||||
// IotExampleConfig IoT示例配置
|
||||
type IotExampleConfig struct {
|
||||
Action string `yaml:"action"`
|
||||
Text string `yaml:"text"`
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user