unique-search-proxy 2026.44.0.dev5__tar.gz → 2026.44.0.dev6__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 (118) hide show
  1. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/PKG-INFO +2 -2
  2. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/pyproject.toml +2 -2
  3. unique_search_proxy-2026.44.0.dev6/unique_search_proxy_client/web/core/agent_engines/vertexai/redirects.py +30 -0
  4. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/core/agent_engines/vertexai/service.py +13 -3
  5. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/README.md +0 -0
  6. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/__init__.py +0 -0
  7. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/__init__.py +0 -0
  8. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/api/__init__.py +0 -0
  9. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/api/health.py +0 -0
  10. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/api/v1/__init__.py +0 -0
  11. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/api/v1/agent_search.py +0 -0
  12. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/api/v1/configuration.py +0 -0
  13. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/api/v1/context_headers.py +0 -0
  14. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/api/v1/crawl.py +0 -0
  15. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/api/v1/openapi_examples.py +0 -0
  16. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/api/v1/search.py +0 -0
  17. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/app.py +0 -0
  18. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/context.py +0 -0
  19. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/core/__init__.py +0 -0
  20. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/core/agent_engines/__init__.py +0 -0
  21. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/core/agent_engines/bing/cleanup.py +0 -0
  22. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/core/agent_engines/bing/client.py +0 -0
  23. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/core/agent_engines/bing/runner.py +0 -0
  24. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/core/agent_engines/bing/service.py +0 -0
  25. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/core/agent_engines/factory.py +0 -0
  26. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/core/agent_engines/service_base.py +0 -0
  27. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/core/agent_engines/structured_output.py +0 -0
  28. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/core/agent_engines/vertexai/client.py +0 -0
  29. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/core/agent_engines/vertexai/gemini.py +0 -0
  30. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/core/client/__init__.py +0 -0
  31. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/core/client/azure_transport.py +0 -0
  32. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/core/client/credentials.py +0 -0
  33. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/core/client/service.py +0 -0
  34. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/core/crawlers/__init__.py +0 -0
  35. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/core/crawlers/basic/__init__.py +0 -0
  36. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/core/crawlers/basic/processing/__init__.py +0 -0
  37. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/core/crawlers/basic/processing/errors.py +0 -0
  38. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/core/crawlers/basic/processing/html_markdown.py +0 -0
  39. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/core/crawlers/basic/processing/processors/__init__.py +0 -0
  40. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/core/crawlers/basic/processing/processors/html.py +0 -0
  41. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/core/crawlers/basic/processing/processors/pdf.py +0 -0
  42. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/core/crawlers/basic/processing/processors/plain_text.py +0 -0
  43. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/core/crawlers/basic/processing/registry.py +0 -0
  44. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/core/crawlers/basic/service.py +0 -0
  45. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/core/crawlers/basic/settings.py +0 -0
  46. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/core/crawlers/basic/user_agent.py +0 -0
  47. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/core/crawlers/factory.py +0 -0
  48. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/core/crawlers/firecrawl/polling.py +0 -0
  49. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/core/crawlers/firecrawl/request_body.py +0 -0
  50. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/core/crawlers/firecrawl/service.py +0 -0
  51. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/core/crawlers/jina/request_body.py +0 -0
  52. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/core/crawlers/jina/service.py +0 -0
  53. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/core/crawlers/pinned_egress.py +0 -0
  54. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/core/crawlers/tavily/request_body.py +0 -0
  55. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/core/crawlers/tavily/service.py +0 -0
  56. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/core/provider_response.py +0 -0
  57. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/core/providers.py +0 -0
  58. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/core/registry.py +0 -0
  59. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/core/search_engines/__init__.py +0 -0
  60. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/core/search_engines/brave/__init__.py +0 -0
  61. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/core/search_engines/brave/pagination.py +0 -0
  62. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/core/search_engines/brave/query_params.py +0 -0
  63. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/core/search_engines/brave/service.py +0 -0
  64. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/core/search_engines/custom_api/__init__.py +0 -0
  65. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/core/search_engines/custom_api/service.py +0 -0
  66. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/core/search_engines/descriptor.py +0 -0
  67. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/core/search_engines/factory.py +0 -0
  68. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/core/search_engines/google/__init__.py +0 -0
  69. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/core/search_engines/google/pagination.py +0 -0
  70. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/core/search_engines/google/query_params.py +0 -0
  71. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/core/search_engines/google/service.py +0 -0
  72. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/core/search_engines/pagination.py +0 -0
  73. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/core/search_engines/perplexity/__init__.py +0 -0
  74. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/core/search_engines/perplexity/request_body.py +0 -0
  75. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/core/search_engines/perplexity/service.py +0 -0
  76. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/core/search_engines/service_base.py +0 -0
  77. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/core/url_safety/__init__.py +0 -0
  78. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/core/url_safety/gate.py +0 -0
  79. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/error_handlers.py +0 -0
  80. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/helm/__init__.py +0 -0
  81. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/helm/generator/__init__.py +0 -0
  82. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/helm/generator/introspect.py +0 -0
  83. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/helm/generator/schema.py +0 -0
  84. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/helm/generator/template.py +0 -0
  85. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/helm/generator/templates/provider_values_yaml.j2 +0 -0
  86. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/helm/generator/values_yaml.py +0 -0
  87. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/helm/metadata.py +0 -0
  88. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/helm/registry.py +0 -0
  89. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/helm/url_safety_registration.py +0 -0
  90. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/logging_config.py +0 -0
  91. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/middleware/context.py +0 -0
  92. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/monitoring/__init__.py +0 -0
  93. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/monitoring/metrics.py +0 -0
  94. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/monitoring/setup.py +0 -0
  95. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/presets/__init__.py +0 -0
  96. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/presets/common.py +0 -0
  97. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/presets/crawl.py +0 -0
  98. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/presets/search.py +0 -0
  99. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/presets/types.py +0 -0
  100. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/settings/__init__.py +0 -0
  101. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/settings/app.py +0 -0
  102. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/settings/base.py +0 -0
  103. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/settings/client.py +0 -0
  104. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/settings/monitoring.py +0 -0
  105. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/settings/providers/__init__.py +0 -0
  106. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/settings/providers/base.py +0 -0
  107. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/settings/providers/bing_agent.py +0 -0
  108. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/settings/providers/brave.py +0 -0
  109. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/settings/providers/firecrawl.py +0 -0
  110. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/settings/providers/google.py +0 -0
  111. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/settings/providers/jina.py +0 -0
  112. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/settings/providers/perplexity.py +0 -0
  113. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/settings/providers/tavily.py +0 -0
  114. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/settings/providers/vertexai_agent.py +0 -0
  115. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/settings/secret_str.py +0 -0
  116. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/startup_report.py +0 -0
  117. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/utils/__init__.py +0 -0
  118. {unique_search_proxy-2026.44.0.dev5 → unique_search_proxy-2026.44.0.dev6}/unique_search_proxy_client/web/utils/url.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: unique-search-proxy
