FastAPI + Google Gemini + sistema de conocimiento JSON + detección de intenciones
API: https://portafolio-ia-4r2q.onrender.com/
Swagger: https://portafolio-ia-4r2q.onrender.com/docs
Repositorio: https://github.com/Ezequie1Sc/Portafolio-IA
flowchart LR U["👤 Usuario"] --> F["🖥️ Frontend"] F -->|POST /chat| C["💬 ChatService"]
C --> I["🧠 IntentService"]
C --> K["📚 Knowledge Services"]
C --> P["🎭 PersonalityService"]
K --> K1["👤 Profile"]
K --> K2["💻 GitHub"]
K --> K3["🛠️ Skills"]
K --> K4["🚀 Projects"]
K --> K5["📜 Certifications"]
K --> K6["🎓 Education"]
K --> K7["💼 Experience"]
K --> K8["📞 Contact"]
I --> CB["🧩 ContextBuilder"]
K --> CB
P --> CB
CB --> G["✨ GeminiService"]
G --> AI["🤖 Google Gemini"]
AI --> R["📦 response + intent"]
R --> F
F --> CARD["🃏 Card correspondiente"]
---
# 📌 ¿Qué es este proyecto?
**Portfolio IA API** es el backend de un portafolio personal interactivo que incorpora un asistente de inteligencia artificial.
La API fue construida con **FastAPI** y utiliza **Google Gemini** para generar respuestas contextualizadas sobre la información profesional del propietario del portafolio.
El sistema no depende únicamente de una conversación libre con el modelo. Antes de generar una respuesta:
1. Detecta qué está preguntando el usuario.
2. Identifica una **intención**.
3. Selecciona el servicio de conocimiento correspondiente.
4. Obtiene información estructurada desde archivos JSON.
5. Obtiene la personalidad y reglas del asistente.
6. Construye un contexto específico.
7. Envía ese contexto a Gemini.
8. Devuelve la respuesta junto con la intención detectada.
9. El frontend utiliza la intención para mostrar la **Card correspondiente**.
---
# ✨ Características principales
- 🤖 Integración con Google Gemini.
- 💬 Endpoint conversacional `/chat`.
- 🧠 Sistema de detección de intenciones.
- 📚 Sistema de conocimiento basado en JSON.
- 👤 Información profesional.
- 💻 Información de GitHub.
- 🛠️ Habilidades y tecnologías.
- 🚀 Sistema de búsqueda de proyectos.
- 📜 Sistema de certificaciones.
- 🎓 Educación.
- 💼 Experiencia.
- 📞 Contacto.
- 🎭 Personalidad configurable del asistente.
- 🧩 Construcción dinámica de contexto.
- 🃏 Integración con Cards del frontend.
- 🌐 CORS para comunicación con el frontend.
- 📖 Swagger UI y OpenAPI.
- ☁️ Despliegue en Render.
---
# 🧠 Arquitectura del sistema
```mermaid
flowchart TD
A["👤 Usuario"] --> B["🖥️ Frontend"]
B --> C["POST /chat"]
C --> D["ChatService"]
D --> E["IntentService"]
D --> F["Knowledge Services"]
D --> G["PersonalityService"]
F --> H["ContextBuilder"]
G --> H
E --> H
H --> I["GeminiService"]
I --> J["Google Gemini"]
J --> K["Respuesta generada"]
K --> L["ChatResponse"]
L --> M["response"]
L --> N["intent"]
M --> B
N --> B
B --> O["🃏 Renderizado de Card"]
Supongamos que el usuario pregunta:
¿Cuáles son mis proyectos?
El flujo es:
Usuario
↓
Frontend
↓
POST /chat
↓
ChatService
↓
IntentService
↓
project
↓
ProjectService
↓
data/projects/index.json
↓
Proyecto(s) correspondiente(s)
↓
ContextBuilder
↓
GeminiService
↓
Google Gemini
↓
response + intent
↓
Frontend
↓
ProjectCard
El backend devuelve una estructura similar a:
{
"response": "Estos son algunos de los proyectos desarrollados...",
"intent": "project"
}El frontend utiliza intent para determinar qué componente visual debe mostrar.
El backend utiliza ChatIntent para clasificar las consultas.
| Intent | Función |
|---|---|
general |
Conversación general |
profile |
Perfil profesional |
project |
Proyectos |
contact |
Contacto |
education |
Formación académica |
experience |
Experiencia profesional |
skill |
Habilidades y tecnologías |
certification |
Certificaciones |
github |
Perfil de GitHub |
unknown |
Intención no reconocida |
Una parte importante de la arquitectura es separar la información de su representación visual.
El backend devuelve:
{
"response": "🚀 Estas son las tecnologías y herramientas con las que trabajo actualmente.",
"intent": "skill"
}El frontend recibe skill y muestra:
SkillsCard
La relación actual es:
| Intent | Card |
|---|---|
profile |
ProfileCard |
github |
GithubCard |
skill |
SkillsCard |
project |
ProjectCard |
certification |
CertificationCard |
Esto permite que Gemini no tenga que generar HTML ni conocer la interfaz visual.
El backend únicamente proporciona:
respuesta + intención
y el frontend decide cómo representarla.
La información del portafolio se encuentra separada de la lógica de programación.
data/
│
├── profile.json
├── github.json
├── skills.json
├── certifications.json
├── contact.json
├── education.json
├── experience.json
├── personality.json
├── metadata.json
│
└── projects/
├── index.json
├── skillmatch.json
├── portfolio-web.json
├── portfolio-demo.json
├── restaurant-website.json
├── climatizacion-web.json
├── atmosfera.json
├── celulas-plenum.json
├── kermes-rockera.json
├── javascript-laboratory.json
├── sigel-mobile.json
├── invernadero-mobile.json
├── barber-shop-mobile.json
├── videojuego.json
├── api-sigel.json
├── api-invernadero.json
├── api-barber.json
├── barberia-desktop.json
├── control-escolar.json
└── inventario-desktop.json
Esto permite actualizar la información del portafolio sin tener que modificar el código principal.
Los proyectos cuentan con un índice:
data/projects/index.json
Cada proyecto contiene información como:
{
"id": "skillmatch",
"name": "SkillMatch",
"file": "skillmatch.json",
"category": "web",
"featured": true,
"keywords": [
"skillmatch",
"ia",
"inteligencia artificial",
"gemini",
"react",
"fastapi"
]
}ProjectService realiza una búsqueda basada en puntuación.
Puede considerar:
- Nombre.
- ID.
- Categoría.
- Keywords.
- Proyectos destacados.
- Tipo de consulta.
Ejemplos:
¿Cuáles son mis proyectos?
¿Qué proyectos has desarrollado?
¿Qué aplicaciones has hecho?
¿Qué trabajos has realizado?
Cuando la consulta es general, el servicio puede devolver los proyectos marcados como:
"featured": trueEjemplos:
Háblame de SkillMatch.
¿Qué proyectos tienes con React?
¿Qué proyectos tienes con Flutter?
Háblame del proyecto SIGEL.
El servicio busca coincidencias específicas y carga los archivos correspondientes.
Las certificaciones se almacenan en:
data/certifications.json
Cada certificación contiene información como:
Nombre
Institución
Año
Categoría
Descripción
Topics
Skills
Esto permite realizar preguntas como:
¿Qué certificaciones tienes?
¿Qué certificaciones tienes de Python?
¿Qué aprendiste en tus certificaciones?
¿Qué habilidades obtuviste?
¿Qué certificaciones tienes de Inteligencia Artificial?
El CertificationService se encarga de obtener la información de certificaciones disponible para el contexto de Gemini.
La integración con Gemini está separada mediante:
app/services/ai/gemini_service.py
El modelo no recibe únicamente la pregunta.
Primero se genera un contexto mediante ContextBuilder.
El contexto incluye:
Identidad del asistente
Objetivo
Tono
Estilo
Longitud de respuesta
Reglas
Intención
Pregunta
Información disponible
Después:
ContextBuilder
↓
GeminiService
↓
Google Gemini
↓
Respuesta
Esto permite controlar el comportamiento del asistente y reducir respuestas inventadas.
ChatService es el orquestador principal.
Se encarga de coordinar:
IntentService
ContextBuilder
GeminiService
ProfileService
ContactService
EducationService
ExperienceService
ProjectService
SkillService
CertificationService
PersonalityService
GithubService
Su flujo conceptual es:
flowchart TD
A["Pregunta"] --> B["IntentService"]
B --> C{"Intent"}
C -->|profile| D["ProfileService"]
C -->|github| E["GithubService"]
C -->|skill| F["SkillService"]
C -->|project| G["ProjectService"]
C -->|certification| H["CertificationService"]
C -->|contact| I["ContactService"]
C -->|education| J["EducationService"]
C -->|experience| K["ExperienceService"]
C -->|general / unknown| L["Contexto general"]
D --> M["ContextBuilder"]
E --> M
F --> M
G --> M
H --> M
I --> M
J --> M
K --> M
L --> M
M --> N["GeminiService"]
N --> O["Google Gemini"]
O --> P["response + intent"]
Endpoint principal del asistente.
{
"message": "¿Qué certificaciones tienes?"
}{
"response": "📜 Estas son algunas de las certificaciones disponibles...",
"intent": "certification"
}Obtiene la información del perfil.
Obtiene las habilidades y tecnologías.
Obtiene la información de GitHub.
Endpoint principal.
Respuesta:
{
"message": "Portfolio IA API",
"status": "running"
}Comprueba el estado del servidor.
Prueba la conexión con Google Gemini.
Lista los modelos disponibles para la API configurada.
FastAPI genera automáticamente la documentación de la API.
http://localhost:8000/docs
https://portafolio-ia-4r2q.onrender.com/docs
La documentación permite:
- Consultar endpoints.
- Ver schemas.
- Probar requests.
- Revisar responses.
- Explorar la especificación OpenAPI.
app/
│
├── api/
│ ├── __init__.py
│ ├── chat.py
│ └── knowledge.py
│
├── core/
│ ├── config.py
│ └── security.py
│
├── data/
│ ├── projects/
│ ├── certifications.json
│ ├── contact.json
│ ├── education.json
│ ├── experience.json
│ ├── github.json
│ ├── metadata.json
│ ├── personality.json
│ ├── profile.json
│ └── skills.json
│
├── models/
│ └── chat_intent.py
│
├── prompts/
│ └── ...
│
├── schemas/
│ └── chat.py
│
├── services/
│ ├── ai/
│ │ ├── context_builder.py
│ │ └── gemini_service.py
│ │
│ ├── chat/
│ │ └── chat_service.py
│ │
│ ├── intent/
│ │ └── intent_service.py
│ │
│ └── knowledge/
│ ├── profile_service.py
│ ├── contact_service.py
│ ├── education_service.py
│ ├── experience_service.py
│ ├── project_service.py
│ ├── skill_service.py
│ ├── certification_service.py
│ ├── personality_service.py
│ └── github_service.py
│
├── utils/
│ └── ...
│
└── main.py
El proyecto utiliza variables de entorno para proteger la configuración sensible.
Ejemplo:
GEMINI_API_KEY=tu_api_key
APP_NAME=Portfolio IA API
API_VERSION=1.0.0.env a GitHub.
Agregar:
.env
.venv/
__pycache__/
*.pycEn Render, las variables se configuran directamente en:
Dashboard
→ Service
→ Environment
→ Environment Variables
git clone https://github.com/Ezequie1Sc/Portafolio-IA.git
cd Portafolio-IApython -m venv .venv
.venv\Scripts\activatepython -m venv .venv
source .venv/bin/activatepip install -r requirements.txtGEMINI_API_KEY=tu_api_key
APP_NAME=Portfolio IA API
API_VERSION=1.0.0uvicorn app.main:app --reloadServidor:
http://localhost:8000
Swagger:
http://localhost:8000/docs
El backend está preparado para ejecutarse como Web Service.
pip install -r requirements.txtuvicorn app.main:app --host 0.0.0.0 --port $PORTRender proporciona automáticamente:
$PORT
La API desplegada está disponible en:
https://portafolio-ia-4r2q.onrender.com/
La configuración se encuentra en:
app/core/security.py
Permite que el frontend desplegado pueda comunicarse con la API.
Para producción se recomienda configurar únicamente los dominios reales del frontend en lugar de mantener:
allow_origins=["*"]cuando no sea necesario.
| Tecnología | Utilización |
|---|---|
| 🐍 Python | Lenguaje principal |
| ⚡ FastAPI | Framework backend |
| 🤖 Google Gemini | Generación de respuestas |
| 🔷 Google GenAI | SDK para Gemini |
| 📦 Pydantic | Schemas y validación |
| ⚙️ Pydantic Settings | Configuración |
| 🚀 Uvicorn | Servidor ASGI |
| 📄 JSON | Sistema de conocimiento |
| 📖 OpenAPI | Documentación |
| 🧪 Swagger UI | Pruebas de API |
| ☁️ Render | Despliegue |
- Las API Keys se manejan mediante variables de entorno.
.envno debe formar parte del repositorio.- CORS debe limitarse a los dominios necesarios.
- La información del portafolio se mantiene separada de la lógica.
- Gemini recibe contexto controlado por el backend.
- El sistema indica al modelo que no invente información cuando los datos no están disponibles.
- FastAPI
- API
/chat - Detección de intents
- ChatService
- ContextBuilder
- GeminiService
- Sistema de conocimiento
- Perfil
- GitHub
- Skills
- Projects
- Certifications
- Education
- Experience
- Contact
- Personality
- Cards mediante
intent - Swagger
- OpenAPI
- CORS
- Deploy en Render
- Streaming de respuestas.
- Historial persistente.
- Tests automatizados.
- Mejoras en detección de intenciones.
- Observabilidad y logging.
- Optimización del sistema de conocimiento.
| Recurso | Enlace |
|---|---|
| 🌐 API | https://portafolio-ia-4r2q.onrender.com/ |
| 📖 Swagger | https://portafolio-ia-4r2q.onrender.com/docs |
| 💻 GitHub | https://github.com/Ezequie1Sc/Portafolio-IA |
Desarrollador Full Stack
Proyecto desarrollado como parte de mi portafolio profesional para demostrar integración entre:
Frontend
+
FastAPI
+
Google Gemini
+
Sistema de conocimiento
+
Detección de intenciones
+
Componentes visuales dinámicos