1 คะแนน โดย GN⁺ 4 시간 전 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • zerostack คือเอเจนต์เขียนโค้ดขนาดเล็กที่เขียนด้วย Rust และรองรับทั้งผู้ให้บริการ LLM หลายรายรวมถึงผู้ให้บริการแบบกำหนดเอง
  • มีเครื่องมืออ่าน·เขียน·แก้ไขไฟล์, grep, ค้นหาไฟล์, แสดงรายการไดเรกทอรี, การรัน Bash ที่มีเกตการอนุญาต, MCP และเครื่องมือเว็บของ Exa
  • มีขนาดประมาณ 7 พัน LoC, ไบนารี 8.9MB โดยใช้ RAM ราว 8MB ในเซสชันว่าง·ราว 12MB ระหว่างทำงาน และใช้ CPU 0.0% เมื่อว่าง
  • ผู้ให้บริการเริ่มต้นคือ OpenRouter ติดตั้งด้วย cargo install zerostack และหากต้องการใช้การแยก Bash ใน --sandbox ต้องมี bubblewrap
  • มี พรอมป์ต์ในตัว เช่น code·plan·review, โหมดสิทธิ์ 4 แบบ, การกลับมาใช้เซสชันต่อ, ลูปแบบวนซ้ำ และการรวม Git worktrees

ภาพรวมของ zerostack

  • zerostack คือเอเจนต์เขียนโค้ดขนาดเล็กที่เขียนด้วย Rust และได้รับแรงบันดาลใจจาก pi และ opencode
  • มีสถาปัตยกรรมแบบ หลายผู้ให้บริการ ที่รองรับ OpenRouter, OpenAI, Anthropic, Gemini, Ollama และผู้ให้บริการแบบกำหนดเอง
  • มีเครื่องมือจัดการไฟล์ เช่น อ่าน·เขียน·แก้ไขไฟล์, grep, ค้นหาไฟล์, แสดงรายการไดเรกทอรี และ การรัน Bash ที่มีเกตการอนุญาต
  • รวมการบันทึก·โหลด·ใช้งานเซสชันต่อ, การบีบอัดอัตโนมัติเพื่อรักษาหน้าต่างคอนเท็กซ์, เทอร์มินัล UI ที่อิง crossterm, การเชื่อมต่อเซิร์ฟเวอร์ MCP และเครื่องมือ WebFetch·WebSearch ที่อิง Exa
  • สามารถย้ายข้าม Git worktree ได้ด้วย /worktree และยังมีลูปแบบวนซ้ำสำหรับงานระยะยาวรวมอยู่ด้วย

ประสิทธิภาพและการติดตั้ง

  • zerostack มีขนาดประมาณ 7 พัน LoC และไบนารีมีขนาด 8.9MB
  • การใช้ RAM อยู่ที่ประมาณ 8MB ในเซสชันว่าง และประมาณ 12MB ระหว่างทำงาน เมื่อเทียบกับราว 300MB ของ opencode หรือเอเจนต์เขียนโค้ดที่ใช้ JS อื่น ๆ
  • การใช้ CPU วัดได้ที่ 0.0% เมื่อว่าง และราว 1.5% ระหว่างใช้เครื่องมือ โดยเมื่อเทียบกันบน Intel i5 เจเนอเรชัน 7 opencode ใช้ราว 2% เมื่อว่าง และราว 20% ระหว่างทำงาน
  • การติดตั้งต้องใช้ Cargo และ git โดยใช้คำสั่งต่อไปนี้
    cargo install zerostack  
    
  • หากใช้ --sandbox และต้องการรันคำสั่ง Bash ทั้งหมดในสภาพแวดล้อมแยก ต้องติดตั้ง bubblewrap
    # Debian/Ubuntu  
    apt install bubblewrap  
    
    # Fedora  
    dnf install bubblewrap  
    
    # Arch  
    pacman -S bubblewrap  
    

เริ่มต้นอย่างรวดเร็ว

  • ผู้ให้บริการเริ่มต้นคือ OpenRouter และตั้งค่า API key ผ่านตัวแปรสภาพแวดล้อม
    export OPENROUTER_API_KEY="[api_key]"  
    
  • เซสชันแบบโต้ตอบจะรันด้วยพรอมป์ต์เริ่มต้น code
    zerostack  
    
  • โหมดรันครั้งเดียวสามารถส่งพรอมป์ต์ด้วย -p
    zerostack -p "Explain this project"  
    
  • เซสชันล่าสุดสามารถทำต่อได้ด้วย -c
    zerostack -c  
    
  • สามารถระบุผู้ให้บริการและโมเดลได้
    zerostack --provider openrouter --model deepseek/deepseek-v4-flash  
    

