Ketch for Pi es un agente de codificación que carece de búsqueda web integrada. Sin búsqueda, no puede buscar documentación, verificar API ni encontrar respuestas actuales. Este tutorial agrega la búsqueda de Scavio como una herramienta que el agente puede llamar, devolviendo resultados estructurados sin necesidad de un navegador o una instancia de SearXNG. Cada búsqueda cuesta $0,005.
Requisitos previos
- Python 3.8+
- solicita biblioteca
- Una clave API de Scavio de scavio.dev
- Agente Ketch para Pi instalado
Guia paso a paso
Paso 1: Crear la función de herramienta de búsqueda
Cree una función de búsqueda que devuelva resultados en el formato que espera Ketch.
import os, requests, json
API_KEY = os.environ['SCAVIO_API_KEY']
SH = {'x-api-key': API_KEY, 'Content-Type': 'application/json'}
def search_web(query, num_results=5):
"""Search the web and return structured results for the agent."""
resp = requests.post('https://api.scavio.dev/api/v1/search',
headers=SH, json={'query': query, 'country_code': 'us'}, timeout=10)
resp.raise_for_status()
data = resp.json()
results = []
for r in data.get('organic_results', [])[:num_results]:
results.append({
'title': r.get('title', ''),
'url': r.get('link', ''),
'snippet': r.get('snippet', ''),
})
paa = data.get('people_also_ask', [])
related = [q.get('question', '') for q in paa[:3]]
return {
'results': results,
'related_questions': related,
'query': query,
'count': len(results)
}
# Test
result = search_web('python requests library documentation')
print(f'Found {result["count"]} results for: {result["query"]}')
for r in result['results'][:3]:
print(f' - {r["title"][:50]}')
print(f' {r["url"]}')Paso 2: Regístrese como herramienta Ketch
Envuelva la función de búsqueda como una definición de herramienta que Ketch puede descubrir y llamar.
SEARCH_TOOL = {
'name': 'web_search',
'description': 'Search the web for current information. Use for docs, APIs, errors, or any question needing fresh data.',
'parameters': {
'type': 'object',
'properties': {
'query': {'type': 'string', 'description': 'Search query'},
'num_results': {'type': 'integer', 'description': 'Number of results (default 5)', 'default': 5}
},
'required': ['query']
}
}
def handle_tool_call(tool_name, arguments):
"""Route tool calls from the agent."""
if tool_name == 'web_search':
query = arguments.get('query', '')
num = arguments.get('num_results', 5)
result = search_web(query, num)
return json.dumps(result, indent=2)
return json.dumps({'error': f'Unknown tool: {tool_name}'})
# Simulate agent calling the tool
response = handle_tool_call('web_search', {'query': 'ketch pi agent setup guide'})
print(response)Paso 3: Integrar en el bucle del agente
Agregue la herramienta de búsqueda a las herramientas disponibles del agente para que pueda llamar a la búsqueda durante las tareas.
def agent_loop_with_search(task):
"""Example agent loop that uses search when needed."""
print(f'Agent task: {task}')
print(f'Available tools: [web_search]')
# Step 1: Agent decides it needs to search
print(f'\n Agent: I need current information. Calling web_search...')
search_result = search_web(task)
print(f' Search returned {search_result["count"]} results')
# Step 2: Agent processes results
if search_result['results']:
top = search_result['results'][0]
print(f' Agent: Top result is "{top["title"][:40]}"')
print(f' Agent: URL - {top["url"]}')
print(f' Agent: Snippet - {top["snippet"][:80]}')
# Step 3: Agent uses related questions for deeper search
if search_result['related_questions']:
print(f'\n Agent: Found related questions:')
for q in search_result['related_questions']:
print(f' - {q}')
print(f'\n Cost: $0.005 per search call')
agent_loop_with_search('how to use FastAPI with async database')Ejemplo en Python
import os, requests
SH = {'x-api-key': os.environ['SCAVIO_API_KEY'], 'Content-Type': 'application/json'}
def agent_search(query):
data = requests.post('https://api.scavio.dev/api/v1/search',
headers=SH, json={'query': query, 'country_code': 'us'}, timeout=10).json()
return [{'title': r['title'], 'url': r['link']} for r in data.get('organic_results', [])[:5]]
results = agent_search('FastAPI async tutorial')
for r in results:
print(f'{r["title"][:50]} -> {r["url"]}')Ejemplo en JavaScript
const SH = { 'x-api-key': process.env.SCAVIO_API_KEY, 'Content-Type': 'application/json' };
const data = await fetch('https://api.scavio.dev/api/v1/search', {
method: 'POST', headers: SH,
body: JSON.stringify({ query: 'FastAPI async tutorial', country_code: 'us' })
}).then(r => r.json());
const results = (data.organic_results || []).slice(0, 5);
results.forEach(r => console.log(`${r.title} -> ${r.link}`));Salida esperada
Found 5 results for: python requests library documentation
- Requests: HTTP for Humans - Python Requests
https://docs.python-requests.org/en/latest/
- Requests Library Documentation - PyPI
https://pypi.org/project/requests/
Agent task: how to use FastAPI with async database
Available tools: [web_search]
Agent: I need current information. Calling web_search...
Search returned 5 results
Agent: Top result is "FastAPI with Async SQLAlchemy Guide"
Cost: $0.005 per search call