Get the web search tool based on the configuration. Returns: SearchEngine: An instance of the SearchEngine class configured with the API key.
(config_file: str)
| 118 | |
| 119 | |
| 120 | def get_web_search_tool(config_file: str): |
| 121 | """ |
| 122 | Get the web search tool based on the configuration. |
| 123 | |
| 124 | Returns: |
| 125 | SearchEngine: An instance of the SearchEngine class configured with the API key. |
| 126 | """ |
| 127 | search_config = get_search_config(config_file=config_file) |
| 128 | local_env = get_search_env_overrides() |
| 129 | |
| 130 | # Engine override precedence: |
| 131 | # 1) Thread-local override (per-request, e.g. FinResearch UI) |
| 132 | # 2) Global environment variable (shared default) |
| 133 | engine_override = ((local_env.get(SEARCH_ENGINE_OVERRIDE_ENV, '') or '') |
| 134 | or (os.getenv(SEARCH_ENGINE_OVERRIDE_ENV, '') |
| 135 | or '')).strip().lower() |
| 136 | if engine_override and engine_override in (SearchEngineType.EXA.value, |
| 137 | SearchEngineType.SERPAPI.value, |
| 138 | SearchEngineType.ARXIV.value): |
| 139 | search_config['engine'] = engine_override |
| 140 | |
| 141 | engine_name = (search_config.get('engine', '') or '').lower() |
| 142 | |
| 143 | # Per-request API key overrides (thread-local) take precedence |
| 144 | override_exa_key = local_env.get('EXA_API_KEY') |
| 145 | override_serp_key = local_env.get('SERPAPI_API_KEY') |
| 146 | |
| 147 | if engine_name == SearchEngineType.EXA.value: |
| 148 | return ExaSearch( |
| 149 | api_key=override_exa_key or search_config.get( |
| 150 | 'exa_api_key', os.getenv('EXA_API_KEY', None))) |
| 151 | elif engine_name == SearchEngineType.SERPAPI.value: |
| 152 | return SerpApiSearch( |
| 153 | api_key=override_serp_key or search_config.get( |
| 154 | 'serpapi_api_key', os.getenv('SERPAPI_API_KEY', None)), |
| 155 | provider=search_config.get('provider', 'google').lower()) |
| 156 | elif engine_name == SearchEngineType.ARXIV.value: |
| 157 | return ArxivSearch() |
| 158 | else: |
| 159 | return ArxivSearch() |
no test coverage detected