ข้ามไปยังเนื้อหา
Genkit v2 ออก generateMiddleware() API — 3 hook (model/tool/generate) สำหรับ intercept agent loop คล้าย Express, ทีม Genkit ปล่อย soft-fail, smartMaxTurns และ contextCompression
เครื่องมือนักพัฒนา

Genkit v2 ออก generateMiddleware() API — 3 hook (model/tool/generate) สำหรับ intercept agent loop คล้าย Express, ทีม Genkit ปล่อย soft-fail, smartMaxTurns และ contextCompression

อ่าน 5 นาที ที่มา: DEV Community

ช่วงต้นเดือน พ.ค. 2026 ทีม Genkit ของ Google ปล่อย generateMiddleware() API ใน genkit/beta channel — เป็น primitive ที่เปลี่ยน Genkit จาก “framework ที่เรียก LLM” มาเป็น pipeline ที่ compose ได้ทุกระดับ เหมือนกับ Express middleware ในยุค web development

วันที่ 5 พ.ค. Pavel Janicki ที่เป็น tech lead ของ Genkit เผยแพร่ deep dive บน DEV Community อธิบาย API นี้และเปิด open-source package genkitx-misc ที่ contain middleware 3 ตัวสำหรับแก้ pain point จริงของ agent — บทความถูกอัปเดตล่าสุด 15 พ.ค. 2026 ทำให้เป็นเอกสาร reference ที่สด

generateMiddleware() — 3 hook 3 ระดับ

API เปิด hook 3 ตัวที่ครอบทั้ง agentic loop:

model hook — fire ทุกครั้งที่เรียก model API; เห็น raw request และ response
ใช้สำหรับ catch error, track token usage, modify model config แบบ on-the-fly

generate hook — fire สำหรับแต่ละ turn ของ agentic loop
ได้ทั้ง full conversation, current turn number — modify messages, tools หรือ short-circuit loop ได้

tool hook — fire ทุกครั้งที่ execute tool
catch tool error, modify input/output, หรือ skip tool ได้

import { generateMiddleware } from 'genkit/beta';

const myMiddleware = generateMiddleware(
  { name: 'myMiddleware', configSchema: z.object({}) },
  ({ config, pluginConfig, ai }) => ({
    model: async (req, ctx, next) => next(req, ctx),
    generate: async (envelope, ctx, next) => next(envelope, ctx),
    tool: async (req, ctx, next) => next(req, ctx),
  })
);

จุดสำคัญที่ Pavel highlight: generate hook ทำงานแบบ recursive — แต่ละ turn ของ multi-turn loop จะรัน generate hook ของ turn นั้น ข้างใน next() call ของ turn ก่อน — ทำให้ middleware รู้ตำแหน่งใน loop และตัดสินใจได้ว่าจะ continue, short-circuit หรือ replace messages

3 Middleware ตัวอย่างที่แก้ pain point จริง

softFail — กัน crash ทุกชั้น

ปัญหาคลาสสิก: agent ทำงานมา 15 turn, สะสม context มหาศาล, แล้ว model API คืน 503 → ai.generate() throw → ทุกอย่างหาย

softFail ใช้ทั้ง 3 hook ดักจับ 3 failure mode:

  • model hook wrap call ใน try/catch — model throw → return synthetic response กับ finishReason: 'aborted' พร้อมเก็บ error detail ใน response.custom.softFail
  • tool hook ถ้า tool throw → return error message กลับเข้า conversation ในรูป tool response ("Tool 'search' failed: timeout") ให้ model เห็นและ recover เอง
  • generate hook ดัก GenerationResponseError ที่ throw เมื่อเกิน maxTurns — extract response ตัวสุดท้ายของ model แทนที่จะ throw

ข้อสำคัญ: aborted response ยังเป็น GenerateResponse ที่ valid — response.messages มี conversation history ครบ → feed กลับเข้า ai.generate() ใหม่ก็ continue ได้ทันทีโดยไม่เสียงาน 15 turn ที่ทำมา

smartMaxTurns — detect loop ไม่ใช่นับ turn

maxTurns: 10 เป็น blunt instrument — ตั้งต่ำเกินไป agent ทำงานยากไม่จบ, ตั้งสูงไป agent วน loop เผา $12 ในการเรียก search tool 47 ครั้งกับ argument เดิม

