เรื่องนี้เป็นเรื่องเล็กๆ ที่ผมไม่ได้ตั้งใจจะแก้ตอนแรกครับ — ทิม (AI Agent ของผม) เคยใส่ปุ่ม voice typing ใน Tim Chat ให้ผมพูดแทนพิมพ์ไทย ใช้ไปได้พักนึง ผมก็โพสต์อวดไปแล้ว — แต่พอลูกค้า Newton ฝั่ง EN เริ่มใช้กันจริง ก็โผล่ปัญหาหนึ่งขึ้นมา ที่ผมไม่ได้คิดมาก่อนเลย

ลูกค้าบางคน "ไม่ได้อยากพิมพ์เป็นภาษาอังกฤษ"

มีลูกค้าคนนึงเขาเป็น indie hacker ที่ใช้ Tim Chat รัน business ของเขา ภาษาแม่เขาเป็นภาษาสเปน เปิด voice typing ขึ้นมาบ่นใส่ทิม — Web Speech API ทับเป็น en-US ทุกครั้ง พูดสเปนออกมาเป็นภาษาอังกฤษมั่ว ผมบ่นใส่ทิมไปเช้านึง บ่ายเดียวก็จบ — Newton ตอนนี้มีดรอปดาวน์ 24 ภาษาให้ลูกค้าเลือกเองในแดชบอร์ด แถม sync เข้าไปใน .env ของ VPS ลูกค้าผ่าน SSH ให้ด้วยเลย

ทำไม voice typing ของลูกค้าถึงทับเป็นภาษาเดียว

ย้อนกลับไปตอนทิม build voice typing ครั้งแรก — มันใช้ webkitSpeechRecognition ของ browser เปิดมาเลือกภาษาตามนี้

"ถ้า navigator.language ขึ้นต้นด้วย th → ใช้ th-TH, ที่เหลือทั้งหมด → en-US"

ตอนนั้น mental model ของผมคือ — "ลูกค้า Newton TH = พิมพ์ไทย, ลูกค้า Newton EN = พิมพ์อังกฤษ" จบ ไม่ต้องคิดต่อ 555

แต่จริงๆ ลูกค้า Newton ฝั่ง EN ไม่ใช่ทุกคนพูดอังกฤษเป็นภาษาแม่ครับ — มีคนยุโรป มีคน LATAM มีคนเอเชียที่ใช้ Tim Chat เป็น primary tool ในการบริหารธุรกิจ พิมพ์อังกฤษได้ แต่พูดอังกฤษไม่ถนัด เปิด voice typing แล้วอยากพูดภาษาแม่ออกมาก่อน แล้วค่อยให้ทิมตอบกลับเป็นอังกฤษ

เพราะเรา hardcode lang ของ Web Speech API ไว้ก่อน .start() เลย browser แม้แต่รู้ภาษาที่เขาพูดอยู่ก็ไม่ recognize ให้ — มันก็จะ guess เป็นอังกฤษมั่วๆ ออกมา

บอกทิมแค่ "ลูกค้าอยากเลือกภาษา voice typing เอง"

ผมเปิด Tim Chat แล้วพิมพ์ไปแค่ว่า "ลูกค้า Newton EN คนนึงพูดสเปน เขาอยากเลือกภาษา voice typing ของตัวเอง ทำไงดี"

ทิมถามกลับมา 2 ข้อก่อน —

  1. ของลูกค้า TH ที่ใช้ th-TH อยู่แล้ว — ต้องไม่เปลี่ยนพฤติกรรมเดิมใช่ไหม?
  2. UI ที่ลูกค้าเลือก — อยากให้อยู่ใน profile page หรือเป็นปุ่มในตัว chat?

ผมตอบไปว่า — "TH เดิมเก็บไว้, ใส่ใน profile page พอ ไม่อยากให้ขึ้นทุกครั้งในแชท" จบ ทิมเริ่ม implement

สิ่งที่ทิม build ให้ใน 1 บ่าย

ทิมเริ่มแก้จากชั้น DB ขึ้นมา —

1. คอลัมน์ใหม่ voice_lang ใน customers table เก็บ BCP-47 code (เช่น th-TH, es-ES, ja-JP, vi-VN ฯลฯ) ถ้าเป็น NULL = ปิด voice typing หรือใช้ค่า browser default

