unique_web_search 2026.34.0.dev7__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.
Files changed (126) hide show
  1. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/PKG-INFO +3 -3
  2. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/pyproject.toml +3 -3
  3. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/search_engine/base.py +1 -2
  4. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/search_engine/bing.py +3 -36
  5. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/search_engine/utils/grounding/bing/client.py +3 -3
  6. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/search_engine/utils/grounding/bing/runner.py +6 -23
  7. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/settings.py +0 -1
  8. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/README.md +0 -0
  9. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/__init__.py +0 -0
  10. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/client_settings.py +0 -0
  11. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/config.py +0 -0
  12. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/invocation_stats.py +0 -0
  13. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/metrics.py +0 -0
  14. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/prompts.py +0 -0
  15. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/schema.py +0 -0
  16. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/service.py +0 -0
  17. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/_registry.py +0 -0
  18. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/argument_screening/__init__.py +0 -0
  19. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/argument_screening/config.py +0 -0
  20. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/argument_screening/exceptions.py +0 -0
  21. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/argument_screening/prompts/__init__.py +0 -0
  22. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/argument_screening/prompts/guidelines.j2 +0 -0
  23. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/argument_screening/prompts/guidelines_with_keywords.j2 +0 -0
  24. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/argument_screening/prompts/rejection_response.j2 +0 -0
  25. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/argument_screening/prompts/system_prompt.j2 +0 -0
  26. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/argument_screening/prompts/user_prompt.j2 +0 -0
  27. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/argument_screening/service.py +0 -0
  28. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/client/proxy_config.py +0 -0
  29. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/content_processing/__init__.py +0 -0
  30. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/content_processing/cleaning/__init__.py +0 -0
  31. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/content_processing/cleaning/character_sanitize.py +0 -0
  32. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/content_processing/cleaning/clean.py +0 -0
  33. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/content_processing/cleaning/config.py +0 -0
  34. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/content_processing/config.py +0 -0
  35. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/content_processing/processing_strategies/base.py +0 -0
  36. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/content_processing/processing_strategies/config.py +0 -0
  37. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/content_processing/processing_strategies/llm_guard_judge.py +0 -0
  38. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/content_processing/processing_strategies/llm_keyword_redact.py +0 -0
  39. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/content_processing/processing_strategies/llm_process.py +0 -0
  40. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/content_processing/processing_strategies/prompts/__init__.py +0 -0
  41. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/content_processing/processing_strategies/prompts/judge_and_sanitize_prompt.j2 +0 -0
  42. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/content_processing/processing_strategies/prompts/judge_prompt.j2 +0 -0
  43. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/content_processing/processing_strategies/prompts/keyword_extract_prompt.j2 +0 -0
  44. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/content_processing/processing_strategies/prompts/page_context.j2 +0 -0
  45. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/content_processing/processing_strategies/prompts/sanitize_rules.j2 +0 -0
  46. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/content_processing/processing_strategies/prompts/system_prompt.j2 +0 -0
  47. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/content_processing/processing_strategies/prompts/user_prompt.j2 +0 -0
  48. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/content_processing/processing_strategies/schema.py +0 -0
  49. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/content_processing/processing_strategies/settings.py +0 -0
  50. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/content_processing/processing_strategies/truncate.py +0 -0
  51. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/content_processing/service.py +0 -0
  52. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/crawlers/README.md +0 -0
  53. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/crawlers/__init__.py +0 -0
  54. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/crawlers/base.py +0 -0
  55. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/crawlers/basic.py +0 -0
  56. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/crawlers/firecrawl.py +0 -0
  57. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/crawlers/jina.py +0 -0
  58. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/crawlers/registry.py +0 -0
  59. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/crawlers/tavily.py +0 -0
  60. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/crawlers/url_safety/__init__.py +0 -0
  61. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/crawlers/utils.py +0 -0
  62. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/executors/README.md +0 -0
  63. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/executors/__init__.py +0 -0
  64. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/executors/base_config.py +0 -0
  65. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/executors/base_executor.py +0 -0
  66. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/executors/context.py +0 -0
  67. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/executors/modes.py +0 -0
  68. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/executors/v1/__init__.py +0 -0
  69. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/executors/v1/config.py +0 -0
  70. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/executors/v1/executor.py +0 -0
  71. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/executors/v1/prompts/__init__.py +0 -0
  72. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/executors/v1/prompts/refine_query_system_prompt.j2 +0 -0
  73. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/executors/v1/prompts/tool_description.j2 +0 -0
  74. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/executors/v1/prompts/tool_description_for_system_prompt.j2 +0 -0
  75. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/executors/v1/schema.py +0 -0
  76. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/executors/v1/strategy.py +0 -0
  77. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/executors/v2/__init__.py +0 -0
  78. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/executors/v2/config.py +0 -0
  79. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/executors/v2/executor.py +0 -0
  80. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/executors/v2/prompts/__init__.py +0 -0
  81. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/executors/v2/prompts/step_query_description.j2 +0 -0
  82. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/executors/v2/prompts/tool_description.j2 +0 -0
  83. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/executors/v2/prompts/tool_description_for_system_prompt.j2 +0 -0
  84. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/executors/v2/schema.py +0 -0
  85. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/executors/v2/strategy.py +0 -0
  86. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/executors/v3/__init__.py +0 -0
  87. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/executors/v3/config.py +0 -0
  88. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/executors/v3/executor.py +0 -0
  89. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/executors/v3/prompts/__init__.py +0 -0
  90. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/executors/v3/prompts/tool_description.j2 +0 -0
  91. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/executors/v3/prompts/tool_description_for_system_prompt.j2 +0 -0
  92. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/executors/v3/schema.py +0 -0
  93. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/executors/v3/strategy.py +0 -0
  94. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/helpers.py +0 -0
  95. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/message_log.py +0 -0
  96. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/proxy/__init__.py +0 -0
  97. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/proxy/bridge.py +0 -0
  98. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/proxy/mappers.py +0 -0
  99. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/query_elicitation.py +0 -0
  100. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/search_engine/README.md +0 -0
  101. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/search_engine/__init__.py +0 -0
  102. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/search_engine/brave.py +0 -0
  103. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/search_engine/custom_api.py +0 -0
  104. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/search_engine/google.py +0 -0
  105. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/search_engine/perplexity.py +0 -0
  106. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/search_engine/registry.py +0 -0
  107. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/search_engine/schema.py +0 -0
  108. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/search_engine/utils/google/schema.py +0 -0
  109. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/search_engine/utils/grounding/__init__.py +0 -0
  110. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/search_engine/utils/grounding/bing/__init__.py +0 -0
  111. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/search_engine/utils/grounding/bing/models.py +0 -0
  112. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/search_engine/utils/grounding/models.py +0 -0
  113. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/search_engine/utils/grounding/response_parsing.py +0 -0
  114. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/search_engine/utils/grounding/vertexai/__init__.py +0 -0
  115. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/search_engine/utils/grounding/vertexai/client.py +0 -0
  116. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/search_engine/utils/grounding/vertexai/exceptions.py +0 -0
  117. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/search_engine/utils/grounding/vertexai/gemini.py +0 -0
  118. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/search_engine/utils/grounding/vertexai/response_handler.py +0 -0
  119. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/search_engine/vertexai.py +0 -0
  120. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/snippet_judge/__init__.py +0 -0
  121. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/snippet_judge/prompts.py +0 -0
  122. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/snippet_judge/schema.py +0 -0
  123. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/snippet_judge/service.py +0 -0
  124. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/services/structured_llm.py +0 -0
  125. {unique_web_search-2026.34.0.dev7 → unique_web_search-2026.34.0.dev8}/src/unique_web_search/skills/web-search-v3.md +0 -0
  126. {unique_web_search-2026.34.0.dev7 → 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.dev7
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>
@@ -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.dev4,<2026.34.0rc0
29
- Requires-Dist: unique-search-proxy-sdk>=2026.34.0.dev4,<2026.34.0rc0
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.dev7"
3
+ version = "2026.34.0.dev8"
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.34.0.dev4,<2026.34.0rc0",
35
- "unique-search-proxy-sdk>=2026.34.0.dev4,<2026.34.0rc0",
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 (e.g. an unset
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 Annotated, Any, override
2
+ from typing import override
3
3
 
4
- from pydantic import BeforeValidator, Field
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, self.config.endpoint or "")
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, endpoint: str
52
+ credentials: AsyncTokenCredential,
53
53
  ) -> AIProjectClient:
54
- endpoint = env_settings.azure_ai_project_endpoint or 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 or configuration"
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
- Prefers an explicit / env-preconfigured name; otherwise derives a stable
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 hashed (or preconfigured) agent name.
200
- If the agent is missing and the name was auto-derived, creates the agent once
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 allow_create or not _is_missing_agent_error(
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