unique_web_search 2026.34.0.dev6__tar.gz → 2026.34.0.dev8__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.34.0.dev6 → unique_web_search-2026.34.0.dev8}/PKG-INFO +4 -4
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/pyproject.toml +4 -4
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/search_engine/base.py +1 -2
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/search_engine/bing.py +3 -36
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/search_engine/utils/grounding/bing/client.py +3 -3
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/search_engine/utils/grounding/bing/runner.py +6 -23
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/settings.py +0 -1
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/README.md +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/__init__.py +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/client_settings.py +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/config.py +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/invocation_stats.py +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/metrics.py +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/prompts.py +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/schema.py +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/service.py +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/_registry.py +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/argument_screening/__init__.py +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/argument_screening/config.py +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/argument_screening/exceptions.py +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/argument_screening/prompts/__init__.py +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/argument_screening/prompts/guidelines.j2 +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/argument_screening/prompts/guidelines_with_keywords.j2 +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/argument_screening/prompts/rejection_response.j2 +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/argument_screening/prompts/system_prompt.j2 +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/argument_screening/prompts/user_prompt.j2 +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/argument_screening/service.py +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/client/proxy_config.py +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/content_processing/__init__.py +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/content_processing/cleaning/__init__.py +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/content_processing/cleaning/character_sanitize.py +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/content_processing/cleaning/clean.py +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/content_processing/cleaning/config.py +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/content_processing/config.py +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/content_processing/processing_strategies/base.py +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/content_processing/processing_strategies/config.py +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/content_processing/processing_strategies/llm_guard_judge.py +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/content_processing/processing_strategies/llm_keyword_redact.py +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/content_processing/processing_strategies/llm_process.py +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/content_processing/processing_strategies/prompts/__init__.py +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/content_processing/processing_strategies/prompts/judge_and_sanitize_prompt.j2 +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/content_processing/processing_strategies/prompts/judge_prompt.j2 +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/content_processing/processing_strategies/prompts/keyword_extract_prompt.j2 +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/content_processing/processing_strategies/prompts/page_context.j2 +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/content_processing/processing_strategies/prompts/sanitize_rules.j2 +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/content_processing/processing_strategies/prompts/system_prompt.j2 +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/content_processing/processing_strategies/prompts/user_prompt.j2 +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/content_processing/processing_strategies/schema.py +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/content_processing/processing_strategies/settings.py +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/content_processing/processing_strategies/truncate.py +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/content_processing/service.py +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/crawlers/README.md +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/crawlers/__init__.py +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/crawlers/base.py +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/crawlers/basic.py +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/crawlers/firecrawl.py +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/crawlers/jina.py +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/crawlers/registry.py +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/crawlers/tavily.py +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/crawlers/url_safety/__init__.py +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/crawlers/utils.py +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/executors/README.md +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/executors/__init__.py +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/executors/base_config.py +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/executors/base_executor.py +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/executors/context.py +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/executors/modes.py +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/executors/v1/__init__.py +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/executors/v1/config.py +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/executors/v1/executor.py +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/executors/v1/prompts/__init__.py +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/executors/v1/prompts/refine_query_system_prompt.j2 +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/executors/v1/prompts/tool_description.j2 +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/executors/v1/prompts/tool_description_for_system_prompt.j2 +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/executors/v1/schema.py +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/executors/v1/strategy.py +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/executors/v2/__init__.py +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/executors/v2/config.py +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/executors/v2/executor.py +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/executors/v2/prompts/__init__.py +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/executors/v2/prompts/step_query_description.j2 +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/executors/v2/prompts/tool_description.j2 +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/executors/v2/prompts/tool_description_for_system_prompt.j2 +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/executors/v2/schema.py +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/executors/v2/strategy.py +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/executors/v3/__init__.py +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/executors/v3/config.py +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/executors/v3/executor.py +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/executors/v3/prompts/__init__.py +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/executors/v3/prompts/tool_description.j2 +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/executors/v3/prompts/tool_description_for_system_prompt.j2 +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/executors/v3/schema.py +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/executors/v3/strategy.py +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/helpers.py +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/message_log.py +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/proxy/__init__.py +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/proxy/bridge.py +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/proxy/mappers.py +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/query_elicitation.py +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/search_engine/README.md +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/search_engine/__init__.py +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/search_engine/brave.py +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/search_engine/custom_api.py +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/search_engine/google.py +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/search_engine/perplexity.py +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/search_engine/registry.py +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/search_engine/schema.py +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/search_engine/utils/google/schema.py +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/search_engine/utils/grounding/__init__.py +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/search_engine/utils/grounding/bing/__init__.py +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/search_engine/utils/grounding/bing/models.py +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/search_engine/utils/grounding/models.py +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/search_engine/utils/grounding/response_parsing.py +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/search_engine/utils/grounding/vertexai/__init__.py +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/search_engine/utils/grounding/vertexai/client.py +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/search_engine/utils/grounding/vertexai/exceptions.py +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/search_engine/utils/grounding/vertexai/gemini.py +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/search_engine/utils/grounding/vertexai/response_handler.py +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/search_engine/vertexai.py +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/snippet_judge/__init__.py +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/snippet_judge/prompts.py +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/snippet_judge/schema.py +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/snippet_judge/service.py +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/structured_llm.py +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/skills/web-search-v3.md +0 -0
- {unique_web_search-2026.34.0.dev6 → unique_web_search-2026.34.0.dev8}/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.34.0.
|
|
3
|
+
Version: 2026.34.0.dev8
|
|
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>
|
|
@@ -16,7 +16,7 @@ Requires-Dist: tavily-python>=0.7.11,<1
|
|
|
16
16
|
Requires-Dist: unidecode>=1.4.0,<2
|
|
17
17
|
Requires-Dist: azure-ai-projects>=2.3,<3
|
|
18
18
|
Requires-Dist: azure-identity>=1.25.0,<2
|
|
19
|
-
Requires-Dist: unique-toolkit[monitoring]>=2026.34.0.
|
|
19
|
+
Requires-Dist: unique-toolkit[monitoring]>=2026.34.0.dev19,<2026.34.0rc0
|
|
20
20
|
Requires-Dist: azure-core>=1.36.0,<2
|
|
21
21
|
Requires-Dist: google-cloud-aiplatform>=1.128.0,<2
|
|
22
22
|
Requires-Dist: google-auth>=2.43.0,<3
|
|
@@ -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.34.0.
|
|
29
|
-
Requires-Dist: unique-search-proxy-sdk>=2026.34.0.
|
|
28
|
+
Requires-Dist: unique-search-proxy-core>=2026.34.0.dev5,<2026.34.0rc0
|
|
29
|
+
Requires-Dist: unique-search-proxy-sdk>=2026.34.0.dev5,<2026.34.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.34.0.
|
|
3
|
+
version = "2026.34.0.dev8"
|
|
4
4
|
description = ""
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
requires-python = ">=3.12,<4.0"
|
|
@@ -22,7 +22,7 @@ dependencies = [
|
|
|
22
22
|
"unidecode>=1.4.0,<2",
|
|
23
23
|
"azure-ai-projects>=2.3,<3",
|
|
24
24
|
"azure-identity>=1.25.0,<2",
|
|
25
|
-
"unique-toolkit[monitoring]>=2026.34.0.
|
|
25
|
+
"unique-toolkit[monitoring]>=2026.34.0.dev19,<2026.34.0rc0",
|
|
26
26
|
"azure-core>=1.36.0,<2",
|
|
27
27
|
"google-cloud-aiplatform>=1.128.0,<2",
|
|
28
28
|
"google-auth>=2.43.0,<3",
|
|
@@ -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.34.0.
|
|
35
|
-
"unique-search-proxy-sdk>=2026.34.0.
|
|
34
|
+
"unique-search-proxy-core>=2026.34.0.dev5,<2026.34.0rc0",
|
|
35
|
+
"unique-search-proxy-sdk>=2026.34.0.dev5,<2026.34.0rc0",
|
|
36
36
|
"openai>=1.105.0,<3",
|
|
37
37
|
]
|
|
38
38
|
|
|
@@ -182,8 +182,7 @@ class SearchEngine(ABC, Generic[SearchEngineConfig]):
|
|
|
182
182
|
if not hasattr(self.config, field_name):
|
|
183
183
|
continue
|
|
184
184
|
value = getattr(self.config, field_name)
|
|
185
|
-
# Empty values fall through to the SDK/server defaults
|
|
186
|
-
# ``agent_id`` triggers server-side auto-provisioning).
|
|
185
|
+
# Empty values fall through to the SDK/server defaults.
|
|
187
186
|
if value is None or value == "":
|
|
188
187
|
continue
|
|
189
188
|
invocation[field_name] = value
|
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
import asyncio
|
|
2
|
-
from typing import
|
|
2
|
+
from typing import override
|
|
3
3
|
|
|
4
|
-
from pydantic import
|
|
4
|
+
from pydantic import Field
|
|
5
5
|
from unique_search_proxy_core.agent_engines.base import AgentEngineType
|
|
6
6
|
from unique_search_proxy_core.agent_engines.bing.schema import BingAgentConfig
|
|
7
7
|
from unique_search_proxy_core.context import LOCAL_REQUEST_CONTEXT, RequestContext
|
|
8
8
|
from unique_search_proxy_core.param_policy.exposed_params import ExposedParams
|
|
9
9
|
from unique_toolkit._common.default_language_model import DEFAULT_LANGUAGE_MODEL
|
|
10
|
-
from unique_toolkit._common.pydantic.rjsf_tags import RJSFMetaTag
|
|
11
10
|
from unique_toolkit._common.validators import LMI, get_LMI_default_field
|
|
12
11
|
from unique_toolkit.language_model import LanguageModelService
|
|
13
12
|
|
|
@@ -29,40 +28,9 @@ from unique_web_search.services.search_engine.utils.grounding.bing import (
|
|
|
29
28
|
get_credentials,
|
|
30
29
|
get_project_client,
|
|
31
30
|
)
|
|
32
|
-
from unique_web_search.settings import env_settings
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
def _none_as_empty(value: Any) -> Any:
|
|
36
|
-
"""Accept the ``null`` written by previously stored configs."""
|
|
37
|
-
return "" if value is None else value
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
# Plain ``str`` instead of ``str | None`` so the config form renders a single
|
|
41
|
-
# text input; a union would render an RJSF branch selector ("… option 1/2").
|
|
42
|
-
_OptionalText = Annotated[str, BeforeValidator(_none_as_empty)]
|
|
43
31
|
|
|
44
32
|
|
|
45
33
|
class BingSearchConfig(BingAgentConfig):
|
|
46
|
-
agent_id: Annotated[ # pyright: ignore[reportIncompatibleVariableOverride]
|
|
47
|
-
_OptionalText,
|
|
48
|
-
RJSFMetaTag.StringWidget.textfield(
|
|
49
|
-
placeholder="Leave empty to use the auto-provisioned agent",
|
|
50
|
-
empty_value="",
|
|
51
|
-
),
|
|
52
|
-
] = Field(
|
|
53
|
-
default=env_settings.azure_ai_assistant_id or "",
|
|
54
|
-
description="The ID of the agent to use for the search. **This parameter is temporary and will be auto-provisioned in future versions.**",
|
|
55
|
-
)
|
|
56
|
-
endpoint: Annotated[
|
|
57
|
-
_OptionalText,
|
|
58
|
-
RJSFMetaTag.StringWidget.textfield(
|
|
59
|
-
placeholder="Leave empty to use the auto-provisioned resource",
|
|
60
|
-
empty_value="",
|
|
61
|
-
),
|
|
62
|
-
] = Field(
|
|
63
|
-
default=env_settings.azure_ai_project_endpoint or "",
|
|
64
|
-
description="The endpoint to use for the search. **This parameter is not required to be set. It's loaded automatically from auto-provisioned resource**",
|
|
65
|
-
)
|
|
66
34
|
language_model: LMI = get_LMI_default_field(
|
|
67
35
|
DEFAULT_LANGUAGE_MODEL,
|
|
68
36
|
description="The language model to use in as a fallback parser if the agent response is not a valid JSON.",
|
|
@@ -121,12 +89,11 @@ class BingSearch(SearchEngine[BingSearchConfig]):
|
|
|
121
89
|
params: ExposedParams | None,
|
|
122
90
|
) -> list[WebSearchResult]:
|
|
123
91
|
del params
|
|
124
|
-
agent_client = get_project_client(self.credentials
|
|
92
|
+
agent_client = get_project_client(self.credentials)
|
|
125
93
|
|
|
126
94
|
async with agent_client:
|
|
127
95
|
search_results = await create_and_process_run(
|
|
128
96
|
agent_client,
|
|
129
|
-
agent_id=self.config.agent_id or "",
|
|
130
97
|
query=query,
|
|
131
98
|
fetch_size=self.config.fetch_size,
|
|
132
99
|
response_parsers_strategies=self.response_parsers,
|
|
@@ -49,13 +49,13 @@ async def credentials_are_valid(credentials: AsyncTokenCredential) -> bool:
|
|
|
49
49
|
|
|
50
50
|
|
|
51
51
|
def get_project_client(
|
|
52
|
-
credentials: AsyncTokenCredential,
|
|
52
|
+
credentials: AsyncTokenCredential,
|
|
53
53
|
) -> AIProjectClient:
|
|
54
|
-
endpoint = env_settings.azure_ai_project_endpoint
|
|
54
|
+
endpoint = env_settings.azure_ai_project_endpoint
|
|
55
55
|
|
|
56
56
|
if not endpoint:
|
|
57
57
|
raise ValueError(
|
|
58
|
-
"Azure AI project endpoint is not set from environment variables
|
|
58
|
+
"Azure AI project endpoint is not set from environment variables"
|
|
59
59
|
)
|
|
60
60
|
|
|
61
61
|
if env_settings.use_unique_private_endpoint_transport:
|
|
@@ -69,16 +69,11 @@ def resolve_bing_agent_name(
|
|
|
69
69
|
model: str,
|
|
70
70
|
fetch_size: int,
|
|
71
71
|
instructions: str,
|
|
72
|
-
agent_name: str | None = None,
|
|
73
72
|
) -> str:
|
|
74
|
-
"""Return the agent name to use for Responses (no Foundry round-trip).
|
|
73
|
+
"""Return the hash-based agent name to use for Responses (no Foundry round-trip).
|
|
75
74
|
|
|
76
|
-
|
|
77
|
-
hash-based name from ``model`` + ``fetch_size`` + ``instructions``.
|
|
75
|
+
Derives a stable name from ``model`` + ``fetch_size`` + ``instructions``.
|
|
78
76
|
"""
|
|
79
|
-
resolved = agent_name or env_settings.azure_ai_assistant_id or None
|
|
80
|
-
if resolved:
|
|
81
|
-
return resolved
|
|
82
77
|
return _agent_name_for_config(
|
|
83
78
|
model=model, fetch_size=fetch_size, instructions=instructions
|
|
84
79
|
)
|
|
@@ -188,7 +183,6 @@ def _is_missing_agent_error(exc: BaseException, *, agent_name: str) -> bool:
|
|
|
188
183
|
|
|
189
184
|
async def create_and_process_run(
|
|
190
185
|
agent_client: AIProjectClient,
|
|
191
|
-
agent_id: str,
|
|
192
186
|
query: str,
|
|
193
187
|
fetch_size: int,
|
|
194
188
|
response_parsers_strategies: list[ResponseParser],
|
|
@@ -196,13 +190,11 @@ async def create_and_process_run(
|
|
|
196
190
|
) -> list[WebSearchResult]:
|
|
197
191
|
"""Execute a Bing-grounded agent run and return parsed search results.
|
|
198
192
|
|
|
199
|
-
Optimistically calls Responses with a
|
|
200
|
-
|
|
201
|
-
and retries. Preconfigured agent names are never auto-created.
|
|
193
|
+
Optimistically calls Responses with a hash-derived agent name. If the agent
|
|
194
|
+
is missing, creates it once and retries.
|
|
202
195
|
|
|
203
196
|
Args:
|
|
204
197
|
agent_client: Azure AI project client used to manage agents.
|
|
205
|
-
agent_id: Optional Foundry agent name; empty triggers hash-based naming.
|
|
206
198
|
query: The search query to send to the agent.
|
|
207
199
|
fetch_size: Maximum number of Bing results the agent should retrieve.
|
|
208
200
|
response_parsers_strategies: Ordered list of parsing strategies to try
|
|
@@ -215,14 +207,12 @@ async def create_and_process_run(
|
|
|
215
207
|
"""
|
|
216
208
|
instructions = f"{generation_instructions}\n{RESPONSE_RULE}"
|
|
217
209
|
model = env_settings.azure_ai_bing_agent_model
|
|
218
|
-
preconfigured = agent_id or env_settings.azure_ai_assistant_id or None
|
|
219
210
|
answer = await _run_responses_agent(
|
|
220
211
|
agent_client,
|
|
221
212
|
query=query,
|
|
222
213
|
model=model,
|
|
223
214
|
fetch_size=fetch_size,
|
|
224
215
|
instructions=instructions,
|
|
225
|
-
agent_name=preconfigured,
|
|
226
216
|
)
|
|
227
217
|
|
|
228
218
|
return await convert_response_to_search_results(answer, response_parsers_strategies)
|
|
@@ -235,23 +225,18 @@ async def _run_responses_agent(
|
|
|
235
225
|
model: str,
|
|
236
226
|
fetch_size: int,
|
|
237
227
|
instructions: str,
|
|
238
|
-
agent_name: str | None = None,
|
|
239
228
|
) -> str:
|
|
240
229
|
"""Invoke the agent via Responses API and return the full output text.
|
|
241
230
|
|
|
242
231
|
Instructions must already be baked into the agent version — Foundry returns
|
|
243
232
|
``invalid_payload`` if ``instructions`` is passed alongside ``agent_reference``.
|
|
233
|
+
Missing agents are auto-provisioned on first miss.
|
|
244
234
|
"""
|
|
245
|
-
# Treat empty string like unset so auto-provisioning still works.
|
|
246
|
-
# Env assistant id is also preconfigured (same as resolve_bing_agent_name).
|
|
247
|
-
preconfigured = agent_name or env_settings.azure_ai_assistant_id or None
|
|
248
235
|
resolved_name = resolve_bing_agent_name(
|
|
249
236
|
model=model,
|
|
250
237
|
fetch_size=fetch_size,
|
|
251
238
|
instructions=instructions,
|
|
252
|
-
agent_name=preconfigured,
|
|
253
239
|
)
|
|
254
|
-
allow_create = preconfigured is None
|
|
255
240
|
openai_client = get_openai_client(agent_client)
|
|
256
241
|
|
|
257
242
|
try:
|
|
@@ -261,9 +246,7 @@ async def _run_responses_agent(
|
|
|
261
246
|
query=query,
|
|
262
247
|
)
|
|
263
248
|
except Exception as exc:
|
|
264
|
-
if not
|
|
265
|
-
exc, agent_name=resolved_name
|
|
266
|
-
):
|
|
249
|
+
if not _is_missing_agent_error(exc, agent_name=resolved_name):
|
|
267
250
|
raise
|
|
268
251
|
_LOGGER.info(
|
|
269
252
|
"Responses failed for missing Bing agent %s; creating then retrying: %s",
|
|
@@ -108,7 +108,6 @@ class Base(BaseSettings):
|
|
|
108
108
|
|
|
109
109
|
# Azure AI Project settings
|
|
110
110
|
azure_ai_bing_agent_model: str = "gpt-4o-deployment"
|
|
111
|
-
azure_ai_assistant_id: str | None = None
|
|
112
111
|
azure_ai_project_endpoint: str | None = None
|
|
113
112
|
azure_ai_bing_resource_connection_string: str | None = None
|
|
114
113
|
|
|
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.34.0.dev6 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/utils.py
RENAMED
|
File without changes
|