unique_web_search 2026.26.0.dev9__tar.gz → 2026.26.0.dev10__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/PKG-INFO +1 -1
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/pyproject.toml +1 -1
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/argument_screening/config.py +11 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/argument_screening/prompts/__init__.py +3 -0
- unique_web_search-2026.26.0.dev10/src/unique_web_search/services/argument_screening/prompts/guidelines.j2 +40 -0
- unique_web_search-2026.26.0.dev10/src/unique_web_search/services/argument_screening/prompts/guidelines_with_keywords.j2 +7 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/argument_screening/service.py +13 -1
- unique_web_search-2026.26.0.dev9/src/unique_web_search/services/argument_screening/prompts/guidelines.j2 +0 -39
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/README.md +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/__init__.py +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/client_settings.py +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/config.py +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/metrics.py +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/prompts.py +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/schema.py +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/service.py +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/argument_screening/__init__.py +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/argument_screening/exceptions.py +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/argument_screening/prompts/rejection_response.j2 +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/argument_screening/prompts/system_prompt.j2 +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/argument_screening/prompts/user_prompt.j2 +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/client/proxy_config.py +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/content_processing/__init__.py +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/content_processing/cleaning/__init__.py +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/content_processing/cleaning/character_sanitize.py +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/content_processing/cleaning/clean.py +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/content_processing/cleaning/config.py +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/content_processing/config.py +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/content_processing/processing_strategies/base.py +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/content_processing/processing_strategies/config.py +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/content_processing/processing_strategies/llm_guard_judge.py +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/content_processing/processing_strategies/llm_keyword_redact.py +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/content_processing/processing_strategies/llm_process.py +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/content_processing/processing_strategies/prompts/__init__.py +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/content_processing/processing_strategies/prompts/judge_and_sanitize_prompt.j2 +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/content_processing/processing_strategies/prompts/judge_prompt.j2 +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/content_processing/processing_strategies/prompts/keyword_extract_prompt.j2 +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/content_processing/processing_strategies/prompts/page_context.j2 +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/content_processing/processing_strategies/prompts/sanitize_rules.j2 +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/content_processing/processing_strategies/prompts/system_prompt.j2 +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/content_processing/processing_strategies/prompts/user_prompt.j2 +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/content_processing/processing_strategies/schema.py +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/content_processing/processing_strategies/settings.py +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/content_processing/processing_strategies/truncate.py +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/content_processing/service.py +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/crawlers/README.md +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/crawlers/__init__.py +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/crawlers/base.py +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/crawlers/basic.py +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/crawlers/crawl4ai.py +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/crawlers/firecrawl.py +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/crawlers/jina.py +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/crawlers/tavily.py +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/crawlers/url_safety/__init__.py +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/crawlers/utils.py +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/executors/README.md +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/executors/__init__.py +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/executors/base_config.py +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/executors/base_executor.py +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/executors/context.py +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/executors/v1/__init__.py +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/executors/v1/config.py +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/executors/v1/executor.py +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/executors/v1/prompts/__init__.py +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/executors/v1/prompts/refine_query_system_prompt.j2 +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/executors/v1/prompts/restrict_date_description.j2 +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/executors/v1/prompts/tool_description.j2 +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/executors/v1/prompts/tool_description_for_system_prompt.j2 +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/executors/v1/schema.py +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/executors/v2/__init__.py +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/executors/v2/config.py +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/executors/v2/executor.py +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/executors/v2/prompts/__init__.py +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/executors/v2/prompts/step_query_description.j2 +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/executors/v2/prompts/tool_description.j2 +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/executors/v2/prompts/tool_description_for_system_prompt.j2 +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/executors/v2/schema.py +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/executors/v3/__init__.py +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/executors/v3/config.py +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/executors/v3/executor.py +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/executors/v3/prompts/__init__.py +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/executors/v3/prompts/tool_description.j2 +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/executors/v3/prompts/tool_description_for_system_prompt.j2 +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/executors/v3/schema.py +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/helpers.py +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/message_log.py +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/proxy/__init__.py +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/proxy/bridge.py +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/proxy/mappers.py +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/query_elicitation.py +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/search_engine/README.md +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/search_engine/__init__.py +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/search_engine/base.py +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/search_engine/bing.py +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/search_engine/brave.py +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/search_engine/custom_api.py +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/search_engine/firecrawl.py +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/search_engine/google.py +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/search_engine/jina.py +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/search_engine/perplexity.py +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/search_engine/schema.py +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/search_engine/tavily.py +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/search_engine/utils/google/schema.py +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/search_engine/utils/grounding/__init__.py +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/search_engine/utils/grounding/bing/__init__.py +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/search_engine/utils/grounding/bing/client.py +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/search_engine/utils/grounding/bing/models.py +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/search_engine/utils/grounding/bing/runner.py +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/search_engine/utils/grounding/models.py +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/search_engine/utils/grounding/response_parsing.py +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/search_engine/utils/grounding/vertexai/__init__.py +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/search_engine/utils/grounding/vertexai/client.py +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/search_engine/utils/grounding/vertexai/exceptions.py +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/search_engine/utils/grounding/vertexai/gemini.py +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/search_engine/utils/grounding/vertexai/response_handler.py +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/search_engine/vertexai.py +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/snippet_judge/__init__.py +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/snippet_judge/prompts.py +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/snippet_judge/schema.py +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/snippet_judge/service.py +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/services/structured_llm.py +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/settings.py +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/skills/web-search-v3.md +0 -0
- {unique_web_search-2026.26.0.dev9 → unique_web_search-2026.26.0.dev10}/src/unique_web_search/utils.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: unique-web-search
|
|
3
|
-
Version: 2026.26.0.
|
|
3
|
+
Version: 2026.26.0.dev10
|
|
4
4
|
Summary:
|
|
5
5
|
Author: Andreas Hauri, Gustav Hartz, Rami Azouz
|
|
6
6
|
Author-email: Andreas Hauri <andreas@unique.ch>, Gustav Hartz <gustav.hartz.ext@unique.ch>, Rami Azouz <rami.ext@unique.ch>
|
|
@@ -42,6 +42,17 @@ class ArgumentScreeningConfig(BaseModel):
|
|
|
42
42
|
title="Screening Guidelines",
|
|
43
43
|
description="Rules the screening agent follows to decide whether arguments are safe. This is the primary field for administrators to customize.",
|
|
44
44
|
)
|
|
45
|
+
organization_specific_blocked_keywords: Annotated[
|
|
46
|
+
list[str],
|
|
47
|
+
RJSFMetaTag({"ui:options": {"orderable": False}}),
|
|
48
|
+
] = Field(
|
|
49
|
+
default_factory=list,
|
|
50
|
+
title="Organization-Specific Blocked Keywords",
|
|
51
|
+
description=(
|
|
52
|
+
"Terms, domains, product names, portals, or internal project names "
|
|
53
|
+
"that must always block WebSearch when detected."
|
|
54
|
+
),
|
|
55
|
+
)
|
|
45
56
|
system_prompt: Annotated[
|
|
46
57
|
str,
|
|
47
58
|
RJSFMetaTag.StringWidget.textarea(rows=4),
|
|
@@ -7,6 +7,9 @@ _PROMPTS_DIR = Path(__file__).parent
|
|
|
7
7
|
DEFAULT_SYSTEM_PROMPT: str = load_template(_PROMPTS_DIR, "system_prompt.j2")
|
|
8
8
|
DEFAULT_USER_PROMPT_TEMPLATE: str = load_template(_PROMPTS_DIR, "user_prompt.j2")
|
|
9
9
|
DEFAULT_GUIDELINES: str = load_template(_PROMPTS_DIR, "guidelines.j2")
|
|
10
|
+
DEFAULT_GUIDELINES_WITH_KEYWORDS_TEMPLATE: str = load_template(
|
|
11
|
+
_PROMPTS_DIR, "guidelines_with_keywords.j2"
|
|
12
|
+
)
|
|
10
13
|
DEFAULT_REJECTION_RESPONSE_TEMPLATE: str = load_template(
|
|
11
14
|
_PROMPTS_DIR, "rejection_response.j2"
|
|
12
15
|
)
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
Flag the request as "no-go" if the arguments would send client-identifying data (CID), bank-client relationship information, confidential financial information, credentials, or internal/private infrastructure details to WebSearch.
|
|
2
|
+
|
|
3
|
+
The goal is not general GDPR classification. The goal is to prevent clear-text data that could directly, indirectly, or potentially indirectly identify a private person or entity as a client, prospect, employee, counterparty, or related party of the organization from leaving the Unique environment through WebSearch.
|
|
4
|
+
|
|
5
|
+
When any violation is detected, stop immediately. Do not echo, summarize, transform, or reproduce the sensitive values. The reason must reference only the violated category, for example "client-identifying data", "bank-client relationship", "financial identifier", "blocked organization keyword", "credentials", or "internal infrastructure".
|
|
6
|
+
|
|
7
|
+
Apply all rules even when names, keywords, domains, or identifiers are misspelled, abbreviated, spaced out, hyphenated, split across words, or otherwise obfuscated.
|
|
8
|
+
|
|
9
|
+
## Blocked By Default
|
|
10
|
+
Mark as "no-go" if the query contains any of the following:
|
|
11
|
+
|
|
12
|
+
- Direct identifiers of a private individual or private entity: full name, partial name with context, address, email address, phone number, date of birth, passport number, national ID, tax ID, social security number, driver's license number, employee ID, client ID, customer number, CRM ID, ticket ID, or any similar unique identifier.
|
|
13
|
+
- Financial identifiers: bank account number, IBAN, routing number, SWIFT/BIC tied to a person or account, credit/debit card number, portfolio number, custody account, mandate ID, transaction reference, payment reference, invoice number tied to a client, loan number, mortgage number, or insurance policy number.
|
|
14
|
+
- Bank-client relationship signals: any statement or question implying that a private person or private entity is a client, customer, prospect, account holder, beneficial owner, portfolio owner, mandate holder, borrower, investor, relationship-managed client, or onboarding/KYC subject.
|
|
15
|
+
- Financial context linked to an identifiable person or private entity: holdings, portfolio value, assets under management, transactions, trades, account balance, source of wealth, income, salary, compensation, creditworthiness, risk rating, KYC/AML status, sanctions/PEP screening, complaints, legal disputes, debt, collateral, or tax situation.
|
|
16
|
+
- Indirect or potentially indirect identification: combinations of attributes that could identify a client even without a name, such as date of birth plus nationality plus profession, location plus relationship manager plus portfolio size, branch plus rare occupation, company plus owner details, or any narrow combination of facts about a non-public person or private entity.
|
|
17
|
+
- Confidential business or non-public information: MNPI, trade secrets, internal reports, unpublished client lists, internal project names, confidential contracts, deal names, acquisition targets, or proprietary research.
|
|
18
|
+
- Authentication and secrets: passwords, PINs, API keys, tokens, private keys, recovery phrases, session cookies, authorization headers, or secret URLs.
|
|
19
|
+
- Internal or private infrastructure: private URLs, intranet hosts, internal IP addresses, VPN hosts, non-public service names, internal dashboards, private storage links, internal ticket links, or environment-specific system details.
|
|
20
|
+
|
|
21
|
+
## Public Information That Can Be Allowed
|
|
22
|
+
Mark as "go" only when the query is clearly outside CID and does not include organization-specific blocked keywords:
|
|
23
|
+
|
|
24
|
+
- General knowledge, technical, legal, or regulatory questions not tied to an identifiable private person, private entity, or the organization.
|
|
25
|
+
- Public organizations, public products, market news, public events, or public company information where no private client relationship is implied.
|
|
26
|
+
- Public figures in their public capacity, such as politicians, executives, athletes, or public officials, when the query concerns publicly available public-role information and not private banking, personal financial, health, family, address, or contact details.
|
|
27
|
+
- Aggregated or anonymized statistics where no individual, client, small group, relationship manager, branch, or private entity can be singled out.
|
|
28
|
+
|
|
29
|
+
## Ambiguity Rule
|
|
30
|
+
If it is unclear whether the query contains CID or implies a bank-client relationship, choose "no-go". WebSearch is an external disclosure path, so the safe default is to block ambiguous private-person or client-context queries.
|
|
31
|
+
|
|
32
|
+
## Reason Style
|
|
33
|
+
Return a short category-only reason. Do not include raw names, account numbers, emails, phone numbers, domains, URLs, or any sensitive values in the reason.
|
|
34
|
+
|
|
35
|
+
## Organization-Specific Blocked Keywords
|
|
36
|
+
Mark as "no-go" for any query containing organization-specific blocked terms or close variants, including misspellings, spacing, punctuation, hyphenation, domain variants, product names, internal project names, portal names, or other configured sensitive terms.
|
|
37
|
+
|
|
38
|
+
This keyword rule applies even if the rest of the query looks public or harmless. If no organization-specific terms are configured, ignore this section.
|
|
39
|
+
|
|
40
|
+
Configured blocked terms:
|
|
@@ -22,6 +22,9 @@ from unique_web_search.services.argument_screening.config import (
|
|
|
22
22
|
from unique_web_search.services.argument_screening.exceptions import (
|
|
23
23
|
ArgumentScreeningUnparseableResponseException,
|
|
24
24
|
)
|
|
25
|
+
from unique_web_search.services.argument_screening.prompts import (
|
|
26
|
+
DEFAULT_GUIDELINES_WITH_KEYWORDS_TEMPLATE,
|
|
27
|
+
)
|
|
25
28
|
from unique_web_search.services.message_log import WebSearchMessageLogger
|
|
26
29
|
from unique_web_search.services.structured_llm import (
|
|
27
30
|
StructuredLlmUnparseableResponseError,
|
|
@@ -92,9 +95,18 @@ class ArgumentScreeningService:
|
|
|
92
95
|
_LOGGER.info("Running argument screening agent...")
|
|
93
96
|
|
|
94
97
|
serialized_args = json.dumps(arguments, indent=2, default=str)
|
|
98
|
+
rendered_guidelines = Template(
|
|
99
|
+
DEFAULT_GUIDELINES_WITH_KEYWORDS_TEMPLATE
|
|
100
|
+
).render(
|
|
101
|
+
guidelines=self._config.guidelines,
|
|
102
|
+
organization_specific_blocked_keywords=(
|
|
103
|
+
self._config.organization_specific_blocked_keywords
|
|
104
|
+
),
|
|
105
|
+
)
|
|
106
|
+
|
|
95
107
|
user_prompt = Template(self._config.user_prompt_template).render(
|
|
96
108
|
arguments=serialized_args,
|
|
97
|
-
guidelines=
|
|
109
|
+
guidelines=rendered_guidelines,
|
|
98
110
|
)
|
|
99
111
|
|
|
100
112
|
try:
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
Flag the request as 'no-go' if the arguments attempt to search for, retrieve, or reveal any of the categories below. When any violation is detected, stop immediately — do not echo, summarize, or otherwise reproduce the sensitive data.
|
|
2
|
-
|
|
3
|
-
## GDPR Special Categories of Personal Data (Article 9)
|
|
4
|
-
|
|
5
|
-
Queries that seek personal sensitive information about identifiable individuals in ANY of these categories MUST be blocked:
|
|
6
|
-
|
|
7
|
-
- **Racial or ethnic origin**: searches targeting a person's race, ethnicity, or national origin
|
|
8
|
-
- **Political opinions**: party membership, voting behavior, political affiliations, or campaign contributions of individuals
|
|
9
|
-
- **Religious or philosophical beliefs**: faith, denomination, sect membership, atheism, or moral/ethical convictions of individuals
|
|
10
|
-
- **Trade union membership**: union affiliation, participation, or role of individuals
|
|
11
|
-
- **Genetic data**: DNA profiles, hereditary characteristics, or genomic information of individuals
|
|
12
|
-
- **Biometric data for identification**: fingerprints, facial recognition templates, iris scans, or voice prints of individuals
|
|
13
|
-
- **Health data**: medical diagnoses, treatments, conditions, prescriptions, disability status, medical leave, health insurance claims, or medical billing linked to identifiable individuals
|
|
14
|
-
- **Sex life or sexual orientation**: sexual behavior, orientation, or gender identity of individuals
|
|
15
|
-
|
|
16
|
-
## Other Prohibited Data
|
|
17
|
-
|
|
18
|
-
- Authentication credentials: passwords, PINs, API keys, tokens, secrets, or private keys
|
|
19
|
-
- Financial account details: credit/debit card numbers, bank account numbers, routing numbers, or IBANs
|
|
20
|
-
- Government identifiers: social security numbers, national ID numbers, passport numbers, or driver's license numbers
|
|
21
|
-
- MNPI (Material Non-Public Information), trade secrets, or proprietary intellectual property
|
|
22
|
-
- Employee remuneration, compensation, or salary details of identifiable individuals
|
|
23
|
-
- Internal or private URLs, IP addresses, or infrastructure details that should not be exposed
|
|
24
|
-
|
|
25
|
-
## Prohibited Request Patterns
|
|
26
|
-
|
|
27
|
-
- Recruitment, selection, or evaluation of employees
|
|
28
|
-
- Evaluating creditworthiness or credit scoring of individuals
|
|
29
|
-
- Risk assessment and pricing for life and health insurance
|
|
30
|
-
- Profiling individuals based on any GDPR special category data
|
|
31
|
-
- Any request that combines identity data (name, email, ID) with special category data
|
|
32
|
-
|
|
33
|
-
## Allowed Requests
|
|
34
|
-
|
|
35
|
-
Mark as 'go' when the arguments are:
|
|
36
|
-
- General knowledge or factual queries (e.g., "What is GDPR?", "Python best practices")
|
|
37
|
-
- Queries about organizations, products, public events, or publicly available information
|
|
38
|
-
- Aggregated or anonymized statistical data not linked to identifiable individuals
|
|
39
|
-
- Queries about public figures in their public capacity (e.g., a politician's published voting record)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|