[{"data":1,"prerenderedAt":4850},["ShallowReactive",2],{"blogs-2026-10-17-humanizer-skills":3,"next-blog-2026-10-17-humanizer-skills":402,"prev-blog-2026-10-17-humanizer-skills":402,"recommended-blog-2026-10-17-humanizer-skills":414,"related-blog-2026-10-17-humanizer-skills":1641},{"id":4,"title":5,"body":6,"date":396,"description":397,"draft":398,"extension":399,"meta":400,"navigation":401,"next":402,"ogTitle":403,"path":404,"pin":398,"prev":402,"recommends":405,"seo":408,"sitemap":409,"stem":410,"tags":411,"updated":402,"__hash__":413},"content\u002Fblogs\u002F2026-10-17-humanizer-skills.md","เปลี่ยนข้อความสไตล์ AI ให้เป็นธรรมชาติมากขึ้นด้วย Humanizer Skill",{"type":7,"value":8,"toc":384},"minimark",[9,12,15,18,26,31,34,37,62,65,80,83,87,90,96,99,104,107,110,115,117,122,125,129,132,135,140,147,150,153,158,163,168,171,174,179,182,186,189,192,216,219,245,248,251,254,259,262,267,270,274,277,280,283,290,293,296,299,302,305,328,331,334,337,340,343,346,351,356,361,366,369,372,375,378,381],[10,11,5],"p",{},[10,13,14],{},"ช่วงหลังผมใช้ AI ช่วยเขียนและปรับข้อความค่อนข้างบ่อย ทั้งบทความ เอกสาร และข้อความอธิบายต่าง ๆ ปัญหาที่เจอคือ ถึงเนื้อหาจะถูกต้อง แต่บางครั้งอ่านแล้วก็ยังรู้สึกได้ทันทีว่า \"อันนี้ AI เขียน\"",[10,16,17],{},"ไม่ได้หมายความว่า AI เขียนไม่ดีนะครับ แต่รูปแบบการเขียนของโมเดลมักมีนิสัยบางอย่างที่โผล่มาซ้ำ ๆ เช่น ชอบเกริ่นก่อนเข้าประเด็น ใช้คำใหญ่เกินความจำเป็น หรือพยายามจัดทุกอย่างให้ดูเป็นระเบียบมากจนผิดธรรมชาติ",[10,19,20,21,25],{},"ผมเลยลองใช้ Skill ชื่อ ",[22,23,24],"code",{},"humanizer"," เพื่อช่วยตรวจและปรับข้อความพวกนี้อีกชั้นหนึ่ง (ใช้กับภาษาไทยก็ได้ด้วยนะ)",[27,28,30],"h2",{"id":29},"humanizer-ทำอะไร","Humanizer ทำอะไร",[10,32,33],{},"Humanizer เป็น Skill ที่เอาไว้ตรวจรูปแบบการเขียนที่มักพบในข้อความจาก AI แล้วเขียนใหม่ให้อ่านเป็นธรรมชาติมากขึ้น โดยพยายามรักษาความหมายเดิมไว้",[10,35,36],{},"หลักการสำคัญคือ ไม่ได้พยายามทำให้ข้อความ \"ดูเหมือนมนุษย์แบบหลอก detector (aka: AI Slop Detector)\" แต่เน้นแก้ปัญหาด้านสำนวนและโครงสร้างการเขียน เช่น",[38,39,40,44,47,50,53,56,59],"ul",{},[41,42,43],"li",{},"ตัดคำเกริ่นที่ไม่จำเป็น",[41,45,46],{},"ลดประโยคที่พูดซ้ำความหมายเดิม",[41,48,49],{},"แก้โครงสร้างแบบ \"ไม่ใช่แค่ X แต่ยัง Y\"",[41,51,52],{},"ลดคำที่ฟังดูใหญ่เกินเนื้อหา",[41,54,55],{},"ลดการใช้คำอย่าง \"สำคัญ\", \"ทรงพลัง\", \"โดดเด่น\", \"ยกระดับ\" ถ้าไม่ได้เพิ่มข้อมูลจริง",[41,57,58],{},"ทำให้ประโยคสั้นลงเมื่อข้อความเดิมวกไปมา",[41,60,61],{},"ตัดข้อความตกค้างจากสไตล์ chatbot เช่น \"หวังว่าจะช่วยได้นะครับ\" หรือ \"ถ้าต้องการสามารถ...\"",[10,63,64],{},"ตัว Skill เองกำหนดขั้นตอนการทำงานไว้ประมาณนี้",[66,67,68,71,74,77],"ol",{},[41,69,70],{},"อ่านข้อความทั้งหมดก่อน",[41,72,73],{},"หา pattern ที่ดูเป็น AI",[41,75,76],{},"เขียนข้อความใหม่โดยเก็บข้อมูลเดิม",[41,78,79],{},"ตรวจอีกครั้งว่าไม่ได้เพิ่มหรือลดข้อเท็จจริง",[10,81,82],{},"จุดที่ผมชอบคือมันไม่ได้แก้แบบค้นหาคำแล้วแทนคำตรง ๆ แต่พยายามมองทั้งประโยคและย่อหน้า",[27,84,86],{"id":85},"ตัวอย่างง่าย-ๆ","ตัวอย่างง่าย ๆ",[10,88,89],{},"ข้อความก่อนปรับ:",[91,92,93],"blockquote",{},[10,94,95],{},"ระบบนี้ไม่ได้เป็นเพียงเครื่องมือสำหรับตรวจสอบเว็บไซต์ แต่ยังเป็นโซลูชันที่ช่วยยกระดับความปลอดภัยในหลายมิติ ไม่ว่าจะเป็น HTTP Security Headers, SSL\u002FTLS และความพร้อมด้าน PQC ซึ่งทั้งหมดนี้สะท้อนให้เห็นถึงความสำคัญของการเตรียมพร้อมรับมือกับภัยคุกคามทางไซเบอร์ที่เปลี่ยนแปลงอยู่ตลอดเวลา",[10,97,98],{},"หลังปรับ:",[91,100,101],{},[10,102,103],{},"ระบบนี้ใช้ตรวจ HTTP Security Headers, SSL\u002FTLS และความพร้อมด้าน PQC ของเว็บไซต์ เพื่อดูว่ามีจุดไหนที่ควรปรับปรุงด้านความปลอดภัยบ้าง",[10,105,106],{},"ข้อมูลที่ต้องการสื่อยังเหมือนเดิม แต่ข้อความสั้นลง และไม่มีส่วนที่พยายามทำให้เรื่องธรรมดาฟังดูใหญ่เกินไป อีกตัวอย่างหนึ่ง",[10,108,109],{},"ก่อนปรับ:",[91,111,112],{},[10,113,114],{},"สิ่งสำคัญที่ต้องเข้าใจคือ การอัปเดต dependency ไม่ได้เป็นเพียงเรื่องของการเปลี่ยนเวอร์ชันให้ใหม่ขึ้นเท่านั้น แต่ยังเกี่ยวข้องกับความปลอดภัย ประสิทธิภาพ และความเข้ากันได้ของระบบอีกด้วย ดังนั้น การวางแผนและทดสอบอย่างรอบคอบจึงถือเป็นหัวใจสำคัญของกระบวนการนี้",[10,116,98],{},[91,118,119],{},[10,120,121],{},"การอัปเดต dependency มีผลทั้งเรื่องความปลอดภัย ประสิทธิภาพ และความเข้ากันได้ของระบบ จึงควรวางแผนและทดสอบก่อนนำขึ้นใช้งานจริง",[10,123,124],{},"พอตัดประโยคเกริ่นและคำขยายออก ข้อความก็เข้าเรื่องเร็วขึ้นเยอะ และ ลดกลิ่นของ AI Slop ได้ด้วย :3",[27,126,128],{"id":127},"pattern-ที่-humanizer-มองหา","Pattern ที่ Humanizer มองหา",[10,130,131],{},"ใน Skill มีรายการ pattern อยู่หลายข้อ แต่บางอันเจอบ่อยมากเวลาใช้กับภาษาไทย",[10,133,134],{},"อย่างแรกคือประโยคแบบ",[91,136,137],{},[10,138,139],{},"ไม่ได้เป็นเพียง X แต่ยังเป็น Y",[10,141,142,143,146],{},"ภาษาอังกฤษมักเป็นรูปแบบ ",[22,144,145],{},"not just X, but Y"," ซึ่งโมเดลชอบใช้เวลาต้องการเพิ่มน้ำหนักให้ประโยค",[10,148,149],{},"หลายครั้งจริง ๆ แล้วพูด Y ไปตรง ๆ ก็พอ",[10,151,152],{},"อีกแบบคือการเกริ่นก่อนเข้าประเด็น เช่น",[91,154,155],{},[10,156,157],{},"สิ่งสำคัญที่ต้องเข้าใจคือ...",[91,159,160],{},[10,161,162],{},"ประเด็นสำคัญคือ...",[91,164,165],{},[10,166,167],{},"สิ่งที่น่าสนใจคือ...",[10,169,170],{},"ถ้าประโยคถัดไปมีข้อมูลอยู่แล้ว ส่วนเกริ่นมักตัดออกได้เลย",[10,172,173],{},"อีก pattern ที่เห็นบ่อยคือการปิดย่อหน้าด้วยประโยคสรุปซ้ำ เช่น",[91,175,176],{},[10,177,178],{},"นี่จึงเป็นเหตุผลว่าทำไมเรื่องนี้ถึงสำคัญ",[10,180,181],{},"ถ้าย่อหน้าก่อนหน้าอธิบายเหตุผลครบแล้ว ประโยคนี้ไม่ได้เพิ่มข้อมูลอะไร",[27,183,185],{"id":184},"คำบางคำไม่ได้ผิด-แต่-ai-ใช้บ่อยเกินไป","คำบางคำไม่ได้ผิด แต่ AI ใช้บ่อยเกินไป",[10,187,188],{},"อีกส่วนหนึ่งของ Humanizer คือการมองหาคำที่ AI มักหยิบมาใช้ซ้ำ ๆ",[10,190,191],{},"ตัวอย่างในภาษาอังกฤษ เช่น",[10,193,194,197,198,197,201,197,204,197,207,197,210,197,213],{},[22,195,196],{},"crucial",", ",[22,199,200],{},"robust",[22,202,203],{},"pivotal",[22,205,206],{},"showcase",[22,208,209],{},"landscape",[22,211,212],{},"highlight",[22,214,215],{},"enhance",[10,217,218],{},"ถ้าแปลเป็นภาษาไทยก็จะได้อารมณ์ประมาณ",[38,220,221,224,227,230,233,236,239,242],{},[41,222,223],{},"สำคัญอย่างยิ่ง",[41,225,226],{},"แข็งแกร่ง",[41,228,229],{},"มีบทบาทสำคัญ",[41,231,232],{},"ยกระดับ",[41,234,235],{},"สะท้อนให้เห็น",[41,237,238],{},"ภูมิทัศน์",[41,240,241],{},"แสดงให้เห็นถึง",[41,243,244],{},"โดดเด่น",[10,246,247],{},"คำพวกนี้ไม่ได้ผิด และบางบริบทก็เหมาะที่จะใช้",[10,249,250],{},"ปัญหาเกิดตอนที่ข้อความหนึ่งย่อหน้ามีคำลักษณะนี้เต็มไปหมด ทั้งที่เนื้อหาจริง ๆ ค่อนข้างธรรมดา",[10,252,253],{},"เช่น",[91,255,256],{},[10,257,258],{},"Docker เป็นเครื่องมือที่ทรงพลังและมีบทบาทสำคัญในการยกระดับ workflow ของทีมพัฒนา",[10,260,261],{},"อาจเขียนง่าย ๆ ว่า",[91,263,264],{},[10,265,266],{},"Docker ช่วยให้ทีมพัฒนาใช้ environment ใกล้เคียงกันมากขึ้น",[10,268,269],{},"ประโยคหลังบอกสิ่งที่ Docker ทำจริง ๆ ชัดกว่า",[27,271,273],{"id":272},"humanizer-ไม่ใช่-ai-detector","Humanizer ไม่ใช่ AI Detector",[10,275,276],{},"จุดนี้สำคัญ เพราะ Humanizer ไม่ได้เอาไว้ตรวจว่าข้อความถูกเขียนโดย AI หรือมนุษย์",[10,278,279],{},"มันแค่ใช้รายการ pattern ที่มักพบในข้อความจาก LLM แล้วเอามาใช้เป็นแนวทางในการ edit",[10,281,282],{},"คนก็สามารถเขียนแบบเดียวกันได้ และ AI ก็สามารถเขียนโดยไม่มี pattern พวกนี้ได้เหมือนกัน",[10,284,285,286,289],{},"ดังนั้นถ้าเจอคำว่า ",[22,287,288],{},"not just X but Y"," หรือเห็น em dash ก็ไม่ได้แปลว่าข้อความนั้นมาจาก AI",[10,291,292],{},"มอง Humanizer เป็น style editor จะตรงกว่า",[27,294,295],{"id":295},"สิ่งที่ควรระวังเวลาใช้กับภาษาไทย",[10,297,298],{},"Skill นี้ถูกเขียนขึ้นโดยอ้างอิง pattern ภาษาอังกฤษเป็นหลัก ดังนั้นบางกฎเอามาใช้กับภาษาไทยตรง ๆ ไม่ได้ทั้งหมด",[10,300,301],{},"ตัวอย่างเช่นเรื่อง em dash ซึ่งแทบไม่ได้เป็นปัญหาในภาษาไทยอยู่แล้ว",[10,303,304],{},"ขณะเดียวกันภาษาไทยมี pattern ของตัวเองที่ควรเพิ่มเข้าไป เช่น",[38,306,307,310,313,316,319,322,325],{},[41,308,309],{},"การใช้ \"โดย...\" หลายประโยคติดกัน",[41,311,312],{},"\"ซึ่ง...\" ยาวมากจนจำไม่ได้ว่าขยายประโยคไหน",[41,314,315],{},"\"เพื่อให้สามารถ...\" ทั้งที่เขียน \"เพื่อ...\" ได้เลย",[41,317,318],{},"\"มีการดำเนินการ...\" แทนคำกริยาง่าย ๆ",[41,320,321],{},"\"ในส่วนของ...\" ที่ใช้เปิดแทบทุกย่อหน้า",[41,323,324],{},"\"ทั้งนี้...\" และ \"อย่างไรก็ตาม...\" บ่อยเกินไป",[41,326,327],{},"คำทับศัพท์ที่เป็นทางการเกินบริบท",[10,329,330],{},"ถ้าจะใช้ Humanizer กับงานภาษาไทยจริงจัง ผมคิดว่าควรปรับ Skill เพิ่มอีกชุดหนึ่งสำหรับภาษาไทยโดยเฉพาะ",[27,332,333],{"id":333},"ใช้กับงานแบบไหนได้บ้าง",[10,335,336],{},"ผมว่า Humanizer เหมาะกับงานที่เราใช้ AI ช่วยร่างก่อน แล้วต้องการเก็บงานอีกครั้ง เช่น",[10,338,339],{},"บทความ technical, FAQ, documentation, README, รายละเอียดสินค้า, หน้าเว็บไซต์ หรือข้อความอธิบายในระบบ",[10,341,342],{},"โดยเฉพาะงานที่ข้อมูลถูกแล้ว แต่ยังมีความรู้สึกว่า \"อ่านแล้วเป็น ChatGPT\"",[10,344,345],{},"แทนที่จะต้องไล่บอก AI ทุกครั้งว่า",[91,347,348],{},[10,349,350],{},"เขียนให้ธรรมชาติขึ้น",[91,352,353],{},[10,354,355],{},"อย่าใช้คำเว่อร์",[91,357,358],{},[10,359,360],{},"ไม่ต้องเกริ่น",[91,362,363],{},[10,364,365],{},"ไม่ต้องสรุปซ้ำ",[10,367,368],{},"ก็เอากฎพวกนี้รวมไว้ใน Skill แล้วเรียกใช้ซ้ำได้",[27,370,371],{"id":371},"สรุป",[10,373,374],{},"Humanizer ไม่ได้ทำให้ AI กลายเป็นนักเขียนมนุษย์โดยอัตโนมัติ และไม่ได้รับประกันว่าข้อความจะไม่มีใครเดาได้ว่าใช้ AI ช่วยเขียน",[10,376,377],{},"สิ่งที่มันทำได้ดีคือช่วยจับนิสัยการเขียนบางอย่างที่โมเดลชอบใช้ซ้ำ แล้วบังคับให้กลับมาเขียนตรงประเด็นขึ้น",[10,379,380],{},"สำหรับผม วิธีใช้ที่เหมาะที่สุดคือให้ AI ช่วยร่างเนื้อหาก่อน จากนั้นใช้ Humanizer เป็นรอบ edit อีกครั้ง แล้วคนอ่านและแก้รอบสุดท้ายเอง",[10,382,383],{},"แบบนี้ได้ทั้งความเร็วจาก AI และยังรักษาสำนวนของคนเขียนไว้ได้มากกว่าเอาข้อความจาก AI ไปใช้ตรง ๆ",{"title":385,"searchDepth":386,"depth":386,"links":387},"",2,[388,389,390,391,392,393,394,395],{"id":29,"depth":386,"text":30},{"id":85,"depth":386,"text":86},{"id":127,"depth":386,"text":128},{"id":184,"depth":386,"text":185},{"id":272,"depth":386,"text":273},{"id":295,"depth":386,"text":295},{"id":333,"depth":386,"text":333},{"id":371,"depth":386,"text":371},"2026-10-17","ลองใช้ Humanizer Skill ช่วยตรวจและปรับข้อความที่อ่านแล้วดูเป็น AI มากเกินไป เช่น ประโยคซ้ำ คำเกริ่นเยอะ การใช้คำฟุ่มเฟือย หรือโครงสร้างประโยคที่เป็นแพตเทิร์นเดิม ๆ โดยยังคงความหมายของข้อความต้นฉบับไว้",false,"md",{},true,null,"Review blader\u002Fhumanizer Skills","\u002Fblogs\u002F2026-10-17-humanizer-skills",[406,407],"2026-02-08-n8n-skills.md","2026-09-16-headroom.md",{"title":5,"description":397},{"loc":404,"lastmod":396},"blogs\u002F2026-10-17-humanizer-skills",[412],"AI","agxUnJUmILFaPT7oxy7pPhwM61jcUK3CW0uK_LgAj0w",[415,552],{"id":416,"title":417,"body":418,"date":542,"description":543,"draft":398,"extension":399,"meta":544,"navigation":401,"next":402,"ogTitle":437,"path":545,"pin":398,"prev":402,"recommends":402,"seo":546,"sitemap":547,"stem":548,"tags":549,"updated":550,"__hash__":551},"content\u002Fblogs\u002F2026-02-08-n8n-skills.md","เปลี่ยน Claude ให้เป็นเทพ n8n ด้วย n8n-skills",{"type":7,"value":419,"toc":537},[420,431,439,443,479,483,505,508,519,522],[10,421,422,423,426,427,430],{},"ปกติเวลาให้ AI ช่วยเขียน Script หรือออกแบบ Workflow ใน n8n ปัญหาที่เจอบ่อยคือ AI มักจะมั่ว Syntax (เช่นการใช้ ",[22,424,425],{},"{{$json}}"," หรือ ",[22,428,429],{},"return"," แบบผิดๆ) หรือไม่รู้จัก Node ใหม่ๆ ทำให้เราต้องมานั่งแก้เองจนเหนื่อย",[10,432,433,434,438],{},"วันนี้ไปเจอของดีมาครับ ",[435,436,437],"strong",{},"n8n-skills"," จากคุณ czlonkowski เป็นโปรเจกต์ที่รวบรวม \"Skills\" หรือชุดความรู้เฉพาะทางของ n8n เอาไว้ให้เรา Feed เข้าไปใน Claude (ผ่าน Claude Code หรือ MCP Server) เพื่อให้มันกลายเป็นผู้เชี่ยวชาญ n8n แบบทันที",[27,440,442],{"id":441},"features-หลักๆ-ที่น่าสนใจ","Features หลักๆ ที่น่าสนใจ",[38,444,445,461,467,473],{},[41,446,447,450,451,197,454,197,457,460],{},[435,448,449],{},"Expression Syntax Expert:"," สอนให้ AI เข้าใจโครงสร้างตัวแปรของ n8n จริงๆ (เช่น ",[22,452,453],{},"$node",[22,455,456],{},"$env",[22,458,459],{},"$json.body",") ไม่เขียนมั่ว",[41,462,463,466],{},[435,464,465],{},"Workflow Patterns:"," รวม Pattern ยอดฮิตกว่า 5 แบบ (Webhook, API Integration, Database Sync ฯลฯ) ให้ AI ดึงไปใช้ได้เลย",[41,468,469,472],{},[435,470,471],{},"Validation:"," ช่วยตรวจสอบ Error และแนะนำวิธีแก้ปัญหาที่ตรงจุด ไม่ใช่แนะนำแบบกว้างๆ",[41,474,475,478],{},[435,476,477],{},"Node Configuration:"," AI จะเข้าใจ Property ของ Node กว่า 500+ ตัว รู้ว่าช่องไหนต้องกรอกอะไร",[27,480,482],{"id":481},"เหมาะกับใคร","เหมาะกับใคร?",[38,484,485,492,502],{},[41,486,487,488,491],{},"สาย ",[435,489,490],{},"Self-hosting"," ที่รัน n8n เอง แล้วอยากมี AI Assistant เก่งๆ มาช่วย Config",[41,493,494,495,426,498,501],{},"คนที่ใช้ ",[435,496,497],{},"Claude Code",[435,499,500],{},"Claude Desktop"," คู่กับ MCP (Model Context Protocol)",[41,503,504],{},"Dev ที่ขี้เกียจจำ Syntax ยิบย่อยของ n8n",[27,506,507],{"id":507},"วิธีใช้คร่าวๆ",[10,509,510,511,514,515,518],{},"ถ้าใช้ Claude Code ก็แค่รันคำสั่งเพื่อ Install Plugin หรือถ้าใช้ผ่านหน้าเว็บ Claude.ai ก็สามารถ Download ไฟล์ ",[22,512,513],{},".md"," ในโฟลเดอร์ ",[22,516,517],{},"docs\u002Fskills"," ไปโยนให้มันอ่านเป็น Context ได้เลยครับ",[10,520,521],{},"ใครที่ใช้ n8n เป็น Core หลักในการทำ Automation อยู่แล้ว แนะนำให้ลองเอาไปเล่นดูครับ ช่วยลดเวลา Debug ไปได้เยอะมาก",[91,523,524],{},[10,525,526,529,530],{},[435,527,528],{},"GitHub:"," ",[531,532,536],"a",{"href":533,"rel":534},"https:\u002F\u002Fgithub.com\u002Fczlonkowski\u002Fn8n-skills",[535],"nofollow","czlonkowski\u002Fn8n-skills",{"title":385,"searchDepth":386,"depth":386,"links":538},[539,540,541],{"id":441,"depth":386,"text":442},{"id":481,"depth":386,"text":482},{"id":507,"depth":386,"text":507},"2026-02-08","ชุดคำสั่ง (Skills) สำหรับ Claude Code\u002FMCP ที่จะช่วยให้ AI เข้าใจและเขียน n8n Workflow ได้แม่นยำขึ้นแบบก้าวกระโดด",{},"\u002Fblogs\u002F2026-02-08-n8n-skills",{"title":417,"description":543},{"loc":545,"lastmod":542},"blogs\u002F2026-02-08-n8n-skills",[412],"2026-08-09","-V4-PuLT1c8sr3DHyfq84xOfTkWNeeFSutepTMmkScg",{"id":553,"title":554,"body":555,"date":1629,"description":1630,"draft":398,"extension":399,"meta":1631,"navigation":401,"next":402,"ogTitle":1632,"path":1633,"pin":398,"prev":402,"recommends":402,"seo":1634,"sitemap":1635,"stem":1638,"tags":1639,"updated":402,"__hash__":1640},"content\u002Fblogs\u002F2026-09-16-headroom.md","ลองใช้ Headroom บีบ context ก่อนส่งเข้า Claude Code",{"type":7,"value":556,"toc":1611},[557,561,564,573,576,579,583,586,593,596,599,606,609,612,623,626,668,674,677,689,697,700,715,726,729,743,750,762,768,775,800,815,818,821,833,839,845,855,862,888,1050,1064,1067,1070,1076,1105,1191,1200,1203,1206,1209,1212,1218,1224,1230,1236,1242,1245,1248,1258,1261,1266,1272,1275,1286,1289,1294,1297,1300,1306,1309,1315,1321,1324,1327,1330,1336,1339,1342,1348,1357,1362,1365,1368,1381,1384,1388,1394,1403,1409,1416,1423,1440,1444,1447,1450,1453,1468,1471,1486,1492,1498,1502,1511,1514,1531,1534,1537,1540,1543,1545,1548,1551,1554,1557,1560,1563,1566,1574,1578,1607],[27,558,560],{"id":559},"introduction","Introduction",[10,562,563],{},"ใครใช้ Claude Code หรือ Codex เป็นหลัก น่าจะเคยเจอว่า token ไหลเร็วกว่าที่คิด Agent อ่านไฟล์ ยิง grep ดึง log แล้วทั้งหมดก็เข้าไปอยู่ใน context รอบถัดไปก็ส่งต่อไปอีก",[10,565,566,567,572],{},"ช่วงนี้ผมเลยลอง ",[531,568,571],{"href":569,"rel":570},"https:\u002F\u002Fgithub.com\u002Fheadroomlabs-ai\u002Fheadroom",[535],"Headroom"," ซึ่งเป็น proxy ที่คั่นระหว่าง agent กับ provider แล้วช่วยลดขนาด context ก่อนส่งออก ตอนเขียนบทความนี้ repo มีดาวเจ็ดหมื่นกว่า ทั้งที่เพิ่งสร้างเมื่อเดือนมกราคมปีนี้",[10,574,575],{},"ตัวเลขในบทความนี้มาจากการใช้งานจริงหนึ่งวันบนเครื่องผมเอง ใช้ Headroom v0.37.0 คู่กับ Claude Code ส่วน output ที่แปะไว้ก็ก๊อปมาจาก terminal โดยตรง มีตัดบางบรรทัดที่ไม่เกี่ยวออกให้อ่านง่ายขึ้น แต่ไม่ได้แก้ตัวเลข",[10,577,578],{},"ผลที่ได้ต่างจากที่ผมคิดไว้ตอนแรกพอสมควร",[27,580,582],{"id":581},"headroom-คืออะไร","Headroom คืออะไร",[10,584,585],{},"ถ้าอธิบายแบบสั้น ๆ Headroom คือชั้นที่ช่วยลดขนาด context โดยรันอยู่บนเครื่องเราเอง ข้อมูลที่ผ่านมันมีทั้ง tool output, log, ไฟล์, RAG chunk และประวัติแชท",[10,587,588,589,592],{},"ข้างในมีตัวจัดการหลายแบบตามชนิดข้อมูล เช่น SmartCrusher สำหรับ JSON ก้อนใหญ่, CodeCompressor สำหรับโค้ดที่อ่าน AST ได้ 11 ภาษา ได้แก่ Python, JS\u002FTS, Go, Rust, Java, C\u002FC++, C#, PHP และ Perl ส่วนข้อความทั่วไปใช้โมเดลชื่อ ",[22,590,591],{},"kompress-v2-base"," โดยมี ContentRouter คอยเลือกว่าจะส่งข้อมูลไปให้ตัวไหนจัดการ",[10,594,595],{},"CodeCompressor มีเงื่อนไขค่อนข้างเข้ม เอกสารระบุไว้ตรง ๆ ว่าแทบไม่ทำงานในสถานการณ์จริง เพราะมันจะไม่แตะโค้ดที่เพิ่งคุยกันหรือกำลังวิเคราะห์อยู่ เพื่อลดโอกาสที่ข้อมูลสำคัญจะถูกบีบจนเพี้ยน",[10,597,598],{},"จากที่ผมใช้ทั้งวัน มันทำงานแค่ 3 ครั้ง",[10,600,601,602,605],{},"อีกอย่างที่ผมชอบคือข้อมูลเดิมย้อนกลับได้ ของต้นฉบับถูก cache ไว้ในเครื่อง และโมเดลสามารถเรียก ",[22,603,604],{},"headroom_retrieve"," เพื่อขอข้อมูลเต็มกลับมาได้ ถ้าข้อมูลที่ถูกบีบไม่พอใช้งาน",[10,607,608],{},"Headroom ใช้ได้ 4 แบบ คือเรียกเป็น library, รันเป็น proxy, ใช้ wrap agent หรือเสียบเป็น MCP server ผมเลือกแบบ wrap เพราะตั้งค่าง่ายสุด",[27,610,611],{"id":611},"วิธีติดตั้ง",[10,613,614,615,618,619,622],{},"CLI มีเฉพาะบน PyPI ส่วน ",[22,616,617],{},"headroom-ai"," บน npm เป็น TypeScript SDK ไม่มีคำสั่ง ",[22,620,621],{},"headroom"," ให้ใช้",[10,624,625],{},"ต้องใช้ Python 3.10 ขึ้นไป",[627,628,632],"pre",{"className":629,"code":630,"language":631,"meta":385,"style":385},"language-sh shiki shiki-themes material-theme-lighter one-dark-pro github-dark","uv tool install --python 3.13 \"headroom-ai[all]\"\n","sh",[22,633,634],{"__ignoreMap":385},[635,636,639,643,647,650,654,658,662,665],"span",{"class":637,"line":638},"line",1,[635,640,642],{"class":641},"sosa_","uv",[635,644,646],{"class":645},"sAlJX"," tool",[635,648,649],{"class":645}," install",[635,651,653],{"class":652},"sEoV_"," --python",[635,655,657],{"class":656},"snOyU"," 3.13",[635,659,661],{"class":660},"snfNA"," \"",[635,663,664],{"class":645},"headroom-ai[all]",[635,666,667],{"class":660},"\"\n",[10,669,670,671],{},"ผมแนะนำให้ล็อก Python เป็น 3.13 ไปเลย เพราะตัวคำนวณค่าใช้จ่ายของ Headroom ใช้ LiteLLM ซึ่งยังลงบน Python 3.14 ไม่ได้ ถ้าใช้ 3.14 จำนวน token ยังนับได้ตามปกติ แต่ตัวเลขเงินใน dashboard จะค้างที่ ",[22,672,673],{},"$0.00",[10,675,676],{},"เช็กเวอร์ชันก่อน",[627,678,680],{"className":629,"code":679,"language":631,"meta":385,"style":385},"headroom --version\n",[22,681,682],{"__ignoreMap":385},[635,683,684,686],{"class":637,"line":638},[635,685,621],{"class":641},[635,687,688],{"class":652}," --version\n",[627,690,695],{"className":691,"code":693,"language":694,"meta":385},[692],"language-text","headroom, version 0.37.0\n","text",[22,696,693],{"__ignoreMap":385},[10,698,699],{},"จากนั้นสั่ง wrap Claude Code ได้เลย",[627,701,703],{"className":629,"code":702,"language":631,"meta":385,"style":385},"headroom wrap claude\n",[22,704,705],{"__ignoreMap":385},[635,706,707,709,712],{"class":637,"line":638},[635,708,621],{"class":641},[635,710,711],{"class":645}," wrap",[635,713,714],{"class":645}," claude\n",[10,716,717,718,721,722,725],{},"คำสั่งนี้จะเปิด proxy ที่ port 8787 แล้วรัน Claude Code โดยตั้ง ",[22,719,720],{},"ANTHROPIC_BASE_URL"," ให้ชี้เข้าหา proxy พร้อมตั้ง ",[22,723,724],{},"ENABLE_TOOL_SEARCH"," ให้ด้วย",[10,727,728],{},"ถ้าต้องการถอนก็ใช้",[627,730,732],{"className":629,"code":731,"language":631,"meta":385,"style":385},"headroom unwrap claude\n",[22,733,734],{"__ignoreMap":385},[635,735,736,738,741],{"class":637,"line":638},[635,737,621],{"class":641},[635,739,740],{"class":645}," unwrap",[635,742,714],{"class":645},[10,744,745,746,749],{},"ก่อนเริ่มใช้จริงควรรัน ",[22,747,748],{},"doctor"," สักรอบ",[627,751,753],{"className":629,"code":752,"language":631,"meta":385,"style":385},"headroom doctor\n",[22,754,755],{"__ignoreMap":385},[635,756,757,759],{"class":637,"line":638},[635,758,621],{"class":641},[635,760,761],{"class":645}," doctor\n",[627,763,766],{"className":764,"code":765,"language":694,"meta":385},[692],"Headroom Doctor v0.37.0 · port 8787\n\n┃ check       ┃ status ┃ summary                                     ┃\n│ proxy       │ ✓ pass │ running at http:\u002F\u002F127.0.0.1:8787 (up 3m)    │\n│ version     │ ✓ pass │ proxy matches installed v0.37.0             │\n│ claude      │ ✓ pass │ routed via ...                              │\n│ wrap_marker │ ✓ pass │ live wrap session (pid 84723)               │\n│ shell env   │ ✓ pass │ routed via ANTHROPIC_BASE_URL               │\n│ budget      │ ⚠ warn │ no budget configured — spend is unlimited   │\n",[22,767,765],{"__ignoreMap":385},[10,769,770,771,774],{},"ถ้า ",[22,772,773],{},"budget"," ขึ้นเตือนแบบนี้ เราสามารถตั้งเพดานรายวันผ่าน environment variable ได้",[627,776,778],{"className":629,"code":777,"language":631,"meta":385,"style":385},"HEADROOM_BUDGET=10 headroom wrap claude\n",[22,779,780],{"__ignoreMap":385},[635,781,782,786,790,793,796,798],{"class":637,"line":638},[635,783,785],{"class":784},"sLHrO","HEADROOM_BUDGET",[635,787,789],{"class":788},"sMTEB","=",[635,791,792],{"class":645},"10",[635,794,795],{"class":641}," headroom",[635,797,711],{"class":645},[635,799,714],{"class":645},[10,801,802,803,806,807,810,811,814],{},"ส่วน ",[22,804,805],{},"--budget"," ใช้กับคำสั่ง ",[22,808,809],{},"headroom proxy"," ถ้ารัน proxy เอง อย่าเปิดซ้อนกับตัวที่ ",[22,812,813],{},"wrap"," เปิดไว้ เพราะจะชนกันที่ port 8787",[27,816,817],{"id":817},"ตัวเลขหลังใช้หนึ่งวัน",[10,819,820],{},"ดูแบบเร็ว ๆ ได้จาก",[627,822,824],{"className":629,"code":823,"language":631,"meta":385,"style":385},"headroom dashboard\n",[22,825,826],{"__ignoreMap":385},[635,827,828,830],{"class":637,"line":638},[635,829,621],{"class":641},[635,831,832],{"class":645}," dashboard\n",[10,834,835,836],{},"ซึ่งจะเปิด dashboard ที่ ",[22,837,838],{},"127.0.0.1:8787\u002Fdashboard",[10,840,841],{},[842,843],"img",{"alt":385,"src":844},"\u002Fimages\u002F2026-09-16-headroom\u002Fdashboard.png",[10,846,847,848,851,852],{},"ภาพนี้ผมถ่ายทีหลัง ตัวเลขเลยขยับจากค่าที่จะยกมาด้านล่างเล็กน้อย แต่สังเกตช่อง ",[22,849,850],{},"SAVINGS · TOOL SEARCH"," ไว้ เพราะส่วนนี้แยกจาก ",[22,853,854],{},"TOKENS SAVED",[10,856,857,858,861],{},"ถ้าอยากดูตัวเลขดิบ ดึงจาก ",[22,859,860],{},"\u002Fstats"," ได้ตรง ๆ",[627,863,865],{"className":629,"code":864,"language":631,"meta":385,"style":385},"curl -s 127.0.0.1:8787\u002Fstats | jq .summary.compression\n",[22,866,867],{"__ignoreMap":385},[635,868,869,872,875,878,882,885],{"class":637,"line":638},[635,870,871],{"class":641},"curl",[635,873,874],{"class":652}," -s",[635,876,877],{"class":645}," 127.0.0.1:8787\u002Fstats",[635,879,881],{"class":880},"sbGrh"," |",[635,883,884],{"class":641}," jq",[635,886,887],{"class":645}," .summary.compression\n",[627,889,893],{"className":890,"code":891,"language":892,"meta":385,"style":385},"language-json shiki shiki-themes material-theme-lighter one-dark-pro github-dark","{\n  \"requests_compressed\": 129,\n  \"avg_compression_pct\": 1.7,\n  \"best_compression_pct\": 11.8,\n  \"best_detail\": \"15,316 → 13,505 tokens\",\n  \"total_tokens_removed\": 130497,\n  \"total_tokens_before\": 10992312,\n  \"tool_schema_tokens_saved\": 484226,\n  \"total_tokens_saved_all_layers\": 614723\n}\n","json",[22,894,895,901,923,940,957,978,995,1012,1029,1044],{"__ignoreMap":385},[635,896,897],{"class":637,"line":638},[635,898,900],{"class":899},"stlKB","{\n",[635,902,903,907,911,914,917,920],{"class":637,"line":386},[635,904,906],{"class":905},"sObbn","  \"",[635,908,910],{"class":909},"sVeMc","requests_compressed",[635,912,913],{"class":905},"\"",[635,915,916],{"class":899},":",[635,918,919],{"class":656}," 129",[635,921,922],{"class":899},",\n",[635,924,926,928,931,933,935,938],{"class":637,"line":925},3,[635,927,906],{"class":905},[635,929,930],{"class":909},"avg_compression_pct",[635,932,913],{"class":905},[635,934,916],{"class":899},[635,936,937],{"class":656}," 1.7",[635,939,922],{"class":899},[635,941,943,945,948,950,952,955],{"class":637,"line":942},4,[635,944,906],{"class":905},[635,946,947],{"class":909},"best_compression_pct",[635,949,913],{"class":905},[635,951,916],{"class":899},[635,953,954],{"class":656}," 11.8",[635,956,922],{"class":899},[635,958,960,962,965,967,969,971,974,976],{"class":637,"line":959},5,[635,961,906],{"class":905},[635,963,964],{"class":909},"best_detail",[635,966,913],{"class":905},[635,968,916],{"class":899},[635,970,661],{"class":660},[635,972,973],{"class":645},"15,316 → 13,505 tokens",[635,975,913],{"class":660},[635,977,922],{"class":899},[635,979,981,983,986,988,990,993],{"class":637,"line":980},6,[635,982,906],{"class":905},[635,984,985],{"class":909},"total_tokens_removed",[635,987,913],{"class":905},[635,989,916],{"class":899},[635,991,992],{"class":656}," 130497",[635,994,922],{"class":899},[635,996,998,1000,1003,1005,1007,1010],{"class":637,"line":997},7,[635,999,906],{"class":905},[635,1001,1002],{"class":909},"total_tokens_before",[635,1004,913],{"class":905},[635,1006,916],{"class":899},[635,1008,1009],{"class":656}," 10992312",[635,1011,922],{"class":899},[635,1013,1015,1017,1020,1022,1024,1027],{"class":637,"line":1014},8,[635,1016,906],{"class":905},[635,1018,1019],{"class":909},"tool_schema_tokens_saved",[635,1021,913],{"class":905},[635,1023,916],{"class":899},[635,1025,1026],{"class":656}," 484226",[635,1028,922],{"class":899},[635,1030,1032,1034,1037,1039,1041],{"class":637,"line":1031},9,[635,1033,906],{"class":905},[635,1035,1036],{"class":909},"total_tokens_saved_all_layers",[635,1038,913],{"class":905},[635,1040,916],{"class":899},[635,1042,1043],{"class":656}," 614723\n",[635,1045,1047],{"class":637,"line":1046},10,[635,1048,1049],{"class":899},"}\n",[10,1051,1052,1053,1056,1057,1059,1060,1063],{},"ตัวเลขที่น่าสนใจคือ compression ลดไป ",[22,1054,1055],{},"130,497"," token แต่ ",[22,1058,1019],{}," ลดไปถึง ",[22,1061,1062],{},"484,226"," token",[10,1065,1066],{},"สองอย่างนี้เป็นคนละกลไกกัน ตัวหลังมาจากการไม่ส่ง schema ของ tool ทั้งหมดไปหาโมเดลทุก request แล้วโหลดเฉพาะตัวที่ต้องใช้",[10,1068,1069],{},"ในงานของผม เกือบ 80% ของ token ที่ประหยัดได้มาจาก tool search มากกว่า compression",[10,1071,1072,1073,1075],{},"น่าเสียดายที่ ",[22,1074,860],{}," ยังไม่ตีมูลค่าส่วนนี้เป็นเงิน",[627,1077,1079],{"className":629,"code":1078,"language":631,"meta":385,"style":385},"curl -s 127.0.0.1:8787\u002Fstats | jq -c '.savings.by_source'\n",[22,1080,1081],{"__ignoreMap":385},[635,1082,1083,1085,1087,1089,1091,1093,1096,1099,1102],{"class":637,"line":638},[635,1084,871],{"class":641},[635,1086,874],{"class":652},[635,1088,877],{"class":645},[635,1090,881],{"class":880},[635,1092,884],{"class":641},[635,1094,1095],{"class":652}," -c",[635,1097,1098],{"class":660}," '",[635,1100,1101],{"class":645},".savings.by_source",[635,1103,1104],{"class":660},"'\n",[627,1106,1108],{"className":890,"code":1107,"language":892,"meta":385,"style":385},"[{ \"source\": \"tool_search\", \"realized\": true, \"events\": 79, \"tokens\": 484226, \"usd\": 0.0 }]\n",[22,1109,1110],{"__ignoreMap":385},[635,1111,1112,1115,1117,1120,1122,1124,1126,1129,1131,1134,1136,1139,1141,1143,1147,1149,1151,1154,1156,1158,1161,1163,1165,1168,1170,1172,1174,1176,1178,1181,1183,1185,1188],{"class":637,"line":638},[635,1113,1114],{"class":899},"[{",[635,1116,661],{"class":905},[635,1118,1119],{"class":909},"source",[635,1121,913],{"class":905},[635,1123,916],{"class":899},[635,1125,661],{"class":660},[635,1127,1128],{"class":645},"tool_search",[635,1130,913],{"class":660},[635,1132,1133],{"class":899},",",[635,1135,661],{"class":905},[635,1137,1138],{"class":909},"realized",[635,1140,913],{"class":905},[635,1142,916],{"class":899},[635,1144,1146],{"class":1145},"scCEF"," true",[635,1148,1133],{"class":899},[635,1150,661],{"class":905},[635,1152,1153],{"class":909},"events",[635,1155,913],{"class":905},[635,1157,916],{"class":899},[635,1159,1160],{"class":656}," 79",[635,1162,1133],{"class":899},[635,1164,661],{"class":905},[635,1166,1167],{"class":909},"tokens",[635,1169,913],{"class":905},[635,1171,916],{"class":899},[635,1173,1026],{"class":656},[635,1175,1133],{"class":899},[635,1177,661],{"class":905},[635,1179,1180],{"class":909},"usd",[635,1182,913],{"class":905},[635,1184,916],{"class":899},[635,1186,1187],{"class":656}," 0.0",[635,1189,1190],{"class":899}," }]\n",[10,1192,1193,1194,1196,1197],{},"ประหยัดไปกว่า 480,000 token แต่ ",[22,1195,1180],{}," ยังเป็น ",[22,1198,1199],{},"0.0",[10,1201,1202],{},"ถ้าดูเฉพาะตัวเลขเงินบน dashboard จึงอาจทำให้เข้าใจว่าประหยัดได้น้อยกว่าความเป็นจริง เพราะมันนับเงินจากฝั่ง compression แต่ไม่ได้รวม token ที่ลดลงจาก tool schema",[10,1204,1205],{},"แล้วทำไม compression ของผมถึงต่ำ?",[10,1207,1208],{},"README อธิบายไว้ค่อนข้างตรง ถ้า input เป็นข้อความล้วนหรือข้อมูลค่อนข้างแน่นอยู่แล้ว มันจะบีบได้ไม่มาก ส่วน benchmark 21–57% ที่เขาโชว์เป็นงานอย่าง code search, incident investigation, สำรวจ codebase หรือ triage issue ซึ่งมี tool output ก้อนใหญ่ให้ลดได้เยอะกว่า",[10,1210,1211],{},"วันที่ผมทดสอบ ผมนั่งเขียน Markdown ภาษาไทยเป็นหลัก เลยแทบไม่มีข้อมูลแบบนั้น",[10,1213,1214,1215,1217],{},"อีกอย่างคือ ",[22,1216,930],{}," ที่ขึ้น 1.7% เป็นค่าเฉลี่ยต่อ request ถ้าเอา token ที่ลดได้ทั้งหมดหารด้วย token ก่อนบีบทั้งหมด จะได้ประมาณ 1.2%",[10,1219,802,1220,1223],{},[22,1221,1222],{},"cache_savings_usd"," ใน dashboard ขึ้นตัวเลขค่อนข้างสูง แต่ตรงนี้ไม่ใช่เงินที่ Headroom ประหยัดให้ทั้งหมด",[10,1225,1226,1227,1229],{},"ใน ",[22,1228,860],{}," มีคำอธิบายว่า",[627,1231,1234],{"className":1232,"code":1233,"language":694,"meta":385},[692],"Cost discount from provider prefix caching. Headroom's CacheAligner improves\nhit rates; baseline caching is provider-native.\n",[22,1235,1233],{"__ignoreMap":385},[10,1237,1238,1241],{},[22,1239,1240],{},"baseline caching is provider-native"," หมายความว่า prompt cache เป็นความสามารถของ Anthropic API ที่ Claude Code ใช้อยู่แล้ว",[10,1243,1244],{},"สิ่งที่ Headroom ทำคือพยายามไม่ทำให้ cache เดิมเสีย และช่วยจัดส่วนที่เพิ่มเข้ามาใหม่ให้เข้ากับ cache มากขึ้น",[27,1246,1247],{"id":1247},"หลังใช้จริงแล้วชอบอะไรบ้าง",[10,1249,1250,1251,1254,1255],{},"ติดตั้งง่าย ใช้ ",[22,1252,1253],{},"headroom wrap claude"," ครั้งเดียวแล้วทำงานต่อได้เลย ถ้าจะถอนก็มี ",[22,1256,1257],{},"unwrap",[10,1259,1260],{},"ส่วนที่เห็นผลชัดที่สุดในงานของผมคือ tool schema ลดไปกว่า 400,000 token ในวันเดียว แม้ dashboard จะยังไม่แสดงเป็นมูลค่าเงินก็ตาม",[10,1262,1263,1264],{},"ข้อมูลที่ถูกบีบยังเรียกกลับมาได้ผ่าน ",[22,1265,604],{},[10,1267,1268,1269,1271],{},"เรื่อง latency ก็ไม่ได้รู้สึกชัด จาก ",[22,1270,860],{}," ของผม overhead เฉลี่ยอยู่ราว 100 ms ต่อ request ขณะที่เวลารอโมเดลตอบอยู่ในหลักสิบวินาที",[10,1273,1274],{},"README ระบุ overhead ไว้ที่ 0.21 ms แต่ตัวเลขนั้นเป็น path ของ JSON ส่วนข้อความธรรมดาจะวิ่งเข้าโมเดล ML ซึ่งช้ากว่า จากที่ผมเจอ request ที่หนักที่สุดใช้เวลาประมาณ 4 วินาที",[10,1276,1277,1278,197,1280,1283,1284],{},"เครื่องมือสำหรับดูสถานะก็มีค่อนข้างครบ ทั้ง ",[22,1279,748],{},[22,1281,1282],{},"dashboard"," และ ",[22,1285,860],{},[27,1287,1288],{"id":1288},"จุดที่ผมติดตอนใช้งาน",[1290,1291,1293],"h3",{"id":1292},"tool-output-อาจถูกบีบจนข้อมูลหาย","Tool output อาจถูกบีบจนข้อมูลหาย",[10,1295,1296],{},"อันนี้เป็นเรื่องที่ผมกังวลที่สุด",[10,1298,1299],{},"ตอนเขียนบทความนี้ ผมให้ agent ใช้ grep หาคำใน README บน terminal ผมเห็น output ครบตามปกติ แต่ข้อมูลที่ส่งไปถึงโมเดลเหลือแค่นี้",[627,1301,1304],{"className":1302,"code":1303,"language":694,"meta":385},[692],"328:you\n330:preserved. vscode-claude`\n",[22,1305,1303],{"__ignoreMap":385},[10,1307,1308],{},"Agent เกือบสรุปว่าไม่เจอข้อมูลที่ต้องการ",[10,1310,1311,1312,1314],{},"พอเรียก ",[22,1313,604],{}," เอาของเต็มกลับมา กลายเป็น",[627,1316,1319],{"className":1317,"code":1318,"language":694,"meta":385},[692],"328:you use the Claude Code panel; the dashboard or proxy log printed at startup\n330:preserved. `Ctrl+C` stops the proxy; `headroom unwrap vscode-claude` restores the\n",[22,1320,1318],{"__ignoreMap":385},[10,1322,1323],{},"ข้อความถูกตัดกลางประโยค",[10,1325,1326],{},"ปัญหาคือคนที่นั่งดู terminal ไม่เห็นความผิดปกติ เพราะ output ฝั่งเรายังครบ คนที่เห็นข้อมูลไม่ครบคือโมเดล",[10,1328,1329],{},"สัญญาณหนึ่งที่ช่วยบอกได้คือข้อความท้าย output",[627,1331,1334],{"className":1332,"code":1333,"language":694,"meta":385},[692],"[276 words compressed to 174 (from 6 source lines). Retrieve more: hash=24aa7b12]\n",[22,1335,1333],{"__ignoreMap":385},[10,1337,1338],{},"ของต้นฉบับไม่ได้หาย สามารถเรียกคืนได้ แต่ agent ต้องรู้ก่อนว่าข้อมูลที่ได้รับไม่ครบ",[10,1340,1341],{},"ถ้าเป็นงานที่ทุกบรรทัดมีผลต่อการตัดสินใจ เช่นวิเคราะห์ log หรือ audit เรื่อง security ผมคิดว่าควรระวังตรงนี้เป็นพิเศษ",[1290,1343,1345,1347],{"id":1344},"wrap-จะติดตั้ง-serena-ให้ด้วย",[22,1346,813],{}," จะติดตั้ง Serena ให้ด้วย",[10,1349,1350,1351,1353,1354],{},"README ระบุว่าเมื่อใช้ ",[22,1352,813],{}," Headroom จะติดตั้ง Serena ซึ่งเป็นเครื่องมือช่วย navigate code แบบเข้าใจ symbol แล้วลงทะเบียนไว้ที่ user scope ใน ",[22,1355,1356],{},"~\u002F.claude.json",[10,1358,1359,1360],{},"นั่นหมายความว่าโปรเจกต์อื่นก็จะเห็น Serena ตัวนี้จนกว่าจะ ",[22,1361,1257],{},[10,1363,1364],{},"ถ้ามี Serena อยู่ก่อนแล้ว config เดิมยังอยู่ จากที่ผมตรวจของตัวเองไม่ได้ถูกเขียนทับ",[10,1366,1367],{},"ถ้าไม่ต้องการใช้ Serena สามารถสั่ง",[627,1369,1371],{"className":629,"code":1370,"language":631,"meta":385,"style":385},"--code-memory none\n",[22,1372,1373],{"__ignoreMap":385},[635,1374,1375,1378],{"class":637,"line":638},[635,1376,1377],{"class":641},"--code-memory",[635,1379,1380],{"class":645}," none\n",[10,1382,1383],{},"ตอน wrap ได้",[1290,1385,1387],{"id":1386},"มีการแก้-config-และสร้างไฟล์ในโปรเจกต์","มีการแก้ config และสร้างไฟล์ในโปรเจกต์",[10,1389,1390,1391,1393],{},"ถึงเราจะไม่ต้องแก้ config เอง แต่ ",[22,1392,813],{}," มีการแก้หลายอย่างให้เบื้องหลัง",[10,1395,1396,1397,1399,1400,1402],{},"ของผมมันเพิ่ม MCP server ชื่อ ",[22,1398,621],{}," เข้าไปใน ",[22,1401,1356],{}," ที่ user scope และสร้างไฟล์ในโปรเจกต์ เช่น",[627,1404,1407],{"className":1405,"code":1406,"language":694,"meta":385},[692],".claude\u002F.headroom_wrap_marker.json\n.headroom_wrap_owners.json\n.headroom\u002F\n",[22,1408,1406],{"__ignoreMap":385},[10,1410,1411,1412,1415],{},"ไฟล์พวกนี้โผล่ใน ",[22,1413,1414],{},"git status"," เป็น untracked",[10,1417,1418,1419,1422],{},"ควรเพิ่มลง ",[22,1420,1421],{},".gitignore"," ไว้ก่อน",[627,1424,1428],{"className":1425,"code":1426,"language":1427,"meta":385,"style":385},"language-gitignore shiki shiki-themes material-theme-lighter one-dark-pro github-dark",".headroom\u002F\n.claude\u002F.headroom_wrap_*\n","gitignore",[22,1429,1430,1435],{"__ignoreMap":385},[635,1431,1432],{"class":637,"line":638},[635,1433,1434],{},".headroom\u002F\n",[635,1436,1437],{"class":637,"line":386},[635,1438,1439],{},".claude\u002F.headroom_wrap_*\n",[1290,1441,1443],{"id":1442},"telemetry-เปิดเป็นค่าเริ่มต้น","Telemetry เปิดเป็นค่าเริ่มต้น",[10,1445,1446],{},"ค่า default ของ telemetry คือเปิด",[10,1448,1449],{},"เอกสารระบุว่าส่งข้อมูลอย่างอัตราการบีบ ชื่อ provider\u002Fmodel, OS และสถาปัตยกรรม โดยไม่ส่ง prompt, code หรือ path",[10,1451,1452],{},"ถ้าไม่ต้องการส่ง ปิดได้ด้วย",[627,1454,1456],{"className":629,"code":1455,"language":631,"meta":385,"style":385},"HEADROOM_BEACON=off\n",[22,1457,1458],{"__ignoreMap":385},[635,1459,1460,1463,1465],{"class":637,"line":638},[635,1461,1462],{"class":784},"HEADROOM_BEACON",[635,1464,789],{"class":788},[635,1466,1467],{"class":645},"off\n",[10,1469,1470],{},"หรือ",[627,1472,1474],{"className":629,"code":1473,"language":631,"meta":385,"style":385},"DO_NOT_TRACK=1\n",[22,1475,1476],{"__ignoreMap":385},[635,1477,1478,1481,1483],{"class":637,"line":638},[635,1479,1480],{"class":784},"DO_NOT_TRACK",[635,1482,789],{"class":788},[635,1484,1485],{"class":645},"1\n",[10,1487,1488,1489],{},"หรือใช้ ",[22,1490,1491],{},"--offline",[10,1493,1494,1495,1497],{},"เครื่องผมตั้ง ",[22,1496,1480],{}," ไว้อยู่แล้ว เลยไม่ได้ส่งออกตั้งแต่แรก",[1290,1499,1501],{"id":1500},"ฟีเจอร์บางอย่างของ-claude-code-ใช้ไม่ได้","ฟีเจอร์บางอย่างของ Claude Code ใช้ไม่ได้",[10,1503,1504,1505,1507,1508],{},"เมื่อ ",[22,1506,720],{}," ชี้ไปที่ proxy Claude Code จะปิด ",[22,1509,1510],{},"\u002Fremote-control",[10,1512,1513],{},"ส่วน context 1M token ต้องสั่งเองด้วย",[627,1515,1517],{"className":629,"code":1516,"language":631,"meta":385,"style":385},"headroom wrap claude --1m\n",[22,1518,1519],{"__ignoreMap":385},[635,1520,1521,1523,1525,1528],{"class":637,"line":638},[635,1522,621],{"class":641},[635,1524,711],{"class":645},[635,1526,1527],{"class":645}," claude",[635,1529,1530],{"class":652}," --1m\n",[10,1532,1533],{},"Claude Desktop ยังไม่รองรับ เพราะตัวแอปจะเขียนทับ base URL",[1290,1535,1536],{"id":1536},"ออกเวอร์ชันถี่มาก",[10,1538,1539],{},"ตอนที่ผมเช็ก มี 198 เวอร์ชันบน PyPI ในเวลาประมาณ 7 เดือนครึ่ง",[10,1541,1542],{},"ข้อดีคือแก้บั๊กเร็ว แต่ก็หมายความว่า behavior และรายละเอียดต่าง ๆ เปลี่ยนค่อนข้างไว",[27,1544,371],{"id":371},[10,1546,1547],{},"ก่อนลอง ผมคิดว่าเหตุผลหลักของการใช้ Headroom คือ compression",[10,1549,1550],{},"หลังใช้หนึ่งวัน กลับกลายเป็นว่าฝั่ง compression ลด token ในงานของผมได้ไม่มาก แต่ tool search ช่วยลดไปกว่า 400K token",[10,1552,1553],{},"เรื่องที่ทำให้ผมลังเลมากกว่าตัวเลขการประหยัดคือ tool output ที่อาจถูกบีบจนข้อมูลไม่ครบ",[10,1555,1556],{},"ข้อมูลต้นฉบับยังเรียกกลับมาได้ แต่ agent ต้องรู้ก่อนว่ามีข้อมูลบางส่วนหายไป ซึ่งเป็นจุดที่ต้องระวัง เพราะคนที่นั่งดู terminal ยังเห็น output เต็มตามปกติ",[10,1558,1559],{},"ถ้างานเป็น API response ใหญ่ ๆ, JSON, code search หรือ log ยาว ๆ Headroom น่าจะมีของให้บีบเยอะกว่างานที่ผมทดสอบ",[10,1561,1562],{},"ส่วนงานเขียนหรือแก้ไฟล์ทีละไฟล์แบบที่ผมทำวันนั้น compression ช่วยค่อนข้างน้อย",[10,1564,1565],{},"ตอนนี้ผมยังเปิดใช้อยู่ เพราะอยากเก็บตัวเลขเพิ่มอีกหน่อย แต่ถ้าเป็นงานที่ข้อมูลทุกบรรทัดสำคัญ ผมคงไม่เชื่อ output ที่ถูกบีบโดยไม่ตรวจซ้ำ",[10,1567,1568,1569,1571,1572,1422],{},"ถ้าจะลองใช้ แนะนำให้ดูด้วยว่า ",[22,1570,813],{}," แก้อะไรบนเครื่องบ้าง และเพิ่มไฟล์ที่ Headroom สร้างลง ",[22,1573,1421],{},[27,1575,1577],{"id":1576},"references","References",[38,1579,1580,1586,1593,1600],{},[41,1581,1582],{},[531,1583,1585],{"href":569,"rel":1584},[535],"Headroom บน GitHub",[41,1587,1588],{},[531,1589,1592],{"href":1590,"rel":1591},"https:\u002F\u002Fdocs.headroomlabs.ai\u002F",[535],"เอกสารของ Headroom",[41,1594,1595],{},[531,1596,1599],{"href":1597,"rel":1598},"https:\u002F\u002Fpypi.org\u002Fproject\u002Fheadroom-ai\u002F",[535],"headroom-ai บน PyPI",[41,1601,1602],{},[531,1603,1606],{"href":1604,"rel":1605},"https:\u002F\u002Fgithub.com\u002Foraios\u002Fserena",[535],"Serena ตัวที่ Headroom ลงให้",[1608,1609,1610],"style",{},"html pre.shiki code .sosa_, html code.shiki .sosa_{--shiki-light:#E2931D;--shiki-default:#61AFEF;--shiki-dark:#B392F0}html pre.shiki code .sAlJX, html code.shiki .sAlJX{--shiki-light:#91B859;--shiki-default:#98C379;--shiki-dark:#9ECBFF}html pre.shiki code .sEoV_, html code.shiki .sEoV_{--shiki-light:#91B859;--shiki-default:#D19A66;--shiki-dark:#79B8FF}html pre.shiki code .snOyU, html code.shiki .snOyU{--shiki-light:#F76D47;--shiki-default:#D19A66;--shiki-dark:#79B8FF}html pre.shiki code .snfNA, html code.shiki .snfNA{--shiki-light:#39ADB5;--shiki-default:#98C379;--shiki-dark:#9ECBFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sLHrO, html code.shiki .sLHrO{--shiki-light:#90A4AE;--shiki-default:#E06C75;--shiki-dark:#E1E4E8}html pre.shiki code .sMTEB, html code.shiki .sMTEB{--shiki-light:#39ADB5;--shiki-default:#56B6C2;--shiki-dark:#F97583}html pre.shiki code .sbGrh, html code.shiki .sbGrh{--shiki-light:#39ADB5;--shiki-default:#ABB2BF;--shiki-dark:#F97583}html pre.shiki code .stlKB, html code.shiki .stlKB{--shiki-light:#39ADB5;--shiki-default:#ABB2BF;--shiki-dark:#E1E4E8}html pre.shiki code .sObbn, html code.shiki .sObbn{--shiki-light:#39ADB5;--shiki-default:#E06C75;--shiki-dark:#79B8FF}html pre.shiki code .sVeMc, html code.shiki .sVeMc{--shiki-light:#9C3EDA;--shiki-default:#E06C75;--shiki-dark:#79B8FF}html pre.shiki code .scCEF, html code.shiki .scCEF{--shiki-light:#39ADB5;--shiki-default:#D19A66;--shiki-dark:#79B8FF}",{"title":385,"searchDepth":386,"depth":386,"links":1612},[1613,1614,1615,1616,1617,1618,1627,1628],{"id":559,"depth":386,"text":560},{"id":581,"depth":386,"text":582},{"id":611,"depth":386,"text":611},{"id":817,"depth":386,"text":817},{"id":1247,"depth":386,"text":1247},{"id":1288,"depth":386,"text":1288,"children":1619},[1620,1621,1623,1624,1625,1626],{"id":1292,"depth":925,"text":1293},{"id":1344,"depth":925,"text":1622},"wrap จะติดตั้ง Serena ให้ด้วย",{"id":1386,"depth":925,"text":1387},{"id":1442,"depth":925,"text":1443},{"id":1500,"depth":925,"text":1501},{"id":1536,"depth":925,"text":1536},{"id":371,"depth":386,"text":371},{"id":1576,"depth":386,"text":1577},"2026-09-16","รีวิว Headroom ตัวบีบ context ก่อนส่งถึง LLM ตั้งแต่วิธีติดตั้ง ตัวเลขจริงที่วัดได้จากเครื่องตัวเอง ไปจนถึงข้อดีข้อเสียและเรื่องที่ควรรู้ก่อนเอาไปใช้จริง",{},"Headroom Context Compression Review","\u002Fblogs\u002F2026-09-16-headroom",{"title":554,"description":1630},{"loc":1633,"images":1636,"lastmod":1629},[1637],{"loc":844},"blogs\u002F2026-09-16-headroom",[412],"albH-H5ITtkp4V2W0ixW1mQ5A-vfadDqMXQLHArAxJ0",[1642,2461,3248,3378,3610,3694,3790,3873,3989,4076],{"id":1643,"title":1644,"body":1645,"date":2442,"description":2443,"draft":398,"extension":399,"meta":2444,"navigation":401,"next":2445,"ogTitle":2446,"path":2447,"pin":398,"prev":402,"recommends":2448,"seo":2450,"sitemap":2451,"stem":2458,"tags":2459,"updated":402,"__hash__":2460},"content\u002Fblogs\u002F2025-04-24-n8n-part-1.md","N8N วิธีการ Setup | Part 1",{"type":7,"value":1646,"toc":2431},[1647,1651,1654,1657,1661,1679,1682,1686,1712,1716,1729,2026,2036,2055,2058,2090,2107,2111,2118,2123,2286,2289,2354,2357,2364,2369,2372,2377,2380,2384,2390,2393,2398,2409,2414,2421,2428],[27,1648,1650],{"id":1649},"n8n-คืออะไร","N8N คืออะไร",[10,1652,1653],{},"คือ Platform สำหรับทำ workflow automation หรือพูดให้เข้าใจง่าย ๆ ก็คือพวกระบบอัตโนมัติต่าง ๆ นั้นแหละครับ ซึ่งจุดเด่นของเครื่องมือตัวนี้คือเป็น Open Source มีทั้ง version cloud และ self-hosted ให้ใช้งานสำหรับคนที่เป็นห่วงเรื่องความปลอดภัยของข้อมูลครับ อีกทั้งยังเป็น platform ที่อยู่ในรูปแบบของ Low Code หรือ No Code เลยก็ได้ (ในบาง workflows)",[10,1655,1656],{},"ซึ่งผมเองในฐานะของคนที่ชอบเขียนโปรแกรมอยู่แล้ว ต้องบอกเลยว่า \"ของดีย์\" ครับ ทำให้หลาย ๆ ไอเดียสามารถทำออกมาได้เลย ลดเวลาในการพัฒนาลงได้เยอะครับ ผมเองมองว่าการมีสกิล workflows ติดตัวไว้ถือเป็นข้อได้เปรียบนึงเลยครับ โดยซีรีย์นี้ตั้งใจว่าจะทำออกมาแบ่งเป็น EP ย่อย ๆ ครับแชร์ทริคต่าง ๆ ที่ได้ศึกษามา ยังไงก็ฝากติดตตามด้วยนะครับ เย่ ~",[27,1658,1660],{"id":1659},"requirements","Requirements",[38,1662,1663,1669,1676],{},[41,1664,1665,1666],{},"Docker version 25.x.x ขึ้นไป ",[22,1667,1668],{},"docker --version",[41,1670,1671,1672,1675],{},"Docker Compose version 2.24.x ขึ้นไป (",[22,1673,1674],{},"docker compose version",")",[41,1677,1678],{},"ความรู้พื้นฐาน (มาก ๆ) ของ docker cli",[27,1680,1681],{"id":1681},"วิธีการติดตั้ง",[1290,1683,1685],{"id":1684},"_1-สร้าง-directory-และ-docker-compose-file-สำหรับทดสอบ","1. สร้าง Directory และ docker compose file สำหรับทดสอบ",[627,1687,1689],{"className":629,"code":1688,"language":631,"meta":385,"style":385},"mkdir n8n-labs\n\ncd n8n-labs\n",[22,1690,1691,1699,1704],{"__ignoreMap":385},[635,1692,1693,1696],{"class":637,"line":638},[635,1694,1695],{"class":641},"mkdir",[635,1697,1698],{"class":645}," n8n-labs\n",[635,1700,1701],{"class":637,"line":386},[635,1702,1703],{"emptyLinePlaceholder":401},"\n",[635,1705,1706,1710],{"class":637,"line":925},[635,1707,1709],{"class":1708},"sJZfL","cd",[635,1711,1698],{"class":645},[1290,1713,1715],{"id":1714},"_2-สร้าง-docker-compose-file","2. สร้าง docker compose file",[627,1717,1719],{"className":629,"code":1718,"language":631,"meta":385,"style":385},"nano docker-compose.yml\n",[22,1720,1721],{"__ignoreMap":385},[635,1722,1723,1726],{"class":637,"line":638},[635,1724,1725],{"class":641},"nano",[635,1727,1728],{"class":645}," docker-compose.yml\n",[627,1730,1734],{"className":1731,"code":1732,"language":1733,"meta":385,"style":385},"language-yml shiki shiki-themes material-theme-lighter one-dark-pro github-dark","services:\n  n8n:\n    image: docker.n8n.io\u002Fn8nio\u002Fn8n\n    restart: unless-stopped\n    ports:\n      - '127.0.0.1:5678:5678'\n    volumes:\n      - n8n_data:\u002Fhome\u002Fnode\u002F.n8n\n      - n8n_local_files:\u002Ffiles\n    environment:\n      - N8N_HOST=${SUBDOMAIN}.${DOMAIN_NAME}\n      - N8N_PORT=5678\n      - N8N_PROTOCOL=https\n      - NODE_ENV=production\n      - WEBHOOK_URL=https:\u002F\u002F${WEBHOOK_SUBDOMAIN}.${DOMAIN_NAME}\u002F\n      - GENERIC_TIMEZONE=${GENERIC_TIMEZONE}\n      - N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true\n\n  pg-vector:\n    image: pgvector\u002Fpgvector:pg17\n    restart: unless-stopped\n    environment:\n      POSTGRES_USER: \u003Cusername>\n      POSTGRES_PASSWORD: \u003Cpassword>\n      POSTGRES_DB: n8n-pgvector\n    ports:\n      - '127.0.0.1:5432:5432'\n    volumes:\n      - db-pgvector-data:\u002Fvar\u002Flib\u002Fpostgresql\u002Fdata\n\nvolumes:\n  n8n_data:\n  n8n_local_files:\n  db-data:\n  db-pgvector-data:\n","yml",[22,1735,1736,1745,1752,1762,1772,1779,1791,1798,1805,1812,1819,1827,1835,1843,1851,1859,1867,1875,1880,1888,1898,1907,1914,1925,1936,1947,1954,1966,1973,1981,1986,1994,2002,2010,2018],{"__ignoreMap":385},[635,1737,1738,1742],{"class":637,"line":638},[635,1739,1741],{"class":1740},"s0Prt","services",[635,1743,1744],{"class":899},":\n",[635,1746,1747,1750],{"class":637,"line":386},[635,1748,1749],{"class":1740},"  n8n",[635,1751,1744],{"class":899},[635,1753,1754,1757,1759],{"class":637,"line":925},[635,1755,1756],{"class":1740},"    image",[635,1758,916],{"class":899},[635,1760,1761],{"class":645}," docker.n8n.io\u002Fn8nio\u002Fn8n\n",[635,1763,1764,1767,1769],{"class":637,"line":942},[635,1765,1766],{"class":1740},"    restart",[635,1768,916],{"class":899},[635,1770,1771],{"class":645}," unless-stopped\n",[635,1773,1774,1777],{"class":637,"line":959},[635,1775,1776],{"class":1740},"    ports",[635,1778,1744],{"class":899},[635,1780,1781,1784,1786,1789],{"class":637,"line":980},[635,1782,1783],{"class":899},"      -",[635,1785,1098],{"class":660},[635,1787,1788],{"class":645},"127.0.0.1:5678:5678",[635,1790,1104],{"class":660},[635,1792,1793,1796],{"class":637,"line":997},[635,1794,1795],{"class":1740},"    volumes",[635,1797,1744],{"class":899},[635,1799,1800,1802],{"class":637,"line":1014},[635,1801,1783],{"class":899},[635,1803,1804],{"class":645}," n8n_data:\u002Fhome\u002Fnode\u002F.n8n\n",[635,1806,1807,1809],{"class":637,"line":1031},[635,1808,1783],{"class":899},[635,1810,1811],{"class":645}," n8n_local_files:\u002Ffiles\n",[635,1813,1814,1817],{"class":637,"line":1046},[635,1815,1816],{"class":1740},"    environment",[635,1818,1744],{"class":899},[635,1820,1822,1824],{"class":637,"line":1821},11,[635,1823,1783],{"class":899},[635,1825,1826],{"class":645}," N8N_HOST=${SUBDOMAIN}.${DOMAIN_NAME}\n",[635,1828,1830,1832],{"class":637,"line":1829},12,[635,1831,1783],{"class":899},[635,1833,1834],{"class":645}," N8N_PORT=5678\n",[635,1836,1838,1840],{"class":637,"line":1837},13,[635,1839,1783],{"class":899},[635,1841,1842],{"class":645}," N8N_PROTOCOL=https\n",[635,1844,1846,1848],{"class":637,"line":1845},14,[635,1847,1783],{"class":899},[635,1849,1850],{"class":645}," NODE_ENV=production\n",[635,1852,1854,1856],{"class":637,"line":1853},15,[635,1855,1783],{"class":899},[635,1857,1858],{"class":645}," WEBHOOK_URL=https:\u002F\u002F${WEBHOOK_SUBDOMAIN}.${DOMAIN_NAME}\u002F\n",[635,1860,1862,1864],{"class":637,"line":1861},16,[635,1863,1783],{"class":899},[635,1865,1866],{"class":645}," GENERIC_TIMEZONE=${GENERIC_TIMEZONE}\n",[635,1868,1870,1872],{"class":637,"line":1869},17,[635,1871,1783],{"class":899},[635,1873,1874],{"class":645}," N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true\n",[635,1876,1878],{"class":637,"line":1877},18,[635,1879,1703],{"emptyLinePlaceholder":401},[635,1881,1883,1886],{"class":637,"line":1882},19,[635,1884,1885],{"class":1740},"  pg-vector",[635,1887,1744],{"class":899},[635,1889,1891,1893,1895],{"class":637,"line":1890},20,[635,1892,1756],{"class":1740},[635,1894,916],{"class":899},[635,1896,1897],{"class":645}," pgvector\u002Fpgvector:pg17\n",[635,1899,1901,1903,1905],{"class":637,"line":1900},21,[635,1902,1766],{"class":1740},[635,1904,916],{"class":899},[635,1906,1771],{"class":645},[635,1908,1910,1912],{"class":637,"line":1909},22,[635,1911,1816],{"class":1740},[635,1913,1744],{"class":899},[635,1915,1917,1920,1922],{"class":637,"line":1916},23,[635,1918,1919],{"class":1740},"      POSTGRES_USER",[635,1921,916],{"class":899},[635,1923,1924],{"class":645}," \u003Cusername>\n",[635,1926,1928,1931,1933],{"class":637,"line":1927},24,[635,1929,1930],{"class":1740},"      POSTGRES_PASSWORD",[635,1932,916],{"class":899},[635,1934,1935],{"class":645}," \u003Cpassword>\n",[635,1937,1939,1942,1944],{"class":637,"line":1938},25,[635,1940,1941],{"class":1740},"      POSTGRES_DB",[635,1943,916],{"class":899},[635,1945,1946],{"class":645}," n8n-pgvector\n",[635,1948,1950,1952],{"class":637,"line":1949},26,[635,1951,1776],{"class":1740},[635,1953,1744],{"class":899},[635,1955,1957,1959,1961,1964],{"class":637,"line":1956},27,[635,1958,1783],{"class":899},[635,1960,1098],{"class":660},[635,1962,1963],{"class":645},"127.0.0.1:5432:5432",[635,1965,1104],{"class":660},[635,1967,1969,1971],{"class":637,"line":1968},28,[635,1970,1795],{"class":1740},[635,1972,1744],{"class":899},[635,1974,1976,1978],{"class":637,"line":1975},29,[635,1977,1783],{"class":899},[635,1979,1980],{"class":645}," db-pgvector-data:\u002Fvar\u002Flib\u002Fpostgresql\u002Fdata\n",[635,1982,1984],{"class":637,"line":1983},30,[635,1985,1703],{"emptyLinePlaceholder":401},[635,1987,1989,1992],{"class":637,"line":1988},31,[635,1990,1991],{"class":1740},"volumes",[635,1993,1744],{"class":899},[635,1995,1997,2000],{"class":637,"line":1996},32,[635,1998,1999],{"class":1740},"  n8n_data",[635,2001,1744],{"class":899},[635,2003,2005,2008],{"class":637,"line":2004},33,[635,2006,2007],{"class":1740},"  n8n_local_files",[635,2009,1744],{"class":899},[635,2011,2013,2016],{"class":637,"line":2012},34,[635,2014,2015],{"class":1740},"  db-data",[635,2017,1744],{"class":899},[635,2019,2021,2024],{"class":637,"line":2020},35,[635,2022,2023],{"class":1740},"  db-pgvector-data",[635,2025,1744],{"class":899},[10,2027,2028,2029,1283,2032,2035],{},"โดยในส่วนของ ",[22,2030,2031],{},"POSTGRES_USER",[22,2033,2034],{},"POSTGRES_PASSWORD"," ให้แก้ไขเป็นค่าที่ปลอดภัยได้เลย หรือจะ generate ด้วย openssl ก็ได้เช่นกันครับ",[627,2037,2039],{"className":629,"code":2038,"language":631,"meta":385,"style":385},"openssl rand -base64 32\n",[22,2040,2041],{"__ignoreMap":385},[635,2042,2043,2046,2049,2052],{"class":637,"line":638},[635,2044,2045],{"class":641},"openssl",[635,2047,2048],{"class":645}," rand",[635,2050,2051],{"class":652}," -base64",[635,2053,2054],{"class":656}," 32\n",[10,2056,2057],{},"หน้าตาหลังจากแก้ไขจะเป็นประมาณนี้",[627,2059,2061],{"className":1731,"code":2060,"language":1733,"meta":385,"style":385},"environment:\n  POSTGRES_USER: username\n  POSTGRES_PASSWORD: VygpX7KBx2LsLTLoIk84YPV+gBsVZzgfMqVm+Kv0ltM=\n",[22,2062,2063,2070,2080],{"__ignoreMap":385},[635,2064,2065,2068],{"class":637,"line":638},[635,2066,2067],{"class":1740},"environment",[635,2069,1744],{"class":899},[635,2071,2072,2075,2077],{"class":637,"line":386},[635,2073,2074],{"class":1740},"  POSTGRES_USER",[635,2076,916],{"class":899},[635,2078,2079],{"class":645}," username\n",[635,2081,2082,2085,2087],{"class":637,"line":925},[635,2083,2084],{"class":1740},"  POSTGRES_PASSWORD",[635,2086,916],{"class":899},[635,2088,2089],{"class":645}," VygpX7KBx2LsLTLoIk84YPV+gBsVZzgfMqVm+Kv0ltM=\n",[10,2091,2092,2093,2095,2096,2099,2100,2099,2103,2106],{},"จากนั้น (หากใช้ ",[22,2094,1725],{},") แก้ไขไฟล์ให้กด ",[22,2097,2098],{},"CTRL + X"," -> ",[22,2101,2102],{},"Y",[22,2104,2105],{},"Enter"," จะเป็นการบันทึกและออกจากไฟล์",[1290,2108,2110],{"id":2109},"_3-กำหนดค่าให้-env","3. กำหนดค่าให้ .env",[10,2112,2113,2114,2117],{},"สร้างไฟล์ ",[22,2115,2116],{},".env"," และทำการแก้ไขค่าต่าง ๆ",[91,2119,2120],{},[10,2121,2122],{},"DOMAIN_NAME, SUBDOMAIN, WEBHOOK_SUBDOMAIN ในส่วนนี้อาจจะปล่อยเป็นค่า default แบบนี้ไปก่อนครับ",[627,2124,2126],{"className":629,"code":2125,"language":631,"meta":385,"style":385},"NODE_ENV=\"production\"\nN8N_PROTOCOL=\"http\" # or https\nN8N_DIAGNOSTICS_ENABLED=false\nGENERIC_TIMEZONE=\"Asia\u002FBangkok\"\nDOMAIN_NAME=localhost\nSUBDOMAIN=\nWEBHOOK_SUBDOMAIN=\nN8N_RUNNERS_ENABLED=true\n\nEXECUTIONS_DATA_PRUNE=true\nEXECUTIONS_DATA_MAX_AGE=168\nEXECUTIONS_DATA_PRUNE_MAX_COUNT=50000\n\nPG_USER=\u003Cusername>\nPG_PASSWORD=\u003Cpassword>\n",[22,2127,2128,2142,2160,2170,2184,2194,2202,2209,2219,2223,2232,2242,2252,2256,2272],{"__ignoreMap":385},[635,2129,2130,2133,2135,2137,2140],{"class":637,"line":638},[635,2131,2132],{"class":784},"NODE_ENV",[635,2134,789],{"class":788},[635,2136,913],{"class":660},[635,2138,2139],{"class":645},"production",[635,2141,667],{"class":660},[635,2143,2144,2147,2149,2151,2154,2156],{"class":637,"line":386},[635,2145,2146],{"class":784},"N8N_PROTOCOL",[635,2148,789],{"class":788},[635,2150,913],{"class":660},[635,2152,2153],{"class":645},"http",[635,2155,913],{"class":660},[635,2157,2159],{"class":2158},"sDKbk"," # or https\n",[635,2161,2162,2165,2167],{"class":637,"line":925},[635,2163,2164],{"class":784},"N8N_DIAGNOSTICS_ENABLED",[635,2166,789],{"class":788},[635,2168,2169],{"class":645},"false\n",[635,2171,2172,2175,2177,2179,2182],{"class":637,"line":942},[635,2173,2174],{"class":784},"GENERIC_TIMEZONE",[635,2176,789],{"class":788},[635,2178,913],{"class":660},[635,2180,2181],{"class":645},"Asia\u002FBangkok",[635,2183,667],{"class":660},[635,2185,2186,2189,2191],{"class":637,"line":959},[635,2187,2188],{"class":784},"DOMAIN_NAME",[635,2190,789],{"class":788},[635,2192,2193],{"class":645},"localhost\n",[635,2195,2196,2199],{"class":637,"line":980},[635,2197,2198],{"class":784},"SUBDOMAIN",[635,2200,2201],{"class":788},"=\n",[635,2203,2204,2207],{"class":637,"line":997},[635,2205,2206],{"class":784},"WEBHOOK_SUBDOMAIN",[635,2208,2201],{"class":788},[635,2210,2211,2214,2216],{"class":637,"line":1014},[635,2212,2213],{"class":784},"N8N_RUNNERS_ENABLED",[635,2215,789],{"class":788},[635,2217,2218],{"class":645},"true\n",[635,2220,2221],{"class":637,"line":1031},[635,2222,1703],{"emptyLinePlaceholder":401},[635,2224,2225,2228,2230],{"class":637,"line":1046},[635,2226,2227],{"class":784},"EXECUTIONS_DATA_PRUNE",[635,2229,789],{"class":788},[635,2231,2218],{"class":645},[635,2233,2234,2237,2239],{"class":637,"line":1821},[635,2235,2236],{"class":784},"EXECUTIONS_DATA_MAX_AGE",[635,2238,789],{"class":788},[635,2240,2241],{"class":645},"168\n",[635,2243,2244,2247,2249],{"class":637,"line":1829},[635,2245,2246],{"class":784},"EXECUTIONS_DATA_PRUNE_MAX_COUNT",[635,2248,789],{"class":788},[635,2250,2251],{"class":645},"50000\n",[635,2253,2254],{"class":637,"line":1837},[635,2255,1703],{"emptyLinePlaceholder":401},[635,2257,2258,2261,2263,2266,2269],{"class":637,"line":1845},[635,2259,2260],{"class":784},"PG_USER",[635,2262,789],{"class":788},[635,2264,2265],{"class":880},"\u003C",[635,2267,2268],{"class":645},"username",[635,2270,2271],{"class":880},">\n",[635,2273,2274,2277,2279,2281,2284],{"class":637,"line":1853},[635,2275,2276],{"class":784},"PG_PASSWORD",[635,2278,789],{"class":788},[635,2280,2265],{"class":880},[635,2282,2283],{"class":645},"password",[635,2285,2271],{"class":880},[10,2287,2288],{},"จากนั้นสามารถ start docker compose ได้เลยด้วยคำสั่ง",[627,2290,2292],{"className":629,"code":2291,"language":631,"meta":385,"style":385},"docker compose pull\n\n# [+] Pulling 15\u002F29\n# ⠧ pg-vector [⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠀] Pulling                              13.8s\n# ⠧ n8n [⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀] Pulling                                         13.8s\n\ndocker compose --env-file .env up --build -d\n# อย่าลืม --env-file flag นะครับ\n",[22,2293,2294,2305,2309,2314,2319,2324,2328,2349],{"__ignoreMap":385},[635,2295,2296,2299,2302],{"class":637,"line":638},[635,2297,2298],{"class":641},"docker",[635,2300,2301],{"class":645}," compose",[635,2303,2304],{"class":645}," pull\n",[635,2306,2307],{"class":637,"line":386},[635,2308,1703],{"emptyLinePlaceholder":401},[635,2310,2311],{"class":637,"line":925},[635,2312,2313],{"class":2158},"# [+] Pulling 15\u002F29\n",[635,2315,2316],{"class":637,"line":942},[635,2317,2318],{"class":2158},"# ⠧ pg-vector [⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠀] Pulling                              13.8s\n",[635,2320,2321],{"class":637,"line":959},[635,2322,2323],{"class":2158},"# ⠧ n8n [⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀] Pulling                                         13.8s\n",[635,2325,2326],{"class":637,"line":980},[635,2327,1703],{"emptyLinePlaceholder":401},[635,2329,2330,2332,2334,2337,2340,2343,2346],{"class":637,"line":997},[635,2331,2298],{"class":641},[635,2333,2301],{"class":645},[635,2335,2336],{"class":652}," --env-file",[635,2338,2339],{"class":645}," .env",[635,2341,2342],{"class":645}," up",[635,2344,2345],{"class":652}," --build",[635,2347,2348],{"class":652}," -d\n",[635,2350,2351],{"class":637,"line":1014},[635,2352,2353],{"class":2158},"# อย่าลืม --env-file flag นะครับ\n",[1290,2355,2356],{"id":2356},"ทดสอบเปิดเข้าใช้งาน",[10,2358,2359,2360,2363],{},"จากนั้นเปิด browser แล้วไปที่ ",[22,2361,2362],{},"http:\u002F\u002Flocalhost:5678\u002Fsetup"," ได้เลยครับ",[10,2365,2366],{},[842,2367],{"alt":385,"src":2368},"\u002Fimages\u002F2025-04-24-n8n-part-1\u002Fn8n-setup.png",[10,2370,2371],{},"โดยในขั้นตอนนี้เป็น optional ครับ แต่แนะนำให้เอากดรับมาครับ",[10,2373,2374],{},[842,2375],{"alt":385,"src":2376},"\u002Fimages\u002F2025-04-24-n8n-part-1\u002Fpaid-features-for-free.png",[10,2378,2379],{},"เรียบร้อยครับ เพียงแค่นี้เราก็จะได้ N8N version self-hosted มาใช้งานแล้วครับ",[1290,2381,2383],{"id":2382},"_4-ทดสอบเพิ่ม-pgvector-เข้าไปยัง-n8n","4. ทดสอบเพิ่ม PGVector เข้าไปยัง N8N",[10,2385,2386,2387],{},"ไปที่เมนู Credential\n",[842,2388],{"alt":385,"src":2389},"\u002Fimages\u002F2025-04-24-n8n-part-1\u002Fn8n-credential-1.png",[10,2391,2392],{},"เลือกเป็น Postgres",[10,2394,2395],{},[842,2396],{"alt":385,"src":2397},"\u002Fimages\u002F2025-04-24-n8n-part-1\u002Fn8n-credential-2.png",[10,2399,2400,2401,2404,2405,2408],{},"กรอกข้อมูล โดยผมจะทำการแก้ชื่อด้านซ้ายบนให้เป็น ",[22,2402,2403],{},"PG-Vector"," นะครับ ในช่องของ database ถ้า setup ตามที่ผมแนะนำไว้ก็สามารถใส่เป็น",[22,2406,2407],{},"pg-vector"," (service name ใน docker-compose) และใส่ username, password จากไฟล์ .env และ Database เอามาจากไฟล์ docker-compose ได้เลยครับ",[10,2410,2411],{},[842,2412],{"alt":385,"src":2413},"\u002Fimages\u002F2025-04-24-n8n-part-1\u002Fn8n-credential-3.png",[10,2415,2416,2417,2420],{},"ถ้ากด Save แล้วขึ้น ",[22,2418,2419],{},"Connection Tested Successfully"," แสดงว่าใช้งานได้แล้วครับ โดยตัว PG Vector อันนี้จะเป็นตัว Postgres ที่มีการเปิดใช้งาน extension vector ซึ่งเดี๋ยวเราจะเอามาใช้ในการเล่นเกี่ยว LLM ต่อไปนะครับ",[10,2422,2423,2424],{},"สามารถอ่าน Part 2 ต่อได้เลย\n",[531,2425,2427],{"href":2426},"\u002Fblogs\u002F2025-04-28-n8n-part-2","N8N Part 2",[1608,2429,2430],{},"html pre.shiki code .sosa_, html code.shiki .sosa_{--shiki-light:#E2931D;--shiki-default:#61AFEF;--shiki-dark:#B392F0}html pre.shiki code .sAlJX, html code.shiki .sAlJX{--shiki-light:#91B859;--shiki-default:#98C379;--shiki-dark:#9ECBFF}html pre.shiki code .sJZfL, html code.shiki .sJZfL{--shiki-light:#6182B8;--shiki-default:#56B6C2;--shiki-dark:#79B8FF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sEoV_, html code.shiki .sEoV_{--shiki-light:#91B859;--shiki-default:#D19A66;--shiki-dark:#79B8FF}html pre.shiki code .snOyU, html code.shiki .snOyU{--shiki-light:#F76D47;--shiki-default:#D19A66;--shiki-dark:#79B8FF}html pre.shiki code .sLHrO, html code.shiki .sLHrO{--shiki-light:#90A4AE;--shiki-default:#E06C75;--shiki-dark:#E1E4E8}html pre.shiki code .sMTEB, html code.shiki .sMTEB{--shiki-light:#39ADB5;--shiki-default:#56B6C2;--shiki-dark:#F97583}html pre.shiki code .snfNA, html code.shiki .snfNA{--shiki-light:#39ADB5;--shiki-default:#98C379;--shiki-dark:#9ECBFF}html pre.shiki code .sDKbk, html code.shiki .sDKbk{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#7F848E;--shiki-default-font-style:italic;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit}html pre.shiki code .sbGrh, html code.shiki .sbGrh{--shiki-light:#39ADB5;--shiki-default:#ABB2BF;--shiki-dark:#F97583}html pre.shiki code .s0Prt, html code.shiki .s0Prt{--shiki-light:#E53935;--shiki-default:#E06C75;--shiki-dark:#85E89D}html pre.shiki code .stlKB, html code.shiki .stlKB{--shiki-light:#39ADB5;--shiki-default:#ABB2BF;--shiki-dark:#E1E4E8}",{"title":385,"searchDepth":386,"depth":386,"links":2432},[2433,2434,2435],{"id":1649,"depth":386,"text":1650},{"id":1659,"depth":386,"text":1660},{"id":1681,"depth":386,"text":1681,"children":2436},[2437,2438,2439,2440,2441],{"id":1684,"depth":925,"text":1685},{"id":1714,"depth":925,"text":1715},{"id":2109,"depth":925,"text":2110},{"id":2356,"depth":925,"text":2356},{"id":2382,"depth":925,"text":2383},"2025-04-24","วิธี self-hosted N8N ด้วย docker compose อย่างง่าย พร้อมต่อ PGVector ไว้ใช้กับงาน LLM ในภายหลัง",{},"2025-04-28-n8n-part-2.md","Awesome N8N","\u002Fblogs\u002F2025-04-24-n8n-part-1",[2449],"2025-05-10-n8n-with-telegram-notify.md",{"title":1644,"description":2443},{"loc":2447,"images":2452,"lastmod":2442},[2453,2454,2455,2456,2457],{"loc":2368},{"loc":2376},{"loc":2389},{"loc":2397},{"loc":2413},"blogs\u002F2025-04-24-n8n-part-1",[412],"I6LvNsUAUALP3fYWB-CRo9XorAxT9H4ZBD7nvm6Eke4",{"id":2462,"title":2463,"body":2464,"date":3217,"description":3218,"draft":398,"extension":399,"meta":3219,"navigation":401,"next":402,"ogTitle":2446,"path":2426,"pin":398,"prev":3220,"recommends":3221,"seo":3222,"sitemap":3223,"stem":3245,"tags":3246,"updated":402,"__hash__":3247},"content\u002Fblogs\u002F2025-04-28-n8n-part-2.md","N8N วิธีการการใช้งานเบื้องต้น | Part 2",{"type":7,"value":2465,"toc":3211},[2466,2472,2475,2485,2489,2493,2498,2501,2506,2509,2513,2516,2527,2532,2535,2538,2543,2546,2551,2554,2559,2562,2582,2587,2594,2599,2602,2607,2610,2615,2618,2682,2685,2736,2739,2745,2827,2830,2835,2838,3148,3151,3156,3159,3165,3172,3177,3180,3185,3191,3197,3200,3205,3208],[10,2467,2468,2469],{},"สำหรับใครที่ยังไม่ได้อ่าน Part 1 นะครับ สามารถไปอ่านได้ที่ ",[531,2470,2471],{"href":2447},"N8N Part 1",[10,2473,2474],{},"โดยวันนี้ผมจะพามาลองเล่น workflow ในแบบ basic ๆ กันก่อนนะครับ เผื่อให้สามารถเข้าใจการทำงานในเบื้องต้นได้",[10,2476,2477,2478,2481,2482],{},"โดยโจทย์ในครั้งนี้คือ ",[435,2479,2480],{},"\"ค้นหา URLs ต่าง ๆ ของ domain ที่ต้องการโดยใช้ Wayback machine\""," ถ้านึกภาพไม่ออกคือการทำแบบนี้แหละครับ แต่เราจะทำให้มันเป็น workflow เพื่อนำไปต่อยอดในอนาคตนะครับ\n",[842,2483],{"alt":385,"src":2484},"\u002Fimages\u002F2025-04-28-n8n-part-2\u002Fimage-4.png",[27,2486,2488],{"id":2487},"เริ่มต้นการสร้าง-workflows","เริ่มต้นการสร้าง workflows",[1290,2490,2492],{"id":2491},"ทำการสร้าง-workflow-ใหม่โดยการกดที่ปุ่มขวาบน-create-workflow-ได้เลยครับ","ทำการสร้าง workflow ใหม่โดยการกดที่ปุ่มขวาบน (\"Create Workflow\") ได้เลยครับ",[10,2494,2495],{},[842,2496],{"alt":385,"src":2497},"\u002Fimages\u002F2025-04-28-n8n-part-2\u002Fimage.png",[10,2499,2500],{},"จากนั้นจะพบกับ UI หน้าตาโล่ง ๆ แบบนี้",[10,2502,2503],{},[842,2504],{"alt":385,"src":2505},"\u002Fimages\u002F2025-04-28-n8n-part-2\u002Fimage-1.png",[10,2507,2508],{},"โดยเมื่อกดปุ่ม \"+\" กลางจอหรือมุมขวาบนแล้วจะพบกับ Trigger Node ครับ (ภายใน N8N เราจะเรียกเครื่องมือแต่ละตัวว่า Node นะครับ)",[1290,2510,2512],{"id":2511},"อธิบายคร่าว-ๆ-ของ-trigger-node-ประมาณนี้ครับ","อธิบายคร่าว ๆ ของ Trigger Node ประมาณนี้ครับ",[10,2514,2515],{},"Trigger Node คือจุดเริ่มต้นของ workflow ซึ่งสามารถทำได้หลายวิธีด้วยกันขึ้นอยู่กับจุดประสงค์ของ workflow นั้น ๆ ครับ เช่นหากเป็นประเภท Scheduler จะใช้ประเภท \"On a scheduler\" หากเป็นประเภท Webhook ที่รอรับสัญญาณจากแหล่งอื่นจะใช้เป็น \"On webhook call\" ครับ ยังมีอีกหลาย ๆ ตัวที่น่าสนใจเช่น",[38,2517,2518,2521,2524],{},[41,2519,2520],{},"On chat message: Node นี้จะเป็นการสร้างหน้า chat ui ขึ้นมาให้ครับ เหมาะสำหรับการนำมาใช้งานกับ AI Agent นั้นเอง",[41,2522,2523],{},"On app event: Node นี้จะเป็นการรับ trigger จาก application อื่น ๆ ที่นำมาเชื่อมต่อครับ เช่น notion, telegram, airtable ซึ่งจำเป็นต้องเชื่อมต่อกันให้เรียบร้อยก่อนใช้งาน",[41,2525,2526],{},"Trigger manual: Node นี้เป็นการสร้างปุ่มขึ้นมาให้กดครับ เหมาะสำหรับการใช้งานที่จำเป็นต้องกรอกข้อมูลก่อน หรือ ไม่ได้อยากทำให้มี external trigger มาครับ",[10,2528,2529],{},[842,2530],{"alt":385,"src":2531},"\u002Fimages\u002F2025-04-28-n8n-part-2\u002Fimage-2.png",[10,2533,2534],{},"ซึ่งอันนี้เป็นแค่เพียงเบื้องต้นนะครับ จริง ๆ แล้ว N8N ยังสามารถทำอะไรได้มากกว่านั้นอีก (มากกกก) ไปกันต่อเลยครับ",[10,2536,2537],{},"โดยผมจะเริ่มจาก Trigger เบื้องต้นอย่าง \"Trigger manually\" ละกันครับ สามารถกดเลือกได้เลยครับ เมื่อเลือกแล้วจะมี Node โผล่มากลางจอแบบนี้ครับ",[10,2539,2540],{},[842,2541],{"alt":385,"src":2542},"\u002Fimages\u002F2025-04-28-n8n-part-2\u002Fimage-3.png",[10,2544,2545],{},"จากนั้นให้กดปุ่ม \"+\" ที่อยู่ขวามือของ Node เพื่อเพิ่มการทำงานขั้นต่อไปครับ เมื่อกดแล้วจะเพิ่มกับเครื่องมือต่าง ๆ ที่สามารถนำมาใช้ต่อได้นะครับ \"ซึ่งมีเยอะมากกกก\"",[10,2547,2548],{},[842,2549],{"alt":385,"src":2550},"\u002Fimages\u002F2025-04-28-n8n-part-2\u002Fimage-5.png",[10,2552,2553],{},"โดยให้เราเลือกเป็น \"HTTP Request\" ครับ",[10,2555,2556],{},[842,2557],{"alt":385,"src":2558},"\u002Fimages\u002F2025-04-28-n8n-part-2\u002Fimage-7.png",[10,2560,2561],{},"จากนั้นจะพบกับหน้าต่างที่โผล่ขึ้นมาซึ่งจะแบ่งเป็น 3 ส่วนหลัก ๆ คือ",[66,2563,2564,2570,2576],{},[41,2565,2566,2569],{},[635,2567,2568],{},"ซ้าย"," Input: เป็นส่วนที่ไว้ใช้แสดงผลข้อมูลที่มาจาก workflows การหน้าครับ",[41,2571,2572,2575],{},[635,2573,2574],{},"กลาง"," Settings: เป็นการตั้งค่าของ Node นั้น ๆ ซึ่งจะขึ้นอยู่กับว่าเป็น Node อะไร ในกรณีจะมี \"Method\", \"URL\", \"Authentication\" และอื่น ๆ ตามด้านล่างเลยครับ ซึ่งก็คือรูปแบบการ Call HTTP request ปกติเลย",[41,2577,2578,2581],{},[635,2579,2580],{},"ขวา"," Output: เป็นส่วนที่ไว้ใช้แสดงผลข้อมูลที่ได้จาก Node นี้ครับ",[10,2583,2584],{},[842,2585],{"alt":385,"src":2586},"\u002Fimages\u002F2025-04-28-n8n-part-2\u002Fimage-6.png",[10,2588,2589,2590,2593],{},"กลับมาที่ Wayback machine สักแป้บนึงครับ ให้เราค้นหา request ที่จะนำมาใช้งาน ซึ่งในกรณีนี้จะเป็น ",[22,2591,2592],{},"https:\u002F\u002Fweb.archive.org\u002Fweb\u002Ftimemap\u002Fjson"," ครับ",[10,2595,2596],{},[842,2597],{"alt":385,"src":2598},"\u002Fimages\u002F2025-04-28-n8n-part-2\u002Fimage-9.png",[10,2600,2601],{},"กรอกข้อมูลต่าง ๆ ได้เลย โดยที่ส่วนของ URL แนะนำให้ใช้แค่ URL นะครับ แล้วแบ่งเอา Parameter ลงมาใส่ข้างล่างแทน แบบในรูปเลยครับ (แนะนำว่าให้ปรับ Limit เป็นค่าน้อย ๆ จากเดิน 10000 อาจจะลดลงเหลือ 30 ก็ได้ครับ) เสร็จแล้วกดปุ่ม Test Step ได้เลย ถ้าถูกต้องด้านขวามือจะมีข้อมูลขึ้นมาแบบนี้ครับ",[10,2603,2604],{},[842,2605],{"alt":385,"src":2606},"\u002Fimages\u002F2025-04-28-n8n-part-2\u002Fimage-10.png",[10,2608,2609],{},"โดยที่ Output จะดูข้อมูลได้ 3 รูปแบบได้แก่ Table, JSON, Schema ซึ่งการทำงานจริง ๆ ของ N8N จะทำงานภายใต้ Object Array ครับ",[10,2611,2612],{},[842,2613],{"alt":385,"src":2614},"\u002Fimages\u002F2025-04-28-n8n-part-2\u002Fimage-11.png",[10,2616,2617],{},"อันนี้ถ้าดูดี ๆ มันจะเป็นการ return มาแบบแปลก ๆ นะครับ ปกติแล้วมันควรจะ return มาเป็น json ในรูปแบบ",[627,2619,2621],{"className":890,"code":2620,"language":892,"meta":385,"style":385},"[{\n\"original\": \"http:\u002F\u002Fexample.com:80\u002F\",\n\"mimetype\": \"text\u002Fhtml\",\n\"...\"\n}]\n",[22,2622,2623,2628,2648,2668,2677],{"__ignoreMap":385},[635,2624,2625],{"class":637,"line":638},[635,2626,2627],{"class":899},"[{\n",[635,2629,2630,2632,2635,2637,2639,2641,2644,2646],{"class":637,"line":386},[635,2631,913],{"class":905},[635,2633,2634],{"class":909},"original",[635,2636,913],{"class":905},[635,2638,916],{"class":899},[635,2640,661],{"class":660},[635,2642,2643],{"class":645},"http:\u002F\u002Fexample.com:80\u002F",[635,2645,913],{"class":660},[635,2647,922],{"class":899},[635,2649,2650,2652,2655,2657,2659,2661,2664,2666],{"class":637,"line":925},[635,2651,913],{"class":905},[635,2653,2654],{"class":909},"mimetype",[635,2656,913],{"class":905},[635,2658,916],{"class":899},[635,2660,661],{"class":660},[635,2662,2663],{"class":645},"text\u002Fhtml",[635,2665,913],{"class":660},[635,2667,922],{"class":899},[635,2669,2670,2672,2675],{"class":637,"line":942},[635,2671,913],{"class":905},[635,2673,2674],{"class":909},"...",[635,2676,667],{"class":905},[635,2678,2679],{"class":637,"line":959},[635,2680,2681],{"class":899},"}]\n",[10,2683,2684],{},"แต่กรณีนี้ return มาเป็น",[627,2686,2688],{"className":890,"code":2687,"language":892,"meta":385,"style":385},"[[\"original\", \"mimetype\", \"...\"], [\"value\"...]]\n",[22,2689,2690],{"__ignoreMap":385},[635,2691,2692,2695,2697,2699,2701,2703,2705,2707,2709,2711,2713,2715,2717,2720,2723,2725,2728,2730,2733],{"class":637,"line":638},[635,2693,2694],{"class":899},"[[",[635,2696,913],{"class":660},[635,2698,2634],{"class":645},[635,2700,913],{"class":660},[635,2702,1133],{"class":899},[635,2704,661],{"class":660},[635,2706,2654],{"class":645},[635,2708,913],{"class":660},[635,2710,1133],{"class":899},[635,2712,661],{"class":660},[635,2714,2674],{"class":645},[635,2716,913],{"class":660},[635,2718,2719],{"class":899},"],",[635,2721,2722],{"class":899}," [",[635,2724,913],{"class":660},[635,2726,2727],{"class":645},"value",[635,2729,913],{"class":660},[635,2731,2674],{"class":2732},"sg798",[635,2734,2735],{"class":899},"]]\n",[10,2737,2738],{},"ซึ่งมันเอาไปใช้ต่อม่ายได้ครับ '-' ดังนั้นให้กด \"+\" ด้านขวาแล้วเลือก Node \"Code\" เข้ามาช่วยได้เลยครับ",[10,2740,2741,2742],{},"ให้ลองเอา Code นี้ไปใส่\n",[842,2743],{"alt":385,"src":2744},"\u002Fimages\u002F2025-04-28-n8n-part-2\u002Fimage-12.png",[627,2746,2750],{"className":2747,"code":2748,"language":2749,"meta":385,"style":385},"language-js shiki shiki-themes material-theme-lighter one-dark-pro github-dark","for (const item of $input.all()) {\n  console.log(item)\n}\nreturn $input.all()\n","js",[22,2751,2752,2790,2810,2814],{"__ignoreMap":385},[635,2753,2754,2758,2762,2766,2770,2774,2778,2781,2785,2788],{"class":637,"line":638},[635,2755,2757],{"class":2756},"s36IK","for",[635,2759,2761],{"class":2760},"sZDfs"," (",[635,2763,2765],{"class":2764},"sOHk9","const",[635,2767,2769],{"class":2768},"sUzmo"," item",[635,2771,2773],{"class":2772},"s_AEr"," of",[635,2775,2777],{"class":2776},"sU9mH"," $input",[635,2779,2780],{"class":899},".",[635,2782,2784],{"class":2783},"suMxZ","all",[635,2786,2787],{"class":2760},"()) ",[635,2789,900],{"class":899},[635,2791,2792,2795,2797,2800,2804,2807],{"class":637,"line":386},[635,2793,2794],{"class":2776},"  console",[635,2796,2780],{"class":899},[635,2798,2799],{"class":2783},"log",[635,2801,2803],{"class":2802},"sbHgf","(",[635,2805,2806],{"class":784},"item",[635,2808,2809],{"class":2802},")\n",[635,2811,2812],{"class":637,"line":925},[635,2813,1049],{"class":899},[635,2815,2816,2818,2820,2822,2824],{"class":637,"line":942},[635,2817,429],{"class":2756},[635,2819,2777],{"class":2776},[635,2821,2780],{"class":899},[635,2823,2784],{"class":2783},[635,2825,2826],{"class":2760},"()\n",[10,2828,2829],{},"ก่อนกดปุ่มให้กด F12 เพื่อเปิด browser console เพื่อดูผลของ console.log ครับ",[10,2831,2832],{},[842,2833],{"alt":385,"src":2834},"\u002Fimages\u002F2025-04-28-n8n-part-2\u002Fimage-13.png",[10,2836,2837],{},"โดยอันนี้แหละที่เราจะเอามาใช้ต่อได้ เอา Code อันนี้ไปใส่",[627,2839,2841],{"className":2747,"code":2840,"language":2749,"meta":385,"style":385},"\u002F\u002F Retrieve all data from the input\nconst inputItems = $input.all()\n\n\u002F\u002F Extract the headers from the first item\nconst headers = inputItems[0].json || []\n\n\u002F\u002F Initialize an array to store the new items\nconst newItems = []\n\n\u002F\u002F Iterate over each old item, starting from the second item since the first is the headers\nfor (let i = 1; i \u003C inputItems.length; i++) {\n  const item = inputItems[i].json || []\n  const obj = {} \u002F\u002F Use a plain JavaScript object\n\n  \u002F\u002F Map each value to its corresponding header\n  for (let j = 0; j \u003C headers.length; j++) {\n    obj[headers[j]] = item[j]\n  }\n\n  \u002F\u002F Add the new object to the newItems array\n  newItems.push(obj)\n}\n\n\u002F\u002F Return the JSON array of objects\nreturn newItems\n",[22,2842,2843,2848,2866,2870,2875,2905,2909,2914,2925,2929,2934,2979,3005,3020,3024,3029,3068,3097,3102,3106,3111,3128,3132,3136,3141],{"__ignoreMap":385},[635,2844,2845],{"class":637,"line":638},[635,2846,2847],{"class":2158},"\u002F\u002F Retrieve all data from the input\n",[635,2849,2850,2852,2855,2858,2860,2862,2864],{"class":637,"line":386},[635,2851,2765],{"class":2764},[635,2853,2854],{"class":2768}," inputItems",[635,2856,2857],{"class":788}," =",[635,2859,2777],{"class":2776},[635,2861,2780],{"class":899},[635,2863,2784],{"class":2783},[635,2865,2826],{"class":2760},[635,2867,2868],{"class":637,"line":925},[635,2869,1703],{"emptyLinePlaceholder":401},[635,2871,2872],{"class":637,"line":942},[635,2873,2874],{"class":2158},"\u002F\u002F Extract the headers from the first item\n",[635,2876,2877,2879,2882,2884,2886,2889,2892,2895,2897,2899,2902],{"class":637,"line":959},[635,2878,2765],{"class":2764},[635,2880,2881],{"class":2768}," headers",[635,2883,2857],{"class":788},[635,2885,2854],{"class":784},[635,2887,2888],{"class":2760},"[",[635,2890,2891],{"class":656},"0",[635,2893,2894],{"class":2760},"]",[635,2896,2780],{"class":899},[635,2898,892],{"class":784},[635,2900,2901],{"class":788}," ||",[635,2903,2904],{"class":2760}," []\n",[635,2906,2907],{"class":637,"line":980},[635,2908,1703],{"emptyLinePlaceholder":401},[635,2910,2911],{"class":637,"line":997},[635,2912,2913],{"class":2158},"\u002F\u002F Initialize an array to store the new items\n",[635,2915,2916,2918,2921,2923],{"class":637,"line":1014},[635,2917,2765],{"class":2764},[635,2919,2920],{"class":2768}," newItems",[635,2922,2857],{"class":788},[635,2924,2904],{"class":2760},[635,2926,2927],{"class":637,"line":1031},[635,2928,1703],{"emptyLinePlaceholder":401},[635,2930,2931],{"class":637,"line":1046},[635,2932,2933],{"class":2158},"\u002F\u002F Iterate over each old item, starting from the second item since the first is the headers\n",[635,2935,2936,2938,2940,2943,2946,2948,2951,2954,2956,2959,2961,2963,2967,2969,2971,2974,2977],{"class":637,"line":1821},[635,2937,2757],{"class":2756},[635,2939,2761],{"class":2760},[635,2941,2942],{"class":2764},"let",[635,2944,2945],{"class":784}," i",[635,2947,2857],{"class":788},[635,2949,2950],{"class":656}," 1",[635,2952,2953],{"class":899},";",[635,2955,2945],{"class":784},[635,2957,2958],{"class":788}," \u003C",[635,2960,2854],{"class":2776},[635,2962,2780],{"class":899},[635,2964,2966],{"class":2965},"sVJsf","length",[635,2968,2953],{"class":899},[635,2970,2945],{"class":784},[635,2972,2973],{"class":788},"++",[635,2975,2976],{"class":2760},") ",[635,2978,900],{"class":899},[635,2980,2981,2984,2986,2988,2990,2992,2995,2997,2999,3001,3003],{"class":637,"line":1829},[635,2982,2983],{"class":2764},"  const",[635,2985,2769],{"class":2768},[635,2987,2857],{"class":788},[635,2989,2854],{"class":784},[635,2991,2888],{"class":2802},[635,2993,2994],{"class":784},"i",[635,2996,2894],{"class":2802},[635,2998,2780],{"class":899},[635,3000,892],{"class":784},[635,3002,2901],{"class":788},[635,3004,2904],{"class":2802},[635,3006,3007,3009,3012,3014,3017],{"class":637,"line":1837},[635,3008,2983],{"class":2764},[635,3010,3011],{"class":2768}," obj",[635,3013,2857],{"class":788},[635,3015,3016],{"class":899}," {}",[635,3018,3019],{"class":2158}," \u002F\u002F Use a plain JavaScript object\n",[635,3021,3022],{"class":637,"line":1845},[635,3023,1703],{"emptyLinePlaceholder":401},[635,3025,3026],{"class":637,"line":1853},[635,3027,3028],{"class":2158},"  \u002F\u002F Map each value to its corresponding header\n",[635,3030,3031,3034,3036,3038,3041,3043,3046,3048,3050,3052,3054,3056,3058,3060,3062,3064,3066],{"class":637,"line":1861},[635,3032,3033],{"class":2756},"  for",[635,3035,2761],{"class":2802},[635,3037,2942],{"class":2764},[635,3039,3040],{"class":784}," j",[635,3042,2857],{"class":788},[635,3044,3045],{"class":656}," 0",[635,3047,2953],{"class":899},[635,3049,3040],{"class":784},[635,3051,2958],{"class":788},[635,3053,2881],{"class":2776},[635,3055,2780],{"class":899},[635,3057,2966],{"class":2965},[635,3059,2953],{"class":899},[635,3061,3040],{"class":784},[635,3063,2973],{"class":788},[635,3065,2976],{"class":2802},[635,3067,900],{"class":899},[635,3069,3070,3073,3075,3078,3080,3083,3086,3088,3090,3092,3094],{"class":637,"line":1869},[635,3071,3072],{"class":784},"    obj",[635,3074,2888],{"class":2802},[635,3076,3077],{"class":784},"headers",[635,3079,2888],{"class":2802},[635,3081,3082],{"class":784},"j",[635,3084,3085],{"class":2802},"]] ",[635,3087,789],{"class":788},[635,3089,2769],{"class":784},[635,3091,2888],{"class":2802},[635,3093,3082],{"class":784},[635,3095,3096],{"class":2802},"]\n",[635,3098,3099],{"class":637,"line":1877},[635,3100,3101],{"class":899},"  }\n",[635,3103,3104],{"class":637,"line":1882},[635,3105,1703],{"emptyLinePlaceholder":401},[635,3107,3108],{"class":637,"line":1890},[635,3109,3110],{"class":2158},"  \u002F\u002F Add the new object to the newItems array\n",[635,3112,3113,3116,3118,3121,3123,3126],{"class":637,"line":1900},[635,3114,3115],{"class":2776},"  newItems",[635,3117,2780],{"class":899},[635,3119,3120],{"class":2783},"push",[635,3122,2803],{"class":2802},[635,3124,3125],{"class":784},"obj",[635,3127,2809],{"class":2802},[635,3129,3130],{"class":637,"line":1909},[635,3131,1049],{"class":899},[635,3133,3134],{"class":637,"line":1916},[635,3135,1703],{"emptyLinePlaceholder":401},[635,3137,3138],{"class":637,"line":1927},[635,3139,3140],{"class":2158},"\u002F\u002F Return the JSON array of objects\n",[635,3142,3143,3145],{"class":637,"line":1938},[635,3144,429],{"class":2756},[635,3146,3147],{"class":784}," newItems\n",[10,3149,3150],{},"ใน code จะมี warning ของ interface อยู่นะครับ แต่มองข้ามไปได้ กดรันได้เลยฮะ ถ้าถูกต้องตรงฝั่งขวามือเราจะได้ Output หน้าตาเป็นแบบนี้ครับ ถือว่าถูกต้องและใช้งานต่อได้",[10,3152,3153],{},[842,3154],{"alt":385,"src":3155},"\u002Fimages\u002F2025-04-28-n8n-part-2\u002Fimage-14.png",[10,3157,3158],{},"ซึ่งต่อไปก็ขึ้นอยู่กับเราว่าจะเอาข้อมูลจาก workflow นี้ไปทำอะไรต่อ เช่นนำไปเก็บใน Database, นำไปใช้วิเคราะห์ต่อ, นำไป filter ข้อมูลที่สนใจอันนี้ขึ้นอยู่กับจุดประสงค์แล้วครับ",[10,3160,3161,3162],{},"บนเส้นเมื่อรันแล้วจะเจอกับเลขอยู่นะครับ ซึ่งหมายถึงจำนวนข้อมูลปกติแล้ว N8N จะทำการ Loop ในข้อมูลแต่ละชุดให้เลยครับ จากด้านซ้ายมีข้อมูล 31 Object (รวม header) เอามาแปลงเป็นข้อมูลด้านขวาซึ่งจะเหลือ 30 Object ครับ\n",[842,3163],{"alt":385,"src":3164},"\u002Fimages\u002F2025-04-28-n8n-part-2\u002Fimage-15.png",[10,3166,3167,3168,3171],{},"ต่อไปผมจะลองใช้งาน Filter ดูนะครับ โดยที่จะ filter ",[22,3169,3170],{},"mimetype: text\u002Fhtml"," ออกมาอย่างเดียว เลือกเป็น Data transformation และ Filter",[10,3173,3174],{},[842,3175],{"alt":385,"src":3176},"\u002Fimages\u002F2025-04-28-n8n-part-2\u002Fimage-16.png",[10,3178,3179],{},"เลือกเป็น Schema แล้วดูตรง Node ที่ชื่อว่า \"Code\" ซึ่งเป็น Node ก่อนหน้า ในที่นี้เราสามารถ drag & drop ข้อมูลที่เราต้องการได้เลยครับ ให้เลือก \"mimetype\" ลากมาวางตรง \"value1\"",[10,3181,3182],{},[842,3183],{"alt":385,"src":3184},"\u002Fimages\u002F2025-04-28-n8n-part-2\u002Fimage-17.png",[10,3186,3187,3188],{},"ส่วน OP: เลือกเป็น \"is equal to\" และ value ใส่เป็น \"text\u002Fhtml\" แบบในรูปครับ\n",[842,3189],{"alt":385,"src":3190},"\u002Fimages\u002F2025-04-28-n8n-part-2\u002Fimage-18.png",[10,3192,3193,3194],{},"เมื่อกด \"Test Step\" จะพบว่าข้อมูลจะถูกแยกเป็น 2 ส่วนคือ\"Kept\" (เก็บไว้) และ \"Discarded\" (เอาทิ้ง) ซึ่งจะเป็นตามเงื่อนไขที่เราตั้งไว้ครับ\n",[842,3195],{"alt":385,"src":3196},"\u002Fimages\u002F2025-04-28-n8n-part-2\u002Fimage-19.png",[10,3198,3199],{},"ปลายเส้นก็จะเหลือข้อมูล 1 item ตามที่เรา filter ไว้เลยครับ เย่",[10,3201,3202],{},[842,3203],{"alt":385,"src":3204},"\u002Fimages\u002F2025-04-28-n8n-part-2\u002Fimage-20.png",[10,3206,3207],{},"การใช้งาน N8N ก็จะมีประมาณนี้ครับ ไม่ยากไม่ง่ายจนเกินไปเนอะ ไว้มาต่อกัน EP 3 นะครับ",[1608,3209,3210],{},"html pre.shiki code .stlKB, html code.shiki .stlKB{--shiki-light:#39ADB5;--shiki-default:#ABB2BF;--shiki-dark:#E1E4E8}html pre.shiki code .sObbn, html code.shiki .sObbn{--shiki-light:#39ADB5;--shiki-default:#E06C75;--shiki-dark:#79B8FF}html pre.shiki code .sVeMc, html code.shiki .sVeMc{--shiki-light:#9C3EDA;--shiki-default:#E06C75;--shiki-dark:#79B8FF}html pre.shiki code .snfNA, html code.shiki .snfNA{--shiki-light:#39ADB5;--shiki-default:#98C379;--shiki-dark:#9ECBFF}html pre.shiki code .sAlJX, html code.shiki .sAlJX{--shiki-light:#91B859;--shiki-default:#98C379;--shiki-dark:#9ECBFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sg798, html code.shiki .sg798{--shiki-light:#90A4AE;--shiki-light-font-style:inherit;--shiki-default:#FFFFFF;--shiki-default-font-style:inherit;--shiki-dark:#FDAEB7;--shiki-dark-font-style:italic}html pre.shiki code .s36IK, html code.shiki .s36IK{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#C678DD;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit}html pre.shiki code .sZDfs, html code.shiki .sZDfs{--shiki-light:#90A4AE;--shiki-default:#ABB2BF;--shiki-dark:#E1E4E8}html pre.shiki code .sOHk9, html code.shiki .sOHk9{--shiki-light:#9C3EDA;--shiki-default:#C678DD;--shiki-dark:#F97583}html pre.shiki code .sUzmo, html code.shiki .sUzmo{--shiki-light:#90A4AE;--shiki-default:#E5C07B;--shiki-dark:#79B8FF}html pre.shiki code .s_AEr, html code.shiki .s_AEr{--shiki-light:#39ADB5;--shiki-default:#C678DD;--shiki-dark:#F97583}html pre.shiki code .sU9mH, html code.shiki .sU9mH{--shiki-light:#90A4AE;--shiki-default:#E5C07B;--shiki-dark:#E1E4E8}html pre.shiki code .suMxZ, html code.shiki .suMxZ{--shiki-light:#6182B8;--shiki-default:#61AFEF;--shiki-dark:#B392F0}html pre.shiki code .sbHgf, html code.shiki .sbHgf{--shiki-light:#E53935;--shiki-default:#ABB2BF;--shiki-dark:#E1E4E8}html pre.shiki code .sLHrO, html code.shiki .sLHrO{--shiki-light:#90A4AE;--shiki-default:#E06C75;--shiki-dark:#E1E4E8}html pre.shiki code .sDKbk, html code.shiki .sDKbk{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#7F848E;--shiki-default-font-style:italic;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit}html pre.shiki code .sMTEB, html code.shiki .sMTEB{--shiki-light:#39ADB5;--shiki-default:#56B6C2;--shiki-dark:#F97583}html pre.shiki code .snOyU, html code.shiki .snOyU{--shiki-light:#F76D47;--shiki-default:#D19A66;--shiki-dark:#79B8FF}html pre.shiki code .sVJsf, html code.shiki .sVJsf{--shiki-light:#90A4AE;--shiki-default:#E06C75;--shiki-dark:#79B8FF}",{"title":385,"searchDepth":386,"depth":386,"links":3212},[3213],{"id":2487,"depth":386,"text":2488,"children":3214},[3215,3216],{"id":2491,"depth":925,"text":2492},{"id":2511,"depth":925,"text":2512},"2025-04-28","พาสร้าง workflow แรกใน N8N ด้วยโจทย์ดึง URLs ของ domain ที่ต้องการจาก Wayback Machine",{},"2025-04-24-n8n-part-1.md",[2449],{"title":2463,"description":3218},{"loc":2426,"images":3224,"lastmod":3217},[3225,3226,3227,3228,3229,3230,3231,3232,3233,3234,3235,3236,3237,3238,3239,3240,3241,3242,3243,3244],{"loc":2484},{"loc":2497},{"loc":2505},{"loc":2531},{"loc":2542},{"loc":2550},{"loc":2558},{"loc":2586},{"loc":2598},{"loc":2606},{"loc":2614},{"loc":2744},{"loc":2834},{"loc":3155},{"loc":3164},{"loc":3176},{"loc":3184},{"loc":3190},{"loc":3196},{"loc":3204},"blogs\u002F2025-04-28-n8n-part-2",[412],"uFLY6BQNStcIZznKEulu3uKlrVo-yPI8jj7eWjGOoy4",{"id":3249,"title":3250,"body":3251,"date":3362,"description":3363,"draft":398,"extension":399,"meta":3364,"navigation":401,"next":402,"ogTitle":3365,"path":3366,"pin":398,"prev":402,"recommends":402,"seo":3367,"sitemap":3368,"stem":3375,"tags":3376,"updated":550,"__hash__":3377},"content\u002Fblogs\u002F2025-08-18-ollama-desktop-ui.md","Ollama มี UI ให้ใช้แล้ว",{"type":7,"value":3252,"toc":3355},[3253,3258,3261,3265,3272,3276,3286,3291,3297,3301,3309,3317,3323,3327,3333,3336,3340],[10,3254,3255],{},[842,3256],{"alt":385,"src":3257},"\u002Fimages\u002F2025-08-18-ollama-desktop-ui\u002Fimages-3de58dcb-c7b8-4c8e-8fb6-fd713de8d854.jpg",[10,3259,3260],{},"วันนี้ผมเพิ่งมาสังเกตว่า Ollama มี Desktop Application ให้ใช้งานแล้ว (ผมติดตั้ง version 0.11.4 บน macos) โดยหน้าตาของ UI จะมีความ minimal เหมือนกับ LLM Chat ทั่ว ๆ ไปเลยครับ",[27,3262,3264],{"id":3263},"ollama-คืออะไร","Ollama คืออะไร",[10,3266,3267,3268],{},"โดย Ollama คือเครื่องมือสำหรับใช้ในการ run llm ในรูปแบบ local (ใช้ hardware ของผู้ใช้งานโดยตรง) มีหลาย model ให้ใช้งาน เช่น Deepseek, gemma, Llama หรือ model อื่น ๆ สามารถดูได้ที่ ",[531,3269,3270],{"href":3270,"rel":3271},"https:\u002F\u002Follama.com\u002Fsearch",[535],[27,3273,3275],{"id":3274},"ที่ชอบคือไม่ต้องเปิด-cli-แล้ว","ที่ชอบคือไม่ต้องเปิด cli แล้ว",[10,3277,3278,3279,3282,3283],{},"โดยข้อดีที่ผมชอบเลยก็คือ ก่อนหน้านี้ตอนที่ต้องการทดสอบ model บางตัว ก็จำเป็นต้องใช้งานผ่าน cli โดยที่รัน ",[22,3280,3281],{},"ollama run gemma3:270m"," แต่ตอนนี้สะดวกขึ้นมาก เพียงแค่ ",[22,3284,3285],{},"ollama pull gemma3:270m",[10,3287,3288],{},[842,3289],{"alt":385,"src":3290},"\u002Fimages\u002F2025-08-18-ollama-desktop-ui\u002Fimages-1350f112-92ce-4af4-b0d7-8731d4364dea.jpg",[10,3292,3293,3294],{},"จากนั้นก็จะสามารถเลือก model ผ่าน ollama UI และใช้งานได้เลย ทำให้การทดสอบทำได้ง่ายขึ้น\n",[842,3295],{"alt":385,"src":3296},"\u002Fimages\u002F2025-08-18-ollama-desktop-ui\u002Fimages-d010a3a3-8228-4438-8686-a8c7fb7330c3.jpg",[27,3298,3300],{"id":3299},"features-ที่เพิ่มเข้ามา","Features ที่เพิ่มเข้ามา",[10,3302,3303,3304,3308],{},"ผมเลยไปตามอ่านดู release ก็ไปเจอกับ ",[531,3305,3306],{"href":3306,"rel":3307},"https:\u002F\u002Follama.com\u002Fblog\u002Fnew-app",[535]," โดยสรุป features ไว้คร่าว ๆ ตามนี้",[38,3310,3311,3314],{},[41,3312,3313],{},"Chat with file: ส่งไฟล์เพื่อไปถาม chat เช่นส่ง PDF ให้สรุป",[41,3315,3316],{},"กำหนด context length ได้",[10,3318,3319,3322],{},[842,3320],{"alt":385,"src":3321},"\u002Fimages\u002F2025-08-18-ollama-desktop-ui\u002Fimages-8f00489f-216e-414d-b4e6-49bf74ade823.jpg","\nส่วนอื่น ๆ ก็เป็น chat UI ทั่ว ๆ ไปเลยนะครับ (อนาคตน่าจะมีอะไรให้ลองเล่นมากกว่านี้)",[27,3324,3326],{"id":3325},"turbo-beta","Turbo (Beta)",[10,3328,3329,3330],{},"อีกอย่างคือเห็นว่ามี Turbo (Beta) เข้ามาแล้วด้วย โดยมีราคาอยู่ที่ 20$ ต่อเดือน (ข้อมูลวันที่ 18\u002F8\u002F68) โดย Turbo คือการที่จากเดิม ollama จะเป็นการใช้งาน self-hardware หรือเครื่องของผู้ใช้งานเป็นคนทำงานใช่มั้ยครับ แต่ Turbo คือการที่จะไปใช้ Server ของทาง Ollama เพื่อทำงานใน model ที่มีขนาดใหญ่ขึ้นนั้นเอง\n",[842,3331],{"alt":385,"src":3332},"\u002Fimages\u002F2025-08-18-ollama-desktop-ui\u002Fimages-74485b02-c1a5-4067-aab2-467400bff2aa.jpg",[10,3334,3335],{},"ต้องคอยติดตามต่อไปว่าจะมีอะไรที่น่าสนใจหรือมีอะไรอัพเดทต่ออีกบ้างครับ ~",[27,3337,3339],{"id":3338},"ref","Ref",[38,3341,3342,3349],{},[41,3343,3344],{},[531,3345,3348],{"href":3346,"rel":3347},"https:\u002F\u002Follama.com",[535],"ollama.com",[41,3350,3351],{},[531,3352,3354],{"href":3306,"rel":3353},[535],"Ollama new app",{"title":385,"searchDepth":386,"depth":386,"links":3356},[3357,3358,3359,3360,3361],{"id":3263,"depth":386,"text":3264},{"id":3274,"depth":386,"text":3275},{"id":3299,"depth":386,"text":3300},{"id":3325,"depth":386,"text":3326},{"id":3338,"depth":386,"text":3339},"2025-08-18","Ollama ออก Desktop Application พร้อม Chat UI มาให้ใช้แล้ว ไม่ต้องรัน model ผ่าน cli อีกต่อไป",{},"Ollama New Desktop Application","\u002Fblogs\u002F2025-08-18-ollama-desktop-ui",{"title":3250,"description":3363},{"loc":3366,"images":3369,"lastmod":3362},[3370,3371,3372,3373,3374],{"loc":3257},{"loc":3290},{"loc":3296},{"loc":3321},{"loc":3332},"blogs\u002F2025-08-18-ollama-desktop-ui",[412],"rPFoL3BjAsGujCuTTH9mNIg1hfg5uwvn-WFb9mTAVkc",{"id":3379,"title":3380,"body":3381,"date":3590,"description":3591,"draft":398,"extension":399,"meta":3592,"navigation":401,"next":2445,"ogTitle":3593,"path":3594,"pin":398,"prev":3220,"recommends":3595,"seo":3596,"sitemap":3597,"stem":3607,"tags":3608,"updated":402,"__hash__":3609},"content\u002Fblogs\u002F2025-10-03-typhoon-ai-n8n.md","วิธีการนำ Typhoon AI มาใช้งานใน N8N",{"type":7,"value":3382,"toc":3585},[3383,3387,3390,3393,3397,3471,3475,3478,3492,3497,3502,3507,3512,3517,3522,3527,3532,3538,3543,3548,3553,3558,3564,3566,3572,3577,3580],[27,3384,3386],{"id":3385},"typhoon-ai-คืออะไร","Typhoon AI คืออะไร",[10,3388,3389],{},"Typhoon AI มีการพัฒนาในส่วนของ API ในรูปแบบของ Openai compatible api ซึ่งเป็นมาตรฐานของการพัฒนา API ของ AI ในปัจจุบันอยู่แล้วครับ นั่นหมายความว่าถ้าเดิม ๆ ใช้ของ OpenAI ได้ ก็จะสามารถเปลี่ยนมาใช้ของตัวอื่นได้ด้วยเช่นเดียวกัน โดยทำแค่เพียงเปลี่ยน URL ที่ใช้ในการเชื่อมต่อ",[10,3391,3392],{},"ด้วยความที่ model นี้สามารถนำมาใช้ได้ฟรีก็แนะนำว่าไม่ควรนำมาใช้ในเชิงพาณิชย์ นะครับ",[27,3394,3396],{"id":3395},"ข้อจำกัดในปัจจุบัน-update-311068","ข้อจำกัดในปัจจุบัน (update 31\u002F10\u002F68)",[3398,3399,3400,3427],"table",{},[3401,3402,3403],"thead",{},[3404,3405,3406,3412,3417,3422],"tr",{},[3407,3408,3409],"th",{},[435,3410,3411],{},"Model",[3407,3413,3414],{},[435,3415,3416],{},"Context Window",[3407,3418,3419],{},[435,3420,3421],{},"Requests per Second",[3407,3423,3424],{},[435,3425,3426],{},"Requests per Minute",[3428,3429,3430,3445,3457],"tbody",{},[3404,3431,3432,3436,3439,3442],{},[3433,3434,3435],"td",{},"typhoon-v2.5-30b-a3b-instruct",[3433,3437,3438],{},"128K tokens",[3433,3440,3441],{},"5",[3433,3443,3444],{},"200",[3404,3446,3447,3450,3453,3455],{},[3433,3448,3449],{},"typhoon-v2.1-12b-instruct",[3433,3451,3452],{},"56K tokens",[3433,3454,3441],{},[3433,3456,3444],{},[3404,3458,3459,3462,3465,3468],{},[3433,3460,3461],{},"typhoon-ocr",[3433,3463,3464],{},"-",[3433,3466,3467],{},"2",[3433,3469,3470],{},"20",[27,3472,3474],{"id":3473},"วิธีการนำมาใช้งานใน-n8n","วิธีการนำมาใช้งานใน N8N",[10,3476,3477],{},"มาเริ่มกันเลยฮะ",[66,3479,3480],{},[41,3481,3482,3483,3487,3488],{},"สมัคร User ที่ ",[531,3484,3485],{"href":3485,"rel":3486},"https:\u002F\u002Fplayground.opentyphoon.ai\u002F",[535]," เพื่อขอใช้ API Key (ตรงนี้ Free นะ) โดยจะมี Rate limit และเงื่อนไขการใช้งานเพิ่มเติมแนะนำให้อ่านต่อที่ ",[531,3489,3490],{"href":3490,"rel":3491},"https:\u002F\u002Fdocs.opentyphoon.ai\u002Fen\u002Frate-limits\u002F",[535],[10,3493,3494],{},[842,3495],{"alt":385,"src":3496},"\u002Fimages\u002F2025-10-03-typhoon-ai-n8n\u002Ftyphoon-1.png",[66,3498,3499],{"start":386},[41,3500,3501],{},"จากนั้นสามารถ Copy API Key ไว้ได้เลยฮะ ตามรูปนี้เลย",[10,3503,3504],{},[842,3505],{"alt":385,"src":3506},"\u002Fimages\u002F2025-10-03-typhoon-ai-n8n\u002Ftyphoon-2.png",[66,3508,3509],{"start":925},[41,3510,3511],{},"กลับมาที่ N8N ของเราแล้วกด \"Create Credential\"",[10,3513,3514],{},[842,3515],{"alt":385,"src":3516},"\u002Fimages\u002F2025-10-03-typhoon-ai-n8n\u002Ftyphoon-3.png",[66,3518,3519],{"start":942},[41,3520,3521],{},"โดยเลือกเป็น \"OpenAi\" ได้เลยครับ",[10,3523,3524],{},[842,3525],{"alt":385,"src":3526},"\u002Fimages\u002F2025-10-03-typhoon-ai-n8n\u002Ftyphoon-4.png",[66,3528,3529],{"start":959},[41,3530,3531],{},"นำ API Key ที่ Copy ไว้มาใส่ และแก้ตรง Base URL ให้เป็น",[627,3533,3536],{"className":3534,"code":3535,"language":694},[692],"https:\u002F\u002Fapi.opentyphoon.ai\u002Fv1\n",[22,3537,3535],{"__ignoreMap":385},[10,3539,3540],{},[842,3541],{"alt":385,"src":3542},"\u002Fimages\u002F2025-10-03-typhoon-ai-n8n\u002Ftyphoon-6.png",[66,3544,3545],{"start":980},[41,3546,3547],{},"จากนั้นเวลาจะใช้งานก็สามารถเลือกเป็น \"OpenAI Chat Model\" ได้เลย",[10,3549,3550],{},[842,3551],{"alt":385,"src":3552},"\u002Fimages\u002F2025-10-03-typhoon-ai-n8n\u002Ftyphoon-5.png",[66,3554,3555],{"start":997},[41,3556,3557],{},"ตรง \"Credential to connect with\" ให้เลือกเป็น typhoon ที่เราสร้างในขั้นตอนที่ 5 และเลือก Model โดยใช้ \"By ID\" และกรอกเป็น",[627,3559,3562],{"className":3560,"code":3561,"language":694},[692],"typhoon-v2.1-12b-instruct\n",[22,3563,3561],{"__ignoreMap":385},[10,3565,1470],{},[627,3567,3570],{"className":3568,"code":3569,"language":694},[692],"typhoon-v2.5-30b-a3b-instruct\n",[22,3571,3569],{"__ignoreMap":385},[10,3573,3574],{},[842,3575],{"alt":385,"src":3576},"\u002Fimages\u002F2025-10-03-typhoon-ai-n8n\u002Ftyphoon-7.png",[10,3578,3579],{},"เรียบร้อยย เพียงแค่นี้เราก็จะสามารถใช้งาน typhoon AI ด้วย N8N ได้แล้วคับ Enjoy ฮะะ",[10,3581,3582],{},[842,3583],{"alt":385,"src":3584},"\u002Fimages\u002F2025-10-03-typhoon-ai-n8n\u002Ftyphoon-8.png",{"title":385,"searchDepth":386,"depth":386,"links":3586},[3587,3588,3589],{"id":3385,"depth":386,"text":3386},{"id":3395,"depth":386,"text":3396},{"id":3473,"depth":386,"text":3474},"2025-10-03","วันนี้จะมาแนะนำวิธีการนำ Typhoon AI ซึ่งเป็น AI ของคนไทย มาใช้งานใน N8N",{},"Typhoon AI With N8N","\u002Fblogs\u002F2025-10-03-typhoon-ai-n8n",[2449],{"title":3380,"description":3591},{"loc":3594,"images":3598,"lastmod":3590},[3599,3600,3601,3602,3603,3604,3605,3606],{"loc":3496},{"loc":3506},{"loc":3516},{"loc":3526},{"loc":3542},{"loc":3552},{"loc":3576},{"loc":3584},"blogs\u002F2025-10-03-typhoon-ai-n8n",[412],"eU5CqbkKsBk_AfzAdsEixec5dvCLAbkAyr_rXgWE70w",{"id":3611,"title":3612,"body":3613,"date":542,"description":3685,"draft":398,"extension":399,"meta":3686,"navigation":401,"next":402,"ogTitle":3687,"path":3688,"pin":398,"prev":402,"recommends":402,"seo":3689,"sitemap":3690,"stem":3691,"tags":3692,"updated":550,"__hash__":3693},"content\u002Fblogs\u002F2026-02-08-glm-4-7.md","GLM-4.7 มาแล้ว! โมเดลใหม่จาก Zhipu AI ที่เคลมว่าแรงแซง SOTA ทุกค่าย",{"type":7,"value":3614,"toc":3681},[3615,3626,3633,3637,3663,3666,3669],[10,3616,3617,3618,3621,3622,3625],{},"ช่วงนี้วงการ LLM แข่งกันดุเดือดมาก ล่าสุดทาง ",[435,3619,3620],{},"Zhipu AI"," ก็ไม่ยอมน้อยหน้า ปล่อยตัว ",[435,3623,3624],{},"GLM-4.7"," ออกมาท้าชนรุ่นพี่ในตลาดแบบไม่เกรงใจใคร",[10,3627,3628,3629,3632],{},"เท่าที่ลองส่องดูใน Blog และ Benchmark ที่เขาปล่อยมา รอบนี้เขาเน้นเรื่อง ",[435,3630,3631],{},"\"Super-high Intelligence\""," หรือความฉลาดในการแก้ปัญหาซับซ้อน (Complex Reasoning) แบบก้าวกระโดดครับ",[27,3634,3636],{"id":3635},"มีอะไรน่าสนใจบ้าง","มีอะไรน่าสนใจบ้าง?",[38,3638,3639,3645,3651,3657],{},[41,3640,3641,3644],{},[435,3642,3643],{},"Reasoning เทพขึ้น:"," ตัวนี้ถูกเทรนมาให้จัดการกับ Logic ยากๆ ได้ดีขึ้นมาก ฟีลคล้ายๆ กับพวกโมเดลตระกูล o1\u002FReasoning ของฝั่งตะวันตก",[41,3646,3647,3650],{},[435,3648,3649],{},"Coding เก่งขึ้น:"," สำหรับชาว Dev อย่างเรา นี่คือ Key Feature เลย GLM-4.7 เข้าใจ Context ของ Codebase และช่วย Debug หรือ Refactor ได้แม่นยำกว่ารุ่น 4.0 เดิมเยอะ",[41,3652,3653,3656],{},[435,3654,3655],{},"Universal Capability:"," ทำได้รอบด้านทั้ง Text, Code, Vision และ Function Calling ที่เสถียรขึ้นมาก เหมาะเอาไปต่อกับ Agent สุดๆ",[41,3658,3659,3662],{},[435,3660,3661],{},"Cost-effective:"," จุดขายของค่ายนี้คือความคุ้มค่า ประสิทธิภาพระดับ SOTA (State-of-the-Art) แต่ราคา API มักจะเป็นมิตรกว่าค่ายใหญ่ๆ ฝั่ง US",[27,3664,3665],{"id":3665},"ความรู้สึกส่วนตัว",[10,3667,3668],{},"ส่วนตัวผมเชียร์ค่าย GLM มาสักพักเพราะชอบความ \"Open\" และความเร็วในการตอบสนอง รอบนี้ถือว่าอัปเกรดมาน่ากลัวมาก ใครที่ทำพวก AI Agent หรือกำลังหา Model ทางเลือกที่ฉลาดแต่ประหยัด Token แนะนำให้ลองไปต่อ API เล่นดูครับ",[91,3670,3671],{},[10,3672,3673,529,3676],{},[435,3674,3675],{},"อ่านรายละเอียดเต็มๆ:",[531,3677,3680],{"href":3678,"rel":3679},"https:\u002F\u002Fz.ai\u002Fblog\u002Fglm-4.7",[535],"Zhipu AI Blog - GLM-4.7",{"title":385,"searchDepth":386,"depth":386,"links":3682},[3683,3684],{"id":3635,"depth":386,"text":3636},{"id":3665,"depth":386,"text":3665},"สรุปจุดเด่น GLM-4.7 โมเดลล่าสุดจาก Zhipu AI ที่ยกระดับ Reasoning และ Coding ไปอีกขั้นในราคาที่จับต้องได้",{},"GLM-4.7 Review","\u002Fblogs\u002F2026-02-08-glm-4-7",{"title":3612,"description":3685},{"loc":3688,"lastmod":542},"blogs\u002F2026-02-08-glm-4-7",[412],"UO7H5s6Y0Y4dWj1sLTybOzm9Cg-rTW7Vp_lVtQNIW9o",{"id":3695,"title":3696,"body":3697,"date":542,"description":3781,"draft":398,"extension":399,"meta":3782,"navigation":401,"next":402,"ogTitle":3783,"path":3784,"pin":398,"prev":402,"recommends":402,"seo":3785,"sitemap":3786,"stem":3787,"tags":3788,"updated":550,"__hash__":3789},"content\u002Fblogs\u002F2026-02-08-kimi-k2-5.md","Kimi k2.5 เปิดตัวแล้ว! โมเดลใหม่สาย Long Context ที่ฉลาดและเร็วกว่าเดิม",{"type":7,"value":3698,"toc":3777},[3699,3709,3712,3716,3742,3744,3762,3765],[10,3700,3701,3702,3705,3706,2593],{},"สาย AI จีนน่าจะคุ้นเคยกับ ",[435,3703,3704],{},"Kimi (Moonshot AI)"," กันดีในฐานะเจ้าพ่อ Long Context Window ที่ยัดไฟล์ PDF เป็นร้อยหน้าให้มันอ่านได้สบายๆ ล่าสุดเขาปล่อยของใหม่ออกมาเป็น ",[435,3707,3708],{},"Kimi k2.5",[10,3710,3711],{},"หลังจากลองไปอ่าน Blog และเล่นดูคร่าวๆ บอกเลยว่ารอบนี้ไม่ใช่แค่ Minor change แต่เป็นการจูนเครื่องให้ \"คิด\" ซับซ้อนได้ดีขึ้นแบบเห็นผล",[27,3713,3715],{"id":3714},"มีอะไรใหม่ใน-k25","มีอะไรใหม่ใน k2.5?",[38,3717,3718,3724,3730,3736],{},[41,3719,3720,3723],{},[435,3721,3722],{},"Enhanced Reasoning:"," การแก้โจทย์ Logic หรือ Math ที่ต้องคิดหลาย Step ทำได้เนียนตาขึ้นมาก ไม่ค่อยหลุดมั่วเหมือนรุ่นก่อน",[41,3725,3726,3729],{},[435,3727,3728],{},"Super Long Context (Updated):"," จุดขายเดิมคือ Context ยาว แต่รอบนี้ k2.5 จัดการ Information Retrieval ใน Context ยาวๆ ได้แม่นยำขึ้น (อาการ \"ลืม\" กลางทางน้อยลง)",[41,3731,3732,3735],{},[435,3733,3734],{},"Coding Performance:"," ลองให้เขียน Script Python ง่ายๆ หรือแก้บั๊ก Code ที่ซับซ้อน ถือว่าทำได้ดีขึ้นจนน่าตกใจ เอามาเป็น Pair Programmer ได้เลย",[41,3737,3738,3741],{},[435,3739,3740],{},"Speed & Efficiency:"," รู้สึกว่า Response Time ไวขึ้น ประมวลผลลื่นขึ้น",[27,3743,482],{"id":481},[38,3745,3746,3753,3756],{},[41,3747,3748,3749,3752],{},"คนที่ชอบโยน ",[435,3750,3751],{},"Document\u002FPaper\u002FReport"," ยาวๆ ให้ AI ช่วยสรุปหรือวิเคราะห์",[41,3754,3755],{},"Dev ที่อยากหา Model ทางเลือกนอกจาก GPT-4 หรือ Claude มาช่วยเขียน Code",[41,3757,487,3758,3761],{},[435,3759,3760],{},"Data Analysis"," ที่ต้อง Process ข้อมูลดิบจำนวนมาก",[10,3763,3764],{},"ใครที่ใช้ Kimi เป็นตัวหลักในการอ่าน Doc อยู่แล้ว แนะนำให้สลับมาลอง k2.5 ดูครับ ชีวิตดีขึ้นเยอะ!",[91,3766,3767],{},[10,3768,3769,529,3772],{},[435,3770,3771],{},"อ่านเพิ่มเติม:",[531,3773,3776],{"href":3774,"rel":3775},"https:\u002F\u002Fwww.kimi.com\u002Fblog\u002Fkimi-k2-5.html",[535],"Kimi Blog - Kimi k2.5",{"title":385,"searchDepth":386,"depth":386,"links":3778},[3779,3780],{"id":3714,"depth":386,"text":3715},{"id":481,"depth":386,"text":482},"สรุปความโหดของ Kimi k2.5 โมเดลล่าสุดจาก Moonshot AI ที่อัปเกรดเรื่อง Reasoning และการจัดการ Context ยาวๆ ให้เสถียรขึ้น",{},"Kimi k2.5 Review","\u002Fblogs\u002F2026-02-08-kimi-k2-5",{"title":3696,"description":3781},{"loc":3784,"lastmod":542},"blogs\u002F2026-02-08-kimi-k2-5",[412],"cQJHlUJrV0ihpjgSB0oVJ6REMDIToqPBJJnUVtB51BE",{"id":416,"title":417,"body":3791,"date":542,"description":543,"draft":398,"extension":399,"meta":3869,"navigation":401,"next":402,"ogTitle":437,"path":545,"pin":398,"prev":402,"recommends":402,"seo":3870,"sitemap":3871,"stem":548,"tags":3872,"updated":550,"__hash__":551},{"type":7,"value":3792,"toc":3864},[3793,3799,3803,3805,3829,3831,3845,3847,3853,3855],[10,3794,422,3795,426,3797,430],{},[22,3796,425],{},[22,3798,429],{},[10,3800,433,3801,438],{},[435,3802,437],{},[27,3804,442],{"id":441},[38,3806,3807,3817,3821,3825],{},[41,3808,3809,450,3811,197,3813,197,3815,460],{},[435,3810,449],{},[22,3812,453],{},[22,3814,456],{},[22,3816,459],{},[41,3818,3819,466],{},[435,3820,465],{},[41,3822,3823,472],{},[435,3824,471],{},[41,3826,3827,478],{},[435,3828,477],{},[27,3830,482],{"id":481},[38,3832,3833,3837,3843],{},[41,3834,487,3835,491],{},[435,3836,490],{},[41,3838,494,3839,426,3841,501],{},[435,3840,497],{},[435,3842,500],{},[41,3844,504],{},[27,3846,507],{"id":507},[10,3848,510,3849,514,3851,518],{},[22,3850,513],{},[22,3852,517],{},[10,3854,521],{},[91,3856,3857],{},[10,3858,3859,529,3861],{},[435,3860,528],{},[531,3862,536],{"href":533,"rel":3863},[535],{"title":385,"searchDepth":386,"depth":386,"links":3865},[3866,3867,3868],{"id":441,"depth":386,"text":442},{"id":481,"depth":386,"text":482},{"id":507,"depth":386,"text":507},{},{"title":417,"description":543},{"loc":545,"lastmod":542},[412],{"id":3874,"title":3875,"body":3876,"date":542,"description":3980,"draft":398,"extension":399,"meta":3981,"navigation":401,"next":402,"ogTitle":3982,"path":3983,"pin":398,"prev":402,"recommends":402,"seo":3984,"sitemap":3985,"stem":3986,"tags":3987,"updated":550,"__hash__":3988},"content\u002Fblogs\u002F2026-02-08-nanobot-ai-agent.md","ลองเล่น Nanobot - AI Agent ไซส์มินิ (Python 4,000 บรรทัด)",{"type":7,"value":3877,"toc":3975},[3878,3888,3892,3898,3926,3930,3939,3942,3962,3964,3967],[10,3879,3880,3881,2593],{},"ช่วงนี้กระแส AI Agent มาแรงมาก แต่หลายตัวมักจะมาพร้อมกับ Framework ที่ใหญ่เทอะทะ หรือ Setup ยุ่งยากจนท้อไปก่อน วันนี้เลยอยากมาป้ายยาโปรเจกต์หนึ่งที่ไปเจอมา ชื่อว่า ",[435,3882,3883],{},[531,3884,3887],{"href":3885,"rel":3886},"https:\u002F\u002Fgithub.com\u002FHKUDS\u002Fnanobot",[535],"HKUDS\u002Fnanobot",[27,3889,3891],{"id":3890},"ทำไมถึงน่าสนใจ","ทำไมถึงน่าสนใจ?",[10,3893,3894,3895,2593],{},"จุดขายหลักของเจ้า Nanobot คือความ ",[435,3896,3897],{},"\"Ultra-lightweight\"",[38,3899,3900,3910,3920],{},[41,3901,3902,3905,3906,3909],{},[435,3903,3904],{},"Codebase เล็กมาก:"," Core logic ทั้งหมดเขียนด้วย Python แค่ประมาณ ",[435,3907,3908],{},"4,000 บรรทัด"," เท่านั้น (เคลมว่าเล็กกว่าคู่แข่ง 99%) ซึ่งเหมาะมากสำหรับคนที่อยากแกะโค้ดมาศึกษา หรือเอาไปโมต่อเอง",[41,3911,3912,3915,3916,3919],{},[435,3913,3914],{},"Local First:"," สาย Self-host หรือคนใช้ Mac M1\u002FM2 น่าจะชอบ เพราะมันรองรับ ",[435,3917,3918],{},"Ollama"," ในตัว ไม่ต้องต่อ API นอกเสมอไป รัน Model ในเครื่องได้เลยฟรีๆ",[41,3921,3922,3925],{},[435,3923,3924],{},"Extensible:"," โครงสร้างมันออกแบบมาให้เราเขียน Skill เพิ่มง่ายมาก อยากให้มันทำอะไรเฉพาะทางก็แค่เขียน Python Function แปะเข้าไป",[27,3927,3929],{"id":3928},"ลองเล่นแล้วเป็นไง","ลองเล่นแล้วเป็นไง?",[10,3931,3932,3933,426,3936,3938],{},"ความรู้สึกแรกคือ \"คลีน\" ครับ ติดตั้งผ่าน ",[22,3934,3935],{},"pip",[22,3937,642],{}," แป๊บเดียวเสร็จ สั่งงานผ่าน CLI ได้เลย หรือจะเชื่อมกับ Chat App อย่าง Telegram\u002FDiscord ก็ได้",[10,3940,3941],{},"Use case ที่น่าเอาไปทำต่อ:",[66,3943,3944,3950,3956],{},[41,3945,3946,3949],{},[435,3947,3948],{},"Personal Assistant:"," ให้ช่วยสรุปข่าว หรือแจ้งเตือนสิ่งที่ต้องทำ",[41,3951,3952,3955],{},[435,3953,3954],{},"Coding Buddy:"," ให้ช่วยเจน Code เล็กๆ น้อยๆ หรือ Refactor code",[41,3957,3958,3961],{},[435,3959,3960],{},"Monitor Task:"," สั่งให้เฝ้ากราฟหุ้น\u002FCrypto แล้วแจ้งเตือนเมื่อถึงราคาที่ตั้งไว้",[27,3963,371],{"id":371},[10,3965,3966],{},"ใครกำลังมองหา AI Agent Framework ที่ เบา และ คุมได้ 100% แนะนำให้ลอง clone มาเล่นดูครับ ถือว่าเป็นจุดเริ่มต้นที่ดีสำหรับคนที่อยากเข้าใจการทำงานของ Agentic Workflow แบบไม่ต้องปวดหัวกับ Library ที่ซับซ้อนเกินไป",[10,3968,3969,529,3972],{},[435,3970,3971],{},"Repo:",[531,3973,3885],{"href":3885,"rel":3974},[535],{"title":385,"searchDepth":386,"depth":386,"links":3976},[3977,3978,3979],{"id":3890,"depth":386,"text":3891},{"id":3928,"depth":386,"text":3929},{"id":371,"depth":386,"text":371},"รีวิว Nanobot AI Agent ที่เคลมว่าเล็กพริกขี้หนู เขียนด้วย Python เพียวๆ ปรับแต่งง่าย",{},"Review HKUDS Nanobot","\u002Fblogs\u002F2026-02-08-nanobot-ai-agent",{"title":3875,"description":3980},{"loc":3983,"lastmod":542},"blogs\u002F2026-02-08-nanobot-ai-agent",[412],"UK5-ShvsfL1jC5h0r7wEfznNt4JfjIoJCZpdK2Ps2aY",{"id":3990,"title":3991,"body":3992,"date":4066,"description":4067,"draft":398,"extension":399,"meta":4068,"navigation":401,"next":402,"ogTitle":4069,"path":4070,"pin":398,"prev":402,"recommends":402,"seo":4071,"sitemap":4072,"stem":4073,"tags":4074,"updated":550,"__hash__":4075},"content\u002Fblogs\u002F2026-02-12-glm-5.md","GLM-5 เปิดตัวแล้ว! การก้าวกระโดดครั้งใหญ่สู่ Omni-Model เต็มรูปแบบ 🚀",{"type":7,"value":3993,"toc":4062},[3994,4004,4011,4015,4041,4044,4047,4050],[10,3995,3996,3997,3999,4000,4003],{},"หลังจากที่เพิ่งตื่นเต้นกับ GLM-4.7 ไปหมาดๆ ทาง ",[435,3998,3620],{}," ก็ไม่ปล่อยให้รอนาน ปล่อยของใหญ่อย่าง ",[435,4001,4002],{},"GLM-5"," ออกมาตบตลาด AI อีกรอบแล้วครับ!",[10,4005,4006,4007,4010],{},"รอบนี้ไม่ใช่แค่เก่งขึ้น แต่เป็นการยกเครื่องสถาปัตยกรรมใหม่ให้เป็น ",[435,4008,4009],{},"Native Omni-Model"," เต็มตัว คือรับ Input\u002FOutput ได้ทั้ง Text, Audio และ Video แบบ Seamless ไม่ต้องผ่านตัวแปลงหลายทอด ทำให้ Response Time ไวขึ้นแบบเห็นได้ชัด",[27,4012,4014],{"id":4013},"ไฮไลท์ของ-glm-5","ไฮไลท์ของ GLM-5",[38,4016,4017,4023,4029,4035],{},[41,4018,4019,4022],{},[435,4020,4021],{},"Unified Modality:"," คุยด้วยเสียง หรือโยนวิดีโอให้วิเคราะห์ได้แบบ Real-time ความหน่วงต่ำมาก (Low Latency) เหมาะเอาไปทำ Voice Agent สุดๆ",[41,4024,4025,4028],{},[435,4026,4027],{},"Deep Reasoning:"," ความสามารถในการแก้โจทย์ Logic ซับซ้อนและการวางแผน (Planning) สำหรับ Agent Workflow ดีขึ้นกว่ารุ่น 4 เยอะมาก",[41,4030,4031,4034],{},[435,4032,4033],{},"Coding & Tool Use:"," เขียน Code ได้แม่นยำขึ้น เข้าใจ Context ของ Project ใหญ่ๆ ได้ดี และเรียกใช้ External Tools (Function Calling) ได้เนียนกริบ",[41,4036,4037,4040],{},[435,4038,4039],{},"Long Context:"," รองรับ Context Window มหาศาล เอา Book ทั้งเล่มหรือ Codebase ทั้งก้อนโยนเข้าไปได้สบาย",[27,4042,4043],{"id":4043},"ความเห็นส่วนตัว",[10,4045,4046],{},"สำหรับ Dev สายสร้าง Agent หรือคนที่ทำระบบ Automation ผ่าน API ตัว GLM-5 ถือว่าเป็นตัวเลือกที่น่ากลัวมาก (ในทางที่ดี) เพราะทั้งฉลาดและราคา (Pricing) น่าจะยังคงความคุ้มค่าสไตล์ Zhipu ไว้",[10,4048,4049],{},"ใครที่รัน Project ด้วย GLM-4 อยู่ แนะนำให้เตรียมวางแผน Migration มาลองตัวนี้เลยครับ น่าจะช่วยลด Error Rate ใน Production ได้เยอะ",[91,4051,4052],{},[10,4053,4054,529,4057],{},[435,4055,4056],{},"รายละเอียดเพิ่มเติม:",[531,4058,4061],{"href":4059,"rel":4060},"https:\u002F\u002Fz.ai\u002Fblog\u002Fglm-5",[535],"Zhipu AI Blog - GLM-5",{"title":385,"searchDepth":386,"depth":386,"links":4063},[4064,4065],{"id":4013,"depth":386,"text":4014},{"id":4043,"depth":386,"text":4043},"2026-02-12","สรุปฟีเจอร์เด็ดของ GLM-5 โมเดลเรือธงรุ่นล่าสุดจาก Zhipu AI ที่เก่งรอบด้านทั้งภาพ เสียง และการเขียนโค้ด",{},"GLM-5 Review","\u002Fblogs\u002F2026-02-12-glm-5",{"title":3991,"description":4067},{"loc":4070,"lastmod":4066},"blogs\u002F2026-02-12-glm-5",[412],"iBvehBjAW1cK65RQqnAa77IPe6VFAaOXNoLfBIFYP-Q",{"id":553,"title":554,"body":4077,"date":1629,"description":1630,"draft":398,"extension":399,"meta":4844,"navigation":401,"next":402,"ogTitle":1632,"path":1633,"pin":398,"prev":402,"recommends":402,"seo":4845,"sitemap":4846,"stem":1638,"tags":4849,"updated":402,"__hash__":1640},{"type":7,"value":4078,"toc":4827},[4079,4081,4083,4088,4090,4092,4094,4096,4100,4102,4104,4108,4110,4112,4118,4120,4142,4146,4148,4158,4163,4165,4177,4183,4185,4197,4201,4211,4216,4220,4238,4246,4248,4250,4260,4264,4268,4274,4278,4296,4422,4430,4432,4434,4438,4462,4534,4540,4542,4544,4546,4548,4552,4556,4560,4565,4569,4571,4573,4579,4581,4585,4589,4591,4599,4601,4603,4605,4607,4612,4614,4618,4623,4625,4627,4629,4634,4636,4638,4642,4648,4652,4654,4656,4666,4668,4670,4674,4680,4685,4689,4693,4705,4707,4709,4711,4713,4725,4727,4739,4743,4747,4749,4755,4757,4771,4773,4775,4777,4779,4781,4783,4785,4787,4789,4791,4793,4795,4801,4803,4825],[27,4080,560],{"id":559},[10,4082,563],{},[10,4084,566,4085,572],{},[531,4086,571],{"href":569,"rel":4087},[535],[10,4089,575],{},[10,4091,578],{},[27,4093,582],{"id":581},[10,4095,585],{},[10,4097,588,4098,592],{},[22,4099,591],{},[10,4101,595],{},[10,4103,598],{},[10,4105,601,4106,605],{},[22,4107,604],{},[10,4109,608],{},[27,4111,611],{"id":611},[10,4113,614,4114,618,4116,622],{},[22,4115,617],{},[22,4117,621],{},[10,4119,625],{},[627,4121,4122],{"className":629,"code":630,"language":631,"meta":385,"style":385},[22,4123,4124],{"__ignoreMap":385},[635,4125,4126,4128,4130,4132,4134,4136,4138,4140],{"class":637,"line":638},[635,4127,642],{"class":641},[635,4129,646],{"class":645},[635,4131,649],{"class":645},[635,4133,653],{"class":652},[635,4135,657],{"class":656},[635,4137,661],{"class":660},[635,4139,664],{"class":645},[635,4141,667],{"class":660},[10,4143,670,4144],{},[22,4145,673],{},[10,4147,676],{},[627,4149,4150],{"className":629,"code":679,"language":631,"meta":385,"style":385},[22,4151,4152],{"__ignoreMap":385},[635,4153,4154,4156],{"class":637,"line":638},[635,4155,621],{"class":641},[635,4157,688],{"class":652},[627,4159,4161],{"className":4160,"code":693,"language":694,"meta":385},[692],[22,4162,693],{"__ignoreMap":385},[10,4164,699],{},[627,4166,4167],{"className":629,"code":702,"language":631,"meta":385,"style":385},[22,4168,4169],{"__ignoreMap":385},[635,4170,4171,4173,4175],{"class":637,"line":638},[635,4172,621],{"class":641},[635,4174,711],{"class":645},[635,4176,714],{"class":645},[10,4178,717,4179,721,4181,725],{},[22,4180,720],{},[22,4182,724],{},[10,4184,728],{},[627,4186,4187],{"className":629,"code":731,"language":631,"meta":385,"style":385},[22,4188,4189],{"__ignoreMap":385},[635,4190,4191,4193,4195],{"class":637,"line":638},[635,4192,621],{"class":641},[635,4194,740],{"class":645},[635,4196,714],{"class":645},[10,4198,745,4199,749],{},[22,4200,748],{},[627,4202,4203],{"className":629,"code":752,"language":631,"meta":385,"style":385},[22,4204,4205],{"__ignoreMap":385},[635,4206,4207,4209],{"class":637,"line":638},[635,4208,621],{"class":641},[635,4210,761],{"class":645},[627,4212,4214],{"className":4213,"code":765,"language":694,"meta":385},[692],[22,4215,765],{"__ignoreMap":385},[10,4217,770,4218,774],{},[22,4219,773],{},[627,4221,4222],{"className":629,"code":777,"language":631,"meta":385,"style":385},[22,4223,4224],{"__ignoreMap":385},[635,4225,4226,4228,4230,4232,4234,4236],{"class":637,"line":638},[635,4227,785],{"class":784},[635,4229,789],{"class":788},[635,4231,792],{"class":645},[635,4233,795],{"class":641},[635,4235,711],{"class":645},[635,4237,714],{"class":645},[10,4239,802,4240,806,4242,810,4244,814],{},[22,4241,805],{},[22,4243,809],{},[22,4245,813],{},[27,4247,817],{"id":817},[10,4249,820],{},[627,4251,4252],{"className":629,"code":823,"language":631,"meta":385,"style":385},[22,4253,4254],{"__ignoreMap":385},[635,4255,4256,4258],{"class":637,"line":638},[635,4257,621],{"class":641},[635,4259,832],{"class":645},[10,4261,835,4262],{},[22,4263,838],{},[10,4265,4266],{},[842,4267],{"alt":385,"src":844},[10,4269,847,4270,851,4272],{},[22,4271,850],{},[22,4273,854],{},[10,4275,857,4276,861],{},[22,4277,860],{},[627,4279,4280],{"className":629,"code":864,"language":631,"meta":385,"style":385},[22,4281,4282],{"__ignoreMap":385},[635,4283,4284,4286,4288,4290,4292,4294],{"class":637,"line":638},[635,4285,871],{"class":641},[635,4287,874],{"class":652},[635,4289,877],{"class":645},[635,4291,881],{"class":880},[635,4293,884],{"class":641},[635,4295,887],{"class":645},[627,4297,4298],{"className":890,"code":891,"language":892,"meta":385,"style":385},[22,4299,4300,4304,4318,4332,4346,4364,4378,4392,4406,4418],{"__ignoreMap":385},[635,4301,4302],{"class":637,"line":638},[635,4303,900],{"class":899},[635,4305,4306,4308,4310,4312,4314,4316],{"class":637,"line":386},[635,4307,906],{"class":905},[635,4309,910],{"class":909},[635,4311,913],{"class":905},[635,4313,916],{"class":899},[635,4315,919],{"class":656},[635,4317,922],{"class":899},[635,4319,4320,4322,4324,4326,4328,4330],{"class":637,"line":925},[635,4321,906],{"class":905},[635,4323,930],{"class":909},[635,4325,913],{"class":905},[635,4327,916],{"class":899},[635,4329,937],{"class":656},[635,4331,922],{"class":899},[635,4333,4334,4336,4338,4340,4342,4344],{"class":637,"line":942},[635,4335,906],{"class":905},[635,4337,947],{"class":909},[635,4339,913],{"class":905},[635,4341,916],{"class":899},[635,4343,954],{"class":656},[635,4345,922],{"class":899},[635,4347,4348,4350,4352,4354,4356,4358,4360,4362],{"class":637,"line":959},[635,4349,906],{"class":905},[635,4351,964],{"class":909},[635,4353,913],{"class":905},[635,4355,916],{"class":899},[635,4357,661],{"class":660},[635,4359,973],{"class":645},[635,4361,913],{"class":660},[635,4363,922],{"class":899},[635,4365,4366,4368,4370,4372,4374,4376],{"class":637,"line":980},[635,4367,906],{"class":905},[635,4369,985],{"class":909},[635,4371,913],{"class":905},[635,4373,916],{"class":899},[635,4375,992],{"class":656},[635,4377,922],{"class":899},[635,4379,4380,4382,4384,4386,4388,4390],{"class":637,"line":997},[635,4381,906],{"class":905},[635,4383,1002],{"class":909},[635,4385,913],{"class":905},[635,4387,916],{"class":899},[635,4389,1009],{"class":656},[635,4391,922],{"class":899},[635,4393,4394,4396,4398,4400,4402,4404],{"class":637,"line":1014},[635,4395,906],{"class":905},[635,4397,1019],{"class":909},[635,4399,913],{"class":905},[635,4401,916],{"class":899},[635,4403,1026],{"class":656},[635,4405,922],{"class":899},[635,4407,4408,4410,4412,4414,4416],{"class":637,"line":1031},[635,4409,906],{"class":905},[635,4411,1036],{"class":909},[635,4413,913],{"class":905},[635,4415,916],{"class":899},[635,4417,1043],{"class":656},[635,4419,4420],{"class":637,"line":1046},[635,4421,1049],{"class":899},[10,4423,1052,4424,1056,4426,1059,4428,1063],{},[22,4425,1055],{},[22,4427,1019],{},[22,4429,1062],{},[10,4431,1066],{},[10,4433,1069],{},[10,4435,1072,4436,1075],{},[22,4437,860],{},[627,4439,4440],{"className":629,"code":1078,"language":631,"meta":385,"style":385},[22,4441,4442],{"__ignoreMap":385},[635,4443,4444,4446,4448,4450,4452,4454,4456,4458,4460],{"class":637,"line":638},[635,4445,871],{"class":641},[635,4447,874],{"class":652},[635,4449,877],{"class":645},[635,4451,881],{"class":880},[635,4453,884],{"class":641},[635,4455,1095],{"class":652},[635,4457,1098],{"class":660},[635,4459,1101],{"class":645},[635,4461,1104],{"class":660},[627,4463,4464],{"className":890,"code":1107,"language":892,"meta":385,"style":385},[22,4465,4466],{"__ignoreMap":385},[635,4467,4468,4470,4472,4474,4476,4478,4480,4482,4484,4486,4488,4490,4492,4494,4496,4498,4500,4502,4504,4506,4508,4510,4512,4514,4516,4518,4520,4522,4524,4526,4528,4530,4532],{"class":637,"line":638},[635,4469,1114],{"class":899},[635,4471,661],{"class":905},[635,4473,1119],{"class":909},[635,4475,913],{"class":905},[635,4477,916],{"class":899},[635,4479,661],{"class":660},[635,4481,1128],{"class":645},[635,4483,913],{"class":660},[635,4485,1133],{"class":899},[635,4487,661],{"class":905},[635,4489,1138],{"class":909},[635,4491,913],{"class":905},[635,4493,916],{"class":899},[635,4495,1146],{"class":1145},[635,4497,1133],{"class":899},[635,4499,661],{"class":905},[635,4501,1153],{"class":909},[635,4503,913],{"class":905},[635,4505,916],{"class":899},[635,4507,1160],{"class":656},[635,4509,1133],{"class":899},[635,4511,661],{"class":905},[635,4513,1167],{"class":909},[635,4515,913],{"class":905},[635,4517,916],{"class":899},[635,4519,1026],{"class":656},[635,4521,1133],{"class":899},[635,4523,661],{"class":905},[635,4525,1180],{"class":909},[635,4527,913],{"class":905},[635,4529,916],{"class":899},[635,4531,1187],{"class":656},[635,4533,1190],{"class":899},[10,4535,1193,4536,1196,4538],{},[22,4537,1180],{},[22,4539,1199],{},[10,4541,1202],{},[10,4543,1205],{},[10,4545,1208],{},[10,4547,1211],{},[10,4549,1214,4550,1217],{},[22,4551,930],{},[10,4553,802,4554,1223],{},[22,4555,1222],{},[10,4557,1226,4558,1229],{},[22,4559,860],{},[627,4561,4563],{"className":4562,"code":1233,"language":694,"meta":385},[692],[22,4564,1233],{"__ignoreMap":385},[10,4566,4567,1241],{},[22,4568,1240],{},[10,4570,1244],{},[27,4572,1247],{"id":1247},[10,4574,1250,4575,1254,4577],{},[22,4576,1253],{},[22,4578,1257],{},[10,4580,1260],{},[10,4582,1263,4583],{},[22,4584,604],{},[10,4586,1268,4587,1271],{},[22,4588,860],{},[10,4590,1274],{},[10,4592,1277,4593,197,4595,1283,4597],{},[22,4594,748],{},[22,4596,1282],{},[22,4598,860],{},[27,4600,1288],{"id":1288},[1290,4602,1293],{"id":1292},[10,4604,1296],{},[10,4606,1299],{},[627,4608,4610],{"className":4609,"code":1303,"language":694,"meta":385},[692],[22,4611,1303],{"__ignoreMap":385},[10,4613,1308],{},[10,4615,1311,4616,1314],{},[22,4617,604],{},[627,4619,4621],{"className":4620,"code":1318,"language":694,"meta":385},[692],[22,4622,1318],{"__ignoreMap":385},[10,4624,1323],{},[10,4626,1326],{},[10,4628,1329],{},[627,4630,4632],{"className":4631,"code":1333,"language":694,"meta":385},[692],[22,4633,1333],{"__ignoreMap":385},[10,4635,1338],{},[10,4637,1341],{},[1290,4639,4640,1347],{"id":1344},[22,4641,813],{},[10,4643,1350,4644,1353,4646],{},[22,4645,813],{},[22,4647,1356],{},[10,4649,1359,4650],{},[22,4651,1257],{},[10,4653,1364],{},[10,4655,1367],{},[627,4657,4658],{"className":629,"code":1370,"language":631,"meta":385,"style":385},[22,4659,4660],{"__ignoreMap":385},[635,4661,4662,4664],{"class":637,"line":638},[635,4663,1377],{"class":641},[635,4665,1380],{"class":645},[10,4667,1383],{},[1290,4669,1387],{"id":1386},[10,4671,1390,4672,1393],{},[22,4673,813],{},[10,4675,1396,4676,1399,4678,1402],{},[22,4677,621],{},[22,4679,1356],{},[627,4681,4683],{"className":4682,"code":1406,"language":694,"meta":385},[692],[22,4684,1406],{"__ignoreMap":385},[10,4686,1411,4687,1415],{},[22,4688,1414],{},[10,4690,1418,4691,1422],{},[22,4692,1421],{},[627,4694,4695],{"className":1425,"code":1426,"language":1427,"meta":385,"style":385},[22,4696,4697,4701],{"__ignoreMap":385},[635,4698,4699],{"class":637,"line":638},[635,4700,1434],{},[635,4702,4703],{"class":637,"line":386},[635,4704,1439],{},[1290,4706,1443],{"id":1442},[10,4708,1446],{},[10,4710,1449],{},[10,4712,1452],{},[627,4714,4715],{"className":629,"code":1455,"language":631,"meta":385,"style":385},[22,4716,4717],{"__ignoreMap":385},[635,4718,4719,4721,4723],{"class":637,"line":638},[635,4720,1462],{"class":784},[635,4722,789],{"class":788},[635,4724,1467],{"class":645},[10,4726,1470],{},[627,4728,4729],{"className":629,"code":1473,"language":631,"meta":385,"style":385},[22,4730,4731],{"__ignoreMap":385},[635,4732,4733,4735,4737],{"class":637,"line":638},[635,4734,1480],{"class":784},[635,4736,789],{"class":788},[635,4738,1485],{"class":645},[10,4740,1488,4741],{},[22,4742,1491],{},[10,4744,1494,4745,1497],{},[22,4746,1480],{},[1290,4748,1501],{"id":1500},[10,4750,1504,4751,1507,4753],{},[22,4752,720],{},[22,4754,1510],{},[10,4756,1513],{},[627,4758,4759],{"className":629,"code":1516,"language":631,"meta":385,"style":385},[22,4760,4761],{"__ignoreMap":385},[635,4762,4763,4765,4767,4769],{"class":637,"line":638},[635,4764,621],{"class":641},[635,4766,711],{"class":645},[635,4768,1527],{"class":645},[635,4770,1530],{"class":652},[10,4772,1533],{},[1290,4774,1536],{"id":1536},[10,4776,1539],{},[10,4778,1542],{},[27,4780,371],{"id":371},[10,4782,1547],{},[10,4784,1550],{},[10,4786,1553],{},[10,4788,1556],{},[10,4790,1559],{},[10,4792,1562],{},[10,4794,1565],{},[10,4796,1568,4797,1571,4799,1422],{},[22,4798,813],{},[22,4800,1421],{},[27,4802,1577],{"id":1576},[38,4804,4805,4810,4815,4820],{},[41,4806,4807],{},[531,4808,1585],{"href":569,"rel":4809},[535],[41,4811,4812],{},[531,4813,1592],{"href":1590,"rel":4814},[535],[41,4816,4817],{},[531,4818,1599],{"href":1597,"rel":4819},[535],[41,4821,4822],{},[531,4823,1606],{"href":1604,"rel":4824},[535],[1608,4826,1610],{},{"title":385,"searchDepth":386,"depth":386,"links":4828},[4829,4830,4831,4832,4833,4834,4842,4843],{"id":559,"depth":386,"text":560},{"id":581,"depth":386,"text":582},{"id":611,"depth":386,"text":611},{"id":817,"depth":386,"text":817},{"id":1247,"depth":386,"text":1247},{"id":1288,"depth":386,"text":1288,"children":4835},[4836,4837,4838,4839,4840,4841],{"id":1292,"depth":925,"text":1293},{"id":1344,"depth":925,"text":1622},{"id":1386,"depth":925,"text":1387},{"id":1442,"depth":925,"text":1443},{"id":1500,"depth":925,"text":1501},{"id":1536,"depth":925,"text":1536},{"id":371,"depth":386,"text":371},{"id":1576,"depth":386,"text":1577},{},{"title":554,"description":1630},{"loc":1633,"images":4847,"lastmod":1629},[4848],{"loc":844},[412],1792202848926]