Update firecrawl.py

This commit is contained in:
Nicolas 2025-04-18 00:26:00 -07:00
parent b67bc707d5
commit 8c5509cbb4

View File

@ -558,61 +558,96 @@ class FirecrawlApp:
def search( def search(
self, self,
query: str, query: str,
params: Optional[Union[Dict[str, Any], SearchParams]] = None) -> SearchResponse: limit: Optional[int] = None,
tbs: Optional[str] = None,
filter: Optional[str] = None,
lang: Optional[str] = None,
country: Optional[str] = None,
location: Optional[str] = None,
timeout: Optional[int] = None,
scrape_options: Optional[CommonOptions] = None,
params: Optional[Union[Dict[str, Any], SearchParams]] = None,
**kwargs) -> SearchResponse:
""" """
Search for content using Firecrawl. Search for content using Firecrawl.
Args: Args:
query (str): Search query string query (str): Search query string
limit (Optional[int]): Max results (default: 5)
params (Optional[Union[Dict[str, Any], SearchParams]]): See SearchParams model: tbs (Optional[str]): Time filter (e.g. "qdr:d")
filter (Optional[str]): Custom result filter
Search Options: lang (Optional[str]): Language code (default: "en")
* limit - Max results (default: 5) country (Optional[str]): Country code (default: "us")
* tbs - Time filter (e.g. "qdr:d") location (Optional[str]): Geo-targeting
* filter - Custom result filter timeout (Optional[int]): Request timeout in milliseconds
scrape_options (Optional[CommonOptions]): Result scraping configuration
Localization: params (Optional[Union[Dict[str, Any], SearchParams]]): Additional search parameters
* lang - Language code (default: "en") **kwargs: Additional keyword arguments for future compatibility
* country - Country code (default: "us")
* location - Geo-targeting
Request Options:
* timeout - Request timeout (ms)
* scrapeOptions - Result scraping config, check ScrapeParams model for more details
Returns: Returns:
SearchResponse SearchResponse: Response containing:
* success (bool): Whether request succeeded
* data (List[FirecrawlDocument]): Search results
* warning (Optional[str]): Warning message if any
* error (Optional[str]): Error message if any
Raises: Raises:
Exception: If search fails Exception: If search fails or response cannot be parsed
""" """
if params is None: # Build search parameters
params = {} search_params = {}
if params:
if isinstance(params, dict): if isinstance(params, dict):
search_params = SearchParams(query=query, **params) search_params.update(params)
else: else:
search_params = params search_params.update(params.dict(exclude_none=True))
search_params.query = query
params_dict = search_params.dict(exclude_none=True) # Add individual parameters
if limit is not None:
search_params['limit'] = limit
if tbs is not None:
search_params['tbs'] = tbs
if filter is not None:
search_params['filter'] = filter
if lang is not None:
search_params['lang'] = lang
if country is not None:
search_params['country'] = country
if location is not None:
search_params['location'] = location
if timeout is not None:
search_params['timeout'] = timeout
if scrape_options is not None:
search_params['scrapeOptions'] = scrape_options.dict(exclude_none=True)
# Add any additional kwargs
search_params.update(kwargs)
# Create final params object
final_params = SearchParams(query=query, **search_params)
params_dict = final_params.dict(exclude_none=True)
params_dict['origin'] = f"python-sdk@{version}" params_dict['origin'] = f"python-sdk@{version}"
# Make request
response = requests.post( response = requests.post(
f"{self.api_url}/v1/search", f"{self.api_url}/v1/search",
headers={"Authorization": f"Bearer {self.api_key}"}, headers={"Authorization": f"Bearer {self.api_key}"},
json=params_dict json=params_dict
) )
if response.status_code != 200: if response.status_code == 200:
raise Exception(f"Request failed with status code {response.status_code}")
try: try:
return response.json() response_json = response.json()
except: if response_json.get('success') and 'data' in response_json:
raise Exception(f'Failed to parse Firecrawl response as JSON.') return SearchResponse(**response_json)
elif "error" in response_json:
raise Exception(f'Search failed. Error: {response_json["error"]}')
else:
raise Exception(f'Search failed. Error: {response_json}')
except ValueError:
raise Exception('Failed to parse Firecrawl response as JSON.')
else:
self._handle_error(response, 'search')
def crawl_url(self, url: str, def crawl_url(self, url: str,
params: Optional[CrawlParams] = None, params: Optional[CrawlParams] = None,