2. Backfill ลูกค้า TH ทั้งหมดเป็น th-TH ระหว่าง startup migration เพื่อรักษาพฤติกรรมเดิม — ลูกค้าไทยเปิด Tim Chat มา voice typing ยังเป็นไทยอยู่เหมือนเดิม ไม่ต้องเข้าไป config อะไร ตอน signup ใหม่ก็ default th-TH ให้สำหรับฝั่ง TH และ NULL สำหรับฝั่ง EN

3. Dropdown 24 ภาษาในแดชบอร์ด เป็น dropdown ที่ search ได้ มีตั้งแต่ en-US, en-GB, es-ES, es-MX, pt-BR, fr-FR, de-DE, it-IT, ja-JP, ko-KR, zh-CN, zh-TW, vi-VN, id-ID, tl-PH, ar-SA, hi-IN ฯลฯ — รวมตัวเลือก None สำหรับคนที่ไม่อยากเปิด voice typing เลย

4. Validation ฝั่ง backend ด้วย regex [A-Za-z0-9-]{2,12} เพื่อให้ลูกค้าจะ POST ค่าอะไรขึ้นมา ก็ไม่สามารถ inject SQL หรือ shell command ผ่านช่องนี้ได้ (เพราะค่านี้ต้องเอาไปยิงเข้า .env บน VPS ของลูกค้าจริง)

5. Auto-sync ไป VPS ผ่าน SSH ทันทีตอนกดบันทึก นี่คือส่วนที่ผมชอบที่สุดในงานนี้ — แดชบอร์ดของผม (ที่ Newton control plane) ไม่ได้อยู่บน VPS ของลูกค้านะครับ มันเป็นคนละ server กัน ตอนลูกค้ากดบันทึก voice language ใหม่ใน control plane → ระบบจะ SSH เข้า VPS ของเขา → sed หรือ append บรรทัด VOICE_LANG=es-ES เข้าไปใน /opt/newton/.envsystemctl restart newton ให้อัตโนมัติ

ลูกค้าไม่ต้อง SSH เอง ไม่ต้องเข้าไปแก้ไฟล์ .env เอง ไม่ต้อง restart service เอง — กดบันทึกในแดชบอร์ดเสร็จ ภายในไม่ถึง 10 วินาที Tim Chat ใน VPS ของเขาก็ฟัง voice typing เป็นภาษาใหม่ทันที

ทดสอบเสร็จในเย็นเดียวกัน

ผมส่งให้ลูกค้าคนนั้นทดลองก่อน 1 คน — เขาตอบกลับมาตอนตื่นเช้าวันรุ่งขึ้นว่า "Pond, this is unreal — I can finally just speak Spanish to my agent"

หลังจากนั้นผมประกาศ feature ใหม่นี้ในกลุ่มลูกค้า EN ทั้งหมด ภายในอาทิตย์เดียวมีคนเข้าไปเปลี่ยน voice_lang ของตัวเองเป็นภาษาอื่นที่ไม่ใช่อังกฤษอยู่ ~30% ของ active users — เกินกว่าที่ผมคิดเยอะมาก

ฝั่ง TH? ไม่มีใครรู้ด้วยซ้ำว่ามี feature นี้ 555 — เพราะ default th-TH backfill ไปแล้ว ลูกค้าไทยเปิดเข้ามาก็พูดไทยได้ปกติ ไม่ต้องไปแตะอะไร

เรื่องเล็กๆ ที่ SaaS ทั่วไปไม่ค่อยทำให้

ลองคิดดูครับ ถ้าผมใช้ AI chat SaaS เจ้าใหญ่อยู่ตอนนี้ แล้วบ่นว่า "voice typing ของฉันต้องเลือกภาษาเองได้นะ" — เขาก็จะตอบกลับมาว่า "ขอบคุณสำหรับ feedback เราจะส่งให้ทีม product พิจารณา" แล้วก็จบ ไม่มีอะไรเกิดขึ้นอีก 6 เดือน 1 ปี

เพราะลูกค้า "1 คนพูดสเปน" สำหรับเขามันคือ edge case — เขาให้ความสำคัญกับ feature ที่ลูกค้า 10,000+ คนต้องการก่อน ไม่ใช่ edge case ของผม

