ge / README.md
4cko
/usr/local/rvm/gems/ruby-3.4.7/bin:/usr/local/rvm/gems/ruby-3.4.7@global/bin:/usr/local/rvm/rubies/ruby-3.4.7/bin:/home/codespace/.vscode-remote/data/User/globalStorage/github.copilot-chat/debugCommand:/home/codespace/.vscode-remote/data/User/globalStorage/github.copilot-chat/copilotCli:/vscode/bin/linux-x64/7e7950df89d055b5a378379db9ee14290772148a/bin/remote-cli:/home/codespace/.local/bin:/home/codespace/.dotnet:/home/codespace/nvm/current/bin:/home/codespace/.php/current/bin:/home/codespace/.python/current/bin:/home/codespace/java/current/bin:/home/codespace/.ruby/current/bin:/home/codespace/.local/bin:/usr/local/python/current/bin:/usr/local/py-utils/bin:/usr/local/jupyter:/usr/local/oryx:/usr/local/go/bin:/go/bin:/usr/local/sdkman/bin:/usr/local/sdkman/candidates/java/current/bin:/usr/local/sdkman/candidates/gradle/current/bin:/usr/local/sdkman/candidates/maven/current/bin:/usr/local/sdkman/candidates/ant/current/bin:/usr/local/rvm/gems/default/bin:/usr/local/rvm/gems/default@global/bin:/usr/local/rvm/rubies/default/bin:/usr/local/share/rbenv/bin:/usr/local/php/current/bin:/opt/conda/bin:/usr/local/nvs:/usr/local/share/nvm/versions/node/v24.14.0/bin:/usr/local/hugo/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/share/dotnet:/home/codespace/.dotnet/tools:/usr/local/rvm/bin
a25386c
|
Raw
History Blame Contribute Delete
8.11 kB
metadata
title: fe_03f1
emoji: πŸ˜‚
colorFrom: blue
colorTo: gray
sdk: docker
app_port: 3000
pinned: false

Vico - Hugging Face File Upload API

API Python Flask untuk upload file ke Hugging Face Dataset dengan response format JSON. Menggunakan library resmi huggingface_hub.

πŸš€ Fitur

  • βœ… Upload file ke Hugging Face Dataset via REST API
  • βœ… Menggunakan library resmi huggingface_hub
  • βœ… Validasi file dan error handling
  • βœ… Response JSON terstruktur
  • βœ… Support subfolder dalam repository
  • βœ… File size limit 100MB
  • βœ… Environment variables support (HF_TOKEN, HF_REPO_ID)
  • βœ… Automatic temporary file cleanup

πŸ“‹ Prerequisites

  • Python 3.8 atau lebih tinggi
  • pip (Python package manager)
  • Hugging Face account dengan access token

πŸ”§ Instalasi

1. Clone Repository

git clone https://github.com/4cko/vico.git
cd vico

2. Install Dependencies

pip install -r requirements.txt

3. Setup Environment Variables

cp .env.example .env
# Edit .env sesuai kebutuhan (opsional)

4. Dapatkan Hugging Face Token

  1. Buka https://huggingface.co/settings/tokens
  2. Buat token baru dengan akses 'write'
  3. Simpan token tersebut

🎯 Cara Menggunakan

1. Jalankan Server

# Production mode
python3 server.py

# Development mode (dengan auto-reload)
python3 -m flask run --reload

Server akan berjalan di http://localhost:3000

2. Upload File

Endpoint: POST /api/upload

Required Fields:

  • file - File yang akan di-upload (form-data)
  • repo_id - Hugging Face repo ID (format: username/dataset-name) atau set di .env
  • token - Hugging Face API token atau set di .env

Optional Fields:

  • subfolder - Subfolder dalam repository (default: root)

Catatan: Jika repo_id dan token sudah di-set di .env (HF_REPO_ID dan HF_TOKEN), Anda tidak perlu mengirimnya di request. Nilai dari request akan override nilai di .env.

Contoh menggunakan cURL:

curl -X POST http://localhost:3000/api/upload \
  -F "file=@/path/to/file.csv" \
  -F "repo_id=username/my-dataset" \
  -F "token=hf_xxxxxxxxxxxxxxxxxxxxxxx" \
  -F "subfolder=data"

Contoh menggunakan Python:

import requests

files = {
    'file': open('/path/to/file.csv', 'rb')
}
data = {
    'repo_id': 'username/my-dataset',
    'token': 'hf_xxxxxxxxxxxxxxxxxxxxxxx',
    'subfolder': 'data'
}

response = requests.post(
    'http://localhost:3000/api/upload',
    files=files,
    data=data
)

print(response.json())

Direct Upload dengan huggingface_hub

Anda juga bisa upload langsung tanpa API server:

from huggingface_hub import login, upload_file, upload_folder

# Authenticate
login(token='hf_your_token_here')

# Upload single file
upload_file(
    path_or_fileobj='/path/to/file.csv',
    path_in_repo='u/file.csv',
    repo_id='username/my-dataset',
    repo_type='dataset',
    commit_message='Upload data'
)

# Atau upload entire folder
upload_folder(
    folder_path='/path/to/folder',
    repo_id='username/my-dataset',
    repo_type='dataset',
    path_in_repo='u/folder',
    commit_message='Upload folder'
)