smartMaxTurns แทนที่ counter ด้วย 3 detector:

  1. Exact loop detection — hash tool call หลาย turn ติดกัน, ถ้าซ้ำ N ครั้ง = looping
  2. Response repetition — tool คืน output เดียวกัน N ครั้ง = ไม่ progress
  3. LLM judge (opt-in) — ส่ง conversation ให้ model อีกตัวถามว่า “PROGRESSING หรือ STUCK”

แล้วมี 3 strategy เมื่อ detect ว่าวน:

  • abort — return aborted response ทันที (default)
  • wrapUp — ลบ tool ทั้งหมดออก inject message “ให้คำตอบสุดท้ายเลย” → model ได้ tool-less turn สุดท้ายเพื่อสรุป
  • pruneTools — ลบเฉพาะ tool ที่เกี่ยวข้องกับ loop, ปล่อย tool อื่นให้ใช้ต่อ

contextCompression — ลด token usage แบบ adaptive

ปัญหา: agent ที่รันนาน 20 turn อาจสะสม 150K tokens เพราะ tool output verbose จากต้น turn — ส่วนใหญ่ไม่จำเป็นแล้วแต่ยังจ่ายอยู่ทุก turn

contextCompression monitor inputTokens ที่ model report และ trigger compression เมื่อเกิน threshold ผ่าน 3 strategy:

  1. Tool response truncation — ตัด tool output เหลือ N character (preserve response ล่าสุด)
  2. Message truncation — drop message เก่าสุดเกินจำนวน hard cap
  3. LLM summarization — แทนที่ message เก่าด้วย condensed summary ที่ model ราคาถูก (เช่น Gemini Flash Lite) generate ให้ และ cache summary ข้าม turn

ใช้รวมกันได้: tool response ถูกตัดก่อน → message ถูก cap → summary ทำท้ายสุด

use: [
  softFail(),                                  // กัน crash
  smartMaxTurns({ onDetection: 'wrapUp' }),    // detect loop
  contextCompression({                         // จำกัด token
    maxInputTokens: 80000,
    toolResponses: { maxChars: 2000 },
    summarize: { model: { name: 'googleai/gemini-flash-lite-latest' } },
  }),
]

First-party middleware ที่ Google ปล่อยใน @genkit-ai/middleware

นอกจาก genkitx-misc ของ Pavel ทาง Google ก็ ship official middleware ใน @genkit-ai/middleware:

  • retry — exponential backoff สำหรับ transient error (RESOURCE_EXHAUSTED, UNAVAILABLE)
  • fallback — switch ไป backup model เมื่อ primary fail
  • toolApproval — restrict tool execution ตาม approved list (human-in-the-loop)
  • filesystem — sandbox filesystem access ให้ model
  • skills — auto-inject SKILL.md ใน system prompt + tool use_skill สำหรับ retrieval

มุมมอง AI Curator

generateMiddleware() API คือสิ่งที่ agentic framework ส่วนใหญ่ขาด — ชั้น primitive ที่อยู่ระหว่าง LLM call กับ business logic ที่ทำให้ resilience pattern (retry, fallback, loop detection, context management) ไม่ต้องเขียนซ้ำในทุก project

มอง compare กับคู่แข่งใน ecosystem:

  • LangGraph มี checkpointer + interrupt แต่ middleware composition ยังคง verbose
  • CrewAI / AutoGen จัด tool call + agent message ผ่าน built-in pattern แต่ไม่เปิด hook ที่ user-extensible ระดับนี้
  • Vercel AI SDK มี middleware ของตัวเอง (สำหรับ generateText) — Xavier Portilla เขียนเปรียบเทียบ ชี้ว่า Genkit middleware ครอบคลุม “loop” และ “tool” layer ในขณะที่ Vercel AI SDK เน้น model layer เป็นหลัก

สำหรับนักพัฒนาในไทยที่ต้องการสร้าง agent บน production จริง — โดยเฉพาะ chatbot ลูกค้า, customer service automation, หรือ workflow automation ใน enterprise — softFail + smartMaxTurns + contextCompression คือ 3 layer ที่ ลด cost และเพิ่ม reliability ได้ทันทีโดยไม่ต้องแก้ tool หรือ prompt เพราะทั้งหมดทำงานในชั้น middleware

