สิ่งที่เปลี่ยนในคำตอบ API (รอบ 4–6 กันยายน 2569)

สำหรับทีม dev · อ้างอิง DOCTYPE_RESPONSE_REFERENCE.md (regenerate 6/9) และหน้า /schemas

สรุปหนึ่งบรรทัด

เส้นทาง วิธีเรียก และการยืนยันตัวตนไม่เปลี่ยน (v1 31 เส้น · legacy 5 เส้น เท่าเดิม) · การเปลี่ยนแปลงทั้งหมดอยู่ในคำตอบและเป็นแบบ "เพิ่มเข้า" — key เดิมยังอยู่ครบ · มี 2 พฤติกรรมที่ต้องอ่านให้ดี (ข้อ 4 และ 5)

1. เปลือกนอกของ GET /api/v1/jobs/{id} (และ GET /api/jobs/{id})

key เดิม ตอนนี้
needs_review null true/false ทุกงานที่ done (กติกาเดียวกับ payload ของ webhook)
review_reasons null รายการเหตุผล (ดูข้อ 2)
model_used · pages[].ocr_model · extraction._model ชื่อโมเดลภายใน ชื่อกลาง เช่น "AI Gateway OCR" "AI Gateway Local" "AI Gateway Semantic" — อย่าผูกโค้ดกับชื่อโมเดล

2. เหตุผลใน review_reasons (ค่าใหม่)

ค่า ความหมาย ควรทำอะไร
extraction_warnings มี extraction._warnings อย่างน้อยหนึ่งฟิลด์ (ดูข้อ 4) อ่าน _warnings แล้วให้คนตรวจฟิลด์นั้น
fields_withheld มี extraction._rejected — ระบบอ่านได้ค่าที่ไม่น่าเชื่อถือจึงไม่ส่ง (ค่าดิบและเหตุผลอยู่ใน _rejected) แสดงให้คนตรวจ
ocr_runaway OCR หน้าใดหน้าหนึ่งอ่านวนซ้ำ (เกิน 20,000 ตัวอักษร) แม้พยายามอ่านซ้ำแล้ว ข้อความหน้านั้นเชื่อถือไม่ได้
ocr_sparse เอกสารประเภทข้อความหนักแต่อ่านได้น้อยมากและคุณภาพภาพถูกตัดสินว่า reject สแกนใหม่
ocr_engine_fallback หน้านั้นอ่านด้วยเอนจินสำรอง (เอนจินหลักตาย) คุณภาพอาจต่างจากปกติ
ocr_cloud_fallback หน้านั้นอ่านด้วย OCR บน cloud แทนเอนจินหลัก คุณภาพอาจต่างจากปกติ
validation_failed · low_classify_confidence · doc_type_unknown · suspected_hallucination เหมือนเดิม

3. key ใหม่ใน extraction และ pages[]

key อยู่ที่ ความหมาย
_fill extraction ฟิลด์ที่ว่างจากตัวสกัดหลักแล้วถูกเติมโดย tier เสริม: asked filled[] empties[] dropped_ungrounded[] skipped[] tier ms · ค่าที่เติมทุกตัวต้องปรากฏในข้อความ OCR มิฉะนั้นถูกทิ้ง (dropped_ungrounded)
_warnings.<field> extraction คำเตือนต่อฟิลด์ (ข้อ 4)
_rejected.<field> extraction ค่าที่ถูกถอนพร้อม value reason note · เหตุผลใหม่: not_in_document (ค่าไม่มีในข้อความ = โมเดลมโน) registration_equals_request (เลขทะเบียนไปซ้ำเลขคำขอ)
ocr_retry pages[] หน้านี้ถูกอ่านซ้ำเพราะรอบแรกวนซ้ำ: method (structure_prompt) first_chars second_chars still_runaway
text_source = "ocr_structure_retry" pages[] ข้อความหน้านี้มาจากการอ่านซ้ำ (รูปแบบอาจต่างจากปกติเล็กน้อย)
ocr_engine_fallback pages[] {from, reason} เมื่อหน้านี้ถูกอ่านด้วยเอนจินสำรอง

4. พฤติกรรมที่ต้องรู้: เลขที่ต้องเป็น 13 หลัก จะส่งตามที่พิมพ์ในเอกสาร

ใช้กับ trade_reg.registration_number · full_fs.company.tax_id · pnd50.tax_id · boj5.company_tid

ที่อ่านได้ ค่าที่ส่ง _warnings.<field>.reason ฟิลด์ประกอบ
13 หลัก ผ่าน check digit ค่านั้น ไม่มี
13 หลัก check digit ไม่ผ่าน แต่พิมพ์อยู่ในเอกสาร ค่านั้น (ไม่ null แล้ว) checksum_failed <field>_checksum_pass: false
14 หลัก (พิมพ์เกิน) ค่านั้น digits_over_13 digits, over
12 หลัก (พิมพ์ขาด/อ่านตก) และไม่มีสำเนาที่ครบในเอกสาร ค่านั้น digits_under_13 digits, under
12 หลักแต่ระบบเติมหลักที่หายด้วย check digit (ภ.ง.ด.50 / บอจ.5) ค่า 13 หลักที่เติมแล้ว digit_recovered position, digit, value_as_read
ใช้สำเนาที่ครบ 13 หลักในเอกสาร แต่จุดอื่นในใบเดียวกันอ่านได้ขาด/เกิน ค่า 13 หลัก other_copies_off variants[]
ค่าที่ไม่มีในข้อความเลย null (อยู่ใน _rejected reason not_in_document)

ผลต่อโค้ดฝั่งทีม: ถ้ามี validation ว่า "ต้อง 13 หลัก" ให้เปลี่ยนเป็นอ่าน _warnings.<field> ประกอบ ระบบไม่ตัดสินว่าเลขนั้นถูกหรือผิด (นโยบาย: แสดงตามที่เห็น ให้ผู้ใช้ตรวจกับต้นทาง) · note ในทุก warning เป็นภาษาไทยพร้อมแสดงผู้ใช้ได้

5. พฤติกรรมอื่นที่เปลี่ยน

6. ไม่เปลี่ยน

POST /api/v1/extract (ฟอร์ม file external_id applicant_id และตัวเลือกเดิม) · การยืนยันตัวตน · rate limit (ต่อคีย์และต่อ tenant) · webhook event extract.done (payload มี needs_review/review_reasons มาแต่เดิม — ค่าใหม่ตามข้อ 2) · /api/v1/preflight · /api/v1/compare

ตัวอย่าง (ค่าสมมติ)

{
  "status": "done",
  "doc_type": "trade_reg",
  "needs_review": true,
  "review_reasons": ["extraction_warnings"],
  "model_used": "AI Gateway OCR",
  "extraction": {
    "registration_number": "34120000181641",
    "_warnings": {
      "registration_number": {
        "value": "34120000181641", "reason": "digits_over_13", "digits": 14, "over": 1,
        "note": "อ่านได้ 14 หลัก เกิน 1 หลักจาก 13 หลักที่เอกสารประเภทนี้ต้องใช้ · แสดงตามที่พิมพ์ โปรดตรวจกับผู้ออกเอกสาร"
      }
    },
    "_fill": {"tier": "t1", "asked": 2, "filled": ["issuing_office"], "empties": ["issuing_office", "business_type"],
              "dropped_ungrounded": ["business_type"], "skipped": [], "ms": 3100}
  },
  "pages": [{"page_num": 1, "ocr_model": "AI Gateway OCR", "ocr_tier": "t3", "text_source": "ocr",
             "ocr_engine_fallback": null}]
}