Dengan Environment Variables (.env)

Jika sudah set .env dengan HF_TOKEN dan HF_REPO_ID:

cURL:

curl -X POST http://localhost:3000/api/upload \
  -F "file=@/path/to/file.csv"

Python:

import requests

files = {'file': open('file.csv', 'rb')}
# repo_id dan token akan diambil dari .env

r = requests.post('http://localhost:3000/api/upload', files=files)
print(r.json())

Contoh menggunakan huggingface_hub (Direct Upload)

from huggingface_hub import login, upload_file

# Authenticate
login(token='hf_your_token_here')

# Upload file
upload_file(
    path_or_fileobj='/path/to/file.csv',
    path_in_repo='u/file.csv',
    repo_id='username/my-dataset',
    repo_type='dataset',
    commit_message='Upload data'
)

print('βœ… File uploaded!')

3. Response Format

βœ… Sukses Upload (Status 200):

{
  "success": true,
  "message": "File berhasil di-upload ke Hugging Face",
  "data": {
    "file_name": "data.csv",
    "file_size": 12345,
    "repo_id": "username/my-dataset",
    "path_prefix": "/u/",
    "subfolder": "data",
    "url": "https://huggingface.co/datasets/username/my-dataset/blob/main/u/data/data.csv",
    "file_path": "u/data/data.csv",
    "upload_timestamp": "2024-06-24T10:30:00Z"
  }
}

❌ Error Response (Status 400/500):

{
  "success": false,
  "error": "repo_id dan token diperlukan (kirim via request atau set di .env)",
  "required_fields": ["repo_id", "token"],
  "hint": "Set HF_REPO_ID dan HF_TOKEN di .env atau kirim via form data"
}
{
  "success": false,
  "error": "Token tidak valid atau expired"
}
{
  "success": false,
  "error": "Repository tidak ditemukan: invalid/repo"
}

πŸ“ API Documentation

GET /

Health check endpoint

Response:

{
  "status": "ok",
  "message": "Hugging Face File Upload API",
  "version": "1.0.0",
  "language": "Python",
  "framework": "Flask",
  "endpoints": {
    "upload": {
      "method": "POST",
      "path": "/api/upload",
      "description": "Upload file ke Hugging Face dataset",
      "required": ["file", "repo_id", "token"],
      "optional": ["subfolder"]
    }
  }
}

πŸ” Security Notes

  1. Token Protection:

    • Jangan commit .env file ke repository
    • Gunakan environment variables untuk production
    • Rotate token secara berkala
  2. File Validation:

    • Max file size: 100MB
    • File validation dilakukan pada server
    • Automatic cleanup file lokal setelah upload
  3. Error Handling:

    • Token tidak valid
    • Repository tidak ditemukan
    • Access denied
    • Network errors

πŸ“‚ Project Structure

vico/
β”œβ”€β”€ server.py              # Main Flask server
β”œβ”€β”€ hf_uploader.py         # Hugging Face upload utility
β”œβ”€β”€ requirements.txt       # Python dependencies
β”œβ”€β”€ .env.example           # Environment variables template
β”œβ”€β”€ README.md              # Dokumentasi
β”œβ”€β”€ examples/
β”‚   β”œβ”€β”€ upload-file.py             # Contoh upload via API
β”‚   β”œβ”€β”€ direct-hf-upload.py        # Contoh direct upload ke HF
β”‚   β”œβ”€β”€ curl-upload.sh             # Contoh cURL
β”‚   β”œβ”€β”€ env-upload.sh              # Contoh menggunakan .env
β”‚   └── sample-data.csv            # Sample data file
└── uploads/               # Temporary folder untuk uploaded files

πŸ› Troubleshooting

Token tidak valid

Error: Token tidak valid atau expired

Solusi: Check token di https://huggingface.co/settings/tokens

Repository tidak ditemukan

Error: Repository tidak ditemukan: username/dataset

Solusi:

  • Pastikan dataset sudah di-create di Hugging Face
  • Format: username/dataset-name (lowercase)

File terlalu besar

Error: File too large

Solusi: Max file size adalah 100MB. Ubah di server.py jika perlu

Connection timeout

Error: Connection timeout

Solusi: Untuk file besar, process mungkin memerlukan waktu lebih lama. Tunggu lebih lama atau tingkatkan timeout.

Module not found

ModuleNotFoundError: No module named 'flask'

Solusi: Install dependencies dengan pip install -r requirements.txt

πŸš€ Deployment

Menggunakan Gunicorn (Production)

pip install gunicorn
gunicorn -w 4 -b 0.0.0.0:3000 server:app

Menggunakan Docker

docker build -t vico-api .
docker run -p 3000:3000 \
  -e HF_TOKEN=your_token \
  -e HF_REPO_ID=username/dataset \
  vico-api

πŸ“„ License

MIT

πŸ‘€ Author

4cko

πŸ’¬ Support

Untuk masalah atau pertanyaan, buka issue di repository ini.


Catatan: API ini menggunakan library resmi Hugging Face Hub. Pastikan token memiliki akses 'write' untuk repository yang dituju.

Dokumentasi library: https://huggingface.co/docs/hub/security-tokens

Catatan: API ini menggunakan Hugging Face Hub API. Pastikan token memiliki akses 'write' untuk repository yang dituju.