feat: 增加管理员 AI 模型配置 (#200)
This commit is contained in:
@@ -33,6 +33,8 @@ const (
|
||||
databaseTLSCAEnv = "CMAUTOBUY_DB_TLS_CA"
|
||||
catalogSourceEnv = "CMAUTOBUY_CATALOG_SOURCE"
|
||||
catalogTokenEnv = "CMAUTOBUY_CATALOG_TOKEN"
|
||||
aiSecretsPathEnv = "CMAUTOBUY_AI_SECRETS_PATH"
|
||||
aiAllowedHostsEnv = "CMAUTOBUY_AI_ALLOWED_HOSTS"
|
||||
)
|
||||
|
||||
const (
|
||||
@@ -322,6 +324,51 @@ type Config struct {
|
||||
Database DatabaseConfig `yaml:"database"`
|
||||
Syb SybConfig `yaml:"syb"`
|
||||
Integrations IntegrationsConfig `yaml:"integrations"`
|
||||
AI AIConfig `yaml:"ai"`
|
||||
}
|
||||
|
||||
// AIConfig 只保存部署级安全边界,不保存网页维护的服务商配置和 API Key。
|
||||
type AIConfig struct {
|
||||
SecretsPath string `yaml:"secrets_path"`
|
||||
AllowedHosts []string `yaml:"allowed_hosts"`
|
||||
}
|
||||
|
||||
// LoadAIConfig 读取可选的 AI 密钥路径和私有端点允许列表。
|
||||
// 未配置时 Admin 仍能启动,但网页不能保存密钥或测试连接。
|
||||
func LoadAIConfig() (AIConfig, error) {
|
||||
path, err := ConfigPath()
|
||||
if err != nil {
|
||||
return AIConfig{}, fmt.Errorf("无法确定 AI 配置路径: %w", err)
|
||||
}
|
||||
var cfg AIConfig
|
||||
raw, readErr := os.ReadFile(path)
|
||||
if readErr == nil {
|
||||
parsed, parseErr := parseConfig(raw, path)
|
||||
if parseErr != nil {
|
||||
return AIConfig{}, parseErr
|
||||
}
|
||||
cfg = parsed.AI
|
||||
} else if !os.IsNotExist(readErr) {
|
||||
return AIConfig{}, fmt.Errorf("读取配置文件 %s 失败: %w", path, readErr)
|
||||
}
|
||||
if value := strings.TrimSpace(os.Getenv(aiSecretsPathEnv)); value != "" {
|
||||
cfg.SecretsPath = value
|
||||
}
|
||||
if value := strings.TrimSpace(os.Getenv(aiAllowedHostsEnv)); value != "" {
|
||||
cfg.AllowedHosts = strings.Split(value, ",")
|
||||
}
|
||||
cfg.SecretsPath = strings.TrimSpace(cfg.SecretsPath)
|
||||
seen := map[string]bool{}
|
||||
hosts := make([]string, 0, len(cfg.AllowedHosts))
|
||||
for _, host := range cfg.AllowedHosts {
|
||||
host = strings.ToLower(strings.TrimSpace(host))
|
||||
if host != "" && !seen[host] {
|
||||
seen[host] = true
|
||||
hosts = append(hosts, host)
|
||||
}
|
||||
}
|
||||
cfg.AllowedHosts = hosts
|
||||
return cfg, nil
|
||||
}
|
||||
|
||||
// IntegrationsConfig 收拢所有非 Client 的第三方数据接入配置。
|
||||
|
||||
Reference in New Issue
Block a user