Завдання
📝 **Питання:** **Напишіть функцію** \`safe_search(query, filter)\`, яка захищає мультитенантний RAG від класу витоку №1 — відсутній фільтр \`tenant_id\`.
правила:
- Якщо \`filter\` не є dict → викликати \`ValueError("filter must be a dict")\`.
- Якщо \`tenant_id\` відсутній АБО пустий/хибний → викликати \`ValueError("БЕЗПЕКА: фільтр tenant_id є обов’язковим і не порожнім")\`.
- Інакше поверніть \`f"OK | {query!r} з областю дії клієнта {filter['tenant_id']!r}"\`.
Потім запустіть його з чотирма формами запиту (дві реальні, дві небезпечні):
\`\`\`
ОК | "політика відшкодування" в межах орендаря "acme"
ЗАБЛОКУВАНО | 'таблиця зарплат' | БЕЗПЕКА: фільтр tenant_id є обов’язковим і не порожнім
ОК | «історія замовлень» охоплено орендарем «globex»
ЗАБЛОКУВАНО | 'Ключі API' | БЕЗПЕКА: фільтр tenant_id є обов’язковим і не порожнім
\`\`\`
Випадок із порожнім рядком є прихованим — \`"tenant_id" у фільтрі\` пройде, але \`filter.get("tenant_id")\` повертає помилку. **Завжди перевіряйте правдивість, а не лише присутність ключа.** Неправильно налаштований зовнішній інтерфейс, де за замовчуванням \`tenant_id\` має значення \`""\`, спричинив витік між клієнтами в реальному світі.
📋 Виберіть правильну відповідь.
💡 **Підказка:** Перечитайте наведену вище теорію, якщо не впевнені.