3
- Version: 2026.44.0.dev5
3
+ Version: 2026.44.0.dev6
4
4
  Summary: Web Search Proxy implementation
5
5
  Author: ThePhilAz
6
6
  Author-email: ThePhilAz <rami.azouz@philico.com>
@@ -21,7 +21,7 @@ Requires-Dist: google-genai>=1.73.0,<2
21
21
  Requires-Dist: google-auth>=2.43.0,<3
22
22
  Requires-Dist: jinja2>=3.1.6,<4
23
23
  Requires-Dist: unique-toolkit[monitoring]>=2026.44.0.dev9,<2026.44.0rc0
24
- Requires-Dist: unique-search-proxy-core>=2026.44.0.dev4,<2026.44.0rc0
24
+ Requires-Dist: unique-search-proxy-core>=2026.44.0.dev5,<2026.44.0rc0
25
25
  Requires-Dist: openai>=1.105.0,<3
26
26
  Requires-Python: >=3.12
27
27
  Description-Content-Type: text/markdown
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "unique-search-proxy"
3
- version = "2026.44.0.dev5"
3
+ version = "2026.44.0.dev6"
4
4
  description = "Web Search Proxy implementation"
5
5
  authors = [{ name = "ThePhilAz", email = "rami.azouz@philico.com" }]