ระบบพรอมป์ต์

  • zerostack มีชุด system prompt ในตัว สำหรับเปลี่ยนพฤติกรรมและโทนการตอบของเอเจนต์
  • เป้าหมายคือการสร้างชุดพรอมป์ต์ที่สามารถใช้แทน superpower หรือ Claude official skills ได้
  • สามารถใช้ /prompt เพื่อแสดงรายการพรอมป์ต์ที่ลงทะเบียนไว้หรือสลับไปใช้พรอมป์ต์อื่น
  • พรอมป์ต์ในตัว

    • code เป็นค่าเริ่มต้น และเป็นโหมดเขียนโค้ดที่เข้าถึงไฟล์ทั้งหมด·เครื่องมือ Bash ได้ พร้อมใช้ เวิร์กโฟลว์ TDD
    • plan เป็นโหมดสำหรับวางแผนโดยเฉพาะ สำรวจแล้วจัดทำแผนโดยไม่เขียนโค้ด
    • review เป็นโหมดรีวิวโค้ดเพื่อตรวจสอบความถูกต้อง การออกแบบ การทดสอบ และผลกระทบ
    • debug เป็นโหมดดีบักที่ค้นหา สาเหตุราก ก่อนเสนอวิธีแก้
    • ask เป็นโหมดอ่านอย่างเดียว อนุญาตเฉพาะ read·grep·glob และไม่อนุญาตการเขียนหรือ Bash
    • brainstorm เป็นโหมดสำหรับออกแบบโดยเฉพาะ ใช้สำรวจไอเดียและเสนอการออกแบบโดยไม่เขียนโค้ด
    • frontend-design เป็นโหมดออกแบบฟรอนต์เอนด์สำหรับ UI ที่โดดเด่นและพร้อมใช้งานระดับโปรดักชัน
    • review-security เป็นโหมดรีวิวความปลอดภัยเพื่อค้นหาช่องโหว่ที่สามารถถูกนำไปใช้โจมตีได้
    • simplify เป็นโหมดทำโค้ดให้ง่ายขึ้นเพื่อเพิ่มความชัดเจนโดยไม่เปลี่ยนพฤติกรรมการทำงาน
    • write-prompt เป็นโหมดเขียนพรอมป์ต์สำหรับสร้างและปรับแต่งพรอมป์ต์ของเอเจนต์
    • พรอมป์ต์แบบกำหนดเองสามารถสร้างได้โดยวางไฟล์ Markdown ไว้ที่ $XDG_CONFIG_HOME/zerostack/prompts/ แล้วอ้างอิงด้วยชื่อ
    • ระบบจะอ่าน AGENTS.md หรือ CLAUDE.md ที่รูทโปรเจกต์หรือไดเรกทอรีแม่โดยอัตโนมัติและแทรกเข้าไปใน system prompt โดยสามารถปิดได้ด้วย -n หรือ --no-context-files

ระบบสิทธิ์

  • zerostack มี โหมดสิทธิ์ 4 แบบ ตั้งแต่แบบปลอดภัยที่สุดไปจนถึงแบบเปิดกว้างที่สุด
  • โหมดสิทธิ์

    • restrictive หรือ -R จะขออนุมัติสำหรับทุกการกระทำของเครื่องมือที่ไม่ได้รับอนุญาตไว้อย่างชัดเจนในคอนฟิก
    • standard เป็นค่าเริ่มต้น โดยจะอนุมัติคำสั่งที่ปลอดภัยอย่าง ls, cd, git log, cargo check อัตโนมัติ และจะขอการยืนยันสำหรับการเขียนหรือการกระทำที่ทำลายได้
    • accept-all หรือ --accept-all จะอนุมัติทุกการกระทำภายในไดเรกทอรีงานโดยอัตโนมัติ และขอการยืนยันเมื่อเป็นพาธภายนอก
    • yolo หรือ --yolo จะอนุมัติทุกการกระทำอัตโนมัติโดยไม่ถาม
    • สามารถกำหนดสิทธิ์อย่างละเอียดได้ด้วย glob pattern รายเครื่องมือในไฟล์คอนฟิก
    • ตัวอย่างเช่น สามารถตั้งให้ write **.rs อนุญาตอัตโนมัติ แต่การเขียนไฟล์อื่นต้องยืนยันเสมอ
    • รายการอนุญาตของเซสชัน จะเก็บการตัดสินใจที่อนุมัติไว้ตลอดเซสชันเพื่อไม่ต้องยืนยันการกระทำเดิมซ้ำ
    • หากมีการเรียกใช้เครื่องมือแบบเดียวกันซ้ำ 3 ครั้งขึ้นไป ระบบตรวจจับ doom-loop จะขึ้นพรอมป์ต์เตือนหรือปฏิเสธตามการตั้งค่า เพื่อป้องกันไม่ให้เอเจนต์ทำงานที่ทำลายได้ซ้ำ ๆ

