Spaces:
Sleeping
Sleeping
Commit ·
478dec6
0
Parent(s):
clean init
Browse filesThis view is limited to 50 files because it contains too many changes. See raw diff
- .env.example +67 -0
- .gitattributes +35 -0
- .gitignore +7 -0
- .python-version +1 -0
- Dockerfile +35 -0
- README.md +163 -0
- allfiles.txt +945 -0
- config/__init__.py +0 -0
- config/config.yaml +18 -0
- config/constant.py +38 -0
- config/env_constant.py +5 -0
- config/get_config.py +19 -0
- externals/__init__.py +0 -0
- externals/databases/__init__.py +0 -0
- externals/databases/_pg_tables.py +104 -0
- externals/databases/_pgdb.py +56 -0
- externals/databases/database.py +57 -0
- externals/databases/pg_crud.py +473 -0
- externals/databases/pg_models.py +169 -0
- externals/databases/pg_schema_down.py +33 -0
- externals/databases/pg_schema_up.py +32 -0
- externals/databases/schemas/__init__.py +0 -0
- externals/databases/schemas/auth.py +10 -0
- externals/databases/schemas/knowledge.py +7 -0
- externals/databases/schemas/tenant.py +29 -0
- externals/databases/schemas/user.py +30 -0
- externals/observability/__init__.py +0 -0
- externals/observability/langfuse.py +16 -0
- externals/storages/azure_blob.py +183 -0
- externals/storages/azure_generate_sas.py +52 -0
- interfaces/__init__.py +0 -0
- interfaces/api/agentic.py +247 -0
- interfaces/api/deps.py +40 -0
- interfaces/api/file.py +107 -0
- interfaces/api/profile.py +62 -0
- interfaces/api/tenant.py +57 -0
- interfaces/api/user.py +104 -0
- interfaces/auth/auth.py +0 -0
- interfaces/handlers/agentic_handlers.py +0 -0
- interfaces/handlers/handlers.py +2 -0
- interfaces/handlers/knowledge_handlers.py +0 -0
- interfaces/middlewares/cors.py +8 -0
- main.py +39 -0
- models/security.py +10 -0
- playground/playground.py +7 -0
- pyproject.toml +31 -0
- requirements.txt +356 -0
- run.sh +5 -0
- services/agentic/agentic_setup.py +70 -0
- services/agentic/filter.py +48 -0
.env.example
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
## -------------------- DATABASE CONFIGURATION -------------------- ##
|
| 2 |
+
|
| 3 |
+
# Local, Postgresql
|
| 4 |
+
causalogy--pg--name = ""
|
| 5 |
+
causalogy--pg--user = ""
|
| 6 |
+
causalogy--pg--password = ""
|
| 7 |
+
causalogy--pg--host = ""
|
| 8 |
+
causalogy--pg--port = ""
|
| 9 |
+
|
| 10 |
+
# Local Postgresql
|
| 11 |
+
ss--postgresql--url = ""
|
| 12 |
+
|
| 13 |
+
|
| 14 |
+
## -------------------- OBSERVABILITY -------------------- ##
|
| 15 |
+
|
| 16 |
+
# Langfuse (dev)
|
| 17 |
+
ss--langfuse--secret-key = ""
|
| 18 |
+
ss--langfuse--public-key = ""
|
| 19 |
+
langfuse--host = ""
|
| 20 |
+
|
| 21 |
+
|
| 22 |
+
## -------------------- LLM CONFIGURATION -------------------- ##
|
| 23 |
+
|
| 24 |
+
# GEMINI MODEL
|
| 25 |
+
GOOGLE_API_KEY= ""
|
| 26 |
+
|
| 27 |
+
# GPT-4O-MINI
|
| 28 |
+
azureai--api-key--4omini = ""
|
| 29 |
+
azureai--endpoint--url--4omini = ""
|
| 30 |
+
azureai--deployment--name--4omini = ""
|
| 31 |
+
azureai--api--version--4omini = ""
|
| 32 |
+
|
| 33 |
+
# GPT-5-MINI
|
| 34 |
+
azureai--api-key--5mini = ""
|
| 35 |
+
azureai--endpoint--url--5mini = ""
|
| 36 |
+
azureai--deployment--name--5mini = ""
|
| 37 |
+
azureai--api--version--5mini = ""
|
| 38 |
+
|
| 39 |
+
# GPT-4O-2
|
| 40 |
+
azureai--api-key--4o-2 = ""
|
| 41 |
+
azureai--endpoint--url--4o-2 = ""
|
| 42 |
+
azureai--deployment--name--4o-2 = ""
|
| 43 |
+
azureai--api--version--4o-2 = ""
|
| 44 |
+
|
| 45 |
+
# Qdrant
|
| 46 |
+
ss--qdrant--api-key = ""
|
| 47 |
+
ss--qdrant--endpoint--url = ""
|
| 48 |
+
ss--qdrant--collection--name = ""
|
| 49 |
+
|
| 50 |
+
# Embedding Model
|
| 51 |
+
azureai--embedmodel--endpoint = ""
|
| 52 |
+
azureai--embedmodel--api-key = ""
|
| 53 |
+
azureai--embedmodel--api--version = ""
|
| 54 |
+
azureai--embedmodel--name = ""
|
| 55 |
+
|
| 56 |
+
# AZURE BLOB
|
| 57 |
+
azureai--search--sas = ""
|
| 58 |
+
azureai--container--endpoint = ""
|
| 59 |
+
azureai--container--name = ""
|
| 60 |
+
azureai--container--account--name = ""
|
| 61 |
+
azureai--max-file-size-mb = 5
|
| 62 |
+
|
| 63 |
+
|
| 64 |
+
# JWT
|
| 65 |
+
ss--jwt--secret-key = ""
|
| 66 |
+
ss--jwt--algorithm = ""
|
| 67 |
+
ss--jwt--access-token-expire-minutes = 60
|
.gitattributes
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
*.7z filter=lfs diff=lfs merge=lfs -text
|
| 2 |
+
*.arrow filter=lfs diff=lfs merge=lfs -text
|
| 3 |
+
*.bin filter=lfs diff=lfs merge=lfs -text
|
| 4 |
+
*.bz2 filter=lfs diff=lfs merge=lfs -text
|
| 5 |
+
*.ckpt filter=lfs diff=lfs merge=lfs -text
|
| 6 |
+
*.ftz filter=lfs diff=lfs merge=lfs -text
|
| 7 |
+
*.gz filter=lfs diff=lfs merge=lfs -text
|
| 8 |
+
*.h5 filter=lfs diff=lfs merge=lfs -text
|
| 9 |
+
*.joblib filter=lfs diff=lfs merge=lfs -text
|
| 10 |
+
*.lfs.* filter=lfs diff=lfs merge=lfs -text
|
| 11 |
+
*.mlmodel filter=lfs diff=lfs merge=lfs -text
|
| 12 |
+
*.model filter=lfs diff=lfs merge=lfs -text
|
| 13 |
+
*.msgpack filter=lfs diff=lfs merge=lfs -text
|
| 14 |
+
*.npy filter=lfs diff=lfs merge=lfs -text
|
| 15 |
+
*.npz filter=lfs diff=lfs merge=lfs -text
|
| 16 |
+
*.onnx filter=lfs diff=lfs merge=lfs -text
|
| 17 |
+
*.ot filter=lfs diff=lfs merge=lfs -text
|
| 18 |
+
*.parquet filter=lfs diff=lfs merge=lfs -text
|
| 19 |
+
*.pb filter=lfs diff=lfs merge=lfs -text
|
| 20 |
+
*.pickle filter=lfs diff=lfs merge=lfs -text
|
| 21 |
+
*.pkl filter=lfs diff=lfs merge=lfs -text
|
| 22 |
+
*.pt filter=lfs diff=lfs merge=lfs -text
|
| 23 |
+
*.pth filter=lfs diff=lfs merge=lfs -text
|
| 24 |
+
*.rar filter=lfs diff=lfs merge=lfs -text
|
| 25 |
+
*.safetensors filter=lfs diff=lfs merge=lfs -text
|
| 26 |
+
saved_model/**/* filter=lfs diff=lfs merge=lfs -text
|
| 27 |
+
*.tar.* filter=lfs diff=lfs merge=lfs -text
|
| 28 |
+
*.tar filter=lfs diff=lfs merge=lfs -text
|
| 29 |
+
*.tflite filter=lfs diff=lfs merge=lfs -text
|
| 30 |
+
*.tgz filter=lfs diff=lfs merge=lfs -text
|
| 31 |
+
*.wasm filter=lfs diff=lfs merge=lfs -text
|
| 32 |
+
*.xz filter=lfs diff=lfs merge=lfs -text
|
| 33 |
+
*.zip filter=lfs diff=lfs merge=lfs -text
|
| 34 |
+
*.zst filter=lfs diff=lfs merge=lfs -text
|
| 35 |
+
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
.gitignore
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
.venv/
|
| 2 |
+
.env
|
| 3 |
+
__pycache__/
|
| 4 |
+
*/__pycache__/
|
| 5 |
+
example/
|
| 6 |
+
software/
|
| 7 |
+
*.xlsx
|
.python-version
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
3.13
|
Dockerfile
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
FROM python:3.13-slim-bookworm
|
| 2 |
+
|
| 3 |
+
# Install uv
|
| 4 |
+
COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/
|
| 5 |
+
|
| 6 |
+
WORKDIR /app
|
| 7 |
+
|
| 8 |
+
# Environment
|
| 9 |
+
ENV PYTHONUNBUFFERED=1 \
|
| 10 |
+
UV_COMPILE_BYTECODE=1 \
|
| 11 |
+
UV_SYSTEM_PYTHON=1
|
| 12 |
+
|
| 13 |
+
# System deps (IMPORTANT for bcrypt, cryptography, asyncpg)
|
| 14 |
+
RUN apt-get update && apt-get install -y --no-install-recommends \
|
| 15 |
+
build-essential \
|
| 16 |
+
libpq-dev \
|
| 17 |
+
gcc \
|
| 18 |
+
&& rm -rf /var/lib/apt/lists/*
|
| 19 |
+
|
| 20 |
+
# Create non-root user
|
| 21 |
+
RUN addgroup --system app && adduser --system --group app
|
| 22 |
+
|
| 23 |
+
# Dependency layer
|
| 24 |
+
COPY pyproject.toml uv.lock ./
|
| 25 |
+
RUN uv sync --frozen
|
| 26 |
+
|
| 27 |
+
# App code
|
| 28 |
+
COPY . .
|
| 29 |
+
|
| 30 |
+
RUN chown -R app:app /app
|
| 31 |
+
USER app
|
| 32 |
+
|
| 33 |
+
EXPOSE 8111
|
| 34 |
+
|
| 35 |
+
CMD ["uv", "run", "uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8111"]
|
README.md
ADDED
|
@@ -0,0 +1,163 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
## Schemas
|
| 2 |
+
```plain
|
| 3 |
+
1. Build Schema
|
| 4 |
+
a. table: cv_users ✅
|
| 5 |
+
- user_id
|
| 6 |
+
- username
|
| 7 |
+
- hashed_password
|
| 8 |
+
- email
|
| 9 |
+
- full_name
|
| 10 |
+
- role
|
| 11 |
+
- is_active
|
| 12 |
+
- tenant_id
|
| 13 |
+
- created_at
|
| 14 |
+
- date_modified
|
| 15 |
+
- notes
|
| 16 |
+
b. table: cv_tenant ✅
|
| 17 |
+
- tenant_id
|
| 18 |
+
- tenant_name
|
| 19 |
+
- created_at
|
| 20 |
+
- date_modified
|
| 21 |
+
- notes
|
| 22 |
+
c. table: cv_file ✅
|
| 23 |
+
- file_id
|
| 24 |
+
- file_type
|
| 25 |
+
- filename
|
| 26 |
+
- url
|
| 27 |
+
- is_extracted
|
| 28 |
+
- uploaded_at
|
| 29 |
+
- date_modified
|
| 30 |
+
d. table: cv_profile ✅
|
| 31 |
+
- profile_id
|
| 32 |
+
- fullname
|
| 33 |
+
- gpa_edu_1
|
| 34 |
+
- univ_edu_1
|
| 35 |
+
- major_edu_1
|
| 36 |
+
- gpa_edu_2
|
| 37 |
+
- univ_edu_2
|
| 38 |
+
- major_edu_2
|
| 39 |
+
- gpa_edu_3
|
| 40 |
+
- univ_edu_3
|
| 41 |
+
- major_edu_3
|
| 42 |
+
- domicile
|
| 43 |
+
- yoe
|
| 44 |
+
- hardskills
|
| 45 |
+
- softskills
|
| 46 |
+
- certifications
|
| 47 |
+
- business_domain
|
| 48 |
+
- filename
|
| 49 |
+
- file_id
|
| 50 |
+
- created_at
|
| 51 |
+
e. table: cv_filter
|
| 52 |
+
- criteria_id
|
| 53 |
+
- gpa_edu_1
|
| 54 |
+
- gpa_edu_2
|
| 55 |
+
- gpa_edu_3
|
| 56 |
+
- univ_edu_1
|
| 57 |
+
- univ_edu_2
|
| 58 |
+
- univ_edu_3
|
| 59 |
+
- major_edu_1
|
| 60 |
+
- major_edu_2
|
| 61 |
+
- major_edu_3
|
| 62 |
+
- domicile
|
| 63 |
+
- yoe
|
| 64 |
+
- hardskills
|
| 65 |
+
- softskills
|
| 66 |
+
- certifications
|
| 67 |
+
- business_domain
|
| 68 |
+
- created_at
|
| 69 |
+
f. table: cv_weight ✅
|
| 70 |
+
- weight_id
|
| 71 |
+
- gpa_edu_1
|
| 72 |
+
- gpa_edu_2
|
| 73 |
+
- gpa_edu_3
|
| 74 |
+
- univ_edu_1
|
| 75 |
+
- univ_edu_2
|
| 76 |
+
- univ_edu_3
|
| 77 |
+
- major_edu_1
|
| 78 |
+
- major_edu_2
|
| 79 |
+
- major_edu_3
|
| 80 |
+
- domicile
|
| 81 |
+
- yoe
|
| 82 |
+
- hardskills
|
| 83 |
+
- softskills
|
| 84 |
+
- certifications
|
| 85 |
+
- business_domain
|
| 86 |
+
- created_at
|
| 87 |
+
g. table: cv_matching ✅
|
| 88 |
+
- matching_id
|
| 89 |
+
- profile_id
|
| 90 |
+
- criteria_id
|
| 91 |
+
- gpa_edu_1
|
| 92 |
+
- gpa_edu_2
|
| 93 |
+
- gpa_edu_3
|
| 94 |
+
- univ_edu_1
|
| 95 |
+
- univ_edu_2
|
| 96 |
+
- univ_edu_3
|
| 97 |
+
- major_edu_1
|
| 98 |
+
- major_edu_2
|
| 99 |
+
- major_edu_3
|
| 100 |
+
- domicile
|
| 101 |
+
- yoe
|
| 102 |
+
- hardskills
|
| 103 |
+
- softskills
|
| 104 |
+
- certifications
|
| 105 |
+
- business_domain
|
| 106 |
+
- created_at
|
| 107 |
+
g. table: profile_scores ✅
|
| 108 |
+
- score_id
|
| 109 |
+
- matching_id
|
| 110 |
+
- score
|
| 111 |
+
- created_at
|
| 112 |
+
```
|
| 113 |
+
|
| 114 |
+
|
| 115 |
+
## List API
|
| 116 |
+
### User
|
| 117 |
+
```plain
|
| 118 |
+
1. create user ✅
|
| 119 |
+
2. get user by username ✅
|
| 120 |
+
3. login #TODO
|
| 121 |
+
```
|
| 122 |
+
### Tenant
|
| 123 |
+
```plain
|
| 124 |
+
1. create tenant ✅
|
| 125 |
+
2. get tenant by tenant_name ✅
|
| 126 |
+
```
|
| 127 |
+
|
| 128 |
+
## Create User Example
|
| 129 |
+
Input:
|
| 130 |
+
{
|
| 131 |
+
"username": "harryyanto.ia@bukittechnology.com",
|
| 132 |
+
"password": "Test12345$!",
|
| 133 |
+
"email": "harryyanto.ia@bukittechnology.com",
|
| 134 |
+
"full_name": "Harryyanto Ishaq Agasi",
|
| 135 |
+
"role": "Admin",
|
| 136 |
+
"tenant_id": "03ce53dd-9fc8-43e0-b047-c927602304a9",
|
| 137 |
+
"notes": "admin"
|
| 138 |
+
}
|
| 139 |
+
|
| 140 |
+
Output:
|
| 141 |
+
{
|
| 142 |
+
"user_id": "eb3de1ed-2e3f-4c95-b29b-b31f85f01730",
|
| 143 |
+
"username": "harryyanto.ia@bukittechnology.com",
|
| 144 |
+
"email": "harryyanto.ia@bukittechnology.com",
|
| 145 |
+
"full_name": "Harryyanto Ishaq Agasi",
|
| 146 |
+
"role": "Admin",
|
| 147 |
+
"is_active": true,
|
| 148 |
+
"tenant_id": "03ce53dd-9fc8-43e0-b047-c927602304a9",
|
| 149 |
+
"created_at": "2026-02-19T15:42:05.726988Z"
|
| 150 |
+
}
|
| 151 |
+
|
| 152 |
+
|
| 153 |
+
|
| 154 |
+
## How To
|
| 155 |
+
1. Init schema on DB
|
| 156 |
+
`uv run python -m externals.databases.pg_schema_up`
|
| 157 |
+
|
| 158 |
+
2. Drop schema on DB
|
| 159 |
+
`uv run python -m externals.databases.pg_schema_down`
|
| 160 |
+
|
| 161 |
+
|
| 162 |
+
Compile pyproject.toml to requirements.txt
|
| 163 |
+
`uv pip compile pyproject.toml -o requirements.txt`
|
allfiles.txt
ADDED
|
@@ -0,0 +1,945 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
0b13ebed794644b6a34ceeda60f416bfe32458dd
|
| 2 |
+
2b6e87a1ac862ea3f70e6ccb60796c7bf4d175bb
|
| 3 |
+
2fba27e30bb1f7eb5a2412f66751f4ea7015418b
|
| 4 |
+
3e6af0dd88dca2150fe0c5bf4d1c568c9c50e68f
|
| 5 |
+
43ff6b9dacc7f01238b1ae3ddfdec8061645622e
|
| 6 |
+
484a5afebccc4d1d8dc0b945505943c59b787280
|
| 7 |
+
bfd625a4be135ad83eda97391d04eac1bf43ce2f
|
| 8 |
+
ce496bf803b49662a59783a281e477a147863614
|
| 9 |
+
d605a31fef53ae925289707c925a3c47bcae7938
|
| 10 |
+
ef6b5c4b4be954fe22fadd7f1c4612a42ef27572
|
| 11 |
+
38c0e9574d2f03d64c8d3aba3f11682be2e96edc
|
| 12 |
+
51b93bf595ae9d3e96bc974c61f5f0231db28b65
|
| 13 |
+
870a26407445889ebab964776f2860e28353bb72
|
| 14 |
+
96605499f87c6f9440d3428fa9006b03e0ba2b0f
|
| 15 |
+
9a1f1da613f4f24eb3f51c59b9c96856c5239b0e
|
| 16 |
+
9c985a2ae79975f0390db9f7339d0b878578ca0e
|
| 17 |
+
b90d7f072ee2870f1ffa89b3bdfd643f4538e67e
|
| 18 |
+
ce22fcc2a739826b5ebda00d72b6b42900d66ccc
|
| 19 |
+
dab9f4b784f01767f238842ad7b0fd8430191ca9
|
| 20 |
+
fadedf7e9d57688d58354ca6c7fee3a67fa5ad0e
|
| 21 |
+
8eb523c29743d7cedc146534ddab163236a45a13 .env.example
|
| 22 |
+
a6344aac8c09253b3b630fb776ae94478aa0275b .gitattributes
|
| 23 |
+
049f74a19fda63e951a83a68e6e18e255b3a0d9c .gitignore
|
| 24 |
+
d77e4f61bcaacc5e1a2d07b3516e70acc2c596b9 .gitignore
|
| 25 |
+
24ee5b1be9961e38a503c8e764b7385dbb6ba124 .python-version
|
| 26 |
+
0f75af977ead0f3a52ef2a2110a8d5844790389b app.py
|
| 27 |
+
67c39967e785d7c9c512151546ff6f3a7d704ab8 app.py
|
| 28 |
+
b0a5db4b8a41d9163366f9a4c35607e92ef22702 app.py
|
| 29 |
+
cd239d67357a8fbdf62c4e881dfc1b9e96f6a0a7 app.py
|
| 30 |
+
dd6d4a056271f924b6531e49c795b487b1f6bc3c app.py
|
| 31 |
+
31d368b92d4c6ac076edeeb0ebea816e67112c4d config
|
| 32 |
+
e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 config/__init__.py
|
| 33 |
+
901cd6b713ff67c60b4b70319d7bd7289c4b0067 config/config.yaml
|
| 34 |
+
5b6ae76d696bf5ff0788f6e349e2e84d32594fec config/constant.py
|
| 35 |
+
664a24f2f3d8082d96efba45f5c5dbfb87bf5bb4 config/env_constant.py
|
| 36 |
+
afada3a9707e9d4f5907bb1b571b7bb79a65c726 config/get_config.py
|
| 37 |
+
2586f65513a70f3a108881d2a3a1fd2bc8b66421 Dockerfile
|
| 38 |
+
e8bfe895ac2fb8738ca19d76676ee2d64ecdaaef Dockerfile
|
| 39 |
+
859ef4ea893bc64421676a3c5288a200293b61bd externals
|
| 40 |
+
c8a4a6d629445af12265f315e09e194ed125d3a9 externals/databases
|
| 41 |
+
ab4ee64dc2565b991d1fadcf725f71423e943616 externals/databases/_pg_tables.py
|
| 42 |
+
f2be3781ec9f136dabeda11d9458b7bd21f1791e externals/databases/_pgdb.py
|
| 43 |
+
8b54d8c1a80ccb5d1779c976aca9adf275bac32f externals/databases/database.py
|
| 44 |
+
9b32ea520069e6f3ff230174b2317d932edacb85 externals/databases/pg_crud.py
|
| 45 |
+
12b4af534976a7917b00ddfd6748cc7f63071d5b externals/databases/pg_models.py
|
| 46 |
+
d285f45a1e6fb88fba58df9477c6eef747c22010 externals/databases/pg_schema_down.py
|
| 47 |
+
7b3c7007cbde7d3aa71b46a3575ed2c75b7a7ee9 externals/databases/pg_schema_up.py
|
| 48 |
+
81067b349555c55fa34ec619e6094e447779dd6d externals/databases/schemas
|
| 49 |
+
69638f1f43ae2ddafc2116c7d773d35635f0e0d3 externals/databases/schemas/auth.py
|
| 50 |
+
77bac82d9d894290e2c518d0a9885280764b7349 externals/databases/schemas/knowledge.py
|
| 51 |
+
b5af23822d0a585ee7a6816580c8e2655f034235 externals/databases/schemas/tenant.py
|
| 52 |
+
ce994ebee65727d23353fd089ce1b77290659426 externals/databases/schemas/user.py
|
| 53 |
+
fe182aaf7fd60a82a6bfff5627e5b8888e4dabde externals/observability
|
| 54 |
+
f31c9224ccc815650c82d0156fd5281e696e84ce externals/observability/langfuse.py
|
| 55 |
+
37d7cc77360973beab613611549528390feedbd9 externals/storages
|
| 56 |
+
adb47084bcd9671340616eba5e10e38fb7c486a3 externals/storages/azure_blob.py
|
| 57 |
+
80d1aac571d98ab1b30ecc94bbdbccc5fb64a2a3 externals/storages/azure_generate_sas.py
|
| 58 |
+
8d37c37033d8ba9b2c7e642f8dcfd24f24e93268 interfaces
|
| 59 |
+
7d1a2f2a51f390458756e141a55d096bbc88f794 interfaces/api
|
| 60 |
+
d09a582dff8fd3b4439fda2c8c34e1acb02a29cb interfaces/api/agentic.py
|
| 61 |
+
4f78886f89a0c498b474369d7f9f1031e54f8801 interfaces/api/deps.py
|
| 62 |
+
4a8b4e2880bab2c3f9f36f3029721fad407a5d2d interfaces/api/file.py
|
| 63 |
+
e9ab3776b92be129f501c053e30e3223d36f9f2c interfaces/api/profile.py
|
| 64 |
+
7286a971935996ac887ff81a943e86c5f7906940 interfaces/api/tenant.py
|
| 65 |
+
0e83901366694cef25209bc989e91a7e6b4ecc66 interfaces/api/user.py
|
| 66 |
+
a72868dc2c8d3313c20c8e9e7c2f793cb23879a8 interfaces/auth
|
| 67 |
+
e566718a131034710b018a038d693eda842dbff1 interfaces/handlers
|
| 68 |
+
139597f9cb07c5d48bed18984ec4747f4b4f3438 interfaces/handlers/handlers.py
|
| 69 |
+
72c36a1fd2c34cffd1a0b7a0397772022371213c interfaces/middlewares
|
| 70 |
+
cf5ce287fbe0552ad50c8c1f664f50624ddc1c09 interfaces/middlewares/cors.py
|
| 71 |
+
405e3917b44482cd60dac565ec81c3b510de1616 main.py
|
| 72 |
+
a61416c52c2805ff02bfd19bb80f81e554496841 models
|
| 73 |
+
e913418d0cc0d7f9cc79152274e573a83a597ce3 models/security.py
|
| 74 |
+
660ee5ef1f122742d7b943164a700c0353c82fbb playground
|
| 75 |
+
24073a266b90be2d80d1b08f5eeb08dfa9462101 playground/playground.py
|
| 76 |
+
bdc91f11d02935c0a1fc74fc05be86dee28e0a55 pyproject.toml
|
| 77 |
+
1cfcee33a0fe57e36675d4233971eea4ad96fe0c README.md
|
| 78 |
+
66d34b0167f59dead73b18c15f42c3b002fb4f97 README.md
|
| 79 |
+
bb6a859a13317f2890b74c654273ac22049675b0 README.md
|
| 80 |
+
c96b19ae32ad7d6d2ad1e5e256a5f5ab94cc550c README.md
|
| 81 |
+
8e0578a0c2cb636e21d871d5ae4fdbb81887bee2 requirements.txt
|
| 82 |
+
c1eedc48871c549d796e7502fdaa1c04afcdd0e2 requirements.txt
|
| 83 |
+
f3d8b58be3e154106fc348596e7f8329a5be7a7b requirements.txt
|
| 84 |
+
ec75fb8e749e5761ba66f6420ba8f14adeb57da4 run.sh
|
| 85 |
+
84561ef37696a594debcd5a82033c6f9360f15e4 services
|
| 86 |
+
b01f66d80226b76b7a9e349753bd161db56d5891 services
|
| 87 |
+
f8c4f72d8e1276052eee2cc62f5601168c5f39f7 services/agentic
|
| 88 |
+
c2247deaa58d326f0357f2ee41ba337d8f227436 services/agentic/agentic_setup.py
|
| 89 |
+
3994811108414242ec6a132859447fc97a483fe7 services/agentic/filter.py
|
| 90 |
+
9d4c0c3a64c1b1a854dc2d61e5210e3e3ed4745c services/agentic/profile_scoring.py
|
| 91 |
+
62bd27fd4ec11c3abf76c51d0819704d1ae2eeb3 services/agentic/weight.py
|
| 92 |
+
1033bd0433f781c259c1f049a67c1e002f31009d services/agents
|
| 93 |
+
f0ee98a09e1c686fe93fe9d733b28de4dcea0a1b services/agents/__init__.py
|
| 94 |
+
c221ed8406139355b613c9165f8e170e3976b93f services/agents/AutograderAgent.py
|
| 95 |
+
39910c8af3512d41451083040d7050e2fc065331 services/agents/LearningRoadmapAgent.py
|
| 96 |
+
8c091645299c0d46b0df85100089a5ec57fc5f9b services/agents/LLMAgent.py
|
| 97 |
+
bef791298b086cd223eeca3abeb41643a84cb200 services/agents/ProfileMatchingAgent.py
|
| 98 |
+
6ae899ea18dda0183be5d4a5dadab8dc4cdf4477 services/base
|
| 99 |
+
95de5a43c24b112839d4f61f9cd303cbc97a2eb8 services/base/BaseGenerator.py
|
| 100 |
+
6615b6f93978c90867e5aea1037c5030213ce277 services/embed_model
|
| 101 |
+
ac1e1ada3de223cd46a9fe8154f8a718ceb12f8a services/embed_model/embed_model.py
|
| 102 |
+
b1182e7df744f0cd1a9c49fd068a54131809295b services/extractor
|
| 103 |
+
5c4945e32274cab45a08564eb474104d49a45a74 services/extractor/pdf.py
|
| 104 |
+
23c94e12d6e133fecec8f9b66e1f33152929f765 services/knowledge
|
| 105 |
+
fa139f0679d8159260db84f51df884cd1cefc075 services/knowledge/delete_file.py
|
| 106 |
+
fa6186940d0cf15e3e00d84ae1a7a9ae09ad0adc services/knowledge/extract_profile.py
|
| 107 |
+
c65ba06a2f718061c09dc9152758d1548d7f200e services/knowledge/get_profile.py
|
| 108 |
+
898ad2aad187bb789cae0c2dd9fafa20e4a207c1 services/knowledge/knowledge_setup.py
|
| 109 |
+
9732ee836c9f6da50766bff0099a98b0a6f8dea1 services/knowledge/upload_file.py
|
| 110 |
+
1af56c096e9dc3db49b93376b65299a039fc4949 services/knowledge_base
|
| 111 |
+
bc2899960440ddebc395363497df93ade123362a services/knowledge_base/CV_urls.xlsx
|
| 112 |
+
f77bc420e968354e5b1d11f14783e299a482e506 services/knowledge_base/PipelineKBIngestion.py
|
| 113 |
+
bb596798cae105dac250161ca645ad26e90aadc8 services/llms
|
| 114 |
+
45cd6281697eb88ea87bb02bfc1ad600e04b51bb services/llms/__init__.py
|
| 115 |
+
27bebd8de9c33a1022466e247a147ae4dfbc7bbc services/llms/LLM.py
|
| 116 |
+
b9cb9b8496a7b76ee86d6a66b486c9aff082198f services/models
|
| 117 |
+
182927603fb11f22a8db0a12b1a34985cc7a6915 services/models/data_model.py
|
| 118 |
+
8c5ea878a828e39aa0ab36cf6f5ed3a78067c38a services/pipelines
|
| 119 |
+
20c33c70d690f1bc9ff1fbcc59410719191de51f services/pipelines/PipelineKBIngestion.py
|
| 120 |
+
716b88ac23286401ade002c66dbe14dddac346cd services/pipelines/PipelineKBProfileExtraction.py
|
| 121 |
+
bd7d9be15e69c0726e63126b39fdf9df976ad1e0 services/pipelines/PipelineKBProfileNorm.py
|
| 122 |
+
270ab16d04f31a81d56061af1cd901963a03cc82 services/prompts
|
| 123 |
+
9ce7dee8ac17e27ef19128b925796acc60489008 services/prompts/AutograderPrompt.md
|
| 124 |
+
5c874db37fc457912917431994d465a468ee5e95 services/prompts/LearningRoadmapPrompt.md
|
| 125 |
+
7633443bf25c103842fbccb2b9727d6d32f4b331 services/prompts/profile_extraction.py
|
| 126 |
+
3b8573e80512f705f078cc636a8d4495c414fe43 services/prompts/profile_matching.py
|
| 127 |
+
278dd98491ae6b88f8e1a9cf103da96d4d13305a services/software
|
| 128 |
+
278f0b580f55521c0a67173359dca931545943db services/software/poppler-24.08.0
|
| 129 |
+
b115a675f506bd2433d206bd448a298ba025c0da services/software/poppler-24.08.0/Library
|
| 130 |
+
0ca1c988cffa37470985a559747f64c81feef307 services/software/poppler-24.08.0/Library/bin
|
| 131 |
+
5c723df8c4b2632d1d507012f86e4b2d266fe27e services/software/poppler-24.08.0/Library/bin/cairo.dll
|
| 132 |
+
ec63daf29ef67960f812ce4b166dbdce9490f275 services/software/poppler-24.08.0/Library/bin/charset.dll
|
| 133 |
+
ac81863783b5d7c7d4ce74ce53921d865a8f11ff services/software/poppler-24.08.0/Library/bin/deflate.dll
|
| 134 |
+
963a8dbbeb31997df0317ca405a85120966fc442 services/software/poppler-24.08.0/Library/bin/expat.dll
|
| 135 |
+
8d821d2c836662b346470e0a47b79e3f7ed910a1 services/software/poppler-24.08.0/Library/bin/fontconfig-1.dll
|
| 136 |
+
10a54260d3045bfa6ee5ea2e282416c65c156c4c services/software/poppler-24.08.0/Library/bin/freetype.dll
|
| 137 |
+
99dd64c13d1de1f45666a30a3b227de3d805384f services/software/poppler-24.08.0/Library/bin/iconv.dll
|
| 138 |
+
13af15313b701c317135fdfbfdec91572a8781df services/software/poppler-24.08.0/Library/bin/jpeg8.dll
|
| 139 |
+
8ce2ff9f262455c4f11ab4d5154e601760e63dc6 services/software/poppler-24.08.0/Library/bin/lcms2.dll
|
| 140 |
+
564de764efd2bf60075bfc9bc1f5d6326f59036e services/software/poppler-24.08.0/Library/bin/Lerc.dll
|
| 141 |
+
9b27073df1d5c47ea8689d5cec78e0c53b8a8e0b services/software/poppler-24.08.0/Library/bin/libcrypto-3-x64.dll
|
| 142 |
+
2622385a31b81377f348d9fab4e8ea9a39df14bb services/software/poppler-24.08.0/Library/bin/libcurl.dll
|
| 143 |
+
b4a03710f450c95cbc80e9197714039bdfc8643b services/software/poppler-24.08.0/Library/bin/liblzma.dll
|
| 144 |
+
5b5966b9766edde5ec285ae3695e1f6e7b504fe1 services/software/poppler-24.08.0/Library/bin/libpng16.dll
|
| 145 |
+
6c98b7fad3c25598b6c6e3eccc7cb1fda934cc73 services/software/poppler-24.08.0/Library/bin/libssh2.dll
|
| 146 |
+
e54f84199732a81fcb3e446a657c639e2080908f services/software/poppler-24.08.0/Library/bin/libtiff.dll
|
| 147 |
+
fd7af57a7976aead501efb418f0a92fd19cec7a7 services/software/poppler-24.08.0/Library/bin/libzstd.dll
|
| 148 |
+
2030ee9824310beb727f7c7c658d0a37c21b9159 services/software/poppler-24.08.0/Library/bin/openjp2.dll
|
| 149 |
+
9cf25113fd9ada2bdf75caf5bbc6419fa265a9af services/software/poppler-24.08.0/Library/bin/pdfattach.exe
|
| 150 |
+
64e28c540365fb22dcbc328f1773dba97ea25d83 services/software/poppler-24.08.0/Library/bin/pdfdetach.exe
|
| 151 |
+
ce8098097ce72b234df94f59818c589d9ad5954c services/software/poppler-24.08.0/Library/bin/pdffonts.exe
|
| 152 |
+
18bd5e75ece9b6880355101cdaac9b21a90bd28c services/software/poppler-24.08.0/Library/bin/pdfimages.exe
|
| 153 |
+
a46425aba2453cf4c83aaca841d8c2136c7de209 services/software/poppler-24.08.0/Library/bin/pdfinfo.exe
|
| 154 |
+
ce5cf711bb919d6d3c991f1d19ccdc6a292dcfa3 services/software/poppler-24.08.0/Library/bin/pdfseparate.exe
|
| 155 |
+
f918644d7ed9afb242af2afce8146c8949519180 services/software/poppler-24.08.0/Library/bin/pdftocairo.exe
|
| 156 |
+
4eb4a95d56fa7bdb57a6567fc063ea13e188453d services/software/poppler-24.08.0/Library/bin/pdftohtml.exe
|
| 157 |
+
3078e3b3eaba60b2b7bc8a3206ac36895718aeac services/software/poppler-24.08.0/Library/bin/pdftoppm.exe
|
| 158 |
+
d65bbbf620268997c9a44cbc928e22bf5deb8bc5 services/software/poppler-24.08.0/Library/bin/pdftops.exe
|
| 159 |
+
403ceef3023d2563bb252055870f68fa34bbd2d0 services/software/poppler-24.08.0/Library/bin/pdftotext.exe
|
| 160 |
+
5d6e0344d2ed2bf8c543efa3e5daaccac0ccf66e services/software/poppler-24.08.0/Library/bin/pdfunite.exe
|
| 161 |
+
24f4925dcb5c6b627e9973c061ce10d51c6482bc services/software/poppler-24.08.0/Library/bin/pixman-1-0.dll
|
| 162 |
+
16eb098a67b5e741a6953355cd052042e94dc4c4 services/software/poppler-24.08.0/Library/bin/poppler.dll
|
| 163 |
+
266cab62fa6b7562bae80d4cf16c8f6eeaeb3d41 services/software/poppler-24.08.0/Library/bin/poppler-cpp.dll
|
| 164 |
+
5c68c4337652e0686c59f7792ee9786e2e82ec2f services/software/poppler-24.08.0/Library/bin/poppler-glib.dll
|
| 165 |
+
48f858a677ab750b58564e5301fb271b4b37d899 services/software/poppler-24.08.0/Library/bin/zlib.dll
|
| 166 |
+
7a427fbf4f88480a8056050d41ce2968fe0433ba services/software/poppler-24.08.0/Library/bin/zstd.exe
|
| 167 |
+
b7905bdc1e1201f6bda04ff0b483dabc913bee82 services/software/poppler-24.08.0/Library/include
|
| 168 |
+
07b79aad77e0d6f54244579a785f5b4d501ad0e4 services/software/poppler-24.08.0/Library/include/poppler
|
| 169 |
+
5d96e7532124a93311d0de827f3f936b36460737 services/software/poppler-24.08.0/Library/include/poppler/Annot.h
|
| 170 |
+
ebe6e9191570d1b97db1d9a35c480eb6fd3df310 services/software/poppler-24.08.0/Library/include/poppler/AnnotStampImageHelper.h
|
| 171 |
+
50bc9d0aff4a54d2654b57cbd1fbb84b9fa665fb services/software/poppler-24.08.0/Library/include/poppler/Array.h
|
| 172 |
+
e48122fd48edcb2bd5844594be618936884cca12 services/software/poppler-24.08.0/Library/include/poppler/BBoxOutputDev.h
|
| 173 |
+
854692ea764ce8150edec8c179d30647bdc3c364 services/software/poppler-24.08.0/Library/include/poppler/CachedFile.h
|
| 174 |
+
c97e0ea45d6b3235d89b9c740beb011952fdf7e1 services/software/poppler-24.08.0/Library/include/poppler/CairoFontEngine.h
|
| 175 |
+
349ec6199b0a9ec376ec19803828a4e1a0d1f500 services/software/poppler-24.08.0/Library/include/poppler/CairoOutputDev.h
|
| 176 |
+
2766d483bf33ce11375abb30d7e15fa04c2d882c services/software/poppler-24.08.0/Library/include/poppler/CairoRescaleBox.h
|
| 177 |
+
cb76ff8ac3c02ac7e2331cba5bac70f1cc47e6de services/software/poppler-24.08.0/Library/include/poppler/Catalog.h
|
| 178 |
+
d2dbc34f4020acbd8f46916ec229eb506e269dda services/software/poppler-24.08.0/Library/include/poppler/CertificateInfo.h
|
| 179 |
+
dc2fa84c40b8ce23e0ec739ecfb35f98e19864ca services/software/poppler-24.08.0/Library/include/poppler/CharCodeToUnicode.h
|
| 180 |
+
d0df630d0c937cc9af2cf09882cde242a7a8097f services/software/poppler-24.08.0/Library/include/poppler/CharTypes.h
|
| 181 |
+
9ef876e9ea0d36ded0ce83aa3591735e2dc643a1 services/software/poppler-24.08.0/Library/include/poppler/CMap.h
|
| 182 |
+
25e5ad0f166abca1edee6ef1b7e380e59d31cebd services/software/poppler-24.08.0/Library/include/poppler/cpp
|
| 183 |
+
90fec01d31a40e5c675665fd7d9005d5a8b98fdb services/software/poppler-24.08.0/Library/include/poppler/cpp/poppler_cpp_export.h
|
| 184 |
+
6b0f920c249940ab3a7a22e4812b77fb7f62327f services/software/poppler-24.08.0/Library/include/poppler/cpp/poppler-destination.h
|
| 185 |
+
97fd9a878558843bf7bd4fdbfea072b879c8ddf7 services/software/poppler-24.08.0/Library/include/poppler/cpp/poppler-document.h
|
| 186 |
+
f39bd745489f70929443776e966732e58d6bab25 services/software/poppler-24.08.0/Library/include/poppler/cpp/poppler-embedded-file.h
|
| 187 |
+
b6bc48c50f2d7590373060cdd828a8ea399702cd services/software/poppler-24.08.0/Library/include/poppler/cpp/poppler-font.h
|
| 188 |
+
ba9c6e0db12e9ce43532794555dc242a1e1b8b7b services/software/poppler-24.08.0/Library/include/poppler/cpp/poppler-font-private.h
|
| 189 |
+
248a759962a3f02dd9742b0759b9ae0db09bd1d9 services/software/poppler-24.08.0/Library/include/poppler/cpp/poppler-global.h
|
| 190 |
+
2b98916c1ce3f81f6e1cf2b7e47b484a82a747e9 services/software/poppler-24.08.0/Library/include/poppler/cpp/poppler-image.h
|
| 191 |
+
6041402c8337e948321a6dc315a823a1dbf5eeef services/software/poppler-24.08.0/Library/include/poppler/cpp/poppler-page.h
|
| 192 |
+
166e5cdfe581f5bc8f0ddd7536a658420d5c35c6 services/software/poppler-24.08.0/Library/include/poppler/cpp/poppler-page-renderer.h
|
| 193 |
+
68447508678a4ebd975d45f9158b05238d3852f4 services/software/poppler-24.08.0/Library/include/poppler/cpp/poppler-page-transition.h
|
| 194 |
+
5657ec9a341d531cde5713044b12881d17688aca services/software/poppler-24.08.0/Library/include/poppler/cpp/poppler-rectangle.h
|
| 195 |
+
1e528a6e70ed6701a182633e63fb637b26d48131 services/software/poppler-24.08.0/Library/include/poppler/cpp/poppler-toc.h
|
| 196 |
+
58875ab79300f8538df1a8cf1dfdf6b91c031fc0 services/software/poppler-24.08.0/Library/include/poppler/cpp/poppler-version.h
|
| 197 |
+
752b7005b493a56a827542106f0b3c5d1969afee services/software/poppler-24.08.0/Library/include/poppler/CurlCachedFile.h
|
| 198 |
+
f1106b3513ef8ef3ec78900ca28a74941de9772c services/software/poppler-24.08.0/Library/include/poppler/CurlPDFDocBuilder.h
|
| 199 |
+
200536a087c98ce043d1170ae0eaf8ffb5772885 services/software/poppler-24.08.0/Library/include/poppler/DateInfo.h
|
| 200 |
+
4f0c6d288c154369f59a208001a3bba7d1ce00ed services/software/poppler-24.08.0/Library/include/poppler/Decrypt.h
|
| 201 |
+
621b76a2096e2c283786d85d2314731c26943e73 services/software/poppler-24.08.0/Library/include/poppler/Dict.h
|
| 202 |
+
b292afcf7419c6988ccf8ec05fd92e6a68ce3cb7 services/software/poppler-24.08.0/Library/include/poppler/Error.h
|
| 203 |
+
34fd86ab2dca81bec951c371d875315a1a41c1f5 services/software/poppler-24.08.0/Library/include/poppler/ErrorCodes.h
|
| 204 |
+
42c0ff6b2549222cc124fa0a2a2f704e42bffd3e services/software/poppler-24.08.0/Library/include/poppler/FDPDFDocBuilder.h
|
| 205 |
+
6662ebcf8bd6e501d5e470905c9ac4ea1d17a0da services/software/poppler-24.08.0/Library/include/poppler/FILECacheLoader.h
|
| 206 |
+
1650b89e792702bfa6eda152edbea10ebe46546f services/software/poppler-24.08.0/Library/include/poppler/FileSpec.h
|
| 207 |
+
87d6909e1b64915f4d5974b6b110378bd08fba5c services/software/poppler-24.08.0/Library/include/poppler/fofi
|
| 208 |
+
ca62e948d286fa7d4fa47d18c8aa9c1d14918c11 services/software/poppler-24.08.0/Library/include/poppler/fofi/FoFiBase.h
|
| 209 |
+
5a154405a448b3e0b947319a901aabac9b1b6798 services/software/poppler-24.08.0/Library/include/poppler/fofi/FoFiEncodings.h
|
| 210 |
+
f37ee3961218473bbec4c0dfd1f4374197eda99d services/software/poppler-24.08.0/Library/include/poppler/fofi/FoFiIdentifier.h
|
| 211 |
+
4c464b9dae0285b9284b95191a7f90ce98ad697a services/software/poppler-24.08.0/Library/include/poppler/fofi/FoFiTrueType.h
|
| 212 |
+
b3cc91e8b708c1b87581c8446af82d3ff5e5358f services/software/poppler-24.08.0/Library/include/poppler/fofi/FoFiType1.h
|
| 213 |
+
f3a9b731cf7b80b7b3ed0fa2c6ed563410eb0428 services/software/poppler-24.08.0/Library/include/poppler/fofi/FoFiType1C.h
|
| 214 |
+
a417b324e48087cbb6264cbe366a2c6bb1817c69 services/software/poppler-24.08.0/Library/include/poppler/FontEncodingTables.h
|
| 215 |
+
ba37a742a0664dbc47cf1c2b758931a2dc64c4a1 services/software/poppler-24.08.0/Library/include/poppler/FontInfo.h
|
| 216 |
+
51dae7420288443f09cdce4033301d9f3b0dace4 services/software/poppler-24.08.0/Library/include/poppler/Form.h
|
| 217 |
+
965280257e6a3dd8af49d02d32b1253c99234548 services/software/poppler-24.08.0/Library/include/poppler/Function.h
|
| 218 |
+
fee97a7228e5b62d2f3e5a486fd04c7d204cd8f9 services/software/poppler-24.08.0/Library/include/poppler/Gfx.h
|
| 219 |
+
c4dde6cb5ba30e38970460aa8602e638152a83c2 services/software/poppler-24.08.0/Library/include/poppler/GfxFont.h
|
| 220 |
+
9cf1afc193da5cc14fcc2aaf0f074a4a63f1cd17 services/software/poppler-24.08.0/Library/include/poppler/GfxState.h
|
| 221 |
+
9572f035b3282b80843f44196527e4f36abc5740 services/software/poppler-24.08.0/Library/include/poppler/GfxState_helpers.h
|
| 222 |
+
e68d17fcb2e6fb4671d022d4068fb025df799c70 services/software/poppler-24.08.0/Library/include/poppler/glib
|
| 223 |
+
70f2172a3e749b131a6ee0d13f4f4b570abf4e51 services/software/poppler-24.08.0/Library/include/poppler/glib/poppler.h
|
| 224 |
+
b4ea01e59d854f441dfb205c80318f6673cea127 services/software/poppler-24.08.0/Library/include/poppler/glib/poppler-action.h
|
| 225 |
+
509ecdff00821ecdd9bbdfb0430409e864faee3f services/software/poppler-24.08.0/Library/include/poppler/glib/poppler-annot.h
|
| 226 |
+
664a566e858cce8e6aedc13a862bae526274ba19 services/software/poppler-24.08.0/Library/include/poppler/glib/poppler-attachment.h
|
| 227 |
+
26b8a3f5cd2d1450c33eac967cb81312ba0e6308 services/software/poppler-24.08.0/Library/include/poppler/glib/poppler-date.h
|
| 228 |
+
a793e08bd4ed316a52dcf054369e3bbdc05eeca6 services/software/poppler-24.08.0/Library/include/poppler/glib/poppler-document.h
|
| 229 |
+
2fce5ceabefd3305e155897ada066793c766798c services/software/poppler-24.08.0/Library/include/poppler/glib/poppler-enums.h
|
| 230 |
+
4de3d57d5b81ebe104f21490101e1c8d13fab464 services/software/poppler-24.08.0/Library/include/poppler/glib/poppler-features.h
|
| 231 |
+
6cdf22405b80b7419d14c8a7fd5d0ba13db5ff91 services/software/poppler-24.08.0/Library/include/poppler/glib/poppler-form-field.h
|
| 232 |
+
12dfd9a44b630cdb7f06b1688fbe051a0daf25e6 services/software/poppler-24.08.0/Library/include/poppler/glib/poppler-layer.h
|
| 233 |
+
fc491512b8e3b6acf9e9b3ec37f6a4ea9d95c31c services/software/poppler-24.08.0/Library/include/poppler/glib/poppler-macros.h
|
| 234 |
+
72094b389b7f9fe5a59af51b10a99e3f59fe82ce services/software/poppler-24.08.0/Library/include/poppler/glib/poppler-media.h
|
| 235 |
+
abd69ba9db83a5cb9d976560aec7016274369314 services/software/poppler-24.08.0/Library/include/poppler/glib/poppler-movie.h
|
| 236 |
+
2d037d8e6efb47d4c10f1066ae9cbe3a33a82559 services/software/poppler-24.08.0/Library/include/poppler/glib/poppler-page.h
|
| 237 |
+
05cef08e3a4cb76b7aabe96dd635af2927969f86 services/software/poppler-24.08.0/Library/include/poppler/glib/poppler-structure-element.h
|
| 238 |
+
e8f3c53444ec070e27d9c7bdf073013739870535 services/software/poppler-24.08.0/Library/include/poppler/GlobalParams.h
|
| 239 |
+
8c4d3365259576a9ea82636356ff75d21a40a696 services/software/poppler-24.08.0/Library/include/poppler/goo
|
| 240 |
+
760687919cda357b1ce98859cae504700543dee7 services/software/poppler-24.08.0/Library/include/poppler/goo/gdir.h
|
| 241 |
+
516c2fc289061a77cc978cfa2efd82e35a3fda82 services/software/poppler-24.08.0/Library/include/poppler/goo/gfile.h
|
| 242 |
+
100c9b36db133a1af78a63bf0ee43b78c905b2f6 services/software/poppler-24.08.0/Library/include/poppler/goo/gmem.h
|
| 243 |
+
0cb743372eb7b4e42d8a9597ffd5f3891b9e2e00 services/software/poppler-24.08.0/Library/include/poppler/goo/GooCheckedOps.h
|
| 244 |
+
76128a71f958b2a07f887aaa6f19f3d503edbc4b services/software/poppler-24.08.0/Library/include/poppler/goo/GooLikely.h
|
| 245 |
+
ea62b67bb4c40b50894505add8a0d1b4e7ee1766 services/software/poppler-24.08.0/Library/include/poppler/goo/GooString.h
|
| 246 |
+
00b85618fe929662773d9f583602651a53a1fc34 services/software/poppler-24.08.0/Library/include/poppler/goo/GooTimer.h
|
| 247 |
+
2d535ee7670ce239db284a0bc2afe46bb676712b services/software/poppler-24.08.0/Library/include/poppler/goo/grandom.h
|
| 248 |
+
fbf1872fb213fa3e56a63c0f6ff1602fbf1d2749 services/software/poppler-24.08.0/Library/include/poppler/goo/gstrtod.h
|
| 249 |
+
860b310f7899e8145ca099cf6331c0a5dfbaa431 services/software/poppler-24.08.0/Library/include/poppler/goo/ImgWriter.h
|
| 250 |
+
4b94c51ecab70d4eb523255886f14b6f6a801dda services/software/poppler-24.08.0/Library/include/poppler/goo/JpegWriter.h
|
| 251 |
+
cd0ce4b8a83de769879111dba3b8f8bc8c2421d4 services/software/poppler-24.08.0/Library/include/poppler/goo/PNGWriter.h
|
| 252 |
+
3691a6e2d5a608c656fcab592a1018628fbba9a2 services/software/poppler-24.08.0/Library/include/poppler/goo/TiffWriter.h
|
| 253 |
+
5253a76a8dc95d3bdfec3cb43dccf4b4add33d43 services/software/poppler-24.08.0/Library/include/poppler/HashAlgorithm.h
|
| 254 |
+
5104ca0efc7b3559959f2814fa1505767ff7f815 services/software/poppler-24.08.0/Library/include/poppler/Hints.h
|
| 255 |
+
ae31a99578862991c90a16f2baa74a77b6332f2a services/software/poppler-24.08.0/Library/include/poppler/JArithmeticDecoder.h
|
| 256 |
+
af63a6733776a1d8afb9b6f6434b3e6979ac5f18 services/software/poppler-24.08.0/Library/include/poppler/JBIG2Stream.h
|
| 257 |
+
fbaac8fc3bfd6a2ae3a9f3cd922029fa23af9d31 services/software/poppler-24.08.0/Library/include/poppler/JPEG2000Stream.h
|
| 258 |
+
cfd3a0d4d4f78d98f992b62914e47cb92bb1e2a4 services/software/poppler-24.08.0/Library/include/poppler/JSInfo.h
|
| 259 |
+
a117dbe020ac55bd51e039ccd3983b9994e5fb7f services/software/poppler-24.08.0/Library/include/poppler/Lexer.h
|
| 260 |
+
b5b366bfc34b3d951cf9fc446a13f727fd2ba489 services/software/poppler-24.08.0/Library/include/poppler/Linearization.h
|
| 261 |
+
6337d79388707b4914bbb610f3cec121c752a3b7 services/software/poppler-24.08.0/Library/include/poppler/Link.h
|
| 262 |
+
0595d1e620e5a2a3722f6d8dd30024c705372aac services/software/poppler-24.08.0/Library/include/poppler/LocalPDFDocBuilder.h
|
| 263 |
+
b025b158214f9df0541f31a8592a3c6f6987a6e8 services/software/poppler-24.08.0/Library/include/poppler/MarkedContentOutputDev.h
|
| 264 |
+
0c36510eaa32bd4baa45791f5b8893b4608928ed services/software/poppler-24.08.0/Library/include/poppler/Movie.h
|
| 265 |
+
53b8972e11ef6e34bca60e447dc22ac313f5f5ec services/software/poppler-24.08.0/Library/include/poppler/NameToCharCode.h
|
| 266 |
+
b4c29c461e188732133f84c835b0671ada1ee087 services/software/poppler-24.08.0/Library/include/poppler/NameToUnicodeTable.h
|
| 267 |
+
e70a97498639f7e5b88415e8100e97ed05e19b80 services/software/poppler-24.08.0/Library/include/poppler/Object.h
|
| 268 |
+
22b9409ec2909ff2292eef67a4b1cc2972d9485d services/software/poppler-24.08.0/Library/include/poppler/OptionalContent.h
|
| 269 |
+
877eaac4fd149a878bcb428267bd20a806587a1b services/software/poppler-24.08.0/Library/include/poppler/Outline.h
|
| 270 |
+
35ab9bc0f1fe01b10c9ad36228f31f5b2245c042 services/software/poppler-24.08.0/Library/include/poppler/OutputDev.h
|
| 271 |
+
331c8b61de7e7ecd0ae887aa67aad8c9d0f0e6c1 services/software/poppler-24.08.0/Library/include/poppler/Page.h
|
| 272 |
+
b8d51a9e8db22f51be22c3c9eadd61feed04d182 services/software/poppler-24.08.0/Library/include/poppler/PageTransition.h
|
| 273 |
+
b379b67d34ad9b7a6567a45dcc78bf609e892820 services/software/poppler-24.08.0/Library/include/poppler/Parser.h
|
| 274 |
+
61aae6184f0871195808b19a7f7a56a356ee460a services/software/poppler-24.08.0/Library/include/poppler/PDFDoc.h
|
| 275 |
+
d0bd1ea61c8501788d58ecb8ef7202807d5736fa services/software/poppler-24.08.0/Library/include/poppler/PDFDocBuilder.h
|
| 276 |
+
278a910d21815d24876e02e1139cf13536ffcfef services/software/poppler-24.08.0/Library/include/poppler/PDFDocEncoding.h
|
| 277 |
+
e84aca46bd14c699843e4f21f53b14c915b61592 services/software/poppler-24.08.0/Library/include/poppler/PDFDocFactory.h
|
| 278 |
+
eef49cf8d3a1777ff878bc08751cc160341715be services/software/poppler-24.08.0/Library/include/poppler/poppler_private_export.h
|
| 279 |
+
68db15382fe68c03dc91f07561e3f8c89440b078 services/software/poppler-24.08.0/Library/include/poppler/PopplerCache.h
|
| 280 |
+
d52b48e4935fe516e138e9b748170c2cf6e78758 services/software/poppler-24.08.0/Library/include/poppler/poppler-config.h
|
| 281 |
+
9b3234a42b7f4518e68b5e05a10b3147b14b1693 services/software/poppler-24.08.0/Library/include/poppler/PreScanOutputDev.h
|
| 282 |
+
b13cff7ffe289a9909b69c00e62589c3383498d4 services/software/poppler-24.08.0/Library/include/poppler/ProfileData.h
|
| 283 |
+
9e64598ff5924a4994ecf0d471631613235b8dc5 services/software/poppler-24.08.0/Library/include/poppler/PSOutputDev.h
|
| 284 |
+
dab684bddbff93a16a5938a05b3de62f418bd8f5 services/software/poppler-24.08.0/Library/include/poppler/PSTokenizer.h
|
| 285 |
+
9721abf86e8e77fdfe6e926652439ff90036e0b2 services/software/poppler-24.08.0/Library/include/poppler/Rendition.h
|
| 286 |
+
de10f23d3200d348dfa4ee53ae60e76771c9e218 services/software/poppler-24.08.0/Library/include/poppler/SecurityHandler.h
|
| 287 |
+
8e5ad37f85ed2de5cb01c9137f9e86ff947132a8 services/software/poppler-24.08.0/Library/include/poppler/SignatureInfo.h
|
| 288 |
+
aa080bfd4bd7750f91b3f0169da71047ceaaf852 services/software/poppler-24.08.0/Library/include/poppler/Sound.h
|
| 289 |
+
ef221f6b717b450da5ccc9802708ff6746d956e3 services/software/poppler-24.08.0/Library/include/poppler/splash
|
| 290 |
+
e13be54c625f1e624a2c62fb33af6b3b0cd5935e services/software/poppler-24.08.0/Library/include/poppler/splash/Splash.h
|
| 291 |
+
2d7cf413525e4ced4f90d222915ee493030f6792 services/software/poppler-24.08.0/Library/include/poppler/splash/SplashBitmap.h
|
| 292 |
+
0b7dd14943a506eddfd16224b0bca6f266076a16 services/software/poppler-24.08.0/Library/include/poppler/splash/SplashClip.h
|
| 293 |
+
10efd6db72f5c615fd5540664a35b13ab83945bf services/software/poppler-24.08.0/Library/include/poppler/splash/SplashErrorCodes.h
|
| 294 |
+
8c54b08f24947749b31e545127410b329dbe66c8 services/software/poppler-24.08.0/Library/include/poppler/splash/SplashFont.h
|
| 295 |
+
3e5458c09374658a65ce99a0e58dd6e3749ba2d3 services/software/poppler-24.08.0/Library/include/poppler/splash/SplashFontEngine.h
|
| 296 |
+
7f55fdf01ad21c2376b7dc71d13db65cdd398d27 services/software/poppler-24.08.0/Library/include/poppler/splash/SplashFontFile.h
|
| 297 |
+
c127dd87f1d4a011c3a311518693ec292dea7dd4 services/software/poppler-24.08.0/Library/include/poppler/splash/SplashFontFileID.h
|
| 298 |
+
ae656b9cc523f1c8be8ad99a18f8f8654d1b5579 services/software/poppler-24.08.0/Library/include/poppler/splash/SplashFTFont.h
|
| 299 |
+
607b2a6ac4e9e2807e3cfbe5b5cf994092e22d82 services/software/poppler-24.08.0/Library/include/poppler/splash/SplashFTFontEngine.h
|
| 300 |
+
3e52dd85fab69b148d1c7c955b7a8663b2e7dcb3 services/software/poppler-24.08.0/Library/include/poppler/splash/SplashFTFontFile.h
|
| 301 |
+
a091941206f0b62d0a59948c93cca8975e3b6eb4 services/software/poppler-24.08.0/Library/include/poppler/splash/SplashGlyphBitmap.h
|
| 302 |
+
5c076563327565fb43ab2b11a5b45215ffdb275e services/software/poppler-24.08.0/Library/include/poppler/splash/SplashMath.h
|
| 303 |
+
815e48a73e802db957d50fd3abc9503a434cea56 services/software/poppler-24.08.0/Library/include/poppler/splash/SplashPath.h
|
| 304 |
+
2a50aa8249ce2f17ac2efe96175a24c1a2a0ccd4 services/software/poppler-24.08.0/Library/include/poppler/splash/SplashPattern.h
|
| 305 |
+
d912ef02e24564ddab97ec732fa3fe7d4c8942f9 services/software/poppler-24.08.0/Library/include/poppler/splash/SplashScreen.h
|
| 306 |
+
009c1f14c4eb9ea2d9e74b2ed587aab0f4ff75d8 services/software/poppler-24.08.0/Library/include/poppler/splash/SplashState.h
|
| 307 |
+
30a98cd0f34195ff026a4c1039e67c5458a7aaae services/software/poppler-24.08.0/Library/include/poppler/splash/SplashTypes.h
|
| 308 |
+
e59649fa0abb11769633eebab056fec8431471dc services/software/poppler-24.08.0/Library/include/poppler/splash/SplashXPath.h
|
| 309 |
+
476e98c92a3513d0bb8c8c720e67718f494aad93 services/software/poppler-24.08.0/Library/include/poppler/splash/SplashXPathScanner.h
|
| 310 |
+
88b13b4238fabf53e1351863852c1d85d0fe8398 services/software/poppler-24.08.0/Library/include/poppler/SplashOutputDev.h
|
| 311 |
+
b1b8b492b5c8ccc8b8a001eaa8d9ea42b9feb7a0 services/software/poppler-24.08.0/Library/include/poppler/Stream.h
|
| 312 |
+
3029ed09edffb7699efd08507d25363397558b4f services/software/poppler-24.08.0/Library/include/poppler/Stream-CCITT.h
|
| 313 |
+
fbc0781fc76f0bcd79252146564c687236ed9481 services/software/poppler-24.08.0/Library/include/poppler/StructElement.h
|
| 314 |
+
8812a504bdae540dd69e4f82e0cd6f8d1d09d2f5 services/software/poppler-24.08.0/Library/include/poppler/StructTreeRoot.h
|
| 315 |
+
d598142176b5e6df5464165c51bdd52384546147 services/software/poppler-24.08.0/Library/include/poppler/TextOutputDev.h
|
| 316 |
+
88d119bce559aab97c578da93bd0b282ee4f117e services/software/poppler-24.08.0/Library/include/poppler/UnicodeCClassTables.h
|
| 317 |
+
f74ffcd00b86fbf570897f634ea38baae0a98bc6 services/software/poppler-24.08.0/Library/include/poppler/UnicodeCompTables.h
|
| 318 |
+
8cb793c0b95c58d3847a289e149a15c7c3fb8828 services/software/poppler-24.08.0/Library/include/poppler/UnicodeDecompTables.h
|
| 319 |
+
0d80c0254760a518f40f03de8afecc5d52ac9c49 services/software/poppler-24.08.0/Library/include/poppler/UnicodeMap.h
|
| 320 |
+
bace0a62da1e0556a82089bb7cd0e20ec12bb0b1 services/software/poppler-24.08.0/Library/include/poppler/UnicodeMapFuncs.h
|
| 321 |
+
7c89feb285716d8de73b7d35d357e3e29bec7f18 services/software/poppler-24.08.0/Library/include/poppler/UnicodeMapTables.h
|
| 322 |
+
85d88d62bc431050269851f43645c7e3dd0d23e5 services/software/poppler-24.08.0/Library/include/poppler/UnicodeTypeTable.h
|
| 323 |
+
bd57188df2bd804751272f580b4123cc12f69f07 services/software/poppler-24.08.0/Library/include/poppler/UTF.h
|
| 324 |
+
24a814ca2a4cfed1677ea9958367c1330d09456c services/software/poppler-24.08.0/Library/include/poppler/ViewerPreferences.h
|
| 325 |
+
739b87bb0ab6798e2710e4b02cbfbe70dcb899c9 services/software/poppler-24.08.0/Library/include/poppler/XRef.h
|
| 326 |
+
e577541dda324eaf74fd622e6c7e8f8850287b9e services/software/poppler-24.08.0/Library/lib
|
| 327 |
+
23c11bca60a554a2a2c2fa64ab5559fd43f5e056 services/software/poppler-24.08.0/Library/lib/pkgconfig
|
| 328 |
+
d2039943f70f89d2dd95b84b6cce5980aafa9d6b services/software/poppler-24.08.0/Library/lib/pkgconfig/poppler.pc
|
| 329 |
+
ad81a431c245429a867a68d6c6f70091abc59e64 services/software/poppler-24.08.0/Library/lib/pkgconfig/poppler-cpp.pc
|
| 330 |
+
6e21bd230539a7a09ca257fcd1206ad4b8fffc7a services/software/poppler-24.08.0/Library/lib/pkgconfig/poppler-glib.pc
|
| 331 |
+
fc89ac109fde63c5e14256068ad555267b75a7ba services/software/poppler-24.08.0/Library/lib/poppler.lib
|
| 332 |
+
c3af3051970dde6afe4fd42e5e1b972e13801bfa services/software/poppler-24.08.0/Library/lib/poppler-cpp.lib
|
| 333 |
+
fc2de108fcc7508c542e2b5c1d352438a4c0c879 services/software/poppler-24.08.0/Library/lib/poppler-glib.lib
|
| 334 |
+
6e55d667109010187de08f196378ab9702127c9b services/software/poppler-24.08.0/Library/share
|
| 335 |
+
4ddce75f708030dd1a0901fe5f8123e33afb5f61 services/software/poppler-24.08.0/Library/share/man
|
| 336 |
+
f7702066f299e1af809744b0ca38c8fd1e97cfe7 services/software/poppler-24.08.0/Library/share/man/man1
|
| 337 |
+
c9589a783eb9b33bf65bc218a8625b846991b4d3 services/software/poppler-24.08.0/Library/share/man/man1/pdfattach.1
|
| 338 |
+
0b8975dc620cbcb10bfdacc1dd33753f0145a5b8 services/software/poppler-24.08.0/Library/share/man/man1/pdfdetach.1
|
| 339 |
+
1ec0db2722aa8bad093396c12148f8e4b2ce328e services/software/poppler-24.08.0/Library/share/man/man1/pdffonts.1
|
| 340 |
+
1a5386a032d9173193ae60e750ca07f5df238e83 services/software/poppler-24.08.0/Library/share/man/man1/pdfimages.1
|
| 341 |
+
2a17bbd50524eea38fdf68d77dfb0d3ae3231201 services/software/poppler-24.08.0/Library/share/man/man1/pdfinfo.1
|
| 342 |
+
132511a12c87ad5c071dca31002c5db4bd8f15d2 services/software/poppler-24.08.0/Library/share/man/man1/pdfseparate.1
|
| 343 |
+
782f81fdaa694e48ce36178c6572bd7eff324da1 services/software/poppler-24.08.0/Library/share/man/man1/pdftocairo.1
|
| 344 |
+
e4e9da5c5b6dccd0ab55e4c78913150d83591311 services/software/poppler-24.08.0/Library/share/man/man1/pdftohtml.1
|
| 345 |
+
ddbe4d70172cf8bb030965612dc8e4c7b2388da9 services/software/poppler-24.08.0/Library/share/man/man1/pdftoppm.1
|
| 346 |
+
0ab17cbbae5c0a138ad5b63830b248bd4a25b83c services/software/poppler-24.08.0/Library/share/man/man1/pdftops.1
|
| 347 |
+
c34c98a907f8f915e6decf09ca7fd6811f7728c7 services/software/poppler-24.08.0/Library/share/man/man1/pdftotext.1
|
| 348 |
+
4a1b4ea89bc114bb4b6f0f69d4d47b553389ee71 services/software/poppler-24.08.0/Library/share/man/man1/pdfunite.1
|
| 349 |
+
5610ba299033167f7a2908aa7f3eee49669ff16b services/software/poppler-24.08.0/share
|
| 350 |
+
f61637285918a71f84572dce0ff0dd2aab3c6d78 services/software/poppler-24.08.0/share/poppler
|
| 351 |
+
5fd8c09075d21693dcf9c029b345726e9a9e59f8 services/software/poppler-24.08.0/share/poppler/cidToUnicode
|
| 352 |
+
6969f321f9c598a5163355505a4ca3ee0a670a88 services/software/poppler-24.08.0/share/poppler/cidToUnicode/Adobe-CNS1
|
| 353 |
+
5fec270461acf17e1ba67a1a0a8b36dedb21d957 services/software/poppler-24.08.0/share/poppler/cidToUnicode/Adobe-GB1
|
| 354 |
+
0d729403ec3e19ccb23f8efaeeddd7a3f9f074fa services/software/poppler-24.08.0/share/poppler/cidToUnicode/Adobe-Japan1
|
| 355 |
+
b0697040582c22b059193f6b07b12194926cbc35 services/software/poppler-24.08.0/share/poppler/cidToUnicode/Adobe-Korea1
|
| 356 |
+
e1d64b1977e0f3cd086331d74d57451da5bc17c1 services/software/poppler-24.08.0/share/poppler/CMakeLists.txt
|
| 357 |
+
bc37d20bcfa2b49cce76bbbb60a7f07fd2c9ced0 services/software/poppler-24.08.0/share/poppler/cMap
|
| 358 |
+
be4f1991223c7fd1ff159e9faa3f51ad0c230388 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1
|
| 359 |
+
9a037f85b8df021b333eb0501fe695e2e924ecbd services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/Adobe-CNS1-0
|
| 360 |
+
24c193aac7aa0bc5aac12ebf2379e1e64e98f66c services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/Adobe-CNS1-1
|
| 361 |
+
544b73fc79d6db0fad73cfb392e0c4338bf4619c services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/Adobe-CNS1-2
|
| 362 |
+
f380656311673f79f95bf96aab5114e7f2258c39 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/Adobe-CNS1-3
|
| 363 |
+
d9f2f65d14ef703aeca66fcc36c0802f0ca80cb2 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/Adobe-CNS1-4
|
| 364 |
+
7aa30aabbbfcca044c4c0b671eca3d7b9f3ed616 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/Adobe-CNS1-5
|
| 365 |
+
7529a97aacacd0c76ab0c3f429f8c794da29b585 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/Adobe-CNS1-6
|
| 366 |
+
17cec369e448e234a11206c29aff265e7c76d8e4 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/Adobe-CNS1-7
|
| 367 |
+
4cde2fb486f95ac49670aee849eb67d2b1aed78a services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/Adobe-CNS1-B5pc
|
| 368 |
+
2ab5ffeb09d89c94e3dfb60428078a528f349523 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/Adobe-CNS1-ETen-B5
|
| 369 |
+
4332835c658cc195f1264e7e9ed2d811b2df20c6 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/Adobe-CNS1-H-CID
|
| 370 |
+
2646dcce3a7af04e13fbf8d974eaa0d7b318cc48 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/Adobe-CNS1-H-Host
|
| 371 |
+
9cf7735d587195f3398890454795e63716f5f9e3 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/Adobe-CNS1-H-Mac
|
| 372 |
+
d8265ce72bad27dadbd8b3617b21f5577e766b8e services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/Adobe-CNS1-UCS2
|
| 373 |
+
08f05cc372f1372b90ad9a43cca1a686bb975afd services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/B5-H
|
| 374 |
+
277ede77969762723ba531c698d5447724387a4f services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/B5pc-H
|
| 375 |
+
08cca172468bb867962e490f0454e45737b296f2 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/B5pc-UCS2
|
| 376 |
+
181ef364a082fb81583998b7aa2dc8b58f003b1c services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/B5pc-UCS2C
|
| 377 |
+
70f89e7ab425e12f33b39f4ff089cef8731d0281 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/B5pc-V
|
| 378 |
+
2b0482d0387d5f6ec69a7922e40c31b63885acba services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/B5-V
|
| 379 |
+
eefb687598b2783ce9be1dd4c9b26cc0d591c2ee services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/CNS1-H
|
| 380 |
+
fec58cd1e36e85082594a1fbcbdfd3e1331180cc services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/CNS1-V
|
| 381 |
+
832b710a7bb75d25e2150b64b9d93b9d0b22aadc services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/CNS2-H
|
| 382 |
+
ee519fab4b293e19f013251e57b51a892c668de3 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/CNS2-V
|
| 383 |
+
8e8936bf14a4d485a72019d39379fff6d40611f7 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/CNS-EUC-H
|
| 384 |
+
62c458029881a185249af114c2c0a74e00a2e9a1 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/CNS-EUC-V
|
| 385 |
+
a25ea5ccbc2cf3ddf9dd0039a1cde5d6ffc2c747 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/ETen-B5-H
|
| 386 |
+
d71b62ad580d772ca9df1285d68ab729bd6339eb services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/ETen-B5-UCS2
|
| 387 |
+
736fb4a403b94b9e6ce25f0a12675848c8dd5481 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/ETen-B5-V
|
| 388 |
+
6a3395011aaef3e921ab44c1e535223ea6679734 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/ETenms-B5-H
|
| 389 |
+
4a5c611fed53ddd6880f19b641233d89572f1c76 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/ETenms-B5-V
|
| 390 |
+
974945adf77484b3121687352d972fcbb6c54983 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/ETHK-B5-H
|
| 391 |
+
57d776389096381999a607dcceddb3c5e665710a services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/ETHK-B5-V
|
| 392 |
+
199f52e58ebedf5da4c585994d89f13c72041721 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/HKdla-B5-H
|
| 393 |
+
cf1e5501d88934b7229736554cfd2bab70ee8d96 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/HKdla-B5-V
|
| 394 |
+
1721d6ea0bc07c0a4e1f5bf7615d82934d7a90cc services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/HKdlb-B5-H
|
| 395 |
+
a6960b22df4115caef5126be85d209d2ed21540d services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/HKdlb-B5-V
|
| 396 |
+
d92536a2c1bf3f4b65f935524393e3378a912817 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/HKgccs-B5-H
|
| 397 |
+
298cb275c68458ee93ea969251553e1daca28b34 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/HKgccs-B5-V
|
| 398 |
+
cfc47917b53f57044460b4639c48543281d1919f services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/HKm314-B5-H
|
| 399 |
+
0f47a62e9400732840d5f40c51068c10bd6c7f0a services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/HKm314-B5-V
|
| 400 |
+
543de49adcb83b8585fc7ec8a98ca80d0eaecbb1 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/HKm471-B5-H
|
| 401 |
+
8782ca6b4ccbfd7a9e9ee23b21a5b4b186e72ee3 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/HKm471-B5-V
|
| 402 |
+
ea6e1c881ba1bb465b2b1d81bccefde9b602c977 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/HKscs-B5-H
|
| 403 |
+
da4f9bfe122fe49ab04878addf03f0ce95e57015 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/HKscs-B5-V
|
| 404 |
+
4a01a36646a60c894258c6117ea5828c91292aef services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/UCS2-B5pc
|
| 405 |
+
783b1d8a85520c7a77caecfeebffea24e791bd1f services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/UCS2-ETen-B5
|
| 406 |
+
73ca664a26ba7835d0c06a1ae13f1c8b5ed16812 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/UniCNS-UCS2-H
|
| 407 |
+
9927ba9fb7cb7bcc46ade671f95a845ac39156d9 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/UniCNS-UCS2-V
|
| 408 |
+
76c15677f9fc536e83d4263a3fb26b785db9eecf services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/UniCNS-UTF16-H
|
| 409 |
+
37e13a5a9605070f98291b396806d04c6ddcfd09 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/UniCNS-UTF16-V
|
| 410 |
+
beee8bb2efd85b85fb5457c1f048732bdde7d0a2 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/UniCNS-UTF32-H
|
| 411 |
+
123ec46ca25b8649658b17cec29fab62cda29a8f services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/UniCNS-UTF32-V
|
| 412 |
+
1b5fb46b21b49d1d5b143a4abca2afa7c5c62ad3 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/UniCNS-UTF8-H
|
| 413 |
+
ba1840bdb24e959384853adce5fba014ca4e308b services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/UniCNS-UTF8-V
|
| 414 |
+
662fbcb0b89dea7969aab1414b1ccbab47b4373d services/software/poppler-24.08.0/share/poppler/cMap/Adobe-GB1
|
| 415 |
+
c96113ad786567fb9cf4e18bcf0d5b85b53b97ad services/software/poppler-24.08.0/share/poppler/cMap/Adobe-GB1/Adobe-GB1-0
|
| 416 |
+
8cde432ee3a6cffbe4f0125ad6662098bbb9e929 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-GB1/Adobe-GB1-1
|
| 417 |
+
ee205248148aa4dc85e6b7c2231bcd7e9b7afb7b services/software/poppler-24.08.0/share/poppler/cMap/Adobe-GB1/Adobe-GB1-2
|
| 418 |
+
96fd45a6e3c3ae360804a2af46fed374ccf76b4a services/software/poppler-24.08.0/share/poppler/cMap/Adobe-GB1/Adobe-GB1-3
|
| 419 |
+
ecb9212730c6e252bcd79f2b7185bc8d668a8adf services/software/poppler-24.08.0/share/poppler/cMap/Adobe-GB1/Adobe-GB1-4
|
| 420 |
+
8a9ee3ee1035dad2fcbd89863ed4fe9eeb5fec07 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-GB1/Adobe-GB1-5
|
| 421 |
+
a121ca7d9980eee4c0a41a57848fd601ec876b2a services/software/poppler-24.08.0/share/poppler/cMap/Adobe-GB1/Adobe-GB1-GBK-EUC
|
| 422 |
+
4e2af82f23b3013a1a800bac3e49da06c0dc4efa services/software/poppler-24.08.0/share/poppler/cMap/Adobe-GB1/Adobe-GB1-GBpc-EUC
|
| 423 |
+
627822a07eebb2c5cd4562c50bd1501e3a1eee69 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-GB1/Adobe-GB1-H-CID
|
| 424 |
+
a6b36a877afdd0e39b9db90394234ca1a31ab579 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-GB1/Adobe-GB1-H-Host
|
| 425 |
+
6d2eb49c68499d01a25c52d8b9fbf0db3b700c5d services/software/poppler-24.08.0/share/poppler/cMap/Adobe-GB1/Adobe-GB1-H-Mac
|
| 426 |
+
72d9a1fe4d616b6c7c72acdc46b45fbed0731077 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-GB1/Adobe-GB1-UCS2
|
| 427 |
+
f28d6f1135ea9294e02dc0d5ecb09205867d61d9 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-GB1/GB-EUC-H
|
| 428 |
+
d6c9ba76d827a5d9ee58a47730d1fcb3d9471d5c services/software/poppler-24.08.0/share/poppler/cMap/Adobe-GB1/GB-EUC-V
|
| 429 |
+
0c84cff673a589d8e56c3edd4319aab6d088cc3e services/software/poppler-24.08.0/share/poppler/cMap/Adobe-GB1/GB-H
|
| 430 |
+
fe15bc780a68c465bb2112e53edd5ddb83c8ff0a services/software/poppler-24.08.0/share/poppler/cMap/Adobe-GB1/GBK2K-H
|
| 431 |
+
5ba0359d1360b984f9433d22a09b18e70d10202f services/software/poppler-24.08.0/share/poppler/cMap/Adobe-GB1/GBK2K-V
|
| 432 |
+
ddb94e9f0457fe5560711a218556516103a56129 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-GB1/GBK-EUC-H
|
| 433 |
+
c5d17dd5a83de47eadcbab334e4523e8a28ecba7 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-GB1/GBK-EUC-UCS2
|
| 434 |
+
7e5b586fb2eca868dce6dbfa2ce8bc1599f61792 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-GB1/GBK-EUC-V
|
| 435 |
+
15d15a49ded29b5995738a22d768bbf4af82798c services/software/poppler-24.08.0/share/poppler/cMap/Adobe-GB1/GBKp-EUC-H
|
| 436 |
+
9bcb51d848506c2ea49fd1679964ee68d43c79bf services/software/poppler-24.08.0/share/poppler/cMap/Adobe-GB1/GBKp-EUC-V
|
| 437 |
+
84f0e64a7a566183828e8fb6e7479fef10c9ea75 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-GB1/GBpc-EUC-H
|
| 438 |
+
34f77f542b01de92b8a5272e357931adfb77324d services/software/poppler-24.08.0/share/poppler/cMap/Adobe-GB1/GBpc-EUC-UCS2
|
| 439 |
+
5a04809e0a3825427e69433d04fffe2c7a9d9075 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-GB1/GBpc-EUC-UCS2C
|
| 440 |
+
851888210989436ace1415082fcd484cb1cfda25 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-GB1/GBpc-EUC-V
|
| 441 |
+
e82b1ef0b5b4eab71f6f23e2f1cc5986b85da87d services/software/poppler-24.08.0/share/poppler/cMap/Adobe-GB1/GBT-EUC-H
|
| 442 |
+
0b8c4b0bced6e9887d10387fb8ae3805e84a9f88 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-GB1/GBT-EUC-V
|
| 443 |
+
9aa834eb0623a38e3fac7288ca25d134d7fe463c services/software/poppler-24.08.0/share/poppler/cMap/Adobe-GB1/GBT-H
|
| 444 |
+
a5be785960f371ead7dddb79dc6fe4176370cf37 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-GB1/GBTpc-EUC-H
|
| 445 |
+
bcc5f4713a914977860c668e9e6d7953992d9d8a services/software/poppler-24.08.0/share/poppler/cMap/Adobe-GB1/GBTpc-EUC-V
|
| 446 |
+
c0bab3d590df40b841862dcc2eb84859610c3070 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-GB1/GBT-V
|
| 447 |
+
c88725325f411b6caa8a09ccbef1d1ad5c6a93ec services/software/poppler-24.08.0/share/poppler/cMap/Adobe-GB1/GB-V
|
| 448 |
+
c5cc04933babdcc4c5b24f762b299f6385762916 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-GB1/UCS2-GBK-EUC
|
| 449 |
+
7477d559160761f56c78f9b69ba17d6c1911590b services/software/poppler-24.08.0/share/poppler/cMap/Adobe-GB1/UCS2-GBpc-EUC
|
| 450 |
+
c7b40cda0527ed5d990bacceabc13164bf999fa2 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-GB1/UniGB-UCS2-H
|
| 451 |
+
e0f0fb56ed168c035169be8e72fdcc361ef9186d services/software/poppler-24.08.0/share/poppler/cMap/Adobe-GB1/UniGB-UCS2-V
|
| 452 |
+
9575b1d7f276eb5e6af16878be82a575e8a61cf7 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-GB1/UniGB-UTF16-H
|
| 453 |
+
0f302482564c3e90d9ed8d7959ae3273c2354fbc services/software/poppler-24.08.0/share/poppler/cMap/Adobe-GB1/UniGB-UTF16-V
|
| 454 |
+
765869daab2df9015f4861d832c900d2de00d51e services/software/poppler-24.08.0/share/poppler/cMap/Adobe-GB1/UniGB-UTF32-H
|
| 455 |
+
664a362ecd705e2e1ac506bb94eb6780358f1bd9 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-GB1/UniGB-UTF32-V
|
| 456 |
+
8d2af6ba95c707c1d038ed6e68e9c46fbe49c685 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-GB1/UniGB-UTF8-H
|
| 457 |
+
1c100efdeee5464beebcf24c1c1a7d2f249e8a90 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-GB1/UniGB-UTF8-V
|
| 458 |
+
b921f4c145e3d7613c18fbbb11d71ccba0da6c9f services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1
|
| 459 |
+
d30c5e8832eeb027cbc5715a0eedea6fe230b24a services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/78-EUC-H
|
| 460 |
+
69fe9c26eb688d4651e5d5d939f0ca38d4072e28 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/78-EUC-V
|
| 461 |
+
1c7cc2d10bd847a2806a16677d46f741278ea843 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/78-H
|
| 462 |
+
ca78cae23fd2f0e7e33bf5e4b28f3b289b126683 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/78ms-RKSJ-H
|
| 463 |
+
03685c696791e40af7e369dea45fad938c035a79 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/78ms-RKSJ-V
|
| 464 |
+
d77d6308b1a3e4b3f65775dcf9f3274ad4b3df96 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/78-RKSJ-H
|
| 465 |
+
e68ca260312bd53965c407baf39b37a11b1ed49e services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/78-RKSJ-V
|
| 466 |
+
465b79f995a725aedceb1e606104f8badf312e05 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/78-V
|
| 467 |
+
d80b465fa79480caa1e9606fb89716fbc370d1ed services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/83pv-RKSJ-H
|
| 468 |
+
158f3f661cc7d0529d21adfbe92bcaaee5f8f756 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/90msp-RKSJ-H
|
| 469 |
+
7081845f4fc2c965debd8906a557a6d772b5c87a services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/90msp-RKSJ-V
|
| 470 |
+
89c83394e93d6568ba031f349b46fd883e76f755 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/90ms-RKSJ-H
|
| 471 |
+
726c4bfb3ac40e6f3d8ec32b428ac4eabec64d4d services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/90ms-RKSJ-UCS2
|
| 472 |
+
eeb6a28a93d970d0d74c7000cc185a117aaaddf0 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/90ms-RKSJ-V
|
| 473 |
+
0b68fba1392f9b6e5cff078f1642d29bc6a496e7 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/90pv-RKSJ-H
|
| 474 |
+
dc16eb5f301f15220d73caaa204fe51b02ca3db6 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/90pv-RKSJ-UCS2
|
| 475 |
+
37759d6a9f0b804ace85840bcef26c419b2c0661 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/90pv-RKSJ-UCS2C
|
| 476 |
+
32b993422ad421f7b22aaed08f19ccc22d2a3e98 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/90pv-RKSJ-V
|
| 477 |
+
a5889e51bebbc7188cc531c86fa1958e4ba73b0e services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/Add-H
|
| 478 |
+
ff0b793bdb63feb6d09e01233cdd87b39f1660c0 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/Add-RKSJ-H
|
| 479 |
+
db50cbcbf098a2e4603190d51f41fbc1c69f1008 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/Add-RKSJ-V
|
| 480 |
+
053dbff78d0793e80e8dfda5d52a76b03c13b97e services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/Add-V
|
| 481 |
+
7e172144da548b3dc9c706f9cd44c69f8c51f741 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/Adobe-Japan1-0
|
| 482 |
+
f61f714cce4cd01615f95e67a7f4173fac2b2fb2 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/Adobe-Japan1-1
|
| 483 |
+
d7767f65fcfd31c6f2a3551cf3b8942ef2d9ab72 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/Adobe-Japan1-2
|
| 484 |
+
a5507b65ad1ed355e7c44f41f132b5d27844439c services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/Adobe-Japan1-3
|
| 485 |
+
f6a4cf813712748a7351bea4919222d300f5b2a6 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/Adobe-Japan1-4
|
| 486 |
+
e7991319e3b7e7e34bdcd6d554d9501c23f758c4 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/Adobe-Japan1-5
|
| 487 |
+
38e95eae7a7b595197357a17309bd96b0232deb9 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/Adobe-Japan1-6
|
| 488 |
+
6f195ced13be18738b7dd7ef33d66fd6fab48d23 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/Adobe-Japan1-7
|
| 489 |
+
9ac8341110e5b4a437fae3c57033caada449e740 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/Adobe-Japan1-90ms-RKSJ
|
| 490 |
+
7b7c6987eb2df73cdde7b5f3406df539764344c4 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/Adobe-Japan1-90pv-RKSJ
|
| 491 |
+
ea30bbc9b2529db1a406e21ede465d32008c1aa0 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/Adobe-Japan1-H-CID
|
| 492 |
+
833b3a817bd6db31eb4ec6ae719a765dbf2eb358 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/Adobe-Japan1-H-Host
|
| 493 |
+
46b64ee42a55a81e643131fa19837a6fb7094e02 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/Adobe-Japan1-H-Mac
|
| 494 |
+
c29524847c4d12dc59b5c6542098fe985cfb294f services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/Adobe-Japan1-PS-H
|
| 495 |
+
c24698b4a8300ec49a583828395ffc9498e42527 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/Adobe-Japan1-PS-V
|
| 496 |
+
599d35a819e162aad1eb97ddff52aa35ec6fa517 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/Adobe-Japan1-UCS2
|
| 497 |
+
1167675bd41d5fa35bc35dbd02b7483070220b29 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/EUC-H
|
| 498 |
+
b3796b7443f306b81c0b857b6d9d472f3f1faa84 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/EUC-V
|
| 499 |
+
a67d3409ce7ec59d34ee7bd5aff3e703af5dce84 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/Ext-H
|
| 500 |
+
fd6be155157daf82d09189b376fcca7b8facfeca services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/Ext-RKSJ-H
|
| 501 |
+
06f2ce07c5ac084b25786fa7d8a4514c1f1e15b5 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/Ext-RKSJ-V
|
| 502 |
+
dfe6d14face1eb9ad49b05f07403d8c60611eca1 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/Ext-V
|
| 503 |
+
f8efc4ed68400d9de0ab017c977b9ff15597fdf1 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/H
|
| 504 |
+
24cfcca3ff60c00add8b12a0d1cf47d03bc0deb9 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/Hankaku
|
| 505 |
+
f4983034846b44c8e6df204857ff37697a05dc64 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/Hiragana
|
| 506 |
+
4d33c8dec14ff765d6a83147c596c1b2f672d604 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/Hojo-EUC-H
|
| 507 |
+
223e544d2706c5d95751c55b1afe5420ca8d25ed services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/Hojo-EUC-V
|
| 508 |
+
35490e0858b9a4f826d80ecab5b00a494cff8bab services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/Hojo-H
|
| 509 |
+
0e3414499068f964bbc9f4e94040a30aa89b46dd services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/Hojo-V
|
| 510 |
+
7dbaffb7d3293c534070fbcb31794f10bdf74eb1 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/Katakana
|
| 511 |
+
4b8f7eb7d9b1765b18323be8c7aa1c7173b1f7cf services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/NWP-H
|
| 512 |
+
f44a34082bcf05655b4f4489a3a18b3089973c2c services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/NWP-V
|
| 513 |
+
46fd6237fd77d10bdf6925654253e4ab3e4b3950 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/RKSJ-H
|
| 514 |
+
7740b49416eb6b590a275fd67a3b80a7cfc22a60 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/RKSJ-V
|
| 515 |
+
74eb81051b0a6af02c0585dcb2ddbf2b3f5fd234 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/Roman
|
| 516 |
+
b51c943b20a3af3db5375dadae1e115806c4d73d services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/UCS2-90ms-RKSJ
|
| 517 |
+
8e7da02a8b0f0c7f9a79d8eb8a96bb5ab5d0fc24 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/UCS2-90pv-RKSJ
|
| 518 |
+
ca77057fb2e740885acd60c0b5176f3942e53aa4 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/UniHojo-UCS2-H
|
| 519 |
+
b82548d55002987bcf24feccc47f9b6865f1195d services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/UniHojo-UCS2-V
|
| 520 |
+
87ff21bc045019fae7baec05378cb9e23f8902d8 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/UniHojo-UTF16-H
|
| 521 |
+
ba7d520d5165d0c1f834f603af9ae507ad0681cc services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/UniHojo-UTF16-V
|
| 522 |
+
9685b63258a6931a68bdb9931126f65c908401e8 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/UniHojo-UTF32-H
|
| 523 |
+
1b9959ec5afc61bcab07b5ba51b9f68bf6981ce7 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/UniHojo-UTF32-V
|
| 524 |
+
e92a0fc7ec3005993bd15260beae80c33c250f91 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/UniHojo-UTF8-H
|
| 525 |
+
1d31b182e6cd26afaaf1c4d14d6de945e5b5ac06 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/UniHojo-UTF8-V
|
| 526 |
+
296c2ab8d609a9a9b9025277c350f4763533734d services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/UniJIS2004-UTF16-H
|
| 527 |
+
441af72004ffaa37064c77ce254113a8f9bc4c2a services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/UniJIS2004-UTF16-V
|
| 528 |
+
723328206a8d9a875c39c24ace32bcc649b38ea0 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/UniJIS2004-UTF32-H
|
| 529 |
+
ca945368992d110ed7d8637fd26ae3a4e3f5bcd0 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/UniJIS2004-UTF32-V
|
| 530 |
+
0169f03647f0a81ec6e7cb44c971665d90f97158 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/UniJIS2004-UTF8-H
|
| 531 |
+
c4f75c08a05edf94ceb73d917714ed29d61a1f93 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/UniJIS2004-UTF8-V
|
| 532 |
+
bb4b1208814e9829481d1b33b1b179c80ee3c5d1 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/UniJISPro-UCS2-HW-V
|
| 533 |
+
59d2d3d2fa01c0227b80989190490762a42bfe15 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/UniJISPro-UCS2-V
|
| 534 |
+
654601bcfd62c5c007dbb386b75708cbcb211a06 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/UniJISPro-UTF8-V
|
| 535 |
+
bf5331822801a655b922e0efaf786e1250b4216d services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/UniJIS-UCS2-H
|
| 536 |
+
ab516ed8a851126f4332608f19327bdc418fd8b8 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/UniJIS-UCS2-HW-H
|
| 537 |
+
311d584a1c207bd63e0967a8068590f98b72e896 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/UniJIS-UCS2-HW-V
|
| 538 |
+
7ade3d475e827114ca79d12640ada7bb48693a19 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/UniJIS-UCS2-V
|
| 539 |
+
11b725a80d6bf0aef98378558d83bd74df30dd4c services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/UniJIS-UTF16-H
|
| 540 |
+
f18f11e82efd487e3115f92eb70da35da947d256 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/UniJIS-UTF16-V
|
| 541 |
+
bdf61a04a29c82dec4c5e0945758ddbe0686dfa9 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/UniJIS-UTF32-H
|
| 542 |
+
e9a3b9eed686719fd116ec626f1908c613484948 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/UniJIS-UTF32-V
|
| 543 |
+
82ed8d1e664a2a3d974630533d206381e94f91f3 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/UniJIS-UTF8-H
|
| 544 |
+
5e673f2303834f1b4e20891ecaff9c1fedc5b33b services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/UniJIS-UTF8-V
|
| 545 |
+
069d6991ea4171349d79f701a04c6e761304a79c services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/UniJISX02132004-UTF32-H
|
| 546 |
+
bf6f0a7caa8349372255eb9dbe7765a883d62dde services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/UniJISX02132004-UTF32-V
|
| 547 |
+
ebe76f629d11bb0dcc0f0a6463d0d2e0cff6f611 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/UniJISX0213-UTF32-H
|
| 548 |
+
a7b8d41a6a379f6ac528afc80d833642bc690376 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/UniJISX0213-UTF32-V
|
| 549 |
+
e508e19ecf70faf17b5da0bfeec5b49b6dd38cbf services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/V
|
| 550 |
+
a450c2ad0ee4ee935b6f11b7c5d3703094629d76 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/WP-Symbol
|
| 551 |
+
047dbf61188afa0073e4263c744379b9b89a0cb7 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan2
|
| 552 |
+
b4abbe49ec37b2d446993a1be95671cbf2f7cf0b services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan2/Adobe-Japan2-0
|
| 553 |
+
ea9959b2f1d007b9a751e4c1cb21df8c01bb1307 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Korea1
|
| 554 |
+
903ef2fe13e5480fad45828130e08146b06b7025 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Korea1/Adobe-Korea1-0
|
| 555 |
+
e6f3bba58f85de84ad05af9a64f3b598452f7d2f services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Korea1/Adobe-Korea1-1
|
| 556 |
+
26c8ff78e06ac23862fb841becef6d60c462a2b6 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Korea1/Adobe-Korea1-2
|
| 557 |
+
e3a4ff547e5f3dd9b3fde4d120f12ed5fe18a77c services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Korea1/Adobe-Korea1-H-CID
|
| 558 |
+
5aa6e313b5305237c191ef2907f784bc58f939ea services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Korea1/Adobe-Korea1-H-Host
|
| 559 |
+
d3ba9dee0bc90ff378fb1defb83db5657f688602 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Korea1/Adobe-Korea1-H-Mac
|
| 560 |
+
ab8c4f52bfa2fce31492c1caaedbcb8794e3e165 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Korea1/Adobe-Korea1-KSCms-UHC
|
| 561 |
+
8665a742a0b77729e16001815c578d1b0ebd13d5 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Korea1/Adobe-Korea1-KSCpc-EUC
|
| 562 |
+
4c0c00dbc80d49e0e5b69c960158a7fe5cf6dc6c services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Korea1/Adobe-Korea1-UCS2
|
| 563 |
+
1b877a902a8d40c683c730102258a70ca548247d services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Korea1/KSC-EUC-H
|
| 564 |
+
46b28ed5d57068c733839c4a61fd07d835f0017f services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Korea1/KSC-EUC-V
|
| 565 |
+
d7c42cddc29b8888d7e9e95685bc3b4aebd3b786 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Korea1/KSC-H
|
| 566 |
+
a08cc92b2288dbb715ae1d4da7253e099194b389 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Korea1/KSC-Johab-H
|
| 567 |
+
6245a72b819abfd1da1f2040fca1c17e93770e08 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Korea1/KSC-Johab-V
|
| 568 |
+
84dbbdc3cb433d9fb8ab0169c8bc8b08c05c49fe services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Korea1/KSCms-UHC-H
|
| 569 |
+
6e89d5bd3672ec0104a14f98a653142e4decce07 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Korea1/KSCms-UHC-HW-H
|
| 570 |
+
32f182f71dd824b9b00b93910ae7f4d536408cfb services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Korea1/KSCms-UHC-HW-V
|
| 571 |
+
6d2297a4540c8a7f90c1509da6d8860b10d1730f services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Korea1/KSCms-UHC-UCS2
|
| 572 |
+
8939350e036f64f861a50283c8db4afaedba6003 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Korea1/KSCms-UHC-V
|
| 573 |
+
a5aae5a37a3359954e09d1effee1e9ccafd7d96b services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Korea1/KSCpc-EUC-H
|
| 574 |
+
fca17f924ab4f20d6763db19a3727d70aaec8ec0 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Korea1/KSCpc-EUC-UCS2
|
| 575 |
+
5ea87725ac0c6b73038090cbea26ca53ba3b17bd services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Korea1/KSCpc-EUC-UCS2C
|
| 576 |
+
c9615a341e09bf193af8307f9cbbba2008d07972 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Korea1/KSCpc-EUC-V
|
| 577 |
+
b0ee2ba209d7123bed8ae9af68a4ff46257f90d0 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Korea1/KSC-V
|
| 578 |
+
dc16001b7f80a46ad96ffb0a07c33b9156dcb71b services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Korea1/UCS2-KSCms-UHC
|
| 579 |
+
ddd27455320ff8643d3c0e0d7805aa6211cf24cb services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Korea1/UCS2-KSCpc-EUC
|
| 580 |
+
a7f64bd7c8e01039795a8d7eac11d90ad8500cf7 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Korea1/UniKS-UCS2-H
|
| 581 |
+
4ecc9df8bec428f27eab46a7f0aa3a3b4101ff14 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Korea1/UniKS-UCS2-V
|
| 582 |
+
61cab822075091ad36ed7abc975416bc8c408d3f services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Korea1/UniKS-UTF16-H
|
| 583 |
+
049fd21f02ab5eb253a3d3e594729eb4f396ebac services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Korea1/UniKS-UTF16-V
|
| 584 |
+
4f6c419826124b8b950cb39304e0a56cebc7a1b0 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Korea1/UniKS-UTF32-H
|
| 585 |
+
fe2fd2c28bce5892ce18330372be678f3588368e services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Korea1/UniKS-UTF32-V
|
| 586 |
+
148162cdc5ae02edf172f5b25e744f507f0bbd48 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Korea1/UniKS-UTF8-H
|
| 587 |
+
e06985999662b52e67b48601581e671b4c447153 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Korea1/UniKS-UTF8-V
|
| 588 |
+
d8f79e67690a4ed8956dc1c57735d3a406685a0b services/software/poppler-24.08.0/share/poppler/cMap/Adobe-KR
|
| 589 |
+
e87bc485e0587addee08b1ced23f5fc5465110a5 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-KR/Adobe-KR-0
|
| 590 |
+
210a09224ed51f9c172aaaf6614173b16190f79b services/software/poppler-24.08.0/share/poppler/cMap/Adobe-KR/Adobe-KR-1
|
| 591 |
+
6d6ee62aed11e7bc607871b9f7b72434c576a831 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-KR/Adobe-KR-2
|
| 592 |
+
75503388388d9f4f48c2a475b98555ffffc0335b services/software/poppler-24.08.0/share/poppler/cMap/Adobe-KR/Adobe-KR-3
|
| 593 |
+
b16a34168049afe7b86f416c8ca826f77b790cf4 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-KR/Adobe-KR-4
|
| 594 |
+
abd3b546f7e815e0431eaeb7bca6f2c793cb0d38 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-KR/Adobe-KR-5
|
| 595 |
+
cde3707f562c88bfc3f4b6e07b1afa121fec5a71 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-KR/Adobe-KR-6
|
| 596 |
+
654c5443c861e1f9c9fa0966d6beedb993df8d1a services/software/poppler-24.08.0/share/poppler/cMap/Adobe-KR/Adobe-KR-7
|
| 597 |
+
8c80219e66deb00a3ccb445b99f59cfe40e19392 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-KR/Adobe-KR-8
|
| 598 |
+
7f1f9a499a737b32f21152c20205032093328739 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-KR/Adobe-KR-9
|
| 599 |
+
05698686f0ec900ffa67c89349548dca0dc63fa5 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-KR/Adobe-KR-UCS2
|
| 600 |
+
7f0904446ce2b16855e08f8bfe5752470923550e services/software/poppler-24.08.0/share/poppler/cMap/Adobe-KR/UniAKR-UTF16-H
|
| 601 |
+
82b117b4f1846a88dc2cbb0364b8f5f643a53d4f services/software/poppler-24.08.0/share/poppler/cMap/Adobe-KR/UniAKR-UTF32-H
|
| 602 |
+
0853d1182d2302b1b8a1f890ecff0a716de9df09 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-KR/UniAKR-UTF8-H
|
| 603 |
+
5e53f88182fd288d28f43ba352d388587780e591 services/software/poppler-24.08.0/share/poppler/COPYING
|
| 604 |
+
d048f58bad011747136f76c9d8efb4e2492a9648 services/software/poppler-24.08.0/share/poppler/COPYING.adobe
|
| 605 |
+
d511905c1647a1e311e8b20d5930a37a9c2531cd services/software/poppler-24.08.0/share/poppler/COPYING.gpl2
|
| 606 |
+
a8a0b6c93a80038473c72a2ee165e23c35739842 services/software/poppler-24.08.0/share/poppler/Makefile
|
| 607 |
+
b68e032fd83fa2eda948fb2f97d663e33f3ac3fc services/software/poppler-24.08.0/share/poppler/nameToUnicode
|
| 608 |
+
1f2229b2a90a2934a722a921acd056fff54ff770 services/software/poppler-24.08.0/share/poppler/nameToUnicode/Bulgarian
|
| 609 |
+
351d111ee5119f2c47e0782b0a3d48151cfd905b services/software/poppler-24.08.0/share/poppler/nameToUnicode/Greek
|
| 610 |
+
8fdc894b7ad86439d7b42968ed3a9811ea5613d1 services/software/poppler-24.08.0/share/poppler/nameToUnicode/Thai
|
| 611 |
+
d76795253ad4ddff800cb1c1792895e4a4f7b79e services/software/poppler-24.08.0/share/poppler/poppler-data.pc
|
| 612 |
+
b9741162db507c1b617d0bac0426e5610feb023b services/software/poppler-24.08.0/share/poppler/poppler-data.pc.in
|
| 613 |
+
787f6d7593170c2b629485b1d51f84126ccd2d02 services/software/poppler-24.08.0/share/poppler/README
|
| 614 |
+
716e5f0fadff577f91955484b46cca6d4791e762 services/software/poppler-24.08.0/share/poppler/unicodeMap
|
| 615 |
+
ec1dbc02a336defe017d881fe4d72c238a2b5493 services/software/poppler-24.08.0/share/poppler/unicodeMap/Big5
|
| 616 |
+
cbcd04488ff33ba575ba90d8188a19e248b6ea98 services/software/poppler-24.08.0/share/poppler/unicodeMap/Big5ascii
|
| 617 |
+
7cc16e654cc03d73a7132df668a924361a18abf4 services/software/poppler-24.08.0/share/poppler/unicodeMap/EUC-CN
|
| 618 |
+
4ed2544bcca799f5c12bfe2088e5579ded6f1dda services/software/poppler-24.08.0/share/poppler/unicodeMap/EUC-JP
|
| 619 |
+
1d2a95fd36da219f91482dcc0d485557c41a102d services/software/poppler-24.08.0/share/poppler/unicodeMap/GBK
|
| 620 |
+
c41eb28a83907d1bba287c1c70a909e4e2c70d08 services/software/poppler-24.08.0/share/poppler/unicodeMap/ISO-2022-CN
|
| 621 |
+
1c6af6a400bfade812f5c33d95d40cc37365f4ef services/software/poppler-24.08.0/share/poppler/unicodeMap/ISO-2022-JP
|
| 622 |
+
7e37b4909260a96b5461e745cee1524c872bc7d4 services/software/poppler-24.08.0/share/poppler/unicodeMap/ISO-2022-KR
|
| 623 |
+
25bee9eb08e43af72fb20a1930ab45267426aefa services/software/poppler-24.08.0/share/poppler/unicodeMap/ISO-8859-6
|
| 624 |
+
3a4768911667adbe157a0e2196f554956c1b140c services/software/poppler-24.08.0/share/poppler/unicodeMap/ISO-8859-7
|
| 625 |
+
970a7cdf0aaacec2fc4ff0fbb76beaf35fea45a5 services/software/poppler-24.08.0/share/poppler/unicodeMap/ISO-8859-8
|
| 626 |
+
6326ca669d36251f85cf80237cd240916eae298e services/software/poppler-24.08.0/share/poppler/unicodeMap/ISO-8859-9
|
| 627 |
+
8869ede78ba20cbb8f820b583643177bd92202d5 services/software/poppler-24.08.0/share/poppler/unicodeMap/KOI8-R
|
| 628 |
+
993931e680ccd3f56b2505bd7966eea412e4eec7 services/software/poppler-24.08.0/share/poppler/unicodeMap/Latin2
|
| 629 |
+
a55e584143533c881b3d7a932cb051319af87550 services/software/poppler-24.08.0/share/poppler/unicodeMap/Shift-JIS
|
| 630 |
+
b336e8782e4c6cc473f85c13f374019e2df6d016 services/software/poppler-24.08.0/share/poppler/unicodeMap/TIS-620
|
| 631 |
+
f792be75b5fd724821506ea28676823947d4b80c services/software/poppler-24.08.0/share/poppler/unicodeMap/Windows-1255
|
| 632 |
+
67b1b7ab5306bf1d14effe8d4cf7403b11262237 services/software/Tesseract-OCR
|
| 633 |
+
bc5cee639b404416e56f0659ab2e8b2fb67cdfa0 services/software/Tesseract-OCR/ambiguous_words.1.html
|
| 634 |
+
82becf9ec64ae44cf2045a27f2306965c1dd4d83 services/software/Tesseract-OCR/ambiguous_words.exe
|
| 635 |
+
7458133be8d759f7f5545b21bf91fe6d2fe134bd services/software/Tesseract-OCR/classifier_tester.1.html
|
| 636 |
+
65024a4f4f87f0c9d643f52e2654fec7b527b26f services/software/Tesseract-OCR/classifier_tester.exe
|
| 637 |
+
cd8d0ea404ff2c43b5731233a39b1960897227e6 services/software/Tesseract-OCR/cntraining.1.html
|
| 638 |
+
1ecc72ad141765ceb411184cc1370f62aba222ba services/software/Tesseract-OCR/cntraining.exe
|
| 639 |
+
0c1d58261ee6fd4fdec9f99f32122e861223753f services/software/Tesseract-OCR/combine_lang_model.1.html
|
| 640 |
+
16bb44dc152e05e93a379b0e3c1cbd519f331990 services/software/Tesseract-OCR/combine_lang_model.exe
|
| 641 |
+
e689c17e05681abefe26be2b9a281ad49b7fab13 services/software/Tesseract-OCR/combine_tessdata.1.html
|
| 642 |
+
7cfb65471a7c5d05bdb3fc99c8abf9865d460720 services/software/Tesseract-OCR/combine_tessdata.exe
|
| 643 |
+
4ae7b9283b1d2861d62515056bf8d21a0b6cfea2 services/software/Tesseract-OCR/dawg2wordlist.1.html
|
| 644 |
+
432f9763da44cc1a9e8a5f82ca28e207dcb4e8f7 services/software/Tesseract-OCR/dawg2wordlist.exe
|
| 645 |
+
3977bf96bea32e26844b9572d2964d74869bf633 services/software/Tesseract-OCR/doc
|
| 646 |
+
9d1e73c3083260ae9485e7d07f6ac1fa271737fb services/software/Tesseract-OCR/doc/AUTHORS
|
| 647 |
+
d645695673349e3947e8e5ae42332d0ac3164cd7 services/software/Tesseract-OCR/doc/LICENSE
|
| 648 |
+
99da6d275def3332f577e1554c0dca98c7ebda7a services/software/Tesseract-OCR/doc/README.md
|
| 649 |
+
9b64829aba22310ffafe685ded30b37a126b4962 services/software/Tesseract-OCR/libarchive-13.dll
|
| 650 |
+
1c1166a758d115949698f7ca4f48fb1287d37f4f services/software/Tesseract-OCR/libb2-1.dll
|
| 651 |
+
6e49a79e514c0758a4d0a845f70924c6c2170299 services/software/Tesseract-OCR/libbrotlicommon.dll
|
| 652 |
+
c67e14b5053dd81bd35747db1e90b2f7798de3ae services/software/Tesseract-OCR/libbrotlidec.dll
|
| 653 |
+
6f7db4827a41fef8a3aaa03efa31e72be3b7d366 services/software/Tesseract-OCR/libbz2-1.dll
|
| 654 |
+
3a35c115310eb54c031f603ca60fa31ace908df1 services/software/Tesseract-OCR/libcairo-2.dll
|
| 655 |
+
6fc26c9edd0220716d0313a7d14f3495297a2f10 services/software/Tesseract-OCR/libcrypto-3-x64.dll
|
| 656 |
+
b096c47d7c0022147e530c8009d9808e1569d743 services/software/Tesseract-OCR/libcurl-4.dll
|
| 657 |
+
672e29208adc991593fcef2efbafc2728157cbc3 services/software/Tesseract-OCR/libdatrie-1.dll
|
| 658 |
+
dd1505a81e7e89a815d4b3898ac6a2427ba45605 services/software/Tesseract-OCR/libdeflate.dll
|
| 659 |
+
78cd67b0890ca50cd311ca992a3a59644c9064ae services/software/Tesseract-OCR/libexpat-1.dll
|
| 660 |
+
77212def06935f83edb0e56be1ab550c46d680d9 services/software/Tesseract-OCR/libffi-8.dll
|
| 661 |
+
42edff502a584042bb6d6cf55e37e38af3d7e40e services/software/Tesseract-OCR/libfontconfig-1.dll
|
| 662 |
+
0b4250e04bb19668d9d5723f7d8bb11184904458 services/software/Tesseract-OCR/libfreetype-6.dll
|
| 663 |
+
19b30d590a03b49b091c48a4f619a8fd5d80a20e services/software/Tesseract-OCR/libfribidi-0.dll
|
| 664 |
+
cd1efb4b7af4abb238a543fdd2562e3ddf2a34a3 services/software/Tesseract-OCR/libgcc_s_seh-1.dll
|
| 665 |
+
5693bac25dbd497caa771b108b80ac6e799583dc services/software/Tesseract-OCR/libgif-7.dll
|
| 666 |
+
b8805159fcfb05846ce6979e8b313aaa617487c0 services/software/Tesseract-OCR/libgio-2.0-0.dll
|
| 667 |
+
884858efca1c2076618e1b98dbee6f578e7af398 services/software/Tesseract-OCR/libglib-2.0-0.dll
|
| 668 |
+
c95eb9947475b6fe9c5356623be8d0fe6432ebb0 services/software/Tesseract-OCR/libgmodule-2.0-0.dll
|
| 669 |
+
eec8d09494f28c3bc6e4b3338f8c93df61385b84 services/software/Tesseract-OCR/libgobject-2.0-0.dll
|
| 670 |
+
9b5178ac8ab3cc3656cad59e95d56f41f888310d services/software/Tesseract-OCR/libgraphite2.dll
|
| 671 |
+
d148bd8d34d454f3dae23dfddd8f234a49adc95b services/software/Tesseract-OCR/libharfbuzz-0.dll
|
| 672 |
+
34abf65eb7d43718fd74e3d954c617274216fb3e services/software/Tesseract-OCR/libiconv-2.dll
|
| 673 |
+
95ebd5abbda37376573b025d7db81870e0eb8f77 services/software/Tesseract-OCR/libicudt74.dll
|
| 674 |
+
627628997c7bb54e1f053877b7d778118d326fd4 services/software/Tesseract-OCR/libicuin74.dll
|
| 675 |
+
497222f9bab31232a7f78ea8a712eed5397f1997 services/software/Tesseract-OCR/libicuuc74.dll
|
| 676 |
+
37d62690f0d47e78067911251c4933965c7f08ab services/software/Tesseract-OCR/libidn2-0.dll
|
| 677 |
+
2aed7ad9c1b6b841f911269b6c17ddc2d56cfda6 services/software/Tesseract-OCR/libintl-8.dll
|
| 678 |
+
9bee42fd5a922d62660c5d71a53c2ad830c7c019 services/software/Tesseract-OCR/libjbig-0.dll
|
| 679 |
+
d45e627fdbe9d88fcebb20bb672b1aca68db803d services/software/Tesseract-OCR/libjpeg-8.dll
|
| 680 |
+
5f06383c1f9da5edd60d3c8ea1d0f65e6eb50ae4 services/software/Tesseract-OCR/libleptonica-6.dll
|
| 681 |
+
1c089e20ba3aa0a64a9af9fc49db564eab85a52d services/software/Tesseract-OCR/libLerc.dll
|
| 682 |
+
df85958c15533b23ab75ce58bd42c89ff26ce0e2 services/software/Tesseract-OCR/liblz4.dll
|
| 683 |
+
5ec3362724e3e84349599c42960281e32445830b services/software/Tesseract-OCR/liblzma-5.dll
|
| 684 |
+
74b3f134e4e91dcf61603f334fa688c30c1b3907 services/software/Tesseract-OCR/libopenjp2-7.dll
|
| 685 |
+
e86c4cfbabdb9b53d3c0eae620f154f9460a083c services/software/Tesseract-OCR/libpango-1.0-0.dll
|
| 686 |
+
cd072eb6f559c1981669330a4ffb598be8e02e2e services/software/Tesseract-OCR/libpangocairo-1.0-0.dll
|
| 687 |
+
8b17f7421be6c91a16e81f226814500efe579a2a services/software/Tesseract-OCR/libpangoft2-1.0-0.dll
|
| 688 |
+
a4fe8203f5aaf2ff328466dfec6b4c433ae1cc8e services/software/Tesseract-OCR/libpangowin32-1.0-0.dll
|
| 689 |
+
0349abf83154a6301d1e2b1b19c48ac703178360 services/software/Tesseract-OCR/libpcre2-8-0.dll
|
| 690 |
+
535ea7c78ba493f7187e984b47f901fc6c56bd9c services/software/Tesseract-OCR/libpixman-1-0.dll
|
| 691 |
+
4e7c3ac364ab521ea3580ab127c8f87c0ea0b30d services/software/Tesseract-OCR/libpng16-16.dll
|
| 692 |
+
74ed8044917fd71f100d3c75a4cc7295013ee61e services/software/Tesseract-OCR/libpsl-5.dll
|
| 693 |
+
22f3ee25ca999f021238a84fce073c2fb2b44945 services/software/Tesseract-OCR/libsharpyuv-0.dll
|
| 694 |
+
2860272c6336c51479779327a40e5014f35f5455 services/software/Tesseract-OCR/libssh2-1.dll
|
| 695 |
+
0ec8296d9e50a3225f88d4968161ed6348b2d8f6 services/software/Tesseract-OCR/libstdc++-6.dll
|
| 696 |
+
6ee07fc831d1cebed554b76cfdb75490bd8d48e2 services/software/Tesseract-OCR/libtesseract-5.dll
|
| 697 |
+
b931aad412604d3f4ae88b369212af7af8c3156a services/software/Tesseract-OCR/libthai-0.dll
|
| 698 |
+
ffbfe6d3cf9b17d9a41073943d3324f4719e665c services/software/Tesseract-OCR/libtiff-6.dll
|
| 699 |
+
95815c468603b80b47ad20ecca6b60d202fc5f58 services/software/Tesseract-OCR/libunistring-5.dll
|
| 700 |
+
2d457d71b47975d3bbb090069b0c570a993f3483 services/software/Tesseract-OCR/libwebp-7.dll
|
| 701 |
+
43ab09535c1f3909d24209a9c49b58bef7a00efc services/software/Tesseract-OCR/libwebpmux-3.dll
|
| 702 |
+
362cfc0f5752c8f49e5acd99b3982c485804afd3 services/software/Tesseract-OCR/libwinpthread-1.dll
|
| 703 |
+
d59a28d172b49f010c27d722ecf3f8fee101afaf services/software/Tesseract-OCR/libzstd.dll
|
| 704 |
+
d5ce355e39af2e4424d3aefca1ae392274bf1879 services/software/Tesseract-OCR/lstmeval.1.html
|
| 705 |
+
3658bcd2c9c07952d3f7b431a47c2a3d107d4e1f services/software/Tesseract-OCR/lstmeval.exe
|
| 706 |
+
85651c80465af6445c79ecc716c110b9df966717 services/software/Tesseract-OCR/lstmtraining.1.html
|
| 707 |
+
b0ccfd764eeca12871867d21728c9351846c3afc services/software/Tesseract-OCR/lstmtraining.exe
|
| 708 |
+
b321b768f5afa23fc4d335bab23193423032e14f services/software/Tesseract-OCR/merge_unicharsets.1.html
|
| 709 |
+
bd947e775a39033b591e116b4f6eee83f1897ac2 services/software/Tesseract-OCR/merge_unicharsets.exe
|
| 710 |
+
6ff757ba1a9173e475b84e5b25d5983263fb31e1 services/software/Tesseract-OCR/mftraining.1.html
|
| 711 |
+
fb1b10b73324930ccd63d5f0ccca873dd903b408 services/software/Tesseract-OCR/mftraining.exe
|
| 712 |
+
98088653dea9b78be6116d672a3391a09f2b1753 services/software/Tesseract-OCR/set_unicharset_properties.1.html
|
| 713 |
+
0bd70f8563a742391ebbdd7fd23bd74459a46e21 services/software/Tesseract-OCR/set_unicharset_properties.exe
|
| 714 |
+
8085791f02ae971abcc43bb3b4cdbbf1f9fe1091 services/software/Tesseract-OCR/shapeclustering.1.html
|
| 715 |
+
245d3d0bac84139d22f389192ee862c5673ce82e services/software/Tesseract-OCR/shapeclustering.exe
|
| 716 |
+
461f252fa0ba1e5917fe326ac78010932e78fedc services/software/Tesseract-OCR/tessdata
|
| 717 |
+
09e69cf5478cd6a0fb3ec5e7e7fa95a04f5cafb3 services/software/Tesseract-OCR/tessdata/afr.traineddata
|
| 718 |
+
7a302b2bf6306c34177f594e0824eafc48906965 services/software/Tesseract-OCR/tessdata/amh.traineddata
|
| 719 |
+
c8d129c67821c1592cac46836686b057ecc203dc services/software/Tesseract-OCR/tessdata/ara.traineddata
|
| 720 |
+
086035c6eacd5788c1f06d58c250023cee2aeb28 services/software/Tesseract-OCR/tessdata/asm.traineddata
|
| 721 |
+
27bc73edf08e5e5f0c3e43c315c5c6d965c2f075 services/software/Tesseract-OCR/tessdata/aze.traineddata
|
| 722 |
+
e2b1b953a5b8db9247c6ddfcb58f062dc0b3b574 services/software/Tesseract-OCR/tessdata/aze_cyrl.traineddata
|
| 723 |
+
65d83dad535f876de31847f5fa2ff1bdd57c7bab services/software/Tesseract-OCR/tessdata/bel.traineddata
|
| 724 |
+
7e9054d1de309714009a85555f5276168d41af9c services/software/Tesseract-OCR/tessdata/ben.traineddata
|
| 725 |
+
7bb5029466eaef46aad59fc23b96648df0e4f176 services/software/Tesseract-OCR/tessdata/bod.traineddata
|
| 726 |
+
95bed5c32e3759347db0471569303f06e3485f42 services/software/Tesseract-OCR/tessdata/bos.traineddata
|
| 727 |
+
c01691329561938fb7d491ea7611c591202952dd services/software/Tesseract-OCR/tessdata/bre.traineddata
|
| 728 |
+
1e65588d127d918ef3ba95b785b446f15827d60f services/software/Tesseract-OCR/tessdata/bul.traineddata
|
| 729 |
+
3fcd350dd2bb76503de90249111fff4e3c6aa0f0 services/software/Tesseract-OCR/tessdata/cat.traineddata
|
| 730 |
+
5a1b96928e54b175db96f00d2aa84b5878d301b9 services/software/Tesseract-OCR/tessdata/ceb.traineddata
|
| 731 |
+
dd6fc79a62f9fcd1c7c6da06b31bb4fdb10dc173 services/software/Tesseract-OCR/tessdata/ces.traineddata
|
| 732 |
+
388bac276d033d06e5ed5ba7a7ad14ae58f97dab services/software/Tesseract-OCR/tessdata/chi_sim.traineddata
|
| 733 |
+
f9898e91068a9d04bcacf6d2a244da40e9f30c0c services/software/Tesseract-OCR/tessdata/chi_sim_vert.traineddata
|
| 734 |
+
1955cd8b8d076b898616e9c2c1ace65b43105356 services/software/Tesseract-OCR/tessdata/chi_tra.traineddata
|
| 735 |
+
94bc5dbd7fa25dd89ac9c5bd18f3fc6d8409aa0e services/software/Tesseract-OCR/tessdata/chi_tra_vert.traineddata
|
| 736 |
+
e0799a2b888466e5bc2ca60f1f2fb4a7ff4c6990 services/software/Tesseract-OCR/tessdata/chr.traineddata
|
| 737 |
+
d089c65b686fee201a62f40f50b3383a3a971f04 services/software/Tesseract-OCR/tessdata/configs
|
| 738 |
+
0dd12a7a709c14e267fb7141cd9ef705102b8a3a services/software/Tesseract-OCR/tessdata/configs/alto
|
| 739 |
+
23035a1904cfb8a2e5ad143ac638447bc1b04b4c services/software/Tesseract-OCR/tessdata/configs/ambigs.train
|
| 740 |
+
5cd6ec0310213adbc59e5c48a49f858daf3cdc4f services/software/Tesseract-OCR/tessdata/configs/api_config
|
| 741 |
+
5d6c2d061f4a0bae8ab3b2270da8e6744a048d11 services/software/Tesseract-OCR/tessdata/configs/bigram
|
| 742 |
+
d39f2687ef8c50f090895ba1f26367e25613a685 services/software/Tesseract-OCR/tessdata/configs/box.train
|
| 743 |
+
82754e9cc90b7da072c9074e7ee1492beaa72db6 services/software/Tesseract-OCR/tessdata/configs/box.train.stderr
|
| 744 |
+
6a329f892910ae9dd7af1f9fe8f7a1d48378fd8b services/software/Tesseract-OCR/tessdata/configs/digits
|
| 745 |
+
7d00b613ffcbf7e4fa712d2c50a85c7643a027e3 services/software/Tesseract-OCR/tessdata/configs/get.images
|
| 746 |
+
5ab372eaf819b05bdd87ba419c874f6a1be4677b services/software/Tesseract-OCR/tessdata/configs/hocr
|
| 747 |
+
252f1a171a154f9ade798e210015a720af039d00 services/software/Tesseract-OCR/tessdata/configs/inter
|
| 748 |
+
c6ac105788137bc4e89821e94843ea86ed5b4564 services/software/Tesseract-OCR/tessdata/configs/kannada
|
| 749 |
+
bd9c114df65ddf13e640298075adb940225c5f96 services/software/Tesseract-OCR/tessdata/configs/linebox
|
| 750 |
+
a160f9be275a70fe3af1935fb8fe7af29efa8451 services/software/Tesseract-OCR/tessdata/configs/logfile
|
| 751 |
+
5ff37726211ab360ceead7c76a1b52613cc2f277 services/software/Tesseract-OCR/tessdata/configs/lstm.train
|
| 752 |
+
a6f2cedc504e9010eec3bfb0b1336b75ef0c28e5 services/software/Tesseract-OCR/tessdata/configs/lstmbox
|
| 753 |
+
3fa3dee71aafe30913c1863a5e67529872984743 services/software/Tesseract-OCR/tessdata/configs/lstmdebug
|
| 754 |
+
3d90ac26f9542c6beac1082b2d900859906af8e9 services/software/Tesseract-OCR/tessdata/configs/makebox
|
| 755 |
+
9928884cd0238d15533d30f1445df85695d814cc services/software/Tesseract-OCR/tessdata/configs/page
|
| 756 |
+
59645d71ce52a143d819f2057c8c4e9ce2d46e40 services/software/Tesseract-OCR/tessdata/configs/pdf
|
| 757 |
+
35b59a9d41dd462c6d13b2301d4b2c31219c582f services/software/Tesseract-OCR/tessdata/configs/quiet
|
| 758 |
+
f8342b4c2c7eb733e1d4078f32a0aa5aee677cc3 services/software/Tesseract-OCR/tessdata/configs/rebox
|
| 759 |
+
e95b59263daf6d43f1b20682a4fa79d386484536 services/software/Tesseract-OCR/tessdata/configs/strokewidth
|
| 760 |
+
dc52478177fd6fb7b1fe278e1374c2054f3e2442 services/software/Tesseract-OCR/tessdata/configs/tsv
|
| 761 |
+
a0cc952977f0f3562a5c94011c13044ace865519 services/software/Tesseract-OCR/tessdata/configs/txt
|
| 762 |
+
d2e22f5b93585032eef94f22966329144ba44d6f services/software/Tesseract-OCR/tessdata/configs/unlv
|
| 763 |
+
38cd41cd60f89ec7ab3bc5161e094b20f06a3361 services/software/Tesseract-OCR/tessdata/configs/wordstrbox
|
| 764 |
+
3105b7fb0cd6c26f4fb144ec5d594430e88927cb services/software/Tesseract-OCR/tessdata/cos.traineddata
|
| 765 |
+
900cf17f74514934f87e9a8df3b29cb16b5606fe services/software/Tesseract-OCR/tessdata/cym.traineddata
|
| 766 |
+
85501b582937493f9ae6a64ccd0a6bb0a2ea33d5 services/software/Tesseract-OCR/tessdata/dan.traineddata
|
| 767 |
+
97ed7b2b60f2771c07040660ef0f6daf596dc7bf services/software/Tesseract-OCR/tessdata/deu.traineddata
|
| 768 |
+
53b46df7d6ae94f75913d6377182867ea09d950b services/software/Tesseract-OCR/tessdata/div.traineddata
|
| 769 |
+
3c31175be56ab4db42af614f384ea52ce949082c services/software/Tesseract-OCR/tessdata/dzo.traineddata
|
| 770 |
+
ed98ae1a88d84414da316e6eeab3232f2c68639b services/software/Tesseract-OCR/tessdata/ell.traineddata
|
| 771 |
+
bbef4675053b5b468cdb477053e28b1c698ba08e services/software/Tesseract-OCR/tessdata/eng.traineddata
|
| 772 |
+
5daba44df897f1c6d67caeb6d0414f7b55625fa1 services/software/Tesseract-OCR/tessdata/eng.user-patterns
|
| 773 |
+
e0c5a630214ac69273e2b54107c62ed171fc50a0 services/software/Tesseract-OCR/tessdata/eng.user-words
|
| 774 |
+
e49b5b86da60f2e728ff2b7f4357692ac32b6a6d services/software/Tesseract-OCR/tessdata/enm.traineddata
|
| 775 |
+
235fc67adf52f43d34b409d44d426d560aefc8e3 services/software/Tesseract-OCR/tessdata/epo.traineddata
|
| 776 |
+
27b470378dc8718f1dc5a93931fefa3340336e4d services/software/Tesseract-OCR/tessdata/equ.traineddata
|
| 777 |
+
a2b52c3388358e6dfc4eb8d64d8fc6afbb3630ea services/software/Tesseract-OCR/tessdata/est.traineddata
|
| 778 |
+
6247f975443ec82c219c39e0b5ea76b4833c82fe services/software/Tesseract-OCR/tessdata/eus.traineddata
|
| 779 |
+
1b845e73759785908aef57161ae4c86a70cce622 services/software/Tesseract-OCR/tessdata/fao.traineddata
|
| 780 |
+
1a17ee02076107e73abd15d2038389150c8f824f services/software/Tesseract-OCR/tessdata/fas.traineddata
|
| 781 |
+
785f80decce6ddb6b50bd99f4840414359c806ff services/software/Tesseract-OCR/tessdata/fil.traineddata
|
| 782 |
+
73f92402f1891b9066e0e145f245145a2402105c services/software/Tesseract-OCR/tessdata/fin.traineddata
|
| 783 |
+
d9e2b2160be0d1ca3b8f1bf2730fae476ef3b4a6 services/software/Tesseract-OCR/tessdata/fra.traineddata
|
| 784 |
+
d473893bcabcef536ed36480f976fcce482bd87c services/software/Tesseract-OCR/tessdata/frk.traineddata
|
| 785 |
+
ed06039efef821b78f22c86abb6c5aea7f02461e services/software/Tesseract-OCR/tessdata/frm.traineddata
|
| 786 |
+
17199d2c33e201d6ad4003a6c86db5f8f273ddc1 services/software/Tesseract-OCR/tessdata/fry.traineddata
|
| 787 |
+
e8bae7f1863dd1872ab7d2b2e7f319874c480e60 services/software/Tesseract-OCR/tessdata/gla.traineddata
|
| 788 |
+
a7abc7be9aadc862b31ab7c7bc672051cd0245fb services/software/Tesseract-OCR/tessdata/gle.traineddata
|
| 789 |
+
7bc00b38f40f8de1575397f7d05387e5fbbacca4 services/software/Tesseract-OCR/tessdata/glg.traineddata
|
| 790 |
+
e94990006fc18e88ab120e7ca6681cc3b290269b services/software/Tesseract-OCR/tessdata/grc.traineddata
|
| 791 |
+
151b9aad2945e3103118e5d36eee288f631d985a services/software/Tesseract-OCR/tessdata/guj.traineddata
|
| 792 |
+
30d3baeaeef791781d782e58feb415b25921df3f services/software/Tesseract-OCR/tessdata/hat.traineddata
|
| 793 |
+
7356caf3cddc9c867fe6727e17726727b8284608 services/software/Tesseract-OCR/tessdata/heb.traineddata
|
| 794 |
+
a8f0aaec09378115b12a2c6287c57695d082aea2 services/software/Tesseract-OCR/tessdata/hin.traineddata
|
| 795 |
+
6dd4f8638a58eb0663e8f9a80a355c505dcf01a6 services/software/Tesseract-OCR/tessdata/hrv.traineddata
|
| 796 |
+
5d24fa8e922d6b57853dcb0cc490060c76643cab services/software/Tesseract-OCR/tessdata/hun.traineddata
|
| 797 |
+
ec2e2f3adea785e8964b9771871c44349a6e1b40 services/software/Tesseract-OCR/tessdata/hye.traineddata
|
| 798 |
+
6eab87ffe818b5f89baa869c458cb0a6dbed6b2d services/software/Tesseract-OCR/tessdata/iku.traineddata
|
| 799 |
+
3013f50cd2af9aceca00e865ed889144865f0848 services/software/Tesseract-OCR/tessdata/ind.traineddata
|
| 800 |
+
20d3bdf8cb8f2289a1f45aa9cdf4ddf2a22e7462 services/software/Tesseract-OCR/tessdata/isl.traineddata
|
| 801 |
+
edbffbe0e51892b240630b5eeabededa7e7c9c4f services/software/Tesseract-OCR/tessdata/ita.traineddata
|
| 802 |
+
c8a2c3c3d8c82a2d953b0fc64b949c1aa0918c09 services/software/Tesseract-OCR/tessdata/ita_old.traineddata
|
| 803 |
+
3155b8184d50af28dbf8dcbd972e26b388ab1581 services/software/Tesseract-OCR/tessdata/jav.traineddata
|
| 804 |
+
45658654712b88d45c9464286ffc2fcb07036bdf services/software/Tesseract-OCR/tessdata/jaxb-api-2.3.1.jar
|
| 805 |
+
c4178f89991bde90b7fdc647e3e1901868423bd0 services/software/Tesseract-OCR/tessdata/jpn.traineddata
|
| 806 |
+
43f38defe4b83588876d0d7a6dee928be1b73af0 services/software/Tesseract-OCR/tessdata/jpn_vert.traineddata
|
| 807 |
+
78252baeed24bcf327e62226c321c60242108a24 services/software/Tesseract-OCR/tessdata/kan.traineddata
|
| 808 |
+
1a3ae11fdd248891dd3fc74f156a0ce246ec1a15 services/software/Tesseract-OCR/tessdata/kat.traineddata
|
| 809 |
+
f4ae5ab4b3fe4bb3226639d9b23fa71513a40ec8 services/software/Tesseract-OCR/tessdata/kat_old.traineddata
|
| 810 |
+
f889e2b8ffd093d4f2dff8ffca2fa0b73296c028 services/software/Tesseract-OCR/tessdata/kaz.traineddata
|
| 811 |
+
d466dc2a7e35bf90cb7b54364985703728398687 services/software/Tesseract-OCR/tessdata/khm.traineddata
|
| 812 |
+
3e04f2954f33dd021b95de4befffb68904d9e142 services/software/Tesseract-OCR/tessdata/kir.traineddata
|
| 813 |
+
d1afefb7c5a67e273c6612aba77753021506b557 services/software/Tesseract-OCR/tessdata/kmr.traineddata
|
| 814 |
+
60986d44497689f3abace0b148199476d93292e1 services/software/Tesseract-OCR/tessdata/kor.traineddata
|
| 815 |
+
10bd41ae9352889f85a489eb3183eb0cbebc2516 services/software/Tesseract-OCR/tessdata/lao.traineddata
|
| 816 |
+
30dab6a24339f262d1eb21a3ee272d16c46aeba3 services/software/Tesseract-OCR/tessdata/lat.traineddata
|
| 817 |
+
71d925c8b6c73980157fd0128412b46e6e8396b5 services/software/Tesseract-OCR/tessdata/lav.traineddata
|
| 818 |
+
af9e2b3cd6a65650206b7d89f1b93b51683b9692 services/software/Tesseract-OCR/tessdata/lit.traineddata
|
| 819 |
+
c1ac5b922bbcad34b2654ba471c0a752c0397404 services/software/Tesseract-OCR/tessdata/ltz.traineddata
|
| 820 |
+
70e96f02cbc2f26630225112cd323a7f0b6ccdf3 services/software/Tesseract-OCR/tessdata/mal.traineddata
|
| 821 |
+
79138fadcdb256ec7b59e3bf9df18bd5fb492bee services/software/Tesseract-OCR/tessdata/mar.traineddata
|
| 822 |
+
fb0b245fb9ec61696e818887a70d8413b2914905 services/software/Tesseract-OCR/tessdata/mkd.traineddata
|
| 823 |
+
4242f9cd016987f16feb06973e988eced9604787 services/software/Tesseract-OCR/tessdata/mlt.traineddata
|
| 824 |
+
2ef212c519edc66ff2508f48dbe1bb836a4ea274 services/software/Tesseract-OCR/tessdata/mon.traineddata
|
| 825 |
+
eab6b1a98e4b6ed510d6443a5e3d14519da3b338 services/software/Tesseract-OCR/tessdata/mri.traineddata
|
| 826 |
+
f0e2b8bef0a681f09baac99a418529205ee80201 services/software/Tesseract-OCR/tessdata/msa.traineddata
|
| 827 |
+
cf28ddca604dc7f46bc34f2f4c6a193a0706c03b services/software/Tesseract-OCR/tessdata/mya.traineddata
|
| 828 |
+
948e365b55f9fe8179dde2ff0134feffb210496e services/software/Tesseract-OCR/tessdata/nep.traineddata
|
| 829 |
+
53ce95a9c2488a9a0228939944a184157373d0ae services/software/Tesseract-OCR/tessdata/nld.traineddata
|
| 830 |
+
9209df2c9904c127437c07e16c287cdefd024e7c services/software/Tesseract-OCR/tessdata/nor.traineddata
|
| 831 |
+
4017d4405b09333f22a3de2a4d30cf009bdb4a9b services/software/Tesseract-OCR/tessdata/oci.traineddata
|
| 832 |
+
ae0f9ed13d5c9ad4a4de57c7266c434b83a9f583 services/software/Tesseract-OCR/tessdata/ori.traineddata
|
| 833 |
+
527457ca8f8fe1fda7c2f88bce3c0e4be12be9d0 services/software/Tesseract-OCR/tessdata/osd.traineddata
|
| 834 |
+
d4f00533a6c76ce4045aa6ad40b39f47eeaa333f services/software/Tesseract-OCR/tessdata/pan.traineddata
|
| 835 |
+
d1472b20ef1aebbf5e11573867e9ac13873681b9 services/software/Tesseract-OCR/tessdata/pdf.ttf
|
| 836 |
+
df84ed5cc8059d640876d3be0ac4c11af0bf0853 services/software/Tesseract-OCR/tessdata/piccolo2d-core-3.0.1.jar
|
| 837 |
+
daf51c0ebbea07291c85cab9bc81b19ef0e99efc services/software/Tesseract-OCR/tessdata/piccolo2d-extras-3.0.1.jar
|
| 838 |
+
2382f568f0ce0c4c0a7f4380a291255514e5e97f services/software/Tesseract-OCR/tessdata/pol.traineddata
|
| 839 |
+
e9f373e95c66b4bf557c263721ef31f78e5bc301 services/software/Tesseract-OCR/tessdata/por.traineddata
|
| 840 |
+
220cdf92efdc76a227439c0b8734196af9743b98 services/software/Tesseract-OCR/tessdata/pus.traineddata
|
| 841 |
+
d80c1f308973b3129183843759f23fdcb1c5c2be services/software/Tesseract-OCR/tessdata/que.traineddata
|
| 842 |
+
04cd2bc7b471431354e9446e973f3472f442e189 services/software/Tesseract-OCR/tessdata/ron.traineddata
|
| 843 |
+
b146cb2263acbc6383f8e92ea0ce759537687bb8 services/software/Tesseract-OCR/tessdata/rus.traineddata
|
| 844 |
+
3df043f3247fd41a21ac47c3b199bc87643e984b services/software/Tesseract-OCR/tessdata/san.traineddata
|
| 845 |
+
7ef1100eecc1563f12f847a8c5580b80a2341c5b services/software/Tesseract-OCR/tessdata/script
|
| 846 |
+
4d4bac05b8be69aafb537d3a753efec6be473953 services/software/Tesseract-OCR/tessdata/script/Arabic.traineddata
|
| 847 |
+
7e4cf10f1fb571dbce0afea837db15cd11b44f39 services/software/Tesseract-OCR/tessdata/script/Armenian.traineddata
|
| 848 |
+
a1b888e492320fb9b941dbf0d7fe9d767e5f6a42 services/software/Tesseract-OCR/tessdata/script/Bengali.traineddata
|
| 849 |
+
9ba41b35b6b06892657a61dd33003bc8a0a9483a services/software/Tesseract-OCR/tessdata/script/Canadian_Aboriginal.traineddata
|
| 850 |
+
94834e6e395e97209c59846dc78320e830f67a12 services/software/Tesseract-OCR/tessdata/script/Cherokee.traineddata
|
| 851 |
+
1901a7483cccad6c43d1052bb40d754ae53694b4 services/software/Tesseract-OCR/tessdata/script/Cyrillic.traineddata
|
| 852 |
+
3c33bd676b0ae7a480ec1c1f5ebdd13513aa5433 services/software/Tesseract-OCR/tessdata/script/Devanagari.traineddata
|
| 853 |
+
e6c0944e630c580f4a9d6d4a8ebeaeaca3583164 services/software/Tesseract-OCR/tessdata/script/Ethiopic.traineddata
|
| 854 |
+
28262227524b894a1f283e8edd2245f11d9e3e9f services/software/Tesseract-OCR/tessdata/script/Fraktur.traineddata
|
| 855 |
+
77511502fa8dd8d1aec6700b697bdd3cc501a78d services/software/Tesseract-OCR/tessdata/script/Georgian.traineddata
|
| 856 |
+
0fdbf7f0eb07e1c4a72f580afba84cd85cafc177 services/software/Tesseract-OCR/tessdata/script/Greek.traineddata
|
| 857 |
+
9f203b6620b479149fe022553278a48032c87f21 services/software/Tesseract-OCR/tessdata/script/Gujarati.traineddata
|
| 858 |
+
36e1161b20dac2826f80c7e27f753670177116a2 services/software/Tesseract-OCR/tessdata/script/Gurmukhi.traineddata
|
| 859 |
+
977fd63d7430853e04f49c43400dc576144cfe0e services/software/Tesseract-OCR/tessdata/script/Hangul.traineddata
|
| 860 |
+
4e421ca8baa936ffad67b6bd78df848bbfb4fa03 services/software/Tesseract-OCR/tessdata/script/Hangul_vert.traineddata
|
| 861 |
+
41d7386cacc0faf19b381f9bba035cb3bcc7f8f9 services/software/Tesseract-OCR/tessdata/script/HanS.traineddata
|
| 862 |
+
a0464cb0478f089f00cbfa715a15ba5aba5d0e37 services/software/Tesseract-OCR/tessdata/script/HanS_vert.traineddata
|
| 863 |
+
ac8c8e97a2e75db8afd1a843527f350737973435 services/software/Tesseract-OCR/tessdata/script/HanT.traineddata
|
| 864 |
+
99757fde125138e5d889784d0d9f2edd659defac services/software/Tesseract-OCR/tessdata/script/HanT_vert.traineddata
|
| 865 |
+
590055a3db20484eb90e6bd1a9223f36b69ea907 services/software/Tesseract-OCR/tessdata/script/Hebrew.traineddata
|
| 866 |
+
89481f2c257019f1ea58c82b7daaac9688f7b172 services/software/Tesseract-OCR/tessdata/script/Japanese.traineddata
|
| 867 |
+
5c211c42046ada01847b1628a6f1766826c2a371 services/software/Tesseract-OCR/tessdata/script/Japanese_vert.traineddata
|
| 868 |
+
238f7a104e604a27b14ca956df2f346f7750099b services/software/Tesseract-OCR/tessdata/script/Kannada.traineddata
|
| 869 |
+
635b310e6a79c3aac2fe5aa12dd5bcb7718c2e15 services/software/Tesseract-OCR/tessdata/script/Khmer.traineddata
|
| 870 |
+
0bdf44f32650e6f15ef0491f88dee430994dca62 services/software/Tesseract-OCR/tessdata/script/Lao.traineddata
|
| 871 |
+
8b6e3a3ae06e6b623b587e9f87c988e169fa1c6b services/software/Tesseract-OCR/tessdata/script/Latin.traineddata
|
| 872 |
+
9e639ea78e5040c75bce36e1231755901448e4ef services/software/Tesseract-OCR/tessdata/script/Malayalam.traineddata
|
| 873 |
+
733ebd14f67a5a52211abfc6f66b485a23a8b955 services/software/Tesseract-OCR/tessdata/script/Myanmar.traineddata
|
| 874 |
+
d9ef97617c0914028360f703d810564013542421 services/software/Tesseract-OCR/tessdata/script/Oriya.traineddata
|
| 875 |
+
98d26bd5f71305d96f947e29d3fcb455ff26bc9f services/software/Tesseract-OCR/tessdata/script/Sinhala.traineddata
|
| 876 |
+
b97923946987070b6ee69ab41d4bc4c87b739001 services/software/Tesseract-OCR/tessdata/script/Syriac.traineddata
|
| 877 |
+
48fede126ba6e563a69ca10eae3604e42143039f services/software/Tesseract-OCR/tessdata/script/Tamil.traineddata
|
| 878 |
+
0468e5dc1eee3059191b4ac2d7109a9431ce42c1 services/software/Tesseract-OCR/tessdata/script/Telugu.traineddata
|
| 879 |
+
b13feb9f2af4762a80431e93de11e2e61ae40068 services/software/Tesseract-OCR/tessdata/script/Thaana.traineddata
|
| 880 |
+
62acc3de815e28c43f764dc7e10e5c8afdfefb20 services/software/Tesseract-OCR/tessdata/script/Thai.traineddata
|
| 881 |
+
223459ad4ee20b85075e423975aa44edbed190dd services/software/Tesseract-OCR/tessdata/script/Tibetan.traineddata
|
| 882 |
+
92c69d17eab37670c3ffc0efce3f7918ef1d9468 services/software/Tesseract-OCR/tessdata/script/Vietnamese.traineddata
|
| 883 |
+
fe7fafcfe7e57d1ccd679a0b8a9775e1a821f881 services/software/Tesseract-OCR/tessdata/ScrollView.jar
|
| 884 |
+
d0c8584e78c44666efcd7fbd47940a8a1121550d services/software/Tesseract-OCR/tessdata/sin.traineddata
|
| 885 |
+
ca99e3e82f69a0e16b48cdfec3c4e706758269f2 services/software/Tesseract-OCR/tessdata/slk.traineddata
|
| 886 |
+
835954e891897d3c8b63db48cb5c2712ef2e6b11 services/software/Tesseract-OCR/tessdata/slv.traineddata
|
| 887 |
+
1ef6548d22977dc1f236be879dce3a62ac6a47ed services/software/Tesseract-OCR/tessdata/snd.traineddata
|
| 888 |
+
72e901f13ca52cfe34cf239a368b9ed3c0ddaf26 services/software/Tesseract-OCR/tessdata/spa.traineddata
|
| 889 |
+
42b281f55736b2f714598accfc2a78f409db1f0c services/software/Tesseract-OCR/tessdata/spa_old.traineddata
|
| 890 |
+
9624fbf33452a95dd5a0a3a93fe9876108104895 services/software/Tesseract-OCR/tessdata/sqi.traineddata
|
| 891 |
+
530fb4b1cb27f369bbee7eb0add89bfd73d6f15c services/software/Tesseract-OCR/tessdata/srp.traineddata
|
| 892 |
+
5f81e591adad58a179a2d371aacccaf0801f93a2 services/software/Tesseract-OCR/tessdata/srp_latn.traineddata
|
| 893 |
+
894891425c1fe302ce1d8f115a3c00967c6c2832 services/software/Tesseract-OCR/tessdata/sun.traineddata
|
| 894 |
+
633d73b35869600452eec58dcd9036cc702c3e48 services/software/Tesseract-OCR/tessdata/swa.traineddata
|
| 895 |
+
684e1fa66e4a55b983febf5f9ed04f26ad946e59 services/software/Tesseract-OCR/tessdata/swe.traineddata
|
| 896 |
+
462aefc8a1485ae4c38db82f7f50fd105bf30195 services/software/Tesseract-OCR/tessdata/syr.traineddata
|
| 897 |
+
fa1793d68f9aba8bf191e8ff1036e2271d288e44 services/software/Tesseract-OCR/tessdata/tam.traineddata
|
| 898 |
+
9485ca27d48bb161a47584f8381420462ef6fa27 services/software/Tesseract-OCR/tessdata/tat.traineddata
|
| 899 |
+
ee8a33b0f658fc75b8cbfe8c10413eac4f41e6ad services/software/Tesseract-OCR/tessdata/tel.traineddata
|
| 900 |
+
51fe80ee88432b91fe829ac8d1f665e649722316 services/software/Tesseract-OCR/tessdata/tessconfigs
|
| 901 |
+
a681e4a443fa21ce6f32bbcf0334af3433888566 services/software/Tesseract-OCR/tessdata/tessconfigs/batch
|
| 902 |
+
ebaab9438e309b4dfdfd8428676170ab2b64a858 services/software/Tesseract-OCR/tessdata/tessconfigs/batch.nochop
|
| 903 |
+
c34567be7565d519806076b795fceff9fdad1477 services/software/Tesseract-OCR/tessdata/tessconfigs/matdemo
|
| 904 |
+
9c1184a0c84bde5f58ea74a1f316af9eb2574b52 services/software/Tesseract-OCR/tessdata/tessconfigs/msdemo
|
| 905 |
+
8b137891791fe96927ad78e64b0aad7bded08bdc services/software/Tesseract-OCR/tessdata/tessconfigs/nobatch
|
| 906 |
+
eaff69f54b9ed62d49987634a5fba2c79cccf3cf services/software/Tesseract-OCR/tessdata/tessconfigs/segdemo
|
| 907 |
+
044766728ce9cb2cc73976175b970a4cea9a870a services/software/Tesseract-OCR/tessdata/tgk.traineddata
|
| 908 |
+
ea28de3985668cac00d261c5b91f023ea66e19cd services/software/Tesseract-OCR/tessdata/tha.traineddata
|
| 909 |
+
55e62eb0297e07360db5e9dc5dd86aab8e0a1e9c services/software/Tesseract-OCR/tessdata/tir.traineddata
|
| 910 |
+
9eff0fd002798089f5f7d8307be968a36f1ce433 services/software/Tesseract-OCR/tessdata/ton.traineddata
|
| 911 |
+
1f0b331ef29f50ceb7c44da58e38c7ec42314d0a services/software/Tesseract-OCR/tessdata/tur.traineddata
|
| 912 |
+
36124d6b0ed1c2654a13551203c25b44b4013978 services/software/Tesseract-OCR/tessdata/uig.traineddata
|
| 913 |
+
d02cf90b2911a3da66dac6ae380bcefb18dd7663 services/software/Tesseract-OCR/tessdata/ukr.traineddata
|
| 914 |
+
715a159d4abea25294c82971be28be215b3d1c4a services/software/Tesseract-OCR/tessdata/urd.traineddata
|
| 915 |
+
109abc765273b2c9eabd55781f0a619320c80007 services/software/Tesseract-OCR/tessdata/uzb.traineddata
|
| 916 |
+
c2ff8b9c282a9712b5f24970927377bc18dea7cf services/software/Tesseract-OCR/tessdata/uzb_cyrl.traineddata
|
| 917 |
+
e54a5912fb634c581c4a45ae9f37cbc021ec7140 services/software/Tesseract-OCR/tessdata/vie.traineddata
|
| 918 |
+
6349588bbabf99f8a812e8231c98c015ea7b60c6 services/software/Tesseract-OCR/tessdata/yid.traineddata
|
| 919 |
+
3e0cd582f65f17844039173057dfc015bf19f61d services/software/Tesseract-OCR/tessdata/yor.traineddata
|
| 920 |
+
eb39a979891e62373073aa012d1e722eccf53679 services/software/Tesseract-OCR/tesseract.1.html
|
| 921 |
+
1b8266d099b65455e5d028794f27e0c97c56a410 services/software/Tesseract-OCR/tesseract.exe
|
| 922 |
+
f9a8aaca808fb84974a69db7058d39dfd6143940 services/software/Tesseract-OCR/tesseract-uninstall.exe
|
| 923 |
+
dabfda7747f42b0bf5a77f497f63cd9bcb24bac7 services/software/Tesseract-OCR/text2image.1.html
|
| 924 |
+
5dec420773690de9c9ec1b5ef749bb697aad107a services/software/Tesseract-OCR/text2image.exe
|
| 925 |
+
d939cf54b047a0089add0e711657282ee6a97ae4 services/software/Tesseract-OCR/unicharambigs.5.html
|
| 926 |
+
3f0f72aee992bbf1f8a364c9bc8607bbd66a2891 services/software/Tesseract-OCR/unicharset.5.html
|
| 927 |
+
efbeabdaf5aa4aedf38e5def2fff26789bb05f4f services/software/Tesseract-OCR/unicharset_extractor.1.html
|
| 928 |
+
22f28c9f4aec70a28b30276337eb5368c4939cb2 services/software/Tesseract-OCR/unicharset_extractor.exe
|
| 929 |
+
428e40e914e1fd615ecd931333cb2d192c060499 services/software/Tesseract-OCR/winpath.exe
|
| 930 |
+
7503ef471c8cb9e9fe9af50012737f035df4ea03 services/software/Tesseract-OCR/wordlist2dawg.1.html
|
| 931 |
+
5e9c230a56297f6f5d7834028f4f4af6d97c2a27 services/software/Tesseract-OCR/wordlist2dawg.exe
|
| 932 |
+
93c94c53ea14cc76fb6d313835ccef795c154209 services/software/Tesseract-OCR/zlib1.dll
|
| 933 |
+
74576a17b24af3b3461b3cf366bffc72b8af2247 services/tools
|
| 934 |
+
c060f8c47950ea007ef82d25341f6a236e690b1c services/tools/__init__.py
|
| 935 |
+
1ab5b944403cc0b3f268e9ce08dbcbd7fcb37883 services/tools/profile_scoring.py
|
| 936 |
+
3f523c2a536282d053c95a2f8149cb6f3d6d7fc7 services/uploader
|
| 937 |
+
e4cb1c1d046ce257dd41421a9529c2b5e972e5b7 services/uploader/azure_blob_service.py
|
| 938 |
+
3df5871d164cfdc5e82242c3c431196d889d1fb6 utils
|
| 939 |
+
a333c68fbc8680eb129aff6ae6a77b5fefc71b45 utils/__init__.py
|
| 940 |
+
d53923b95ed7e11ca362be122da89b3bc03d061d utils/decorator.py
|
| 941 |
+
9d0a562984f25046ddc3379aca73c1115d8fb528 utils/jwt.py
|
| 942 |
+
41d27a764c6b8a814c28f9e4812f669397450dd6 utils/logger.py
|
| 943 |
+
da25f0b2a8b1d7ad1d4b2334b673b20b378d5788 utils/security.py
|
| 944 |
+
a8682aeeeac3e667bd5150cbe6d18e069999f4f5 utils/utils.py
|
| 945 |
+
7ae84070d708061792beddf97a92f5daeaf97ea3 uv.lock
|
config/__init__.py
ADDED
|
File without changes
|
config/config.yaml
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Environment
|
| 2 |
+
stage:
|
| 3 |
+
active: dev # choose one of dev | uat | prd
|
| 4 |
+
|
| 5 |
+
# Observability
|
| 6 |
+
langfuse:
|
| 7 |
+
is_active: false
|
| 8 |
+
|
| 9 |
+
# Prefix blob folder
|
| 10 |
+
blob:
|
| 11 |
+
prefix: dev/cv
|
| 12 |
+
|
| 13 |
+
llm:
|
| 14 |
+
default: "gpt-4o"
|
| 15 |
+
|
| 16 |
+
|
| 17 |
+
# "[dev|uat|prd]_[tenant_id]_[kb|caching|data_info]"
|
| 18 |
+
azure_search_index_name_template: "{stage}__{tenant_id}__{purpose}"
|
config/constant.py
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import os
|
| 2 |
+
from dataclasses import dataclass, field
|
| 3 |
+
from dotenv import load_dotenv
|
| 4 |
+
from typing import List
|
| 5 |
+
from config.env_constant import EnvFilepath
|
| 6 |
+
load_dotenv(EnvFilepath.ENVPATH)
|
| 7 |
+
|
| 8 |
+
|
| 9 |
+
@dataclass
|
| 10 |
+
class EnvPostgresConstants:
|
| 11 |
+
CONSTRING: str = os.environ.get("ss--postgresql--url")
|
| 12 |
+
|
| 13 |
+
@dataclass(frozen=True)
|
| 14 |
+
class SecurityConstants:
|
| 15 |
+
BCRYPT_MAX_BYTES: int = 72
|
| 16 |
+
JWT_SECRET_KEY: str = os.environ.get("ss--jwt--secret-key")
|
| 17 |
+
JWT_ALGORITHM: str = os.environ.get("ss--jwt--algorithm")
|
| 18 |
+
JWT_EXPIRE_MINUTES: int = int(os.environ.get("ss--jwt--access-token-expire-minutes", 60))
|
| 19 |
+
|
| 20 |
+
@dataclass(frozen=True)
|
| 21 |
+
class AzureBlobConstants:
|
| 22 |
+
BLOB_PREFIX: str = "dev" # DOCS: change accordingly
|
| 23 |
+
ENDPOINT: str = os.environ.get("azureai--container--endpoint")
|
| 24 |
+
CONTAINER_NAME: str = os.environ.get("azureai--container--name")
|
| 25 |
+
SAS_KEY: str = os.environ.get("azureai--search--sas")
|
| 26 |
+
MAX_FILE_SIZE_MB: int = int(os.getenv("azureai--max-file-size-mb", "5"))
|
| 27 |
+
CHUNK_SIZE: int = 4 * 1024 * 1024
|
| 28 |
+
ACCOUNT_NAME: str = os.environ.get("azureai--container--account--name")
|
| 29 |
+
|
| 30 |
+
@dataclass
|
| 31 |
+
class ProfileFieldTypes:
|
| 32 |
+
NUMERIC: List[str] = field(default_factory=lambda: ["gpa_edu_1", "gpa_edu_2", "gpa_edu_3", "yoe"])
|
| 33 |
+
TEXT: List[str] = field(default_factory=lambda: ["univ_edu_1", "major_edu_1",
|
| 34 |
+
"univ_edu_2", "major_edu_2",
|
| 35 |
+
"univ_edu_3", "major_edu_3",
|
| 36 |
+
"domicile",
|
| 37 |
+
"hardskills", "softskills", "certifications", "business_domain"])
|
| 38 |
+
ProfileFieldTypes = ProfileFieldTypes()
|
config/env_constant.py
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from dataclasses import dataclass
|
| 2 |
+
|
| 3 |
+
@dataclass
|
| 4 |
+
class EnvFilepath:
|
| 5 |
+
ENVPATH: str = ".env" # DOCS: change in uat or prod environment!
|
config/get_config.py
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import pytz
|
| 2 |
+
from sqlalchemy import func
|
| 3 |
+
|
| 4 |
+
|
| 5 |
+
class Config:
|
| 6 |
+
|
| 7 |
+
@property
|
| 8 |
+
def tzinfo(self):
|
| 9 |
+
tzinfo = pytz.timezone('Asia/Jakarta')
|
| 10 |
+
return tzinfo
|
| 11 |
+
|
| 12 |
+
|
| 13 |
+
@property
|
| 14 |
+
def JAKARTA_NOW(self):
|
| 15 |
+
return func.timezone("Asia/Jakarta", func.now())
|
| 16 |
+
|
| 17 |
+
|
| 18 |
+
|
| 19 |
+
master_config = Config()
|
externals/__init__.py
ADDED
|
File without changes
|
externals/databases/__init__.py
ADDED
|
File without changes
|
externals/databases/_pg_tables.py
ADDED
|
@@ -0,0 +1,104 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# CREATE TABLES
|
| 2 |
+
query_create_cv_raw = """
|
| 3 |
+
CREATE TABLE cv_raw (
|
| 4 |
+
filename TEXT NOT NULL UNIQUE,
|
| 5 |
+
profile_id SERIAL PRIMARY KEY,
|
| 6 |
+
file_content BYTEA NOT NULL,
|
| 7 |
+
is_extracted BOOLEAN DEFAULT FALSE,
|
| 8 |
+
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
|
| 9 |
+
);
|
| 10 |
+
"""
|
| 11 |
+
|
| 12 |
+
alter_table_cv_raw_add_is_extracted = """
|
| 13 |
+
ALTER TABLE cv_raw
|
| 14 |
+
ADD COLUMN is_extracted BOOLEAN DEFAULT FALSE;"""
|
| 15 |
+
|
| 16 |
+
query_create_cv_profile_extracted = """
|
| 17 |
+
CREATE TABLE cv_profile_extracted (
|
| 18 |
+
fullname VARCHAR(100) NOT NULL,
|
| 19 |
+
profile_id SERIAL PRIMARY KEY,
|
| 20 |
+
|
| 21 |
+
gpa_edu_1 DECIMAL(4,2),
|
| 22 |
+
gpa_edu_2 DECIMAL(4,2),
|
| 23 |
+
gpa_edu_3 DECIMAL(4,2),
|
| 24 |
+
|
| 25 |
+
univ_edu_1 varchar(100),
|
| 26 |
+
univ_edu_2 varchar(100),
|
| 27 |
+
univ_edu_3 varchar(100),
|
| 28 |
+
|
| 29 |
+
major_edu_1 varchar(100),
|
| 30 |
+
major_edu_2 varchar(100),
|
| 31 |
+
major_edu_3 varchar(100),
|
| 32 |
+
|
| 33 |
+
domicile TEXT,
|
| 34 |
+
yoe DECIMAL(3,1),
|
| 35 |
+
hardskills TEXT,
|
| 36 |
+
softskills TEXT,
|
| 37 |
+
certifications TEXT,
|
| 38 |
+
business_domain TEXT,
|
| 39 |
+
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
| 40 |
+
CONSTRAINT fk_profile_extracted
|
| 41 |
+
FOREIGN KEY (profile_id)
|
| 42 |
+
REFERENCES cv_raw (profile_id)
|
| 43 |
+
ON DELETE CASCADE
|
| 44 |
+
);
|
| 45 |
+
"""
|
| 46 |
+
|
| 47 |
+
query_create_cv_profile_norm = """
|
| 48 |
+
CREATE TABLE cv_profile_norm (
|
| 49 |
+
fullname VARCHAR(100) NOT NULL,
|
| 50 |
+
profile_id SERIAL PRIMARY KEY,
|
| 51 |
+
|
| 52 |
+
gpa_edu_1 DECIMAL(4,2),
|
| 53 |
+
gpa_edu_2 DECIMAL(4,2),
|
| 54 |
+
gpa_edu_3 DECIMAL(4,2),
|
| 55 |
+
|
| 56 |
+
univ_edu_1 varchar(100),
|
| 57 |
+
univ_edu_2 varchar(100),
|
| 58 |
+
univ_edu_3 varchar(100),
|
| 59 |
+
|
| 60 |
+
major_edu_1 varchar(100),
|
| 61 |
+
major_edu_2 varchar(100),
|
| 62 |
+
major_edu_3 varchar(100),
|
| 63 |
+
|
| 64 |
+
domicile TEXT,
|
| 65 |
+
yoe DECIMAL(3,1),
|
| 66 |
+
hardskills TEXT,
|
| 67 |
+
softskills TEXT,
|
| 68 |
+
certifications TEXT,
|
| 69 |
+
business_domain TEXT,
|
| 70 |
+
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
| 71 |
+
CONSTRAINT fk_profile_norm
|
| 72 |
+
FOREIGN KEY (profile_id)
|
| 73 |
+
REFERENCES cv_profile_extracted (profile_id)
|
| 74 |
+
ON DELETE CASCADE
|
| 75 |
+
);
|
| 76 |
+
"""
|
| 77 |
+
|
| 78 |
+
# DROP TABLES
|
| 79 |
+
query_drop_cv_raw = "drop table cv_raw cascade"
|
| 80 |
+
query_drop_cv_profile_extracted = "drop table cv_profile_extracted cascade"
|
| 81 |
+
query_drop_cv_profile_norm = "drop table cv_profile_norm cascade"
|
| 82 |
+
|
| 83 |
+
|
| 84 |
+
# OPERATIONS
|
| 85 |
+
q_creates = [query_create_cv_raw, query_create_cv_profile_extracted, query_create_cv_profile_norm]
|
| 86 |
+
q_drops = [
|
| 87 |
+
# query_drop_cv_raw,
|
| 88 |
+
query_drop_cv_profile_extracted, query_drop_cv_profile_norm]
|
| 89 |
+
|
| 90 |
+
from externals.databases._pgdb import execute_query
|
| 91 |
+
|
| 92 |
+
async def get_create_queries():
|
| 93 |
+
for q in q_creates:
|
| 94 |
+
await execute_query(q)
|
| 95 |
+
|
| 96 |
+
async def get_drop_queries():
|
| 97 |
+
for q in q_drops:
|
| 98 |
+
await execute_query(q)
|
| 99 |
+
|
| 100 |
+
|
| 101 |
+
if __name__ == "__main__":
|
| 102 |
+
import asyncio
|
| 103 |
+
# asyncio.run(get_drop_queries())
|
| 104 |
+
asyncio.run(get_create_queries())
|
externals/databases/_pgdb.py
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# import os
|
| 2 |
+
# import dotenv
|
| 3 |
+
# dotenv.load_dotenv()
|
| 4 |
+
# import asyncpg
|
| 5 |
+
# # from datetime import datetime
|
| 6 |
+
|
| 7 |
+
# async def fetch_data(query:str):
|
| 8 |
+
# try:
|
| 9 |
+
# conn = await asyncpg.connect(user=os.environ.get("causalogy--pg--user"),
|
| 10 |
+
# password=os.environ.get("causalogy--pg--password"),
|
| 11 |
+
# database=os.environ.get("causalogy--pg--name"),
|
| 12 |
+
# host=os.environ.get("causalogy--pg--host"),
|
| 13 |
+
# port=os.environ.get("causalogy--pg--port"))
|
| 14 |
+
# values = await conn.fetch(query)
|
| 15 |
+
# print(f"""✅ Fetching data succeeded!""")
|
| 16 |
+
# return values
|
| 17 |
+
# except Exception as E:
|
| 18 |
+
# print(f"""❌ Error when Fetching data, {E}""")
|
| 19 |
+
# finally:
|
| 20 |
+
# await conn.close()
|
| 21 |
+
|
| 22 |
+
|
| 23 |
+
# async def execute_query(query:str):
|
| 24 |
+
# try:
|
| 25 |
+
# conn = await asyncpg.connect(user=os.environ.get("causalogy--pg--user"),
|
| 26 |
+
# password=os.environ.get("causalogy--pg--password"),
|
| 27 |
+
# database=os.environ.get("causalogy--pg--name"),
|
| 28 |
+
# host=os.environ.get("causalogy--pg--host"),
|
| 29 |
+
# port=os.environ.get("causalogy--pg--port"))
|
| 30 |
+
# values = await conn.execute(query)
|
| 31 |
+
# print(f"""✅ Executing query succeeded!""")
|
| 32 |
+
# return True
|
| 33 |
+
# except Exception as E:
|
| 34 |
+
# print(f"""❌ Error when Executing query, {E}""")
|
| 35 |
+
# return False
|
| 36 |
+
# finally:
|
| 37 |
+
# await conn.close()
|
| 38 |
+
|
| 39 |
+
|
| 40 |
+
# async def execute_insert_binary(filename: str, file_content: bytes, query:str="""INSERT INTO cv_raw (filename, file_content) VALUES ($1, $2);"""):
|
| 41 |
+
# conn = None
|
| 42 |
+
# try:
|
| 43 |
+
# conn = await asyncpg.connect(
|
| 44 |
+
# user=os.environ.get("causalogy--pg--user"),
|
| 45 |
+
# password=os.environ.get("causalogy--pg--password"),
|
| 46 |
+
# database=os.environ.get("causalogy--pg--name"),
|
| 47 |
+
# host=os.environ.get("causalogy--pg--host"),
|
| 48 |
+
# port=os.environ.get("causalogy--pg--port")
|
| 49 |
+
# )
|
| 50 |
+
# await conn.execute(query, filename, file_content)
|
| 51 |
+
# print(f"✅ Successfully inserted {filename} into cv_raw")
|
| 52 |
+
# except Exception as E:
|
| 53 |
+
# print(f"❌ Error when executing insert: {E}")
|
| 54 |
+
# finally:
|
| 55 |
+
# if conn:
|
| 56 |
+
# await conn.close()
|
externals/databases/database.py
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import os
|
| 2 |
+
import dotenv
|
| 3 |
+
|
| 4 |
+
from config.constant import EnvPostgresConstants, EnvFilepath
|
| 5 |
+
dotenv.load_dotenv(EnvFilepath.ENVPATH)
|
| 6 |
+
|
| 7 |
+
from contextlib import asynccontextmanager
|
| 8 |
+
from sqlalchemy.ext.asyncio import create_async_engine, async_sessionmaker, AsyncSession
|
| 9 |
+
from sqlalchemy.orm import declarative_base
|
| 10 |
+
|
| 11 |
+
DATABASE_URL = EnvPostgresConstants.CONSTRING.\
|
| 12 |
+
replace("postgresql+psycopg2", "postgresql+asyncpg")
|
| 13 |
+
|
| 14 |
+
engine = create_async_engine(
|
| 15 |
+
DATABASE_URL,
|
| 16 |
+
echo=False,
|
| 17 |
+
future=True
|
| 18 |
+
)
|
| 19 |
+
|
| 20 |
+
AsyncSessionLocal = async_sessionmaker(
|
| 21 |
+
engine,
|
| 22 |
+
expire_on_commit=False,
|
| 23 |
+
class_=AsyncSession
|
| 24 |
+
)
|
| 25 |
+
|
| 26 |
+
Base = declarative_base()
|
| 27 |
+
|
| 28 |
+
# async def get_db():
|
| 29 |
+
# async with AsyncSessionLocal() as session:
|
| 30 |
+
# try:
|
| 31 |
+
# return session
|
| 32 |
+
# finally:
|
| 33 |
+
# await session.close()
|
| 34 |
+
|
| 35 |
+
async def get_db():
|
| 36 |
+
async with AsyncSessionLocal() as session:
|
| 37 |
+
try:
|
| 38 |
+
yield session
|
| 39 |
+
finally:
|
| 40 |
+
await session.close()
|
| 41 |
+
|
| 42 |
+
# async def get_db_session():
|
| 43 |
+
# session = AsyncSessionLocal()
|
| 44 |
+
# try:
|
| 45 |
+
# return session
|
| 46 |
+
# except:
|
| 47 |
+
# await session.close()
|
| 48 |
+
# raise
|
| 49 |
+
|
| 50 |
+
|
| 51 |
+
@asynccontextmanager
|
| 52 |
+
async def db_session():
|
| 53 |
+
async with AsyncSessionLocal() as session:
|
| 54 |
+
try:
|
| 55 |
+
yield session
|
| 56 |
+
finally:
|
| 57 |
+
await session.close()
|
externals/databases/pg_crud.py
ADDED
|
@@ -0,0 +1,473 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from typing import Optional, List
|
| 2 |
+
from uuid import UUID
|
| 3 |
+
|
| 4 |
+
from sqlalchemy import select, and_, update, delete
|
| 5 |
+
from sqlalchemy.ext.asyncio import AsyncSession
|
| 6 |
+
from externals.databases.pg_models import (
|
| 7 |
+
CVUser,
|
| 8 |
+
CVTenant,
|
| 9 |
+
CVFile,
|
| 10 |
+
CVProfile,
|
| 11 |
+
CVFilter,
|
| 12 |
+
CVWeight,
|
| 13 |
+
CVMatching,
|
| 14 |
+
CVScore,
|
| 15 |
+
)
|
| 16 |
+
|
| 17 |
+
# =========================
|
| 18 |
+
# USER
|
| 19 |
+
# =========================
|
| 20 |
+
from externals.databases.schemas.user import UserCreate, UserResponse
|
| 21 |
+
from utils.security import hash_password
|
| 22 |
+
|
| 23 |
+
async def get_user_by_username(
|
| 24 |
+
db: AsyncSession,
|
| 25 |
+
username: str,
|
| 26 |
+
) -> CVUser | None:
|
| 27 |
+
result = await db.execute(
|
| 28 |
+
select(CVUser).where(CVUser.username == username)
|
| 29 |
+
)
|
| 30 |
+
return result.scalar_one_or_none()
|
| 31 |
+
|
| 32 |
+
|
| 33 |
+
async def create_user(
|
| 34 |
+
db: AsyncSession,
|
| 35 |
+
user_in: UserCreate,
|
| 36 |
+
) -> CVUser:
|
| 37 |
+
# ✅ CONVERT Pydantic → ORM
|
| 38 |
+
user = CVUser(
|
| 39 |
+
username=user_in.username,
|
| 40 |
+
hashed_password=hash_password(user_in.password),
|
| 41 |
+
email=user_in.email,
|
| 42 |
+
full_name=user_in.full_name,
|
| 43 |
+
role=user_in.role,
|
| 44 |
+
is_active=True,
|
| 45 |
+
tenant_id=user_in.tenant_id,
|
| 46 |
+
notes=user_in.notes,
|
| 47 |
+
)
|
| 48 |
+
|
| 49 |
+
db.add(user) # ✅ ORM
|
| 50 |
+
await db.commit()
|
| 51 |
+
await db.refresh(user)
|
| 52 |
+
|
| 53 |
+
return user
|
| 54 |
+
|
| 55 |
+
async def deactivate_user(
|
| 56 |
+
db: AsyncSession,
|
| 57 |
+
username: str,
|
| 58 |
+
) -> CVUser | None:
|
| 59 |
+
result = await db.execute(
|
| 60 |
+
select(CVUser).where(CVUser.username == username)
|
| 61 |
+
)
|
| 62 |
+
user = result.scalar_one_or_none()
|
| 63 |
+
|
| 64 |
+
if not user:
|
| 65 |
+
return None
|
| 66 |
+
|
| 67 |
+
user.is_active = False
|
| 68 |
+
await db.commit()
|
| 69 |
+
await db.refresh(user)
|
| 70 |
+
|
| 71 |
+
return user
|
| 72 |
+
|
| 73 |
+
|
| 74 |
+
async def get_user_by_email(db, email: str):
|
| 75 |
+
result = await db.execute(
|
| 76 |
+
select(CVUser).where(CVUser.email == email)
|
| 77 |
+
)
|
| 78 |
+
return result.scalar_one_or_none()
|
| 79 |
+
|
| 80 |
+
|
| 81 |
+
async def get_user_by_id(db, user_id: str):
|
| 82 |
+
result = await db.execute(
|
| 83 |
+
select(CVUser).where(CVUser.user_id == user_id)
|
| 84 |
+
)
|
| 85 |
+
return result.scalar_one_or_none()
|
| 86 |
+
|
| 87 |
+
|
| 88 |
+
# =========================
|
| 89 |
+
# TENANT
|
| 90 |
+
# =========================
|
| 91 |
+
from externals.databases.schemas.tenant import TenantCreate
|
| 92 |
+
|
| 93 |
+
async def get_tenant_by_name(
|
| 94 |
+
db: AsyncSession,
|
| 95 |
+
tenant_name: str,
|
| 96 |
+
) -> CVTenant | None:
|
| 97 |
+
result = await db.execute(
|
| 98 |
+
select(CVTenant).where(CVTenant.tenant_name == tenant_name)
|
| 99 |
+
)
|
| 100 |
+
return result.scalar_one_or_none()
|
| 101 |
+
|
| 102 |
+
|
| 103 |
+
async def create_tenant(
|
| 104 |
+
db: AsyncSession,
|
| 105 |
+
tenant_in: TenantCreate,
|
| 106 |
+
) -> CVTenant:
|
| 107 |
+
# ✅ CONVERT Pydantic → ORM
|
| 108 |
+
tenant = CVTenant(
|
| 109 |
+
tenant_name=tenant_in.tenant_name,
|
| 110 |
+
notes=tenant_in.notes,
|
| 111 |
+
)
|
| 112 |
+
|
| 113 |
+
db.add(tenant) # ✅ ORM
|
| 114 |
+
await db.commit()
|
| 115 |
+
await db.refresh(tenant)
|
| 116 |
+
|
| 117 |
+
return tenant
|
| 118 |
+
|
| 119 |
+
|
| 120 |
+
# =========================
|
| 121 |
+
# FILE
|
| 122 |
+
# =========================
|
| 123 |
+
|
| 124 |
+
# async def get_file_by_filename(
|
| 125 |
+
# db: AsyncSession,
|
| 126 |
+
# filename: str,
|
| 127 |
+
# ) -> Optional[CVFile]:
|
| 128 |
+
# stmt = select(CVFile).where(CVFile.filename == filename)
|
| 129 |
+
# result = await db.execute(stmt)
|
| 130 |
+
# return result.scalar_one_or_none()
|
| 131 |
+
|
| 132 |
+
|
| 133 |
+
async def mark_file_extracted(
|
| 134 |
+
db: AsyncSession,
|
| 135 |
+
file_id: UUID,
|
| 136 |
+
) -> None:
|
| 137 |
+
stmt = (
|
| 138 |
+
update(CVFile)
|
| 139 |
+
.where(CVFile.file_id == file_id)
|
| 140 |
+
.values(is_extracted=True)
|
| 141 |
+
)
|
| 142 |
+
await db.execute(stmt)
|
| 143 |
+
await db.commit()
|
| 144 |
+
|
| 145 |
+
|
| 146 |
+
async def create_cv_file(
|
| 147 |
+
db: AsyncSession,
|
| 148 |
+
*,
|
| 149 |
+
user_id: str,
|
| 150 |
+
filename: str,
|
| 151 |
+
file_type: str,
|
| 152 |
+
url: str,
|
| 153 |
+
):
|
| 154 |
+
cv_file = CVFile(
|
| 155 |
+
filename=filename,
|
| 156 |
+
file_type=file_type,
|
| 157 |
+
url=url,
|
| 158 |
+
is_extracted=False,
|
| 159 |
+
user_id=user_id,
|
| 160 |
+
)
|
| 161 |
+
|
| 162 |
+
db.add(cv_file)
|
| 163 |
+
await db.commit()
|
| 164 |
+
await db.refresh(cv_file)
|
| 165 |
+
|
| 166 |
+
return cv_file
|
| 167 |
+
|
| 168 |
+
|
| 169 |
+
async def delete_file_by_filename(
|
| 170 |
+
db: AsyncSession,
|
| 171 |
+
filename: str,
|
| 172 |
+
) -> bool:
|
| 173 |
+
stmt = delete(CVFile).where(CVFile.filename == filename)
|
| 174 |
+
result = await db.execute(stmt)
|
| 175 |
+
await db.commit()
|
| 176 |
+
return result.rowcount > 0
|
| 177 |
+
|
| 178 |
+
async def get_file_by_user_id(
|
| 179 |
+
db: AsyncSession,
|
| 180 |
+
user_id: str,
|
| 181 |
+
) -> CVFile | None:
|
| 182 |
+
result = await db.execute(
|
| 183 |
+
select(CVFile).where(CVFile.user_id == user_id)
|
| 184 |
+
)
|
| 185 |
+
return result.scalars().all()
|
| 186 |
+
|
| 187 |
+
async def get_file_by_filename(
|
| 188 |
+
db: AsyncSession,
|
| 189 |
+
filename: str,
|
| 190 |
+
user_id: UUID,
|
| 191 |
+
) -> CVFile | None:
|
| 192 |
+
|
| 193 |
+
result = await db.execute(
|
| 194 |
+
select(CVFile)
|
| 195 |
+
.where(
|
| 196 |
+
CVFile.filename == filename,
|
| 197 |
+
CVFile.user_id == user_id,
|
| 198 |
+
)
|
| 199 |
+
)
|
| 200 |
+
return result.scalar_one_or_none()
|
| 201 |
+
|
| 202 |
+
|
| 203 |
+
async def mark_file_extracted(db: AsyncSession, file_id: UUID):
|
| 204 |
+
await db.execute(
|
| 205 |
+
update(CVFile)
|
| 206 |
+
.where(CVFile.file_id == file_id)
|
| 207 |
+
.values(is_extracted=True)
|
| 208 |
+
)
|
| 209 |
+
|
| 210 |
+
# =========================
|
| 211 |
+
# PROFILE
|
| 212 |
+
# =========================
|
| 213 |
+
|
| 214 |
+
# async def create_profile(
|
| 215 |
+
# db: AsyncSession,
|
| 216 |
+
# profile: CVProfile,
|
| 217 |
+
# ) -> CVProfile:
|
| 218 |
+
# db.add(profile)
|
| 219 |
+
# await db.commit()
|
| 220 |
+
# await db.refresh(profile)
|
| 221 |
+
# return profile
|
| 222 |
+
|
| 223 |
+
from services.models.data_model import AIProfile
|
| 224 |
+
|
| 225 |
+
async def create_profile(
|
| 226 |
+
db: AsyncSession,
|
| 227 |
+
filename: str,
|
| 228 |
+
file_id: str,
|
| 229 |
+
profile: AIProfile,
|
| 230 |
+
) -> CVProfile:
|
| 231 |
+
|
| 232 |
+
profile = CVProfile(
|
| 233 |
+
fullname=profile.get("fullname"),
|
| 234 |
+
gpa_edu_1=profile.get("gpa_edu_1", None),
|
| 235 |
+
univ_edu_1=profile.get("univ_edu_1", None),
|
| 236 |
+
major_edu_1=profile.get("major_edu_1", None),
|
| 237 |
+
|
| 238 |
+
gpa_edu_2=profile.get("gpa_edu_2", None),
|
| 239 |
+
univ_edu_2=profile.get("univ_edu_2", None),
|
| 240 |
+
major_edu_2=profile.get("major_edu_2", None),
|
| 241 |
+
gpa_edu_3=profile.get("gpa_edu_3", None),
|
| 242 |
+
univ_edu_3=profile.get("univ_edu_3", None),
|
| 243 |
+
major_edu_3=profile.get("major_edu_3", None),
|
| 244 |
+
|
| 245 |
+
domicile=profile.get("domicile", None),
|
| 246 |
+
yoe=profile.get("yoe", None),
|
| 247 |
+
|
| 248 |
+
hardskills=profile.get("hardskills", []),
|
| 249 |
+
softskills=profile.get("softskills", []),
|
| 250 |
+
certifications=profile.get("certifications", []),
|
| 251 |
+
business_domain=profile.get("business_domain", []),
|
| 252 |
+
|
| 253 |
+
filename=filename,
|
| 254 |
+
file_id=file_id,
|
| 255 |
+
)
|
| 256 |
+
|
| 257 |
+
db.add(profile)
|
| 258 |
+
await db.flush()
|
| 259 |
+
return profile
|
| 260 |
+
|
| 261 |
+
|
| 262 |
+
async def get_profile_by_filename(
|
| 263 |
+
db: AsyncSession,
|
| 264 |
+
filename: str,
|
| 265 |
+
) -> Optional[CVProfile]:
|
| 266 |
+
stmt = select(CVProfile).where(CVProfile.filename == filename)
|
| 267 |
+
result = await db.execute(stmt)
|
| 268 |
+
return result.scalar_one_or_none()
|
| 269 |
+
|
| 270 |
+
|
| 271 |
+
async def get_profile_by_id(
|
| 272 |
+
db: AsyncSession,
|
| 273 |
+
profile_id: str,
|
| 274 |
+
) -> Optional[CVProfile]:
|
| 275 |
+
stmt = select(CVProfile).where(CVProfile.profile_id == profile_id)
|
| 276 |
+
result = await db.execute(stmt)
|
| 277 |
+
return result.scalar_one_or_none()
|
| 278 |
+
|
| 279 |
+
|
| 280 |
+
async def list_profiles(
|
| 281 |
+
db: AsyncSession,
|
| 282 |
+
limit: int = 50,
|
| 283 |
+
offset: int = 0,
|
| 284 |
+
) -> List[CVProfile]:
|
| 285 |
+
stmt = select(CVProfile).limit(limit).offset(offset)
|
| 286 |
+
result = await db.execute(stmt)
|
| 287 |
+
return result.scalars().all()
|
| 288 |
+
|
| 289 |
+
|
| 290 |
+
# =========================
|
| 291 |
+
# FILTER & WEIGHT
|
| 292 |
+
# =========================
|
| 293 |
+
from sqlalchemy import select, and_
|
| 294 |
+
from sqlalchemy.ext.asyncio import AsyncSession
|
| 295 |
+
|
| 296 |
+
async def get_filter(
|
| 297 |
+
db: AsyncSession,
|
| 298 |
+
filter: CVFilter,
|
| 299 |
+
):
|
| 300 |
+
conditions = []
|
| 301 |
+
|
| 302 |
+
# --- GPA ---
|
| 303 |
+
if filter.gpa_edu_1 is not None:
|
| 304 |
+
conditions.append(CVFilter.gpa_edu_1 >= filter.gpa_edu_1)
|
| 305 |
+
if filter.gpa_edu_2 is not None:
|
| 306 |
+
conditions.append(CVFilter.gpa_edu_2 >= filter.gpa_edu_2)
|
| 307 |
+
if filter.gpa_edu_3 is not None:
|
| 308 |
+
conditions.append(CVFilter.gpa_edu_3 >= filter.gpa_edu_3)
|
| 309 |
+
|
| 310 |
+
# --- University ---
|
| 311 |
+
if filter.univ_edu_1:
|
| 312 |
+
conditions.append(CVFilter.univ_edu_1 == filter.univ_edu_1)
|
| 313 |
+
if filter.univ_edu_2:
|
| 314 |
+
conditions.append(CVFilter.univ_edu_2 == filter.univ_edu_2)
|
| 315 |
+
if filter.univ_edu_3:
|
| 316 |
+
conditions.append(CVFilter.univ_edu_3 == filter.univ_edu_3)
|
| 317 |
+
|
| 318 |
+
# --- Major ---
|
| 319 |
+
if filter.major_edu_1:
|
| 320 |
+
conditions.append(CVFilter.major_edu_1 == filter.major_edu_1)
|
| 321 |
+
if filter.major_edu_2:
|
| 322 |
+
conditions.append(CVFilter.major_edu_2 == filter.major_edu_2)
|
| 323 |
+
if filter.major_edu_3:
|
| 324 |
+
conditions.append(CVFilter.major_edu_3 == filter.major_edu_3)
|
| 325 |
+
|
| 326 |
+
# --- Others ---
|
| 327 |
+
if filter.domicile:
|
| 328 |
+
conditions.append(CVFilter.domicile == filter.domicile)
|
| 329 |
+
|
| 330 |
+
if filter.yoe is not None:
|
| 331 |
+
conditions.append(CVFilter.yoe >= filter.yoe)
|
| 332 |
+
|
| 333 |
+
# --- ARRAY fields (exact match) ---
|
| 334 |
+
if filter.hardskills:
|
| 335 |
+
conditions.append(CVFilter.hardskills == filter.hardskills)
|
| 336 |
+
|
| 337 |
+
if filter.softskills:
|
| 338 |
+
conditions.append(CVFilter.softskills == filter.softskills)
|
| 339 |
+
|
| 340 |
+
if filter.certifications:
|
| 341 |
+
conditions.append(CVFilter.certifications == filter.certifications)
|
| 342 |
+
|
| 343 |
+
if filter.business_domain:
|
| 344 |
+
conditions.append(CVFilter.business_domain == filter.business_domain)
|
| 345 |
+
|
| 346 |
+
# ⛔ Prevent full table scan
|
| 347 |
+
if not conditions:
|
| 348 |
+
return None
|
| 349 |
+
|
| 350 |
+
stmt = select(CVFilter).where(and_(*conditions))
|
| 351 |
+
result = await db.execute(stmt)
|
| 352 |
+
|
| 353 |
+
return result.scalar_one_or_none()
|
| 354 |
+
|
| 355 |
+
|
| 356 |
+
async def get_filter_by_id(
|
| 357 |
+
db: AsyncSession,
|
| 358 |
+
criteria_id: str,
|
| 359 |
+
) -> Optional[CVFilter]:
|
| 360 |
+
stmt = select(CVFilter).where(CVFilter.criteria_id == criteria_id)
|
| 361 |
+
result = await db.execute(stmt)
|
| 362 |
+
return result.scalar_one_or_none()
|
| 363 |
+
|
| 364 |
+
|
| 365 |
+
|
| 366 |
+
async def create_filter(
|
| 367 |
+
db: AsyncSession,
|
| 368 |
+
filter: CVFilter,
|
| 369 |
+
):
|
| 370 |
+
db.add(filter)
|
| 371 |
+
await db.commit()
|
| 372 |
+
return filter
|
| 373 |
+
|
| 374 |
+
|
| 375 |
+
async def get_filter_and_weight(
|
| 376 |
+
db: AsyncSession,
|
| 377 |
+
criteria_id: str,
|
| 378 |
+
):
|
| 379 |
+
stmt = (
|
| 380 |
+
select(CVFilter, CVWeight)
|
| 381 |
+
.join(CVWeight, CVFilter.criteria_id == CVWeight.criteria_id)
|
| 382 |
+
.where(CVFilter.criteria_id == criteria_id)
|
| 383 |
+
)
|
| 384 |
+
result = await db.execute(stmt)
|
| 385 |
+
return result.first()
|
| 386 |
+
|
| 387 |
+
|
| 388 |
+
async def get_weight_by_id(
|
| 389 |
+
db: AsyncSession,
|
| 390 |
+
weight_id: str,
|
| 391 |
+
):
|
| 392 |
+
stmt = (
|
| 393 |
+
select(CVWeight)
|
| 394 |
+
.where(CVFilter.weight_id == weight_id)
|
| 395 |
+
)
|
| 396 |
+
result = await db.execute(stmt)
|
| 397 |
+
return result.first()
|
| 398 |
+
|
| 399 |
+
|
| 400 |
+
async def create_filter_and_weight(
|
| 401 |
+
db: AsyncSession,
|
| 402 |
+
cv_filter: CVFilter,
|
| 403 |
+
cv_weight: CVWeight,
|
| 404 |
+
):
|
| 405 |
+
db.add_all([cv_filter, cv_weight])
|
| 406 |
+
await db.commit()
|
| 407 |
+
|
| 408 |
+
async def create_weight(
|
| 409 |
+
db: AsyncSession,
|
| 410 |
+
cv_weight: CVWeight,
|
| 411 |
+
):
|
| 412 |
+
db.add(cv_weight)
|
| 413 |
+
await db.commit()
|
| 414 |
+
|
| 415 |
+
|
| 416 |
+
# =========================
|
| 417 |
+
# MATCHING
|
| 418 |
+
# =========================
|
| 419 |
+
|
| 420 |
+
async def create_matching(
|
| 421 |
+
db: AsyncSession,
|
| 422 |
+
matching: CVMatching,
|
| 423 |
+
) -> CVMatching:
|
| 424 |
+
db.add(matching)
|
| 425 |
+
await db.commit()
|
| 426 |
+
await db.refresh(matching)
|
| 427 |
+
return matching
|
| 428 |
+
|
| 429 |
+
|
| 430 |
+
async def get_matching_by_profile_and_criteria(
|
| 431 |
+
db: AsyncSession,
|
| 432 |
+
profile_id: str,
|
| 433 |
+
criteria_id: str,
|
| 434 |
+
) -> Optional[CVMatching]:
|
| 435 |
+
stmt = (
|
| 436 |
+
select(CVMatching)
|
| 437 |
+
.where(
|
| 438 |
+
and_(
|
| 439 |
+
CVMatching.profile_id == profile_id,
|
| 440 |
+
CVMatching.criteria_id == criteria_id,
|
| 441 |
+
)
|
| 442 |
+
)
|
| 443 |
+
)
|
| 444 |
+
result = await db.execute(stmt)
|
| 445 |
+
return result.scalar_one_or_none()
|
| 446 |
+
|
| 447 |
+
|
| 448 |
+
# =========================
|
| 449 |
+
# SCORE
|
| 450 |
+
# =========================
|
| 451 |
+
|
| 452 |
+
async def create_score(
|
| 453 |
+
db: AsyncSession,
|
| 454 |
+
score: CVScore,
|
| 455 |
+
) -> CVScore:
|
| 456 |
+
db.add(score)
|
| 457 |
+
await db.commit()
|
| 458 |
+
await db.refresh(score)
|
| 459 |
+
return score
|
| 460 |
+
|
| 461 |
+
|
| 462 |
+
async def get_scores_by_criteria(
|
| 463 |
+
db: AsyncSession,
|
| 464 |
+
criteria_id: str,
|
| 465 |
+
) -> List[CVScore]:
|
| 466 |
+
stmt = (
|
| 467 |
+
select(CVScore)
|
| 468 |
+
.join(CVMatching, CVScore.matching_id == CVMatching.matching_id)
|
| 469 |
+
.where(CVMatching.criteria_id == criteria_id)
|
| 470 |
+
.order_by(CVScore.score.desc())
|
| 471 |
+
)
|
| 472 |
+
result = await db.execute(stmt)
|
| 473 |
+
return result.scalars().all()
|
externals/databases/pg_models.py
ADDED
|
@@ -0,0 +1,169 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from config.get_config import master_config
|
| 2 |
+
from sqlalchemy import Column, String, Integer, TIMESTAMP, func
|
| 3 |
+
from sqlalchemy.dialects.postgresql import UUID, ARRAY, DOUBLE_PRECISION, BOOLEAN
|
| 4 |
+
from sqlalchemy.orm import declarative_base
|
| 5 |
+
|
| 6 |
+
|
| 7 |
+
Base = declarative_base()
|
| 8 |
+
|
| 9 |
+
class CVUser(Base):
|
| 10 |
+
__tablename__ = "cv_user"
|
| 11 |
+
|
| 12 |
+
user_id = Column(UUID(as_uuid=True), primary_key=True, server_default=func.uuid_generate_v4())
|
| 13 |
+
username = Column(String, nullable=False, unique=True)
|
| 14 |
+
hashed_password = Column(String, nullable=False)
|
| 15 |
+
email = Column(String, nullable=False, unique=True)
|
| 16 |
+
full_name = Column(String, nullable=False)
|
| 17 |
+
role = Column(String, nullable=False)
|
| 18 |
+
is_active = Column(BOOLEAN, nullable=False)
|
| 19 |
+
tenant_id = Column(UUID(as_uuid=True), primary_key=False)
|
| 20 |
+
created_at = Column(TIMESTAMP(timezone=True), server_default=master_config.JAKARTA_NOW)
|
| 21 |
+
date_modified = Column(TIMESTAMP(timezone=True), server_default=master_config.JAKARTA_NOW)
|
| 22 |
+
notes = Column(String)
|
| 23 |
+
|
| 24 |
+
class CVTenant(Base):
|
| 25 |
+
__tablename__ = "cv_tenant"
|
| 26 |
+
|
| 27 |
+
tenant_id = Column(UUID(as_uuid=True), primary_key=True, server_default=func.uuid_generate_v4())
|
| 28 |
+
tenant_name = Column(String, nullable=False, unique=True)
|
| 29 |
+
created_at = Column(TIMESTAMP(timezone=True), server_default=master_config.JAKARTA_NOW)
|
| 30 |
+
date_modified = Column(TIMESTAMP(timezone=True), server_default=master_config.JAKARTA_NOW)
|
| 31 |
+
notes = Column(String)
|
| 32 |
+
|
| 33 |
+
class CVFile(Base):
|
| 34 |
+
__tablename__ = "cv_file"
|
| 35 |
+
file_id = Column(UUID(as_uuid=True), primary_key=True, server_default=func.uuid_generate_v4())
|
| 36 |
+
user_id = Column(UUID(as_uuid=True), nullable=False)
|
| 37 |
+
file_type = Column(String, nullable=False)
|
| 38 |
+
filename = Column(String, nullable=False)
|
| 39 |
+
url = Column(String, nullable=False)
|
| 40 |
+
is_extracted = Column(BOOLEAN, nullable=False)
|
| 41 |
+
uploaded_at = Column(TIMESTAMP(timezone=True), server_default=master_config.JAKARTA_NOW)
|
| 42 |
+
date_modified = Column(TIMESTAMP(timezone=True), server_default=master_config.JAKARTA_NOW)
|
| 43 |
+
|
| 44 |
+
class CVProfile(Base):
|
| 45 |
+
__tablename__ = "cv_profile"
|
| 46 |
+
|
| 47 |
+
profile_id = Column(UUID(as_uuid=True), primary_key=True, server_default=func.uuid_generate_v4())
|
| 48 |
+
fullname = Column(String, nullable=False)
|
| 49 |
+
|
| 50 |
+
gpa_edu_1 = Column(DOUBLE_PRECISION)
|
| 51 |
+
univ_edu_1 = Column(String)
|
| 52 |
+
major_edu_1 = Column(String)
|
| 53 |
+
|
| 54 |
+
gpa_edu_2 = Column(DOUBLE_PRECISION)
|
| 55 |
+
univ_edu_2 = Column(String)
|
| 56 |
+
major_edu_2 = Column(String)
|
| 57 |
+
|
| 58 |
+
gpa_edu_3 = Column(DOUBLE_PRECISION)
|
| 59 |
+
univ_edu_3 = Column(String)
|
| 60 |
+
major_edu_3 = Column(String)
|
| 61 |
+
|
| 62 |
+
domicile = Column(String)
|
| 63 |
+
yoe = Column(Integer)
|
| 64 |
+
|
| 65 |
+
hardskills = Column(ARRAY(String))
|
| 66 |
+
softskills = Column(ARRAY(String))
|
| 67 |
+
certifications = Column(ARRAY(String))
|
| 68 |
+
business_domain = Column(ARRAY(String))
|
| 69 |
+
|
| 70 |
+
filename = Column(String, nullable=False, unique=True)
|
| 71 |
+
file_id = Column(UUID(as_uuid=True), primary_key=False)
|
| 72 |
+
created_at = Column(TIMESTAMP(timezone=True), server_default=master_config.JAKARTA_NOW)
|
| 73 |
+
|
| 74 |
+
|
| 75 |
+
class CVFilter(Base):
|
| 76 |
+
__tablename__ = "cv_filter"
|
| 77 |
+
|
| 78 |
+
criteria_id = Column(UUID(as_uuid=True), primary_key=True, server_default=func.uuid_generate_v4())
|
| 79 |
+
|
| 80 |
+
gpa_edu_1 = Column(DOUBLE_PRECISION)
|
| 81 |
+
gpa_edu_2 = Column(DOUBLE_PRECISION)
|
| 82 |
+
gpa_edu_3 = Column(DOUBLE_PRECISION)
|
| 83 |
+
|
| 84 |
+
univ_edu_1 = Column(String)
|
| 85 |
+
univ_edu_2 = Column(String)
|
| 86 |
+
univ_edu_3 = Column(String)
|
| 87 |
+
|
| 88 |
+
major_edu_1 = Column(String)
|
| 89 |
+
major_edu_2 = Column(String)
|
| 90 |
+
major_edu_3 = Column(String)
|
| 91 |
+
|
| 92 |
+
domicile = Column(String)
|
| 93 |
+
yoe = Column(Integer)
|
| 94 |
+
|
| 95 |
+
hardskills = Column(ARRAY(String))
|
| 96 |
+
softskills = Column(ARRAY(String))
|
| 97 |
+
certifications = Column(ARRAY(String))
|
| 98 |
+
business_domain = Column(ARRAY(String))
|
| 99 |
+
|
| 100 |
+
created_at = Column(TIMESTAMP(timezone=True), server_default=master_config.JAKARTA_NOW)
|
| 101 |
+
|
| 102 |
+
|
| 103 |
+
class CVWeight(Base):
|
| 104 |
+
__tablename__ = "cv_weight"
|
| 105 |
+
|
| 106 |
+
weight_id = Column(UUID(as_uuid=True), primary_key=True, server_default=func.uuid_generate_v4())
|
| 107 |
+
criteria_id = Column(UUID(as_uuid=True), primary_key=True)
|
| 108 |
+
|
| 109 |
+
gpa_edu_1 = Column(DOUBLE_PRECISION)
|
| 110 |
+
gpa_edu_2 = Column(DOUBLE_PRECISION)
|
| 111 |
+
gpa_edu_3 = Column(DOUBLE_PRECISION)
|
| 112 |
+
|
| 113 |
+
univ_edu_1 = Column(DOUBLE_PRECISION)
|
| 114 |
+
univ_edu_2 = Column(DOUBLE_PRECISION)
|
| 115 |
+
univ_edu_3 = Column(DOUBLE_PRECISION)
|
| 116 |
+
|
| 117 |
+
major_edu_1 = Column(DOUBLE_PRECISION)
|
| 118 |
+
major_edu_2 = Column(DOUBLE_PRECISION)
|
| 119 |
+
major_edu_3 = Column(DOUBLE_PRECISION)
|
| 120 |
+
|
| 121 |
+
domicile = Column(DOUBLE_PRECISION)
|
| 122 |
+
yoe = Column(DOUBLE_PRECISION)
|
| 123 |
+
|
| 124 |
+
hardskills = Column(DOUBLE_PRECISION)
|
| 125 |
+
softskills = Column(DOUBLE_PRECISION)
|
| 126 |
+
certifications = Column(DOUBLE_PRECISION)
|
| 127 |
+
business_domain = Column(DOUBLE_PRECISION)
|
| 128 |
+
|
| 129 |
+
created_at = Column(TIMESTAMP(timezone=True), server_default=master_config.JAKARTA_NOW)
|
| 130 |
+
|
| 131 |
+
|
| 132 |
+
class CVMatching(Base):
|
| 133 |
+
__tablename__ = "cv_matching"
|
| 134 |
+
|
| 135 |
+
matching_id = Column(UUID(as_uuid=True), primary_key=True, server_default=func.uuid_generate_v4())
|
| 136 |
+
profile_id = Column(UUID(as_uuid=True))
|
| 137 |
+
criteria_id = Column(UUID(as_uuid=True))
|
| 138 |
+
|
| 139 |
+
gpa_edu_1 = Column(BOOLEAN)
|
| 140 |
+
gpa_edu_2 = Column(BOOLEAN)
|
| 141 |
+
gpa_edu_3 = Column(BOOLEAN)
|
| 142 |
+
|
| 143 |
+
univ_edu_1 = Column(BOOLEAN)
|
| 144 |
+
univ_edu_2 = Column(BOOLEAN)
|
| 145 |
+
univ_edu_3 = Column(BOOLEAN)
|
| 146 |
+
|
| 147 |
+
major_edu_1 = Column(BOOLEAN)
|
| 148 |
+
major_edu_2 = Column(BOOLEAN)
|
| 149 |
+
major_edu_3 = Column(BOOLEAN)
|
| 150 |
+
|
| 151 |
+
domicile = Column(BOOLEAN)
|
| 152 |
+
yoe = Column(BOOLEAN)
|
| 153 |
+
|
| 154 |
+
hardskills = Column(BOOLEAN)
|
| 155 |
+
softskills = Column(BOOLEAN)
|
| 156 |
+
certifications = Column(BOOLEAN)
|
| 157 |
+
business_domain = Column(BOOLEAN)
|
| 158 |
+
|
| 159 |
+
created_at = Column(TIMESTAMP(timezone=True), server_default=master_config.JAKARTA_NOW)
|
| 160 |
+
|
| 161 |
+
|
| 162 |
+
class CVScore(Base):
|
| 163 |
+
__tablename__ = "cv_score"
|
| 164 |
+
|
| 165 |
+
scoring_id = Column(UUID(as_uuid=True), primary_key=True, server_default=func.uuid_generate_v4())
|
| 166 |
+
matching_id = Column(UUID(as_uuid=True))
|
| 167 |
+
score = Column(Integer)
|
| 168 |
+
|
| 169 |
+
created_at = Column(TIMESTAMP(timezone=True), server_default=master_config.JAKARTA_NOW)
|
externals/databases/pg_schema_down.py
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import os
|
| 2 |
+
import dotenv
|
| 3 |
+
from config.constant import EnvPostgresConstants, EnvFilepath
|
| 4 |
+
dotenv.load_dotenv(EnvFilepath.ENVPATH)
|
| 5 |
+
|
| 6 |
+
from sqlalchemy import create_engine, text
|
| 7 |
+
from externals.databases.pg_models import Base
|
| 8 |
+
from utils.logger import get_logger
|
| 9 |
+
|
| 10 |
+
|
| 11 |
+
|
| 12 |
+
logger = get_logger("init schema")
|
| 13 |
+
|
| 14 |
+
def drop_tables():
|
| 15 |
+
try:
|
| 16 |
+
DATABASE_URL = EnvPostgresConstants.CONSTRING
|
| 17 |
+
engine = create_engine(DATABASE_URL)
|
| 18 |
+
|
| 19 |
+
# Create extension
|
| 20 |
+
with engine.connect() as conn:
|
| 21 |
+
conn.execute(text('CREATE EXTENSION IF NOT EXISTS "uuid-ossp";'))
|
| 22 |
+
conn.commit()
|
| 23 |
+
|
| 24 |
+
# Create tables
|
| 25 |
+
Base.metadata.drop_all(engine)
|
| 26 |
+
logger.info("✅ drop schema success")
|
| 27 |
+
except Exception as E:
|
| 28 |
+
logger.error(f"❌ drop schema failed, {E}")
|
| 29 |
+
|
| 30 |
+
|
| 31 |
+
|
| 32 |
+
if __name__ == "__main__":
|
| 33 |
+
drop_tables()
|
externals/databases/pg_schema_up.py
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import os
|
| 2 |
+
import dotenv
|
| 3 |
+
|
| 4 |
+
from config.constant import EnvPostgresConstants, EnvFilepath
|
| 5 |
+
dotenv.load_dotenv(EnvFilepath.ENVPATH)
|
| 6 |
+
|
| 7 |
+
from externals.databases.pg_models import Base
|
| 8 |
+
from sqlalchemy import create_engine, text
|
| 9 |
+
from utils.logger import get_logger
|
| 10 |
+
|
| 11 |
+
logger = get_logger("init schema")
|
| 12 |
+
|
| 13 |
+
|
| 14 |
+
def create_tables():
|
| 15 |
+
try:
|
| 16 |
+
DATABASE_URL = EnvPostgresConstants.CONSTRING
|
| 17 |
+
engine = create_engine(DATABASE_URL)
|
| 18 |
+
|
| 19 |
+
# Create extension
|
| 20 |
+
with engine.connect() as conn:
|
| 21 |
+
conn.execute(text('CREATE EXTENSION IF NOT EXISTS "uuid-ossp";'))
|
| 22 |
+
conn.commit()
|
| 23 |
+
|
| 24 |
+
# Create tables
|
| 25 |
+
Base.metadata.create_all(engine)
|
| 26 |
+
logger.info("✅ init schema success")
|
| 27 |
+
except Exception as E:
|
| 28 |
+
logger.error(f"❌ init schema failed, {E}")
|
| 29 |
+
|
| 30 |
+
|
| 31 |
+
if __name__ == "__main__":
|
| 32 |
+
create_tables()
|
externals/databases/schemas/__init__.py
ADDED
|
File without changes
|
externals/databases/schemas/auth.py
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from pydantic import BaseModel, EmailStr
|
| 2 |
+
|
| 3 |
+
class LoginRequest(BaseModel):
|
| 4 |
+
email: EmailStr
|
| 5 |
+
password: str
|
| 6 |
+
|
| 7 |
+
|
| 8 |
+
class TokenResponse(BaseModel):
|
| 9 |
+
access_token: str
|
| 10 |
+
token_type: str = "bearer"
|
externals/databases/schemas/knowledge.py
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from pydantic import BaseModel
|
| 2 |
+
from typing import Any
|
| 3 |
+
|
| 4 |
+
class ResponseGetProfile(BaseModel):
|
| 5 |
+
status: str
|
| 6 |
+
message: str
|
| 7 |
+
data: Any
|
externals/databases/schemas/tenant.py
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from uuid import UUID
|
| 2 |
+
from typing import Optional
|
| 3 |
+
from datetime import datetime
|
| 4 |
+
|
| 5 |
+
from pydantic import BaseModel, Field
|
| 6 |
+
|
| 7 |
+
|
| 8 |
+
# ---------- REQUEST ----------
|
| 9 |
+
class TenantCreate(BaseModel):
|
| 10 |
+
tenant_name: str = Field(..., min_length=3, max_length=100)
|
| 11 |
+
notes: Optional[str] = None
|
| 12 |
+
|
| 13 |
+
|
| 14 |
+
# ---------- UPDATE (OPTIONAL) ----------
|
| 15 |
+
class TenantUpdate(BaseModel):
|
| 16 |
+
tenant_name: Optional[str] = Field(None, min_length=3, max_length=100)
|
| 17 |
+
notes: Optional[str] = None
|
| 18 |
+
|
| 19 |
+
|
| 20 |
+
# ---------- RESPONSE ----------
|
| 21 |
+
class TenantResponse(BaseModel):
|
| 22 |
+
tenant_id: UUID
|
| 23 |
+
tenant_name: str
|
| 24 |
+
created_at: datetime
|
| 25 |
+
date_modified: datetime
|
| 26 |
+
notes: Optional[str] = None
|
| 27 |
+
|
| 28 |
+
class Config:
|
| 29 |
+
from_attributes = True # Pydantic v2 (ORM support)
|
externals/databases/schemas/user.py
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from uuid import UUID
|
| 2 |
+
from typing import Optional
|
| 3 |
+
from datetime import datetime
|
| 4 |
+
from pydantic import BaseModel, EmailStr
|
| 5 |
+
|
| 6 |
+
|
| 7 |
+
# ---------- REQUEST ----------
|
| 8 |
+
class UserCreate(BaseModel):
|
| 9 |
+
username: str
|
| 10 |
+
password: str
|
| 11 |
+
email: EmailStr
|
| 12 |
+
full_name: str
|
| 13 |
+
role: str
|
| 14 |
+
tenant_id: Optional[UUID] = None
|
| 15 |
+
notes: Optional[str] = None
|
| 16 |
+
|
| 17 |
+
|
| 18 |
+
# ---------- RESPONSE ----------
|
| 19 |
+
class UserResponse(BaseModel):
|
| 20 |
+
user_id: UUID
|
| 21 |
+
username: str
|
| 22 |
+
email: EmailStr
|
| 23 |
+
full_name: str
|
| 24 |
+
role: str
|
| 25 |
+
is_active: bool
|
| 26 |
+
tenant_id: Optional[UUID]
|
| 27 |
+
created_at: datetime
|
| 28 |
+
|
| 29 |
+
class Config:
|
| 30 |
+
from_attributes = True # ⬅️ WAJIB (SQLAlchemy → Pydantic)
|
externals/observability/__init__.py
ADDED
|
File without changes
|
externals/observability/langfuse.py
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import os
|
| 2 |
+
import dotenv
|
| 3 |
+
from config.constant import EnvFilepath
|
| 4 |
+
dotenv.load_dotenv(EnvFilepath.ENVPATH)
|
| 5 |
+
from langfuse import Langfuse
|
| 6 |
+
from langchain_core.callbacks.base import BaseCallbackHandler
|
| 7 |
+
|
| 8 |
+
|
| 9 |
+
langfuse = Langfuse(
|
| 10 |
+
secret_key=os.environ.get('ss--langfuse--secret-key'),
|
| 11 |
+
public_key=os.environ.get('ss--langfuse--public-key'),
|
| 12 |
+
host=os.environ.get('langfuse--host'),
|
| 13 |
+
)
|
| 14 |
+
|
| 15 |
+
|
| 16 |
+
langfuse_handler = BaseCallbackHandler()
|
externals/storages/azure_blob.py
ADDED
|
@@ -0,0 +1,183 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import os
|
| 2 |
+
import uuid
|
| 3 |
+
from typing import List, Dict, Any
|
| 4 |
+
|
| 5 |
+
from azure.identity.aio import DefaultAzureCredential
|
| 6 |
+
from azure.storage.blob.aio import BlobServiceClient, ContainerClient
|
| 7 |
+
from fastapi import UploadFile, HTTPException, status
|
| 8 |
+
|
| 9 |
+
from config.constant import AzureBlobConstants
|
| 10 |
+
from utils.logger import get_logger
|
| 11 |
+
|
| 12 |
+
logger = get_logger("azure-blob")
|
| 13 |
+
|
| 14 |
+
# ---------- SINGLETONS ----------
|
| 15 |
+
_blob_service_client: BlobServiceClient | None = None
|
| 16 |
+
_credential: DefaultAzureCredential | None = None
|
| 17 |
+
|
| 18 |
+
|
| 19 |
+
async def get_blob_service_client() -> BlobServiceClient:
|
| 20 |
+
global _blob_service_client, _credential
|
| 21 |
+
|
| 22 |
+
if _blob_service_client is None:
|
| 23 |
+
_credential = DefaultAzureCredential()
|
| 24 |
+
_blob_service_client = BlobServiceClient(
|
| 25 |
+
account_url=AzureBlobConstants.ENDPOINT,
|
| 26 |
+
credential=_credential,
|
| 27 |
+
)
|
| 28 |
+
logger.info("✅ Azure BlobServiceClient initialized")
|
| 29 |
+
|
| 30 |
+
return _blob_service_client
|
| 31 |
+
|
| 32 |
+
|
| 33 |
+
async def get_container_client() -> ContainerClient:
|
| 34 |
+
service = await get_blob_service_client()
|
| 35 |
+
container = service.get_container_client(
|
| 36 |
+
AzureBlobConstants.CONTAINER_NAME
|
| 37 |
+
)
|
| 38 |
+
|
| 39 |
+
try:
|
| 40 |
+
await container.create_container()
|
| 41 |
+
logger.info("✅ Blob container created")
|
| 42 |
+
except Exception:
|
| 43 |
+
pass # already exists
|
| 44 |
+
|
| 45 |
+
return container
|
| 46 |
+
|
| 47 |
+
|
| 48 |
+
# ---------- HELPERS ----------
|
| 49 |
+
def build_blob_path(filename: str) -> str:
|
| 50 |
+
return f"{AzureBlobConstants.BLOB_PREFIX}/{filename}"
|
| 51 |
+
|
| 52 |
+
|
| 53 |
+
# ---------- UPLOAD ----------
|
| 54 |
+
# async def upload_pdf(
|
| 55 |
+
# file: UploadFile,
|
| 56 |
+
# ) -> Dict[str, Any]:
|
| 57 |
+
|
| 58 |
+
# if file.content_type != "application/pdf":
|
| 59 |
+
# raise HTTPException(
|
| 60 |
+
# status_code=status.HTTP_400_BAD_REQUEST,
|
| 61 |
+
# detail="Only PDF files are allowed",
|
| 62 |
+
# )
|
| 63 |
+
|
| 64 |
+
# container = await get_container_client()
|
| 65 |
+
|
| 66 |
+
# blob_name = f"{uuid.uuid4()}.pdf"
|
| 67 |
+
# blob_path = build_blob_path(blob_name)
|
| 68 |
+
|
| 69 |
+
# blob_client = container.get_blob_client(blob_path)
|
| 70 |
+
|
| 71 |
+
# size = 0
|
| 72 |
+
# chunks = []
|
| 73 |
+
|
| 74 |
+
# async for chunk in file.stream():
|
| 75 |
+
# size += len(chunk)
|
| 76 |
+
# if size > AzureBlobConstants.MAX_FILE_SIZE_MB * 1024 * 1024:
|
| 77 |
+
# raise HTTPException(
|
| 78 |
+
# status_code=status.HTTP_413_REQUEST_ENTITY_TOO_LARGE,
|
| 79 |
+
# detail="File too large",
|
| 80 |
+
# )
|
| 81 |
+
# chunks.append(chunk)
|
| 82 |
+
|
| 83 |
+
# await blob_client.upload_blob(
|
| 84 |
+
# b"".join(chunks),
|
| 85 |
+
# overwrite=False,
|
| 86 |
+
# content_type="application/pdf",
|
| 87 |
+
# )
|
| 88 |
+
|
| 89 |
+
# logger.info(f"✅ Uploaded PDF: {blob_path}")
|
| 90 |
+
|
| 91 |
+
# return {
|
| 92 |
+
# "blob_name": blob_name,
|
| 93 |
+
# "path": blob_path,
|
| 94 |
+
# "url": blob_client.url,
|
| 95 |
+
# "size_bytes": size,
|
| 96 |
+
# }
|
| 97 |
+
def helper_path_maker(
|
| 98 |
+
tenant_id: str,
|
| 99 |
+
user_id: str,
|
| 100 |
+
filename: str,
|
| 101 |
+
in_folder: str = AzureBlobConstants.BLOB_PREFIX,
|
| 102 |
+
):
|
| 103 |
+
return f"{in_folder}/{tenant_id}/{user_id}/{filename}"
|
| 104 |
+
|
| 105 |
+
|
| 106 |
+
from azure.storage.blob import ContentSettings
|
| 107 |
+
|
| 108 |
+
async def upload_pdf(file: UploadFile, tenant_id: str, user_id: str) -> dict:
|
| 109 |
+
container_client = await get_container_client()
|
| 110 |
+
blob_name = helper_path_maker(tenant_id, user_id, file.filename)
|
| 111 |
+
|
| 112 |
+
blob_client = container_client.get_blob_client(blob_name)
|
| 113 |
+
|
| 114 |
+
await file.seek(0)
|
| 115 |
+
|
| 116 |
+
await blob_client.upload_blob(
|
| 117 |
+
data=_file_chunk_generator(file),
|
| 118 |
+
overwrite=True,
|
| 119 |
+
content_settings=ContentSettings(
|
| 120 |
+
content_type=file.content_type or "application/pdf"
|
| 121 |
+
),
|
| 122 |
+
)
|
| 123 |
+
|
| 124 |
+
return {
|
| 125 |
+
"filename": file.filename,
|
| 126 |
+
"uploaded": True,
|
| 127 |
+
"url": blob_client.url,
|
| 128 |
+
}
|
| 129 |
+
|
| 130 |
+
|
| 131 |
+
async def _file_chunk_generator(file: UploadFile):
|
| 132 |
+
while True:
|
| 133 |
+
chunk = await file.read(AzureBlobConstants.CHUNK_SIZE)
|
| 134 |
+
if not chunk:
|
| 135 |
+
break
|
| 136 |
+
yield chunk
|
| 137 |
+
|
| 138 |
+
|
| 139 |
+
async def delete_blob_by_filename(filename: str, tenant_id: str, user_id: str) -> bool:
|
| 140 |
+
container = await get_container_client()
|
| 141 |
+
blob_path = helper_path_maker(tenant_id=tenant_id,
|
| 142 |
+
user_id=user_id,
|
| 143 |
+
filename=filename)
|
| 144 |
+
|
| 145 |
+
blob_client = container.get_blob_client(blob_path)
|
| 146 |
+
|
| 147 |
+
try:
|
| 148 |
+
await blob_client.delete_blob()
|
| 149 |
+
logger.info(
|
| 150 |
+
"azure.blob.delete.success",
|
| 151 |
+
extra={"cv_filename": filename},
|
| 152 |
+
)
|
| 153 |
+
return True
|
| 154 |
+
except Exception as e:
|
| 155 |
+
logger.error(
|
| 156 |
+
"azure.blob.delete.failed",
|
| 157 |
+
extra={
|
| 158 |
+
"cv_filename": filename,
|
| 159 |
+
"error": str(e),
|
| 160 |
+
},
|
| 161 |
+
)
|
| 162 |
+
return False
|
| 163 |
+
|
| 164 |
+
|
| 165 |
+
|
| 166 |
+
async def download_blob_by_filename(filename: str, tenant_id: str, user_id: str) -> bytes:
|
| 167 |
+
"""
|
| 168 |
+
Download file from Azure Blob Storage by filename
|
| 169 |
+
Return raw bytes
|
| 170 |
+
"""
|
| 171 |
+
try:
|
| 172 |
+
container_client = await get_container_client()
|
| 173 |
+
blob_name = helper_path_maker(tenant_id, user_id, filename)
|
| 174 |
+
|
| 175 |
+
blob_client = container_client.get_blob_client(blob_name)
|
| 176 |
+
|
| 177 |
+
downloader = await blob_client.download_blob()
|
| 178 |
+
file_bytes:bytes = await downloader.readall()
|
| 179 |
+
|
| 180 |
+
return file_bytes
|
| 181 |
+
|
| 182 |
+
except Exception as e:
|
| 183 |
+
raise RuntimeError(f"Failed to download blob '{filename}': {str(e)}")
|
externals/storages/azure_generate_sas.py
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from azure.identity import AzureCliCredential
|
| 2 |
+
from azure.storage.blob import (
|
| 3 |
+
BlobServiceClient,
|
| 4 |
+
generate_blob_sas,
|
| 5 |
+
BlobSasPermissions,
|
| 6 |
+
)
|
| 7 |
+
from config.constant import AzureBlobConstants
|
| 8 |
+
from config.get_config import master_config
|
| 9 |
+
from datetime import datetime, timedelta
|
| 10 |
+
from urllib.parse import quote
|
| 11 |
+
from urllib.parse import urlparse
|
| 12 |
+
|
| 13 |
+
|
| 14 |
+
async def get_blob_sas_url(blob_name:str,
|
| 15 |
+
account_name:str=AzureBlobConstants.ACCOUNT_NAME,
|
| 16 |
+
container_name:str=AzureBlobConstants.CONTAINER_NAME):
|
| 17 |
+
|
| 18 |
+
try:
|
| 19 |
+
blob_name = blob_name.replace('%20', ' ')
|
| 20 |
+
blob_name = urlparse(blob_name).path
|
| 21 |
+
|
| 22 |
+
permissions = BlobSasPermissions(read=True)
|
| 23 |
+
|
| 24 |
+
expiry = datetime.now(master_config.tzinfo) + timedelta(hours=1)
|
| 25 |
+
|
| 26 |
+
credential = AzureCliCredential()
|
| 27 |
+
|
| 28 |
+
account_url = f"https://{account_name}.blob.core.windows.net"
|
| 29 |
+
service_client = BlobServiceClient(account_url=account_url, credential=credential)
|
| 30 |
+
|
| 31 |
+
start_time = datetime.now(master_config.tzinfo) - timedelta(minutes=5)
|
| 32 |
+
udk = service_client.get_user_delegation_key(key_start_time=start_time, key_expiry_time=expiry)
|
| 33 |
+
|
| 34 |
+
sas_token = generate_blob_sas(
|
| 35 |
+
account_name=account_name,
|
| 36 |
+
container_name=container_name,
|
| 37 |
+
blob_name=blob_name,
|
| 38 |
+
permission=permissions,
|
| 39 |
+
start=start_time,
|
| 40 |
+
expiry=expiry,
|
| 41 |
+
user_delegation_key=udk,
|
| 42 |
+
protocol="https",
|
| 43 |
+
)
|
| 44 |
+
|
| 45 |
+
# Build a URL-safe path (encode reserved characters)
|
| 46 |
+
encoded_blob_name = quote(blob_name, safe="/") # keep '/' but encode spaces, etc.
|
| 47 |
+
blob_url_with_sas = f"{account_url}/{container_name}/{encoded_blob_name}?{sas_token}"
|
| 48 |
+
|
| 49 |
+
return blob_url_with_sas
|
| 50 |
+
except Exception as E:
|
| 51 |
+
print("Error generating SAS URL:", str(E))
|
| 52 |
+
return None
|
interfaces/__init__.py
ADDED
|
File without changes
|
interfaces/api/agentic.py
ADDED
|
@@ -0,0 +1,247 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import time
|
| 2 |
+
from fastapi import APIRouter
|
| 3 |
+
from uuid import uuid4
|
| 4 |
+
# from externals.databases.pg_crud import get_all_cv_profiles, get_cv_profile_with_scores
|
| 5 |
+
from externals.databases.database import get_db
|
| 6 |
+
from services.agentic.agentic_setup import AgenticService
|
| 7 |
+
from services.knowledge.knowledge_setup import KnowledgeService
|
| 8 |
+
from services.models.data_model import (Criteria,
|
| 9 |
+
CriteriaWeight,
|
| 10 |
+
PayloadMatchOne,
|
| 11 |
+
ResponseMatchOne,
|
| 12 |
+
DataResponseMatchOne,
|
| 13 |
+
PayloadMatchBulk,
|
| 14 |
+
ResponseMatchBulk,
|
| 15 |
+
DataResponseMatchBulk)
|
| 16 |
+
from interfaces.api.deps import get_current_user
|
| 17 |
+
from fastapi import APIRouter, UploadFile, File, Depends, status, HTTPException
|
| 18 |
+
from externals.databases.pg_models import CVUser, CVFilter, CVWeight
|
| 19 |
+
|
| 20 |
+
from utils.logger import get_logger
|
| 21 |
+
|
| 22 |
+
logger = get_logger("agentic service")
|
| 23 |
+
router = APIRouter(
|
| 24 |
+
prefix="/agentic",
|
| 25 |
+
tags=["Agentic"],
|
| 26 |
+
)
|
| 27 |
+
|
| 28 |
+
|
| 29 |
+
@router.post("/create_filter")
|
| 30 |
+
async def create_filter(
|
| 31 |
+
filter: Criteria,
|
| 32 |
+
db=Depends(get_db),
|
| 33 |
+
current_user: CVUser = Depends(get_current_user),
|
| 34 |
+
):
|
| 35 |
+
try:
|
| 36 |
+
agentic_service = AgenticService(db=db,
|
| 37 |
+
user=current_user)
|
| 38 |
+
|
| 39 |
+
cv_filter = CVFilter(
|
| 40 |
+
criteria_id=uuid4(),
|
| 41 |
+
|
| 42 |
+
gpa_edu_1=filter.get("gpa_edu_1"),
|
| 43 |
+
gpa_edu_2=filter.get("gpa_edu_2"),
|
| 44 |
+
gpa_edu_3=filter.get("gpa_edu_3"),
|
| 45 |
+
|
| 46 |
+
univ_edu_1=filter.get("univ_edu_1"),
|
| 47 |
+
univ_edu_2=filter.get("univ_edu_2"),
|
| 48 |
+
univ_edu_3=filter.get("univ_edu_3"),
|
| 49 |
+
|
| 50 |
+
major_edu_1=filter.get("major_edu_1"),
|
| 51 |
+
major_edu_2=filter.get("major_edu_2"),
|
| 52 |
+
major_edu_3=filter.get("major_edu_3"),
|
| 53 |
+
|
| 54 |
+
domicile=filter.get("domicile"),
|
| 55 |
+
yoe=filter.get("yoe"),
|
| 56 |
+
|
| 57 |
+
hardskills=filter.get("hardskills"),
|
| 58 |
+
softskills=filter.get("softskills"),
|
| 59 |
+
certifications=filter.get("certifications"),
|
| 60 |
+
business_domain=filter.get("business_domain")
|
| 61 |
+
)
|
| 62 |
+
|
| 63 |
+
logger.info(f"cv_filter: {cv_filter}")
|
| 64 |
+
|
| 65 |
+
data = await agentic_service.filter.create_filter(filter=cv_filter)
|
| 66 |
+
return {
|
| 67 |
+
"status": "success",
|
| 68 |
+
"message": "Filter created successfully",
|
| 69 |
+
"criteria_id": data
|
| 70 |
+
}
|
| 71 |
+
except Exception as E:
|
| 72 |
+
logger.error(f"create filter error: {E}")
|
| 73 |
+
raise HTTPException(
|
| 74 |
+
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
|
| 75 |
+
detail=f"create filter error: {E}"
|
| 76 |
+
)
|
| 77 |
+
|
| 78 |
+
|
| 79 |
+
@router.get("/filter/{criteria_id}")
|
| 80 |
+
async def get_filter_by_id(
|
| 81 |
+
criteria_id: str,
|
| 82 |
+
db=Depends(get_db),
|
| 83 |
+
current_user: CVUser = Depends(get_current_user),
|
| 84 |
+
):
|
| 85 |
+
agentic_service = AgenticService(db=db,
|
| 86 |
+
user=current_user)
|
| 87 |
+
|
| 88 |
+
data = await agentic_service.filter.get_filter_by_id(criteria_id=criteria_id)
|
| 89 |
+
return data
|
| 90 |
+
|
| 91 |
+
|
| 92 |
+
|
| 93 |
+
@router.post("/create_weight")
|
| 94 |
+
async def create_weight(
|
| 95 |
+
criteria_id: str,
|
| 96 |
+
weight: CriteriaWeight,
|
| 97 |
+
db=Depends(get_db),
|
| 98 |
+
current_user: CVUser = Depends(get_current_user),
|
| 99 |
+
):
|
| 100 |
+
try:
|
| 101 |
+
agentic_service = AgenticService(db=db,
|
| 102 |
+
user=current_user)
|
| 103 |
+
|
| 104 |
+
cv_weight = CVWeight(
|
| 105 |
+
criteria_id=criteria_id,
|
| 106 |
+
|
| 107 |
+
gpa_edu_1=weight.get("gpa_edu_1"),
|
| 108 |
+
gpa_edu_2=weight.get("gpa_edu_2"),
|
| 109 |
+
gpa_edu_3=weight.get("gpa_edu_3"),
|
| 110 |
+
|
| 111 |
+
univ_edu_1=weight.get("univ_edu_1"),
|
| 112 |
+
univ_edu_2=weight.get("univ_edu_2"),
|
| 113 |
+
univ_edu_3=weight.get("univ_edu_3"),
|
| 114 |
+
|
| 115 |
+
major_edu_1=weight.get("major_edu_1"),
|
| 116 |
+
major_edu_2=weight.get("major_edu_2"),
|
| 117 |
+
major_edu_3=weight.get("major_edu_3"),
|
| 118 |
+
|
| 119 |
+
domicile=weight.get("domicile"),
|
| 120 |
+
yoe=weight.get("yoe"),
|
| 121 |
+
|
| 122 |
+
hardskills=weight.get("hardskills"),
|
| 123 |
+
softskills=weight.get("softskills"),
|
| 124 |
+
certifications=weight.get("certifications"),
|
| 125 |
+
business_domain=weight.get("business_domain")
|
| 126 |
+
)
|
| 127 |
+
|
| 128 |
+
logger.info(f"cv_weight: {cv_weight}")
|
| 129 |
+
|
| 130 |
+
data = await agentic_service.weight.create_weight(weight=cv_weight)
|
| 131 |
+
return {
|
| 132 |
+
"status": "success",
|
| 133 |
+
"message": "Weight created successfully",
|
| 134 |
+
"criteria_id": data
|
| 135 |
+
}
|
| 136 |
+
except Exception as E:
|
| 137 |
+
logger.error(f"create weight error: {E}")
|
| 138 |
+
raise HTTPException(
|
| 139 |
+
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
|
| 140 |
+
detail=f"create weight error: {E}"
|
| 141 |
+
)
|
| 142 |
+
|
| 143 |
+
|
| 144 |
+
@router.post("/calculate_score")
|
| 145 |
+
async def calculate_score(
|
| 146 |
+
weight_id: str,
|
| 147 |
+
db=Depends(get_db),
|
| 148 |
+
current_user: CVUser = Depends(get_current_user),
|
| 149 |
+
):
|
| 150 |
+
# TODO: endpoint to calculate profile matching
|
| 151 |
+
pass
|
| 152 |
+
|
| 153 |
+
|
| 154 |
+
# @router.get("/get_profile_table")
|
| 155 |
+
# async def get_profile_table(
|
| 156 |
+
# limit: int,
|
| 157 |
+
# ):
|
| 158 |
+
# data = await get_all_cv_profiles(limit)
|
| 159 |
+
# return data
|
| 160 |
+
|
| 161 |
+
|
| 162 |
+
# @router.get("/get_profile_table_and_score")
|
| 163 |
+
# async def get_profile_table_and_score(
|
| 164 |
+
# criteria_id: str,
|
| 165 |
+
# profile_id: str,
|
| 166 |
+
# ):
|
| 167 |
+
# data = await get_cv_profile_with_scores(
|
| 168 |
+
# criteria_id=criteria_id,
|
| 169 |
+
# profile_id=profile_id,
|
| 170 |
+
# )
|
| 171 |
+
# return data
|
| 172 |
+
|
| 173 |
+
|
| 174 |
+
# @router.post("/match_one")
|
| 175 |
+
# async def profile_matching_one(
|
| 176 |
+
# payload: PayloadMatchOne,
|
| 177 |
+
# ):
|
| 178 |
+
# """
|
| 179 |
+
# Generate profile matching score between one profile and one criteria.
|
| 180 |
+
|
| 181 |
+
# Returns:
|
| 182 |
+
# status: str
|
| 183 |
+
# message: str
|
| 184 |
+
# data: DataResponseExtractOne
|
| 185 |
+
# """
|
| 186 |
+
# _start = time.time()
|
| 187 |
+
# try:
|
| 188 |
+
# agentic = Agent()
|
| 189 |
+
# response = await agentic.scoring_profile(input_scoring=payload)
|
| 190 |
+
# print(f"response match one profile:", response)
|
| 191 |
+
# _end = time.time() - _start
|
| 192 |
+
# logger.info(f"API runtime profile scoring: {_end}s")
|
| 193 |
+
|
| 194 |
+
# return response
|
| 195 |
+
# except Exception as E:
|
| 196 |
+
# logger.error(f"profile scoring error, {E}")
|
| 197 |
+
|
| 198 |
+
# _end = time.time() - _start
|
| 199 |
+
# logger.info(f"API runtime profile scoring: {_end}s")
|
| 200 |
+
|
| 201 |
+
# return ResponseMatchOne(
|
| 202 |
+
# status="failed",
|
| 203 |
+
# message=f"profile scoring error, {E}",
|
| 204 |
+
# data=DataResponseMatchOne(
|
| 205 |
+
# profile_id=payload.get("profile_id"),
|
| 206 |
+
# criteria_id=payload.get("criteria").get("criteria_id"),
|
| 207 |
+
# score=0
|
| 208 |
+
# )
|
| 209 |
+
# )
|
| 210 |
+
|
| 211 |
+
|
| 212 |
+
# @router.post("/match_bulk")
|
| 213 |
+
# async def profile_matching_bulk(
|
| 214 |
+
# payload: PayloadMatchBulk,
|
| 215 |
+
# ):
|
| 216 |
+
# """
|
| 217 |
+
# Generate profile matching score between many profiles and one criteria.
|
| 218 |
+
|
| 219 |
+
# Returns:
|
| 220 |
+
# status: str
|
| 221 |
+
# message: str
|
| 222 |
+
# data: DataResponseExtractOne
|
| 223 |
+
# """
|
| 224 |
+
# _start = time.time()
|
| 225 |
+
# try:
|
| 226 |
+
# agentic = Agent()
|
| 227 |
+
# response = await agentic.scoring_profile(input_scoring=payload)
|
| 228 |
+
# print(f"response match one profile:", response)
|
| 229 |
+
# _end = time.time() - _start
|
| 230 |
+
# logger.info(f"API runtime profile scoring: {_end}s")
|
| 231 |
+
|
| 232 |
+
# return response
|
| 233 |
+
# except Exception as E:
|
| 234 |
+
# logger.error(f"profile scoring error, {E}")
|
| 235 |
+
|
| 236 |
+
# _end = time.time() - _start
|
| 237 |
+
# logger.info(f"API runtime profile scoring: {_end}s")
|
| 238 |
+
|
| 239 |
+
# return ResponseMatchBulk(
|
| 240 |
+
# status="failed",
|
| 241 |
+
# message=f"profile scoring error, {E}",
|
| 242 |
+
# data=DataResponseMatchBulk(
|
| 243 |
+
# profile_id=payload.get("profile_id"),
|
| 244 |
+
# criteria_id=payload.get("criteria").get("criteria_id"),
|
| 245 |
+
# score=0
|
| 246 |
+
# )
|
| 247 |
+
# )
|
interfaces/api/deps.py
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from config.constant import SecurityConstants
|
| 2 |
+
from externals.databases.pg_crud import get_user_by_id
|
| 3 |
+
from externals.databases.database import get_db
|
| 4 |
+
from fastapi import Depends, HTTPException, status
|
| 5 |
+
from fastapi.security import OAuth2PasswordBearer
|
| 6 |
+
from jose import jwt, JWTError
|
| 7 |
+
from sqlalchemy.ext.asyncio import AsyncSession
|
| 8 |
+
|
| 9 |
+
|
| 10 |
+
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="/admin/login")
|
| 11 |
+
|
| 12 |
+
|
| 13 |
+
async def get_current_user(
|
| 14 |
+
token: str = Depends(oauth2_scheme),
|
| 15 |
+
db: AsyncSession = Depends(get_db),
|
| 16 |
+
):
|
| 17 |
+
credentials_exception = HTTPException(
|
| 18 |
+
status_code=status.HTTP_401_UNAUTHORIZED,
|
| 19 |
+
detail="Could not validate credentials",
|
| 20 |
+
headers={"WWW-Authenticate": "Bearer"},
|
| 21 |
+
)
|
| 22 |
+
|
| 23 |
+
try:
|
| 24 |
+
payload = jwt.decode(
|
| 25 |
+
token,
|
| 26 |
+
SecurityConstants.JWT_SECRET_KEY,
|
| 27 |
+
algorithms=[SecurityConstants.JWT_ALGORITHM],
|
| 28 |
+
)
|
| 29 |
+
user_id: str | None = payload.get("sub")
|
| 30 |
+
if user_id is None:
|
| 31 |
+
raise credentials_exception
|
| 32 |
+
|
| 33 |
+
except JWTError:
|
| 34 |
+
raise credentials_exception
|
| 35 |
+
|
| 36 |
+
user = await get_user_by_id(db, user_id)
|
| 37 |
+
if not user:
|
| 38 |
+
raise credentials_exception
|
| 39 |
+
|
| 40 |
+
return user
|
interfaces/api/file.py
ADDED
|
@@ -0,0 +1,107 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from externals.databases.database import get_db
|
| 2 |
+
from fastapi import APIRouter, UploadFile, File, Depends, status, HTTPException
|
| 3 |
+
from interfaces.api.deps import get_current_user
|
| 4 |
+
from services.knowledge.knowledge_setup import KnowledgeService
|
| 5 |
+
from typing import List
|
| 6 |
+
from utils.logger import get_logger
|
| 7 |
+
|
| 8 |
+
|
| 9 |
+
logger = get_logger("File API")
|
| 10 |
+
|
| 11 |
+
router = APIRouter(
|
| 12 |
+
prefix="/file",
|
| 13 |
+
tags=["File"],
|
| 14 |
+
)
|
| 15 |
+
|
| 16 |
+
|
| 17 |
+
@router.post(
|
| 18 |
+
"/upload",
|
| 19 |
+
status_code=status.HTTP_201_CREATED,
|
| 20 |
+
summary="Upload multiple PDF knowledge files",
|
| 21 |
+
)
|
| 22 |
+
async def upload_knowledge_many(
|
| 23 |
+
files: List[UploadFile] = File(...),
|
| 24 |
+
db=Depends(get_db),
|
| 25 |
+
current_user=Depends(get_current_user),
|
| 26 |
+
):
|
| 27 |
+
"""
|
| 28 |
+
Upload multiple PDF files to Azure Blob Storage and log metadata.
|
| 29 |
+
"""
|
| 30 |
+
|
| 31 |
+
knowledge_service = KnowledgeService(
|
| 32 |
+
db=db,
|
| 33 |
+
user=current_user,
|
| 34 |
+
)
|
| 35 |
+
|
| 36 |
+
results = []
|
| 37 |
+
for file in files:
|
| 38 |
+
if file.content_type != "application/pdf":
|
| 39 |
+
raise HTTPException(
|
| 40 |
+
status_code=status.HTTP_400_BAD_REQUEST,
|
| 41 |
+
detail=f"File '{file.filename}' is not a PDF",
|
| 42 |
+
)
|
| 43 |
+
else:
|
| 44 |
+
result = await knowledge_service.file.upload(file)
|
| 45 |
+
results.append(result)
|
| 46 |
+
|
| 47 |
+
return {
|
| 48 |
+
"message": "Upload completed",
|
| 49 |
+
"uploaded_by": current_user.email,
|
| 50 |
+
"files": results,
|
| 51 |
+
}
|
| 52 |
+
|
| 53 |
+
@router.get(
|
| 54 |
+
"/{user_id}",
|
| 55 |
+
status_code=status.HTTP_200_OK,
|
| 56 |
+
summary="Get file metadata by user ID",
|
| 57 |
+
)
|
| 58 |
+
async def get_file_metadata_by_user(
|
| 59 |
+
user_id: str,
|
| 60 |
+
db=Depends(get_db),
|
| 61 |
+
current_user=Depends(get_current_user),
|
| 62 |
+
):
|
| 63 |
+
"""
|
| 64 |
+
Retrieve all file metadata uploaded by a specific user.
|
| 65 |
+
"""
|
| 66 |
+
|
| 67 |
+
knowledge_service = KnowledgeService(
|
| 68 |
+
db=db,
|
| 69 |
+
user=current_user,
|
| 70 |
+
)
|
| 71 |
+
|
| 72 |
+
files = await knowledge_service.file.get_files_by_user(user_id)
|
| 73 |
+
|
| 74 |
+
return {
|
| 75 |
+
"message": "File metadata retrieved successfully",
|
| 76 |
+
"requested_by": current_user.email,
|
| 77 |
+
"files": files,
|
| 78 |
+
}
|
| 79 |
+
|
| 80 |
+
|
| 81 |
+
@router.delete(
|
| 82 |
+
"/{filename}",
|
| 83 |
+
status_code=status.HTTP_200_OK,
|
| 84 |
+
summary="Delete knowledge file by filename",
|
| 85 |
+
)
|
| 86 |
+
async def delete_knowledge_file(
|
| 87 |
+
filename: str,
|
| 88 |
+
db=Depends(get_db),
|
| 89 |
+
current_user=Depends(get_current_user),
|
| 90 |
+
):
|
| 91 |
+
"""
|
| 92 |
+
Delete a PDF knowledge file from Azure Blob and database.
|
| 93 |
+
"""
|
| 94 |
+
|
| 95 |
+
knowledge_service = KnowledgeService(
|
| 96 |
+
db=db,
|
| 97 |
+
user=current_user,
|
| 98 |
+
)
|
| 99 |
+
|
| 100 |
+
await knowledge_service.delete.delete(filename)
|
| 101 |
+
|
| 102 |
+
return {
|
| 103 |
+
"message": "File deleted successfully",
|
| 104 |
+
"filename": filename,
|
| 105 |
+
"deleted_by": current_user.email,
|
| 106 |
+
}
|
| 107 |
+
|
interfaces/api/profile.py
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from externals.databases.pg_models import CVUser
|
| 2 |
+
from externals.databases.database import get_db
|
| 3 |
+
from fastapi import APIRouter, Depends, status, HTTPException
|
| 4 |
+
from interfaces.api.deps import get_current_user
|
| 5 |
+
from services.knowledge.knowledge_setup import KnowledgeService
|
| 6 |
+
from utils.logger import get_logger
|
| 7 |
+
|
| 8 |
+
|
| 9 |
+
logger = get_logger("Profile API")
|
| 10 |
+
|
| 11 |
+
router = APIRouter(
|
| 12 |
+
prefix="/profile",
|
| 13 |
+
tags=["Profile"],
|
| 14 |
+
)
|
| 15 |
+
|
| 16 |
+
@router.post("/extract_profile")
|
| 17 |
+
async def extract_profile(
|
| 18 |
+
filename: str,
|
| 19 |
+
db=Depends(get_db),
|
| 20 |
+
current_user: CVUser = Depends(get_current_user),
|
| 21 |
+
):
|
| 22 |
+
"""
|
| 23 |
+
Extract structured profile from CV PDF
|
| 24 |
+
"""
|
| 25 |
+
|
| 26 |
+
knowledge_service = KnowledgeService(
|
| 27 |
+
db=db,
|
| 28 |
+
user=current_user,
|
| 29 |
+
)
|
| 30 |
+
|
| 31 |
+
return await knowledge_service.extract.extract(filename)
|
| 32 |
+
|
| 33 |
+
|
| 34 |
+
|
| 35 |
+
@router.get("/{profile_id}")
|
| 36 |
+
async def get_profile(
|
| 37 |
+
profile_id: str,
|
| 38 |
+
current_user: CVUser = Depends(get_current_user),
|
| 39 |
+
):
|
| 40 |
+
"""
|
| 41 |
+
Get extracted profile by ID
|
| 42 |
+
"""
|
| 43 |
+
knowledge_service = KnowledgeService(user=current_user)
|
| 44 |
+
|
| 45 |
+
profile = await knowledge_service.profile.get_profile(profile_id)
|
| 46 |
+
|
| 47 |
+
if not profile:
|
| 48 |
+
raise HTTPException(
|
| 49 |
+
status_code=status.HTTP_404_NOT_FOUND,
|
| 50 |
+
detail="Profile not found",
|
| 51 |
+
)
|
| 52 |
+
|
| 53 |
+
# 🔒 Tenant isolation (IMPORTANT)
|
| 54 |
+
if profile.tenant_id != current_user.tenant_id:
|
| 55 |
+
raise HTTPException(
|
| 56 |
+
status_code=status.HTTP_403_FORBIDDEN,
|
| 57 |
+
detail="Not authorized to access this profile",
|
| 58 |
+
)
|
| 59 |
+
|
| 60 |
+
return profile
|
| 61 |
+
|
| 62 |
+
|
interfaces/api/tenant.py
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from externals.databases.database import get_db
|
| 2 |
+
from externals.databases.pg_crud import (
|
| 3 |
+
get_tenant_by_name,
|
| 4 |
+
create_tenant,
|
| 5 |
+
)
|
| 6 |
+
from externals.databases.schemas.tenant import TenantCreate, TenantResponse
|
| 7 |
+
from fastapi import APIRouter, Depends, HTTPException, status
|
| 8 |
+
from sqlalchemy.ext.asyncio import AsyncSession
|
| 9 |
+
from utils.logger import get_logger
|
| 10 |
+
|
| 11 |
+
|
| 12 |
+
logger = get_logger("tenant management")
|
| 13 |
+
router = APIRouter(prefix="/admin", tags=["Tenant"])
|
| 14 |
+
|
| 15 |
+
|
| 16 |
+
# CREATE TENANT
|
| 17 |
+
@router.post(
|
| 18 |
+
"/tenants",
|
| 19 |
+
status_code=status.HTTP_201_CREATED,
|
| 20 |
+
response_model=TenantResponse,
|
| 21 |
+
)
|
| 22 |
+
async def create_tenant_endpoint(
|
| 23 |
+
tenant: TenantCreate,
|
| 24 |
+
db: AsyncSession = Depends(get_db),
|
| 25 |
+
):
|
| 26 |
+
logger.info("Create tenant request", extra={"tenant_name": tenant.tenant_name})
|
| 27 |
+
|
| 28 |
+
existing = await get_tenant_by_name(db, tenant.tenant_name)
|
| 29 |
+
if existing:
|
| 30 |
+
raise HTTPException(
|
| 31 |
+
status_code=status.HTTP_409_CONFLICT,
|
| 32 |
+
detail="Tenant already exists",
|
| 33 |
+
)
|
| 34 |
+
|
| 35 |
+
created = await create_tenant(db, tenant)
|
| 36 |
+
return created
|
| 37 |
+
|
| 38 |
+
|
| 39 |
+
# GET TENANT BY NAME
|
| 40 |
+
@router.get(
|
| 41 |
+
"/tenants/{tenant_name}",
|
| 42 |
+
response_model=TenantResponse,
|
| 43 |
+
)
|
| 44 |
+
async def get_tenant_endpoint(
|
| 45 |
+
tenant_name: str,
|
| 46 |
+
db: AsyncSession = Depends(get_db),
|
| 47 |
+
):
|
| 48 |
+
logger.info("Get tenant request", extra={"tenant_name": tenant_name})
|
| 49 |
+
|
| 50 |
+
tenant = await get_tenant_by_name(db, tenant_name)
|
| 51 |
+
if not tenant:
|
| 52 |
+
raise HTTPException(
|
| 53 |
+
status_code=status.HTTP_404_NOT_FOUND,
|
| 54 |
+
detail="Tenant not found",
|
| 55 |
+
)
|
| 56 |
+
|
| 57 |
+
return tenant
|
interfaces/api/user.py
ADDED
|
@@ -0,0 +1,104 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from externals.databases.database import get_db
|
| 2 |
+
from externals.databases.pg_crud import (
|
| 3 |
+
get_user_by_username,
|
| 4 |
+
create_user,
|
| 5 |
+
get_user_by_email,
|
| 6 |
+
# deactivate_user,
|
| 7 |
+
# get_tenant_by_name,
|
| 8 |
+
# create_tenant,
|
| 9 |
+
)
|
| 10 |
+
from externals.databases.schemas.user import UserCreate, UserResponse
|
| 11 |
+
from externals.databases.schemas.auth import LoginRequest, TokenResponse
|
| 12 |
+
from fastapi import APIRouter, Depends, HTTPException, status
|
| 13 |
+
from fastapi.security import OAuth2PasswordRequestForm
|
| 14 |
+
from sqlalchemy.ext.asyncio import AsyncSession
|
| 15 |
+
from utils.logger import get_logger
|
| 16 |
+
from utils.security import verify_password
|
| 17 |
+
from utils.jwt import create_access_token
|
| 18 |
+
|
| 19 |
+
|
| 20 |
+
logger = get_logger("user management")
|
| 21 |
+
router = APIRouter(prefix="/admin", tags=["User"])
|
| 22 |
+
|
| 23 |
+
|
| 24 |
+
|
| 25 |
+
@router.post(
|
| 26 |
+
"/users",
|
| 27 |
+
status_code=status.HTTP_201_CREATED,
|
| 28 |
+
response_model=UserResponse,
|
| 29 |
+
)
|
| 30 |
+
async def create_user_endpoint(
|
| 31 |
+
user: UserCreate,
|
| 32 |
+
db: AsyncSession = Depends(get_db),
|
| 33 |
+
):
|
| 34 |
+
logger.info("Create user request", extra={"username": user.username})
|
| 35 |
+
|
| 36 |
+
existing = await get_user_by_username(db, user.username)
|
| 37 |
+
if existing:
|
| 38 |
+
raise HTTPException(
|
| 39 |
+
status_code=status.HTTP_409_CONFLICT,
|
| 40 |
+
detail="Username already exists",
|
| 41 |
+
)
|
| 42 |
+
|
| 43 |
+
return await create_user(db, user)
|
| 44 |
+
|
| 45 |
+
|
| 46 |
+
|
| 47 |
+
# @router.get(
|
| 48 |
+
# "/users/{username}",
|
| 49 |
+
# response_model=UserResponse,
|
| 50 |
+
# )
|
| 51 |
+
# async def get_user_endpoint(
|
| 52 |
+
# username: str,
|
| 53 |
+
# db: AsyncSession = Depends(get_db),
|
| 54 |
+
# ):
|
| 55 |
+
# logger.info("Get user request", extra={"username": username})
|
| 56 |
+
|
| 57 |
+
# user = await get_user_by_username(db, username)
|
| 58 |
+
# if not user:
|
| 59 |
+
# raise HTTPException(
|
| 60 |
+
# status_code=status.HTTP_404_NOT_FOUND,
|
| 61 |
+
# detail="User not found",
|
| 62 |
+
# )
|
| 63 |
+
|
| 64 |
+
# return user
|
| 65 |
+
|
| 66 |
+
|
| 67 |
+
@router.post("/login", response_model=TokenResponse)
|
| 68 |
+
async def login(
|
| 69 |
+
form_data: OAuth2PasswordRequestForm = Depends(),
|
| 70 |
+
db: AsyncSession = Depends(get_db),
|
| 71 |
+
):
|
| 72 |
+
user = await get_user_by_email(db, form_data.username)
|
| 73 |
+
|
| 74 |
+
if not user or not verify_password(form_data.password, user.hashed_password):
|
| 75 |
+
raise HTTPException(
|
| 76 |
+
status_code=status.HTTP_401_UNAUTHORIZED,
|
| 77 |
+
detail="Invalid email or password",
|
| 78 |
+
)
|
| 79 |
+
|
| 80 |
+
token = create_access_token(
|
| 81 |
+
data={
|
| 82 |
+
"sub": str(user.user_id),
|
| 83 |
+
"email": user.email,
|
| 84 |
+
"role": user.role,
|
| 85 |
+
"full_name": user.full_name,
|
| 86 |
+
}
|
| 87 |
+
)
|
| 88 |
+
|
| 89 |
+
return TokenResponse(access_token=token)
|
| 90 |
+
|
| 91 |
+
|
| 92 |
+
|
| 93 |
+
from interfaces.api.deps import get_current_user
|
| 94 |
+
|
| 95 |
+
@router.get("/me", response_model=UserResponse)
|
| 96 |
+
async def get_me(
|
| 97 |
+
current_user: UserResponse = Depends(get_current_user),
|
| 98 |
+
):
|
| 99 |
+
logger.info(
|
| 100 |
+
"Get current user",
|
| 101 |
+
extra={"user_id": current_user.user_id},
|
| 102 |
+
)
|
| 103 |
+
|
| 104 |
+
return current_user
|
interfaces/auth/auth.py
ADDED
|
File without changes
|
interfaces/handlers/agentic_handlers.py
ADDED
|
File without changes
|
interfaces/handlers/handlers.py
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
|
|
|
|
|
|
|
| 1 |
+
|
| 2 |
+
|
interfaces/handlers/knowledge_handlers.py
ADDED
|
File without changes
|
interfaces/middlewares/cors.py
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from fastapi.middleware.cors import CORSMiddleware
|
| 2 |
+
|
| 3 |
+
cors_context = {"middleware_class":CORSMiddleware,
|
| 4 |
+
"allow_origins": ["*"],
|
| 5 |
+
"allow_credentials": True,
|
| 6 |
+
"allow_methods": ["*"],
|
| 7 |
+
"allow_headers": ["*"]
|
| 8 |
+
}
|
main.py
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from interfaces.middlewares.cors import cors_context
|
| 2 |
+
from interfaces.api.user import router as router_user
|
| 3 |
+
from interfaces.api.tenant import router as router_tenant
|
| 4 |
+
from interfaces.api.file import router as router_file
|
| 5 |
+
from interfaces.api.profile import router as router_profile
|
| 6 |
+
from interfaces.api.agentic import router as router_agentic
|
| 7 |
+
from fastapi import FastAPI
|
| 8 |
+
from fastapi.responses import JSONResponse
|
| 9 |
+
|
| 10 |
+
|
| 11 |
+
# ====================== APP ======================
|
| 12 |
+
app = FastAPI(
|
| 13 |
+
title="Candidate Explorer Service",
|
| 14 |
+
description="Candidate Explorer Service",
|
| 15 |
+
docs_url="/docs",
|
| 16 |
+
root_path="/"
|
| 17 |
+
)
|
| 18 |
+
app.add_middleware(**cors_context)
|
| 19 |
+
|
| 20 |
+
# ====================== ROUTES ======================
|
| 21 |
+
app.include_router(router_tenant)
|
| 22 |
+
app.include_router(router_user)
|
| 23 |
+
app.include_router(router_file)
|
| 24 |
+
app.include_router(router_profile)
|
| 25 |
+
app.include_router(router_agentic)
|
| 26 |
+
|
| 27 |
+
|
| 28 |
+
# ====================== HEALTHCHECK & INFO ======================
|
| 29 |
+
@app.get("/health/ready")
|
| 30 |
+
def health_ready():
|
| 31 |
+
return JSONResponse(content="Ready", status_code=200)
|
| 32 |
+
|
| 33 |
+
@app.get("/health/live")
|
| 34 |
+
def health_live():
|
| 35 |
+
return JSONResponse(content="Live", status_code=200)
|
| 36 |
+
|
| 37 |
+
@app.get("/info")
|
| 38 |
+
async def info_endpoint():
|
| 39 |
+
return {"agentId": "candidate-explorer-agent", "status":"Online", "description": "agent candidate explorer!"}
|
models/security.py
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from pydantic import BaseModel
|
| 2 |
+
|
| 3 |
+
class TokenRequest(BaseModel):
|
| 4 |
+
username: str
|
| 5 |
+
password: str
|
| 6 |
+
|
| 7 |
+
class TokenResponse(BaseModel):
|
| 8 |
+
access_token: str
|
| 9 |
+
token_type: str = "bearer"
|
| 10 |
+
expires_in: int
|
playground/playground.py
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import requests
|
| 2 |
+
|
| 3 |
+
url = "https://api.typeform.com/responses/files/9223d2c317a66c9e7b0cfe2514d9f622c2be0568164be3fa7eb6e0a148a2b5f0/CV_Abdurahman_Wal_Ikram.pdf"
|
| 4 |
+
|
| 5 |
+
res = requests.get(url=url)
|
| 6 |
+
|
| 7 |
+
type(res.content)
|
pyproject.toml
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
[project]
|
| 2 |
+
name = "service.explorer.backend"
|
| 3 |
+
version = "0.1.0"
|
| 4 |
+
description = "Add your description here"
|
| 5 |
+
readme = "README.md"
|
| 6 |
+
requires-python = ">=3.13"
|
| 7 |
+
dependencies = [
|
| 8 |
+
"aiohttp>=3.13.2",
|
| 9 |
+
"asyncpg>=0.31.0",
|
| 10 |
+
"azure-identity>=1.25.1",
|
| 11 |
+
"azure-storage-blob>=12.20.0",
|
| 12 |
+
"bcrypt==3.2.2",
|
| 13 |
+
"dotenv>=0.9.9",
|
| 14 |
+
"fastapi[standard]>=0.127.0",
|
| 15 |
+
"frontend>=0.0.3",
|
| 16 |
+
"langchain>=1.2.0",
|
| 17 |
+
"langchain-openai>=1.1.6",
|
| 18 |
+
"langfuse==2.33.0",
|
| 19 |
+
"pandas>=2.3.3",
|
| 20 |
+
"passlib==1.7.4",
|
| 21 |
+
"pdf2image>=1.17.0",
|
| 22 |
+
"psycopg2>=2.9.11",
|
| 23 |
+
"pymupdf>=1.26.7",
|
| 24 |
+
"pypdf>=6.5.0",
|
| 25 |
+
"pypdf2>=3.0.1",
|
| 26 |
+
"pytesseract>=0.3.13",
|
| 27 |
+
"python-jose[cryptography]>=3.5.0",
|
| 28 |
+
"pytz>=2025.2",
|
| 29 |
+
"sqlalchemy>=2.0.45",
|
| 30 |
+
"uvicorn>=0.40.0",
|
| 31 |
+
]
|
requirements.txt
ADDED
|
@@ -0,0 +1,356 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# This file was autogenerated by uv via the following command:
|
| 2 |
+
# uv pip compile pyproject.toml -o requirements.txt
|
| 3 |
+
aiofiles==25.1.0
|
| 4 |
+
# via frontend
|
| 5 |
+
aiohappyeyeballs==2.6.1
|
| 6 |
+
# via aiohttp
|
| 7 |
+
aiohttp==3.13.3
|
| 8 |
+
# via service-explorer-backend (pyproject.toml)
|
| 9 |
+
aiosignal==1.4.0
|
| 10 |
+
# via aiohttp
|
| 11 |
+
annotated-doc==0.0.4
|
| 12 |
+
# via
|
| 13 |
+
# fastapi
|
| 14 |
+
# typer
|
| 15 |
+
annotated-types==0.7.0
|
| 16 |
+
# via pydantic
|
| 17 |
+
anyio==4.12.1
|
| 18 |
+
# via
|
| 19 |
+
# httpx
|
| 20 |
+
# openai
|
| 21 |
+
# starlette
|
| 22 |
+
# watchfiles
|
| 23 |
+
asyncpg==0.31.0
|
| 24 |
+
# via service-explorer-backend (pyproject.toml)
|
| 25 |
+
attrs==25.4.0
|
| 26 |
+
# via aiohttp
|
| 27 |
+
azure-core==1.38.2
|
| 28 |
+
# via
|
| 29 |
+
# azure-identity
|
| 30 |
+
# azure-storage-blob
|
| 31 |
+
azure-identity==1.25.2
|
| 32 |
+
# via service-explorer-backend (pyproject.toml)
|
| 33 |
+
azure-storage-blob==12.28.0
|
| 34 |
+
# via service-explorer-backend (pyproject.toml)
|
| 35 |
+
backoff==2.2.1
|
| 36 |
+
# via langfuse
|
| 37 |
+
bcrypt==3.2.2
|
| 38 |
+
# via service-explorer-backend (pyproject.toml)
|
| 39 |
+
certifi==2026.1.4
|
| 40 |
+
# via
|
| 41 |
+
# httpcore
|
| 42 |
+
# httpx
|
| 43 |
+
# requests
|
| 44 |
+
# sentry-sdk
|
| 45 |
+
cffi==2.0.0
|
| 46 |
+
# via
|
| 47 |
+
# bcrypt
|
| 48 |
+
# cryptography
|
| 49 |
+
charset-normalizer==3.4.4
|
| 50 |
+
# via requests
|
| 51 |
+
click==8.3.1
|
| 52 |
+
# via
|
| 53 |
+
# rich-toolkit
|
| 54 |
+
# typer
|
| 55 |
+
# uvicorn
|
| 56 |
+
colorama==0.4.6
|
| 57 |
+
# via
|
| 58 |
+
# click
|
| 59 |
+
# tqdm
|
| 60 |
+
# uvicorn
|
| 61 |
+
cryptography==46.0.5
|
| 62 |
+
# via
|
| 63 |
+
# azure-identity
|
| 64 |
+
# azure-storage-blob
|
| 65 |
+
# msal
|
| 66 |
+
# pyjwt
|
| 67 |
+
# python-jose
|
| 68 |
+
distro==1.9.0
|
| 69 |
+
# via openai
|
| 70 |
+
dnspython==2.8.0
|
| 71 |
+
# via email-validator
|
| 72 |
+
dotenv==0.9.9
|
| 73 |
+
# via service-explorer-backend (pyproject.toml)
|
| 74 |
+
ecdsa==0.19.1
|
| 75 |
+
# via python-jose
|
| 76 |
+
email-validator==2.3.0
|
| 77 |
+
# via
|
| 78 |
+
# fastapi
|
| 79 |
+
# pydantic
|
| 80 |
+
fastapi==0.129.0
|
| 81 |
+
# via service-explorer-backend (pyproject.toml)
|
| 82 |
+
fastapi-cli==0.0.23
|
| 83 |
+
# via fastapi
|
| 84 |
+
fastapi-cloud-cli==0.13.0
|
| 85 |
+
# via fastapi-cli
|
| 86 |
+
fastar==0.8.0
|
| 87 |
+
# via fastapi-cloud-cli
|
| 88 |
+
frontend==0.0.3
|
| 89 |
+
# via service-explorer-backend (pyproject.toml)
|
| 90 |
+
frozenlist==1.8.0
|
| 91 |
+
# via
|
| 92 |
+
# aiohttp
|
| 93 |
+
# aiosignal
|
| 94 |
+
greenlet==3.3.1
|
| 95 |
+
# via sqlalchemy
|
| 96 |
+
h11==0.16.0
|
| 97 |
+
# via
|
| 98 |
+
# httpcore
|
| 99 |
+
# uvicorn
|
| 100 |
+
httpcore==1.0.9
|
| 101 |
+
# via httpx
|
| 102 |
+
httptools==0.7.1
|
| 103 |
+
# via uvicorn
|
| 104 |
+
httpx==0.28.1
|
| 105 |
+
# via
|
| 106 |
+
# fastapi
|
| 107 |
+
# fastapi-cloud-cli
|
| 108 |
+
# langfuse
|
| 109 |
+
# langgraph-sdk
|
| 110 |
+
# langsmith
|
| 111 |
+
# openai
|
| 112 |
+
idna==3.11
|
| 113 |
+
# via
|
| 114 |
+
# anyio
|
| 115 |
+
# email-validator
|
| 116 |
+
# httpx
|
| 117 |
+
# langfuse
|
| 118 |
+
# requests
|
| 119 |
+
# yarl
|
| 120 |
+
isodate==0.7.2
|
| 121 |
+
# via azure-storage-blob
|
| 122 |
+
itsdangerous==2.2.0
|
| 123 |
+
# via frontend
|
| 124 |
+
jinja2==3.1.6
|
| 125 |
+
# via fastapi
|
| 126 |
+
jiter==0.13.0
|
| 127 |
+
# via openai
|
| 128 |
+
jsonpatch==1.33
|
| 129 |
+
# via langchain-core
|
| 130 |
+
jsonpointer==3.0.0
|
| 131 |
+
# via jsonpatch
|
| 132 |
+
langchain==1.2.10
|
| 133 |
+
# via service-explorer-backend (pyproject.toml)
|
| 134 |
+
langchain-core==1.2.14
|
| 135 |
+
# via
|
| 136 |
+
# langchain
|
| 137 |
+
# langchain-openai
|
| 138 |
+
# langgraph
|
| 139 |
+
# langgraph-checkpoint
|
| 140 |
+
# langgraph-prebuilt
|
| 141 |
+
langchain-openai==1.1.10
|
| 142 |
+
# via service-explorer-backend (pyproject.toml)
|
| 143 |
+
langfuse==2.33.0
|
| 144 |
+
# via service-explorer-backend (pyproject.toml)
|
| 145 |
+
langgraph==1.0.9
|
| 146 |
+
# via langchain
|
| 147 |
+
langgraph-checkpoint==4.0.0
|
| 148 |
+
# via
|
| 149 |
+
# langgraph
|
| 150 |
+
# langgraph-prebuilt
|
| 151 |
+
langgraph-prebuilt==1.0.8
|
| 152 |
+
# via langgraph
|
| 153 |
+
langgraph-sdk==0.3.8
|
| 154 |
+
# via langgraph
|
| 155 |
+
langsmith==0.7.5
|
| 156 |
+
# via langchain-core
|
| 157 |
+
markdown-it-py==4.0.0
|
| 158 |
+
# via rich
|
| 159 |
+
markupsafe==3.0.3
|
| 160 |
+
# via jinja2
|
| 161 |
+
mdurl==0.1.2
|
| 162 |
+
# via markdown-it-py
|
| 163 |
+
msal==1.34.0
|
| 164 |
+
# via
|
| 165 |
+
# azure-identity
|
| 166 |
+
# msal-extensions
|
| 167 |
+
msal-extensions==1.3.1
|
| 168 |
+
# via azure-identity
|
| 169 |
+
multidict==6.7.1
|
| 170 |
+
# via
|
| 171 |
+
# aiohttp
|
| 172 |
+
# yarl
|
| 173 |
+
numpy==2.4.2
|
| 174 |
+
# via pandas
|
| 175 |
+
openai==2.21.0
|
| 176 |
+
# via langchain-openai
|
| 177 |
+
orjson==3.11.7
|
| 178 |
+
# via
|
| 179 |
+
# langgraph-sdk
|
| 180 |
+
# langsmith
|
| 181 |
+
ormsgpack==1.12.2
|
| 182 |
+
# via langgraph-checkpoint
|
| 183 |
+
packaging==23.2
|
| 184 |
+
# via
|
| 185 |
+
# langchain-core
|
| 186 |
+
# langfuse
|
| 187 |
+
# langsmith
|
| 188 |
+
# pytesseract
|
| 189 |
+
pandas==3.0.1
|
| 190 |
+
# via service-explorer-backend (pyproject.toml)
|
| 191 |
+
passlib==1.7.4
|
| 192 |
+
# via service-explorer-backend (pyproject.toml)
|
| 193 |
+
pdf2image==1.17.0
|
| 194 |
+
# via service-explorer-backend (pyproject.toml)
|
| 195 |
+
pillow==12.1.1
|
| 196 |
+
# via
|
| 197 |
+
# pdf2image
|
| 198 |
+
# pytesseract
|
| 199 |
+
propcache==0.4.1
|
| 200 |
+
# via
|
| 201 |
+
# aiohttp
|
| 202 |
+
# yarl
|
| 203 |
+
psycopg2==2.9.11
|
| 204 |
+
# via service-explorer-backend (pyproject.toml)
|
| 205 |
+
pyasn1==0.6.2
|
| 206 |
+
# via
|
| 207 |
+
# python-jose
|
| 208 |
+
# rsa
|
| 209 |
+
pycparser==3.0
|
| 210 |
+
# via cffi
|
| 211 |
+
pydantic==2.12.5
|
| 212 |
+
# via
|
| 213 |
+
# fastapi
|
| 214 |
+
# fastapi-cloud-cli
|
| 215 |
+
# langchain
|
| 216 |
+
# langchain-core
|
| 217 |
+
# langfuse
|
| 218 |
+
# langgraph
|
| 219 |
+
# langsmith
|
| 220 |
+
# openai
|
| 221 |
+
# pydantic-extra-types
|
| 222 |
+
# pydantic-settings
|
| 223 |
+
pydantic-core==2.41.5
|
| 224 |
+
# via pydantic
|
| 225 |
+
pydantic-extra-types==2.11.0
|
| 226 |
+
# via fastapi
|
| 227 |
+
pydantic-settings==2.13.1
|
| 228 |
+
# via fastapi
|
| 229 |
+
pygments==2.19.2
|
| 230 |
+
# via rich
|
| 231 |
+
pyjwt==2.11.0
|
| 232 |
+
# via msal
|
| 233 |
+
pymupdf==1.27.1
|
| 234 |
+
# via service-explorer-backend (pyproject.toml)
|
| 235 |
+
pypdf==6.7.1
|
| 236 |
+
# via service-explorer-backend (pyproject.toml)
|
| 237 |
+
pypdf2==3.0.1
|
| 238 |
+
# via service-explorer-backend (pyproject.toml)
|
| 239 |
+
pytesseract==0.3.13
|
| 240 |
+
# via service-explorer-backend (pyproject.toml)
|
| 241 |
+
python-dateutil==2.9.0.post0
|
| 242 |
+
# via pandas
|
| 243 |
+
python-dotenv==1.2.1
|
| 244 |
+
# via
|
| 245 |
+
# dotenv
|
| 246 |
+
# pydantic-settings
|
| 247 |
+
# uvicorn
|
| 248 |
+
python-jose==3.5.0
|
| 249 |
+
# via service-explorer-backend (pyproject.toml)
|
| 250 |
+
python-multipart==0.0.22
|
| 251 |
+
# via fastapi
|
| 252 |
+
pytz==2025.2
|
| 253 |
+
# via service-explorer-backend (pyproject.toml)
|
| 254 |
+
pyyaml==6.0.3
|
| 255 |
+
# via
|
| 256 |
+
# langchain-core
|
| 257 |
+
# uvicorn
|
| 258 |
+
regex==2026.2.19
|
| 259 |
+
# via tiktoken
|
| 260 |
+
requests==2.32.5
|
| 261 |
+
# via
|
| 262 |
+
# azure-core
|
| 263 |
+
# langsmith
|
| 264 |
+
# msal
|
| 265 |
+
# requests-toolbelt
|
| 266 |
+
# tiktoken
|
| 267 |
+
requests-toolbelt==1.0.0
|
| 268 |
+
# via langsmith
|
| 269 |
+
rich==14.3.3
|
| 270 |
+
# via
|
| 271 |
+
# rich-toolkit
|
| 272 |
+
# typer
|
| 273 |
+
rich-toolkit==0.19.4
|
| 274 |
+
# via
|
| 275 |
+
# fastapi-cli
|
| 276 |
+
# fastapi-cloud-cli
|
| 277 |
+
rignore==0.7.6
|
| 278 |
+
# via fastapi-cloud-cli
|
| 279 |
+
rsa==4.9.1
|
| 280 |
+
# via python-jose
|
| 281 |
+
sentry-sdk==2.53.0
|
| 282 |
+
# via fastapi-cloud-cli
|
| 283 |
+
shellingham==1.5.4
|
| 284 |
+
# via typer
|
| 285 |
+
six==1.17.0
|
| 286 |
+
# via
|
| 287 |
+
# ecdsa
|
| 288 |
+
# python-dateutil
|
| 289 |
+
sniffio==1.3.1
|
| 290 |
+
# via openai
|
| 291 |
+
sqlalchemy==2.0.46
|
| 292 |
+
# via service-explorer-backend (pyproject.toml)
|
| 293 |
+
starlette==0.52.1
|
| 294 |
+
# via
|
| 295 |
+
# fastapi
|
| 296 |
+
# frontend
|
| 297 |
+
tenacity==9.1.4
|
| 298 |
+
# via langchain-core
|
| 299 |
+
tiktoken==0.12.0
|
| 300 |
+
# via langchain-openai
|
| 301 |
+
tqdm==4.67.3
|
| 302 |
+
# via openai
|
| 303 |
+
typer==0.24.0
|
| 304 |
+
# via
|
| 305 |
+
# fastapi-cli
|
| 306 |
+
# fastapi-cloud-cli
|
| 307 |
+
typing-extensions==4.15.0
|
| 308 |
+
# via
|
| 309 |
+
# azure-core
|
| 310 |
+
# azure-identity
|
| 311 |
+
# azure-storage-blob
|
| 312 |
+
# fastapi
|
| 313 |
+
# langchain-core
|
| 314 |
+
# openai
|
| 315 |
+
# pydantic
|
| 316 |
+
# pydantic-core
|
| 317 |
+
# pydantic-extra-types
|
| 318 |
+
# rich-toolkit
|
| 319 |
+
# sqlalchemy
|
| 320 |
+
# typing-inspection
|
| 321 |
+
typing-inspection==0.4.2
|
| 322 |
+
# via
|
| 323 |
+
# fastapi
|
| 324 |
+
# pydantic
|
| 325 |
+
# pydantic-settings
|
| 326 |
+
tzdata==2025.3
|
| 327 |
+
# via pandas
|
| 328 |
+
urllib3==2.6.3
|
| 329 |
+
# via
|
| 330 |
+
# requests
|
| 331 |
+
# sentry-sdk
|
| 332 |
+
uuid-utils==0.14.0
|
| 333 |
+
# via
|
| 334 |
+
# langchain-core
|
| 335 |
+
# langsmith
|
| 336 |
+
uvicorn==0.41.0
|
| 337 |
+
# via
|
| 338 |
+
# service-explorer-backend (pyproject.toml)
|
| 339 |
+
# fastapi
|
| 340 |
+
# fastapi-cli
|
| 341 |
+
# fastapi-cloud-cli
|
| 342 |
+
# frontend
|
| 343 |
+
watchfiles==1.1.1
|
| 344 |
+
# via uvicorn
|
| 345 |
+
websockets==16.0
|
| 346 |
+
# via uvicorn
|
| 347 |
+
wrapt==1.17.3
|
| 348 |
+
# via langfuse
|
| 349 |
+
xxhash==3.6.0
|
| 350 |
+
# via
|
| 351 |
+
# langgraph
|
| 352 |
+
# langsmith
|
| 353 |
+
yarl==1.22.0
|
| 354 |
+
# via aiohttp
|
| 355 |
+
zstandard==0.25.0
|
| 356 |
+
# via langsmith
|
run.sh
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
uv sync
|
| 2 |
+
|
| 3 |
+
uv lock
|
| 4 |
+
|
| 5 |
+
uv run uvicorn main:app --host 0.0.0.0 --port 8000
|
services/agentic/agentic_setup.py
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from sqlalchemy.ext.asyncio import AsyncSession
|
| 2 |
+
from externals.databases.pg_models import CVUser
|
| 3 |
+
from services.agentic.filter import AgenticFilterService
|
| 4 |
+
from services.agentic.weight import AgenticWeightService
|
| 5 |
+
# from services.agentic.matching import AgenticMatchingService
|
| 6 |
+
# from services.agentic.profile_scoring import AgenticScoringService
|
| 7 |
+
|
| 8 |
+
|
| 9 |
+
from utils.logger import get_logger
|
| 10 |
+
|
| 11 |
+
logger = get_logger("agentic setup")
|
| 12 |
+
|
| 13 |
+
class AgenticService:
|
| 14 |
+
"""
|
| 15 |
+
Facade / Orchestrator for all Agentic services
|
| 16 |
+
"""
|
| 17 |
+
|
| 18 |
+
def __init__(self, db: AsyncSession, user: CVUser):
|
| 19 |
+
self.db = db
|
| 20 |
+
self.user = user
|
| 21 |
+
|
| 22 |
+
self.filter = AgenticFilterService(db, user)
|
| 23 |
+
self.weight = AgenticWeightService(db, user)
|
| 24 |
+
# self.filter = AgenticMatchingService(db, user)
|
| 25 |
+
# self.filter = AgenticScoringService(db, user)
|
| 26 |
+
|
| 27 |
+
|
| 28 |
+
# async def scoring_profile(self, input_scoring: PayloadMatchOne):
|
| 29 |
+
# "Generate profile scoring from an extracted profile and a criteria"
|
| 30 |
+
# try:
|
| 31 |
+
# profile : Profile = await get_profile(input_scoring.get("profile_id"))
|
| 32 |
+
# # profile : Profile = asyncio.run(get_profile(input_scoring.get("profile_id")))
|
| 33 |
+
|
| 34 |
+
# tobe_match = InputScoring(
|
| 35 |
+
# **profile,
|
| 36 |
+
# criteria=input_scoring.get("criteria"),
|
| 37 |
+
# criteria_weight=input_scoring.get("criteria_weight")
|
| 38 |
+
# )
|
| 39 |
+
# output = await match_one(input_scoring=tobe_match)
|
| 40 |
+
# # output = asyncio.run(match_one_profile(input_scoring=tobe_match))
|
| 41 |
+
# return output
|
| 42 |
+
|
| 43 |
+
# except Exception as E:
|
| 44 |
+
# logger.error(f"❌ scoring profile error, {E}")
|
| 45 |
+
|
| 46 |
+
# return ResponseExtractOne(
|
| 47 |
+
# status="failed",
|
| 48 |
+
# message=f"scoring profile error, {E}",
|
| 49 |
+
# )
|
| 50 |
+
|
| 51 |
+
|
| 52 |
+
# async def scoring_bulk_profile(self, input_scorings: PayloadMatchBulk):
|
| 53 |
+
# "Generate profile scoring from list of extracted profile and a criteria"
|
| 54 |
+
# try:
|
| 55 |
+
# input_scoring_bulk = InputScoringBulk(
|
| 56 |
+
# profile_ids=input_scorings.get("profile_ids"),
|
| 57 |
+
# criteria=input_scorings.get("criteria"),
|
| 58 |
+
# criteria_weight=input_scorings.get("criteria_weight"),
|
| 59 |
+
# )
|
| 60 |
+
|
| 61 |
+
# outputs = await match_bulk(input_scoring_bulk)
|
| 62 |
+
# return outputs
|
| 63 |
+
|
| 64 |
+
# except Exception as E:
|
| 65 |
+
# logger.error(f"❌ scoring profile bulk error, {E}")
|
| 66 |
+
|
| 67 |
+
# return ResponseMatchBulk(
|
| 68 |
+
# status="failed",
|
| 69 |
+
# message=f"scoring profile bulk error, {E}",
|
| 70 |
+
# )
|
services/agentic/filter.py
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from fastapi import HTTPException, status
|
| 2 |
+
from sqlalchemy.ext.asyncio import AsyncSession
|
| 3 |
+
|
| 4 |
+
from externals.databases.pg_models import CVFilter
|
| 5 |
+
from externals.databases.pg_crud import (
|
| 6 |
+
create_filter,
|
| 7 |
+
get_filter,
|
| 8 |
+
get_filter_by_id,
|
| 9 |
+
)
|
| 10 |
+
from utils.logger import get_logger
|
| 11 |
+
|
| 12 |
+
logger = get_logger("filter agentic service")
|
| 13 |
+
|
| 14 |
+
|
| 15 |
+
class AgenticFilterService:
|
| 16 |
+
def __init__(self, db: AsyncSession, user):
|
| 17 |
+
self.db = db
|
| 18 |
+
self.user = user
|
| 19 |
+
|
| 20 |
+
async def create_filter(self, filter: CVFilter) -> str:
|
| 21 |
+
"""Return criteria_id:str"""
|
| 22 |
+
|
| 23 |
+
# check filter existence
|
| 24 |
+
existing_filter = await get_filter(self.db, filter)
|
| 25 |
+
if existing_filter:
|
| 26 |
+
logger.info(f"Filter already exists: {existing_filter}")
|
| 27 |
+
return existing_filter.criteria_id
|
| 28 |
+
|
| 29 |
+
|
| 30 |
+
# create filter
|
| 31 |
+
filter_id = await create_filter(self.db, filter)
|
| 32 |
+
logger.info(f"Filter not existed yet, creating new filter: {filter_id}")
|
| 33 |
+
return filter_id.criteria_id
|
| 34 |
+
|
| 35 |
+
|
| 36 |
+
async def get_filter_by_id(self, criteria_id: str) -> CVFilter:
|
| 37 |
+
"""Return filter object"""
|
| 38 |
+
|
| 39 |
+
filter = await get_filter_by_id(self.db, criteria_id)
|
| 40 |
+
if not filter:
|
| 41 |
+
logger.error(f"Filter not found: {criteria_id}")
|
| 42 |
+
raise HTTPException(
|
| 43 |
+
status_code=status.HTTP_404_NOT_FOUND,
|
| 44 |
+
detail=f"Filter not found: {criteria_id}"
|
| 45 |
+
)
|
| 46 |
+
return filter
|
| 47 |
+
|
| 48 |
+
|