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