บทนำ: Agent ที่ทุกคนต้องการ แต่ไม่ต้องมีอะไรเยอะแยะ
สิ่งที่เกี่ยวกับ coding agent คือ ส่วนใหญ่มักจะพยายามเป็นเจ้านาย, ผู้ช่วยนักบิน และนักบำบัดของคุณ แล้วลืมที่จะเขียนโค้ดไปเสียอย่างนั้น แนวทางก็คือ: เพิ่ม vector store เป็นโหล, โรยผงวิเศษ orchestration ลงไป, ติดตั้งเบราว์เซอร์ แล้วก็บอกว่าเสร็จแล้ว มันสาธิตได้ดี แต่มันก็พังทันทีที่คุณขอให้มันแก้ไข integration test ที่มีปัญหาในเวลา 16:52 น. ของวันศุกร์
การสร้าง lightweight coding agent ด้วย Claude 4.5 นั้น – น่าแปลกใจ – ตรงไปตรงมาอย่างมาก หากคุณหยุดไล่ตามความฝันที่จะมีคนรับใช้ซอฟต์แวร์สากล แล้วสร้างเครื่องมือที่อ่านโค้ด, วางแผน, แก้ไข, รัน และทำซ้ำ ไม่มีเทศนาเรื่อง “AI จะมาแทนที่นักพัฒนา” ไม่มีไปป์ไลน์ Rube Goldberg แค่ลูปที่กระชับที่ทำสิ่งชัดเจนได้ดี
นี่คือคู่มือวิธีการเพื่อให้ได้สิ่งนั้นมา โดยไม่ต้องลากฝ่ายปฏิบัติการ AI มาทั้งหมด เราจะใช้ Claude 4.5 เป็นสมอง, ระบบไฟล์และเชลล์เป็นมือ, และหน่วยความจำขนาดเล็กสำหรับโฟกัสระยะสั้น แค่นั้น Lightweight หมายถึงคุณสามารถเข้าใจมันได้ในการนั่งครั้งเดียว, รันมันในเครื่องของคุณเอง และไว้วางใจมันได้เพราะทุกขั้นตอนสามารถตรวจสอบได้ ซึ่งถ้าคุณเคยใช้สิ่งใดก็ตามในแวดวงนี้เมื่อเร็วๆ นี้ มันก็เกือบจะเป็นการบ่อนทำลาย
ทำไม Claude 4.5 ถึงเหมาะสำหรับ Minimal Agent
Claude 4.5 มีอารมณ์ที่คุณต้องการสำหรับการเขียนโค้ดจริงๆ: ระมัดระวังในการปฏิบัติตามคำสั่ง, อ่าน diffs ได้ดีอย่างน่าประหลาดใจ และไม่อยากที่จะสร้างเฟรมเวิร์กที่คุณไม่ได้ร้องขอมากเกินไป โมเดลนี้มีความสามารถในการให้เหตุผลทีละขั้นตอนโดยไม่ต้องเรียกร้อง prompt ที่แปลกใหม่ทั้งหมด การผสมผสานนั้น – การให้เหตุผลบวกกับการยับยั้งชั่งใจ – ทำให้มันเหมาะสำหรับ coding agent loop:
- Observe: อ่านไฟล์ปัจจุบัน, บันทึกข้อผิดพลาด และการทดสอบ
- Plan: เสนอการแก้ไขที่เป็นรูปธรรมพร้อมเหตุผล
- Act: Patch ไฟล์, รันคำสั่ง
- Reflect: ประเมินผลลัพธ์, ทำซ้ำหรือหยุด
คุณสามารถนำสิ่งนี้ไปใช้กับ repo ใดก็ได้และได้รับคุณค่าในบ่ายวันหนึ่ง เคล็ดลับคือการต้านทานความอยากที่จะเปลี่ยนมันให้กลายเป็น “แพลตฟอร์ม AI” หากคุณทำให้ agent มีน้ำหนักเบา Claude 4.5 จะทำงานหนักโดยไม่ขวางทางคุณ
สถาปัตยกรรม Lightweight: ห้าส่วน ไม่มีดราม่า
นี่คือสแต็กทั้งหมดที่คุณต้องการ:
- Core loop: หนึ่งกระบวนการที่เรียก Claude 4.5 และตีความข้อความ tool-use
- Tools: ชุดเล็กๆ – read_file, write_file, list_dir, run_tests (หรือ run_cmd), search_code
- Context builder: ประกอบ prompt สั้นๆ ที่ตรงประเด็นพร้อม metadata ของ repo และ diffs ล่าสุด
- Short-term memory: หน้าต่างการสนทนาแบบ rolling บวกกับ scratchpad ที่ชัดเจนสำหรับแผนและความต้องการ
- Guardrails: ขีดจำกัด token, เวลา และการเขียนไฟล์; โหมด dry-run; และ rollback snapshots
แค่นั้น คุณสามารถรันมันแบบ headless ใน terminal หรือห่อหุ้มมันไว้ใน UI ขนาดเล็กหากคุณต้องการ เหตุผลที่สิ่งนี้ได้ผลนั้นน่าเบื่อ: ทุกการกระทำจะถูกสังเกตและตรวจสอบได้ agent เสนอการเปลี่ยนแปลง, แสดง diff, รันการทดสอบ, อ่านผลลัพธ์ และดำเนินการต่อหรือหยุด ไม่มี mystery meat ตรงกลาง
วิธีการสร้าง Agent (โดยไม่หลงประเด็น)
ขั้นตอนที่ 1: กำหนดสัญญา – Prompt และ Tools
agent ของคุณจะดีได้เท่ากับสัญญากับโมเดล ทำให้ system prompt สั้น, เข้มงวด และเป็นประโยชน์อย่างไม่ลดละ
System prompt, สรุป:
- คุณคือ coding agent งานของคุณคือการทำการเปลี่ยนแปลงเล็กๆ น้อยๆ ที่ถูกต้องให้กับ repo เพื่อตอบสนองงานของผู้ใช้
- คิดออกมาดังๆ ใน scratchpad ที่ซ่อนไว้ แสดงเฉพาะแผนและ diffs ให้ผู้ใช้เห็นเท่านั้น
- ชอบ diffs ที่น้อยที่สุด, การทดสอบที่ใช้งานได้ และความคืบหน้าทีละน้อย
- เมื่อไม่แน่ใจ ให้เสนอการทดลองและรันมัน
- ห้ามสร้างไฟล์หรือคำสั่งขึ้นมาเอง – list และ read ก่อนที่จะแก้ไข
Tool schema (อย่าคิดมาก):
- read_file(path, offset?, length?)
- write_file(path, content, create_if_missing=false)
- run_cmd(command, timeout=60, cwd=repo_root)
- search_code(query, path=repo_root, max_results=50)
Optional niceties: git_diff และ git_revert(sha) หากคุณต้องการ rollbacks แบบ hands-free คุณสามารถข้าม vector store ไปได้ งานที่มีประโยชน์ส่วนใหญ่ขึ้นอยู่กับไฟล์จำนวนหนึ่งใน working memory บวกกับการค้นหาอย่างรวดเร็ว
ขั้นตอนที่ 2: ทำให้ Context กระชับ
Context stuffing คือ cargo cult ของการออกแบบ agent อย่าทิ้ง monorepo ทั้งหมดของคุณลงใน prompt แทน:
- Repo summary: สรุป README หนึ่งย่อหน้า; entry points; คำสั่ง test runner
- Active files: เฉพาะไฟล์ที่ agent วางแผนที่จะแตะต้อง – read พวกมันเป็น chunks ตามต้องการ
- Task: เป้าหมายของผู้ใช้ ที่ระบุไว้อย่างชัดเจน: “แก้ไข test ที่ failing FooTest.test_bar ใน tests/foo_test.py”
- Constraints: ขีดจำกัด runtime, whitelist การเขียนไฟล์, กฎสไตล์ และความคาดหวัง semantic versioning หากมี
- Recent history: สอง diffs สุดท้ายและผลการทดสอบ ไม่มีอะไรอื่น
Claude 4.5 มีความสามารถอย่างสมบูรณ์ในการดึง context เพิ่มเติมเมื่อต้องการผ่านทาง search_code และ read_file ให้แผนที่ ไม่ใช่ดินแดน
ขั้นตอนที่ 3: The Loop (Observe → Plan → Act → Reflect)
- Observe: เริ่มต้นด้วยการ list directories, read test ที่ failing, โค้ดที่อยู่ภายใต้การทดสอบ และ error log ขอให้ Claude สรุปอาการ failure ในสองหรือสาม bullets
- Plan: ให้ Claude เสนอแผนด้วย:
- Hypothesis สำหรับ failure
- ไฟล์ที่จะ inspect หรือแก้ไข
- Act: ใช้ diff ที่เสนอผ่านทาง write_file แสดง diff แบบ verbatim รันการทดสอบ
- Reflect: ป้อน stdout/stderr กลับเข้าไป ถาม Claude: ดำเนินการต่อ, roll back หรือหยุด? หากแผนมีการเปลี่ยนแปลง ให้กำหนดให้มีคำอธิบายหนึ่งประโยคโดยอ้างอิงถึง output จริง
- Exit: หยุดเมื่อ tests ผ่าน หรือหลังจาก N iterations แล้วแต่ว่าอะไรจะมาก่อน
นี่คือ glorified pair programming ที่คุณทำให้การ pairing นั้นซื่อสัตย์จริงๆ
ขั้นตอนที่ 4: Guardrails ที่ช่วยประหยัดสุดสัปดาห์ของคุณ
- Write whitelist: อนุญาตให้เขียนภายใน src/, lib/ หรือ paths ที่ได้รับอนุมัติอย่างชัดเจนเท่านั้น
- Diff size limit: จำกัดการแก้ไขไว้ที่ 200–500 บรรทัดต่อขั้นตอน หากใหญ่กว่า ให้แบ่งเป็น substeps
- Command allowlist: test runners, linters และ dev scripts สองสามตัว ห้าม network คุณต้องการ reproducibility ไม่ใช่ wild-west curl
- Timeout และ retries: timeouts สั้นๆ, retry สูงสุดหนึ่งครั้ง – endless re-run loops คือที่ที่ agents ไปตาย
- Dry run mode: พิมพ์ diffs ที่เสนอ แต่ไม่เขียน เหมาะสำหรับการ code review
Claude 4.5 จะยึดมั่นในกฎหากคุณทำให้มันชัดเจน หากคุณไม่ทำ อย่าแปลกใจเมื่อมันพยายาม “ช่วย” โดยการจัดระเบียบ repo ทั้งหมดของคุณใหม่เพื่อให้สอดคล้องกับ blog post จากปี 2017
ขั้นตอนที่ 5: Memory ที่มีประโยชน์จริงๆ
Short-term memory แก้ปัญหาได้ 80% เก็บ:
- Scratchpad สำหรับ hypothesis และแผนปัจจุบัน
- รายการไฟล์ที่ถูกแตะต้องใน session นี้
- สอง command outputs สุดท้าย
แค่นั้นก็เพียงพอสำหรับ Claude 4.5 ที่จะให้เหตุผลได้อย่างสอดคล้องกัน Long-term memory – task logs, embeddings – อาจเป็นประโยชน์สำหรับ codebases ที่เกิดขึ้นประจำ แต่ถือว่ามันเป็นน้ำตาลเสริม หาก agent ของคุณไม่สามารถแก้ไข test ได้หากไม่มี vector index ขนาด 500MB มันไม่ใช่ agent แต่มันเป็น dependency
The Minimal Implementation Sketch
ในแง่ของ pseudocode คุณสามารถ implement agent นี้ได้ในไม่กี่ร้อยบรรทัด:
- initialize: โหลด repo metadata, constraints และ model client
- observe: read failing tests, files, logs
- plan = model.propose_plan(context)
- while not done and steps < MAX:
- diff = model.propose_patch(plan)
- show(diff); maybe approve
- out = run_cmd(plan.test_cmd)
- reflect = model.evaluate(out)
- if reflect == pass: done = true
- else if reflect == rollback: git_revert(last_commit)
- else: plan = model.revise_plan(out)
คุณจะสังเกตเห็นส่วนที่หายไป: ไม่มี agents ที่จัดการ agents, ไม่มี “delegates,” ไม่มี “planner model” และ “executor model” แยกกัน Claude 4.5 สามารถทำงานทั้งสองอย่างได้ดีหากคุณไม่ sabotaging มันด้วยอุปกรณ์ Rube Goldberg
Prompting ที่ไม่ต้องพยายามมากเกินไป
Bad prompts พยายามที่จะฉลาด Good prompts นั้นน่าเบื่อและเฉพาะเจาะจง นี่คือ skeleton ที่สมเหตุสมผลสำหรับ instruction block หลักของคุณ:
- Goal: ระบุ coding task ที่แน่นอนและเกณฑ์ความสำเร็จ
- Context: โครงสร้างโปรเจ็กต์, entry points และคำสั่ง test
- Constraints: Write whitelist, diff size limit, no network
- Style preferences: เวอร์ชันภาษา, formatter, กฎ linter
- Process: Observe → Plan → Act → Reflect; แสดง diffs; รัน tests; ทำซ้ำสูงสุด N ขั้นตอน; หยุดเมื่อ tests ผ่าน
Claude 4.5 ด้วยโครงสร้างนี้ จะไม่ต้องการ role-play scenario ขนาด 100 บรรทัด มันแค่ใช้งานได้
Practical Example: แก้ไข Test ที่ Failing
สมมติว่า test failing ใน tests/time_test.py เพราะ parse_time("09:00") คืนค่า 5400 แทนที่จะเป็น 32400 loop ของ agent ควรมีลักษณะดังนี้:
- Observe: Read time.py และ time_test.py; รัน pytest -k parse_time
- Plan: Hypothesis—bug ทางคณิตศาสตร์ seconds vs minutes; เสนอการแก้ไข parse_time; เพิ่ม unit edge case
- Act: Patch parse_time, เพิ่ม test สำหรับ hours ที่มีเลขศูนย์นำหน้า; รัน tests
- Reflect: หาก tests ยังคง fail, read error, ปรับคณิตศาสตร์หรือ regex, re-run
Patch ที่ประสบความสำเร็จน้อยที่สุดอาจเป็นการเปลี่ยนแปลงสองบรรทัด นั่นคือประเด็น การแก้ไขขนาดเล็ก, cycles ที่รวดเร็ว, ความคืบหน้าที่แท้จริง
ที่ที่ Lightweight เอาชนะ Kitchen Sink
- Latency: หนึ่ง model, หนึ่ง loop, ไม่มี orchestration overhead
- Transparency: ทุกขั้นตอนสามารถตรวจสอบได้ คุณสามารถ diff มัน, คุณสามารถ revert มัน, คุณสามารถ rerun มัน
- Control: Guardrails ทำให้ความเสียหายอยู่ในวงจำกัด agent ไม่สามารถ wander ออกไปใน infrastructure ของคุณได้
- Cost: จำนวน calls น้อยลง, context น้อยลง, tokens ที่คาดการณ์ได้
- UX: คุณเข้าใจมัน เพื่อนร่วมทีมของคุณเข้าใจมัน อนาคตของคุณจะไม่เกลียดคุณ
และ trade-offs:
- Breadth: lightweight coding agent จะไม่ refactor monorepo ห้าภาษาของคุณใน single pass ไม่ควรด้วยซ้ำ
- Initiative: มันจะไม่คิดค้น roadmaps หลายสัปดาห์ คุณให้ tasks แก่มัน
- Statefulness: หากไม่มี big memory layer มันจะลืม distant history โดยการออกแบบ นั่นคือ feature จนกว่ามันจะเป็น bug
Claude 4.5’s Sweet Spot สำหรับ Coding Agents
Claude 4.5 โดดเด่นในด้าน:
- การอ่านและให้เหตุผลเกี่ยวกับ diffs และ logs
- การสร้าง code changes ที่สอดคล้องกันและน้อยที่สุด
- การปฏิบัติตาม constraints และมีความชัดเจนเกี่ยวกับความไม่แน่นอน
มันเก่งน้อยกว่าในด้าน:
- การเดาพฤติกรรม API ที่มันอ่านไม่ได้
- Heavy tool choreography (ไม่จำเป็นที่นี่)
- Long multi-file refactors หากไม่มีมนุษย์ชี้นำขั้นตอนต่างๆ
ประเด็นสุดท้ายนั้นสำคัญ วิธีที่ดีที่สุดเพื่อให้ได้ผลลัพธ์ที่แข็งแกร่งไม่ใช่การทำให้ agent ใหญ่ขึ้น แต่เป็นการทำให้ task เล็กลง ใช้สมองของคุณสำหรับการ scoping และ Claude 4.5 สำหรับ execution ภายใน scope นั้น
A Word on IDE Integration
ต้านทานความอยากที่จะ bake สิ่งนี้ลงใน IDE pane โดยตรงด้วย toggles ห้าสิบตัว Terminal-based loop พร้อม plain text diffs นั้นง่ายกว่าที่จะไว้วางใจและ debug หากคุณต้องการ editor sugar ให้ทำให้มันโง่ๆ:
- คำสั่งเพื่อเริ่ม/หยุด loop
- Approval prompt สำหรับ writes (optional แต่ฉลาด)
คุณสามารถ integrate ได้ในภายหลัง อย่างแรก ทำให้มันใช้งานได้
หากคุณต้องการสภาพแวดล้อมที่เป็นประโยชน์ในการรัน loop แบบนี้โดยไม่ต้องคิดค้น scaffolding ใหม่ Sider.AI ใช้งานได้จริง – อย่างน้อยเมื่อคุณใช้มันสำหรับสิ่งที่มันเก่ง มันทำให้การสนทนาและ diffs เป็นระเบียบ ช่วยให้คุณรันคำสั่ง และไม่บังคับให้คุณใช้ “autonomous agent framework” ที่ยิ่งใหญ่บางอย่าง เคล็ดลับคือการรักษากฎของคุณเอง: short prompts, tight loops, visible diffs Sider หลีกทางให้ ซึ่งหายากกว่าที่ควรจะเป็น Common Pitfalls (และวิธีการหลีกเลี่ยงการดูโง่ๆ)
- Overstuffed context: หาก prompt ของคุณอ่านเหมือนจดหมายเรียกค่าไถ่ คุณกำลังทำผิดพลาด ดึงไฟล์ตามต้องการ
- Premature refactoring: agent เสนอการจัดระเบียบโมดูลใหม่? ทำให้มันผ่าน tests ก่อน Refactor ทีหลัง
- Hallucinated files: กำหนดให้ list_dir และ read_file ก่อน write_file ใดๆ ไปยัง path ใหม่
- Infinite re-run loops: Cap steps กำหนดให้มีเหตุผลสำหรับทุก hypothesis ใหม่
- One giant diff: Split changes Smaller diffs fail เร็วขึ้นและง่ายต่อการให้เหตุผล
Security และ Safety โดยไม่ต้องหวาดระแวง
- Local execution: รันใน sandboxed directory ไม่มีการเชื่อมต่อ network โดยค่าเริ่มต้น
- Dependency isolation: ใช้ local venv หรือ container ปักหมุดเวอร์ชัน
- Secrets: agent ไม่ต้องการพวกมัน หากคำสั่งต้องการ token ให้หยุดและถาม
- Auditing: Persist ทุกแผน diff และคำสั่งใน log
วิธีการรู้ว่ามันใช้งานได้
- Lead time หดตัว: Bugfixes ที่ใช้เวลาหนึ่งชั่วโมง ตอนนี้ใช้เวลาสิบนาที
- Fat-finger mistakes น้อยลง: Diffs เล็กลง, tests เป็นสีเขียวมากขึ้น
- คุณไว้วางใจมัน: คุณหยุด hover เหนือทุกการกระทำเพราะมันไม่เคยทำให้คุณผิดหวัง
- เพื่อนร่วมทีมใช้มัน: นิยามของความสำเร็จคือคนอื่น adopt มันโดยไม่ต้องมีการประชุม
Scaling Up อย่างระมัดระวัง
หากคุณต้อง scale จริงๆ ให้ทำด้วยวินัย:
- Parallel subtasks ไม่ใช่ parallel brains: แบ่งงาน รัน lightweight loops หลายตัวใน directories แยกกัน และ merge เมื่อเป็นสีเขียว
- Episodic memory ไม่ใช่ brain dump: จัดเก็บ patches ที่ประสบความสำเร็จและการแมประหว่างอาการและ fixes ดึงข้อมูลมาใช้อย่างแม่นยำ
- Periodic “bigger” passes: สำรอง session ที่มีมนุษย์ชี้นำไว้สำหรับ refactors agent ช่วย ไม่ได้นำ
A Minimal Reference Implementation (Sketch)
Python-ish pseudocode เพื่อให้เริ่มเคลื่อนไหว:
- def init(self, repo_root, model):
- self.history = [] # last two diffs and test outputs
- "repo": summarize_repo(self.root),
- "constraints": {"write_whitelist": ["src/", "tests/"], "max_diff_lines": 300, "no_network": True},
- "history": self.history[-2:],
- plan = self.model("propose_plan", self.context(task))
- diff = self.model("propose_patch", {"plan": plan})
- out = run_cmd(plan.test_cmd)
- eval = self.model("evaluate", {"output": out, "plan": plan})
- self.history.append({"diff": diff, "out": tail(out)})
A Human-Sized Ending
อุตสาหกรรมยังคงสัญญา autonomous developer agents สิ่งที่เราต้องการจริงๆ คือผู้ช่วยที่ซื่อสัตย์ที่อ่าน, วางแผน, แก้ไข, รัน และหยุด Claude 4.5 ทำสิ่งนั้นได้ดี ตราบใดที่คุณไม่ฝังมันไว้ใต้ frameworks ที่ส่วนใหญ่มีอยู่เพื่อพิสูจน์ตัวเอง Lightweight ไม่ใช่การประนีประนอม แต่มันคือประเด็น สร้าง loop, เพิ่ม guardrails และปล่อยให้ tool ทำสิ่งหนึ่งที่ tools ทำมาตลอดเมื่อคุณทำให้มันเรียบง่าย: ทำให้งานเล็กลง
Conclusion: The Boring Shortcut That Wins
นี่คือ checklist ของคุณสำหรับ lightweight coding agent ด้วย Claude 4.5:
- One loop, one model, small tools
- Tight context: task, สองสามไฟล์, last outputs
- Minimal diffs, frequent tests, hard caps
- Local, sandboxed execution; no network
- Optional editor sugar; never required
ถ้าคุณ squint มันดูน่าสงสัยเหมือน good software engineering แค่เร็วกว่า และนั่นคือ punchline สิ่งที่ฉลาดที่สุดที่คุณทำได้ที่นี่ไม่ใช่การไล่ตาม “autonomy” แต่มันคือการ codify วินัย ยิ่งคุณขอน้อยลงจาก agent คุณก็ยิ่งได้มากขึ้น
FAQ
Q1: ฉันจะเริ่มต้นสร้าง lightweight coding agent ด้วย Claude 4.5 ได้อย่างไร?
กำหนด toolset เล็กๆ (read, write, search, run), เขียน system prompt ที่เข้มงวด และ implement loop แบบ Observe → Plan → Act → Reflect ทำให้ context มีขนาดเล็ก และป้อน real logs และ diffs – Claude 4.5 ทำงานได้ดีที่สุดเมื่อ task นั้นแคบและ feedback เป็นรูปธรรม
Q2: ฉันต้องการ vector database หรือ memory layer สำหรับ Claude 4.5 coding agent หรือไม่?
ไม่ สำหรับ tasks ส่วนใหญ่ short-term memory บวกกับ search_code ก็เพียงพอแล้ว เพิ่ม long-term memory ก็ต่อเมื่อคุณกลับมาเยี่ยม repo เดิมซ้ำๆ และสามารถพิสูจน์ได้ว่ามันช่วยประหยัด tokens โดยไม่ทำให้ agent โง่ลง
Q3: guardrails อะไรบ้างที่จำเป็นสำหรับ Claude 4.5 coding agent?
Whitelist writable paths, cap diff sizes, จำกัดคำสั่ง และ log ทุกการกระทำ ข้อจำกัดง่ายๆ เหล่านี้ทำให้ agent คาดการณ์ได้ และทำให้ rollbacks น่าเบื่อ – ในทางที่ดี
Q4: lightweight agent สามารถจัดการ multi-file refactors ได้หรือไม่?
ได้ หากคุณแบ่งงานออกเป็นขั้นตอนเล็กๆ และทำให้ loop กระชับ Claude 4.5 สามารถจัดการ refactors ได้ แต่คุณชี้นำ scope มิฉะนั้นคุณจะได้ diff ที่ใหญ่และเปราะที่คุณไม่อยาก review
Q5: Sider.AI เหมาะสมกับ Claude 4.5 coding agent ตรงไหน?
Sider.AI มีประโยชน์ในฐานะ workspace ที่เป็นระเบียบ: conversations, diffs และคำสั่งในที่เดียว โดยไม่ต้องบังคับให้ใช้ heavyweight agent framework ใช้งานมันเพื่อรัน loop ของคุณ ไม่ใช่เพื่อคิดค้นมันใหม่