คำสั่งสแลชและการจัดการเซสชัน

  • คำสั่งสแลช หลักใช้ควบคุมโมเดล ระดับการคิด บทสนทนา เซสชัน ลูป พรอมป์ต์ และโหมดสิทธิ์
  • /model ใช้สลับโมเดล และ /thinking ใช้ตั้งระดับการคิด
  • /clear ใช้ล้างบทสนทนา และ /session ใช้แสดงรายการ·บันทึก·โหลดเซสชัน
  • /loop ใช้ตั้งพรอมป์ต์แบบวนซ้ำ และ /prompt ใช้แสดงรายการหรือเปลี่ยนพรอมป์ต์ของเอเจนต์
  • /mode ใช้ตั้งโหมดของระบบสิทธิ์ และดูคำสั่งทั้งหมดได้ด้วย /help
  • เซสชันจะถูกบันทึกไว้ที่ $XDG_DATA_HOME/zerostack/sessions/
  • -c ใช้กลับมาใช้งานเซสชันล่าสุดต่อ, -r ใช้เลือกจากการเรียกดูเซสชัน และ --session <id> ใช้โหลดเซสชันที่ระบุ

ลูปแบบวนซ้ำ

  • zerostack มี ลูปการเขียนโค้ดแบบวนซ้ำ สำหรับงานระยะยาว
  • เอเจนต์จะอ่านงานซ้ำ ๆ เลือกรายการจากแผน ดำเนินงาน รันทดสอบ อัปเดตแผน และวนต่อไปจนกว่างานจะเสร็จหรือถึงขีดจำกัดจำนวนรอบ
  • ระบบลูปเป็น ฟีเจอร์ทดลอง
  • วิธีใช้ลูป

    • /loop Implement the user authentication system จะเริ่มลูปด้วยพรอมป์ต์ที่กำหนด
    • /loop stop จะหยุดลูปที่กำลังทำงาน
    • /loop status จะแสดงสถานะของลูปปัจจุบัน
    • ในแต่ละรอบจะมีงานต้นฉบับ, LOOP_PLAN.md ที่เปลี่ยนแปลงไป, สรุปรอบก่อนหน้า และผลลัพธ์การตรวจสอบรวมอยู่ด้วย
    • ระหว่างที่ลูปทำงานอยู่ อินพุตที่ไม่ใช่คำสั่งสแลชจะถูกบล็อก
  • ลูปแบบเฮดเลสผ่าน CLI

    • สามารถรันลูปแบบเฮดเลสได้ด้วยคำสั่งต่อไปนี้
      zerostack --loop --loop-prompt "Refactor the API" --loop-max 10 --loop-run "cargo test"  
      
    • --loop เปิดโหมดลูปแบบเฮดเลส
    • --loop-prompt <text> ระบุพรอมป์ต์ที่จะใช้ในแต่ละรอบ
    • --loop-plan <path> ระบุพาธของไฟล์แผนแบบกำหนดเอง โดยค่าเริ่มต้นคือ LOOP_PLAN.md
    • --loop-max <N> ระบุจำนวนรอบสูงสุด โดยค่าเริ่มต้นคือไม่จำกัด
    • --loop-run <cmd> ระบุคำสั่งตรวจสอบที่จะรันหลังแต่ละรอบ

