Claude Code สลับโมเดลโดยไม่แสดงบนหน้าจอ — บรรทัดตั้งค่าเพียงบรรทัดเดียวที่ทำลาย "การตรวจสอบต้องอยู่บนโมเดลสูงสุด" ค้นพบจากการอ่านสเปกครบทั้ง 789 บรรทัด
บทนำ
ในฐานะนโยบายการทำงานของผู้ช่วย AI เขียนโค้ด ฉันได้กำหนดไว้ว่า “ใช้โมเดลสูงสุดได้อย่างเต็มที่สำหรับการตัดสินเชิงออกแบบและงานตรวจสอบ อย่าลดระดับลงด้วยเหตุผลเรื่องต้นทุน” นโยบายนั้นกับบรรทัดเดียวที่ค้างอยู่ในไฟล์คอนฟิกมานาน — การตั้งค่าที่ระบุว่าจะไปไหนเมื่อโมเดลไม่ว่าง — แท้จริงแล้วขัดแย้งกันโดยตรง และฉันไม่รู้ตัวจนกระทั่งได้อ่านสเปกทางการเรื่องการสลับโมเดลจนจบ
ครั้งแรกที่ฉันเปิดเอกสารนั้น ฉันอ่านผ่าน ๆ เฉพาะส่วนที่ดูจำเป็นแล้วก็หยุด ครั้งนี้ฉันอ่านทั้งหมดราว 789 บรรทัดจนจบ และตรวจดูว่าในส่วนที่ฉันเคยหยุดไว้นั้นเขียนอะไรไว้บ้าง
ขอบเขตที่ฉันหยุดไว้ตอนอ่านแค่บางส่วน
รอบแรกฉันยืนยันเพียงความลึกของการคิดตั้งต้นของแต่ละโมเดล (effort) และการจัดการหน้าต่างบริบท แล้วก็จบตรงนั้น
The default effort is
highon every model that supports effort, except Opus 4.7, which defaults toxhigh.
On the Anthropic API, [the supported model set] always run with the 1M window.
ฉันอ่านไปได้แค่นั้น แต่พักบทที่ว่าด้วย รายการโมเดลที่องค์กรอนุญาตและกลไก fallback chain และเรื่อง ตัวแปรสภาพแวดล้อมกับการตั้งค่าแคชพรอมป์ต เอาไว้ ฉันรู้ตัวว่ามีขอบเขตที่ยังไม่ได้อ่าน จึงทำเครื่องหมายไว้ชัดเจนว่ายังไม่อ่าน แล้วย้ายไปทำงานชิ้นถัดไป
การอ่านส่วนที่เหลือทำให้เจอเส้นทางการสลับที่มองไม่เห็น
หลายวันต่อมาฉันอ่านขอบเขตที่เหลือจนจบ สิ่งที่สะดุดตาก่อนคือประโยคที่บอกว่ากลไกการสลับโมเดลอัตโนมัติ ไม่ปรากฏบนหน้าจอ
Claude Code doesn’t confirm the chain at startup and
/statusdoesn’t display it. The notice shown when a switch happens is the first visible sign that a fallback is configured.
มีกลไกที่สลับไปยังโมเดลสำรองโดยอัตโนมัติเมื่อโมเดลหลักใช้ไม่ได้ — ไม่ว่าง หรือใช้งานไม่ได้ด้วยเหตุอื่น แต่การตั้งค่านั้นไม่ถูกแสดงทั้งตอนเริ่มต้นและด้วยคำสั่งตรวจสถานะ: การแจ้งเตือน ณ วินาทีที่การสลับเกิดขึ้นจริง คือหนทางเดียวที่จะมองเห็นมัน
The switch lasts for the current turn only, so your next message tries the primary model first again.
การสลับจะย้อนกลับหลังจากบทสนทนาเดียว ซึ่งหมายความว่าถ้าคุณพลาดการแจ้งเตือนนั้นไป ก็ไม่มีทางรู้ทีหลังได้เลยว่าบทสนทนานั้นเพียงรอบเดียวถูกตอบโดยโมเดลอื่น
เส้นทางการสลับอีกเส้น — มันทำงานได้จากเนื้อหาของบทสนทนาเพียงอย่างเดียว
การอ่านต่อไปแสดงให้เห็นว่าโมเดลสลับได้ผ่านการตัดสินความปลอดภัยอัตโนมัติด้วย
When a classifier flags a request and the flagged category has a fallback model, Claude Code re-runs the request on that model and shows a notice in the transcript.
Fallback can trigger on the first request of a session, before you send anything unusual, because the first request carries workspace context such as your CLAUDE.md content and git status. A repository that contains security or biology material can trip the classifier on that context alone.
เพียงแค่ทำงานอยู่ในรีโปที่มีเนื้อหาเกี่ยวกับความปลอดภัย ก็หมายความว่า การตัดสินนี้ทำงานได้ตั้งแต่บทสนทนาแรกของเซสชัน ก่อนที่คุณจะส่งอะไรที่ผิดปกติด้วยซ้ำ และเมื่อมันทำงานแล้ว เซสชันก็จะรันบนโมเดลที่ถูกสลับไปต่อจนกว่าคุณจะย้อนกลับเอง
After a fallback, the session continues on the fallback model. To return to your original model, run
/model.
การตั้งค่าเพื่อหยุดการสลับอัตโนมัตินั้นและเปลี่ยนเป็น “ให้ฉันเลือกเองทุกครั้ง” อยู่ในสเปกฉบับเดียวกัน
To decide what happens each time a request is flagged, rather than switching automatically, run
/configand turn off Switch models when a message is flagged, or setswitchModelsOnFlagtofalse.
วัดการตั้งค่าของตัวเอง
แทนที่จะพอใจกับการสันนิษฐาน ฉันตรวจส่วนที่เกี่ยวข้องของไฟล์คอนฟิกจริง (วัดเมื่อ 2026-08-24 ค่าที่เจาะจงกับการอิมพลีเมนต์ถูกตัดออกเพราะไม่เกี่ยวข้องในที่นี้)
{
"fallbackModel": ["sonnet", "haiku"],
"switchModelsOnFlag": false,
"autoCompactWindow": 200000
}
fallbackModel ตั้งโมเดลสำรองไว้ลึกสองชั้น ก่อนอ่านสเปก ฉันอธิบายไม่ได้เลยว่าการตั้งค่านั้นถูกใส่เข้ามาเมื่อไหร่หรือด้วยการตัดสินของใคร ข้าง ๆ นโยบายที่ประกาศไว้ว่า “ไม่เสียดายค่าใช้จ่ายกับโมเดลสูงสุดสำหรับการตรวจสอบและการตัดสินเชิงออกแบบ” กลับมีการตั้งค่าที่สลับไปโมเดลต่ำกว่าอย่างเงียบ ๆ เมื่อระบบไม่ว่าง การวัดยังยืนยันด้วยว่า switchModelsOnFlag ถูกตั้งเป็น false อยู่แล้ว (ฝั่งที่ถามทุกครั้งแทนการสลับอัตโนมัติ)
แผนภาพ — สลับที่ไหน ด้วยอะไร และไปโมเดลใด
กำลังสนทนาอยู่บนโมเดลหลัก
│
├─▶ เส้นทางที่ ①: โมเดลหลักไม่ว่างหรือใช้งานไม่ได้
│ └─ สลับไป fallback chain (โมเดลสำรองที่ตั้งไว้) เฉพาะบทสนทนานั้น
│ └─ ไม่ถูกแสดงทั้งตอนเริ่มต้นและด้วยคำสั่งตรวจสถานะ (ทางการ)
│ └─ หนทางเดียวที่มองเห็นคือ "การแจ้งเตือน ณ วินาทีที่สลับ"
│ └─(เส้นย้อนกลับ)→ บทสนทนาถัดไปย้อนกลับไปโมเดลหลักอัตโนมัติ
│
└─▶ เส้นทางที่ ②: การตัดสินความปลอดภัยอัตโนมัติตอบสนองต่อเนื้อหาของบทสนทนา
└─ ทำงานได้จากบทสนทนาแรกของเซสชันเพียงอย่างเดียว (ซึ่งพาข้อมูลไดเรกทอรีทำงานไปด้วย)
└─ เมื่อทำงานแล้ว เซสชันจะรันบนโมเดลสำรองนั้นต่อจนกว่าจะย้อนกลับเอง
└─ จะสลับอัตโนมัติหรือถามทุกครั้ง ตั้งค่าได้ (ทางการ)
└─ วัดแล้ว: ตั้งไว้ที่ฝั่งถามทุกครั้ง
การไหลแนวตั้งคือ “จากบทสนทนาบนโมเดลหลัก ผ่านการสลับ แล้วย้อนกลับ” กิ่งแนวนอนคือเงื่อนไขการทำงาน 2 ข้อ “ไม่ว่าง หรือการตัดสินความปลอดภัย” และการซ้อนที่ด้านล่างคือวงวนของการเลือกควบคุมแบบอัตโนมัติหรือแบบมือ ที่ตรวจสอบไขว้กับการตั้งค่าจริงของฉัน
อะไรที่ชัดเจนแล้ว และอะไรที่ยังไม่
การอ่านครบทั้ง 789 บรรทัดทำให้ยุติได้ 3 ประเด็น
| สิ่งที่ตรวจ | ผล |
|---|---|
| การไม่มีการแจ้งเตือนบนหน้าจอเรื่องการสลับโมเดล เป็นความล้มเหลวของการสังเกตหรือเป็นไปตามสเปก | เป็นไปตามสเปก โดยการออกแบบแล้ว การแจ้งเตือนปรากฏเฉพาะ ณ วินาทีที่สลับ |
| การสลับโมเดลจากการตัดสินความปลอดภัย ทำงานได้จากเนื้อหาของบทสนทนาเพียงอย่างเดียวหรือไม่ | ทำงานได้ (ระบุอย่างเป็นทางการ) แต่ยังไม่ได้ยืนยันกรณีที่มันทำงานจริง |
| สภาพแวดล้อมของฉันตั้งไว้ที่การสลับอัตโนมัติหรือการถามทุกครั้ง | ตั้งไว้ที่ฝั่งถามทุกครั้ง (ยืนยันด้วยการวัด) |
ในทางกลับกัน การตั้งค่า fallback ตอนไม่ว่างนั้นถูกใส่เข้ามาเมื่อไหร่และเพื่ออะไร ไม่ได้ชัดเจนขึ้นจากการอ่านรอบนี้เพียงอย่างเดียว การอ่านสเปกกับการตามรอยประวัติของสภาพแวดล้อมตัวเองเป็นคนละงานกัน และฉันยังไม่ได้เริ่มงานหลัง ส่วนที่ว่านโยบายนั้นกับการตั้งค่านี้เคยชนกันจริงไปกี่ครั้ง ก็จะยุติไม่ได้เช่นกัน หากไม่ย้อนกลับไปดูล็อกการแจ้งเตือน — เรื่องนั้นก็จะเขียนลงไปก็ต่อเมื่อวัดแล้วเท่านั้น
สไตล์เอาต์พุตของ Claude Code ไม่ถูกสืบทอดไปยัง subagent — สเปกทางการ และการตรวจสอบด้วยการใช้งานจริง
สิ่งที่ใหญ่กว่าสิ่งที่การอ่านจนจบทำให้ชัดเจน คือ การที่มันขีดเส้นให้เห็นชัดว่าการอ่านจนจบนั้นไม่ได้ทำให้อะไรชัดเจนบ้าง สเปกบอกคุณได้แค่ว่าอะไรเกิดขึ้นได้ ส่วนมันเกิดขึ้นจริงกี่ครั้งในสภาพแวดล้อมของคุณ ไม่ได้อยู่ในสเปก แต่อยู่ฝั่งล็อกการแจ้งเตือน