api_light_hf / README.md
Renecto's picture
fix: add HF Spaces README frontmatter
962f426
---
title: api_light_hf
emoji: 🚀
colorFrom: blue
colorTo: indigo
sdk: docker
app_file: app.py
pinned: false
---
# api_light_hf
`api_light_dev` の全エンドポイントを **Hugging Face Inference API** に乗せ換えた FastAPI サーバーです。
Gradio / GCP / Vertex AI への依存を排除し、`HF_TOKEN` 一本で動きます。
---
## アーキテクチャ概要
```
api_light_hf/
├── app.py # FastAPI エントリーポイント。apis/ を動的ロード
├── apis/ # 各 API 関数(1ファイル = 1関数)
├── src/
│ ├── clients/
│ │ └── llm_client.py # HF Inference API 統合クライアント
│ ├── config/
│ │ └── models.yaml # モデルエイリアス・タスク定義
│ └── utils/
│ └── tracer.py # ロギング/OpenTelemetry トレーサー
├── requirements.txt
└── Dockerfile
```
### 主な変更点(api_light_dev との差分)
| 項目 | api_light_dev | api_light_hf |
|---|---|---|
| サーバー | Gradio | FastAPI (`POST /{api_name}`) |
| LLM バックエンド | OpenAI / Vertex AI / LiteLLM | HF Inference API (`huggingface_hub`) |
| OCR | Google Vision API | VLM (Qwen2.5-VL) |
| Inpaint | Vertex AI Imagen | HF `stable-diffusion-inpainting` |
| Image Generation | Vertex AI Imagen / DALL-E | HF FLUX.1-dev |
| HTML 生成 (baseimg2html) | Vertex AI Gemini 2.5 Pro | HF Qwen2.5-VL-72B |
| 認証 | GCP サービスアカウント JSON | `HF_TOKEN` 環境変数のみ |
---
## セットアップ
### 1. 環境変数
| 変数 | 必須 | 説明 |
|---|---|---|
| `HF_TOKEN` | ✅ | Hugging Face の API トークン([取得](https://huggingface.co/settings/tokens)) |
| `PORT` | – | 待ち受けポート(デフォルト `7860`) |
| `HF_MODEL` | – | デフォルトモデルの上書き(例: `meta-llama/Llama-3.3-70B-Instruct`) |
| `GCP_SERVICE_KEY_FOR_TRACE` | – | OpenTelemetry / Cloud Trace を有効化する場合のサービスアカウント JSON |
### 2. ローカル起動
```bash
# 依存インストール
pip install -r requirements.txt
# 起動
HF_TOKEN=hf_xxx uvicorn app:app --host 0.0.0.0 --port 7860 --reload
```
### 3. Docker
```bash
# ビルド
docker build -t api_light_hf .
# 実行
docker run -p 7860:7860 -e HF_TOKEN=hf_xxx api_light_hf
```
### 4. Hugging Face Spaces へのデプロイ
専用スクリプト `deploy_api_light_hf.py`(リポジトリルート `DD/` 直下)を使います。
#### 前提
| 条件 | 内容 |
|---|---|
| `HF_TOKEN` | 書き込み権限のある HF API トークン([取得](https://huggingface.co/settings/tokens)) |
| Space の作成 | HF Spaces で **Docker** SDK の Space を先に作成しておく |
| `git` | ローカルに git がインストールされていること |
#### 基本コマンド
```bash
# 環境変数に HF_TOKEN を設定
export HF_TOKEN=hf_xxxxxxxxxxxx
# デプロイ(初回・更新共通)
python deploy_api_light_hf.py --org DLPO --space api_light_hf
# コミットメッセージを指定
python deploy_api_light_hf.py --org DLPO --space api_light_hf -m "feat: add new api"
# push せずに手順を確認する(ドライラン)
python deploy_api_light_hf.py --org DLPO --space api_light_hf --dry-run
# Space の現在の状態を確認
python deploy_api_light_hf.py status --org DLPO --space api_light_hf
```
#### 引数一覧
| 引数 | デフォルト | 説明 |
|---|---|---|
| `cmd` | `deploy` | `deploy` または `status` |
| `--org` | `DLPO` または env `HF_ORG` | HF 組織名 / ユーザー名 |
| `--space` | `api_light_hf` または env `HF_SPACE` | Space 名 |
| `--branch` | `main` | 対象ブランチ |
| `-m / --message` | タイムスタンプ付き自動生成 | コミットメッセージ |
| `--token` | env `HF_TOKEN` | HF API トークン |
| `--local-dir` | `<スクリプトと同階層>/api_light_hf` | ローカルのソースディレクトリ |
| `--dry-run` | false | push せず手順だけ表示 |
#### 失敗時のチェックポイント
- `[error] HF_TOKEN is not set``export HF_TOKEN=hf_xxx` を実行
- `Push failed` → トークンに `write` 権限があるか、Space が存在するか確認
- `Local directory not found``--local-dir` で正しいパスを指定
- `git is not available` → git をインストールして PATH を通す
#### Space の secrets 設定
デプロイ後、Space の **Settings > Repository secrets** に以下を登録してください。
| Secret 名 | 値 |
|---|---|
| `HF_TOKEN` | Inference API 呼び出し用トークン(アプリ内部で使用) |
---
## API の使い方
サーバー起動後、`POST /{api_name}` にリクエストします。
### エンドポイント一覧の確認
```
GET /endpoints
```
### リクエスト形式
```bash
curl -X POST http://localhost:7860/text2theme \
-H "Content-Type: application/json" \
-d '{"text": "健康志向の若者向けスポーツドリンク"}'
```
### ヘルスチェック
```
GET /health → {"status": "ok"}
GET / → {status, uptime_seconds, active_requests, endpoints}
```
---
## モデル設定
`src/config/models.yaml` でモデルのエイリアス・タスク・能力を管理します。
```yaml
default_model: meta-llama/Llama-3.3-70B-Instruct
aliases:
gpt-4o: meta-llama/Llama-3.3-70B-Instruct
gemini-flash: Qwen/Qwen2.5-72B-Instruct
vision: Qwen/Qwen2.5-VL-72B-Instruct
...
models:
meta-llama/Llama-3.3-70B-Instruct:
task: text-generation
supports_json: true
supports_images: false
Qwen/Qwen2.5-VL-72B-Instruct:
task: image-text-to-text
supports_json: true
supports_images: true
...
```
---
## api_light_dev からの切り替え手順
1. `HF_TOKEN` を発行・設定する
2. `docker build` または `pip install` でセットアップ
3. 旧サービス(Gradio)と並行稼働で動作確認
4. 呼び出し元のベース URL を `https://<gradio-space>/...` から `http://<new-host>:<port>/...` に変更
- エンドポイント名(`text2theme`, `baseimg2score` など)はそのまま維持
- リクエストボディは `{"key": "value"}` 形式(旧 Gradio の JSON Body と互換)
5. 旧サービスを停止
### 非互換点
| 項目 | 旧(api_light_dev) | 新(api_light_hf) |
|---|---|---|
| `gcp_key` 引数 | GCP 認証に使用 | 受け取るが無視(ログ警告なし) |
| `openai_key` / `google_api_key` | LLM 認証に使用 | 受け取るが無視 |
| OCR 精度 | Google Vision API | VLM ベース(精度はモデルに依存) |
| Inpaint モデル | Vertex Imagen | SD-Inpainting(品質差あり) |
---
## 新しい API の追加
`apis/` に Python ファイルを追加するだけで自動登録されます。
```python
# apis/my_new_api.py
from src.clients.llm_client import LLMClient
from pydantic import BaseModel
class MyOutput(BaseModel):
result: str
def my_new_api(input_text: str) -> dict:
"""
input1 (text): 入力テキスト
output1 (json): {"result": "..."}
"""
client = LLMClient()
output = client.call(prompt=input_text, schema=MyOutput)
return output.model_dump()
```
サーバーを再起動すると `POST /my_new_api` が自動的に有効になります。