Repository navigation
Expand file tree
/
Copy pathenvironment.rb
More file actions
166 lines (127 loc) · 4.24 KB
/
Copy pathenvironment.rb
File metadata and controls
166 lines (127 loc) · 4.24 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
require "dotenv"
require_relative "lib/ai/provider_config"
require_relative "lib/config/admin_notification_config"
require_relative "lib/config/harassment_config"
require_relative "lib/config/moderation_config"
Dotenv.load
module Environment
REQUIRED_VARIABLES = %w[
DISCORD_BOT_TOKEN
].freeze
DEFAULT_OPENAI_MODERATION_MODEL = "omni-moderation-latest".freeze
DEFAULT_OPENAI_REWRITE_MODEL = "gpt-4.1-mini".freeze
DEFAULT_GOOGLE_AI_MODEL = "gemini-2.5-flash".freeze
DEFAULT_TELEMETRY_HASH_SALT = "development-telemetry-salt".freeze
DEFAULT_PERSONALITY = "objective".freeze
DEFAULT_LOG_FORMAT = "json".freeze
def self.validate!
required = REQUIRED_VARIABLES + [ai_api_key_variable]
missing = required.select { |name| missing?(ENV.fetch(name, nil)) }
return if missing.empty?
raise "Missing required environment variables: #{missing.join(", ")}"
end
def self.openai_api_key
ENV.fetch("OPENAI_API_KEY", nil)
end
def self.discord_bot_token
ENV.fetch("DISCORD_BOT_TOKEN", nil)
end
def self.redis_url
ENV.fetch("REDIS_URL", nil)
end
def self.database_url
ENV.fetch("DATABASE_URL", nil)
end
def self.openai_moderation_model
ENV.fetch("OPENAI_MODERATION_MODEL", DEFAULT_OPENAI_MODERATION_MODEL)
end
def self.openai_rewrite_model
ENV.fetch("OPENAI_REWRITE_MODEL", DEFAULT_OPENAI_REWRITE_MODEL)
end
def self.google_ai_api_key
ENV.fetch("GOOGLE_AI_API_KEY", nil)
end
def self.google_ai_model
ENV.fetch("GOOGLE_AI_MODEL", DEFAULT_GOOGLE_AI_MODEL)
end
def self.karma_automod_threshold
moderation_config.karma_automod_threshold
end
def self.telemetry_hash_salt
ENV.fetch("TELEMETRY_HASH_SALT", DEFAULT_TELEMETRY_HASH_SALT)
end
def self.telemetry_enabled?
ENV.fetch("TELEMETRY_ENABLED", "false").casecmp("true").zero?
end
def self.enabled_plugins
ENV.fetch("PLUGINS", "").split(",").map(&:strip).reject(&:empty?).uniq
end
def self.plugin_requires
ENV.fetch("PLUGIN_REQUIRES", "").split(",").map(&:strip).reject(&:empty?)
end
def self.personality
ENV.fetch("PERSONALITY", DEFAULT_PERSONALITY).downcase
end
def self.karma_automod_action
moderation_config.karma_automod_action
end
def self.karma_timeout_seconds
moderation_config.karma_timeout_seconds
end
def self.log_invite_url?
ENV.fetch("LOG_INVITE_URL", "false").casecmp("true").zero?
end
def self.log_format
candidate = ENV.fetch("LOG_FORMAT", DEFAULT_LOG_FORMAT).downcase
%w[json plain].include?(candidate) ? candidate : DEFAULT_LOG_FORMAT
end
def self.moderation_shadow_mode?
moderation_config.shadow_mode?
end
def self.moderation_shadow_rewrite?
moderation_config.shadow_rewrite?
end
def self.moderation_review_store_content?
moderation_config.review_store_content?
end
def self.harassment_classifier_model
harassment_config.classifier_model
end
def self.harassment_classifier_cache_ttl_seconds
harassment_config.classifier_cache_ttl_seconds
end
def self.harassment_classifier_rate_limit_per_minute
harassment_config.classifier_rate_limit_per_minute
end
def self.admin_notification_channel_id = admin_notification_config.channel_id
def self.admin_notification_ambiguous_min_score
admin_notification_config.ambiguous_min_score
end
def self.admin_notification_ambiguous_max_score
admin_notification_config.ambiguous_max_score
end
def self.admin_notification_shadow_mode? = admin_notification_config.shadow_mode?
def self.admin_notification_rate_limit_per_minute
admin_notification_config.rate_limit_per_minute
end
def self.missing?(value)
value.nil? || value.strip.empty?
end
def self.ai_api_key_variable
ai_provider_config.api_key_variable
end
def self.ai_provider_config
OpenModBot::AI::ProviderConfig.new(enabled_plugins:)
end
def self.admin_notification_config
OpenModBot::Config::AdminNotificationConfig.new
end
def self.harassment_config
OpenModBot::Config::HarassmentConfig.new(ai_provider_config:)
end
def self.moderation_config
OpenModBot::Config::ModerationConfig.new
end
private_class_method :missing?, :ai_api_key_variable, :ai_provider_config,
:admin_notification_config, :harassment_config, :moderation_config
end