unique-search-proxy-core 2026.36.0.dev2__tar.gz → 2026.36.0.dev3__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {unique_search_proxy_core-2026.36.0.dev2 → unique_search_proxy_core-2026.36.0.dev3}/PKG-INFO +2 -2
- {unique_search_proxy_core-2026.36.0.dev2 → unique_search_proxy_core-2026.36.0.dev3}/pyproject.toml +6 -2
- unique_search_proxy_core-2026.36.0.dev3/unique_search_proxy_core/agent_engines/vertexai/schema.py +73 -0
- unique_search_proxy_core-2026.36.0.dev3/unique_search_proxy_core/agent_engines/vertexai/settings.py +52 -0
- unique_search_proxy_core-2026.36.0.dev2/unique_search_proxy_core/agent_engines/vertexai/schema.py +0 -45
- {unique_search_proxy_core-2026.36.0.dev2 → unique_search_proxy_core-2026.36.0.dev3}/README.md +0 -0
- {unique_search_proxy_core-2026.36.0.dev2 → unique_search_proxy_core-2026.36.0.dev3}/unique_search_proxy_core/__init__.py +0 -0
- {unique_search_proxy_core-2026.36.0.dev2 → unique_search_proxy_core-2026.36.0.dev3}/unique_search_proxy_core/agent_engines/__init__.py +0 -0
- {unique_search_proxy_core-2026.36.0.dev2 → unique_search_proxy_core-2026.36.0.dev3}/unique_search_proxy_core/agent_engines/base.py +0 -0
- {unique_search_proxy_core-2026.36.0.dev2 → unique_search_proxy_core-2026.36.0.dev3}/unique_search_proxy_core/agent_engines/bing/__init__.py +0 -0
- {unique_search_proxy_core-2026.36.0.dev2 → unique_search_proxy_core-2026.36.0.dev3}/unique_search_proxy_core/agent_engines/bing/schema.py +0 -0
- {unique_search_proxy_core-2026.36.0.dev2 → unique_search_proxy_core-2026.36.0.dev3}/unique_search_proxy_core/agent_engines/config_types.py +0 -0
- {unique_search_proxy_core-2026.36.0.dev2 → unique_search_proxy_core-2026.36.0.dev3}/unique_search_proxy_core/agent_engines/output_schema.py +0 -0
- {unique_search_proxy_core-2026.36.0.dev2 → unique_search_proxy_core-2026.36.0.dev3}/unique_search_proxy_core/agent_engines/resolve.py +0 -0
- {unique_search_proxy_core-2026.36.0.dev2 → unique_search_proxy_core-2026.36.0.dev3}/unique_search_proxy_core/agent_engines/response_parsing.py +0 -0
- {unique_search_proxy_core-2026.36.0.dev2 → unique_search_proxy_core-2026.36.0.dev3}/unique_search_proxy_core/agent_engines/vertexai/__init__.py +0 -0
- {unique_search_proxy_core-2026.36.0.dev2 → unique_search_proxy_core-2026.36.0.dev3}/unique_search_proxy_core/context.py +0 -0
- {unique_search_proxy_core-2026.36.0.dev2 → unique_search_proxy_core-2026.36.0.dev3}/unique_search_proxy_core/crawlers/__init__.py +0 -0
- {unique_search_proxy_core-2026.36.0.dev2 → unique_search_proxy_core-2026.36.0.dev3}/unique_search_proxy_core/crawlers/base.py +0 -0
- {unique_search_proxy_core-2026.36.0.dev2 → unique_search_proxy_core-2026.36.0.dev3}/unique_search_proxy_core/crawlers/basic/__init__.py +0 -0
- {unique_search_proxy_core-2026.36.0.dev2 → unique_search_proxy_core-2026.36.0.dev3}/unique_search_proxy_core/crawlers/basic/content_types.py +0 -0
- {unique_search_proxy_core-2026.36.0.dev2 → unique_search_proxy_core-2026.36.0.dev3}/unique_search_proxy_core/crawlers/basic/processing/policy.py +0 -0
- {unique_search_proxy_core-2026.36.0.dev2 → unique_search_proxy_core-2026.36.0.dev3}/unique_search_proxy_core/crawlers/basic/schema.py +0 -0
- {unique_search_proxy_core-2026.36.0.dev2 → unique_search_proxy_core-2026.36.0.dev3}/unique_search_proxy_core/crawlers/config_types.py +0 -0
- {unique_search_proxy_core-2026.36.0.dev2 → unique_search_proxy_core-2026.36.0.dev3}/unique_search_proxy_core/crawlers/firecrawl/schema.py +0 -0
- {unique_search_proxy_core-2026.36.0.dev2 → unique_search_proxy_core-2026.36.0.dev3}/unique_search_proxy_core/crawlers/jina/schema.py +0 -0
- {unique_search_proxy_core-2026.36.0.dev2 → unique_search_proxy_core-2026.36.0.dev3}/unique_search_proxy_core/crawlers/tavily/schema.py +0 -0
- {unique_search_proxy_core-2026.36.0.dev2 → unique_search_proxy_core-2026.36.0.dev3}/unique_search_proxy_core/errors.py +0 -0
- {unique_search_proxy_core-2026.36.0.dev2 → unique_search_proxy_core-2026.36.0.dev3}/unique_search_proxy_core/logging.py +0 -0
- {unique_search_proxy_core-2026.36.0.dev2 → unique_search_proxy_core-2026.36.0.dev3}/unique_search_proxy_core/param_policy/__init__.py +0 -0
- {unique_search_proxy_core-2026.36.0.dev2 → unique_search_proxy_core-2026.36.0.dev3}/unique_search_proxy_core/param_policy/annotations.py +0 -0
- {unique_search_proxy_core-2026.36.0.dev2 → unique_search_proxy_core-2026.36.0.dev3}/unique_search_proxy_core/param_policy/derive.py +0 -0
- {unique_search_proxy_core-2026.36.0.dev2 → unique_search_proxy_core-2026.36.0.dev3}/unique_search_proxy_core/param_policy/exposable_param.py +0 -0
- {unique_search_proxy_core-2026.36.0.dev2 → unique_search_proxy_core-2026.36.0.dev3}/unique_search_proxy_core/param_policy/exposed_params.py +0 -0
- {unique_search_proxy_core-2026.36.0.dev2 → unique_search_proxy_core-2026.36.0.dev3}/unique_search_proxy_core/param_policy/request_base.py +0 -0
- {unique_search_proxy_core-2026.36.0.dev2 → unique_search_proxy_core-2026.36.0.dev3}/unique_search_proxy_core/providers/schema.py +0 -0
- {unique_search_proxy_core-2026.36.0.dev2 → unique_search_proxy_core-2026.36.0.dev3}/unique_search_proxy_core/schema.py +0 -0
- {unique_search_proxy_core-2026.36.0.dev2 → unique_search_proxy_core-2026.36.0.dev3}/unique_search_proxy_core/search_engines/__init__.py +0 -0
- {unique_search_proxy_core-2026.36.0.dev2 → unique_search_proxy_core-2026.36.0.dev3}/unique_search_proxy_core/search_engines/base.py +0 -0
- {unique_search_proxy_core-2026.36.0.dev2 → unique_search_proxy_core-2026.36.0.dev3}/unique_search_proxy_core/search_engines/brave/__init__.py +0 -0
- {unique_search_proxy_core-2026.36.0.dev2 → unique_search_proxy_core-2026.36.0.dev3}/unique_search_proxy_core/search_engines/brave/schema.py +0 -0
- {unique_search_proxy_core-2026.36.0.dev2 → unique_search_proxy_core-2026.36.0.dev3}/unique_search_proxy_core/search_engines/config_types.py +0 -0
- {unique_search_proxy_core-2026.36.0.dev2 → unique_search_proxy_core-2026.36.0.dev3}/unique_search_proxy_core/search_engines/google/__init__.py +0 -0
- {unique_search_proxy_core-2026.36.0.dev2 → unique_search_proxy_core-2026.36.0.dev3}/unique_search_proxy_core/search_engines/google/schema.py +0 -0
- {unique_search_proxy_core-2026.36.0.dev2 → unique_search_proxy_core-2026.36.0.dev3}/unique_search_proxy_core/search_engines/perplexity/__init__.py +0 -0
- {unique_search_proxy_core-2026.36.0.dev2 → unique_search_proxy_core-2026.36.0.dev3}/unique_search_proxy_core/search_engines/perplexity/schema.py +0 -0
- {unique_search_proxy_core-2026.36.0.dev2 → unique_search_proxy_core-2026.36.0.dev3}/unique_search_proxy_core/url_safety/__init__.py +0 -0
- {unique_search_proxy_core-2026.36.0.dev2 → unique_search_proxy_core-2026.36.0.dev3}/unique_search_proxy_core/url_safety/dns.py +0 -0
- {unique_search_proxy_core-2026.36.0.dev2 → unique_search_proxy_core-2026.36.0.dev3}/unique_search_proxy_core/url_safety/egress.py +0 -0
- {unique_search_proxy_core-2026.36.0.dev2 → unique_search_proxy_core-2026.36.0.dev3}/unique_search_proxy_core/url_safety/models.py +0 -0
- {unique_search_proxy_core-2026.36.0.dev2 → unique_search_proxy_core-2026.36.0.dev3}/unique_search_proxy_core/url_safety/netloc.py +0 -0
- {unique_search_proxy_core-2026.36.0.dev2 → unique_search_proxy_core-2026.36.0.dev3}/unique_search_proxy_core/url_safety/policy.py +0 -0
- {unique_search_proxy_core-2026.36.0.dev2 → unique_search_proxy_core-2026.36.0.dev3}/unique_search_proxy_core/url_safety/redirect.py +0 -0
- {unique_search_proxy_core-2026.36.0.dev2 → unique_search_proxy_core-2026.36.0.dev3}/unique_search_proxy_core/url_safety/resolver.py +0 -0
- {unique_search_proxy_core-2026.36.0.dev2 → unique_search_proxy_core-2026.36.0.dev3}/unique_search_proxy_core/url_safety/service.py +0 -0
- {unique_search_proxy_core-2026.36.0.dev2 → unique_search_proxy_core-2026.36.0.dev3}/unique_search_proxy_core/url_safety/settings.py +0 -0
{unique_search_proxy_core-2026.36.0.dev2 → unique_search_proxy_core-2026.36.0.dev3}/PKG-INFO
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: unique-search-proxy-core
|
|
3
|
-
Version: 2026.36.0.
|
|
3
|
+
Version: 2026.36.0.dev3
|
|
4
4
|
Summary: Shared Pydantic types for the Unique Search Proxy API
|
|
5
5
|
Author: ThePhilAz
|
|
6
6
|
Author-email: ThePhilAz <rami.azouz@philico.com>
|
|
@@ -8,7 +8,7 @@ Requires-Dist: httpx>=0.28.0,<0.29
|
|
|
8
8
|
Requires-Dist: pydantic>=2.12.5,<3.0.0
|
|
9
9
|
Requires-Dist: pydantic-settings>=2.10.1,<3
|
|
10
10
|
Requires-Dist: pyhumps>=3.8.0,<4
|
|
11
|
-
Requires-Dist: unique-toolkit[monitoring]>=2026.36.0.
|
|
11
|
+
Requires-Dist: unique-toolkit[monitoring]>=2026.36.0.dev8,<2026.36.0rc0
|
|
12
12
|
Requires-Python: >=3.12
|
|
13
13
|
Description-Content-Type: text/markdown
|
|
14
14
|
|
{unique_search_proxy_core-2026.36.0.dev2 → unique_search_proxy_core-2026.36.0.dev3}/pyproject.toml
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "unique-search-proxy-core"
|
|
3
|
-
version = "2026.36.0.
|
|
3
|
+
version = "2026.36.0.dev3"
|
|
4
4
|
description = "Shared Pydantic types for the Unique Search Proxy API"
|
|
5
5
|
authors = [{ name = "ThePhilAz", email = "rami.azouz@philico.com" }]
|
|
6
6
|
readme = "README.md"
|
|
@@ -10,7 +10,7 @@ dependencies = [
|
|
|
10
10
|
"pydantic>=2.12.5,<3.0.0",
|
|
11
11
|
"pydantic-settings>=2.10.1,<3",
|
|
12
12
|
"pyhumps>=3.8.0,<4",
|
|
13
|
-
"unique-toolkit[monitoring]>=2026.36.0.
|
|
13
|
+
"unique-toolkit[monitoring]>=2026.36.0.dev8,<2026.36.0rc0",
|
|
14
14
|
|
|
15
15
|
]
|
|
16
16
|
|
|
@@ -61,6 +61,10 @@ depcheck = "deptry ."
|
|
|
61
61
|
[tool.pytest.ini_options]
|
|
62
62
|
addopts = "--strict-markers --import-mode=importlib"
|
|
63
63
|
asyncio_mode = "auto"
|
|
64
|
+
markers = [
|
|
65
|
+
"ai: AI-authored or AI-generated tests",
|
|
66
|
+
"unit: unit tests",
|
|
67
|
+
]
|
|
64
68
|
|
|
65
69
|
[tool.uv.sources]
|
|
66
70
|
unique-toolkit = { workspace = true }
|
unique_search_proxy_core-2026.36.0.dev3/unique_search_proxy_core/agent_engines/vertexai/schema.py
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import Annotated, ClassVar, Literal
|
|
4
|
+
|
|
5
|
+
from pydantic import Field, field_validator
|
|
6
|
+
from unique_toolkit._common.pydantic.rjsf_tags import RJSFMetaTag
|
|
7
|
+
|
|
8
|
+
from unique_search_proxy_core.agent_engines.base import (
|
|
9
|
+
AgentEngineType,
|
|
10
|
+
BaseAgentEngineConfig,
|
|
11
|
+
)
|
|
12
|
+
from unique_search_proxy_core.agent_engines.vertexai.settings import (
|
|
13
|
+
resolve_enable_enterprise_search,
|
|
14
|
+
vertex_ai_env_settings,
|
|
15
|
+
)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def _get_force_activate_enterprise_search_description() -> str:
|
|
19
|
+
if vertex_ai_env_settings.force_activate_enterprise_search:
|
|
20
|
+
return "This parameter has been enforced by infra team."
|
|
21
|
+
|
|
22
|
+
return (
|
|
23
|
+
"When true, ground answers with Vertex AI Enterprise Web Search "
|
|
24
|
+
"(Agent Platform Search, SEC4-compliant)"
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def _enterprise_search_rjsf_tag() -> RJSFMetaTag:
|
|
29
|
+
return RJSFMetaTag.BooleanWidget.checkbox(
|
|
30
|
+
title="Enable Enterprise Search",
|
|
31
|
+
help=_get_force_activate_enterprise_search_description(),
|
|
32
|
+
disabled=vertex_ai_env_settings.force_activate_enterprise_search,
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
EnableEnterpriseSearch = Annotated[bool, _enterprise_search_rjsf_tag()]
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class VertexAIAgentConfig(BaseAgentEngineConfig[Literal[AgentEngineType.VERTEXAI]]):
|
|
40
|
+
"""Deployment + request defaults for Vertex AI grounding (Google GenAI)."""
|
|
41
|
+
|
|
42
|
+
_request_model_name: ClassVar[str] = "VertexAIAgentSearchRequest"
|
|
43
|
+
|
|
44
|
+
engine: Annotated[
|
|
45
|
+
Literal[AgentEngineType.VERTEXAI], RJSFMetaTag.SpecialWidget.hidden()
|
|
46
|
+
] = Field(
|
|
47
|
+
default=AgentEngineType.VERTEXAI,
|
|
48
|
+
title="Agent engine",
|
|
49
|
+
description="Provider discriminator; must be `vertexai` for this config.",
|
|
50
|
+
)
|
|
51
|
+
vertexai_model_name: str = Field(
|
|
52
|
+
default=vertex_ai_env_settings.default_vertex_ai_model_name,
|
|
53
|
+
description="Gemini model name for grounded generation",
|
|
54
|
+
)
|
|
55
|
+
enable_enterprise_search: EnableEnterpriseSearch = Field(
|
|
56
|
+
default=vertex_ai_env_settings.force_activate_enterprise_search,
|
|
57
|
+
validate_default=True,
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
@field_validator("enable_enterprise_search", mode="before")
|
|
61
|
+
@classmethod
|
|
62
|
+
def validate_enable_enterprise_search(cls, v: object) -> bool:
|
|
63
|
+
"""Pin the value on when infra forces enterprise search for ZDR tenants."""
|
|
64
|
+
return resolve_enable_enterprise_search(bool(v) if v is not None else False)
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
VertexAIAgentSearchRequest = VertexAIAgentConfig.request_model()
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
__all__ = [
|
|
71
|
+
"VertexAIAgentConfig",
|
|
72
|
+
"VertexAIAgentSearchRequest",
|
|
73
|
+
]
|
unique_search_proxy_core-2026.36.0.dev3/unique_search_proxy_core/agent_engines/vertexai/settings.py
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import os
|
|
2
|
+
import sys
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
|
|
5
|
+
from pydantic import Field
|
|
6
|
+
from pydantic_settings import BaseSettings, SettingsConfigDict
|
|
7
|
+
|
|
8
|
+
_ENV_PREFIX = "VERTEXAI_AGENT_"
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class _VertexAIEnvSettings(BaseSettings):
|
|
12
|
+
default_vertex_ai_model_name: str = Field(
|
|
13
|
+
default="gemini-3-flash-preview",
|
|
14
|
+
description="Default Vertex AI model name for grounded generation",
|
|
15
|
+
)
|
|
16
|
+
force_activate_enterprise_search: bool = Field(
|
|
17
|
+
default=False,
|
|
18
|
+
description=(
|
|
19
|
+
"When true, pin Enable Enterprise Search on for ZDR tenants so the "
|
|
20
|
+
"toggle cannot be turned off in config or at request time."
|
|
21
|
+
),
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def _get_settings() -> _VertexAIEnvSettings:
|
|
26
|
+
if "pytest" in sys.modules:
|
|
27
|
+
env_file = Path(os.getcwd()) / "tests/test.env"
|
|
28
|
+
else:
|
|
29
|
+
env_file = Path(os.getcwd()) / ".env"
|
|
30
|
+
|
|
31
|
+
class _Settings(_VertexAIEnvSettings):
|
|
32
|
+
model_config = SettingsConfigDict(
|
|
33
|
+
env_file=env_file,
|
|
34
|
+
env_prefix=_ENV_PREFIX,
|
|
35
|
+
extra="ignore",
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
return _Settings()
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
vertex_ai_env_settings = _get_settings()
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def resolve_enable_enterprise_search(value: bool | None = False) -> bool:
|
|
45
|
+
"""Return the effective enterprise-search flag after infra enforcement.
|
|
46
|
+
|
|
47
|
+
ZDR tenants set ``VERTEXAI_AGENT_FORCE_ACTIVATE_ENTERPRISE_SEARCH=true`` so
|
|
48
|
+
the cheaper standard grounding edition cannot be selected.
|
|
49
|
+
"""
|
|
50
|
+
if vertex_ai_env_settings.force_activate_enterprise_search:
|
|
51
|
+
return True
|
|
52
|
+
return bool(value)
|
unique_search_proxy_core-2026.36.0.dev2/unique_search_proxy_core/agent_engines/vertexai/schema.py
DELETED
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
|
-
from typing import Annotated, ClassVar, Literal
|
|
4
|
-
|
|
5
|
-
from pydantic import Field
|
|
6
|
-
from unique_toolkit._common.pydantic.rjsf_tags import RJSFMetaTag
|
|
7
|
-
|
|
8
|
-
from unique_search_proxy_core.agent_engines.base import (
|
|
9
|
-
AgentEngineType,
|
|
10
|
-
BaseAgentEngineConfig,
|
|
11
|
-
)
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
class VertexAIAgentConfig(BaseAgentEngineConfig[Literal[AgentEngineType.VERTEXAI]]):
|
|
15
|
-
"""Deployment + request defaults for Vertex AI grounding (Google GenAI)."""
|
|
16
|
-
|
|
17
|
-
_request_model_name: ClassVar[str] = "VertexAIAgentSearchRequest"
|
|
18
|
-
|
|
19
|
-
engine: Annotated[
|
|
20
|
-
Literal[AgentEngineType.VERTEXAI], RJSFMetaTag.SpecialWidget.hidden()
|
|
21
|
-
] = Field(
|
|
22
|
-
default=AgentEngineType.VERTEXAI,
|
|
23
|
-
title="Agent engine",
|
|
24
|
-
description="Provider discriminator; must be `vertexai` for this config.",
|
|
25
|
-
)
|
|
26
|
-
vertexai_model_name: str = Field(
|
|
27
|
-
default="gemini-3-flash-preview",
|
|
28
|
-
description="Gemini model name for grounded generation",
|
|
29
|
-
)
|
|
30
|
-
enable_enterprise_search: bool = Field(
|
|
31
|
-
default=False,
|
|
32
|
-
description=(
|
|
33
|
-
"When true, ground answers with Vertex AI Enterprise Web Search "
|
|
34
|
-
"(Agent Platform Search, SEC4-compliant)"
|
|
35
|
-
),
|
|
36
|
-
)
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
VertexAIAgentSearchRequest = VertexAIAgentConfig.request_model()
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
__all__ = [
|
|
43
|
-
"VertexAIAgentConfig",
|
|
44
|
-
"VertexAIAgentSearchRequest",
|
|
45
|
-
]
|
{unique_search_proxy_core-2026.36.0.dev2 → unique_search_proxy_core-2026.36.0.dev3}/README.md
RENAMED
|
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
|