Market Fit
Una aplicación web para analizar sitios web utilizando modelos de IA avanzados.
Descripción
Site Analyzer es una herramienta que permite analizar sitios web y obtener información valiosa sobre su estructura, contenido, diseño y experiencia de usuario. Utiliza modelos de IA de diferentes proveedores (Anthropic, OpenAI, Google) para proporcionar análisis detallados y recomendaciones accionables.
Características
- Análisis Básico: Obtén un resumen general, insights y recomendaciones sobre cualquier sitio web.
- Análisis Detallado: Análisis en profundidad con recomendaciones específicas para mejorar el sitio.
- Análisis Estructurado: Análisis detallado de la estructura del sitio, identificando bloques funcionales y su propósito.
- Conversación: Mantén una conversación con un modelo de IA sobre cualquier aspecto del sitio web.
- Selección de Modelos: Elige entre diferentes proveedores y modelos de IA (Claude, GPT, Gemini).
- Capturas de Pantalla: Opción para incluir capturas de pantalla en el análisis para una evaluación visual.
- API Documentada: API completa con documentación interactiva y playground para probar los endpoints.
Tecnologías
- Frontend: Next.js, React, TypeScript, Tailwind CSS
- Backend: Next.js API Routes
- IA: Integración con Anthropic (Claude), OpenAI (GPT), Google (Gemini) a través de Portkey
- Herramientas: Puppeteer para capturas de pantalla, Cheerio para procesamiento HTML
Seguridad
Middleware de API
La aplicación incluye un middleware para las rutas de API que:
- Monitorea las solicitudes a rutas
/apipara asegurar que sigan la estructura de carpetas de la aplicación - No bloquea ninguna ruta, permitiendo que toda la aplicación funcione normalmente
- Registra advertencias en la consola cuando se detectan rutas de API no estándar
Este middleware es completamente no intrusivo y solo tiene fines de monitoreo. No interfiere con el funcionamiento de Nextra ni con ninguna otra parte de la aplicación. Su único propósito es ayudar a identificar posibles problemas con las rutas de API.
Para probar el middleware, puedes usar cualquiera de estos métodos:
-
Método recomendado: Iniciar el servidor de desarrollo y realizar solicitudes a las rutas de API:
npm run dev # Luego visita http://localhost:3001/api/conversation o cualquier otra ruta -
Usando el script de prueba:
# Primero compila el proyecto npm run build # Luego ejecuta el script de prueba node test-middleware.js -
Durante el desarrollo: El middleware se ejecuta automáticamente para todas las solicitudes a rutas
/api/*cuando el servidor está en ejecución.
Instalación
-
Clona el repositorio:
git clone https://github.com/tu-usuario/site-analyzer.git cd site-analyzer -
Instala las dependencias:
npm install # o yarn install -
Crea un archivo
.env.localcon las siguientes variables:PORTKEY_API_KEY=tu_clave_de_portkey ANTHROPIC_API_KEY=tu_clave_de_anthropic AZURE_OPENAI_API_KEY=tu_clave_de_openai GEMINI_API_KEY=tu_clave_de_gemini -
Inicia el servidor de desarrollo:
npm run dev # o yarn dev -
Abre http://localhost:3001 en tu navegador.
Uso
Interfaz Web
- Ingresa la URL del sitio que deseas analizar.
- Selecciona el tipo de análisis (Básico, Detallado, Estructurado o Conversación).
- Elige el proveedor de IA y el modelo específico.
- Decide si deseas incluir una captura de pantalla.
- Haz clic en “Analizar sitio” o “Iniciar conversación”.
- Explora los resultados en las diferentes pestañas.
API
La API está disponible en los siguientes endpoints:
Documentación Interactiva
Para probar los endpoints de forma interactiva, visita la documentación en /api/docs. Esta interfaz te permite:
- Ver todos los endpoints disponibles
- Probar cada endpoint con parámetros personalizados
- Ver ejemplos de solicitudes y respuestas
- Ejecutar solicitudes en tiempo real
Referencia de Endpoints
POST /api/analyze
Realiza un análisis básico de un sitio web.
Solicitud:
{
"url": "https://example.com"
}Respuesta:
{
"success": true,
"result": {
"summary": "Este es un sitio web de ejemplo con una estructura simple...",
"insights": [
"El sitio tiene una navegación clara y accesible",
"La página de inicio presenta claramente el propósito del sitio"
],
"recommendations": [
{
"issue": "Falta de llamadas a la acción claras",
"solution": "Añadir botones CTA más prominentes en la página de inicio",
"priority": "high"
}
],
"metadata": {
"analyzed_by": "Claude 3.5 Sonnet",
"timestamp": "2023-07-15T12:34:56Z",
"status": "success"
}
}
}POST /api/site/analyze
Realiza un análisis avanzado con opciones personalizables.
Solicitud:
{
"url": "https://example.com",
"options": {
"analysisType": "basic", // "basic", "detailed", "structured"
"depth": 2,
"timeout": 30000,
"includeScreenshot": true,
"provider": "anthropic", // "anthropic", "openai", "gemini"
"modelId": "claude-3-5-sonnet-20240620"
}
}Respuesta (para analysisType=“basic” o “detailed”):
{
"success": true,
"analysisType": "basic",
"result": {
"summary": "Este es un sitio web de ejemplo con una estructura simple...",
"insights": [
"El sitio tiene una navegación clara y accesible",
"La página de inicio presenta claramente el propósito del sitio"
],
"recommendations": [
{
"issue": "Falta de llamadas a la acción claras",
"solution": "Añadir botones CTA más prominentes en la página de inicio",
"priority": "high"
}
]
}
}Respuesta (para analysisType=“structured”):
{
"success": true,
"analysisType": "structured",
"result": {
"structuredAnalysis": {
"site_info": {
"url": "https://example.com",
"title": "Example Domain",
"description": "This domain is for use in illustrative examples",
"language": "en"
},
"blocks": [
{
"id": "header-1",
"type": "header",
"section_type": "navigation",
"selector": "header",
"classes": ["main-header"],
"content_type": "navigation",
"description": "Cabecera principal del sitio",
"relevance": {
"score": 90,
"reason": "Elemento crítico para la navegación"
},
"children": 3,
"text_length": 45,
"location": {
"position": "top",
"coordinates": {
"top": 0,
"left": 0
}
},
"content_list": ["Home", "About", "Contact"]
}
// Más bloques...
],
"hierarchy": {
"main_sections": ["header", "hero", "features", "footer"],
"navigation_structure": []
},
"overview": {
"total_blocks": 12,
"primary_content_blocks": 5,
"navigation_blocks": 2,
"interactive_elements": 8
},
"metadata": {
"analyzed_by": "Claude 3.5 Sonnet",
"timestamp": "2023-07-15T12:34:56Z",
"status": "success"
}
}
}
}POST /api/ai
Envía mensajes a un modelo de IA y recibe respuestas.
Solicitud:
{
"messages": [
{ "role": "user", "content": "Hola, ¿puedes ayudarme con mi sitio web?" }
],
"modelType": "anthropic", // "anthropic", "openai", "gemini"
"modelId": "claude-3-5-sonnet-20240620"
}Respuesta:
{
"id": "msg_01234567890",
"choices": [
{
"message": {
"role": "assistant",
"content": "¡Hola! Claro que puedo ayudarte con tu sitio web. ¿Qué tipo de ayuda necesitas? Puedo ofrecerte consejos sobre diseño, usabilidad, SEO, rendimiento, o cualquier otro aspecto que te interese mejorar."
}
}
]
}POST /api/conversation
Mantén una conversación contextual sobre un sitio web con un modelo de IA.
Solicitud:
{
"messages": [
{ "role": "user", "content": "Hola, ¿puedes ayudarme con mi sitio web?" }
],
"modelType": "anthropic", // "anthropic", "openai", "gemini"
"modelId": "claude-3-5-sonnet-20240620",
"includeScreenshot": false,
"siteUrl": "https://example.com"
}Respuesta:
{
"id": "msg_01234567890",
"choices": [
{
"message": {
"role": "assistant",
"content": "¡Hola! Claro que puedo ayudarte con tu sitio web example.com. ¿Qué aspectos específicos te gustaría mejorar o qué preguntas tienes sobre él?"
}
}
]
}Códigos de Estado HTTP
200 OK: La solicitud se completó correctamente400 Bad Request: Parámetros incorrectos o faltantes401 Unauthorized: Autenticación requerida o inválida404 Not Found: Recurso no encontrado500 Internal Server Error: Error del servidor
Límites de Uso
- Máximo de 100 solicitudes por hora por IP
- Tamaño máximo de respuesta: 10MB
- Tiempo máximo de procesamiento: 60 segundos
Estructura del Proyecto
site-analyzer/
├── src/
│ ├── app/
│ │ ├── api/
│ │ │ ├── analyze/
│ │ │ ├── ai/
│ │ │ ├── conversation/
│ │ │ ├── docs/
│ │ │ └── site/
│ │ ├── components/
│ │ │ ├── ConversationUI.tsx
│ │ │ └── StructuredAnalysis.tsx
│ │ ├── globals.css
│ │ ├── layout.tsx
│ │ └── page.tsx
│ ├── lib/
│ │ ├── actions/
│ │ ├── agents/
│ │ ├── config/
│ │ ├── prompts/
│ │ ├── services/
│ │ ├── types/
│ │ └── utils/
│ │ ├── api-utils.ts
│ │ ├── dev-helpers.ts
│ │ ├── html-preprocessor.ts
│ │ ├── html-utils.ts
│ │ ├── image-utils.ts
│ │ └── message-utils.ts
├── public/
├── .env.local
├── next.config.js
├── package.json
├── tailwind.config.js
└── tsconfig.jsonComponentes Principales
ConversationUI
Componente que proporciona una interfaz de chat para mantener conversaciones con modelos de IA sobre sitios web.
<ConversationUI
provider="anthropic"
modelId="claude-3-5-sonnet-20240620"
includeScreenshot={true}
siteUrl="https://example.com"
/>StructuredAnalysis
Componente que muestra el análisis estructurado de un sitio web, organizando la información en bloques funcionales.
<StructuredAnalysis analysisData={structuredData} />Utilidades
El proyecto incluye varias utilidades para facilitar el desarrollo:
dev-helpers.ts
Funciones auxiliares para desarrollo y depuración:
// Formatear un objeto para la consola
prettyLog(data, 'User Data');
// Medir tiempo de ejecución
const result = await measureTime(
async () => await fetchData(),
'Fetch Data'
);
// Validar datos de análisis
const validation = validateAnalysisData(analysisData);
if (!validation.valid) {
console.error(`Errores: ${validation.errors.join(', ')}`);
}
// Crear un logger con prefijo
const logger = createPrefixedLogger('AnalyzerService');
logger.info('Iniciando análisis');api-utils.ts
Funciones para manejar llamadas a la API y procesar respuestas:
// Preparar datos para análisis
const { screenshotData, processedImage, htmlContent } =
await prepareAnalysisData(request);
// Llamar a la API con un mensaje
const response = await callApiWithMessage(
messages,
'anthropic',
'claude-3-5-sonnet-20240620'
);
// Manejar respuestas JSON incompletas
const processedResponse = await handleIncompleteJsonResponse(
response,
messages,
'anthropic',
'claude-3-5-sonnet-20240620'
);message-utils.ts
Funciones para crear mensajes para las APIs de IA:
// Crear mensaje con imagen
const message = createVisionMessage(
'Analiza esta página web',
screenshotData,
systemPrompt,
'anthropic'
);
// Crear mensaje básico
const message = createBasicMessage(
'Analiza esta URL: https://example.com',
systemPrompt
);Contribución
Las contribuciones son bienvenidas. Por favor, sigue estos pasos:
- Haz fork del repositorio
- Crea una rama para tu característica (
git checkout -b feature/amazing-feature) - Haz commit de tus cambios (
git commit -m 'Add some amazing feature') - Haz push a la rama (
git push origin feature/amazing-feature) - Abre un Pull Request
Licencia
Este proyecto está licenciado bajo la Licencia MIT - ver el archivo LICENSE para más detalles.
Contacto
Tu Nombre - @tu_twitter - email@example.com
Enlace del proyecto: https://github.com/tu-usuario/site-analyzer
Documentación de la API
Site Analyzer proporciona una API completa para analizar sitios web y obtener información valiosa sobre su estructura, contenido, diseño y experiencia de usuario.
Acceso a la Documentación
Puedes acceder a la documentación de la API de las siguientes maneras:
-
Documentación Interactiva: Visita
/api/docsen el navegador para acceder a la documentación interactiva con un playground para probar los endpoints. -
Archivo API.md: Consulta el archivo API.md para una referencia completa de todos los endpoints, parámetros, ejemplos y guías de integración.
-
Información por Endpoint: Realiza una solicitud GET a cualquier endpoint de la API para obtener información básica sobre cómo usarlo:
GET /api/analyzeGET /api/site/analyzeGET /api/aiGET /api/conversationGET /api/docs
Endpoints Principales
- POST /api/analyze: Análisis básico de un sitio web
- POST /api/site/analyze: Análisis avanzado con opciones personalizables
- POST /api/ai: Interacción directa con modelos de IA
- POST /api/conversation: Conversación contextual sobre un sitio web
Ejemplo de Uso
// Ejemplo de análisis básico
async function analyzeSite(url) {
try {
const response = await fetch('/api/analyze', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({ url }),
});
if (!response.ok) {
throw new Error(`Error: ${response.status}`);
}
const data = await response.json();
return data;
} catch (error) {
console.error('Error al analizar el sitio:', error);
throw error;
}
}