47dce276a4
- platform_silent模式接入Orchestrator记忆提取:被动观察群聊时提取值得记住的信息到对应命名空间 - post_chat后台思考注入平台观察:对话后思考也能看到群聊摘要 - QQ适配器:OneBot v11 self_id动态捕获、CQ图片URL提取、视觉+OCR并行处理 - Router解耦:ConfigName/PlatformName分离,支持多QQ实例独立连接 - 黑白名单功能:后端API + Ethend代理 + UI面板 - \n\n双换行断句:AI回复按双换行分割为多条消息按间隔发送 - @提及修复:bot自感知UID进行@检测 - 群聊上下文共享:channel-based userID避免记忆碎片化 - 消息日志显示处理后内容而非原始SSE数据 - platform-bridge Dockerfile + docker-compose.yml更新 Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
113 lines
2.7 KiB
Go
113 lines
2.7 KiB
Go
package config
|
|
|
|
import (
|
|
"os"
|
|
"strings"
|
|
)
|
|
|
|
// Config holds Platform Bridge configuration.
|
|
type Config struct {
|
|
Port string
|
|
Env string
|
|
GatewayURL string
|
|
AICoreURL string
|
|
InternalToken string
|
|
|
|
// Platform-specific.
|
|
QQBotPort string // port for QQ OBv11 reverse WebSocket
|
|
TelegramToken string // Telegram Bot API token
|
|
TelegramWebhookURL string // public webhook URL for Telegram
|
|
|
|
// Silent observation mode.
|
|
PlatformSilentEnabled bool // PLATFORM_SILENT_ENABLED, default true
|
|
AdminNicknames []string // ADMIN_NICKNAMES, default ["开拓者"]
|
|
AdminMentionKeywords []string // ADMIN_MENTION_KEYWORDS, default ["昔涟","Cyrene","管理员"]
|
|
|
|
// Message sending.
|
|
MessageSendIntervalMs int // MSG_SEND_INTERVAL_MS, minimum interval between platform messages (default 2000)
|
|
}
|
|
|
|
func Load() *Config {
|
|
cfg := &Config{
|
|
Port: "8095",
|
|
Env: "development",
|
|
GatewayURL: "http://localhost:8080",
|
|
AICoreURL: "http://localhost:8081",
|
|
QQBotPort: "8096",
|
|
}
|
|
if v := os.Getenv("PORT"); v != "" {
|
|
cfg.Port = v
|
|
}
|
|
if v := os.Getenv("ENV"); v != "" {
|
|
cfg.Env = v
|
|
}
|
|
if v := os.Getenv("GATEWAY_URL"); v != "" {
|
|
cfg.GatewayURL = v
|
|
}
|
|
if v := os.Getenv("AI_CORE_URL"); v != "" {
|
|
cfg.AICoreURL = v
|
|
}
|
|
if v := os.Getenv("INTERNAL_SERVICE_TOKEN"); v != "" {
|
|
cfg.InternalToken = v
|
|
}
|
|
if v := os.Getenv("QQ_BOT_PORT"); v != "" {
|
|
cfg.QQBotPort = v
|
|
}
|
|
if v := os.Getenv("TELEGRAM_BOT_TOKEN"); v != "" {
|
|
cfg.TelegramToken = v
|
|
}
|
|
if v := os.Getenv("TELEGRAM_WEBHOOK_URL"); v != "" {
|
|
cfg.TelegramWebhookURL = v
|
|
}
|
|
// Silent observation defaults.
|
|
cfg.PlatformSilentEnabled = getEnvBool("PLATFORM_SILENT_ENABLED", true)
|
|
cfg.AdminNicknames = getEnvList("ADMIN_NICKNAMES", []string{"开拓者"})
|
|
cfg.AdminMentionKeywords = getEnvList("ADMIN_MENTION_KEYWORDS", []string{"昔涟", "Cyrene", "管理员"})
|
|
cfg.MessageSendIntervalMs = getEnvInt("MSG_SEND_INTERVAL_MS", 2000)
|
|
|
|
return cfg
|
|
}
|
|
|
|
func getEnvBool(key string, defaultVal bool) bool {
|
|
v := os.Getenv(key)
|
|
if v == "" {
|
|
return defaultVal
|
|
}
|
|
return v == "true" || v == "1" || v == "yes"
|
|
}
|
|
|
|
func getEnvInt(key string, defaultVal int) int {
|
|
v := os.Getenv(key)
|
|
if v == "" {
|
|
return defaultVal
|
|
}
|
|
n := 0
|
|
for _, c := range v {
|
|
if c >= '0' && c <= '9' {
|
|
n = n*10 + int(c-'0')
|
|
} else {
|
|
return defaultVal
|
|
}
|
|
}
|
|
return n
|
|
}
|
|
|
|
func getEnvList(key string, defaultVal []string) []string {
|
|
v := os.Getenv(key)
|
|
if v == "" {
|
|
return defaultVal
|
|
}
|
|
parts := strings.Split(v, ",")
|
|
result := make([]string, 0, len(parts))
|
|
for _, p := range parts {
|
|
p = strings.TrimSpace(p)
|
|
if p != "" {
|
|
result = append(result, p)
|
|
}
|
|
}
|
|
if len(result) == 0 {
|
|
return defaultVal
|
|
}
|
|
return result
|
|
}
|