fastAPI-cv es una API asíncrona de alto rendimiento construida con Python y FastAPI. Aprovecha un modelo de IA (GPT de OpenAI) para extraer inteligentemente información estructurada de múltiples formatos de archivo de CV (.pdf, .docx, .png, .jpg).
La API está diseñada para flujos de trabajo de desarrollo modernos, con un sistema basado en webhooks. En lugar de esperar el procesamiento, usted envía un CV y recibe un acuse de recibo inmediato. El trabajo pesado se realiza en segundo plano, y el resultado JSON final se envía a su URL de callback especificada.
El núcleo de este proyecto es su arquitectura no bloqueante, la cual ha sido rigurosamente depurada y confirmada como robusta bajo carga concurrente:
- Autenticación: Un cliente realiza una petición a un endpoint específico de usuario (
/cv/{endpoint_id}), autenticándose con un tokenBearer. - Respuesta Inmediata: La API valida la petición, guarda el archivo y responde inmediatamente con un estado
202 Acceptedy unrequest_id. - Procesamiento en Segundo Plano: Se crea una tarea en segundo plano para manejar el procesamiento del CV:
- Extracción de Texto: Extrae el texto sin formato del archivo (usando OCR para imágenes).
- Análisis con IA: Envía el texto a un modelo de OpenAI (gpt-4o-mini) para extraer información como nombre, datos de contacto, experiencia y habilidades, basándose en un modelo Pydantic estructurado.
- Registro en Base de Datos: Todo el proceso, incluyendo el resultado final o cualquier error, se registra en una base de datos Supabase.
- Notificación por Webhook: Una vez completado el procesamiento (ya sea con éxito o con un error), la API envía una petición
POSTcon los resultados en formato JSON a la URL de callback asociada con elendpoint_id.
Este diseño asegura que la aplicación cliente permanezca responsiva y es ideal para la integración en sistemas más grandes y basados en eventos.
- Backend: FastAPI
- Servidor ASGI: Uvicorn
- Extracción Potenciada por IA: OpenAI GPT-4o-mini
- Base de Datos: Supabase (PostgreSQL)
- Cliente HTTP Asíncrono: HTTPX (para enviar webhooks)
- Validación de Datos: Pydantic
- Procesamiento de Archivos:
- PDF: PyMuPDF
- DOCX: python-docx
- Imágenes (OCR): Pillow & Pytesseract
Esta sección detalla cómo interactuar con la API fastAPI-cv para integrar sus funcionalidades en tus aplicaciones.
Todas las peticiones a la API deben estar autenticadas. Para ello, necesitas una API Key válida que debes incluir en el encabezado Authorization de cada petición.
El formato del encabezado de autorización debe ser Bearer TU_API_KEY.
Ejemplo de encabezado:
Authorization: Bearer 4a868774-7654-4106-b1b6-97e05d5c09be
El proceso para procesar un CV consta de dos pasos asíncronos:
- Envío del CV: Realizas una petición
POSTcon el archivo del CV. La API te confirmará la recepción inmediatamente. - Recepción de Resultados (Webhook): Una vez finalizado el procesamiento, la API te enviará los datos extraídos a una URL de webhook previamente configurada por ti.
Para iniciar el procesamiento, envía el archivo del CV al siguiente endpoint:
POST /cv/{endpoint_id}
endpoint_id(string, requerido): El UUID único que identifica tu endpoint configurado. La API usará este ID para saber a qué URL de webhook debe enviar los resultados del procesamiento.
Authorization(string): Tu clave de API con el prefijoBearer.accept: application/json(string): Indica que esperas una respuesta JSON.
La petición debe ser de tipo multipart/form-data y contener un único campo:
file(file, requerido): El archivo del CV que deseas procesar. Formatos soportados: PDF, DOCX, PNG, JPG.
Si la petición es aceptada y el CV se pone en cola para procesamiento, la API responderá inmediatamente con un código 202 Accepted.
Cuerpo de la respuesta:
{
"message": "CV recibido y en proceso.",
"request_id": "a1b2c3d4-e5f6-7890-1234-567890abcdef"
}request_id: Un identificador único para esta solicitud específica. Puedes usarlo para seguimiento o auditoría interna.
Una vez que el procesamiento del CV ha finalizado (ya sea con éxito o con un error), la API enviará una petición POST a la URL de webhook que tienes configurada para el endpoint_id utilizado en el envío inicial.
El cuerpo de la petición POST que recibirás en tu webhook será un JSON con la siguiente estructura:
Ejemplo de Payload si el procesamiento fue exitoso (status: "completed"):
{
"request_id": "a1b2c3d4-e5f6-7890-1234-567890abcdef",
"status": "completed",
"data": {
"contact_info": {
"name": "Marcelo Rodriguez",
"email": "marcelo.rodriguez@email.com",
"phone": "+34 123 456 789"
},
"summary": "Desarrollador de software con más de 5 años de experiencia en Python y desarrollo de APIs, especializado en soluciones backend escalables.",
"experience": [
{
"title": "Backend Developer",
"company": "Tech Solutions S.L.",
"period": "Enero 2020 - Presente",
"description": "Desarrollo y mantenimiento de microservicios con FastAPI y Django. Implementación de pipelines CI/CD con GitLab."
}
],
"education": [
{
"institution": "Universidad Politécnica de Madrid",
"degree": "Grado en Ingeniería de Software",
"period": "2015 - 2019"
}
],
"skills": ["Python", "FastAPI", "Docker", "PostgreSQL", "Git"]
},
"error": null
}Ejemplo de Payload si el procesamiento falló (status: "failed"):
{
"request_id": "a1b2c3d4-e5f6-7890-1234-567890abcdef",
"status": "failed",
"data": null,
"error": "No se pudo extraer el contenido del archivo. Formato no compatible o archivo corrupto."
}request_id: El mismo identificador de solicitud que se te proporcionó al enviar el CV.status: Indica el estado final del procesamiento (completedofailed).data: Contiene el objeto JSON estructurado del CV sistatusescompleted. Seránullsi falló.error: Contiene un mensaje de error sistatusesfailed. Seránullsi fue exitoso.
Aquí tienes un ejemplo de cómo enviar un CV usando la herramienta de línea de comandos cURL. Asegúrate de reemplazar los valores de marcador de posición:
curl -X 'POST' \
'https://tu-dominio-api.com/cv/TU_ENDPOINT_ID' \
-H 'accept: application/json' \
-H 'Authorization: Bearer TU_API_KEY' \
-F 'file=@/ruta/completa/a/tu/cv.pdf'Parámetros a reemplazar:
https://tu-dominio-api.com: La URL base de tu instancia de la API (ej. http://127.0.0.1:8000si la corres localmente, o tu URL dengrok).TU_ENDPOINT_ID: El UUID de tu endpoint configurado (ej.d3049ccd-ede3-40b0-a475-d8f620e4b495).TU_API_KEY: Tu clave de API generada (ej. 4a868774-7654-4106-b1b6-97e05d5c09be)./ruta/completa/a/tu/cv.pdf: La ruta completa a tu archivo CV local.
Esta sección proporciona instrucciones para configurar y ejecutar el proyecto fastAPI-cv en tu entorno de desarrollo local.
- Python 3.9+
- Motor Tesseract OCR: Necesario para procesar CVs en formatos de imagen.
- Ubuntu/Debian:
sudo apt update && sudo apt install tesseract-ocr - macOS (Homebrew):
brew install tesseract - Windows: Descargar e instalar desde Tesseract at UB Mannheim. Asegúrate de añadir
tesseract.exea tu PATH.
- Ubuntu/Debian:
- Proyecto Supabase: Un proyecto Supabase configurado con el esquema de base de datos requerido (consulta
fastAPI-Apuntes/4_Data_Model_and_Auth.mdpara detalles del esquema). - Clave API de OpenAI: Una clave API de OpenAI activa.
-
Clona el repositorio:
git clone https://github.com/EricPeD/fastAPI-cv.git cd fastAPI-cv -
Crea y activa un entorno virtual:
python3 -m venv venv source venv/bin/activate # En Windows, usa: venv\Scripts\activate
-
Instala las dependencias:
pip install -r requirements.txt
-
Configura las variables de entorno: Crea un archivo
.enven la raíz del proyecto y añade las siguientes claves. Puedes usar el.env.examplecomo plantilla y rellenarlo con tus credenciales:# .env OPENAI_API_KEY="sk-..." SUPABASE_URL="https://<your-project-ref>.supabase.co" SUPABASE_KEY="your-supabase-anon-key"
Para probar la API localmente, tu base de datos de Supabase debe contener datos de usuarios, API Keys y configuraciones de endpoints.
- Usuarios: Asegúrate de tener al menos un registro en la tabla
public.users. - API Keys: Inserta manualmente un registro en
public.api_keyso usa un sistema externo para generar una API Key asociada a tu usuario. Guarda la clave completa (ID.HASH), la necesitarás para las pruebas de API. - Endpoints: Inserta al menos un registro en
public.endpoints.- Dale un
namey asócialo a tuid_user. - En el campo
info(JSONB), asegúrate de tener una clavecallbackURLválida (ej.https://webhook.site/your-unique-url). - Copia el
id(UUID) de este endpoint. Lo necesitarás para las peticiones de prueba.
- Dale un
- Scripts de Ayuda: Para facilitar la creación de estos datos durante el desarrollo sin acceder directamente al dashboard de Supabase, puedes consultar la documentación interna en
fastAPI-Apuntes/4_Data_Model_and_Auth.mdpara más detalles sobre cómo modelar los datos necesarios y cómo se generan las API keys de forma segura.
-
Inicia la API:
uvicorn src.main:app --reload
La API estará disponible en
http://127.0.0.1:8000. -
Acceso a la Documentación Interactiva: Abre tu navegador y ve a
http://127.0.0.1:8000/docspara acceder a la interfaz de Swagger UI, donde podrás explorar todos los endpoints disponibles.
Tras un riguroso proceso de refactorización y depuración, el sistema ha alcanzado un alto nivel de funcionalidad y fiabilidad:
- Resolución Completa de Errores Críticos: Se identificaron y corrigieron múltiples
TypeErrors relacionados con la asincronía del clientesupabase-py,NameErrors, problemas de formato de API Key y errores de validación Pydantic (ValidationError) en la integración con OpenAI. - Manejo Robusto de
public.endpoints: Se diagnosticó y resolvió el problema de404 Not Foundque surgía de una tabla deendpointsvacía, implementando un flujo para asegurar la existencia de configuraciones de endpoint. - Flujo Operativo End-to-End: La tubería completa de procesamiento de CVs funciona correctamente, desde la autenticación y validación del endpoint, hasta la extracción de texto (incluyendo OCR), la integración con OpenAI para datos estructurados, el registro en Supabase, la notificación por webhook y la limpieza de archivos temporales.
- Pruebas de Carga Concurrente Exitosas: El sistema ha sido probado con éxito enviando múltiples archivos PDF concurrentemente, demostrando su capacidad para manejar cargas de trabajo asíncronas de manera eficiente.
- Manejo Adecuado de Errores: Se verifica el correcto manejo de errores para archivos no soportados (ej.
.md), actualizando el estado de la solicitud a 'failed' y enviando una notificación detallada al webhook.
El proyecto fastAPI-cv está ahora en un estado estable y preparado para futuras expansiones.