Spaces:
Sleeping
Sleeping
Upload 2 files
Browse files- app.py +167 -0
- requirements.txt +4 -0
app.py
ADDED
|
@@ -0,0 +1,167 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from fastapi import FastAPI, Request
|
| 2 |
+
from fastapi.responses import HTMLResponse
|
| 3 |
+
from fastapi.staticfiles import StaticFiles
|
| 4 |
+
from fastapi.templating import Jinja2Templates
|
| 5 |
+
import uvicorn
|
| 6 |
+
import os
|
| 7 |
+
|
| 8 |
+
app = FastAPI()
|
| 9 |
+
|
| 10 |
+
# Mount static files
|
| 11 |
+
app.mount("/static", StaticFiles(directory="static"), name="static")
|
| 12 |
+
|
| 13 |
+
# Templates
|
| 14 |
+
templates = Jinja2Templates(directory="templates")
|
| 15 |
+
|
| 16 |
+
# Portfolio Data
|
| 17 |
+
portfolio_data = {
|
| 18 |
+
"name": "Tran Bao Ngoc",
|
| 19 |
+
"tagline": "Passionate about AI, Machine Learning, and Building Scalable Solutions",
|
| 20 |
+
"location": "Hanoi, Vietnam",
|
| 21 |
+
"email": "trbaongoc17@gmail.com",
|
| 22 |
+
"github": "https://github.com/TrBn17",
|
| 23 |
+
"huggingface": "https://huggingface.co/NGOC1712",
|
| 24 |
+
|
| 25 |
+
"about": (
|
| 26 |
+
"I have almost 2 years of learning, research, and development in the AI industry. "
|
| 27 |
+
"I've joined many AI projects across different domains: Healthcare, Banking, Technical Operations. "
|
| 28 |
+
"I'm looking for an environment where I can grow my technical and soft skills, "
|
| 29 |
+
"while committing long-term and contributing to the company in this AI era."
|
| 30 |
+
),
|
| 31 |
+
|
| 32 |
+
"tech_stack": {
|
| 33 |
+
"ai_engines": [
|
| 34 |
+
{"name": "TensorFlow", "level": 85, "icon": "devicon-tensorflow-original colored"},
|
| 35 |
+
{"name": "PyTorch", "level": 90, "icon": "devicon-pytorch-original colored"},
|
| 36 |
+
{"name": "Hugging Face", "level": 75, "icon": "custom-icon", "icon_src": "/static/icons/huggingface.png"},
|
| 37 |
+
{"name": "OpenAI", "level": 80, "icon": "custom-icon", "icon_src": "/static/icons/openai.png"},
|
| 38 |
+
{"name": "Langchain", "level": 85, "icon": "custom-icon", "icon_src": "/static/icons/langchain.png"}
|
| 39 |
+
],
|
| 40 |
+
"programming_languages": [
|
| 41 |
+
{ "name": "Python", "level": 95, "icon": "devicon-python-plain colored" },
|
| 42 |
+
{"name": "JavaScript", "level": 65, "icon": "devicon-javascript-plain colored"},
|
| 43 |
+
{"name": "HTML/CSS", "level": 70, "icon": "devicon-html5-plain colored"}
|
| 44 |
+
],
|
| 45 |
+
"databases": [
|
| 46 |
+
{"name": "PostgreSQL", "level": 95, "icon": "devicon-postgresql-plain colored"},
|
| 47 |
+
{"name": "Redis", "level": 60, "icon": "devicon-redis-plain colored"},
|
| 48 |
+
{"name": "SQL", "level": 75, "icon": "devicon-sqldeveloper-plain colored"},
|
| 49 |
+
{"name": "MinIO", "level": 85, "icon": "custom-icon", "icon_src": "/static/icons/minio.png"},
|
| 50 |
+
{"name": "MongoDB", "level": 50, "icon": "devicon-mongodb-plain colored"}
|
| 51 |
+
],
|
| 52 |
+
"devops_tools": [
|
| 53 |
+
{"name": "Docker", "level": 95, "icon": "devicon-docker-plain colored"},
|
| 54 |
+
{"name": "Grafana", "level": 65, "icon": "devicon-grafana-plain colored"},
|
| 55 |
+
{"name": "Prometheus", "level": 55, "icon": "fas fa-fire"},
|
| 56 |
+
{"name": "Loki", "level": 50, "icon": "custom-icon", "icon_src": "/static/icons/Loki.png"},
|
| 57 |
+
{"name": "Kubernetes", "level": 45, "icon": "devicon-kubernetes-plain colored"}
|
| 58 |
+
],
|
| 59 |
+
"frameworks": [
|
| 60 |
+
{"name": "FastAPI", "level": 90, "icon": "devicon-fastapi-plain colored"},
|
| 61 |
+
{"name": "Flask", "level": 70, "icon": "devicon-flask-original colored"},
|
| 62 |
+
{"name": "Django", "level": 60, "icon": "devicon-django-plain colored"}
|
| 63 |
+
]
|
| 64 |
+
},
|
| 65 |
+
|
| 66 |
+
"experience": [
|
| 67 |
+
{
|
| 68 |
+
"title": "AI Engineer",
|
| 69 |
+
"company": "FOXAi Joint Stock Company",
|
| 70 |
+
"period": "May 2024 - Present",
|
| 71 |
+
"description": [
|
| 72 |
+
"Developed scalable backend services using Python, FastAPI",
|
| 73 |
+
"Collaborated with business analysts and product managers",
|
| 74 |
+
"Built demo services with Hugging Face for clients/internal showcases",
|
| 75 |
+
"Created technical documentation and system architecture diagrams",
|
| 76 |
+
"Worked on low-resource languages (e.g., Lao) with limited training data"
|
| 77 |
+
]
|
| 78 |
+
},
|
| 79 |
+
{
|
| 80 |
+
"title": "AI Intern",
|
| 81 |
+
"company": "Wisdom Brain",
|
| 82 |
+
"period": "Sep 2023 - Feb 2024",
|
| 83 |
+
"description": [
|
| 84 |
+
"Researched layered architectures in reinforcement learning",
|
| 85 |
+
"Gained hands-on experience with deep learning models"
|
| 86 |
+
]
|
| 87 |
+
}
|
| 88 |
+
],
|
| 89 |
+
|
| 90 |
+
"projects": [
|
| 91 |
+
{
|
| 92 |
+
"name": "AI-Powered Chatbot System",
|
| 93 |
+
"description": "Developed chatbot integrating OpenAI, Deepseek, Gemini APIs",
|
| 94 |
+
"languages": ["Python"],
|
| 95 |
+
"technologies": ["FastAPI", "OpenAI API", "Deepseek", "Gemini", "Langchain", "PostgreSQL", "Redis", "Docker", "MinIO"],
|
| 96 |
+
"role": "Core Developer",
|
| 97 |
+
"highlights": [
|
| 98 |
+
"Multi-model integration",
|
| 99 |
+
"Scalable architecture",
|
| 100 |
+
"Real-time responses",
|
| 101 |
+
"Streaming support"
|
| 102 |
+
]
|
| 103 |
+
},
|
| 104 |
+
{
|
| 105 |
+
"name": "eKYC Identity Verification",
|
| 106 |
+
"description": "Built eKYC system for ID/passport verification",
|
| 107 |
+
"languages": ["Python", "JavaScript", "HTML", "CSS"],
|
| 108 |
+
"technologies": ["Computer Vision", "OCR", "Deep Learning", "FastAPI", "Docker", "PostgreSQL", "Redis", "MinIO", "Gemini API"],
|
| 109 |
+
"role": "Core Developer",
|
| 110 |
+
"highlights": [
|
| 111 |
+
"High accuracy OCR",
|
| 112 |
+
"Real-time processing",
|
| 113 |
+
"Security compliance"
|
| 114 |
+
]
|
| 115 |
+
},
|
| 116 |
+
{
|
| 117 |
+
"name": "Document Processing System",
|
| 118 |
+
"description": "Developed RAG system for various document types",
|
| 119 |
+
"languages": ["Python"],
|
| 120 |
+
"technologies": ["Qdrant", "Docling", "FastAPI", "Docker", "PostgreSQL", "Pymupdf", "Langchain", "OpenAI", "Hugging Face"],
|
| 121 |
+
"role": "Core Developer",
|
| 122 |
+
"highlights": [
|
| 123 |
+
"Multi-language support",
|
| 124 |
+
"High accuracy",
|
| 125 |
+
"Fast processing"
|
| 126 |
+
]
|
| 127 |
+
},
|
| 128 |
+
{
|
| 129 |
+
"name": "Banking ML Solution",
|
| 130 |
+
"description": "Applied ML algorithms to banking challenges",
|
| 131 |
+
"languages": ["Python"],
|
| 132 |
+
"technologies": ["Scikit-learn", "Pandas", "NumPy", "Docker"],
|
| 133 |
+
"role": "Technical Support",
|
| 134 |
+
"highlights": [
|
| 135 |
+
"Risk assessment",
|
| 136 |
+
"Fraud detection",
|
| 137 |
+
"Customer segmentation"
|
| 138 |
+
]
|
| 139 |
+
}
|
| 140 |
+
],
|
| 141 |
+
|
| 142 |
+
"education": {
|
| 143 |
+
"degree": "Bachelor of Business Data Analytics",
|
| 144 |
+
"school": "International School - VNU",
|
| 145 |
+
"coursework": ["Business Analysis", "Data Analysis", "Machine Learning", "Deep Learning"]
|
| 146 |
+
},
|
| 147 |
+
|
| 148 |
+
"certifications": [
|
| 149 |
+
"AI Ethics Certificate",
|
| 150 |
+
"Google Data Analytics Professional Certificate",
|
| 151 |
+
"B2 VSTEP Certificate"
|
| 152 |
+
]
|
| 153 |
+
}
|
| 154 |
+
|
| 155 |
+
|
| 156 |
+
@app.get("/", response_class=HTMLResponse)
|
| 157 |
+
async def index(request: Request):
|
| 158 |
+
return templates.TemplateResponse("index.html", {"request": request, "data": portfolio_data})
|
| 159 |
+
|
| 160 |
+
|
| 161 |
+
@app.get("/api/data")
|
| 162 |
+
async def get_data():
|
| 163 |
+
return portfolio_data
|
| 164 |
+
|
| 165 |
+
|
| 166 |
+
if __name__ == "__main__":
|
| 167 |
+
uvicorn.run("app:app", host="0.0.0.0", port=8000, reload=True)
|
requirements.txt
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
fastapi>=0.104.0
|
| 2 |
+
uvicorn[standard]>=0.24.0
|
| 3 |
+
jinja2>=3.1.0
|
| 4 |
+
python-multipart>=0.0.6
|