เอกสาร API การสร้างแปลนชั้น#
URLพื้นฐาน:
https://api.ideal.house
เวอร์ชัน: v1
อัปเดต: 2026-08-09
📖 ภาพรวม#
การเจนเนอเรทแปลนชั้น API สร้างแปลนบ้านแนวคิดแบบ CAD มองจากด้านบน สีดำ-ขาว ที่สร้างโดย AI ขึ้นหนึ่งฉบับ จากข้อกำหนดห้องแบบโครงสร้าง และพรอมต์กำหนดเองหรือภาพอ้างอิงแบบไม่บังคับ
ผลลัพธ์มีไว้สำหรับการสำรวจเลย์เอาต์เบื้องต้น ไม่ใช่แบบก่อสร้าง และขนาดเรขาคณิต ตำแหน่งอุปกรณ์ และความสอดคล้องกับมาตรฐานที่สร้างขึ้นมาต้องได้รับการตรวจสอบโดยผู้เชี่ยวชาญที่มีคุณสมบัติเหมาะสม
เวิร์กโฟลว์เป็นแบบอะซิงโครนัส:
- สร้างงาน — ส่งพารามิเตอร์แปลนชั้นและรับ
taskId - ตรวจสอบผลลัพธ์ — สอบถามจุดปลายทางผลลัพธ์ด้วย
taskIdจนกว่างานจะถึงสถานะสิ้นสุด
🔐 การรับรองความถูกต้อง#
คำขอ API สาธารณะทั้งหมดต้องรวมคีย์ API
| หัวข้อ | จำเป็น | ค่า |
|---|---|---|
APIKEY | ✅ ใช่ | คีย์ API ของคุณ |
Content-Type | ✅ ใช่สำหรับ POST | application/json |
[!WARNING] รักษาความปลอดภัยของคีย์ API ของคุณ อย่าเปิดเผยในโค้ดฝั่งไคลเอนต์หรือคลังสาธารณะ
💰 การหักเครดิต#
เครดิตจะถูกหักหลังจากสร้างรายการงานสำเร็จ หากงานนั้นล้มเหลวในภายหลัง เครดิตที่หักไปจะถูกคืนโดยอัตโนมัติ หากเครดิตไม่เพียงพอ ระบบจะส่งคืนรหัสข้อผิดพลาด 9051
โมเดล (modelType) | ขนาดผลลัพธ์ | เครดิต |
|---|---|---|
Base | 1536 × 1024 | 10 |
Pro | 2496 × 1664 | 20 |
Flash ไม่รองรับใน API แปลนชั้น
ดู เอกสารอ้างอิงการหักเครดิต สำหรับพฤติกรรมบิลลิ่งทั่วไป
📌 จุดปลายทาง API#
1. สร้างงานแปลนชั้น#
สร้างงานสร้างแปลนชั้นและคืน ID งานที่ไม่ซ้ำกัน
จุดปลายทาง
POST /api/v1/floorPlan/generate
หัวข้อความขอ
| หัวข้อ | จำเป็น | คำอธิบาย |
|---|---|---|
APIKEY | ✅ ใช่ | คีย์รับรองความถูกต้อง API |
Content-Type | ✅ ใช่ | ต้องเป็น application/json |
เนื้อหาคำขอ#
| ฟิลด์ | ประเภท | จำเป็น | คำอธิบาย | ค่าเริ่มต้น |
|---|---|---|---|---|
bedrooms | integer | ❌ ไม่ | จำนวนห้องนอนตั้งแต่ 0 ถึง 5 | 2 |
bathrooms | number | ❌ ไม่ | จำนวนห้องน้ำรวมตั้งแต่ 0.5 ถึง 4 ในขั้น 0.5 | 1.5 |
totalArea | string | ✅ ใช่ | พื้นที่รวมเป้าหมายที่เป็นบวกพร้อมหน่วย m² หรือ ft² เช่น 220 m² หรือ 1386 ft² | — |
bedroomAreaRanges | array<object> | ❌ ไม่ | คำแนะนำขนาดห้องนอนแบบไม่บังคับ ดู ช่วงพื้นที่ห้องนอน | คำนวณจาก totalArea เมื่อไม่ได้ระบุ |
bathroomDetails | object | ❌ ไม่ | การตั้งค่าสำหรับห้องน้ำเต็มรูปแบบเท่านั้น ดู รายละเอียดห้องน้ำ | — |
kitchenDetails | object | ❌ ไม่ | การตั้งค่าครัวแบบไม่บังคับ ดู รายละเอียดครัว | — |
keyRooms | array<string> | ❌ ไม่ | ห้องหรือพื้นที่เพิ่มเติม ดู ห้องหลัก | [] |
prompt | string | ❌ ไม่ | ลำดับความสำคัญเพิ่มเติมสำหรับการจัดผัง ไม่สามารถเปลี่ยนจำนวนที่ระบุในฟิลด์ข้อมูลแบบมีโครงสร้างหรือข้อจำกัดด้านภาพที่บังคับใช้ได้ | "" |
refImageUrl | string | ❌ ไม่ | URL ภาพอ้างอิงที่เข้าถึงได้สาธารณะ | "" |
modelType | string | ❌ ไม่จำเป็น | ค่าที่เลือกได้: Base, Pro | Base |
[!IMPORTANT] API สาธารณะปัจจุบันตรวจสอบ
bedroomsเป็น0–5และbathroomsเป็น0.5–4ค่าที่มีอยู่ใน UI ฝั่งไคลเอนต์อื่นจะไม่ขยายขีดจำกัดฝั่งเซิร์ฟเวอร์เหล่านี้
กฎคำขอทั่วไป#
- ค่า enum ทั้งหมดมีความไวต่อตัวพิมพ์ใหญ่-เล็ก และต้องใช้ค่าภาษาอังกฤษตามที่แสดงไว้ในเอกสารนี้
totalAreaเป็นพื้นที่รวมเป้าหมายที่ใช้ในการนำทางสเกลและสัดส่วน ไม่ถือเป็นขนาดก่อสร้างที่แน่นอน- คำสั่งแบบกำหนดเองที่มีผลถูกจำกัดไว้ที่ 800 ตัวอักษรแรกเมื่อประกอบคำสั่งภาพแบบโครงสร้าง
- ฟิลด์โครงสร้างมีลำดับความสำคัญเหนือคำสั่งที่ขัดแย้งใน
prompt - งานที่สำเร็จจะสร้างภาพได้หนึ่งภาพเท่านั้น
📐 พื้นที่รวม#
totalArea ประกอบด้วยค่าตัวเลขที่เป็นบวกหนึ่งค่าตามด้วยหน่วยพื้นที่
| หน่วย | ตัวอย่าง |
|---|---|
m² | 220 m² |
ft² | 1386 ft² |
แนะนำให้มีช่องว่างก่อนหน่วย รับค่าทศนิยมได้เมื่อเป็นบวก
ตัวอย่างที่ถูกต้อง:
{
"totalArea": "200 m²"
}
{
"totalArea": "1850 ft²"
}
🛏️ ช่วงพื้นที่ห้องนอน#
bedroomAreaRanges ให้คำแนะนำขนาดห้องนอนแบบสัมพัทธ์ ไม่ขอป้ายชื่อพื้นที่ตัวเลขในภาพที่สร้าง
แต่ละรายการมีรูปแบบดังนี้:
| ฟิลด์ | ประเภท | จำเป็น | คำอธิบาย |
|---|---|---|---|
name | string | ❌ ไม่ | ตัวระบุห้องนอน เช่น Room 1 (Master) หรือ Room 2 |
minArea | string | ❌ ไม่ | พื้นที่ต่ำสุดที่เป็นบวก |
maxArea | string | ❌ ไม่ | พื้นที่สูงสุดที่เป็นบวก; ไม่สามารถน้อยกว่า minArea |
unit | string | ❌ ไม่ | Enum: m², ft²; ใช้หน่วยเดียวกับ totalArea |
ตัวอย่างช่วงที่ระบุชัดเจน
{
"bedroomAreaRanges": [
{
"name": "Room 1 (Master)",
"minArea": "30",
"maxArea": "40",
"unit": "m²"
},
{
"name": "Room 2",
"minArea": "20",
"maxArea": "30",
"unit": "m²"
}
]
}
กฎเมื่อส่งอาร์เรย์ที่ไม่ว่าง:
- ความยาวต้องเท่ากับ
bedrooms - แต่ละ
minAreaและmaxAreaที่ส่งต้องเป็นสตริงตัวเลขที่เป็นบวก - เมื่อส่งค่าทั้งสอง
minArea <= maxArea unitเมื่อส่ง ต้องเป็นm²หรือft²- ชื่อจะถูกเก็บรักษาไว้ รายการว่างหรือ null จะไม่ให้ความแนะนำขนาด
ช่วงอัตโนมัติเมื่อไม่ได้ระบุ#
ฟิลด์นี้อาจถูกละเว้นหรือส่งเป็นอาร์เรย์ว่าง เมื่อไม่มีรายการใดมี minArea หรือ maxArea ที่มีผล เส้นทางสร้างแบบโครงสร้างจะคำนวณช่วงห้องนอนภายในจาก totalArea และ bedrooms:
- งบประมาณพื้นที่ห้องนอนเริ่มต้นที่ 20% ของพื้นที่รวมสำหรับห้องนอนหนึ่งห้อง
- งบประมาณเพิ่มขึ้น 7.5 จุดเปอร์เซ็นต์สำหรับห้องนอนแต่ละห้องที่เพิ่มเข้ามา จำกัดที่ 50%
- ห้องนอนแรกได้รับน้ำหนักขนาด
1.3; ห้องนอนอื่นทั้งหมดได้รับน้ำหนัก1.0 - แต่ละเป้าหมายจะกลายเป็นช่วงประมาณ
±10%ปัดเศษเป็นหน่วยพื้นที่เต็ม - หน่วยถูกสืบทอดจาก
totalArea - ชื่อห้องที่ไม่ว่างที่มีอยู่เดิมจะถูกเก็บรักษาไว้; มิฉะนั้นเซิร์ฟเวอร์จะใช้
Room 1,Room 2, และอื่น ๆ
สำหรับ 200 m² และ 4 ห้องนอน คำแนะนำที่คำนวณได้ในปัจจุบันโดยประมาณคือ:
[
{ "name": "Room 1", "minArea": "23", "maxArea": "28", "unit": "m²" },
{ "name": "Room 2", "minArea": "18", "maxArea": "22", "unit": "m²" },
{ "name": "Room 3", "minArea": "18", "maxArea": "22", "unit": "m²" },
{ "name": "Room 4", "minArea": "18", "maxArea": "22", "unit": "m²" }
]
ค่าเหล่านี้เป็นคำแนะนำสัดส่วนภายใน ไม่ใช่พื้นที่ห้องสุดท้ายที่รับประกัน ช่วงที่ระบุชัดเจนและถูกต้องจะมีลำดับความสำคัญเหนือช่วงอัตโนมัติเสมอ
เมื่อ bedrooms เป็น 0 ให้ละเว้น bedroomAreaRanges หรือส่ง []
🛁 รายละเอียดห้องน้ำ#
bathrooms แทนจำนวนห้องน้ำรวม:
- ส่วนจำนวนเต็มคือจำนวนห้องน้ำเต็มรูปแบบ
- เศษ
.5เพิ่มห้องน้ำครึ่งหนึ่งหนึ่งห้อง - ห้องน้ำเต็มรูปแบบทุกห้องจะถูกสั่งให้รวมโถสุขภัณฑ์, อ่างล้างหน้า/อ่างล้างมือ และฝักบัวหรือพื้นที่เปียก
- ห้องน้ำแบบไม่มีส่วนอาบน้ำมีเพียงโถสุขภัณฑ์และอ่างล้างหน้า/อ่างล้างมือ ไม่มีฝักบัวหรืออ่างอาบน้ำ
bathroomDetails ตั้งค่าเฉพาะห้องน้ำเต็มรูปแบบ:
{
"bathroomDetails": {
"fullBathroomOptions": [
{
"name": "Bathroom 1",
"wetDrySeparation": "yes",
"bathtub": "required"
},
{
"name": "Bathroom 2",
"wetDrySeparation": "no",
"bathtub": "optional"
}
]
}
}
| ฟิลด์ | ประเภท | ค่าที่อนุญาต | คำอธิบาย |
|---|---|---|---|
name | string | Bathroom 1, Bathroom 2, ฯลฯ | ตัวระบุการแสดงผลแบบไม่บังคับ |
wetDrySeparation | string / null | yes, no, null | แสดงโซนเปียกแยกหรือไม่ |
bathtub | string / null | no, optional, required, null | ความต้องการอ่างอาบน้ำ |
กฎ:
fullBathroomOptions.lengthไม่สามารถเกินfloor(bathrooms)- อาร์เรย์อาจมีเฉพาะห้องน้ำเต็มรูปแบบที่เลือกการตั้งค่าไว้เท่านั้น
- ค่า
nullหมายถึงไม่ได้ระบุ - อ่างอาบน้ำที่จำเป็นเป็นอุปกรณ์เพิ่มเติมจากอุปกรณ์ห้องน้ำเต็มรูปแบบมาตรฐาน ไม่แทนที่โถสุขภัณฑ์หรือฝักบัว
- การแยกโซนเปียก/แห้งคือผนังกั้นภายในห้องน้ำที่นับจำนวน ไม่ใช่ห้องน้ำเพิ่มเติม
🍳 รายละเอียดครัว#
ฟิลด์ย่อยทั้งหมดของ kitchenDetails เป็นแบบไม่บังคับ ละเว้นวัตถุทั้งหมดยกเว้นเมื่อไม่ได้เลือกการตั้งค่าครัว
{
"kitchenDetails": {
"type": "open",
"size": "standard",
"layout": "U",
"islandType": "preparation",
"storage": "maximum",
"features": ["breakfast nook", "pantry"]
}
}
| ฟิลด์ | ประเภท | ค่าที่อนุญาต |
|---|---|---|
type | string | open, semi-open, closed |
size | string | small, standard, large, extra large |
layout | string | I, L, U, gallery |
islandType | string | no, preparation, cooking, entertainment |
storage | string | minimal, standard, maximum |
features | array<string> | eating bar, breakfast nook, pantry |
การตั้งค่าบางส่วนมีผล ตัวอย่างเช่น:
{
"kitchenDetails": {
"type": "semi-open"
}
}
🚪 ห้องหลัก#
keyRooms รับอาร์เรย์ของค่าเหล่านี้เท่านั้น:
| ค่า | คำอธิบาย |
|---|---|
walk-in closet | ตู้เสื้อผ้าแบบวอล์กอินเฉพาะที่เชื่อมต่อกับโซนห้องนอน |
laundry room | พื้นที่ซักผ้าเฉพาะ |
storage room | ห้องเก็บของทั่วไป |
utility room | ห้องเครื่องหรือห้องบริการ |
home office | สำนักงานหรือห้องทำงานเฉพาะ |
garage | โรงรถที่มีทางเข้า-ออกสำหรับยานพาหนะภายนอกและการเข้าถึงภายในบ้าน |
pantry | ห้องเก็บของติดครัว |
combined living-dining | โซนนั่งเล่นและรับประทานอาหารร่วมกันหนึ่งโซน |
balcony | ระเบียงภายนอกที่เชื่อมต่อกับพื้นที่นั่งเล่นหรือห้องนอนหลัก |
ค่า Web แบบเดิม balcon ก็ยอมรับและปรับให้เป็น balcony
กฎ:
- ค่าว่างจะถูกเพิกเฉยและค่าซ้ำจะถูกกำจัด
- ห้องหลักที่เลือกจะถูกขอเพียงครั้งเดียว
- พื้นที่แบบไม่บังคับที่ไม่ได้เลือกจะถูกตัดออกจากโปรแกรมห้องที่สร้าง
- หาก
pantryปรากฏทั้งในkitchenDetails.featuresและkeyRoomsจะขอพื้นที่เก็บเสบียงอาหารเพียงหนึ่งแห่งเท่านั้น
ตัวอย่าง:
{
"keyRooms": [
"garage",
"home office",
"combined living-dining"
]
}
🖼️ ภาพอ้างอิง#
refImageUrl เป็นแบบไม่บังคับและต้องเข้าถึงได้โดยตรงโดยเซิร์ฟเวอร์ API
ข้อกำหนด:
- รูปแบบ: JPG/JPEG, PNG หรือ WebP
- ขนาดไฟล์สูงสุด: 20 MB
- ขนาดขั้นต่ำ: 128 × 128 px
- ขนาดสูงสุด: 6,000 × 6,000 px ภาพที่ใหญ่กว่าจะถูกปรับขนาดตามสัดส่วนก่อนประมวลผล
ภาพอ้างอิงใช้เป็นแนวทางในการจัดผัง ตำแหน่งพื้นที่ที่อยู่ติดกัน สัดส่วน หรือรูปแบบภาพ ไม่สามารถเปลี่ยนจำนวนห้องที่ระบุในฟิลด์ข้อมูลแบบมีโครงสร้างหรือข้อจำกัดที่บังคับใช้อื่น ๆ ได้
🤖 ประเภทโมเดล#
| ค่า | คำอธิบาย |
|---|---|
Base | ค่าเริ่มต้น คุณภาพการสร้างสมดุล 1536 × 1024 ผลลัพธ์ |
Pro | ผลลัพธ์ความละเอียดสูง 2496 × 1664 ระยะเวลาการสร้างที่คาดหวังนานขึ้น |
รองรับเฉพาะ Base และ Pro
ฟิลด์ที่ไม่อยู่ในข้อกำหนดการใช้งานสาธารณะ#
ไคลเอนต์ API สาธารณะต้องไม่พึ่งพาฟิลด์ต่อไปนี้:
| ฟิลด์ | หมายเหตุ |
|---|---|
imageNumbers | ตัวสร้างปัจจุบันคืนภาพหนึ่งภาพเสมอ; ฟิลด์นี้ไม่จำเป็น |
extData | เมทาดาทาการติดตามกลุ่มงาน Web ภายใน; ไคลเอนต์สาธารณะควรละเว้น |
isApiCall | กำหนดโดยจุดปลายทาง API ไม่ใช่เนื้อหาคำขอ |
genByMember | เมทาดาทาการสร้างภายใน ไม่ใช่ฟิลด์คำขอแปลนชั้น |
ฟิลด์แบบเดิมที่ถูกลบซึ่งต้องไม่ส่ง:
floorplanSetting
roomCounts
grossArea
totalAreaValue
totalAreaUnit
totalAreaType
fullBathrooms
halfBathrooms
halfBathroomRequirement
kitchenType
diningRooms
livingRooms
extras
referenceImage
hasDetailOptions
📥 ตัวอย่างการสร้างงาน#
คำขอขั้นต่ำพร้อมช่วงห้องนอนอัตโนมัติ#
curl -X POST "https://api.ideal.house/api/v1/floorPlan/generate" \
-H "APIKEY: your_api_key_here" \
-H "Content-Type: application/json" \
-d '{
"bedrooms": 4,
"bathrooms": 2,
"totalArea": "200 m²",
"modelType": "Pro",
"prompt": "Upper floor of a two-story Saudi Arabian villa with a master bedroom, family living area, staircase landing, and balcony"
}'
คำขอครบถ้วน#
cURL
curl -X POST "https://api.ideal.house/api/v1/floorPlan/generate" \
-H "APIKEY: your_api_key_here" \
-H "Content-Type: application/json" \
-d '{
"bedrooms": 3,
"bathrooms": 2.5,
"totalArea": "220 m²",
"bedroomAreaRanges": [
{"name": "Room 1 (Master)", "minArea": "30", "maxArea": "40", "unit": "m²"},
{"name": "Room 2", "minArea": "20", "maxArea": "30", "unit": "m²"},
{"name": "Room 3", "minArea": "20", "maxArea": "30", "unit": "m²"}
],
"bathroomDetails": {
"fullBathroomOptions": [
{"name": "Bathroom 1", "wetDrySeparation": "yes", "bathtub": "required"},
{"name": "Bathroom 2", "wetDrySeparation": "no", "bathtub": "optional"}
]
},
"kitchenDetails": {
"type": "open",
"size": "standard",
"layout": "U",
"islandType": "preparation",
"storage": "maximum",
"features": ["breakfast nook", "pantry"]
},
"keyRooms": ["garage", "home office", "combined living-dining"],
"prompt": "Bright modern home with good natural lighting",
"refImageUrl": "https://example.com/reference-plan.png",
"modelType": "Pro"
}'
Java (OkHttp)
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
public class FloorPlanApiExample {
private static final String BASE_URL = "https://api.ideal.house";
private static final String API_KEY = "your_api_key_here";
public static void main(String[] args) throws Exception {
OkHttpClient client = new OkHttpClient();
String json = """
{
"bedrooms": 4,
"bathrooms": 2,
"totalArea": "200 m²",
"keyRooms": ["walk-in closet", "balcony"],
"prompt": "Upper floor with a master bedroom and family living area",
"modelType": "Pro"
}
""";
Request request = new Request.Builder()
.url(BASE_URL + "/api/v1/floorPlan/generate")
.addHeader("APIKEY", API_KEY)
.addHeader("Content-Type", "application/json")
.post(RequestBody.create(json, MediaType.parse("application/json")))
.build();
try (Response response = client.newCall(request).execute()) {
System.out.println(response.body().string());
}
}
}
Python (requests)
import requests
BASE_URL = "https://api.ideal.house"
API_KEY = "your_api_key_here"
payload = {
"bedrooms": 4,
"bathrooms": 2,
"totalArea": "200 m²",
"keyRooms": ["walk-in closet", "balcony"],
"prompt": "Upper floor with a master bedroom and family living area",
"modelType": "Pro",
}
response = requests.post(
f"{BASE_URL}/api/v1/floorPlan/generate",
headers={"APIKEY": API_KEY, "Content-Type": "application/json"},
json=payload,
)
response.raise_for_status()
print("Task ID:", response.json()["data"])
Node.js (axios)
const axios = require('axios');
const BASE_URL = 'https://api.ideal.house';
const API_KEY = 'your_api_key_here';
async function createFloorPlanTask() {
const response = await axios.post(
`${BASE_URL}/api/v1/floorPlan/generate`,
{
bedrooms: 4,
bathrooms: 2,
totalArea: '200 m²',
keyRooms: ['walk-in closet', 'balcony'],
prompt: 'Upper floor with a master bedroom and family living area',
modelType: 'Pro'
},
{
headers: {
APIKEY: API_KEY,
'Content-Type': 'application/json'
}
}
);
console.log('Task ID:', response.data.data);
return response.data.data;
}
createFloorPlanTask();
การตอบสนองการสร้างงานสำเร็จ#
{
"code": 0,
"message": "success",
"data": 1234567890123456789
}
| ฟิลด์ | ประเภท | คำอธิบาย |
|---|---|---|
code | integer | 0 บ่งชี้ว่างานถูกสร้างสำเร็จ |
message | string | ข้อความการตอบสนอง |
data | long | ID งานที่ใช้ตรวจสอบจุดปลายทางผลลัพธ์ |
2. รับผลลัพธ์งาน#
คืนความคืบหน้าของงานและภาพที่สร้างเมื่อพร้อม
จุดปลายทาง
GET /api/v1/floorPlan/result?taskId={taskId}
หัวข้อความขอ
| หัวข้อ | จำเป็น | คำอธิบาย |
|---|---|---|
APIKEY | ✅ ใช่ | คีย์รับรองความถูกต้อง API |
พารามิเตอร์ Query
| พารามิเตอร์ | ประเภท | จำเป็น | คำอธิบาย |
|---|---|---|---|
taskId | long | ✅ ใช่ | ID งานที่คืนโดยจุดปลายทางสร้าง |
ตัวอย่างคำขอผลลัพธ์#
cURL
curl -X GET "https://api.ideal.house/api/v1/floorPlan/result?taskId=1234567890123456789" \
-H "APIKEY: your_api_key_here"
การตรวจสอบสถานะ Python
import time
import requests
BASE_URL = "https://api.ideal.house"
API_KEY = "your_api_key_here"
task_id = 1234567890123456789
while True:
response = requests.get(
f"{BASE_URL}/api/v1/floorPlan/result",
headers={"APIKEY": API_KEY},
params={"taskId": task_id},
)
response.raise_for_status()
task = response.json()["data"]
print(task["status"], task["percentage"], task["waitNumber"])
if task["status"] in ("Success", "Failed", "Termination"):
break
time.sleep(3)
if task["status"] == "Success":
print("Result URL:", task["output"]["resultUrl"])
การตรวจสอบสถานะ Node.js
const axios = require('axios');
const BASE_URL = 'https://api.ideal.house';
const API_KEY = 'your_api_key_here';
async function pollFloorPlanResult(taskId) {
while (true) {
const response = await axios.get(
`${BASE_URL}/api/v1/floorPlan/result`,
{
headers: { APIKEY: API_KEY },
params: { taskId }
}
);
const task = response.data.data;
console.log(task.status, task.percentage, task.waitNumber);
if (['Success', 'Failed', 'Termination'].includes(task.status)) {
if (task.status === 'Success') {
console.log('Result URL:', task.output.resultUrl);
}
return task;
}
await new Promise(resolve => setTimeout(resolve, 3000));
}
}
pollFloorPlanResult('1234567890123456789');
การตอบสนองงานเสร็จสิ้น#
{
"code": 0,
"message": "success",
"data": {
"id": 1234567890123456789,
"status": "Success",
"waitNumber": 0,
"percentage": 100,
"input": {
"bedrooms": 4,
"bathrooms": 2,
"totalArea": "200 m²",
"bedroomAreaRanges": [
{"name": "Room 1", "minArea": "23", "maxArea": "28", "unit": "m²"},
{"name": "Room 2", "minArea": "18", "maxArea": "22", "unit": "m²"},
{"name": "Room 3", "minArea": "18", "maxArea": "22", "unit": "m²"},
{"name": "Room 4", "minArea": "18", "maxArea": "22", "unit": "m²"}
],
"keyRooms": ["walk-in closet", "balcony"],
"prompt": "Upper floor with a master bedroom and family living area",
"modelType": "Pro"
},
"output": {
"resultUrl": "https://cdn.ideal.house/output/floor-plan.jpg",
"width": 2496,
"height": 1664
}
}
}
การตอบสนองกำลังประมวลผล#
{
"code": 0,
"message": "success",
"data": {
"id": 1234567890123456789,
"status": "Processing",
"waitNumber": 1,
"percentage": 45,
"input": {
"bedrooms": 4,
"bathrooms": 2,
"totalArea": "200 m²",
"modelType": "Pro"
},
"output": null
}
}
การตอบสนองงานล้มเหลว#
{
"code": 0,
"message": "success",
"data": {
"id": 1234567890123456789,
"status": "Failed",
"waitNumber": 0,
"percentage": 0,
"input": {
"bedrooms": 4,
"bathrooms": 2,
"totalArea": "200 m²",
"modelType": "Pro"
},
"output": null
}
}
ฟิลด์ผลลัพธ์#
| ฟิลด์ | ประเภท | คำอธิบาย |
|---|---|---|
id | long | ID งาน |
status | string | สถานะงานปัจจุบัน |
waitNumber | integer | จำนวนงานที่อยู่ข้างหน้าในคิว; 0 หมายถึงไม่มีงานในคิวข้างหน้า |
percentage | integer | เปอร์เซ็นต์ความเสร็จสิ้นโดยประมาณจาก 0 ถึง 100 |
input | object | อินพุตงานที่ปรับมาตรฐานแล้ว รวมถึงช่วงห้องนอนที่คำนวณอัตโนมัติเมื่อเหมาะสม |
output | object / null | ผลลัพธ์ที่สร้างเมื่องานสำเร็จ; มิฉะนั้นโดยปกติเป็น null |
output.resultUrl | string | URL ที่ลงนามของภาพแปลนชั้นที่สร้าง |
output.width | integer | ความกว้างผลลัพธ์ในพิกเซล |
output.height | integer | ความสูงผลลัพธ์ในพิกเซล |
📊 สถานะงาน#
| สถานะ | คำอธิบาย |
|---|---|
Unprocessed | งานถูกสร้างแล้วแต่ยังไม่เริ่ม |
Processing | กำลังประมวลผลงาน |
Success | งานเสร็จสิ้นและ output.resultUrl พร้อมใช้งาน |
Failed | งานล้มเหลว |
Termination | งานถูกขัดจังหวะหรือยุติ |
ตรวจสอบสถานะทุก 3–5 วินาที ดู ขีดจำกัดงาน API
❌ การตอบสนองข้อผิดพลาด#
การตอบสนองข้อผิดพลาดทั้งหมดใช้โครงสร้างการตอบสนองทั่วไป:
{
"code": 1011,
"message": "bedroomAreaRanges size must match bedrooms",
"data": null
}
| รหัส | ชื่อ | คำอธิบาย | การดำเนินการที่แนะนำ |
|---|---|---|---|
1001 | FAILED | คำขอล้มเหลวทั่วไป | ตรวจสอบฟิลด์ message |
1003 | INTERNAL_ERROR | ข้อผิดพลาดเซิร์ฟเวอร์ภายใน | ลองใหม่ภายหลัง; ติดต่อฝ่ายสนับสนุนหากยังคงอยู่ |
1011 | PARAM_ERROR | พารามิเตอร์คำขอไม่ถูกต้อง | ตรวจสอบจำนวน, หน่วย, ค่า enum และอาร์เรย์แบบฝังตัว |
5002 | API_KEY_INVALID | คีย์ API ไม่ถูกต้องหรือไม่พบ | ตรวจสอบ header APIKEY |
9010 | SCAN_TEXT_ERROR | คำสั่งล้มเหลวในการตรวจสอบเนื้อหา | แก้ไขคำสั่ง |
9038 | PROHIBITED_CONTENT | ผลลัพธ์ที่สร้างมีเนื้อหาต้องห้าม | ปรับอินพุตและลองใหม่ |
9051 | COINS_NOT_ENOUGH | เครดิตไม่เพียงพอ | เพิ่มเครดิตและลองใหม่ |
ดู เอกสารอ้างอิงรหัสข้อผิดพลาด สำหรับรายการข้อผิดพลาดทั่วไปทั้งหมด
🔄 หมายเหตุการรวมระบบ Web#
แอปพลิเคชัน Web ที่รับรองความถูกต้องแล้วและ API สาธารณะใช้จุดปลายทางและวิธีการรับรองความถูกต้องที่แตกต่างกัน:
| ไคลเอนต์ | จุดปลายทาง | การรับรองความถูกต้อง |
|---|---|---|
| แอปพลิเคชัน Web | POST /floorPlan/generate | หัวข้อ token สำหรับเข้าสู่ระบบ |
| API สาธารณะ | POST /api/v1/floorPlan/generate | หัวข้อ APIKEY |
รูปร่างฟิลด์ธุรกิจสอดคล้องกัน แต่ไคลเอนต์ API สาธารณะควรปฏิบัติตามขีดจำกัดฝั่งเซิร์ฟเวอร์และสัญญาสาธารณะในเอกสารนี้ โดยเฉพาะ:
- ไคลเอนต์ Web อาจรวม
imageNumbersและextDataภายใน; ไคลเอนต์สาธารณะไม่จำเป็นต้องมี - API สาธารณะกำหนดเมทาดาทาการเรียก API จากจุดปลายทางและข้อมูลรับรอง ฟิลด์คำขอเช่น
isApiCallและgenByMemberไม่จำเป็น balconยอมรับเพื่อเข้ากันได้และปรับให้เป็นbalcony; การรวมระบบใหม่ควรส่งbalcony- ขีดจำกัดเซิร์ฟเวอร์สาธารณะปัจจุบันยังคงเป็น
0–5ห้องนอนและ0.5–4ห้องน้ำ แม้ UI อื่นจะแสดงตัวเลือกที่กว้างขึ้นชั่วคราว