การรวม Git worktrees

  • zerostack รองรับเวิร์กโฟลว์ การทำงานแยกตามสาขา ผ่าน git worktrees
  • สามารถสร้าง worktree ทำงานภายในนั้น รวมกลับ และออกจาก worktree ได้จากในแชต UI
  • การรวม Git worktrees เป็น ฟีเจอร์ทดลอง
  • คำสั่ง worktree

    • /worktree <name> จะสร้าง git worktree บนสาขา <name> แล้วย้ายไปที่นั่น และหากมีอยู่แล้วจะข้ามการสร้าง
    • /wt-merge [branch] จะรวมสาขา worktree เข้ากับ [branch], push, เก็บกวาด แล้วกลับสู่รีโพซิทอรีหลัก
    • /wt-exit จะกลับสู่รีโพซิทอรีหลักโดยไม่รวมสาขา
  • ตัวอย่างเวิร์กโฟลว์

    • /worktree feature-x จะสร้างสาขาใหม่และไดเรกทอรี worktree แล้วเข้าไปทำงานที่นั่น
    • หลังจากนั้นสามารถใช้ zerostack ตามปกติ และการเปลี่ยนแปลงจะคงอยู่ในสาขา feature
    • /wt-merge จะให้เอเจนต์รวมสาขา push เก็บกวาด แล้วกลับสู่รีโพซิทอรีหลัก
    • /wt-exit จะกลับสู่รีโพซิทอรีหลักทันทีโดยไม่รวมสาขา

ผู้ให้บริการที่รองรับและไลเซนส์

  • ผู้ให้บริการเริ่มต้นคือ OpenRouter
  • รองรับ vLLM, LiteLLM และอื่น ๆ ในฐานะผู้ให้บริการที่เข้ากันได้กับ OpenAI
  • รองรับ Anthropic, Gemini, Ollama
  • ผู้ให้บริการแบบกำหนดเองสามารถตั้งค่า base URL ใดก็ได้และตัวแปรสภาพแวดล้อมสำหรับ API key ที่ $XDG_CONFIG_HOME/zerostack/config.json
  • ไลเซนส์คือ GPL-3.0-only