6
6
  readme = "README.md"
@@ -23,7 +23,7 @@ dependencies = [
23
23
  "google-auth>=2.43.0,<3",
24
24
  "jinja2>=3.1.6,<4",
25
25
  "unique-toolkit[monitoring]>=2026.44.0.dev9,<2026.44.0rc0",
26
- "unique-search-proxy-core>=2026.44.0.dev4,<2026.44.0rc0",
26
+ "unique-search-proxy-core>=2026.44.0.dev5,<2026.44.0rc0",
27
27
  "openai>=1.105.0,<3",
28
28
  ]
29
29
 
@@ -0,0 +1,30 @@
1
+ from __future__ import annotations
2
+
3
+ from httpx import AsyncClient
4
+ from unique_search_proxy_core.agent_engines.output_schema import AgentSearchOutput
5
+ from unique_search_proxy_core.url_safety import UrlSafetyService
6
+
7
+
8
+ async def resolve_vertex_result_urls(
9
+ answer: str,
10
+ *,
11
+ http_client: AsyncClient,
12
+ ) -> str:
13
+ """Resolve structured Vertex result URLs through Search Proxy URL safety."""
14
+ try:
15
+ output = AgentSearchOutput.model_validate_json(answer)
16
+ except ValueError:
17
+ return answer
18
+
19
+ outcomes = await UrlSafetyService.validate_urls_individually(
20
+ [result.source_url for result in output.results],
21
+ redirect_http_client=http_client,
22
+ )
23
+ for result, outcome in zip(output.results, outcomes, strict=True):
24
+ if outcome.resolved is not None:
25
+ result.source_url = outcome.resolved.normalized_url
26
+
27
+ return output.model_dump_json()
28
+
29
+
30
+ __all__ = ["resolve_vertex_result_urls"]
@@ -4,6 +4,7 @@ import logging
4
4
  from collections.abc import AsyncIterator
5
5
  from typing import Any
6
6
 
7
+ from httpx import AsyncClient
7
8
  from unique_search_proxy_core.agent_engines.base import AgentEngineType
8
9
  from unique_search_proxy_core.agent_engines.resolve import (
9
10
  resolve_output_schema_for_engine,
@@ -30,6 +31,9 @@ from unique_search_proxy_client.web.core.agent_engines.vertexai.gemini import (
30
31
  serialize_vertex_response,
31
32
  stream_vertexai_response,
32
33
  )
34
+ from unique_search_proxy_client.web.core.agent_engines.vertexai.redirects import (
35
+ resolve_vertex_result_urls,
36
+ )
33
37
  from unique_search_proxy_client.web.core.provider_response import transport_error_raw
34
38
 
35
39
  _LOGGER = logging.getLogger(__name__)
@@ -40,9 +44,10 @@ class VertexAIAgentSearchService(
40
44
  ):
41
45
  engine_id = AgentEngineType.VERTEXAI.value
42
46
 
43
- def __init__(self, **kwargs: Any) -> None:
44
- super().__init__(**kwargs)
45
- self._client = get_vertex_client(self._http_client)
47
+ def __init__(self, *, http_client: AsyncClient) -> None:
48
+ super().__init__(http_client=http_client)
49
+ self._egress_http_client = http_client
50
+ self._client = get_vertex_client(http_client)
46
51
 
47
52
  async def search(self, request: VertexAIAgentSearchRequest) -> AgentSearchResponse: # type: ignore[override]
48
53
  response: AgentSearchResponse | None = None
@@ -52,6 +57,11 @@ class VertexAIAgentSearchService(
52
57
  if response is None:
53
58
  msg = "VertexAI agent search stream ended without a done event"
54
59
  raise UpstreamError(msg)
60
+ if request.enable_redirect_resolution:
61
+ response.answer = await resolve_vertex_result_urls(
62
+ response.answer,
63
+ http_client=self._egress_http_client,
64
+ )
55
65
  return response
56
66
 
57
67
  async def stream(