Skip to content

Commit ccfc970

Browse files
committed
move search_config_from_kwargs to utils
1 parent a58da0e commit ccfc970

File tree

4 files changed

+43
-27
lines changed

4 files changed

+43
-27
lines changed

sgr_agent_core/services/tavily_search.py

Lines changed: 1 addition & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,12 @@
11
import logging
2-
from typing import Any
32

43
from tavily import AsyncTavilyClient
54

6-
from sgr_agent_core.agent_definition import AgentConfig, SearchConfig
5+
from sgr_agent_core.agent_definition import SearchConfig
76
from sgr_agent_core.models import SourceData
87

98
logger = logging.getLogger(__name__)
109

11-
SEARCH_CONFIG_KEYS = (
12-
"tavily_api_key",
13-
"tavily_api_base_url",
14-
"max_searches",
15-
"max_results",
16-
"content_limit",
17-
)
18-
19-
20-
def search_config_from_kwargs(config: AgentConfig | None, kwargs: dict[str, Any]) -> SearchConfig:
21-
"""Build SearchConfig from config.search and tool kwargs (kwargs override).
22-
23-
Used by WebSearchTool and ExtractPageContentTool to get search
24-
settings from the tools array config (kwargs) with fallback to agent
25-
config.search.
26-
"""
27-
base = config.search.model_dump() if config and config.search else {}
28-
overrides = {k: v for k, v in kwargs.items() if k in SEARCH_CONFIG_KEYS and v is not None}
29-
return SearchConfig(**{**base, **overrides})
30-
3110

3211
class TavilySearchService:
3312
def __init__(self, search_config: SearchConfig):

sgr_agent_core/tools/extract_page_content_tool.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,10 @@
55

66
from pydantic import Field
77

8+
from sgr_agent_core.agent_definition import SearchConfig
89
from sgr_agent_core.base_tool import BaseTool
910
from sgr_agent_core.services import TavilySearchService
10-
from sgr_agent_core.services.tavily_search import search_config_from_kwargs
11+
from sgr_agent_core.utils import config_from_kwargs
1112

1213
if TYPE_CHECKING:
1314
from sgr_agent_core.agent_definition import AgentConfig
@@ -42,7 +43,11 @@ async def __call__(self, context: AgentContext, config: AgentConfig, **kwargs: A
4243
Search settings (e.g. tavily_api_key, content_limit) are taken
4344
from kwargs (tool config) with fallback to config.search.
4445
"""
45-
search_config = search_config_from_kwargs(config, dict(kwargs))
46+
search_config = config_from_kwargs(
47+
SearchConfig,
48+
config.search if config else None,
49+
dict(kwargs),
50+
)
4651
logger.info(f"📄 Extracting content from {len(self.urls)} URLs")
4752

4853
self._search_service = TavilySearchService(search_config)

sgr_agent_core/tools/web_search_tool.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,11 @@
66

77
from pydantic import Field
88

9-
from sgr_agent_core.agent_definition import AgentConfig
9+
from sgr_agent_core.agent_definition import AgentConfig, SearchConfig
1010
from sgr_agent_core.base_tool import BaseTool
1111
from sgr_agent_core.models import SearchResult
12-
from sgr_agent_core.services.tavily_search import TavilySearchService, search_config_from_kwargs
12+
from sgr_agent_core.services.tavily_search import TavilySearchService
13+
from sgr_agent_core.utils import config_from_kwargs
1314

1415
if TYPE_CHECKING:
1516
from sgr_agent_core.models import AgentContext
@@ -58,7 +59,11 @@ async def __call__(self, context: AgentContext, config: AgentConfig, **kwargs: A
5859
Search settings are taken from kwargs (tool config) with
5960
fallback to config.search.
6061
"""
61-
search_config = search_config_from_kwargs(config, dict(kwargs))
62+
search_config = config_from_kwargs(
63+
SearchConfig,
64+
config.search if config else None,
65+
dict(kwargs),
66+
)
6267
logger.info(f"🔍 Search query: '{self.query}'")
6368
self._search_service = TavilySearchService(search_config)
6469

sgr_agent_core/utils.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
"""Internal utilities for config merging and tool helpers."""
2+
3+
from typing import Any, TypeVar
4+
5+
from pydantic import BaseModel
6+
7+
T = TypeVar("T", bound=BaseModel)
8+
9+
10+
def config_from_kwargs(config_class: type[T], base: T | None, kwargs: dict[str, Any]) -> T:
11+
"""Build a config instance from base (optional) and kwargs; kwargs override
12+
base.
13+
14+
Generic helper for any Pydantic config model. Used by tools to merge
15+
agent-level config with per-tool kwargs from the tools array (global or inline).
16+
17+
Args:
18+
config_class: Pydantic model class to instantiate (e.g. SearchConfig).
19+
base: Existing config instance, or None to use only kwargs (with model defaults).
20+
kwargs: Overrides; keys present here override base. None values are skipped.
21+
22+
Returns:
23+
New instance of config_class with merged values.
24+
"""
25+
data = base.model_dump() if base is not None else {}
26+
data.update({k: v for k, v in kwargs.items() if v is not None})
27+
return config_class(**data)

0 commit comments

Comments
 (0)