1 ความคิดเห็น

 
GN⁺ 4 시간 전
ความเห็นจาก Hacker News
  • ผมไม่ค่อยรู้จักเครื่องมือแนวนี้ เลยอยากรู้ว่ามันมีข้อดีอะไรเมื่อเทียบกับโมเดล/เครื่องมืออย่าง Claude Code

  • ผมก็กำลังทำอะไรคล้าย ๆ กันเองตอนเวลาว่าง ตั้งใจจะทำเพื่อเข้าใจเอเจนต์ให้ลึกขึ้นและเรียน Rust ไปด้วย
    แต่ก็อยากคงความ ปรับแต่งได้ แบบของ pi เอาไว้ เพราะความสามารถในการดัดแปลงตัวเองและสร้างเครื่องมือใหม่มีประโยชน์มาก และผมคิดว่าเครื่องมือแบบนี้ไม่ควรมีสิทธิ์รันโค้ดอะไรก็ได้ผ่าน bash
    แน่นอนว่าถ้าเข้าถึง edit กับ cargo run ได้ ก็ยังรันโค้ดตามใจได้อยู่ดี แต่ถ้ามีงานที่เอเจนต์แบบไม่มี bash ต้องทำ ผมจะให้มันสร้างเครื่องมือขึ้นมาเฉพาะกิจแทน

    • ผมคิดเรื่องนี้เหมือนกัน แต่ Pi ทำบน TypeScript เลยมีสภาพแวดล้อมแบบสคริปต์ได้ ขณะที่ Rust เป็น ภาษาแบบคอมไพล์ เลยมีข้อจำกัด
      เลยเลือกเปิดให้ปรับแต่งด้วยวิธีอื่นแทน ไลบรารีพรอมป์ต์ใน ~/.config/hypernova/prompts/ เป็นทางเลือกง่าย ๆ ของ Skills และพรอมป์ต์ที่มีมาในตัวก็ควรใช้แทน superpowers กับ frontend-design ของ Claude ได้
      ฟีเจอร์ที่อาจทำให้เอเจนต์หนักสามารถปิดได้ตอนคอมไพล์ด้วย feature flags และโค้ดก็สั้น อ่านง่าย ถ้าจำเป็นก็เอา zerostack ไปรันกับซอร์สของ zerostack เองเพื่อทำ custom fork ได้
      ส่วนโมเดลสิทธิ์ หลังจากคิดมาเยอะอย่างที่เห็นใน README ก็ทำไว้ 4 ระดับ ตั้งแต่ “Restrictive” ที่ไม่มีคำสั่งเลย ไปจนถึง “YOLO” ที่ปล่อยให้เอเจนต์ทำอะไรก็ได้ตามต้องการ และยังตั้ง regex อนุญาต/ถาม/ปฏิเสธสำหรับการเรียก bash ได้ด้วย ในกรณีนี้แค่รัน zerostack -R ก็สามารถบังคับให้ทุกเครื่องมือถามสิทธิ์ก่อนทำงานได้
      ฟีเจอร์เอเจนต์แบบเขียนโปรแกรมได้ก็กำลังทำอยู่ แต่ยังไม่ถึงขั้นจะประกาศ
    • ผมก็กำลังทำแบบเดียวกันด้วย Zig
  • ช่วงนี้ผมเพิ่งทำตัวหนึ่งเล่น ๆ แต่ก็เอาจริงอยู่เหมือนกัน ขนาดไม่ถึง 200 บรรทัด: https://github.com/pnegahdar/nano
    มีทั้ง REPL, session, การรันแบบไม่โต้ตอบ, การอนุมัติ ฯลฯ ผมมองว่ายิ่งโมเดลฉลาดขึ้น ความสำคัญของ ฮาร์เนส ก็จะยิ่งลดลง ยกเว้นเรื่องประสบการณ์นักพัฒนา
    สักวันอาจจะลองไปรันกับ SWE-bench ดู

    • 200 บรรทัด หรือจริง ๆ แค่ 190 บรรทัดเอง น่าทึ่งมาก
      ผมเองก็เพิ่งทำตัวหนึ่งเมื่อสัปดาห์ก่อนเพื่อความสนุกและเรียนรู้ และมันทำงานรวมกับ mcpServers ที่ตั้งค่าไว้ได้เหมือนโค้ดดิ้งเอเจนต์ส่วนใหญ่
      ผมสรุปไว้ด้วยว่าในแต่ละขั้นตอน อะไรจำเป็นและจำเป็นเพราะอะไร: https://nb1t.sh/building-a-real-agent-step-by-step/
  • “RAM footprint: ~8MB on an empty session, ~12MB when working”
    ตรงนี้ดีมาก Claude Code ใช้ทีเป็นหลาย GB บนโน้ตบุ๊กสเปกต่ำแล้วน่าหงุดหงิดพอสมควร

    • ผมกำลังทำเอเจนต์เฟรมเวิร์กด้วย Go ซึ่งเบามาก
      เวลาเริ่มต้นต่ำกว่า 0.5 วินาที และใช้ RAM ต่ำมาก รันบนโน้ตบุ๊กอายุ 12 ปีก็ยังไม่หน่วง
      โดยแก่นแล้วมันแทบจะเป็นเครื่องต่อสตริง ซึ่งไม่ควรมีเหตุผลอะไรเลยที่จะช้าบนอุปกรณ์ไหนก็ตาม รวมถึงฮาร์ดแวร์เก่าด้วย
    • ผมกำลังลองย้ายไป Zed อยู่ แล้ว Agent Client Protocol ก็ดูน่าสนใจมาก อยากรู้ว่าถ้า Claude Code ใช้วิธีนี้แล้วแรงกดดันด้านหน่วยความจำจะลดลงแค่ไหน
      1: https://zed.dev/acp
    • เห็นด้วย แค่ข้อเท็จจริงนี้ข้อเดียวก็น่าจะทำให้คนจำนวนมากอยากลองใช้สักครั้งแล้ว
    • การใช้หน่วยความจำ ดีมาก จนตอนนี้น่าจะรันโค้ดดิ้งเอเจนต์บนอินสแตนซ์เล็กมากอย่าง x1 ของ shellbox.dev ได้แล้ว
    • ต้องเช็กก่อนว่าไม่ได้มีอะไรอย่างพวกปลั๊กอิน LSP รันอยู่ด้วย
  • กลับบ้านแล้วผมจะลองใช้ดู เครื่องมือที่เบาและเร็วทำให้ประสบการณ์การเขียนโค้ดต่างกันมาก
    แต่อยากรู้เหมือนกันว่าแนวทางแบบพรอมป์ต์นี้เทียบกับการผสม สกิลและซับเอเจนต์ แบบทั่วไปแล้วเป็นยังไง ผมมักใช้แบบมี build fail ก็รันสกิล /fix-ci แล้วให้ซับเอเจนต์ดึงข้อความ error, stack trace, log ที่เกี่ยวข้องออกมาแก้ปัญหา
    ถ้าเป็นปัญหา query ของ DB ใน integration test บางทีก็ให้เอเจนต์เรียกสกิลเข้าถึง DB แบบอ่านอย่างเดียวมาตรวจเอง หรือผมช่วยชี้นำหน่อยก็ได้ ถ้าต้องขุดลึกนาน ๆ ผมก็จะพูดประมาณว่า “ใช้ Sonnet sub-agent แล้วสั่งให้ดีบักพฤติกรรมนี้ด้วยสกิล query DB”
    สกิลให้ความสามารถเพิ่มแบบเฉพาะหน้า ส่วนซับเอเจนต์ก็ช่วยแยกบริบทไม่ให้พองเกินไป ถ้าเอเจนต์เรียกตัวเองผ่าน bash พร้อมพรอมป์ต์อื่นก็คงทำอะไรคล้ายกันได้ แต่ดูจะไม่ลื่นเท่า เดี๋ยวคงต้องลองเอง

    • โดยมากมันก็ใช้งานคล้ายสกิล แต่แทนที่จะมองเป็น “คำสั่ง” ให้มองเป็น สภาพแวดล้อม จะใกล้กว่า
      ตัวอย่างเช่น /prompt debug ซึ่งเป็นหนึ่งใน integrated prompts จะเปิดเอเจนต์ที่เน้นดีบัก แล้วคุณก็คุยต่อแบบเอเจนต์ทั่วไปได้ และค่อยกลับไปเป็นเอเจนต์เขียนโค้ดมาตรฐานด้วย /prompt code
      ตอนนี้ยังไม่รองรับซับเอเจนต์เพราะทั้งระบบยังรันอยู่ใน context buffer เดียวกัน เพื่อให้มันเบาไว้ก่อน แต่เพราะงานแบบสำรวจค้นหามักทำให้หน้าต่างบริบทพองเร็ว ก็มีโอกาสสูงว่าจะเพิ่มซับเอเจนต์ในอนาคต
  • ผมก็ให้ Claude Code ทำอะไรแบบนี้ตัวหนึ่งเหมือนกัน และตอนแก้ไขก็ใส่ line hashing ของ Dirac เข้าไปด้วย
    ใช้ Rust และเคยคิดจะทำ hooks เป็นปลั๊กอินเพื่อให้มันแก้ตัวเองได้ แต่สุดท้ายก็ลงเอยด้วยการให้มันสร้างไฟล์แยกไว้เก็บรายละเอียดการปรับปรุง จากนั้นอัปเดตซอร์สโค้ดแล้วคอมไพล์ใหม่
    ตำแหน่งซอร์สโค้ดถูกตรึงไว้ ทำให้เอเจนต์เขียนทับตัวเองแล้ว build ใหม่ได้ ผมใช้งานมันโดยรัน DeepSeek 4 Flash บน 2x RTX 6000 Pro ได้ประมาณ 138 tok/s
    พูดตรง ๆ คือก็ลอก Pi, Dirac, OpenCode มานั่นแหละ มีเทคนิคใหม่อะไรในนี้ที่น่าหยิบไปใช้บ้างไหม?

    • นอกจากความเบาแล้ว ฟีเจอร์ที่น่าสนใจก็คือมี ไลบรารีพรอมป์ต์, การเชื่อมกับ Git worktree และการเชื่อมกับลูป Ralph Wiggum
    • อยากรู้ว่าเปิดโค้ดไว้บน GitHub หรือเปล่า
  • ผมลองใช้แป๊บหนึ่งแล้ว มันเร็วจริงทีเดียว
    อยากรู้ว่ากำลังมองหาผู้ร่วมพัฒนาอยู่ไหม หรือทำเป็นเครื่องมือส่วนตัวอยู่
    แต่ผมไปเจอปัญหาบางอย่างตอนพยายามใช้โมเดลอื่น Azure gpt-5.5 ใช้งานไม่ได้แม้จะใช้ endpoint ที่เข้ากันกับ OpenAI เพราะ max_tokens ถูกเปลี่ยนเป็น max_completion_tokens
    และก็ดูเหมือนไม่มีวิธีส่ง custom headers เลย เลยตั้งค่า reasoning_effort ให้โมเดล DeepSeek ไม่ได้

    • รับ PR อยู่นะ
      ที่คุณบอกมาคือบั๊กชัดเจนในโค้ดเบส ถ้าเป็นไปได้ช่วยเปิด GitHub issue แยกตามแต่ละบั๊กจะดีมาก
  • Claude Code กับ Opencode ใช้งานได้ดีในสภาพแวดล้อมของผม
    มันก็ตลกนิด ๆ ที่โค้ดดิ้งเอเจนต์รันอยู่ในดาต้าเซ็นเตอร์ที่ใช้ไฟเกิน 1000W และหน่วยความจำเกิน 2TB แต่คนกลับไปโฟกัสกับไม่กี่วัตต์สุดท้ายและ RAM ไม่กี่ร้อย MB บนโน้ตบุ๊กของตัวเอง
    ถึงยังไงมันก็คงเล็กน้อยเมื่อเทียบกับพลังงานที่ใช้ตอนคอมไพล์โค้ด แต่ก็ไม่ได้แปลว่าทำให้มันเร็วขึ้นและเบาขึ้นจะเป็นเรื่องไม่ดี

    • ดาต้าเซ็นเตอร์ใช้ไฟจากสายจ่ายไฟเฉพาะ แต่โน้ตบุ๊กของผมใช้ แบตเตอรี่
      ตอนนี้เวลาใช้โค้ดดิ้งเอเจนต์ แบตก็หมดค่อนข้างไว ซึ่งก็แปลกดีเพราะงานส่วนใหญ่ไม่ได้เกิดบนโน้ตบุ๊กผมด้วยซ้ำ
      การทำให้โค้ดดิ้งเอเจนต์ฝั่งไคลเอนต์มีประสิทธิภาพขึ้น ไม่ได้ทำเพื่อกอบกู้โลก แต่เพื่อให้ทำงานได้นานขึ้น จริง ๆ แล้วมันอาจแย่ต่อสภาพอากาศยิ่งกว่าเดิมด้วยซ้ำ
    • ก็แน่อยู่แล้วที่คนจะสนใจซอฟต์แวร์ที่รันบนคอมพิวเตอร์ของตัวเอง
      ซอฟต์แวร์ที่รันบนคอมพิวเตอร์ของคนอื่นไม่ใช่ปัญหาของผม ผมควบคุมไม่ได้ว่าอะไรไปรันอยู่บนเซิร์ฟเวอร์คนอื่น และถึงควบคุมได้ ผมก็ไม่ได้เป็นคนจ่ายค่า RAM พวกนั้นเลยไม่สนใจ
      แต่ RAM บนอุปกรณ์ของผมนี่ผมจ่ายเอง ถ้า TUI ที่แสดงข้อความไม่ถึง 1KB ดันกินหน่วยความจำเป็นหลาย GB จนบน Windows ทำให้แอปอื่นตายเพราะ OOM หรือบน Linux ต้องสว็อปลง HDD จนทั้งเครื่องค้าง ก็เลี่ยงไม่ได้ที่จะต้องสนใจ
      ในสถานการณ์ที่ราคา RAM ขึ้นจริง 5 เท่า และชิ้นส่วนอื่นก็ขึ้น 2–3 เท่าแบบนี้ การหลีกเลี่ยง การเปลืองหน่วยความจำ จึงสำคัญเป็นพิเศษ
    • นี่เป็นการสรุปแบบง่ายเกินไป
      ใช่ โมเดลมีขนาดใหญ่และกินทรัพยากรสูง แต่ ฮาร์เนส ก็ส่งผลมากต่อการใช้โมเดลด้วย
      เช่น ถ้าฮาร์เนสมีชุดเครื่องมือที่ทรงพลัง โมเดลก็อาจทำงานได้มีประสิทธิภาพขึ้นมาก
  • โค้ดเบสเล็กพอที่ผมจะโยนเข้า DeepSeek v4 Flash ใน Pi ให้ช่วยไล่ดูว่ามีจุดเสี่ยงอันตรายไหม แล้วมันก็ไม่เจออะไรน่ากังวลนัก งานดีเลย

    • เห็น OP บอกว่าโค้ดส่วนใหญ่สร้างโดย DeepSeek V4 Flash ผมเลยเช็กดูว่ามี dependency เก่าหรือเปล่า
      สำหรับโปรเจ็กต์ Rust ถ้าไม่สั่งโมเดลชัด ๆ ว่าอย่าแก้ Cargo.toml ตรง ๆ แต่ให้ใช้ cargo add แทน แม้แต่ Claude 4.7 Opus ก็แทบจะใส่ dependency เวอร์ชันเก่าให้เกือบทุกครั้งตามประสบการณ์ผม
      ผมลองเช็ก dependency ของโปรเจ็กต์นี้ด้วยมือแล้ว พบว่าทุกตัวเป็นเวอร์ชันล่าสุด ซึ่งดีมาก แน่นอนว่านั่นไม่ได้แปลว่าไม่มีปัญหาซ่อนอยู่ใน transitive dependencies
      ปัญหาของการให้ LLM รีวิวโค้ดคือเดี๋ยวมันก็กลายเป็นเรื่องรสนิยมได้ง่าย อย่างเช่นตอนผมไล่ดูโค้ดด้วยตา มีเมธอดบางตัวที่แปลงไปมาระหว่างสตริงกับ enum แล้วผมก็คิดว่า “อันนี้ใช้ strum แล้วใส่ #[derive] ตัวเดียวไม่พอเหรอ” เพราะน่าจะทำให้ provider.rs กระชับขึ้นมาก แทนที่จะเพิ่มเพียงแค่ crate ที่ไม่มี dependency
      ผมลองให้ DeepSeek V4 Pro แบบ Max thinking “ตรวจสอบ” โค้ดเบสเล่น ๆ มันบอกว่าไม่พบร่องรอยชัดเจนของ telemetry แบบซ่อนเร้น แต่ก็ชี้ว่าตัวโปรเจ็กต์ตั้ง panic handler เป็น abort ซึ่งผมมีความเห็นแรงกับเรื่องนี้
      น่าจะทำเพื่อเลี่ยงการลิงก์ libunwind เพื่อลดขนาดไบนารีลงไม่กี่ KB แต่ผลคือถ้าล่มก็จะหยุดทันทีและไม่ให้ stack trace กับผู้ใช้ ผมคิดว่ายอมให้ไบนารีใหญ่ขึ้นราว 50KiB เพื่อแลกกับข้อมูลดีบักตอน panic จะดีกว่า
      อีกอย่าง ถ้ามี panic ใน async task ก็จะกู้กลับมาแสดง error message ปกติไม่ได้ เพราะทั้งโปรเซสจะหยุดทันที
    • โค้ดส่วนค่อนข้างใหญ่เขียนโดย DeepSeek v4 Flash และลอจิก TUI บางส่วนผมเขียนเอง
      เพราะ DeepSeek พลาดซ้ำ ๆ กับลอจิกการเลื่อนเคอร์เซอร์บางแบบ เรื่องการปรับหน่วยความจำให้เหมาะสมผมจัดการเองทั้งหมด และอย่างที่เขียนไว้ในคอมเมนต์อื่น ผมผสมทั้งการทำ compiler optimization และการใช้ Rust crates เพื่อใช้โครงสร้างข้อมูลที่มีประสิทธิภาพกว่า
    • วิธีแบบ “โยนเข้า DeepSeek v4 Flash ใน Pi ให้ไล่ดูส่วนอันตราย” นี่ไม่เป็นการตรวจที่ค่อนข้างหละหลวมเพราะ prompt injection เหรอ?
  • ตลกดีที่มันออกมาวันนี้พอดี เพราะผมเองก็กำลังจะเริ่มเขียนตัวหนึ่งด้วย Rust เหมือนกัน
    เวลาเห็น opencode ค่อย ๆ รั่วหน่วยความจำในโปรเจ็กต์ใหญ่จนขึ้นไป 6GB แล้วช้าลงเรื่อย ๆ มันน่าตกใจมาก
    เดี๋ยวจะลองดูนะ ดูเจ๋งดี

    • ใช่เลย โปรเจ็กต์นี้เริ่มจากการที่ผมเปิด Firefox กับ opencode มากกว่า 2 อินสแตนซ์บนโน้ตบุ๊กเก่า แล้ว OOM killer ก็ทำงาน