secubox-openwrt/package/secubox/secubox-ai-gateway/files/usr/lib/ai-gateway/providers/mistral.sh
CyberMind-FR f3cea01792 feat(ai-gateway): Add Data Classifier (Sovereignty Engine) for ANSSI CSPN
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>
2026-02-28 17:55:22 +01:00

63 lines
1.7 KiB
Bash

#!/bin/sh
# SecuBox AI Gateway - Mistral Provider Adapter
# EU Sovereign AI Provider (GDPR Compliant)
CONFIG="ai-gateway"
provider_request() {
local request_json="$1"
local endpoint=$(uci -q get ${CONFIG}.mistral.endpoint || echo "https://api.mistral.ai/v1")
local api_key=$(uci -q get ${CONFIG}.mistral.api_key)
local model=$(uci -q get ${CONFIG}.mistral.model || echo "mistral-small-latest")
if [ -z "$api_key" ]; then
printf '{"error":{"message":"Mistral API key not configured","type":"auth_error","code":"missing_api_key"}}'
return 1
fi
# Override model in request
request_json=$(echo "$request_json" | sed "s/\"model\":[^,}]*/\"model\":\"$model\"/")
# Send to Mistral API
local response=$(echo "$request_json" | wget -q -O - \
--post-data=- \
--header="Content-Type: application/json" \
--header="Authorization: Bearer $api_key" \
"${endpoint}/chat/completions" 2>/dev/null)
if [ -z "$response" ]; then
printf '{"error":{"message":"Mistral API request failed","type":"provider_error","code":"mistral_error"}}'
return 1
fi
echo "$response"
}
provider_test() {
local endpoint=$(uci -q get ${CONFIG}.mistral.endpoint || echo "https://api.mistral.ai/v1")
local api_key=$(uci -q get ${CONFIG}.mistral.api_key)
echo "Testing Mistral AI (EU)..."
if [ -z "$api_key" ]; then
echo "Status: NOT CONFIGURED (no API key)"
return 1
fi
# Test with models endpoint
local response=$(wget -q -O - \
--header="Authorization: Bearer $api_key" \
"${endpoint}/models" 2>/dev/null)
if [ -n "$response" ] && ! echo "$response" | grep -q '"error"'; then
echo "Status: AVAILABLE"
echo "Region: EU (GDPR compliant)"
return 0
else
echo "Status: ERROR"
echo "$response" | head -1
return 1
fi
}