แต่ Newton ของผมไม่ได้คิดแบบนั้นครับ — Tim Chat ที่อยู่ใน server ของลูกค้า มันเป็น product ของ "ลูกค้าคนนั้นคนเดียว" — มีปัญหาอะไร AI Agent แก้ให้ทันที ไม่ต้องรอ roadmap ไม่ต้อง vote feature

เหมือนตอนผมขอให้ทิมเลิกตั้งเวลาโพสต์เอง เปลี่ยนเป็น draft ให้กดเอง — บ่ายเดียวเปลี่ยน หรือวันที่ FB API ด่าผมด้วย error 2654 — 30 นาทีจบ ทุก feature เกิดจาก use case จริงของผม ไม่ใช่ template

หรือวันที่ voice typing บนมือถือพิมพ์ข้อความซ้ำ 5 รอบ — ทิมเปิด console.log บนมือถือ debug จนเจอว่า Chrome ส่ง event.results สะสมตั้งแต่ session start แก้ได้ใน 2 บรรทัด — bug แบบนี้ SaaS ทั่วไปไม่มีทาง ship fix ให้คุณภายในวันเดียวเลย

มันคือสิ่งที่ Newton อยากเป็น

Newton ไม่ใช่ AI chat ที่ใหญ่ที่สุด ฉลาดที่สุด หรือถูกที่สุดในตลาดครับ — แต่มันเป็น AI Agent ที่เป็นของคุณคนเดียวจริงๆ อยู่ใน server ของคุณ ทำงานกับธุรกิจของคุณ ปรับ feature ได้ตามที่คุณบ่น

คำถามที่พบบ่อย

Web Speech API รองรับหลายภาษาอัตโนมัติได้ไหม?

ไม่ครับ Web Speech API ต้องตั้ง recognition.lang ก่อนเรียก .start() เช่น th-TH หรือ es-ES มันจะ recognize ได้แค่ภาษาเดียวตลอด session ถ้าผู้ใช้พูดภาษาอื่น จะออกมาเป็นเสียงเดาผิด ต้องสร้าง UI ให้ผู้ใช้เลือกภาษาเองและ sync ค่านั้นไปใช้ก่อน .start()

จะ deploy การตั้งค่าของผู้ใช้บน server ลูกค้าอีกเครื่องได้ยังไง?

ถ้า control plane และ VPS ของลูกค้าเป็นคนละ server กัน เวลาลูกค้าบันทึกการตั้งค่า ระบบต้อง SSH เข้า VPS ของลูกค้า แก้ค่าใน .env ไฟล์ แล้ว restart service ให้อัตโนมัติครับ ลูกค้าจึงไม่ต้องรู้เรื่อง SSH เลย แค่กดบันทึกในแดชบอร์ดก็เสร็จ

SaaS ทั่วไปกับ AI Agent ส่วนตัวต่างกันยังไงเรื่อง feature request?

SaaS ทั่วไปให้ความสำคัญกับ feature ที่ลูกค้าส่วนมากต้องการ edge case ของลูกค้า 1 คนมักรอนานหรือไม่ได้เลยครับ แต่ AI Agent บน server ส่วนตัวทำงานกับธุรกิจของคุณคนเดียว feature ที่คุณต้องการทำได้ทันทีโดยไม่ต้องรอ roadmap

การ backfill ค่า default สำหรับผู้ใช้เดิมทำยังไง?

ตอนเพิ่ม feature ใหม่ที่มี default value ที่ชัดเจน ควรรัน migration ตั้งค่า default ให้ผู้ใช้เดิมทันทีครับ เช่น ลูกค้าไทยที่ใช้ voice typing อยู่แล้วให้ backfill เป็น th-TH เพื่อรักษาพฤติกรรมเดิม ผู้ใช้จะไม่รู้ว่ามี feature ใหม่และไม่ต้องเข้าไปตั้งค่าเอง

ถ้าคุณก็อยากมี AI Agent ส่วนตัวที่ปรับ feature ตามที่คุณต้องการได้ทันที — ไม่ว่าจะเป็น voice typing 24 ภาษา หรือ feature เฉพาะธุรกิจของคุณเอง — ลอง Newton ดูครับ ระบบ auto-provision ของผมจะ setup server + Tim Chat พร้อมใช้ให้คุณภายใน 10 นาที จากนั้นบอก AI Agent ว่าคุณอยากได้อะไรเพิ่ม — มันสร้างให้เลย

— ปอนด์