Skip to content

Commit d21a8f3

Browse files
author
mrkeyiano
committed
fix web search + multi page support
1 parent b340054 commit d21a8f3

2 files changed

Lines changed: 73 additions & 31 deletions

File tree

cursor_agent_tools/tools/search_tools.py

Lines changed: 71 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -387,52 +387,94 @@ def web_search(
387387

388388
def google_search_sync(query: str, api_key: str, search_engine_id: str, max_results: int = 5) -> Dict[str, Dict[str, Any]]:
389389
"""
390-
Perform a search using Google Custom Search API synchronously.
390+
Perform a search using Google Custom Search API synchronously with pagination support.
391391
392392
Args:
393393
query: The search query
394394
api_key: Google API key
395395
search_engine_id: Google Search Engine ID
396+
max_results: Maximum number of results to return (will paginate if > 10)
396397
397398
Returns:
398399
Dictionary mapping URLs to search result data
399400
"""
400401
try:
401-
logger.info(f"Performing Google Custom Search for: {query}")
402-
403-
url = "https://www.googleapis.com/customsearch/v1"
404-
params: Dict[str, str] = {
405-
'key': api_key,
406-
'cx': search_engine_id,
407-
'q': query,
408-
'num': str(max_results) # Number of results as string
409-
}
402+
logger.info(f"Performing Google Custom Search for: {query} (max_results: {max_results})")
403+
404+
all_results = {}
405+
results_collected = 0
406+
start_index = 1 # Google API uses 1-based indexing
407+
408+
# Calculate how many API calls we need (max 10 results per call)
409+
while results_collected < max_results:
410+
# Calculate how many results to request in this call
411+
results_needed = max_results - results_collected
412+
results_per_call = min(10, results_needed) # API limit is 10 per call
413+
414+
logger.info(f"Making API call - start: {start_index}, num: {results_per_call}")
415+
416+
url = "https://www.googleapis.com/customsearch/v1"
417+
params: Dict[str, str] = {
418+
'key': api_key,
419+
'cx': search_engine_id,
420+
'q': query,
421+
'num': str(results_per_call),
422+
'start': str(start_index)
423+
}
410424

411-
response = requests.get(url, params=params)
425+
response = requests.get(url, params=params)
426+
logger.info(f"API Response Status: {response.status_code}")
412427

413-
if response.status_code != 200:
414-
logger.error(f"Google Search API error: {response.status_code}")
415-
logger.error(f"Response: {response.text}")
416-
return {}
428+
if response.status_code == 200:
429+
data = response.json()
430+
items = data.get('items', [])
431+
432+
if not items:
433+
logger.info(f"No more results available. Collected {results_collected} results total.")
434+
break
417435

418-
data = response.json()
436+
logger.info(f"Retrieved {len(items)} results in this call")
437+
438+
# Process results from this call
439+
for item in items:
440+
link = item.get('link', '')
441+
title = item.get('title', '')
442+
snippet = item.get('snippet', '')
443+
444+
if link:
445+
all_results[link] = {
446+
'title': title,
447+
'snippet': snippet,
448+
'url': link
449+
}
450+
results_collected += 1
451+
452+
# Stop if we've collected enough results
453+
if results_collected >= max_results:
454+
break
455+
456+
# Prepare for next API call
457+
start_index += len(items)
458+
459+
# Check if we've reached the end of available results
460+
total_results = data.get('searchInformation', {}).get('totalResults', '0')
461+
if start_index > int(total_results):
462+
logger.info(f"Reached end of available results. Total available: {total_results}")
463+
break
419464

420-
# Process search results
421-
results = {}
422-
if 'items' in data:
423-
for item in data['items']:
424-
url = item.get('link')
425-
if url:
426-
results[url] = {
427-
'title': item.get('title', ''),
428-
'snippet': item.get('snippet', '')
429-
}
465+
else:
466+
logger.error(f"Google Search API error: {response.status_code}")
467+
logger.error(f"Response: {response.text}")
468+
break
430469

431-
logger.info(f"Found {len(results)} search results")
432-
return results
470+
logger.info(f"Google Search completed. Total results collected: {len(all_results)}")
471+
return all_results
433472

473+
except requests.exceptions.RequestException as e:
474+
logger.error(f"Request error during Google search: {e}")
475+
return {}
434476
except Exception as e:
435-
logger.error(f"Error in Google search: {str(e)}")
477+
logger.error(f"Unexpected error during Google search: {e}")
436478
return {}
437479

438480

setup.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,10 @@
3232

3333
setup(
3434
name="cursor-agent-tools",
35-
version="0.1.38",
35+
version="0.1.39",
3636
author="Nifemi Alpine",
3737
author_email="hello@civai.co",
38-
description="A Python-based AI agent that replicates Cursor's coding assistant capabilities",
38+
description="Cursor Agent Tools - A Python-based AI agent that replicates Cursor's coding assistant capabilities",
3939
long_description=long_description,
4040
long_description_content_type="text/markdown",
4141
url="https://github.com/civai-technologies/cursor-agent",

0 commit comments

Comments
 (0)