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.
Files changed (126) hide show
  1. {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/PKG-INFO +3 -3
  2. {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/pyproject.toml +3 -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
  4. {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
  5. {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
  6. {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/README.md +0 -0
  7. {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/__init__.py +0 -0
  8. {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/client_settings.py +0 -0
  9. {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/config.py +0 -0
  10. {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/invocation_stats.py +0 -0
  11. {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/metrics.py +0 -0
  12. {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/prompts.py +0 -0
  13. {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/schema.py +0 -0
  14. {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/service.py +0 -0
  15. {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/_registry.py +0 -0
  16. {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
  17. {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
  18. {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
  19. {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
  20. {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
  21. {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
  22. {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
  23. {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
  24. {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
  25. {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
  26. {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
  27. {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
  28. {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
  29. {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
  30. {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
  31. {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
  32. {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
  33. {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
  34. {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
  35. {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
  36. {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
  37. {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
  38. {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
  39. {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
  40. {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
  41. {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
  42. {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
  43. {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
  44. {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
  45. {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
  46. {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
  47. {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
  48. {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
  49. {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
  50. {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/crawlers/README.md +0 -0
  51. {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/crawlers/__init__.py +0 -0
  52. {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/crawlers/base.py +0 -0
  53. {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/crawlers/basic.py +0 -0
  54. {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/crawlers/firecrawl.py +0 -0
  55. {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/crawlers/jina.py +0 -0
  56. {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/crawlers/registry.py +0 -0
  57. {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/crawlers/tavily.py +0 -0
  58. {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
  59. {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/crawlers/utils.py +0 -0
  60. {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/executors/README.md +0 -0
  61. {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/executors/__init__.py +0 -0
  62. {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
  63. {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
  64. {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/executors/context.py +0 -0
  65. {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/executors/modes.py +0 -0
  66. {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
  67. {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
  68. {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
  69. {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
  70. {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
  71. {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
  72. {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
  73. {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
  74. {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
  75. {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
  76. {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
  77. {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
  78. {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
  79. {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
  80. {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
  81. {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
  82. {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
  83. {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
  84. {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
  85. {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
  86. {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
  87. {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
  88. {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
  89. {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
  90. {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
  91. {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
  92. {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/helpers.py +0 -0
  93. {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/message_log.py +0 -0
  94. {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/proxy/__init__.py +0 -0
  95. {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/proxy/bridge.py +0 -0
  96. {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/proxy/mappers.py +0 -0
  97. {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/query_elicitation.py +0 -0
  98. {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
  99. {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
  100. {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
  101. {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
  102. {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
  103. {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
  104. {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
  105. {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
  106. {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
  107. {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
  108. {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
  109. {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
  110. {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
  111. {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
  112. {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
  113. {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
  114. {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
  115. {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
  116. {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
  117. {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
  118. {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
  119. {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
  120. {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
  121. {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
  122. {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
  123. {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/services/structured_llm.py +0 -0
  124. {unique_web_search-2026.44.0.dev2 → unique_web_search-2026.44.0.dev3}/src/unique_web_search/settings.py +0 -0
  125. {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
  126. {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.dev2
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.dev4,<2026.44.0rc0
29
- Requires-Dist: unique-search-proxy-sdk>=2026.44.0.dev2,<2026.44.0rc0
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.dev2"
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.dev4,<2026.44.0rc0",
35
- "unique-search-proxy-sdk>=2026.44.0.dev2,<2026.44.0rc0",
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`, `generation_instructions`, `enable_entreprise_search`, `enable_redirect_resolution`, `requires_scraping`.
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
- """Extract a fenced JSON block from the response and validate it directly.
49
+ """Validate a ``GroundingSearchResults``-shaped JSON response directly.
50
50
 
51
- Expects the response to contain a ``GroundingSearchResults``-shaped
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 no JSON code fence is found in the response.
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 not json_match:
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
- json_match.group(1)
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 await self._postprocess_results(results)
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