ในระยะยาว pattern นี้น่าจะถูก standardize เป็น community spec ผ่าน LF AI หรือ similar consortium — เพราะปัญหาที่ middleware แก้ (loop, crash, context bloat) เป็นปัญหาที่ทุก agentic framework เจอ ไม่ใช่แค่ Genkit อย่างเดียว Pavel Janicki ปูทางไว้ดีด้วยการเปิด genkitx-misc เป็น MIT — เป็น case study ที่น่าจะ inspire framework อื่น ๆ ให้เปิด extension point ในระดับเดียวกัน

แหล่งข่าว

บทความนี้เรียบเรียงจากแหล่งข่าวต้นทาง — DEV Community

เนื้อหาบน blog นี้สร้างโดย AI โดยมีการกำกับบรรณาธิการจากมนุษย์

อ่านเพิ่มในหมวด เครื่องมือนักพัฒนา

Betelgeuse รัน Qwen3.8 Flash Next ขนาด 68GB บน RTX 3060 กับแรม 16GB ส่วน Basalt วัดให้เห็นว่าเอนจินที่เร่งด้วยแฟล็กลัดทำให้โมเดลลืมของ
เครื่องมือนักพัฒนา

Betelgeuse รัน Qwen3.8 Flash Next ขนาด 68GB บน RTX 3060 กับแรม 16GB ส่วน Basalt วัดให้เห็นว่าเอนจินที่เร่งด้วยแฟล็กลัดทำให้โมเดลลืมของ

Betelgeuse ฟอร์ก llama.cpp ที่เปิดเมื่อ 31 ต.ค. ดึง expert จาก NVMe เข้า VRAM ตามต้องการ อ้าง 22 tok/s แบบไม่ทิ้ง expert แต่ README เตือนเองว่ายังทดลองและตัวเลขมาจากคนละรอบ วันเดียวกันผู้พัฒนา Basalt เผยผลวัดว่าแฟล็กเร่งความเร็วทำคุณภาพ Q8 ตกไปใกล้ Q2

· อ่าน 5 นาที
กฎห้ามโคลนเกมของ Claude Code เริ่มกระทบงานจริง บริษัทรับทำเกมกระดานร้องงานลูกค้าหยุด แต่รายงานหลายชิ้นปนกับตัวกรองไซเบอร์คนละเรื่อง
เครื่องมือนักพัฒนา

กฎห้ามโคลนเกมของ Claude Code เริ่มกระทบงานจริง บริษัทรับทำเกมกระดานร้องงานลูกค้าหยุด แต่รายงานหลายชิ้นปนกับตัวกรองไซเบอร์คนละเรื่อง

ต่อจากที่เราพบกฎนี้ในไบนารี Claude Code ผู้ใช้เริ่มรายงานว่างานเชิงพาณิชย์ถูกปฏิเสธ และ Tom's Hardware กับ Mashable หยิบไปรายงาน แต่เมื่อไล่ issue ที่อ้างถึง พบว่าหลายรายการเกิดก่อนกฎจะมา จึงน่าจะเป็นตัวกรองด้านไซเบอร์ ส่วน Anthropic ยังไม่ชี้แจง

· อ่าน 4 นาที
Claude Code ส่ง transcript ของ background agent ให้โมเดลทุก ~30 วินาทีเพื่อเขียนสถานะ 3–5 คำ ผู้วัดรายงานกินราว 16% และยังปิดแบบทางการไม่ได้
เครื่องมือนักพัฒนา

Claude Code ส่ง transcript ของ background agent ให้โมเดลทุก ~30 วินาทีเพื่อเขียนสถานะ 3–5 คำ ผู้วัดรายงานกินราว 16% และยังปิดแบบทางการไม่ได้

รายงานอิสระพบว่าฟีเจอร์ agent_summary ของ Claude Code ส่ง transcript เต็มของ background agent ไปถามสถานะทุก ~30 วินาที คิดเป็น 16.4% ของค่าใช้จ่ายในระบบของผู้วัด Issue เปิดมาตั้งแต่ ส.ค. ยังไม่มีสวิตช์ปิดที่รองรับ เราตรวจพบโค้ดนี้ใน 2.1.314 และพบกฎใหม่เรื่องเกมที่ไม่อยู่ใน changelog

· อ่าน 4 นาที