[{"data":1,"prerenderedAt":3435},["ShallowReactive",2],{"blogs-2026-09-16-headroom":3,"next-blog-2026-09-16-headroom":975,"prev-blog-2026-09-16-headroom":975,"recommended-blog-2026-09-16-headroom":984,"related-blog-2026-09-16-headroom":985},{"id":4,"title":5,"body":6,"date":969,"description":970,"draft":971,"extension":972,"meta":973,"navigation":974,"next":975,"ogTitle":976,"path":977,"pin":971,"prev":975,"recommends":975,"seo":978,"sitemap":979,"stem":980,"tags":981,"updated":975,"__hash__":983},"content/blogs/2026-09-16-headroom.md","ลองใช้ Headroom บีบ context ก่อนส่งเข้า Claude Code",{"type":7,"value":8,"toc":959},"minimark",[9,14,18,32,35,38,42,45,48,51,63,66,69,80,123,129,132,144,152,155,170,185,192,204,210,217,242,253,256,259,270,276,287,294,320,483,496,499,502,508,537,623,629,632,635,638,641,647,661,667,673,676,686,692,701,710,726,730,735,738,744,750,756,759,762,768,775,780,794,804,809,829,840,846,867,884,890,893,896,899,902,905,908,911,920,924,955],[10,11,13],"h2",{"id":12},"introduction","Introduction",[15,16,17],"p",{},"ใครใช้ Claude Code หรือ Codex เป็นหลักน่าจะเคยรู้สึกเหมือนกันครับ ว่า token มันไหลเร็วกว่าที่คิดเยอะ Agent อ่านไฟล์ที ยิง grep ที ดึง log ที ของพวกนี้เข้าไปกองอยู่ใน context แล้วรอบถัดไปก็ส่งไปใหม่อีก",[15,19,20,21,31],{},"ช่วงนี้ผมเลยลอง ",[22,23,24],"strong",{},[25,26,30],"a",{"href":27,"rel":28},"https://github.com/headroomlabs-ai/headroom",[29],"nofollow","Headroom"," ดู มันเป็น proxy ที่คั่นอยู่ระหว่าง agent กับ provider แล้วพยายามบีบ context พวกนี้ให้เล็กลงก่อนส่งออก ตอนที่เขียนอยู่นี่ repo มีดาวเจ็ดหมื่นกว่า ทั้งที่เพิ่งสร้างเมื่อมกราคมปีนี้เอง",[15,33,34],{},"บทความนี้ไม่ได้เอา benchmark ใน README มาเล่าต่อนะครับ ผมรันมันจริงบนเครื่องตัวเองหนึ่งวัน ตัวเลขกับ output ที่แปะไว้ก๊อปมาจาก terminal ตรง ๆ มีตัดบางบรรทัดที่ไม่เกี่ยวออกเพื่อให้อ่านง่าย แต่ไม่ได้แก้ตัวเลข เวอร์ชันที่ใช้คือ v0.37.0 ต่อกับ Claude Code",[15,36,37],{},"แล้วผลที่ได้ก็ไม่ค่อยเหมือนที่ผมคิดไว้ตอนแรกเท่าไหร่",[10,39,41],{"id":40},"headroom-คืออะไร","Headroom คืออะไร",[15,43,44],{},"ถ้าอธิบายแบบไม่ลงรายละเอียดเยอะ Headroom ก็คือชั้นบีบ context ที่รันอยู่ในเครื่องเราเอง ของที่ไหลผ่านมันมีทั้ง tool output, log, ไฟล์, RAG chunk แล้วก็ประวัติแชท",[15,46,47],{},"ข้างในไม่ได้มีตัวบีบตัวเดียว แต่แบ่งงานกันตามชนิดของข้อมูล มี SmartCrusher ไว้จัดการ JSON ก้อนใหญ่ ๆ มี CodeCompressor ที่อ่าน AST ของภาษาได้ 11 ภาษา (Python, JS/TS, Go, Rust, Java, C/C++, C#, PHP, Perl) แล้วก็มีโมเดลชื่อ kompress-v2-base ไว้บีบข้อความธรรมดา ตัวที่คอยดูว่าจะส่งงานให้ใครเรียกว่า ContentRouter",[15,49,50],{},"เรื่อง CodeCompressor มีอะไรให้พูดนิดนึงครับ เอกสารเขาเขียนไว้เองตรง ๆ ว่ามัน gate ไว้แน่นจน \"แทบไม่ทำงานในสถานการณ์จริง\" แล้วก็บอกด้วยว่าตั้งใจให้เป็นแบบนั้น มันจะเก็บโค้ดที่เพิ่งคุยกันกับโค้ดที่กำลังวิเคราะห์อยู่ไว้ครบ ไม่ไปแตะ ซึ่งก็เข้าใจได้ว่ากลัวทำของที่เรากำลังแก้อยู่เพี้ยน แต่ผลคือทั้งวันของผมมันยิงไปแค่ 3 ครั้งเอง",[15,52,53,54,57,58,62],{},"อย่างหนึ่งที่ผมชอบคือมัน ",[22,55,56],{},"ย้อนกลับได้"," ของเดิมถูก cache ไว้ในเครื่อง แล้วโมเดลเรียก ",[59,60,61],"code",{},"headroom_retrieve"," ขอตัวเต็มคืนได้ ไม่ใช่บีบแล้วหายไปเลย ตรงนี้เดี๋ยวจะกลับมาพูดอีกที เพราะพอใช้จริงแล้วมันสำคัญกว่าที่คิด",[15,64,65],{},"ใช้ได้ 4 แบบครับ เรียกเป็น library ในโค้ด, รันเป็น proxy, สั่ง wrap agent ให้เลย หรือเสียบเป็น MCP server ผมเลือกแบบ wrap เพราะง่ายสุด",[10,67,68],{"id":68},"วิธีการติดตั้ง",[15,70,71,72,75,76,79],{},"ตัว CLI มีเฉพาะใน PyPI นะครับ ส่วน ",[59,73,74],{},"headroom-ai"," บน npm เป็น TypeScript SDK อย่างเดียว ไม่มีคำสั่ง ",[59,77,78],{},"headroom"," ให้ใช้ ต้องมี Python 3.10 ขึ้นไป",[81,82,87],"pre",{"className":83,"code":84,"language":85,"meta":86,"style":86},"language-sh shiki shiki-themes material-theme-lighter one-dark-pro github-dark","uv tool install --python 3.13 \"headroom-ai[all]\"\n","sh","",[59,88,89],{"__ignoreMap":86},[90,91,94,98,102,105,109,113,117,120],"span",{"class":92,"line":93},"line",1,[90,95,97],{"class":96},"sosa_","uv",[90,99,101],{"class":100},"sAlJX"," tool",[90,103,104],{"class":100}," install",[90,106,108],{"class":107},"sEoV_"," --python",[90,110,112],{"class":111},"snOyU"," 3.13",[90,114,116],{"class":115},"snfNA"," \"",[90,118,119],{"class":100},"headroom-ai[all]",[90,121,122],{"class":115},"\"\n",[15,124,125,126],{},"ผมแนะนำให้ล็อก Python เป็น 3.13 ไปเลยครับ เพราะตัวคิดเงินของมันพึ่ง LiteLLM ซึ่งลงบน Python 3.14 ไม่ได้ ถ้าใช้ 3.14 ตัวเลข token ยังนับปกติ แต่ช่องเงินใน dashboard จะค้างอยู่ที่ ",[59,127,128],{},"$0.00",[15,130,131],{},"เช็คเวอร์ชันก่อน",[81,133,135],{"className":83,"code":134,"language":85,"meta":86,"style":86},"headroom --version\n",[59,136,137],{"__ignoreMap":86},[90,138,139,141],{"class":92,"line":93},[90,140,78],{"class":96},[90,142,143],{"class":107}," --version\n",[81,145,150],{"className":146,"code":148,"language":149},[147],"language-text","headroom, version 0.37.0\n","text",[59,151,148],{"__ignoreMap":86},[15,153,154],{},"จากนั้นสั่ง wrap ได้เลย คำสั่งเดียวจบ",[81,156,158],{"className":83,"code":157,"language":85,"meta":86,"style":86},"headroom wrap claude\n",[59,159,160],{"__ignoreMap":86},[90,161,162,164,167],{"class":92,"line":93},[90,163,78],{"class":96},[90,165,166],{"class":100}," wrap",[90,168,169],{"class":100}," claude\n",[15,171,172,173,176,177,180,181,184],{},"มันจะยก proxy ขึ้นที่ port 8787 แล้วเปิด Claude Code ให้โดยตั้ง ",[59,174,175],{},"ANTHROPIC_BASE_URL"," ชี้มาที่ proxy ให้เสร็จสรรพ (แถมตั้ง ",[59,178,179],{},"ENABLE_TOOL_SEARCH"," ให้ด้วย เดี๋ยวจะได้เห็นว่าตัวนี้แหละที่ประหยัดได้เยอะสุด) อยากเลิกใช้เมื่อไหร่ก็ ",[59,182,183],{},"headroom unwrap claude"," คืนค่าเดิมให้",[15,186,187,188,191],{},"มีคำสั่ง ",[59,189,190],{},"doctor"," ไว้ตรวจว่าต่อติดจริงไหมด้วย อันนี้ควรรันสักรอบครับ",[81,193,195],{"className":83,"code":194,"language":85,"meta":86,"style":86},"headroom doctor\n",[59,196,197],{"__ignoreMap":86},[90,198,199,201],{"class":92,"line":93},[90,200,78],{"class":96},[90,202,203],{"class":100}," doctor\n",[81,205,208],{"className":206,"code":207,"language":149},[147],"Headroom Doctor v0.37.0 · port 8787\n\n┃ check       ┃ status ┃ summary                                     ┃\n│ proxy       │ ✓ pass │ running at http://127.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",[59,209,207],{"__ignoreMap":86},[15,211,212,213,216],{},"ตรง ",[59,214,215],{},"budget"," ที่ขึ้นเตือนมา ตั้งเพดานรายวันได้ครับ ถ้าใช้ท่า wrap แบบนี้ให้ส่งผ่าน env ไป",[81,218,220],{"className":83,"code":219,"language":85,"meta":86,"style":86},"HEADROOM_BUDGET=10 headroom wrap claude\n",[59,221,222],{"__ignoreMap":86},[90,223,224,228,232,235,238,240],{"class":92,"line":93},[90,225,227],{"class":226},"sLHrO","HEADROOM_BUDGET",[90,229,231],{"class":230},"sMTEB","=",[90,233,234],{"class":100},"10",[90,236,237],{"class":96}," headroom",[90,239,166],{"class":100},[90,241,169],{"class":100},[15,243,244,245,248,249,252],{},"ส่วน flag ",[59,246,247],{},"--budget"," เป็นของคำสั่ง ",[59,250,251],{},"headroom proxy"," คนละตัวกัน ถ้ายก proxy เองอยู่แล้วค่อยใช้อันนั้น (แล้วอย่าไปยกซ้อน port 8787 ที่ wrap จองไว้นะ มันชนกัน)",[10,254,255],{"id":255},"ตัวเลขจริงหลังใช้ไปหนึ่งวัน",[15,257,258],{},"ตรงนี้แหละที่ผมว่าน่าสนใจที่สุด เพราะผลที่ได้ไม่ตรงกับที่คิดไว้ตอนแรกเลย",[15,260,261,262,265,266,269],{},"ดูแบบเร็ว ๆ ได้จากคำสั่ง ",[59,263,264],{},"headroom dashboard"," มันจะเปิดหน้าเว็บที่ ",[59,267,268],{},"127.0.0.1:8787/dashboard"," ให้",[15,271,272],{},[273,274],"img",{"alt":86,"src":275},"/images/2026-09-16-headroom/dashboard.png",[15,277,278,279,282,283,286],{},"ภาพนี้ผมถ่ายทีหลังนะครับ ตัวเลขเลยเดินไปจากที่จะยกมาข้างล่างอยู่บ้าง แต่รูปร่างของมันเหมือนเดิม สังเกตช่อง ",[59,280,281],{},"SAVINGS · TOOL SEARCH"," ที่แยกออกมาอยู่ต่างหากจาก ",[59,284,285],{},"TOKENS SAVED"," ไว้ก่อน เดี๋ยวจะได้เห็นว่าทำไมถึงต้องสนใจตรงนั้น",[15,288,289,290,293],{},"ส่วนถ้าอยากได้ตัวเลขดิบ ดึงจาก ",[59,291,292],{},"/stats"," ตรง ๆ ได้แบบนี้",[81,295,297],{"className":83,"code":296,"language":85,"meta":86,"style":86},"curl -s 127.0.0.1:8787/stats | jq .summary.compression\n",[59,298,299],{"__ignoreMap":86},[90,300,301,304,307,310,314,317],{"class":92,"line":93},[90,302,303],{"class":96},"curl",[90,305,306],{"class":107}," -s",[90,308,309],{"class":100}," 127.0.0.1:8787/stats",[90,311,313],{"class":312},"sbGrh"," |",[90,315,316],{"class":96}," jq",[90,318,319],{"class":100}," .summary.compression\n",[81,321,325],{"className":322,"code":323,"language":324,"meta":86,"style":86},"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",[59,326,327,333,356,373,390,411,428,445,462,477],{"__ignoreMap":86},[90,328,329],{"class":92,"line":93},[90,330,332],{"class":331},"stlKB","{\n",[90,334,336,340,344,347,350,353],{"class":92,"line":335},2,[90,337,339],{"class":338},"sObbn","  \"",[90,341,343],{"class":342},"sVeMc","requests_compressed",[90,345,346],{"class":338},"\"",[90,348,349],{"class":331},":",[90,351,352],{"class":111}," 129",[90,354,355],{"class":331},",\n",[90,357,359,361,364,366,368,371],{"class":92,"line":358},3,[90,360,339],{"class":338},[90,362,363],{"class":342},"avg_compression_pct",[90,365,346],{"class":338},[90,367,349],{"class":331},[90,369,370],{"class":111}," 1.7",[90,372,355],{"class":331},[90,374,376,378,381,383,385,388],{"class":92,"line":375},4,[90,377,339],{"class":338},[90,379,380],{"class":342},"best_compression_pct",[90,382,346],{"class":338},[90,384,349],{"class":331},[90,386,387],{"class":111}," 11.8",[90,389,355],{"class":331},[90,391,393,395,398,400,402,404,407,409],{"class":92,"line":392},5,[90,394,339],{"class":338},[90,396,397],{"class":342},"best_detail",[90,399,346],{"class":338},[90,401,349],{"class":331},[90,403,116],{"class":115},[90,405,406],{"class":100},"15,316 → 13,505 tokens",[90,408,346],{"class":115},[90,410,355],{"class":331},[90,412,414,416,419,421,423,426],{"class":92,"line":413},6,[90,415,339],{"class":338},[90,417,418],{"class":342},"total_tokens_removed",[90,420,346],{"class":338},[90,422,349],{"class":331},[90,424,425],{"class":111}," 130497",[90,427,355],{"class":331},[90,429,431,433,436,438,440,443],{"class":92,"line":430},7,[90,432,339],{"class":338},[90,434,435],{"class":342},"total_tokens_before",[90,437,346],{"class":338},[90,439,349],{"class":331},[90,441,442],{"class":111}," 10992312",[90,444,355],{"class":331},[90,446,448,450,453,455,457,460],{"class":92,"line":447},8,[90,449,339],{"class":338},[90,451,452],{"class":342},"tool_schema_tokens_saved",[90,454,346],{"class":338},[90,456,349],{"class":331},[90,458,459],{"class":111}," 484226",[90,461,355],{"class":331},[90,463,465,467,470,472,474],{"class":92,"line":464},9,[90,466,339],{"class":338},[90,468,469],{"class":342},"total_tokens_saved_all_layers",[90,471,346],{"class":338},[90,473,349],{"class":331},[90,475,476],{"class":111}," 614723\n",[90,478,480],{"class":92,"line":479},10,[90,481,482],{"class":331},"}\n",[15,484,485,486,489,490,492,493],{},"ตอนเห็นครั้งแรกผมก็งงนิดนึง เพราะตัว compression ที่ควรจะเป็นพระเอกของโปรเจกต์นี้ลดไป ",[22,487,488],{},"130,497 token"," แต่ ",[59,491,452],{}," กลับลดไปถึง ",[22,494,495],{},"484,226 token",[15,497,498],{},"สองอย่างนี้คนละเรื่องกันครับ ตัวหลังคือการไม่ส่ง schema ของ tool ทั้งกองไปหาโมเดลทุกรอบ แล้วค่อยโหลดเฉพาะตัวที่จะใช้แทน",[15,500,501],{},"พูดง่าย ๆ คือเกือบ 80% ของ token ที่ประหยัดได้ในงานผม ไม่ได้มาจาก compression เลย",[15,503,504,505,507],{},"ตลกดีตรงที่ ",[59,506,292],{}," ของมันเองกลับไม่ตีราคาส่วนนี้เป็นเงินให้เลย",[81,509,511],{"className":83,"code":510,"language":85,"meta":86,"style":86},"curl -s 127.0.0.1:8787/stats | jq -c '.savings.by_source'\n",[59,512,513],{"__ignoreMap":86},[90,514,515,517,519,521,523,525,528,531,534],{"class":92,"line":93},[90,516,303],{"class":96},[90,518,306],{"class":107},[90,520,309],{"class":100},[90,522,313],{"class":312},[90,524,316],{"class":96},[90,526,527],{"class":107}," -c",[90,529,530],{"class":115}," '",[90,532,533],{"class":100},".savings.by_source",[90,535,536],{"class":115},"'\n",[81,538,540],{"className":322,"code":539,"language":324,"meta":86,"style":86},"[{ \"source\": \"tool_search\", \"realized\": true, \"events\": 79, \"tokens\": 484226, \"usd\": 0.0 }]\n",[59,541,542],{"__ignoreMap":86},[90,543,544,547,549,552,554,556,558,561,563,566,568,571,573,575,579,581,583,586,588,590,593,595,597,600,602,604,606,608,610,613,615,617,620],{"class":92,"line":93},[90,545,546],{"class":331},"[{",[90,548,116],{"class":338},[90,550,551],{"class":342},"source",[90,553,346],{"class":338},[90,555,349],{"class":331},[90,557,116],{"class":115},[90,559,560],{"class":100},"tool_search",[90,562,346],{"class":115},[90,564,565],{"class":331},",",[90,567,116],{"class":338},[90,569,570],{"class":342},"realized",[90,572,346],{"class":338},[90,574,349],{"class":331},[90,576,578],{"class":577},"scCEF"," true",[90,580,565],{"class":331},[90,582,116],{"class":338},[90,584,585],{"class":342},"events",[90,587,346],{"class":338},[90,589,349],{"class":331},[90,591,592],{"class":111}," 79",[90,594,565],{"class":331},[90,596,116],{"class":338},[90,598,599],{"class":342},"tokens",[90,601,346],{"class":338},[90,603,349],{"class":331},[90,605,459],{"class":111},[90,607,565],{"class":331},[90,609,116],{"class":338},[90,611,612],{"class":342},"usd",[90,614,346],{"class":338},[90,616,349],{"class":331},[90,618,619],{"class":111}," 0.0",[90,621,622],{"class":331}," }]\n",[15,624,625,626,628],{},"สี่แสนแปดหมื่น token แต่ช่อง ",[59,627,612],{}," ยังเป็น 0.0",[15,630,631],{},"เพราะงั้นถ้าดูแค่ตัวเลขเงินบน dashboard จะเข้าใจว่าประหยัดได้น้อยกว่าความเป็นจริง เพราะมันนับเงินจากฝั่ง compression แต่ไม่ได้รวม token ที่หายไปจาก tool schema",[15,633,634],{},"แล้วทำไม compression ของผมถึงได้น้อยขนาดนี้?",[15,636,637],{},"จริง ๆ README บอกไว้ค่อนข้างตรงอยู่แล้วว่า ถ้า input เป็นข้อความล้วนหรือข้อมูลที่แน่นอยู่แล้ว มันจะบีบได้ไม่เยอะ ส่วน benchmark 21-57% ที่เขาโชว์จะเป็น output ของ tool พวก code search, ไล่ incident, สำรวจ codebase หรือ triage issue ซึ่งมีของก้อนใหญ่ ๆ ให้บีบ",[15,639,640],{},"แต่วันที่ผมทดสอบ ผมนั่งเขียน markdown ภาษาไทยเป็นหลัก ก็เลยไม่มีอะไรให้มันบีบเท่าไหร่ครับ",[15,642,643,644,646],{},"อีกเรื่องที่ควรรู้คือเลข ",[59,645,363],{}," 1.7 เป็นค่าเฉลี่ยราย request ถ้าเอา token ที่ลดได้ทั้งหมดหารด้วยของที่ส่งไปทั้งหมด (130,497 จาก 10,992,312) จะเหลือราว 1.2% ครับ",[15,648,649,650,653,654,657,658,660],{},"ส่วนช่อง ",[59,651,652],{},"cache_savings_usd"," มันขึ้นตัวเลขใหญ่มาก (ของผมสะสมทั้งวันรวมทุกโปรเจกต์ไปร้อยกว่าเหรียญ) แต่อันนี้ ",[22,655,656],{},"ไม่ใช่ของที่ Headroom ประหยัดให้"," นะครับ ไม่ต้องเชื่อผมก็ได้ ไปอ่านคำอธิบายที่มันเขียนไว้เองใน ",[59,659,292],{}," เลย",[81,662,665],{"className":663,"code":664,"language":149},[147],"Cost discount from provider prefix caching. Headroom's CacheAligner improves\nhit rates; baseline caching is provider-native.\n",[59,666,664],{"__ignoreMap":86},[15,668,669,672],{},[59,670,671],{},"baseline caching is provider-native"," คือ prompt cache เป็นของฝั่ง Anthropic API ที่ Claude Code เรียกใช้อยู่แล้วตั้งแต่แรก หน้าที่ของ Headroom คือบีบเฉพาะส่วนที่เพิ่งเข้ามาใหม่ ไม่ไปแตะก้อนเดิม cache มันเลยยังใช้ได้อยู่ พูดให้ถูกคือ \"ไม่ไปทำ cache พัง\" มากกว่า \"ประหยัดค่า cache ให้\"",[10,674,675],{"id":675},"หลังใช้จริงแล้วชอบอะไรบ้าง",[15,677,678,681,682,685],{},[22,679,680],{},"ติดตั้งแล้วจบ"," ไม่ต้องไปนั่งแก้โค้ดหรือแก้ config ของ agent เอง สั่ง ",[59,683,684],{},"headroom wrap claude"," ทีเดียวแล้วใช้ต่อได้เลย ถอนก็คำสั่งเดียว",[15,687,688,691],{},[22,689,690],{},"ลด tool schema ได้จริงและเยอะ"," อันนี้เห็นผลชัดสุดในงานผม สี่แสนกว่า token ในวันเดียว และอย่างที่บอกไปว่ามันไม่ยอมคิดเป็นเงินให้ด้วย เลยเป็นกำไรที่ไม่โผล่ในรายงาน",[15,693,694,697,698,700],{},[22,695,696],{},"ของเดิมย้อนกลับได้"," ไม่ได้บีบทิ้งอย่างเดียว มี ",[59,699,61],{}," ให้ขอตัวเต็มคืน",[15,702,703,706,707,709],{},[22,704,705],{},"ช้าลงบ้างแต่ไม่ถึงกับรู้สึก"," อันนี้ผมวัดเองจาก ",[59,708,292],{}," ได้ค่า overhead เฉลี่ยราว ๆ 100 ms ต่อ request เทียบกับเวลารอโมเดลตอบจริงที่หลักสิบวินาที ก็ถือว่าไม่ได้เป็นภาระอะไร (README เคลมไว้ที่ 0.21 ms แต่นั่นคือ path ของ JSON ส่วนงานเขียนข้อความมันวิ่งเข้าตัวบีบที่เป็น ML ซึ่งช้ากว่ากันเยอะ ของผมหนักสุดที่เจอคือ 4 วินาที)",[15,711,712,715,716,718,719,722,723,725],{},[22,713,714],{},"มีเครื่องมือให้ดูตัวเลข"," ทั้ง ",[59,717,190],{},", ",[59,720,721],{},"dashboard",", กับ ",[59,724,292],{}," ไม่ต้องเดาว่ามันทำงานอยู่หรือเปล่า",[10,727,729],{"id":728},"จุดที่ผมติดจริง-ๆ-ตอนใช้งาน","จุดที่ผมติดจริง ๆ ตอนใช้งาน",[15,731,732],{},[22,733,734],{},"ข้อแรกนี่สำคัญสุด: มันบีบ tool output จนอ่านได้ไม่ครบ",[15,736,737],{},"อันนี้เจอตอนเขียนบทความนี้เองเลยครับ ผมให้ agent ไป grep หาคำในไฟล์ README ตัวผมที่นั่งดูอยู่หน้า terminal เห็น output ครบทุกบรรทัดปกติดี แต่ของที่ส่งไปถึงตัวโมเดลจริง ๆ หน้าตาเป็นแบบนี้",[81,739,742],{"className":740,"code":741,"language":149},[147],"328:you\n330:preserved. vscode-claude`\n",[59,743,741],{"__ignoreMap":86},[15,745,746,747,749],{},"มันเกือบสรุปว่าไม่เจออะไรแล้ว พอสั่งให้เรียก ",[59,748,61],{}," ขอตัวเต็มคืนมาดู ของจริงคือแบบนี้",[81,751,754],{"className":752,"code":753,"language":149},[147],"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",[59,755,753],{"__ignoreMap":86},[15,757,758],{},"คือตัดกลางประโยคไปเลย",[15,760,761],{},"ที่ผมว่าน่ากลัวคือคนนั่งหน้าจอไม่มีทางรู้ เพราะเราเห็นของครบ ตัวที่อ่านไม่ครบคือโมเดล สัญญาณเดียวที่พอสังเกตได้คือบรรทัดเล็ก ๆ ที่มันแปะไว้ท้าย output",[81,763,766],{"className":764,"code":765,"language":149},[147],"[276 words compressed to 174 (from 6 source lines). Retrieve more: hash=24aa7b12]\n",[59,767,765],{"__ignoreMap":86},[15,769,770,771,774],{},"ย้ำว่าของเดิมยังอยู่ ขอคืนได้ครับ แต่ปัญหาคือ ",[22,772,773],{},"ต้องรู้ตัวก่อนว่าต้องขอคืน"," ถ้า agent ไม่ทันสังเกตว่า output ขาดไป ก็ตัดสินใจจากของที่ไม่ครบไปแล้ว งานไหนที่ต้องอ่านทุกบรรทัดจริง ๆ เช่นไล่ log หาสาเหตุ หรือ audit ของที่เกี่ยวกับความปลอดภัย ผมว่าต้องระวังตรงนี้มาก ๆ",[15,776,777],{},[22,778,779],{},"มันแถม Serena มาให้ด้วย",[15,781,782,783,786,787,790,791],{},"ตาม README บอกไว้ว่าพอสั่ง ",[59,784,785],{},"wrap"," มันจะลง Serena (ตัวช่วย navigate โค้ดแบบเข้าใจ symbol) ให้เลย แล้วลงทะเบียนไว้ที่ user scope คือใน ",[59,788,789],{},"~/.claude.json"," ไม่ได้อยู่แค่โปรเจกต์ที่เรา wrap เท่ากับเปิดโปรเจกต์อื่นก็จะเจอมันติดไปด้วย จนกว่าจะสั่ง ",[59,792,793],{},"unwrap",[15,795,796,797,799,800,803],{},"ส่วนใครที่มี Serena ของตัวเองอยู่ก่อนแล้วไม่ต้องกังวลครับ ผมไปเปิด ",[59,798,789],{}," ดู config เดิมของผมยังอยู่ครบ ไม่โดนทับ (ของผม pin เวอร์ชันไว้เองผ่าน uvx มันก็ยังเป็นอันเดิมเป๊ะ) ถ้าไม่อยากได้เลยก็ใส่ ",[59,801,802],{},"--code-memory none"," ตอน wrap ได้ครับ",[15,805,806],{},[22,807,808],{},"แต่มันแอบแก้ของให้เราหลายอย่างกว่าที่คิด",[15,810,811,812,814,815,817,818,718,821,824,825,828],{},"ต่อจากข้อบน ผมบอกไปตอนข้อดีว่า \"ไม่ต้องแก้ config เอง\" ซึ่งก็จริงในแง่ที่เราไม่ต้องลงมือเอง แต่ไม่ได้แปลว่าไม่มีอะไรถูกแก้นะครับ ของผมมันเพิ่ม MCP server ชื่อ ",[59,813,78],{}," เข้าไปใน ",[59,816,789],{}," ที่ user scope แล้วก็โปรยไฟล์ไว้ในโปรเจกต์อีกชุด ทั้ง ",[59,819,820],{},".claude/.headroom_wrap_marker.json",[59,822,823],{},".headroom_wrap_owners.json"," กับโฟลเดอร์ ",[59,826,827],{},".headroom/"," ที่มี database อยู่ 3 ไฟล์",[15,830,831,832,835,836,839],{},"ของพวกนี้โผล่ใน ",[59,833,834],{},"git status"," เป็น untracked หมด ใครจะใช้ก็แนะนำให้ใส่ ",[59,837,838],{},".gitignore"," ไว้ก่อนเลยครับ ไม่งั้นเผลอ commit ติดไปแน่นอน",[81,841,844],{"className":842,"code":843,"language":149},[147],".headroom/\n.claude/.headroom_wrap_*\n",[59,845,843],{"__ignoreMap":86},[15,847,848,851,852,718,855,858,859,862,863,866],{},[22,849,850],{},"ส่ง telemetry ออกไปตั้งแต่แรก"," ค่า default คือเปิด เขาบอกว่าส่งแค่อัตราการบีบ, ชื่อ provider/model, OS, สถาปัตยกรรม ไม่ส่ง prompt ไม่ส่งโค้ด ไม่ส่ง path ถ้าไม่อยากให้ส่งก็ปิดได้ด้วย ",[59,853,854],{},"HEADROOM_BEACON=off",[59,856,857],{},"DO_NOT_TRACK=1"," หรือ ",[59,860,861],{},"--offline"," (ของผมปิดอยู่แล้วเพราะตั้ง ",[59,864,865],{},"DO_NOT_TRACK"," ไว้ตั้งแต่แรก)",[15,868,869,872,873,875,876,879,880,883],{},[22,870,871],{},"ฟีเจอร์บางอย่างของ Claude Code จะใช้ไม่ได้"," เพราะพอ ",[59,874,175],{}," ชี้ไปที่ proxy ตัว Claude Code จะปิด ",[59,877,878],{},"/remote-control"," ให้เอง แล้ว context 1M token ก็ไม่ได้มาให้อัตโนมัติ ต้องสั่ง ",[59,881,882],{},"headroom wrap claude --1m"," เอง ส่วน Claude Desktop ยังไม่รองรับ มันเขียนทับ base URL ทิ้ง",[15,885,886,889],{},[22,887,888],{},"ออกเวอร์ชันถี่มาก"," 198 เวอร์ชันบน PyPI ในเวลา 7 เดือนครึ่ง เฉลี่ยเกือบวันละตัว ข้อดีคือแก้บั๊กไว แต่ก็แปลว่าของมันขยับเร็ว ใครไม่ชอบไล่ตามอาจจะเหนื่อย",[10,891,892],{"id":892},"สรุป",[15,894,895],{},"ก่อนลอง ผมคิดว่าเหตุผลหลักที่จะใช้ Headroom คือเอามาบีบ context ให้เล็กลง",[15,897,898],{},"พอลองจริงหนึ่งวัน กลายเป็นว่าส่วน compression ลด token ในงานผมได้ไม่เยอะเลย ของที่ช่วยหนักกว่าดันเป็น tool search ซึ่งลดไปสี่แสนกว่า token โดยที่ dashboard ยังไม่ได้คิดออกมาเป็นเงินให้ด้วยซ้ำ",[15,900,901],{},"แต่สิ่งที่ทำให้ผมลังเลกลับไม่ใช่เรื่องว่ามันประหยัดได้กี่เปอร์เซ็นต์ เป็นเรื่อง output แหว่งมากกว่า",[15,903,904],{},"ของเดิมไม่ได้หายนะครับ เรียกคืนได้ แต่เราต้องรู้ก่อนว่ามีอะไรหายถึงจะเรียกคืน และตรงนี้แหละที่ผมว่าน่าคิด เพราะคนที่นั่งหน้า terminal เห็น output ครบ คนที่เห็นของไม่ครบคือโมเดล",[15,906,907],{},"ถ้างานเป็นพวก API response ใหญ่ ๆ, JSON, code search หรือ log ยาว ๆ Headroom น่าจะได้ทำงานที่มันถนัดกว่าวันที่ผมทดสอบเยอะ ส่วนงานเขียนหรือแก้ไฟล์ทีละไฟล์แบบที่ผมทำวันนั้น compression แทบไม่ได้ช่วยอะไร",[15,909,910],{},"ตอนนี้ผมยังเปิดใช้อยู่ครับ อย่างน้อยก็อยากเก็บตัวเลขต่ออีกหน่อย แต่กับงานที่ข้อมูลทุกบรรทัดสำคัญ ผมคงไม่ปล่อยให้มันบีบแล้วเชื่อ output ที่ได้ทันที",[15,912,913,914,916,917,919],{},"ใครอยากลองก็ลองได้ครับ ติดตั้งง่าย ถอนง่าย แค่แนะนำให้รู้ก่อนว่า ",[59,915,785],{}," ทำอะไรกับเครื่องเราบ้าง แล้วก็อย่าลืม ",[59,918,838],{}," ไฟล์ที่มันสร้างไว้ด้วย",[10,921,923],{"id":922},"references","References",[925,926,927,934,941,948],"ul",{},[928,929,930],"li",{},[25,931,933],{"href":27,"rel":932},[29],"Headroom บน GitHub",[928,935,936],{},[25,937,940],{"href":938,"rel":939},"https://docs.headroomlabs.ai/",[29],"เอกสารของ Headroom",[928,942,943],{},[25,944,947],{"href":945,"rel":946},"https://pypi.org/project/headroom-ai/",[29],"headroom-ai บน PyPI",[928,949,950],{},[25,951,954],{"href":952,"rel":953},"https://github.com/oraios/serena",[29],"Serena ตัวที่ Headroom ลงให้",[956,957,958],"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":86,"searchDepth":335,"depth":335,"links":960},[961,962,963,964,965,966,967,968],{"id":12,"depth":335,"text":13},{"id":40,"depth":335,"text":41},{"id":68,"depth":335,"text":68},{"id":255,"depth":335,"text":255},{"id":675,"depth":335,"text":675},{"id":728,"depth":335,"text":729},{"id":892,"depth":335,"text":892},{"id":922,"depth":335,"text":923},"2026-09-16T00:00:00.000Z","รีวิว Headroom ตัวบีบ context ก่อนส่งถึง LLM ตั้งแต่วิธีติดตั้ง ตัวเลขจริงที่วัดได้จากเครื่องตัวเอง ไปจนถึงข้อดีข้อเสียและเรื่องที่ควรรู้ก่อนเอาไปใช้จริง",false,"md",{},true,null,"Headroom Context Compression Review","/blogs/2026-09-16-headroom",{"title":5,"description":970},{"loc":977},"blogs/2026-09-16-headroom",[982],"AI","FOivnHUFg5FzJYV3EcViX2V08y7PXRBICqTq4Ynx9lA",[],[986,1801,2571,2696,2920,3006,3105,3231,3348],{"id":987,"title":988,"body":989,"date":1788,"description":1789,"draft":971,"extension":972,"meta":1790,"navigation":974,"next":1791,"ogTitle":1792,"path":1793,"pin":971,"prev":975,"recommends":1794,"seo":1796,"sitemap":1797,"stem":1798,"tags":1799,"updated":975,"__hash__":1800},"content/blogs/2025-04-24-n8n-part-1.md","N8N วิธีการ Setup | Part 1",{"type":7,"value":990,"toc":1777},[991,995,998,1001,1005,1023,1025,1030,1056,1060,1073,1370,1381,1400,1403,1435,1452,1456,1463,1469,1632,1635,1700,1703,1710,1715,1718,1723,1726,1730,1736,1739,1744,1755,1760,1767,1774],[10,992,994],{"id":993},"n8n-คืออะไร","N8N คืออะไร",[15,996,997],{},"คือ Platform สำหรับทำ workflow automation หรือพูดให้เข้าใจง่าย ๆ ก็คือพวกระบบอัตโนมัติต่าง ๆ นั้นแหละครับ ซึ่งจุดเด่นของเครื่องมือตัวนี้คือเป็น Open Source มีทั้ง version cloud และ self-hosted ให้ใช้งานสำหรับคนที่เป็นห่วงเรื่องความปลอดภัยของข้อมูลครับ อีกทั้งยังเป็น platform ที่อยู่ในรูปแบบของ Low Code หรือ No Code เลยก็ได้ (ในบาง workflows)",[15,999,1000],{},"ซึ่งผมเองในฐานะของคนที่ชอบเขียนโปรแกรมอยู่แล้ว ต้องบอกเลยว่า \"ของดีย์\" ครับ ทำให้หลาย ๆ ไอเดียสามารถทำออกมาได้เลย ลดเวลาในการพัฒนาลงได้เยอะครับ ผมเองมองว่าการมีสกิล workflows ติดตัวไว้ถือเป็นข้อได้เปรียบนึงเลยครับ โดยซีรีย์นี้ตั้งใจว่าจะทำออกมาแบ่งเป็น EP ย่อย ๆ ครับแชร์ทริคต่าง ๆ ที่ได้ศึกษามา ยังไงก็ฝากติดตตามด้วยนะครับ เย่ ~",[10,1002,1004],{"id":1003},"requirements","Requirements",[925,1006,1007,1013,1020],{},[928,1008,1009,1010],{},"Docker version 25.x.x ขึ้นไป ",[59,1011,1012],{},"docker --version",[928,1014,1015,1016,1019],{},"Docker Compose version 2.24.x ขึ้นไป (",[59,1017,1018],{},"docker compose version",")",[928,1021,1022],{},"ความรู้พื้นฐาน (มาก ๆ) ของ docker cli",[10,1024,68],{"id":68},[1026,1027,1029],"h3",{"id":1028},"_1-สร้าง-directory-และ-docker-compose-file-สำหรับทดสอบ","1. สร้าง Directory และ docker compose file สำหรับทดสอบ",[81,1031,1033],{"className":83,"code":1032,"language":85,"meta":86,"style":86},"mkdir n8n-labs\n\ncd n8n-labs\n",[59,1034,1035,1043,1048],{"__ignoreMap":86},[90,1036,1037,1040],{"class":92,"line":93},[90,1038,1039],{"class":96},"mkdir",[90,1041,1042],{"class":100}," n8n-labs\n",[90,1044,1045],{"class":92,"line":335},[90,1046,1047],{"emptyLinePlaceholder":974},"\n",[90,1049,1050,1054],{"class":92,"line":358},[90,1051,1053],{"class":1052},"sJZfL","cd",[90,1055,1042],{"class":100},[1026,1057,1059],{"id":1058},"_2-สร้าง-docker-compose-file","2. สร้าง docker compose file",[81,1061,1063],{"className":83,"code":1062,"language":85,"meta":86,"style":86},"nano docker-compose.yml\n",[59,1064,1065],{"__ignoreMap":86},[90,1066,1067,1070],{"class":92,"line":93},[90,1068,1069],{"class":96},"nano",[90,1071,1072],{"class":100}," docker-compose.yml\n",[81,1074,1078],{"className":1075,"code":1076,"language":1077,"meta":86,"style":86},"language-yml shiki shiki-themes material-theme-lighter one-dark-pro github-dark","services:\n  n8n:\n    image: docker.n8n.io/n8nio/n8n\n    restart: unless-stopped\n    ports:\n      - '127.0.0.1:5678:5678'\n    volumes:\n      - n8n_data:/home/node/.n8n\n      - n8n_local_files:/files\n    environment:\n      - N8N_HOST=${SUBDOMAIN}.${DOMAIN_NAME}\n      - N8N_PORT=5678\n      - N8N_PROTOCOL=https\n      - NODE_ENV=production\n      - WEBHOOK_URL=https://${WEBHOOK_SUBDOMAIN}.${DOMAIN_NAME}/\n      - GENERIC_TIMEZONE=${GENERIC_TIMEZONE}\n      - N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true\n\n  pg-vector:\n    image: pgvector/pgvector: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:/var/lib/postgresql/data\n\nvolumes:\n  n8n_data:\n  n8n_local_files:\n  db-data:\n  db-pgvector-data:\n","yml",[59,1079,1080,1089,1096,1106,1116,1123,1135,1142,1149,1156,1163,1171,1179,1187,1195,1203,1211,1219,1224,1232,1242,1251,1258,1269,1280,1291,1298,1310,1317,1325,1330,1338,1346,1354,1362],{"__ignoreMap":86},[90,1081,1082,1086],{"class":92,"line":93},[90,1083,1085],{"class":1084},"s0Prt","services",[90,1087,1088],{"class":331},":\n",[90,1090,1091,1094],{"class":92,"line":335},[90,1092,1093],{"class":1084},"  n8n",[90,1095,1088],{"class":331},[90,1097,1098,1101,1103],{"class":92,"line":358},[90,1099,1100],{"class":1084},"    image",[90,1102,349],{"class":331},[90,1104,1105],{"class":100}," docker.n8n.io/n8nio/n8n\n",[90,1107,1108,1111,1113],{"class":92,"line":375},[90,1109,1110],{"class":1084},"    restart",[90,1112,349],{"class":331},[90,1114,1115],{"class":100}," unless-stopped\n",[90,1117,1118,1121],{"class":92,"line":392},[90,1119,1120],{"class":1084},"    ports",[90,1122,1088],{"class":331},[90,1124,1125,1128,1130,1133],{"class":92,"line":413},[90,1126,1127],{"class":331},"      -",[90,1129,530],{"class":115},[90,1131,1132],{"class":100},"127.0.0.1:5678:5678",[90,1134,536],{"class":115},[90,1136,1137,1140],{"class":92,"line":430},[90,1138,1139],{"class":1084},"    volumes",[90,1141,1088],{"class":331},[90,1143,1144,1146],{"class":92,"line":447},[90,1145,1127],{"class":331},[90,1147,1148],{"class":100}," n8n_data:/home/node/.n8n\n",[90,1150,1151,1153],{"class":92,"line":464},[90,1152,1127],{"class":331},[90,1154,1155],{"class":100}," n8n_local_files:/files\n",[90,1157,1158,1161],{"class":92,"line":479},[90,1159,1160],{"class":1084},"    environment",[90,1162,1088],{"class":331},[90,1164,1166,1168],{"class":92,"line":1165},11,[90,1167,1127],{"class":331},[90,1169,1170],{"class":100}," N8N_HOST=${SUBDOMAIN}.${DOMAIN_NAME}\n",[90,1172,1174,1176],{"class":92,"line":1173},12,[90,1175,1127],{"class":331},[90,1177,1178],{"class":100}," N8N_PORT=5678\n",[90,1180,1182,1184],{"class":92,"line":1181},13,[90,1183,1127],{"class":331},[90,1185,1186],{"class":100}," N8N_PROTOCOL=https\n",[90,1188,1190,1192],{"class":92,"line":1189},14,[90,1191,1127],{"class":331},[90,1193,1194],{"class":100}," NODE_ENV=production\n",[90,1196,1198,1200],{"class":92,"line":1197},15,[90,1199,1127],{"class":331},[90,1201,1202],{"class":100}," WEBHOOK_URL=https://${WEBHOOK_SUBDOMAIN}.${DOMAIN_NAME}/\n",[90,1204,1206,1208],{"class":92,"line":1205},16,[90,1207,1127],{"class":331},[90,1209,1210],{"class":100}," GENERIC_TIMEZONE=${GENERIC_TIMEZONE}\n",[90,1212,1214,1216],{"class":92,"line":1213},17,[90,1215,1127],{"class":331},[90,1217,1218],{"class":100}," N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true\n",[90,1220,1222],{"class":92,"line":1221},18,[90,1223,1047],{"emptyLinePlaceholder":974},[90,1225,1227,1230],{"class":92,"line":1226},19,[90,1228,1229],{"class":1084},"  pg-vector",[90,1231,1088],{"class":331},[90,1233,1235,1237,1239],{"class":92,"line":1234},20,[90,1236,1100],{"class":1084},[90,1238,349],{"class":331},[90,1240,1241],{"class":100}," pgvector/pgvector:pg17\n",[90,1243,1245,1247,1249],{"class":92,"line":1244},21,[90,1246,1110],{"class":1084},[90,1248,349],{"class":331},[90,1250,1115],{"class":100},[90,1252,1254,1256],{"class":92,"line":1253},22,[90,1255,1160],{"class":1084},[90,1257,1088],{"class":331},[90,1259,1261,1264,1266],{"class":92,"line":1260},23,[90,1262,1263],{"class":1084},"      POSTGRES_USER",[90,1265,349],{"class":331},[90,1267,1268],{"class":100}," \u003Cusername>\n",[90,1270,1272,1275,1277],{"class":92,"line":1271},24,[90,1273,1274],{"class":1084},"      POSTGRES_PASSWORD",[90,1276,349],{"class":331},[90,1278,1279],{"class":100}," \u003Cpassword>\n",[90,1281,1283,1286,1288],{"class":92,"line":1282},25,[90,1284,1285],{"class":1084},"      POSTGRES_DB",[90,1287,349],{"class":331},[90,1289,1290],{"class":100}," n8n-pgvector\n",[90,1292,1294,1296],{"class":92,"line":1293},26,[90,1295,1120],{"class":1084},[90,1297,1088],{"class":331},[90,1299,1301,1303,1305,1308],{"class":92,"line":1300},27,[90,1302,1127],{"class":331},[90,1304,530],{"class":115},[90,1306,1307],{"class":100},"127.0.0.1:5432:5432",[90,1309,536],{"class":115},[90,1311,1313,1315],{"class":92,"line":1312},28,[90,1314,1139],{"class":1084},[90,1316,1088],{"class":331},[90,1318,1320,1322],{"class":92,"line":1319},29,[90,1321,1127],{"class":331},[90,1323,1324],{"class":100}," db-pgvector-data:/var/lib/postgresql/data\n",[90,1326,1328],{"class":92,"line":1327},30,[90,1329,1047],{"emptyLinePlaceholder":974},[90,1331,1333,1336],{"class":92,"line":1332},31,[90,1334,1335],{"class":1084},"volumes",[90,1337,1088],{"class":331},[90,1339,1341,1344],{"class":92,"line":1340},32,[90,1342,1343],{"class":1084},"  n8n_data",[90,1345,1088],{"class":331},[90,1347,1349,1352],{"class":92,"line":1348},33,[90,1350,1351],{"class":1084},"  n8n_local_files",[90,1353,1088],{"class":331},[90,1355,1357,1360],{"class":92,"line":1356},34,[90,1358,1359],{"class":1084},"  db-data",[90,1361,1088],{"class":331},[90,1363,1365,1368],{"class":92,"line":1364},35,[90,1366,1367],{"class":1084},"  db-pgvector-data",[90,1369,1088],{"class":331},[15,1371,1372,1373,1376,1377,1380],{},"โดยในส่วนของ ",[59,1374,1375],{},"POSTGRES_USER"," และ ",[59,1378,1379],{},"POSTGRES_PASSWORD"," ให้แก้ไขเป็นค่าที่ปลอดภัยได้เลย หรือจะ generate ด้วย openssl ก็ได้เช่นกันครับ",[81,1382,1384],{"className":83,"code":1383,"language":85,"meta":86,"style":86},"openssl rand -base64 32\n",[59,1385,1386],{"__ignoreMap":86},[90,1387,1388,1391,1394,1397],{"class":92,"line":93},[90,1389,1390],{"class":96},"openssl",[90,1392,1393],{"class":100}," rand",[90,1395,1396],{"class":107}," -base64",[90,1398,1399],{"class":111}," 32\n",[15,1401,1402],{},"หน้าตาหลังจากแก้ไขจะเป็นประมาณนี้",[81,1404,1406],{"className":1075,"code":1405,"language":1077,"meta":86,"style":86},"environment:\n  POSTGRES_USER: username\n  POSTGRES_PASSWORD: VygpX7KBx2LsLTLoIk84YPV+gBsVZzgfMqVm+Kv0ltM=\n",[59,1407,1408,1415,1425],{"__ignoreMap":86},[90,1409,1410,1413],{"class":92,"line":93},[90,1411,1412],{"class":1084},"environment",[90,1414,1088],{"class":331},[90,1416,1417,1420,1422],{"class":92,"line":335},[90,1418,1419],{"class":1084},"  POSTGRES_USER",[90,1421,349],{"class":331},[90,1423,1424],{"class":100}," username\n",[90,1426,1427,1430,1432],{"class":92,"line":358},[90,1428,1429],{"class":1084},"  POSTGRES_PASSWORD",[90,1431,349],{"class":331},[90,1433,1434],{"class":100}," VygpX7KBx2LsLTLoIk84YPV+gBsVZzgfMqVm+Kv0ltM=\n",[15,1436,1437,1438,1440,1441,1444,1445,1444,1448,1451],{},"จากนั้น (หากใช้ ",[59,1439,1069],{},") แก้ไขไฟล์ให้กด ",[59,1442,1443],{},"CTRL + X"," -> ",[59,1446,1447],{},"Y",[59,1449,1450],{},"Enter"," จะเป็นการบันทึกและออกจากไฟล์",[1026,1453,1455],{"id":1454},"_3-กำหนดค่าให้-env","3. กำหนดค่าให้ .env",[15,1457,1458,1459,1462],{},"สร้างไฟล์ ",[59,1460,1461],{},".env"," และทำการแก้ไขค่าต่าง ๆ",[1464,1465,1466],"blockquote",{},[15,1467,1468],{},"DOMAIN_NAME, SUBDOMAIN, WEBHOOK_SUBDOMAIN ในส่วนนี้อาจจะปล่อยเป็นค่า default แบบนี้ไปก่อนครับ",[81,1470,1472],{"className":83,"code":1471,"language":85,"meta":86,"style":86},"NODE_ENV=\"production\"\nN8N_PROTOCOL=\"http\" # or https\nN8N_DIAGNOSTICS_ENABLED=false\nGENERIC_TIMEZONE=\"Asia/Bangkok\"\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",[59,1473,1474,1488,1506,1516,1530,1540,1548,1555,1565,1569,1578,1588,1598,1602,1618],{"__ignoreMap":86},[90,1475,1476,1479,1481,1483,1486],{"class":92,"line":93},[90,1477,1478],{"class":226},"NODE_ENV",[90,1480,231],{"class":230},[90,1482,346],{"class":115},[90,1484,1485],{"class":100},"production",[90,1487,122],{"class":115},[90,1489,1490,1493,1495,1497,1500,1502],{"class":92,"line":335},[90,1491,1492],{"class":226},"N8N_PROTOCOL",[90,1494,231],{"class":230},[90,1496,346],{"class":115},[90,1498,1499],{"class":100},"http",[90,1501,346],{"class":115},[90,1503,1505],{"class":1504},"sDKbk"," # or https\n",[90,1507,1508,1511,1513],{"class":92,"line":358},[90,1509,1510],{"class":226},"N8N_DIAGNOSTICS_ENABLED",[90,1512,231],{"class":230},[90,1514,1515],{"class":100},"false\n",[90,1517,1518,1521,1523,1525,1528],{"class":92,"line":375},[90,1519,1520],{"class":226},"GENERIC_TIMEZONE",[90,1522,231],{"class":230},[90,1524,346],{"class":115},[90,1526,1527],{"class":100},"Asia/Bangkok",[90,1529,122],{"class":115},[90,1531,1532,1535,1537],{"class":92,"line":392},[90,1533,1534],{"class":226},"DOMAIN_NAME",[90,1536,231],{"class":230},[90,1538,1539],{"class":100},"localhost\n",[90,1541,1542,1545],{"class":92,"line":413},[90,1543,1544],{"class":226},"SUBDOMAIN",[90,1546,1547],{"class":230},"=\n",[90,1549,1550,1553],{"class":92,"line":430},[90,1551,1552],{"class":226},"WEBHOOK_SUBDOMAIN",[90,1554,1547],{"class":230},[90,1556,1557,1560,1562],{"class":92,"line":447},[90,1558,1559],{"class":226},"N8N_RUNNERS_ENABLED",[90,1561,231],{"class":230},[90,1563,1564],{"class":100},"true\n",[90,1566,1567],{"class":92,"line":464},[90,1568,1047],{"emptyLinePlaceholder":974},[90,1570,1571,1574,1576],{"class":92,"line":479},[90,1572,1573],{"class":226},"EXECUTIONS_DATA_PRUNE",[90,1575,231],{"class":230},[90,1577,1564],{"class":100},[90,1579,1580,1583,1585],{"class":92,"line":1165},[90,1581,1582],{"class":226},"EXECUTIONS_DATA_MAX_AGE",[90,1584,231],{"class":230},[90,1586,1587],{"class":100},"168\n",[90,1589,1590,1593,1595],{"class":92,"line":1173},[90,1591,1592],{"class":226},"EXECUTIONS_DATA_PRUNE_MAX_COUNT",[90,1594,231],{"class":230},[90,1596,1597],{"class":100},"50000\n",[90,1599,1600],{"class":92,"line":1181},[90,1601,1047],{"emptyLinePlaceholder":974},[90,1603,1604,1607,1609,1612,1615],{"class":92,"line":1189},[90,1605,1606],{"class":226},"PG_USER",[90,1608,231],{"class":230},[90,1610,1611],{"class":312},"\u003C",[90,1613,1614],{"class":100},"username",[90,1616,1617],{"class":312},">\n",[90,1619,1620,1623,1625,1627,1630],{"class":92,"line":1197},[90,1621,1622],{"class":226},"PG_PASSWORD",[90,1624,231],{"class":230},[90,1626,1611],{"class":312},[90,1628,1629],{"class":100},"password",[90,1631,1617],{"class":312},[15,1633,1634],{},"จากนั้นสามารถ start docker compose ได้เลยด้วยคำสั่ง",[81,1636,1638],{"className":83,"code":1637,"language":85,"meta":86,"style":86},"docker compose pull\n\n# [+] Pulling 15/29\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",[59,1639,1640,1651,1655,1660,1665,1670,1674,1695],{"__ignoreMap":86},[90,1641,1642,1645,1648],{"class":92,"line":93},[90,1643,1644],{"class":96},"docker",[90,1646,1647],{"class":100}," compose",[90,1649,1650],{"class":100}," pull\n",[90,1652,1653],{"class":92,"line":335},[90,1654,1047],{"emptyLinePlaceholder":974},[90,1656,1657],{"class":92,"line":358},[90,1658,1659],{"class":1504},"# [+] Pulling 15/29\n",[90,1661,1662],{"class":92,"line":375},[90,1663,1664],{"class":1504},"# ⠧ pg-vector [⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠀] Pulling                              13.8s\n",[90,1666,1667],{"class":92,"line":392},[90,1668,1669],{"class":1504},"# ⠧ n8n [⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀] Pulling                                         13.8s\n",[90,1671,1672],{"class":92,"line":413},[90,1673,1047],{"emptyLinePlaceholder":974},[90,1675,1676,1678,1680,1683,1686,1689,1692],{"class":92,"line":430},[90,1677,1644],{"class":96},[90,1679,1647],{"class":100},[90,1681,1682],{"class":107}," --env-file",[90,1684,1685],{"class":100}," .env",[90,1687,1688],{"class":100}," up",[90,1690,1691],{"class":107}," --build",[90,1693,1694],{"class":107}," -d\n",[90,1696,1697],{"class":92,"line":447},[90,1698,1699],{"class":1504},"# อย่าลืม --env-file flag นะครับ\n",[1026,1701,1702],{"id":1702},"ทดสอบเปิดเข้าใช้งาน",[15,1704,1705,1706,1709],{},"จากนั้นเปิด browser แล้วไปที่ ",[59,1707,1708],{},"http://localhost:5678/setup"," ได้เลยครับ",[15,1711,1712],{},[273,1713],{"alt":86,"src":1714},"/images/2025-04-24-n8n-part-1/n8n-setup.png",[15,1716,1717],{},"โดยในขั้นตอนนี้เป็น optional ครับ แต่แนะนำให้เอากดรับมาครับ",[15,1719,1720],{},[273,1721],{"alt":86,"src":1722},"/images/2025-04-24-n8n-part-1/paid-features-for-free.png",[15,1724,1725],{},"เรียบร้อยครับ เพียงแค่นี้เราก็จะได้ N8N version self-hosted มาใช้งานแล้วครับ",[1026,1727,1729],{"id":1728},"_4-ทดสอบเพิ่ม-pgvector-เข้าไปยัง-n8n","4. ทดสอบเพิ่ม PGVector เข้าไปยัง N8N",[15,1731,1732,1733],{},"ไปที่เมนู Credential\n",[273,1734],{"alt":86,"src":1735},"/images/2025-04-24-n8n-part-1/n8n-credential-1.png",[15,1737,1738],{},"เลือกเป็น Postgres",[15,1740,1741],{},[273,1742],{"alt":86,"src":1743},"/images/2025-04-24-n8n-part-1/n8n-credential-2.png",[15,1745,1746,1747,1750,1751,1754],{},"กรอกข้อมูล โดยผมจะทำการแก้ชื่อด้านซ้ายบนให้เป็น ",[59,1748,1749],{},"PG-Vector"," นะครับ ในช่องของ database ถ้า setup ตามที่ผมแนะนำไว้ก็สามารถใส่เป็น",[59,1752,1753],{},"pg-vector"," (service name ใน docker-compose) และใส่ username, password จากไฟล์ .env และ Database เอามาจากไฟล์ docker-compose ได้เลยครับ",[15,1756,1757],{},[273,1758],{"alt":86,"src":1759},"/images/2025-04-24-n8n-part-1/n8n-credential-3.png",[15,1761,1762,1763,1766],{},"ถ้ากด Save แล้วขึ้น ",[59,1764,1765],{},"Connection Tested Successfully"," แสดงว่าใช้งานได้แล้วครับ โดยตัว PG Vector อันนี้จะเป็นตัว Postgres ที่มีการเปิดใช้งาน extension vector ซึ่งเดี๋ยวเราจะเอามาใช้ในการเล่นเกี่ยว LLM ต่อไปนะครับ",[15,1768,1769,1770],{},"สามารถอ่าน Part 2 ต่อได้เลย\n",[25,1771,1773],{"href":1772},"/blogs/n8n-part-2","N8N Part 2",[956,1775,1776],{},"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":86,"searchDepth":335,"depth":335,"links":1778},[1779,1780,1781],{"id":993,"depth":335,"text":994},{"id":1003,"depth":335,"text":1004},{"id":68,"depth":335,"text":68,"children":1782},[1783,1784,1785,1786,1787],{"id":1028,"depth":358,"text":1029},{"id":1058,"depth":358,"text":1059},{"id":1454,"depth":358,"text":1455},{"id":1702,"depth":358,"text":1702},{"id":1728,"depth":358,"text":1729},"2025-04-24T00:00:00.000Z","วิธี self-hosted N8N ด้วย docker compose อย่างง่าย พร้อมต่อ PGVector ไว้ใช้กับงาน LLM ในภายหลัง",{},"2025-04-28-n8n-part-2.md","Awesome N8N","/blogs/2025-04-24-n8n-part-1",[1795],"2025-05-10-n8n-with-telegram-notify.md",{"title":988,"description":1789},{"loc":1793},"blogs/2025-04-24-n8n-part-1",[982],"I0c1X95MOlmXuYx-dYuPq9qaEJL8bYq3QtmN8VgmCCI",{"id":1802,"title":1803,"body":1804,"date":2560,"description":2561,"draft":971,"extension":972,"meta":2562,"navigation":974,"next":975,"ogTitle":1792,"path":2563,"pin":971,"prev":2564,"recommends":2565,"seo":2566,"sitemap":2567,"stem":2568,"tags":2569,"updated":975,"__hash__":2570},"content/blogs/2025-04-28-n8n-part-2.md","N8N วิธีการการใช้งานเบื้องต้น | Part 2",{"type":7,"value":1805,"toc":2554},[1806,1813,1816,1826,1830,1834,1839,1842,1847,1850,1854,1857,1868,1873,1876,1879,1884,1887,1892,1895,1900,1903,1924,1929,1936,1941,1944,1949,1952,1957,1960,2024,2027,2078,2081,2087,2170,2173,2178,2181,2491,2494,2499,2502,2508,2515,2520,2523,2528,2534,2540,2543,2548,2551],[15,1807,1808,1809],{},"สำหรับใครที่ยังไม่ได้อ่าน Part 1 นะครับ สามารถไปอ่านได้ที่ ",[25,1810,1812],{"href":1811},"/blogs/n8n-part-1","N8N Part 1",[15,1814,1815],{},"โดยวันนี้ผมจะพามาลองเล่น workflow ในแบบ basic ๆ กันก่อนนะครับ เผื่อให้สามารถเข้าใจการทำงานในเบื้องต้นได้",[15,1817,1818,1819,1822,1823],{},"โดยโจทย์ในครั้งนี้คือ ",[22,1820,1821],{},"\"ค้นหา URLs ต่าง ๆ ของ domain ที่ต้องการโดยใช้ Wayback machine\""," ถ้านึกภาพไม่ออกคือการทำแบบนี้แหละครับ แต่เราจะทำให้มันเป็น workflow เพื่อนำไปต่อยอดในอนาคตนะครับ\n",[273,1824],{"alt":86,"src":1825},"/images/2025-04-28-n8n-part-2/image-4.png",[10,1827,1829],{"id":1828},"เริ่มต้นการสร้าง-workflows","เริ่มต้นการสร้าง workflows",[1026,1831,1833],{"id":1832},"ทำการสร้าง-workflow-ใหม่โดยการกดที่ปุ่มขวาบน-create-workflow-ได้เลยครับ","ทำการสร้าง workflow ใหม่โดยการกดที่ปุ่มขวาบน (\"Create Workflow\") ได้เลยครับ",[15,1835,1836],{},[273,1837],{"alt":86,"src":1838},"/images/2025-04-28-n8n-part-2/image.png",[15,1840,1841],{},"จากนั้นจะพบกับ UI หน้าตาโล่ง ๆ แบบนี้",[15,1843,1844],{},[273,1845],{"alt":86,"src":1846},"/images/2025-04-28-n8n-part-2/image-1.png",[15,1848,1849],{},"โดยเมื่อกดปุ่ม \"+\" กลางจอหรือมุมขวาบนแล้วจะพบกับ Trigger Node ครับ (ภายใน N8N เราจะเรียกเครื่องมือแต่ละตัวว่า Node นะครับ)",[1026,1851,1853],{"id":1852},"อธิบายคร่าว-ๆ-ของ-trigger-node-ประมาณนี้ครับ","อธิบายคร่าว ๆ ของ Trigger Node ประมาณนี้ครับ",[15,1855,1856],{},"Trigger Node คือจุดเริ่มต้นของ workflow ซึ่งสามารถทำได้หลายวิธีด้วยกันขึ้นอยู่กับจุดประสงค์ของ workflow นั้น ๆ ครับ เช่นหากเป็นประเภท Scheduler จะใช้ประเภท \"On a scheduler\" หากเป็นประเภท Webhook ที่รอรับสัญญาณจากแหล่งอื่นจะใช้เป็น \"On webhook call\" ครับ ยังมีอีกหลาย ๆ ตัวที่น่าสนใจเช่น",[925,1858,1859,1862,1865],{},[928,1860,1861],{},"On chat message: Node นี้จะเป็นการสร้างหน้า chat ui ขึ้นมาให้ครับ เหมาะสำหรับการนำมาใช้งานกับ AI Agent นั้นเอง",[928,1863,1864],{},"On app event: Node นี้จะเป็นการรับ trigger จาก application อื่น ๆ ที่นำมาเชื่อมต่อครับ เช่น notion, telegram, airtable ซึ่งจำเป็นต้องเชื่อมต่อกันให้เรียบร้อยก่อนใช้งาน",[928,1866,1867],{},"Trigger manual: Node นี้เป็นการสร้างปุ่มขึ้นมาให้กดครับ เหมาะสำหรับการใช้งานที่จำเป็นต้องกรอกข้อมูลก่อน หรือ ไม่ได้อยากทำให้มี external trigger มาครับ",[15,1869,1870],{},[273,1871],{"alt":86,"src":1872},"/images/2025-04-28-n8n-part-2/image-2.png",[15,1874,1875],{},"ซึ่งอันนี้เป็นแค่เพียงเบื้องต้นนะครับ จริง ๆ แล้ว N8N ยังสามารถทำอะไรได้มากกว่านั้นอีก (มากกกก) ไปกันต่อเลยครับ",[15,1877,1878],{},"โดยผมจะเริ่มจาก Trigger เบื้องต้นอย่าง \"Trigger manually\" ละกันครับ สามารถกดเลือกได้เลยครับ เมื่อเลือกแล้วจะมี Node โผล่มากลางจอแบบนี้ครับ",[15,1880,1881],{},[273,1882],{"alt":86,"src":1883},"/images/2025-04-28-n8n-part-2/image-3.png",[15,1885,1886],{},"จากนั้นให้กดปุ่ม \"+\" ที่อยู่ขวามือของ Node เพื่อเพิ่มการทำงานขั้นต่อไปครับ เมื่อกดแล้วจะเพิ่มกับเครื่องมือต่าง ๆ ที่สามารถนำมาใช้ต่อได้นะครับ \"ซึ่งมีเยอะมากกกก\"",[15,1888,1889],{},[273,1890],{"alt":86,"src":1891},"/images/2025-04-28-n8n-part-2/image-5.png",[15,1893,1894],{},"โดยให้เราเลือกเป็น \"HTTP Request\" ครับ",[15,1896,1897],{},[273,1898],{"alt":86,"src":1899},"/images/2025-04-28-n8n-part-2/image-7.png",[15,1901,1902],{},"จากนั้นจะพบกับหน้าต่างที่โผล่ขึ้นมาซึ่งจะแบ่งเป็น 3 ส่วนหลัก ๆ คือ",[1904,1905,1906,1912,1918],"ol",{},[928,1907,1908,1911],{},[90,1909,1910],{},"ซ้าย"," Input: เป็นส่วนที่ไว้ใช้แสดงผลข้อมูลที่มาจาก workflows การหน้าครับ",[928,1913,1914,1917],{},[90,1915,1916],{},"กลาง"," Settings: เป็นการตั้งค่าของ Node นั้น ๆ ซึ่งจะขึ้นอยู่กับว่าเป็น Node อะไร ในกรณีจะมี \"Method\", \"URL\", \"Authentication\" และอื่น ๆ ตามด้านล่างเลยครับ ซึ่งก็คือรูปแบบการ Call HTTP request ปกติเลย",[928,1919,1920,1923],{},[90,1921,1922],{},"ขวา"," Output: เป็นส่วนที่ไว้ใช้แสดงผลข้อมูลที่ได้จาก Node นี้ครับ",[15,1925,1926],{},[273,1927],{"alt":86,"src":1928},"/images/2025-04-28-n8n-part-2/image-6.png",[15,1930,1931,1932,1935],{},"กลับมาที่ Wayback machine สักแป้บนึงครับ ให้เราค้นหา request ที่จะนำมาใช้งาน ซึ่งในกรณีนี้จะเป็น ",[59,1933,1934],{},"https://web.archive.org/web/timemap/json"," ครับ",[15,1937,1938],{},[273,1939],{"alt":86,"src":1940},"/images/2025-04-28-n8n-part-2/image-9.png",[15,1942,1943],{},"กรอกข้อมูลต่าง ๆ ได้เลย โดยที่ส่วนของ URL แนะนำให้ใช้แค่ URL นะครับ แล้วแบ่งเอา Parameter ลงมาใส่ข้างล่างแทน แบบในรูปเลยครับ (แนะนำว่าให้ปรับ Limit เป็นค่าน้อย ๆ จากเดิน 10000 อาจจะลดลงเหลือ 30 ก็ได้ครับ) เสร็จแล้วกดปุ่ม Test Step ได้เลย ถ้าถูกต้องด้านขวามือจะมีข้อมูลขึ้นมาแบบนี้ครับ",[15,1945,1946],{},[273,1947],{"alt":86,"src":1948},"/images/2025-04-28-n8n-part-2/image-10.png",[15,1950,1951],{},"โดยที่ Output จะดูข้อมูลได้ 3 รูปแบบได้แก่ Table, JSON, Schema ซึ่งการทำงานจริง ๆ ของ N8N จะทำงานภายใต้ Object Array ครับ",[15,1953,1954],{},[273,1955],{"alt":86,"src":1956},"/images/2025-04-28-n8n-part-2/image-11.png",[15,1958,1959],{},"อันนี้ถ้าดูดี ๆ มันจะเป็นการ return มาแบบแปลก ๆ นะครับ ปกติแล้วมันควรจะ return มาเป็น json ในรูปแบบ",[81,1961,1963],{"className":322,"code":1962,"language":324,"meta":86,"style":86},"[{\n\"original\": \"http://example.com:80/\",\n\"mimetype\": \"text/html\",\n\"...\"\n}]\n",[59,1964,1965,1970,1990,2010,2019],{"__ignoreMap":86},[90,1966,1967],{"class":92,"line":93},[90,1968,1969],{"class":331},"[{\n",[90,1971,1972,1974,1977,1979,1981,1983,1986,1988],{"class":92,"line":335},[90,1973,346],{"class":338},[90,1975,1976],{"class":342},"original",[90,1978,346],{"class":338},[90,1980,349],{"class":331},[90,1982,116],{"class":115},[90,1984,1985],{"class":100},"http://example.com:80/",[90,1987,346],{"class":115},[90,1989,355],{"class":331},[90,1991,1992,1994,1997,1999,2001,2003,2006,2008],{"class":92,"line":358},[90,1993,346],{"class":338},[90,1995,1996],{"class":342},"mimetype",[90,1998,346],{"class":338},[90,2000,349],{"class":331},[90,2002,116],{"class":115},[90,2004,2005],{"class":100},"text/html",[90,2007,346],{"class":115},[90,2009,355],{"class":331},[90,2011,2012,2014,2017],{"class":92,"line":375},[90,2013,346],{"class":338},[90,2015,2016],{"class":342},"...",[90,2018,122],{"class":338},[90,2020,2021],{"class":92,"line":392},[90,2022,2023],{"class":331},"}]\n",[15,2025,2026],{},"แต่กรณีนี้ return มาเป็น",[81,2028,2030],{"className":322,"code":2029,"language":324,"meta":86,"style":86},"[[\"original\", \"mimetype\", \"...\"], [\"value\"...]]\n",[59,2031,2032],{"__ignoreMap":86},[90,2033,2034,2037,2039,2041,2043,2045,2047,2049,2051,2053,2055,2057,2059,2062,2065,2067,2070,2072,2075],{"class":92,"line":93},[90,2035,2036],{"class":331},"[[",[90,2038,346],{"class":115},[90,2040,1976],{"class":100},[90,2042,346],{"class":115},[90,2044,565],{"class":331},[90,2046,116],{"class":115},[90,2048,1996],{"class":100},[90,2050,346],{"class":115},[90,2052,565],{"class":331},[90,2054,116],{"class":115},[90,2056,2016],{"class":100},[90,2058,346],{"class":115},[90,2060,2061],{"class":331},"],",[90,2063,2064],{"class":331}," [",[90,2066,346],{"class":115},[90,2068,2069],{"class":100},"value",[90,2071,346],{"class":115},[90,2073,2016],{"class":2074},"sg798",[90,2076,2077],{"class":331},"]]\n",[15,2079,2080],{},"ซึ่งมันเอาไปใช้ต่อม่ายได้ครับ '-' ดังนั้นให้กด \"+\" ด้านขวาแล้วเลือก Node \"Code\" เข้ามาช่วยได้เลยครับ",[15,2082,2083,2084],{},"ให้ลองเอา Code นี้ไปใส่\n",[273,2085],{"alt":86,"src":2086},"/images/2025-04-28-n8n-part-2/image-12.png",[81,2088,2092],{"className":2089,"code":2090,"language":2091,"meta":86,"style":86},"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",[59,2093,2094,2132,2152,2156],{"__ignoreMap":86},[90,2095,2096,2100,2104,2108,2112,2116,2120,2123,2127,2130],{"class":92,"line":93},[90,2097,2099],{"class":2098},"s36IK","for",[90,2101,2103],{"class":2102},"sZDfs"," (",[90,2105,2107],{"class":2106},"sOHk9","const",[90,2109,2111],{"class":2110},"sUzmo"," item",[90,2113,2115],{"class":2114},"s_AEr"," of",[90,2117,2119],{"class":2118},"sU9mH"," $input",[90,2121,2122],{"class":331},".",[90,2124,2126],{"class":2125},"suMxZ","all",[90,2128,2129],{"class":2102},"()) ",[90,2131,332],{"class":331},[90,2133,2134,2137,2139,2142,2146,2149],{"class":92,"line":335},[90,2135,2136],{"class":2118},"  console",[90,2138,2122],{"class":331},[90,2140,2141],{"class":2125},"log",[90,2143,2145],{"class":2144},"sbHgf","(",[90,2147,2148],{"class":226},"item",[90,2150,2151],{"class":2144},")\n",[90,2153,2154],{"class":92,"line":358},[90,2155,482],{"class":331},[90,2157,2158,2161,2163,2165,2167],{"class":92,"line":375},[90,2159,2160],{"class":2098},"return",[90,2162,2119],{"class":2118},[90,2164,2122],{"class":331},[90,2166,2126],{"class":2125},[90,2168,2169],{"class":2102},"()\n",[15,2171,2172],{},"ก่อนกดปุ่มให้กด F12 เพื่อเปิด browser console เพื่อดูผลของ console.log ครับ",[15,2174,2175],{},[273,2176],{"alt":86,"src":2177},"/images/2025-04-28-n8n-part-2/image-13.png",[15,2179,2180],{},"โดยอันนี้แหละที่เราจะเอามาใช้ต่อได้ เอา Code อันนี้ไปใส่",[81,2182,2184],{"className":2089,"code":2183,"language":2091,"meta":86,"style":86},"// Retrieve all data from the input\nconst inputItems = $input.all()\n\n// Extract the headers from the first item\nconst headers = inputItems[0].json || []\n\n// Initialize an array to store the new items\nconst newItems = []\n\n// 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 = {} // Use a plain JavaScript object\n\n  // 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  // Add the new object to the newItems array\n  newItems.push(obj)\n}\n\n// Return the JSON array of objects\nreturn newItems\n",[59,2185,2186,2191,2209,2213,2218,2248,2252,2257,2268,2272,2277,2322,2348,2363,2367,2372,2411,2440,2445,2449,2454,2471,2475,2479,2484],{"__ignoreMap":86},[90,2187,2188],{"class":92,"line":93},[90,2189,2190],{"class":1504},"// Retrieve all data from the input\n",[90,2192,2193,2195,2198,2201,2203,2205,2207],{"class":92,"line":335},[90,2194,2107],{"class":2106},[90,2196,2197],{"class":2110}," inputItems",[90,2199,2200],{"class":230}," =",[90,2202,2119],{"class":2118},[90,2204,2122],{"class":331},[90,2206,2126],{"class":2125},[90,2208,2169],{"class":2102},[90,2210,2211],{"class":92,"line":358},[90,2212,1047],{"emptyLinePlaceholder":974},[90,2214,2215],{"class":92,"line":375},[90,2216,2217],{"class":1504},"// Extract the headers from the first item\n",[90,2219,2220,2222,2225,2227,2229,2232,2235,2238,2240,2242,2245],{"class":92,"line":392},[90,2221,2107],{"class":2106},[90,2223,2224],{"class":2110}," headers",[90,2226,2200],{"class":230},[90,2228,2197],{"class":226},[90,2230,2231],{"class":2102},"[",[90,2233,2234],{"class":111},"0",[90,2236,2237],{"class":2102},"]",[90,2239,2122],{"class":331},[90,2241,324],{"class":226},[90,2243,2244],{"class":230}," ||",[90,2246,2247],{"class":2102}," []\n",[90,2249,2250],{"class":92,"line":413},[90,2251,1047],{"emptyLinePlaceholder":974},[90,2253,2254],{"class":92,"line":430},[90,2255,2256],{"class":1504},"// Initialize an array to store the new items\n",[90,2258,2259,2261,2264,2266],{"class":92,"line":447},[90,2260,2107],{"class":2106},[90,2262,2263],{"class":2110}," newItems",[90,2265,2200],{"class":230},[90,2267,2247],{"class":2102},[90,2269,2270],{"class":92,"line":464},[90,2271,1047],{"emptyLinePlaceholder":974},[90,2273,2274],{"class":92,"line":479},[90,2275,2276],{"class":1504},"// Iterate over each old item, starting from the second item since the first is the headers\n",[90,2278,2279,2281,2283,2286,2289,2291,2294,2297,2299,2302,2304,2306,2310,2312,2314,2317,2320],{"class":92,"line":1165},[90,2280,2099],{"class":2098},[90,2282,2103],{"class":2102},[90,2284,2285],{"class":2106},"let",[90,2287,2288],{"class":226}," i",[90,2290,2200],{"class":230},[90,2292,2293],{"class":111}," 1",[90,2295,2296],{"class":331},";",[90,2298,2288],{"class":226},[90,2300,2301],{"class":230}," \u003C",[90,2303,2197],{"class":2118},[90,2305,2122],{"class":331},[90,2307,2309],{"class":2308},"sVJsf","length",[90,2311,2296],{"class":331},[90,2313,2288],{"class":226},[90,2315,2316],{"class":230},"++",[90,2318,2319],{"class":2102},") ",[90,2321,332],{"class":331},[90,2323,2324,2327,2329,2331,2333,2335,2338,2340,2342,2344,2346],{"class":92,"line":1173},[90,2325,2326],{"class":2106},"  const",[90,2328,2111],{"class":2110},[90,2330,2200],{"class":230},[90,2332,2197],{"class":226},[90,2334,2231],{"class":2144},[90,2336,2337],{"class":226},"i",[90,2339,2237],{"class":2144},[90,2341,2122],{"class":331},[90,2343,324],{"class":226},[90,2345,2244],{"class":230},[90,2347,2247],{"class":2144},[90,2349,2350,2352,2355,2357,2360],{"class":92,"line":1181},[90,2351,2326],{"class":2106},[90,2353,2354],{"class":2110}," obj",[90,2356,2200],{"class":230},[90,2358,2359],{"class":331}," {}",[90,2361,2362],{"class":1504}," // Use a plain JavaScript object\n",[90,2364,2365],{"class":92,"line":1189},[90,2366,1047],{"emptyLinePlaceholder":974},[90,2368,2369],{"class":92,"line":1197},[90,2370,2371],{"class":1504},"  // Map each value to its corresponding header\n",[90,2373,2374,2377,2379,2381,2384,2386,2389,2391,2393,2395,2397,2399,2401,2403,2405,2407,2409],{"class":92,"line":1205},[90,2375,2376],{"class":2098},"  for",[90,2378,2103],{"class":2144},[90,2380,2285],{"class":2106},[90,2382,2383],{"class":226}," j",[90,2385,2200],{"class":230},[90,2387,2388],{"class":111}," 0",[90,2390,2296],{"class":331},[90,2392,2383],{"class":226},[90,2394,2301],{"class":230},[90,2396,2224],{"class":2118},[90,2398,2122],{"class":331},[90,2400,2309],{"class":2308},[90,2402,2296],{"class":331},[90,2404,2383],{"class":226},[90,2406,2316],{"class":230},[90,2408,2319],{"class":2144},[90,2410,332],{"class":331},[90,2412,2413,2416,2418,2421,2423,2426,2429,2431,2433,2435,2437],{"class":92,"line":1213},[90,2414,2415],{"class":226},"    obj",[90,2417,2231],{"class":2144},[90,2419,2420],{"class":226},"headers",[90,2422,2231],{"class":2144},[90,2424,2425],{"class":226},"j",[90,2427,2428],{"class":2144},"]] ",[90,2430,231],{"class":230},[90,2432,2111],{"class":226},[90,2434,2231],{"class":2144},[90,2436,2425],{"class":226},[90,2438,2439],{"class":2144},"]\n",[90,2441,2442],{"class":92,"line":1221},[90,2443,2444],{"class":331},"  }\n",[90,2446,2447],{"class":92,"line":1226},[90,2448,1047],{"emptyLinePlaceholder":974},[90,2450,2451],{"class":92,"line":1234},[90,2452,2453],{"class":1504},"  // Add the new object to the newItems array\n",[90,2455,2456,2459,2461,2464,2466,2469],{"class":92,"line":1244},[90,2457,2458],{"class":2118},"  newItems",[90,2460,2122],{"class":331},[90,2462,2463],{"class":2125},"push",[90,2465,2145],{"class":2144},[90,2467,2468],{"class":226},"obj",[90,2470,2151],{"class":2144},[90,2472,2473],{"class":92,"line":1253},[90,2474,482],{"class":331},[90,2476,2477],{"class":92,"line":1260},[90,2478,1047],{"emptyLinePlaceholder":974},[90,2480,2481],{"class":92,"line":1271},[90,2482,2483],{"class":1504},"// Return the JSON array of objects\n",[90,2485,2486,2488],{"class":92,"line":1282},[90,2487,2160],{"class":2098},[90,2489,2490],{"class":226}," newItems\n",[15,2492,2493],{},"ใน code จะมี warning ของ interface อยู่นะครับ แต่มองข้ามไปได้ กดรันได้เลยฮะ ถ้าถูกต้องตรงฝั่งขวามือเราจะได้ Output หน้าตาเป็นแบบนี้ครับ ถือว่าถูกต้องและใช้งานต่อได้",[15,2495,2496],{},[273,2497],{"alt":86,"src":2498},"/images/2025-04-28-n8n-part-2/image-14.png",[15,2500,2501],{},"ซึ่งต่อไปก็ขึ้นอยู่กับเราว่าจะเอาข้อมูลจาก workflow นี้ไปทำอะไรต่อ เช่นนำไปเก็บใน Database, นำไปใช้วิเคราะห์ต่อ, นำไป filter ข้อมูลที่สนใจอันนี้ขึ้นอยู่กับจุดประสงค์แล้วครับ",[15,2503,2504,2505],{},"บนเส้นเมื่อรันแล้วจะเจอกับเลขอยู่นะครับ ซึ่งหมายถึงจำนวนข้อมูลปกติแล้ว N8N จะทำการ Loop ในข้อมูลแต่ละชุดให้เลยครับ จากด้านซ้ายมีข้อมูล 31 Object (รวม header) เอามาแปลงเป็นข้อมูลด้านขวาซึ่งจะเหลือ 30 Object ครับ\n",[273,2506],{"alt":86,"src":2507},"/images/2025-04-28-n8n-part-2/image-15.png",[15,2509,2510,2511,2514],{},"ต่อไปผมจะลองใช้งาน Filter ดูนะครับ โดยที่จะ filter ",[59,2512,2513],{},"mimetype: text/html"," ออกมาอย่างเดียว เลือกเป็น Data transformation และ Filter",[15,2516,2517],{},[273,2518],{"alt":86,"src":2519},"/images/2025-04-28-n8n-part-2/image-16.png",[15,2521,2522],{},"เลือกเป็น Schema แล้วดูตรง Node ที่ชื่อว่า \"Code\" ซึ่งเป็น Node ก่อนหน้า ในที่นี้เราสามารถ drag & drop ข้อมูลที่เราต้องการได้เลยครับ ให้เลือก \"mimetype\" ลากมาวางตรง \"value1\"",[15,2524,2525],{},[273,2526],{"alt":86,"src":2527},"/images/2025-04-28-n8n-part-2/image-17.png",[15,2529,2530,2531],{},"ส่วน OP: เลือกเป็น \"is equal to\" และ value ใส่เป็น \"text/html\" แบบในรูปครับ\n",[273,2532],{"alt":86,"src":2533},"/images/2025-04-28-n8n-part-2/image-18.png",[15,2535,2536,2537],{},"เมื่อกด \"Test Step\" จะพบว่าข้อมูลจะถูกแยกเป็น 2 ส่วนคือ\"Kept\" (เก็บไว้) และ \"Discarded\" (เอาทิ้ง) ซึ่งจะเป็นตามเงื่อนไขที่เราตั้งไว้ครับ\n",[273,2538],{"alt":86,"src":2539},"/images/2025-04-28-n8n-part-2/image-19.png",[15,2541,2542],{},"ปลายเส้นก็จะเหลือข้อมูล 1 item ตามที่เรา filter ไว้เลยครับ เย่",[15,2544,2545],{},[273,2546],{"alt":86,"src":2547},"/images/2025-04-28-n8n-part-2/image-20.png",[15,2549,2550],{},"การใช้งาน N8N ก็จะมีประมาณนี้ครับ ไม่ยากไม่ง่ายจนเกินไปเนอะ ไว้มาต่อกัน EP 3 นะครับ",[956,2552,2553],{},"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":86,"searchDepth":335,"depth":335,"links":2555},[2556],{"id":1828,"depth":335,"text":1829,"children":2557},[2558,2559],{"id":1832,"depth":358,"text":1833},{"id":1852,"depth":358,"text":1853},"2025-04-28T00:00:00.000Z","พาสร้าง workflow แรกใน N8N ด้วยโจทย์ดึง URLs ของ domain ที่ต้องการจาก Wayback Machine",{},"/blogs/2025-04-28-n8n-part-2","2025-04-24-n8n-part-1.md",[1795],{"title":1803,"description":2561},{"loc":2563},"blogs/2025-04-28-n8n-part-2",[982],"gO0288WvwI0tjuZLA7HtXLAChtv1ruhcisCt4dZ6kbk",{"id":2572,"title":2573,"body":2574,"date":2685,"description":2686,"draft":971,"extension":972,"meta":2687,"navigation":974,"next":975,"ogTitle":2688,"path":2689,"pin":971,"prev":975,"recommends":975,"seo":2690,"sitemap":2691,"stem":2692,"tags":2693,"updated":2694,"__hash__":2695},"content/blogs/2025-08-18-ollama-desktop-ui.md","Ollama มี UI ให้ใช้แล้ว",{"type":7,"value":2575,"toc":2678},[2576,2581,2584,2588,2595,2599,2609,2614,2620,2624,2632,2640,2646,2650,2656,2659,2663],[15,2577,2578],{},[273,2579],{"alt":86,"src":2580},"/images/2025-08-18-ollama-desktop-ui/images-3de58dcb-c7b8-4c8e-8fb6-fd713de8d854.jpg",[15,2582,2583],{},"วันนี้ผมเพิ่งมาสังเกตว่า Ollama มี Desktop Application ให้ใช้งานแล้ว (ผมติดตั้ง version 0.11.4 บน macos) โดยหน้าตาของ UI จะมีความ minimal เหมือนกับ LLM Chat ทั่ว ๆ ไปเลยครับ",[10,2585,2587],{"id":2586},"ollama-คืออะไร","Ollama คืออะไร",[15,2589,2590,2591],{},"โดย Ollama คือเครื่องมือสำหรับใช้ในการ run llm ในรูปแบบ local (ใช้ hardware ของผู้ใช้งานโดยตรง) มีหลาย model ให้ใช้งาน เช่น Deepseek, gemma, Llama หรือ model อื่น ๆ สามารถดูได้ที่ ",[25,2592,2593],{"href":2593,"rel":2594},"https://ollama.com/search",[29],[10,2596,2598],{"id":2597},"ที่ชอบคือไม่ต้องเปิด-cli-แล้ว","ที่ชอบคือไม่ต้องเปิด cli แล้ว",[15,2600,2601,2602,2605,2606],{},"โดยข้อดีที่ผมชอบเลยก็คือ ก่อนหน้านี้ตอนที่ต้องการทดสอบ model บางตัว ก็จำเป็นต้องใช้งานผ่าน cli โดยที่รัน ",[59,2603,2604],{},"ollama run gemma3:270m"," แต่ตอนนี้สะดวกขึ้นมาก เพียงแค่ ",[59,2607,2608],{},"ollama pull gemma3:270m",[15,2610,2611],{},[273,2612],{"alt":86,"src":2613},"/images/2025-08-18-ollama-desktop-ui/images-1350f112-92ce-4af4-b0d7-8731d4364dea.jpg",[15,2615,2616,2617],{},"จากนั้นก็จะสามารถเลือก model ผ่าน ollama UI และใช้งานได้เลย ทำให้การทดสอบทำได้ง่ายขึ้น\n",[273,2618],{"alt":86,"src":2619},"/images/2025-08-18-ollama-desktop-ui/images-d010a3a3-8228-4438-8686-a8c7fb7330c3.jpg",[10,2621,2623],{"id":2622},"features-ที่เพิ่มเข้ามา","Features ที่เพิ่มเข้ามา",[15,2625,2626,2627,2631],{},"ผมเลยไปตามอ่านดู release ก็ไปเจอกับ ",[25,2628,2629],{"href":2629,"rel":2630},"https://ollama.com/blog/new-app",[29]," โดยสรุป features ไว้คร่าว ๆ ตามนี้",[925,2633,2634,2637],{},[928,2635,2636],{},"Chat with file: ส่งไฟล์เพื่อไปถาม chat เช่นส่ง PDF ให้สรุป",[928,2638,2639],{},"กำหนด context length ได้",[15,2641,2642,2645],{},[273,2643],{"alt":86,"src":2644},"/images/2025-08-18-ollama-desktop-ui/images-8f00489f-216e-414d-b4e6-49bf74ade823.jpg","\nส่วนอื่น ๆ ก็เป็น chat UI ทั่ว ๆ ไปเลยนะครับ (อนาคตน่าจะมีอะไรให้ลองเล่นมากกว่านี้)",[10,2647,2649],{"id":2648},"turbo-beta","Turbo (Beta)",[15,2651,2652,2653],{},"อีกอย่างคือเห็นว่ามี Turbo (Beta) เข้ามาแล้วด้วย โดยมีราคาอยู่ที่ 20$ ต่อเดือน (ข้อมูลวันที่ 18/8/68) โดย Turbo คือการที่จากเดิม ollama จะเป็นการใช้งาน self-hardware หรือเครื่องของผู้ใช้งานเป็นคนทำงานใช่มั้ยครับ แต่ Turbo คือการที่จะไปใช้ Server ของทาง Ollama เพื่อทำงานใน model ที่มีขนาดใหญ่ขึ้นนั้นเอง\n",[273,2654],{"alt":86,"src":2655},"/images/2025-08-18-ollama-desktop-ui/images-74485b02-c1a5-4067-aab2-467400bff2aa.jpg",[15,2657,2658],{},"ต้องคอยติดตามต่อไปว่าจะมีอะไรที่น่าสนใจหรือมีอะไรอัพเดทต่ออีกบ้างครับ ~",[10,2660,2662],{"id":2661},"ref","Ref",[925,2664,2665,2672],{},[928,2666,2667],{},[25,2668,2671],{"href":2669,"rel":2670},"https://ollama.com",[29],"ollama.com",[928,2673,2674],{},[25,2675,2677],{"href":2629,"rel":2676},[29],"Ollama new app",{"title":86,"searchDepth":335,"depth":335,"links":2679},[2680,2681,2682,2683,2684],{"id":2586,"depth":335,"text":2587},{"id":2597,"depth":335,"text":2598},{"id":2622,"depth":335,"text":2623},{"id":2648,"depth":335,"text":2649},{"id":2661,"depth":335,"text":2662},"2025-08-18T00:00:00.000Z","Ollama ออก Desktop Application พร้อม Chat UI มาให้ใช้แล้ว ไม่ต้องรัน model ผ่าน cli อีกต่อไป",{},"Ollama New Desktop Application","/blogs/2025-08-18-ollama-desktop-ui",{"title":2573,"description":2686},{"loc":2689},"blogs/2025-08-18-ollama-desktop-ui",[982],"2026-08-09T00:00:00.000Z","IuY_1dh_zyzuJusUAFsd5gtbx6KEONJYqeif4Wjlojg",{"id":2697,"title":2698,"body":2699,"date":2909,"description":2910,"draft":971,"extension":972,"meta":2911,"navigation":974,"next":1791,"ogTitle":2912,"path":2913,"pin":971,"prev":2564,"recommends":2914,"seo":2915,"sitemap":2916,"stem":2917,"tags":2918,"updated":975,"__hash__":2919},"content/blogs/2025-10-03-typhoon-ai-n8n.md","วิธีการนำ Typhoon AI มาใช้งานใน N8N",{"type":7,"value":2700,"toc":2904},[2701,2705,2708,2711,2715,2789,2793,2796,2810,2815,2820,2825,2830,2835,2840,2845,2850,2856,2861,2866,2871,2876,2882,2885,2891,2896,2899],[10,2702,2704],{"id":2703},"typhoon-ai-คืออะไร","Typhoon AI คืออะไร",[15,2706,2707],{},"Typhoon AI มีการพัฒนาในส่วนของ API ในรูปแบบของ Openai compatible api ซึ่งเป็นมาตรฐานของการพัฒนา API ของ AI ในปัจจุบันอยู่แล้วครับ นั่นหมายความว่าถ้าเดิม ๆ ใช้ของ OpenAI ได้ ก็จะสามารถเปลี่ยนมาใช้ของตัวอื่นได้ด้วยเช่นเดียวกัน โดยทำแค่เพียงเปลี่ยน URL ที่ใช้ในการเชื่อมต่อ",[15,2709,2710],{},"ด้วยความที่ model นี้สามารถนำมาใช้ได้ฟรีก็แนะนำว่าไม่ควรนำมาใช้ในเชิงพาณิชย์ นะครับ",[10,2712,2714],{"id":2713},"ข้อจำกัดในปัจจุบัน-update-311068","ข้อจำกัดในปัจจุบัน (update 31/10/68)",[2716,2717,2718,2745],"table",{},[2719,2720,2721],"thead",{},[2722,2723,2724,2730,2735,2740],"tr",{},[2725,2726,2727],"th",{},[22,2728,2729],{},"Model",[2725,2731,2732],{},[22,2733,2734],{},"Context Window",[2725,2736,2737],{},[22,2738,2739],{},"Requests per Second",[2725,2741,2742],{},[22,2743,2744],{},"Requests per Minute",[2746,2747,2748,2763,2775],"tbody",{},[2722,2749,2750,2754,2757,2760],{},[2751,2752,2753],"td",{},"typhoon-v2.5-30b-a3b-instruct",[2751,2755,2756],{},"128K tokens",[2751,2758,2759],{},"5",[2751,2761,2762],{},"200",[2722,2764,2765,2768,2771,2773],{},[2751,2766,2767],{},"typhoon-v2.1-12b-instruct",[2751,2769,2770],{},"56K tokens",[2751,2772,2759],{},[2751,2774,2762],{},[2722,2776,2777,2780,2783,2786],{},[2751,2778,2779],{},"typhoon-ocr",[2751,2781,2782],{},"-",[2751,2784,2785],{},"2",[2751,2787,2788],{},"20",[10,2790,2792],{"id":2791},"วิธีการนำมาใช้งานใน-n8n","วิธีการนำมาใช้งานใน N8N",[15,2794,2795],{},"มาเริ่มกันเลยฮะ",[1904,2797,2798],{},[928,2799,2800,2801,2805,2806],{},"สมัคร User ที่ ",[25,2802,2803],{"href":2803,"rel":2804},"https://playground.opentyphoon.ai/",[29]," เพื่อขอใช้ API Key (ตรงนี้ Free นะ) โดยจะมี Rate limit และเงื่อนไขการใช้งานเพิ่มเติมแนะนำให้อ่านต่อที่ ",[25,2807,2808],{"href":2808,"rel":2809},"https://docs.opentyphoon.ai/en/rate-limits/",[29],[15,2811,2812],{},[273,2813],{"alt":86,"src":2814},"/images/2025-10-03-typhoon-ai-n8n/typhoon-1.png",[1904,2816,2817],{"start":335},[928,2818,2819],{},"จากนั้นสามารถ Copy API Key ไว้ได้เลยฮะ ตามรูปนี้เลย",[15,2821,2822],{},[273,2823],{"alt":86,"src":2824},"/images/2025-10-03-typhoon-ai-n8n/typhoon-2.png",[1904,2826,2827],{"start":358},[928,2828,2829],{},"กลับมาที่ N8N ของเราแล้วกด \"Create Credential\"",[15,2831,2832],{},[273,2833],{"alt":86,"src":2834},"/images/2025-10-03-typhoon-ai-n8n/typhoon-3.png",[1904,2836,2837],{"start":375},[928,2838,2839],{},"โดยเลือกเป็น \"OpenAi\" ได้เลยครับ",[15,2841,2842],{},[273,2843],{"alt":86,"src":2844},"/images/2025-10-03-typhoon-ai-n8n/typhoon-4.png",[1904,2846,2847],{"start":392},[928,2848,2849],{},"นำ API Key ที่ Copy ไว้มาใส่ และแก้ตรง Base URL ให้เป็น",[81,2851,2854],{"className":2852,"code":2853,"language":149},[147],"https://api.opentyphoon.ai/v1\n",[59,2855,2853],{"__ignoreMap":86},[15,2857,2858],{},[273,2859],{"alt":86,"src":2860},"/images/2025-10-03-typhoon-ai-n8n/typhoon-6.png",[1904,2862,2863],{"start":413},[928,2864,2865],{},"จากนั้นเวลาจะใช้งานก็สามารถเลือกเป็น \"OpenAI Chat Model\" ได้เลย",[15,2867,2868],{},[273,2869],{"alt":86,"src":2870},"/images/2025-10-03-typhoon-ai-n8n/typhoon-5.png",[1904,2872,2873],{"start":430},[928,2874,2875],{},"ตรง \"Credential to connect with\" ให้เลือกเป็น typhoon ที่เราสร้างในขั้นตอนที่ 5 และเลือก Model โดยใช้ \"By ID\" และกรอกเป็น",[81,2877,2880],{"className":2878,"code":2879,"language":149},[147],"typhoon-v2.1-12b-instruct\n",[59,2881,2879],{"__ignoreMap":86},[15,2883,2884],{},"หรือ",[81,2886,2889],{"className":2887,"code":2888,"language":149},[147],"typhoon-v2.5-30b-a3b-instruct\n",[59,2890,2888],{"__ignoreMap":86},[15,2892,2893],{},[273,2894],{"alt":86,"src":2895},"/images/2025-10-03-typhoon-ai-n8n/typhoon-7.png",[15,2897,2898],{},"เรียบร้อยย เพียงแค่นี้เราก็จะสามารถใช้งาน typhoon AI ด้วย N8N ได้แล้วคับ Enjoy ฮะะ",[15,2900,2901],{},[273,2902],{"alt":86,"src":2903},"/images/2025-10-03-typhoon-ai-n8n/typhoon-8.png",{"title":86,"searchDepth":335,"depth":335,"links":2905},[2906,2907,2908],{"id":2703,"depth":335,"text":2704},{"id":2713,"depth":335,"text":2714},{"id":2791,"depth":335,"text":2792},"2025-10-03T00:00:00.000Z","วันนี้จะมาแนะนำวิธีการนำ Typhoon AI ซึ่งเป็น AI ของคนไทย มาใช้งานใน N8N",{},"Typhoon AI With N8N","/blogs/2025-10-03-typhoon-ai-n8n",[1795],{"title":2698,"description":2910},{"loc":2913},"blogs/2025-10-03-typhoon-ai-n8n",[982],"jr2VjJui14W_dRiJjqiGAGFZsLBqu9dWv0dJFu3EgXM",{"id":2921,"title":2922,"body":2923,"date":2996,"description":2997,"draft":971,"extension":972,"meta":2998,"navigation":974,"next":975,"ogTitle":2999,"path":3000,"pin":971,"prev":975,"recommends":975,"seo":3001,"sitemap":3002,"stem":3003,"tags":3004,"updated":2694,"__hash__":3005},"content/blogs/2026-02-08-glm-4-7.md","GLM-4.7 มาแล้ว! โมเดลใหม่จาก Zhipu AI ที่เคลมว่าแรงแซง SOTA ทุกค่าย",{"type":7,"value":2924,"toc":2992},[2925,2936,2943,2947,2973,2976,2979],[15,2926,2927,2928,2931,2932,2935],{},"ช่วงนี้วงการ LLM แข่งกันดุเดือดมาก ล่าสุดทาง ",[22,2929,2930],{},"Zhipu AI"," ก็ไม่ยอมน้อยหน้า ปล่อยตัว ",[22,2933,2934],{},"GLM-4.7"," ออกมาท้าชนรุ่นพี่ในตลาดแบบไม่เกรงใจใคร",[15,2937,2938,2939,2942],{},"เท่าที่ลองส่องดูใน Blog และ Benchmark ที่เขาปล่อยมา รอบนี้เขาเน้นเรื่อง ",[22,2940,2941],{},"\"Super-high Intelligence\""," หรือความฉลาดในการแก้ปัญหาซับซ้อน (Complex Reasoning) แบบก้าวกระโดดครับ",[10,2944,2946],{"id":2945},"มีอะไรน่าสนใจบ้าง","มีอะไรน่าสนใจบ้าง?",[925,2948,2949,2955,2961,2967],{},[928,2950,2951,2954],{},[22,2952,2953],{},"Reasoning เทพขึ้น:"," ตัวนี้ถูกเทรนมาให้จัดการกับ Logic ยากๆ ได้ดีขึ้นมาก ฟีลคล้ายๆ กับพวกโมเดลตระกูล o1/Reasoning ของฝั่งตะวันตก",[928,2956,2957,2960],{},[22,2958,2959],{},"Coding เก่งขึ้น:"," สำหรับชาว Dev อย่างเรา นี่คือ Key Feature เลย GLM-4.7 เข้าใจ Context ของ Codebase และช่วย Debug หรือ Refactor ได้แม่นยำกว่ารุ่น 4.0 เดิมเยอะ",[928,2962,2963,2966],{},[22,2964,2965],{},"Universal Capability:"," ทำได้รอบด้านทั้ง Text, Code, Vision และ Function Calling ที่เสถียรขึ้นมาก เหมาะเอาไปต่อกับ Agent สุดๆ",[928,2968,2969,2972],{},[22,2970,2971],{},"Cost-effective:"," จุดขายของค่ายนี้คือความคุ้มค่า ประสิทธิภาพระดับ SOTA (State-of-the-Art) แต่ราคา API มักจะเป็นมิตรกว่าค่ายใหญ่ๆ ฝั่ง US",[10,2974,2975],{"id":2975},"ความรู้สึกส่วนตัว",[15,2977,2978],{},"ส่วนตัวผมเชียร์ค่าย GLM มาสักพักเพราะชอบความ \"Open\" และความเร็วในการตอบสนอง รอบนี้ถือว่าอัปเกรดมาน่ากลัวมาก ใครที่ทำพวก AI Agent หรือกำลังหา Model ทางเลือกที่ฉลาดแต่ประหยัด Token แนะนำให้ลองไปต่อ API เล่นดูครับ",[1464,2980,2981],{},[15,2982,2983,2986,2987],{},[22,2984,2985],{},"อ่านรายละเอียดเต็มๆ:"," ",[25,2988,2991],{"href":2989,"rel":2990},"https://z.ai/blog/glm-4.7",[29],"Zhipu AI Blog - GLM-4.7",{"title":86,"searchDepth":335,"depth":335,"links":2993},[2994,2995],{"id":2945,"depth":335,"text":2946},{"id":2975,"depth":335,"text":2975},"2026-02-08T00:00:00.000Z","สรุปจุดเด่น GLM-4.7 โมเดลล่าสุดจาก Zhipu AI ที่ยกระดับ Reasoning และ Coding ไปอีกขั้นในราคาที่จับต้องได้",{},"GLM-4.7 Review","/blogs/2026-02-08-glm-4-7",{"title":2922,"description":2997},{"loc":3000},"blogs/2026-02-08-glm-4-7",[982],"8_coevdo5JgCRo0swFj5h0Pw1zECeXpGZfM8sLXMK-4",{"id":3007,"title":3008,"body":3009,"date":2996,"description":3096,"draft":971,"extension":972,"meta":3097,"navigation":974,"next":975,"ogTitle":3098,"path":3099,"pin":971,"prev":975,"recommends":975,"seo":3100,"sitemap":3101,"stem":3102,"tags":3103,"updated":2694,"__hash__":3104},"content/blogs/2026-02-08-kimi-k2-5.md","Kimi k2.5 เปิดตัวแล้ว! โมเดลใหม่สาย Long Context ที่ฉลาดและเร็วกว่าเดิม",{"type":7,"value":3010,"toc":3092},[3011,3021,3024,3028,3054,3058,3077,3080],[15,3012,3013,3014,3017,3018,1935],{},"สาย AI จีนน่าจะคุ้นเคยกับ ",[22,3015,3016],{},"Kimi (Moonshot AI)"," กันดีในฐานะเจ้าพ่อ Long Context Window ที่ยัดไฟล์ PDF เป็นร้อยหน้าให้มันอ่านได้สบายๆ ล่าสุดเขาปล่อยของใหม่ออกมาเป็น ",[22,3019,3020],{},"Kimi k2.5",[15,3022,3023],{},"หลังจากลองไปอ่าน Blog และเล่นดูคร่าวๆ บอกเลยว่ารอบนี้ไม่ใช่แค่ Minor change แต่เป็นการจูนเครื่องให้ \"คิด\" ซับซ้อนได้ดีขึ้นแบบเห็นผล",[10,3025,3027],{"id":3026},"มีอะไรใหม่ใน-k25","มีอะไรใหม่ใน k2.5?",[925,3029,3030,3036,3042,3048],{},[928,3031,3032,3035],{},[22,3033,3034],{},"Enhanced Reasoning:"," การแก้โจทย์ Logic หรือ Math ที่ต้องคิดหลาย Step ทำได้เนียนตาขึ้นมาก ไม่ค่อยหลุดมั่วเหมือนรุ่นก่อน",[928,3037,3038,3041],{},[22,3039,3040],{},"Super Long Context (Updated):"," จุดขายเดิมคือ Context ยาว แต่รอบนี้ k2.5 จัดการ Information Retrieval ใน Context ยาวๆ ได้แม่นยำขึ้น (อาการ \"ลืม\" กลางทางน้อยลง)",[928,3043,3044,3047],{},[22,3045,3046],{},"Coding Performance:"," ลองให้เขียน Script Python ง่ายๆ หรือแก้บั๊ก Code ที่ซับซ้อน ถือว่าทำได้ดีขึ้นจนน่าตกใจ เอามาเป็น Pair Programmer ได้เลย",[928,3049,3050,3053],{},[22,3051,3052],{},"Speed & Efficiency:"," รู้สึกว่า Response Time ไวขึ้น ประมวลผลลื่นขึ้น",[10,3055,3057],{"id":3056},"เหมาะกับใคร","เหมาะกับใคร?",[925,3059,3060,3067,3070],{},[928,3061,3062,3063,3066],{},"คนที่ชอบโยน ",[22,3064,3065],{},"Document/Paper/Report"," ยาวๆ ให้ AI ช่วยสรุปหรือวิเคราะห์",[928,3068,3069],{},"Dev ที่อยากหา Model ทางเลือกนอกจาก GPT-4 หรือ Claude มาช่วยเขียน Code",[928,3071,3072,3073,3076],{},"สาย ",[22,3074,3075],{},"Data Analysis"," ที่ต้อง Process ข้อมูลดิบจำนวนมาก",[15,3078,3079],{},"ใครที่ใช้ Kimi เป็นตัวหลักในการอ่าน Doc อยู่แล้ว แนะนำให้สลับมาลอง k2.5 ดูครับ ชีวิตดีขึ้นเยอะ!",[1464,3081,3082],{},[15,3083,3084,2986,3087],{},[22,3085,3086],{},"อ่านเพิ่มเติม:",[25,3088,3091],{"href":3089,"rel":3090},"https://www.kimi.com/blog/kimi-k2-5.html",[29],"Kimi Blog - Kimi k2.5",{"title":86,"searchDepth":335,"depth":335,"links":3093},[3094,3095],{"id":3026,"depth":335,"text":3027},{"id":3056,"depth":335,"text":3057},"สรุปความโหดของ Kimi k2.5 โมเดลล่าสุดจาก Moonshot AI ที่อัปเกรดเรื่อง Reasoning และการจัดการ Context ยาวๆ ให้เสถียรขึ้น",{},"Kimi k2.5 Review","/blogs/2026-02-08-kimi-k2-5",{"title":3008,"description":3096},{"loc":3099},"blogs/2026-02-08-kimi-k2-5",[982],"Zu9Ypw0Ourkbe2zliBqgo2WgI850b444Qfx5qrUqRsg",{"id":3106,"title":3107,"body":3108,"date":2996,"description":3223,"draft":971,"extension":972,"meta":3224,"navigation":974,"next":975,"ogTitle":3124,"path":3225,"pin":971,"prev":975,"recommends":975,"seo":3226,"sitemap":3227,"stem":3228,"tags":3229,"updated":2694,"__hash__":3230},"content/blogs/2026-02-08-n8n-skills.md","เปลี่ยน Claude ให้เป็นเทพ n8n ด้วย n8n-skills",{"type":7,"value":3109,"toc":3218},[3110,3119,3126,3130,3166,3168,3189,3192,3203,3206],[15,3111,3112,3113,858,3116,3118],{},"ปกติเวลาให้ AI ช่วยเขียน Script หรือออกแบบ Workflow ใน n8n ปัญหาที่เจอบ่อยคือ AI มักจะมั่ว Syntax (เช่นการใช้ ",[59,3114,3115],{},"{{$json}}",[59,3117,2160],{}," แบบผิดๆ) หรือไม่รู้จัก Node ใหม่ๆ ทำให้เราต้องมานั่งแก้เองจนเหนื่อย",[15,3120,3121,3122,3125],{},"วันนี้ไปเจอของดีมาครับ ",[22,3123,3124],{},"n8n-skills"," จากคุณ czlonkowski เป็นโปรเจกต์ที่รวบรวม \"Skills\" หรือชุดความรู้เฉพาะทางของ n8n เอาไว้ให้เรา Feed เข้าไปใน Claude (ผ่าน Claude Code หรือ MCP Server) เพื่อให้มันกลายเป็นผู้เชี่ยวชาญ n8n แบบทันที",[10,3127,3129],{"id":3128},"features-หลักๆ-ที่น่าสนใจ","Features หลักๆ ที่น่าสนใจ",[925,3131,3132,3148,3154,3160],{},[928,3133,3134,3137,3138,718,3141,718,3144,3147],{},[22,3135,3136],{},"Expression Syntax Expert:"," สอนให้ AI เข้าใจโครงสร้างตัวแปรของ n8n จริงๆ (เช่น ",[59,3139,3140],{},"$node",[59,3142,3143],{},"$env",[59,3145,3146],{},"$json.body",") ไม่เขียนมั่ว",[928,3149,3150,3153],{},[22,3151,3152],{},"Workflow Patterns:"," รวม Pattern ยอดฮิตกว่า 5 แบบ (Webhook, API Integration, Database Sync ฯลฯ) ให้ AI ดึงไปใช้ได้เลย",[928,3155,3156,3159],{},[22,3157,3158],{},"Validation:"," ช่วยตรวจสอบ Error และแนะนำวิธีแก้ปัญหาที่ตรงจุด ไม่ใช่แนะนำแบบกว้างๆ",[928,3161,3162,3165],{},[22,3163,3164],{},"Node Configuration:"," AI จะเข้าใจ Property ของ Node กว่า 500+ ตัว รู้ว่าช่องไหนต้องกรอกอะไร",[10,3167,3057],{"id":3056},[925,3169,3170,3176,3186],{},[928,3171,3072,3172,3175],{},[22,3173,3174],{},"Self-hosting"," ที่รัน n8n เอง แล้วอยากมี AI Assistant เก่งๆ มาช่วย Config",[928,3177,3178,3179,858,3182,3185],{},"คนที่ใช้ ",[22,3180,3181],{},"Claude Code",[22,3183,3184],{},"Claude Desktop"," คู่กับ MCP (Model Context Protocol)",[928,3187,3188],{},"Dev ที่ขี้เกียจจำ Syntax ยิบย่อยของ n8n",[10,3190,3191],{"id":3191},"วิธีใช้คร่าวๆ",[15,3193,3194,3195,3198,3199,3202],{},"ถ้าใช้ Claude Code ก็แค่รันคำสั่งเพื่อ Install Plugin หรือถ้าใช้ผ่านหน้าเว็บ Claude.ai ก็สามารถ Download ไฟล์ ",[59,3196,3197],{},".md"," ในโฟลเดอร์ ",[59,3200,3201],{},"docs/skills"," ไปโยนให้มันอ่านเป็น Context ได้เลยครับ",[15,3204,3205],{},"ใครที่ใช้ n8n เป็น Core หลักในการทำ Automation อยู่แล้ว แนะนำให้ลองเอาไปเล่นดูครับ ช่วยลดเวลา Debug ไปได้เยอะมาก",[1464,3207,3208],{},[15,3209,3210,2986,3213],{},[22,3211,3212],{},"GitHub:",[25,3214,3217],{"href":3215,"rel":3216},"https://github.com/czlonkowski/n8n-skills",[29],"czlonkowski/n8n-skills",{"title":86,"searchDepth":335,"depth":335,"links":3219},[3220,3221,3222],{"id":3128,"depth":335,"text":3129},{"id":3056,"depth":335,"text":3057},{"id":3191,"depth":335,"text":3191},"ชุดคำสั่ง (Skills) สำหรับ Claude Code/MCP ที่จะช่วยให้ AI เข้าใจและเขียน n8n Workflow ได้แม่นยำขึ้นแบบก้าวกระโดด",{},"/blogs/2026-02-08-n8n-skills",{"title":3107,"description":3223},{"loc":3225},"blogs/2026-02-08-n8n-skills",[982],"BNAijlziyfN-DZPuGKPNqMSSxoxlap1l9wJHGcFd2wA",{"id":3232,"title":3233,"body":3234,"date":2996,"description":3339,"draft":971,"extension":972,"meta":3340,"navigation":974,"next":975,"ogTitle":3341,"path":3342,"pin":971,"prev":975,"recommends":975,"seo":3343,"sitemap":3344,"stem":3345,"tags":3346,"updated":2694,"__hash__":3347},"content/blogs/2026-02-08-nanobot-ai-agent.md","ลองเล่น Nanobot - AI Agent ไซส์มินิ (Python 4,000 บรรทัด)",{"type":7,"value":3235,"toc":3334},[3236,3246,3250,3256,3284,3288,3297,3300,3320,3322,3325],[15,3237,3238,3239,1935],{},"ช่วงนี้กระแส AI Agent มาแรงมาก แต่หลายตัวมักจะมาพร้อมกับ Framework ที่ใหญ่เทอะทะ หรือ Setup ยุ่งยากจนท้อไปก่อน วันนี้เลยอยากมาป้ายยาโปรเจกต์หนึ่งที่ไปเจอมา ชื่อว่า ",[22,3240,3241],{},[25,3242,3245],{"href":3243,"rel":3244},"https://github.com/HKUDS/nanobot",[29],"HKUDS/nanobot",[10,3247,3249],{"id":3248},"ทำไมถึงน่าสนใจ","ทำไมถึงน่าสนใจ?",[15,3251,3252,3253,1935],{},"จุดขายหลักของเจ้า Nanobot คือความ ",[22,3254,3255],{},"\"Ultra-lightweight\"",[925,3257,3258,3268,3278],{},[928,3259,3260,3263,3264,3267],{},[22,3261,3262],{},"Codebase เล็กมาก:"," Core logic ทั้งหมดเขียนด้วย Python แค่ประมาณ ",[22,3265,3266],{},"4,000 บรรทัด"," เท่านั้น (เคลมว่าเล็กกว่าคู่แข่ง 99%) ซึ่งเหมาะมากสำหรับคนที่อยากแกะโค้ดมาศึกษา หรือเอาไปโมต่อเอง",[928,3269,3270,3273,3274,3277],{},[22,3271,3272],{},"Local First:"," สาย Self-host หรือคนใช้ Mac M1/M2 น่าจะชอบ เพราะมันรองรับ ",[22,3275,3276],{},"Ollama"," ในตัว ไม่ต้องต่อ API นอกเสมอไป รัน Model ในเครื่องได้เลยฟรีๆ",[928,3279,3280,3283],{},[22,3281,3282],{},"Extensible:"," โครงสร้างมันออกแบบมาให้เราเขียน Skill เพิ่มง่ายมาก อยากให้มันทำอะไรเฉพาะทางก็แค่เขียน Python Function แปะเข้าไป",[10,3285,3287],{"id":3286},"ลองเล่นแล้วเป็นไง","ลองเล่นแล้วเป็นไง?",[15,3289,3290,3291,858,3294,3296],{},"ความรู้สึกแรกคือ \"คลีน\" ครับ ติดตั้งผ่าน ",[59,3292,3293],{},"pip",[59,3295,97],{}," แป๊บเดียวเสร็จ สั่งงานผ่าน CLI ได้เลย หรือจะเชื่อมกับ Chat App อย่าง Telegram/Discord ก็ได้",[15,3298,3299],{},"Use case ที่น่าเอาไปทำต่อ:",[1904,3301,3302,3308,3314],{},[928,3303,3304,3307],{},[22,3305,3306],{},"Personal Assistant:"," ให้ช่วยสรุปข่าว หรือแจ้งเตือนสิ่งที่ต้องทำ",[928,3309,3310,3313],{},[22,3311,3312],{},"Coding Buddy:"," ให้ช่วยเจน Code เล็กๆ น้อยๆ หรือ Refactor code",[928,3315,3316,3319],{},[22,3317,3318],{},"Monitor Task:"," สั่งให้เฝ้ากราฟหุ้น/Crypto แล้วแจ้งเตือนเมื่อถึงราคาที่ตั้งไว้",[10,3321,892],{"id":892},[15,3323,3324],{},"ใครกำลังมองหา AI Agent Framework ที่ \"เบา\" และ \"คุมได้ 100%\" แนะนำให้ลอง clone มาเล่นดูครับ ถือว่าเป็นจุดเริ่มต้นที่ดีสำหรับคนที่อยากเข้าใจการทำงานของ Agentic Workflow แบบไม่ต้องปวดหัวกับ Library ที่ซับซ้อนเกินไป",[15,3326,3327,3328,2986,3331],{},"👉 ",[22,3329,3330],{},"Repo:",[25,3332,3243],{"href":3243,"rel":3333},[29],{"title":86,"searchDepth":335,"depth":335,"links":3335},[3336,3337,3338],{"id":3248,"depth":335,"text":3249},{"id":3286,"depth":335,"text":3287},{"id":892,"depth":335,"text":892},"รีวิว Nanobot AI Agent ที่เคลมว่าเล็กพริกขี้หนู เขียนด้วย Python เพียวๆ ปรับแต่งง่าย",{},"Review HKUDS Nanobot","/blogs/2026-02-08-nanobot-ai-agent",{"title":3233,"description":3339},{"loc":3342},"blogs/2026-02-08-nanobot-ai-agent",[982],"oEYxK0LQtu2cfQdhGI2cCby9dHxV8UFJG6ur5lfdTu0",{"id":3349,"title":3350,"body":3351,"date":3425,"description":3426,"draft":971,"extension":972,"meta":3427,"navigation":974,"next":975,"ogTitle":3428,"path":3429,"pin":971,"prev":975,"recommends":975,"seo":3430,"sitemap":3431,"stem":3432,"tags":3433,"updated":2694,"__hash__":3434},"content/blogs/2026-02-12-glm-5.md","GLM-5 เปิดตัวแล้ว! การก้าวกระโดดครั้งใหญ่สู่ Omni-Model เต็มรูปแบบ 🚀",{"type":7,"value":3352,"toc":3421},[3353,3363,3370,3374,3400,3403,3406,3409],[15,3354,3355,3356,3358,3359,3362],{},"หลังจากที่เพิ่งตื่นเต้นกับ GLM-4.7 ไปหมาดๆ ทาง ",[22,3357,2930],{}," ก็ไม่ปล่อยให้รอนาน ปล่อยของใหญ่อย่าง ",[22,3360,3361],{},"GLM-5"," ออกมาตบตลาด AI อีกรอบแล้วครับ!",[15,3364,3365,3366,3369],{},"รอบนี้ไม่ใช่แค่เก่งขึ้น แต่เป็นการยกเครื่องสถาปัตยกรรมใหม่ให้เป็น ",[22,3367,3368],{},"Native Omni-Model"," เต็มตัว คือรับ Input/Output ได้ทั้ง Text, Audio และ Video แบบ Seamless ไม่ต้องผ่านตัวแปลงหลายทอด ทำให้ Response Time ไวขึ้นแบบเห็นได้ชัด",[10,3371,3373],{"id":3372},"ไฮไลท์ของ-glm-5","ไฮไลท์ของ GLM-5",[925,3375,3376,3382,3388,3394],{},[928,3377,3378,3381],{},[22,3379,3380],{},"Unified Modality:"," คุยด้วยเสียง หรือโยนวิดีโอให้วิเคราะห์ได้แบบ Real-time ความหน่วงต่ำมาก (Low Latency) เหมาะเอาไปทำ Voice Agent สุดๆ",[928,3383,3384,3387],{},[22,3385,3386],{},"Deep Reasoning:"," ความสามารถในการแก้โจทย์ Logic ซับซ้อนและการวางแผน (Planning) สำหรับ Agent Workflow ดีขึ้นกว่ารุ่น 4 เยอะมาก",[928,3389,3390,3393],{},[22,3391,3392],{},"Coding & Tool Use:"," เขียน Code ได้แม่นยำขึ้น เข้าใจ Context ของ Project ใหญ่ๆ ได้ดี และเรียกใช้ External Tools (Function Calling) ได้เนียนกริบ",[928,3395,3396,3399],{},[22,3397,3398],{},"Long Context:"," รองรับ Context Window มหาศาล เอา Book ทั้งเล่มหรือ Codebase ทั้งก้อนโยนเข้าไปได้สบาย",[10,3401,3402],{"id":3402},"ความเห็นส่วนตัว",[15,3404,3405],{},"สำหรับ Dev สายสร้าง Agent หรือคนที่ทำระบบ Automation ผ่าน API ตัว GLM-5 ถือว่าเป็นตัวเลือกที่น่ากลัวมาก (ในทางที่ดี) เพราะทั้งฉลาดและราคา (Pricing) น่าจะยังคงความคุ้มค่าสไตล์ Zhipu ไว้",[15,3407,3408],{},"ใครที่รัน Project ด้วย GLM-4 อยู่ แนะนำให้เตรียมวางแผน Migration มาลองตัวนี้เลยครับ น่าจะช่วยลด Error Rate ใน Production ได้เยอะ",[1464,3410,3411],{},[15,3412,3413,2986,3416],{},[22,3414,3415],{},"รายละเอียดเพิ่มเติม:",[25,3417,3420],{"href":3418,"rel":3419},"https://z.ai/blog/glm-5",[29],"Zhipu AI Blog - GLM-5",{"title":86,"searchDepth":335,"depth":335,"links":3422},[3423,3424],{"id":3372,"depth":335,"text":3373},{"id":3402,"depth":335,"text":3402},"2026-02-12T00:00:00.000Z","สรุปฟีเจอร์เด็ดของ GLM-5 โมเดลเรือธงรุ่นล่าสุดจาก Zhipu AI ที่เก่งรอบด้านทั้งภาพ เสียง และการเขียนโค้ด",{},"GLM-5 Review","/blogs/2026-02-12-glm-5",{"title":3350,"description":3426},{"loc":3429},"blogs/2026-02-12-glm-5",[982],"41N4ZkKS4LuQSEw34k1_83gi9NzuA0CShiAFCy1vrT8",1789544687308]