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