0ee11a065b
The smarthost routes all mail through one rspamd: inbound that survived the edge gets the AI (LiteLLM Haiku) pass and is tagged for Stalwart's Junk filing; outbound from the lab and pods is DKIM-signed. - add rspamd (milter via ClusterIP only), ClamAV and a 3-node sentinel Valkey - tag inbound (`X-Spam`, `X-Spam-Status`, `X-Spamd-Result`), reject only viruses, tempfail when ClamAV fails - score inbound against the hop before the edge relays (`external_relay`) - DKIM-sign and skip GPT only for the smarthost's mynetworks sources - elect the highest-offset Valkey on full restart; RDB, 384mb `volatile-ttl` - read a hashed controller password (`password_hash`) Requires `password_hash` in kv `mail/default/rspamd-controller`. Reviewed-on: #542 Co-authored-by: unkin-agent <unkin-agent@unkin.net> Co-committed-by: unkin-agent <unkin-agent@unkin.net>
23 lines
672 B
Plaintext
23 lines
672 B
Plaintext
enabled = true;
|
|
type = "openai";
|
|
url = "http://litellm.litellm.svc.cluster.local:4000/v1/chat/completions";
|
|
api_key = "{= env.LITELLM_API_KEY =}";
|
|
model = "claude-haiku-4-5";
|
|
model_parameters = {
|
|
"claude-haiku-4-5" = {
|
|
max_tokens = 400,
|
|
temperature = 0.0,
|
|
}
|
|
};
|
|
timeout = 10s;
|
|
# Inbound only (settings.conf disables it outbound); only uncertain scores (2 <= score < 12).
|
|
condition = <<EOD
|
|
return function(task)
|
|
local res = task:get_metric_result()
|
|
if not res then return false, 'no result' end
|
|
if res.passthrough then return false, 'passthrough' end
|
|
if res.score < 2 or res.score >= 12 then return false, 'score not uncertain' end
|
|
return true
|
|
end
|
|
EOD
|