上傳小朋友疊好的積木照片,由 Gemini 轉換為未來感建築,再透過 Tripo3D 生成可下載的 3D 模型。
① 上傳積木 ② AI 生未來建築(Gemini / GPT Image) ③ Tripo3D 生 3D 模型(可跳過)
已選風格參考圖(第二張圖)
目前選擇:
修改下方「共用範本」或「此風格 description」後按儲存,之後選同一個 type/id 都會用新內容。
共用 Prompt 範本(所有 type/id)
請保留 {description},系統會把下方各風格的 description 填進去。
此風格 Description(依 type / id)
組合後 Prompt 預覽(唯讀)
僅 OpenAI 生圖有效;Gemini 由模型自行決定尺寸與品質。
正在處理...
(用時 0 秒)
✓ 積木分析完成
是否有積木
-
高度佔比
-
堆疊層數
-
✓ AI 建築圖已生成
進度 0%
發生錯誤
已完成的步驟:
獨立呼叫 ChatGPT Vision 或 Gemini 內容安全審查與積木分析,不觸發生圖流程
也可透過 API 文件區查看 curl 範例與回應格式。
內容安全
-
是否有積木
-
高度佔比
-
堆疊層數
-
呼叫 GET /api/images/blocks-to-3d,可用 id 或日期篩選(與 gemini.html 分開)
生圖完成後,將 building_ai_id 填入 id 欄位並按「發送 ID」;發送後 latest 才會取得該圖片。
記錄誰在呼叫 GET /api/images/blocks-to-3d/latest,含來源 IP、客戶端、回傳 ID 與耗時
| IP | 客戶端 | 次數 | 最後呼叫 |
|---|
| 時間 | IP | 客戶端 | 狀態 | 回傳 ID | userID | 耗時 |
|---|
/api/pipeline/blocks-to-3d,取得 job_id;此時 building_ai_id 為 null。/api/pipeline/blocks-to-3d/job/{job_id},直到 job.status 為 done 或 error。job.building_ai_id(或 job.data.building_ai_id)及 job.userID。/api/images/blocks-to-3d/build_send,傳入取得的 building_ai_id。/api/images/blocks-to-3d/latest;只有經 build_send 發送的圖片才會出現。POST blocks-to-3d
→ job_id
→ GET job/{job_id}(每 2 秒)
→ status=done + building_ai_id
→ POST build_send(building_ai_id)
→ GET latest
/api/pipeline/blocks-to-3d| 欄位 | 必填 | 說明 |
|---|---|---|
| image | 是 | 積木照片(也支援 file / blocks_image) |
| type | 是 | 建築風格分類:AI_Factory、E_commerce_Building、Healthcare_Industry、Talent_Policy |
| id | 是 | 風格編號 1~10(對應內建參考圖與 description) |
| userID | 否 | 使用者識別字串,最多 200 字元;會隨圖片儲存,job 與 latest 均會回傳 |
| prompt | 否 | 可選覆寫;省略則用伺服器已儲存的「共用範本 + 該 type/id description」 |
| image_size | 否 | OpenAI 生圖尺寸:512x512、816x816、1024x1024(預設) |
| image_quality | 否 | OpenAI 生圖品質:low(預設)、medium、high |
| gemini_model | 否 | 預設 gpt-image-2(OpenAI);亦可傳 gemini-3.1-flash-image 等改用 Gemini 生圖 |
| provider | 否 | gemini 或 openai,省略則依 gemini_model 自動判斷 |
| skip_3d | 否 | 1(預設):只生成建築圖、不執行 Tripo3D;設 0 才進行 3D 建模 |
| enable_moderation | 否 | 0(預設):不執行照片審查;設 1 則平行執行審查並顯示意見(不阻擋生圖),見下方 審查 API 測試 |
| moderation_provider | 否 | 審查後端(enable_moderation=1 時有效):openai 或 gemini |
| model | 否 | Tripo3D 模型版本,預設 v3.0-20250812(可選 v3.1-20260211 / v2.5-20250123) |
| texture | 否 | 1 或 0,預設 1 |
| smart_low_poly | 否 | 1 或 0,預設 1 |
curl -X POST "https://techart.tronk.tw/face_lineart/api/pipeline/blocks-to-3d" \
-F "image=@./blocks.jpg" \
-F "type=AI_Factory" \
-F "id=3" \
-F "userID=user-001" \
-F "gemini_model=gpt-image-2" \
-F "skip_3d=1"
立即回應(圖片尚未生成,所以 building_ai_id 為 null):
{
"success": true,
"job_id": "88eb0f2641e642cf9ac11624950f7e38",
"building_ai_id": null,
"userID": "user-001",
"blocks_image": "/uploads/blocks_input_..."
}
/api/pipeline/blocks-to-3d/job/<job_id>使用步驟 1 回傳的 job_id,每 2 秒查詢一次。Job 約保留 1 小時。
| status | 說明 | 下一步 |
|---|---|---|
| running | 生圖或後續流程進行中 | 等待 2 秒後繼續輪詢 |
| done | 圖片已生成並寫入資料庫 | 讀取 building_ai_id,呼叫 build_send |
| error | 流程失敗 | 讀取 job.error,不再輪詢 |
curl "https://techart.tronk.tw/face_lineart/api/pipeline/blocks-to-3d/job/88eb0f2641e642cf9ac11624950f7e38"
# status=done 回應重點
{
"success": true,
"job": {
"status": "done",
"stage": "done",
"building_ai_id": 2242,
"building_image": "/uploads/blocks_building_....jpg",
"userID": "user-001",
"data": {
"building_ai_id": 2242,
"building_image": "/uploads/blocks_building_....jpg",
"userID": "user-001",
"skip_3d": true
}
}
}
/api/moderation/analyze僅審查與積木分析,不觸發生圖。頁面下方有測試區塊。
curl -X POST "https://techart.tronk.tw/face_lineart/api/moderation/analyze" \
-F "image=@./blocks.jpg" \
-F "moderation_provider=openai"
/api/tripo3d/task/<tripo_task_id>同 Tripo3D API,每 3 秒輪詢直到 status 為 success。
/api/pipeline/blocks-to-3d/status{
"success": true,
"online": true,
"gemini": { "online": true, "default_model": "gemini-3.1-flash-image" },
"openai": { "online": true, "default_model": "gpt-image-2" },
"tripo3d": { "online": true, "default_model": "v3.0-20250812" }
}
可在頁面上方直接編輯並儲存;也可呼叫 API。
# 更新共用範本(必須含 {description})
curl -X PUT "https://techart.tronk.tw/face_lineart/api/buildings/prompt-template" \
-H "Content-Type: application/json" \
-d "{\"prompt_template\":\"將第一張圖轉成第二張圖風格...\\n{description}\"}"
# 更新某 type/id 的 description
curl -X PUT "https://techart.tronk.tw/face_lineart/api/buildings/styles/AI_Factory/1" \
-H "Content-Type: application/json" \
-d "{\"description\":\"智慧製造與 AI 工廠風格...\"}"
/api/images/blocks-to-3d只回傳 source=blocks-to-3d 的圖片,可用 id 或日期篩選。可在上方 測試區塊 直接試用。
積木轉建築的圖片存在專屬資料表,id 是不與 gemini 生圖、上傳圖片共用的獨立連號序號。
| 參數 | 必填 | 說明 |
|---|---|---|
| id | 否 | 單一 id,或逗號分隔多個(例如 120 / 120,125) |
| date | 否 | 指定某一天,格式 YYYY-MM-DD |
| date_from | 否 | 起始日期(含當日),格式 YYYY-MM-DD |
| date_to | 否 | 結束日期(含當日),格式 YYYY-MM-DD |
| limit | 否 | 預設 100,上限 500 |
| offset | 否 | 預設 0 |
# 依 id
curl "https://techart.tronk.tw/face_lineart/api/images/blocks-to-3d?id=120"
# 依日期
curl "https://techart.tronk.tw/face_lineart/api/images/blocks-to-3d?date=2026-07-10"
# 日期區間
curl "https://techart.tronk.tw/face_lineart/api/images/blocks-to-3d?date_from=2026-07-01&date_to=2026-07-10"
/api/images/blocks-to-3d/build_send傳入生圖完成後取得的 building_ai_id。只有經過此 API 發送的圖片才會出現在 latest;重複發送同一 ID 不會建立重複紀錄。
curl -X POST "https://techart.tronk.tw/face_lineart/api/images/blocks-to-3d/build_send" \
-H "Content-Type: application/json" \
-d "{\"building_ai_id\": 1421}"
/api/images/blocks-to-3d/latest回傳最近一次經 build_send 發送的圖片;尚未發送任何圖片時 id 為 null。
curl "https://techart.tronk.tw/face_lineart/api/images/blocks-to-3d/latest"
# 回應範例
{
"success": true,
"data": {
"id": 1421,
"building_ai_id": 1421,
"userID": "user-001",
"source": "blocks-to-3d",
"created_at": "2026-07-10 00:58:39",
"url": "https://techart.tronk.tw/face_lineart/uploads/blocks_building_....jpg",
"relative_url": "/uploads/blocks_building_....jpg",
"filename": "blocks_building_....jpg"
}
}
/api/images/blocks-to-3d/latest/logs查詢誰呼叫過 latest,含來源 IP、客戶端、回傳的 ID 與耗時。記錄保留 30 天,時間為 UTC。可在上方 呼叫記錄區塊 直接檢視。
| 參數 | 必填 | 說明 |
|---|---|---|
| date | 否 | 指定某一天(YYYY-MM-DD) |
| date_from / date_to | 否 | 日期區間(YYYY-MM-DD) |
| ip | 否 | 以來源 IP 過濾(完全比對) |
| limit / offset | 否 | limit 預設 100、上限 500;offset 預設 0 |
curl "https://techart.tronk.tw/face_lineart/api/images/blocks-to-3d/latest/logs?date=2026-07-29&limit=50"
# 回應範例
{
"success": true,
"data": {
"total": 128,
"retention_days": 30,
"top_clients": [
{ "client_ip": "203.0.113.5", "user_agent": "UnityPlayer/2022.3", "call_count": 96, "last_called_at": "2026-07-29 12:31:02" }
],
"logs": [
{
"id": 128,
"called_at": "2026-07-29 12:31:02",
"client_ip": "203.0.113.5",
"forwarded_for": "203.0.113.5",
"user_agent": "UnityPlayer/2022.3",
"referer": "",
"query_string": "",
"status_code": 200,
"returned_id": 60,
"returned_user_id": "user-001",
"duration_ms": 3,
"error": null
}
]
}
}