Quelltext des aktuellen Standes
<?php
declare(strict_types=1);
use OpenNIT\AI\PrivacyFilter;
return static function (): void {
test('auto: Cloud-Anbieter werden anonymisiert', function () {
assertTrue(PrivacyFilter::resolveMode(['provider' => 'openai']), 'openai → an');
assertTrue(PrivacyFilter::resolveMode(['provider' => 'anthropic']), 'anthropic → an');
assertTrue(PrivacyFilter::resolveMode(['provider' => 'deepseek']), 'deepseek → an');
});
test('auto: nur ein nachweislich hausinterner Endpunkt schaltet ab', function () {
$local = static fn(string $url): array => ['provider' => 'openai_compatible', 'custom_base_url' => $url];
assertFalse(PrivacyFilter::resolveMode($local('http://localhost:11434/v1')), 'localhost');
assertFalse(PrivacyFilter::resolveMode($local('http://ollama.internal/v1')), '.internal');
assertFalse(PrivacyFilter::resolveMode($local('http://ki.firma.local/v1')), '.local');
assertFalse(PrivacyFilter::resolveMode($local('http://192.168.1.10:11434/v1')), 'privates Netz');
assertFalse(PrivacyFilter::resolveMode($local('http://10.0.0.5/v1')), 'privates Netz (10er)');
});
test('auto: OpenAI-kompatibel ohne bekannte Adresse bleibt anonymisiert', function () {
// Ohne verwertbare Adresse ist der Endpunkt unbekannt – im Zweifel schützen.
assertTrue(PrivacyFilter::resolveMode(['provider' => 'openai_compatible']), 'keine URL');
assertTrue(PrivacyFilter::resolveMode([
'provider' => 'openai_compatible', 'custom_base_url' => '',
]), 'leere URL');
});
test('auto: OpenAI-kompatibler Cloud-Dienst zählt nicht als hausintern', function () {
assertTrue(PrivacyFilter::resolveMode([
'provider' => 'openai_compatible', 'custom_base_url' => 'https://openrouter.ai/api/v1',
]), 'OpenRouter');
assertTrue(PrivacyFilter::resolveMode([
'provider' => 'openai_compatible', 'custom_base_url' => 'https://api.groq.com/openai/v1',
]), 'Groq');
assertTrue(PrivacyFilter::resolveMode([
'provider' => 'openai_compatible', 'custom_base_url' => 'http://8.8.8.8/v1',
]), 'öffentliche IP');
});
test('explizites on/off überschreibt', function () {
assertFalse(PrivacyFilter::resolveMode(['provider' => 'openai', 'privacy_mode' => 'off']), 'off');
assertTrue(PrivacyFilter::resolveMode(['provider' => 'openai_compatible', 'privacy_mode' => 'on']), 'on');
});
test('Default ohne Provider = an (sicher)', function () {
assertTrue(PrivacyFilter::resolveMode([]), 'leer → an');
});
test('forConfig liefert passend konfigurierten Service', function () {
$on = PrivacyFilter::forConfig(['provider' => 'openai']);
$off = PrivacyFilter::forConfig([
'provider' => 'openai_compatible', 'custom_base_url' => 'http://localhost:11434/v1',
]);
assertTrue($on->isEnabled(), 'cloud aktiviert');
assertFalse($off->isEnabled(), 'hausintern deaktiviert');
});
test('describe begründet den hausinternen Fall gesondert', function () {
$inHouse = PrivacyFilter::describe([
'provider' => 'openai_compatible', 'custom_base_url' => 'http://localhost:11434/v1',
]);
assertTrue(str_contains($inHouse, 'im Haus'), 'Begründung nennt den Grund');
assertTrue(str_contains(PrivacyFilter::describe(['provider' => 'openai']), 'anonymisiert'), 'Cloud');
});
};