unique_web_search 2026.44.0.dev2__tar.gz → 2026.44.0.dev3__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.44.0.dev2 → unique_web_search-2026.44.0.dev3}/PKG-INFO +3 -3
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/pyproject.toml +3 -3
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/search_engine/README.md +8 -1
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/search_engine/utils/grounding/response_parsing.py +5 -7
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/search_engine/vertexai.py +2 -43
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/README.md +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/__init__.py +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/client_settings.py +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/config.py +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/invocation_stats.py +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/metrics.py +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/prompts.py +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/schema.py +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/service.py +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/_registry.py +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/argument_screening/__init__.py +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/argument_screening/config.py +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/argument_screening/exceptions.py +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/argument_screening/prompts/__init__.py +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/argument_screening/prompts/guidelines.j2 +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/argument_screening/prompts/guidelines_with_keywords.j2 +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/argument_screening/prompts/rejection_response.j2 +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/argument_screening/prompts/system_prompt.j2 +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/argument_screening/prompts/user_prompt.j2 +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/argument_screening/service.py +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/client/http_client.py +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/content_processing/__init__.py +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/content_processing/cleaning/__init__.py +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/content_processing/cleaning/character_sanitize.py +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/content_processing/cleaning/clean.py +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/content_processing/cleaning/config.py +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/content_processing/config.py +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/content_processing/processing_strategies/base.py +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/content_processing/processing_strategies/config.py +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/content_processing/processing_strategies/llm_guard_judge.py +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/content_processing/processing_strategies/llm_keyword_redact.py +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/content_processing/processing_strategies/llm_process.py +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/content_processing/processing_strategies/prompts/__init__.py +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/content_processing/processing_strategies/prompts/judge_and_sanitize_prompt.j2 +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/content_processing/processing_strategies/prompts/judge_prompt.j2 +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/content_processing/processing_strategies/prompts/keyword_extract_prompt.j2 +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/content_processing/processing_strategies/prompts/page_context.j2 +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/content_processing/processing_strategies/prompts/sanitize_rules.j2 +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/content_processing/processing_strategies/prompts/system_prompt.j2 +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/content_processing/processing_strategies/prompts/user_prompt.j2 +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/content_processing/processing_strategies/schema.py +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/content_processing/processing_strategies/settings.py +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/content_processing/processing_strategies/truncate.py +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/content_processing/service.py +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/crawlers/README.md +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/crawlers/__init__.py +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/crawlers/base.py +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/crawlers/basic.py +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/crawlers/firecrawl.py +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/crawlers/jina.py +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/crawlers/registry.py +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/crawlers/tavily.py +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/crawlers/url_safety/__init__.py +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/crawlers/utils.py +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/executors/README.md +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/executors/__init__.py +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/executors/base_config.py +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/executors/base_executor.py +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/executors/context.py +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/executors/modes.py +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/executors/v1/__init__.py +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/executors/v1/config.py +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/executors/v1/executor.py +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/executors/v1/prompts/__init__.py +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/executors/v1/prompts/refine_query_system_prompt.j2 +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/executors/v1/prompts/tool_description.j2 +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/executors/v1/prompts/tool_description_for_system_prompt.j2 +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/executors/v1/schema.py +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/executors/v1/strategy.py +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/executors/v2/__init__.py +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/executors/v2/config.py +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/executors/v2/executor.py +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/executors/v2/prompts/__init__.py +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/executors/v2/prompts/step_query_description.j2 +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/executors/v2/prompts/tool_description.j2 +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/executors/v2/prompts/tool_description_for_system_prompt.j2 +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/executors/v2/schema.py +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/executors/v2/strategy.py +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/executors/v3/__init__.py +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/executors/v3/config.py +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/executors/v3/executor.py +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/executors/v3/prompts/__init__.py +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/executors/v3/prompts/tool_description.j2 +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/executors/v3/prompts/tool_description_for_system_prompt.j2 +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/executors/v3/schema.py +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/executors/v3/strategy.py +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/helpers.py +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/message_log.py +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/proxy/__init__.py +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/proxy/bridge.py +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/proxy/mappers.py +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/query_elicitation.py +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/search_engine/__init__.py +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/search_engine/base.py +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/search_engine/bing.py +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/search_engine/brave.py +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/search_engine/custom_api.py +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/search_engine/google.py +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/search_engine/perplexity.py +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/search_engine/registry.py +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/search_engine/schema.py +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/search_engine/utils/google/schema.py +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/search_engine/utils/grounding/__init__.py +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/search_engine/utils/grounding/bing/__init__.py +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/search_engine/utils/grounding/bing/client.py +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/search_engine/utils/grounding/bing/models.py +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/search_engine/utils/grounding/bing/runner.py +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/search_engine/utils/grounding/models.py +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/search_engine/utils/grounding/vertexai/__init__.py +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/search_engine/utils/grounding/vertexai/client.py +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/search_engine/utils/grounding/vertexai/exceptions.py +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/search_engine/utils/grounding/vertexai/gemini.py +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/search_engine/utils/grounding/vertexai/response_handler.py +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/snippet_judge/__init__.py +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/snippet_judge/prompts.py +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/snippet_judge/schema.py +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/snippet_judge/service.py +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/structured_llm.py +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/settings.py +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/skills/web-search-v3.md +0 -0
- {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/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.44.0.
|
|
3
|
+
Version: 2026.44.0.dev3
|
|
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>
|
|
@@ -25,8 +25,8 @@ Requires-Dist: rapidfuzz>=3.0.0,<4
|
|
|
25
25
|
Requires-Dist: httpx>=0.28.1
|
|
26
26
|
Requires-Dist: certifi>=2025.11.12
|
|
27
27
|
Requires-Dist: jinja2>=3.1.6
|
|
28
|
-
Requires-Dist: unique-search-proxy-core>=2026.44.0.
|
|
29
|
-
Requires-Dist: unique-search-proxy-sdk>=2026.44.0.
|
|
28
|
+
Requires-Dist: unique-search-proxy-core>=2026.44.0.dev5,<2026.44.0rc0
|
|
29
|
+
Requires-Dist: unique-search-proxy-sdk>=2026.44.0.dev3,<2026.44.0rc0
|
|
30
30
|
Requires-Dist: openai>=1.105.0,<3
|
|
31
31
|
Requires-Python: >=3.12, <4.0
|
|
32
32
|
Description-Content-Type: text/markdown
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "unique_web_search"
|
|
3
|
-
version = "2026.44.0.
|
|
3
|
+
version = "2026.44.0.dev3"
|
|
4
4
|
description = ""
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
requires-python = ">=3.12,<4.0"
|
|
@@ -31,8 +31,8 @@ dependencies = [
|
|
|
31
31
|
"httpx>=0.28.1",
|
|
32
32
|
"certifi>=2025.11.12",
|
|
33
33
|
"jinja2>=3.1.6",
|
|
34
|
-
"unique-search-proxy-core>=2026.44.0.
|
|
35
|
-
"unique-search-proxy-sdk>=2026.44.0.
|
|
34
|
+
"unique-search-proxy-core>=2026.44.0.dev5,<2026.44.0rc0",
|
|
35
|
+
"unique-search-proxy-sdk>=2026.44.0.dev3,<2026.44.0rc0",
|
|
36
36
|
"openai>=1.105.0,<3",
|
|
37
37
|
]
|
|
38
38
|
|
|
@@ -212,7 +212,14 @@ BING_AGENT_DEFAULT_MARKET=fr-FR
|
|
|
212
212
|
|
|
213
213
|
**Provider:** Gemini + Google Search grounding on Vertex AI · Config extends `VertexAIAgentConfig`.
|
|
214
214
|
|
|
215
|
-
Requires GCP ADC / workload identity. Fields include `vertexai_model_name`,
|
|
215
|
+
Requires GCP ADC / workload identity. Fields include `vertexai_model_name`,
|
|
216
|
+
`generation_instructions`, `enable_entreprise_search`,
|
|
217
|
+
`enable_redirect_resolution`, and `requires_scraping`.
|
|
218
|
+
|
|
219
|
+
In proxy mode, Vertex grounding redirect URLs are resolved by Search Proxy,
|
|
220
|
+
where every redirect hop passes URL-safety and shared egress controls. Legacy
|
|
221
|
+
mode returns redirect URLs unchanged instead of resolving them directly from
|
|
222
|
+
assistants-core.
|
|
216
223
|
|
|
217
224
|
```bash
|
|
218
225
|
VERTEXAI_AGENT_DEFAULT_VERTEX_AI_MODEL_NAME=gemini-3-flash-preview
|
|
@@ -46,21 +46,19 @@ async def convert_response_to_search_results(
|
|
|
46
46
|
|
|
47
47
|
|
|
48
48
|
class JsonConversionStrategy(ResponseParser):
|
|
49
|
-
"""
|
|
49
|
+
"""Validate a ``GroundingSearchResults``-shaped JSON response directly.
|
|
50
50
|
|
|
51
|
-
|
|
52
|
-
JSON object wrapped in a ```json ... ``` code fence.
|
|
51
|
+
Accepts JSON wrapped in a ```json ... ``` code fence or a bare JSON object.
|
|
53
52
|
|
|
54
53
|
Raises:
|
|
55
|
-
ValueError: If
|
|
54
|
+
ValueError: If the response does not contain valid results JSON.
|
|
56
55
|
"""
|
|
57
56
|
|
|
58
57
|
async def __call__(self, response: str) -> list[WebSearchResult]:
|
|
59
58
|
json_match = _JSON_PATTERN.search(response)
|
|
60
|
-
if
|
|
61
|
-
raise ValueError("No JSON found in the response")
|
|
59
|
+
payload = json_match.group(1) if json_match else response
|
|
62
60
|
return GroundingSearchResults.model_validate_json(
|
|
63
|
-
|
|
61
|
+
payload
|
|
64
62
|
).to_web_search_results()
|
|
65
63
|
|
|
66
64
|
|
|
@@ -1,9 +1,5 @@
|
|
|
1
|
-
import asyncio
|
|
2
|
-
import logging
|
|
3
1
|
from typing import override
|
|
4
2
|
|
|
5
|
-
from httpx import AsyncClient as HttpxAsyncClient
|
|
6
|
-
from httpx import HTTPError
|
|
7
3
|
from pydantic import Field
|
|
8
4
|
from unique_search_proxy_core.agent_engines.base import AgentEngineType
|
|
9
5
|
from unique_search_proxy_core.agent_engines.vertexai.schema import VertexAIAgentConfig
|
|
@@ -19,10 +15,7 @@ from unique_web_search.services.proxy.bridge import (
|
|
|
19
15
|
)
|
|
20
16
|
from unique_web_search.services.search_engine.base import SearchEngine, SearchEngineMode
|
|
21
17
|
from unique_web_search.services.search_engine.registry import register_search_engine
|
|
22
|
-
from unique_web_search.services.search_engine.schema import
|
|
23
|
-
WebSearchResult,
|
|
24
|
-
WebSearchResults,
|
|
25
|
-
)
|
|
18
|
+
from unique_web_search.services.search_engine.schema import WebSearchResult
|
|
26
19
|
from unique_web_search.services.search_engine.utils.grounding import (
|
|
27
20
|
JsonConversionStrategy,
|
|
28
21
|
LLMParserStrategy,
|
|
@@ -35,8 +28,6 @@ from unique_web_search.services.search_engine.utils.grounding.vertexai import (
|
|
|
35
28
|
get_vertex_grounding_with_structured_output_config,
|
|
36
29
|
)
|
|
37
30
|
|
|
38
|
-
_LOGGER = logging.getLogger(__name__)
|
|
39
|
-
|
|
40
31
|
|
|
41
32
|
class VertexAIConfig(VertexAIAgentConfig):
|
|
42
33
|
language_model: LMI = get_LMI_default_field(
|
|
@@ -49,11 +40,6 @@ class VertexAIConfig(VertexAIAgentConfig):
|
|
|
49
40
|
description="Whether the search engine requires scraping.",
|
|
50
41
|
)
|
|
51
42
|
|
|
52
|
-
enable_redirect_resolution: bool = Field(
|
|
53
|
-
default=True,
|
|
54
|
-
description="Whether to enable redirect resolution.",
|
|
55
|
-
)
|
|
56
|
-
|
|
57
43
|
|
|
58
44
|
@register_search_engine(
|
|
59
45
|
name="vertexai",
|
|
@@ -87,16 +73,6 @@ class VertexAI(SearchEngine[VertexAIConfig]):
|
|
|
87
73
|
def requires_scraping(self) -> bool:
|
|
88
74
|
return self.config.requires_scraping
|
|
89
75
|
|
|
90
|
-
@override
|
|
91
|
-
async def _postprocess_results(
|
|
92
|
-
self,
|
|
93
|
-
results: list[WebSearchResult],
|
|
94
|
-
) -> list[WebSearchResult]:
|
|
95
|
-
if self.config.enable_redirect_resolution:
|
|
96
|
-
resolved = await resolve_all(WebSearchResults(results=results))
|
|
97
|
-
return resolved.results
|
|
98
|
-
return results
|
|
99
|
-
|
|
100
76
|
@override
|
|
101
77
|
async def _legacy_search(
|
|
102
78
|
self,
|
|
@@ -127,21 +103,4 @@ class VertexAI(SearchEngine[VertexAIConfig]):
|
|
|
127
103
|
answer_with_citations, self.response_parsers
|
|
128
104
|
)
|
|
129
105
|
|
|
130
|
-
return
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
async def resolve_url(client: HttpxAsyncClient, web_search_result: WebSearchResult):
|
|
134
|
-
try:
|
|
135
|
-
resp = await client.head(web_search_result.url, follow_redirects=True)
|
|
136
|
-
web_search_result.url = str(resp.url)
|
|
137
|
-
return web_search_result
|
|
138
|
-
except HTTPError as e:
|
|
139
|
-
_LOGGER.error(f"Unable to redirect URL: {web_search_result.url}: {e}")
|
|
140
|
-
return web_search_result
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
async def resolve_all(web_search_results: WebSearchResults):
|
|
144
|
-
async with HttpxAsyncClient(follow_redirects=True, timeout=10) as client:
|
|
145
|
-
tasks = [resolve_url(client, result) for result in web_search_results.results]
|
|
146
|
-
results = await asyncio.gather(*tasks)
|
|
147
|
-
return WebSearchResults(results=results)
|
|
106
|
+
return results
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/utils.py
RENAMED
|
File without changes
|