Implement secubox-ai-gateway package with intelligent AI request routing based on data sensitivity classification for GDPR/ANSSI compliance. Features: - 3-tier data classification: LOCAL_ONLY, SANITIZED, CLOUD_DIRECT - Provider hierarchy: LocalAI > Mistral (EU) > Claude > GPT > Gemini > xAI - PII sanitizer: IPv4/IPv6, MAC, credentials, private keys scrubbing - OpenAI-compatible API proxy on port 4050 - aigatewayctl CLI: status, classify, sanitize, provider, audit commands - RPCD backend with 11 ubus methods for LuCI integration - ANSSI CSPN audit logging in JSONL format Classification patterns detect: - IP addresses, MAC addresses, private keys - Credentials (password, secret, token, api_key) - System paths, security tool references - WireGuard configuration data All cloud providers are opt-in. Default LOCAL_ONLY ensures data sovereignty - sensitive data never leaves the device. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
47 lines
1.3 KiB
Bash
47 lines
1.3 KiB
Bash
#!/bin/sh
|
|
# SecuBox AI Gateway - LocalAI Provider Adapter
|
|
# On-device inference via LocalAI (OpenAI-compatible API)
|
|
|
|
CONFIG="ai-gateway"
|
|
|
|
provider_request() {
|
|
local request_json="$1"
|
|
|
|
local endpoint=$(uci -q get ${CONFIG}.localai.endpoint || echo "http://127.0.0.1:8081")
|
|
local model=$(uci -q get ${CONFIG}.localai.model || echo "tinyllama-1.1b-chat-v1.0.Q4_K_M")
|
|
|
|
# Override model in request if specified
|
|
request_json=$(echo "$request_json" | sed "s/\"model\":[^,}]*/\"model\":\"$model\"/")
|
|
|
|
# Send to LocalAI
|
|
local response=$(echo "$request_json" | wget -q -O - \
|
|
--post-data=- \
|
|
--header="Content-Type: application/json" \
|
|
"${endpoint}/v1/chat/completions" 2>/dev/null)
|
|
|
|
if [ -z "$response" ]; then
|
|
printf '{"error":{"message":"LocalAI not available","type":"provider_error","code":"localai_unavailable"}}'
|
|
return 1
|
|
fi
|
|
|
|
echo "$response"
|
|
}
|
|
|
|
provider_test() {
|
|
local endpoint=$(uci -q get ${CONFIG}.localai.endpoint || echo "http://127.0.0.1:8081")
|
|
|
|
echo "Testing LocalAI at $endpoint..."
|
|
|
|
if wget -q -O /dev/null --timeout=5 "${endpoint}/readyz" 2>/dev/null; then
|
|
echo "Status: AVAILABLE"
|
|
|
|
# Get models
|
|
local models=$(wget -q -O - "${endpoint}/v1/models" 2>/dev/null)
|
|
echo "Models: $(echo "$models" | jsonfilter -e '@.data[*].id' 2>/dev/null | tr '\n' ', ')"
|
|
return 0
|
|
else
|
|
echo "Status: UNAVAILABLE"
|
|
return 1
|
|
fi
|
|
}
|