บิลที่จุดชนวนเรื่องนี้คือ 312 ดอลลาร์ในบ่ายวันเดียว นักพัฒนาคนเดียว เซสชัน Octomind หนึ่งเซสชัน โมเดลตัวเดียวทำทุกงาน: อ่านไฟล์ รัน grep สรุป diff ตัดสินใจว่าจะบีบอัดคอนเท็กซ์เมื่อไร และทำการให้เหตุผลที่ยากจริง ๆ ทั้งหมดนั้นบนโมเดลระดับแนวหน้า เพราะนั่นคือสิ่งที่คุณเอื้อมไปหยิบเมื่ออยากให้เอเจนต์เก่ง

แล้ว OpenRouter ก็เริ่มคืนค่า 429 กลางการรีแฟกเตอร์ และผมก็เฝ้าดูเอเจนต์ค้างอยู่กับลิมิตอัตราคำขอขณะทำสิ่งที่โมเดลราคาถูกกว่าสิบเท่าก็ทำได้สมบูรณ์แบบ นั่นคือจังหวะที่สิ่งที่เห็นได้ชัดเข้าที่: สิ่งที่เอเจนต์ทำส่วนใหญ่ไม่ได้ยาก การไล่รายชื่อไฟล์ไม่ยาก การปรับงานที่คลุมเครือให้ชัดขึ้นไม่ยาก การตัดสินใจว่าเซสชันใหญ่พอจะบีบอัดหรือยังไม่ยาก การอ่านกองข้อมูลจากการค้นคว้าแล้วดึงสามไฟล์ที่เกี่ยวข้องออกมาไม่ยาก

คุณไม่ต้องใช้โมเดลที่ดีที่สุดของคุณกับสิ่งใดในนั้นเลย คุณต้องใช้มันสำหรับสักสิบเปอร์เซ็นต์ของการเรียก — การรีวิว การตัดสินใจออกแบบที่ยุ่งยาก diff ที่แตะ authentication อีกเก้าสิบเปอร์เซ็นต์เป็นงานหนักซ้ำซาก และงานหนักซ้ำซากคือที่ที่โมเดลราคาถูกและโมเดลโลคัลเปล่งประกายพอดี

นี่คือเรื่องราวของการกระจายเอเจนต์ Octomind ตัวเดียวไปยังหลายโมเดล โดยยึดกับคีย์คอนฟิกจริงที่มันมาพร้อมตัว พอจบ คุณจะมีการตั้งค่าแบบหลายโมเดลที่ใช้งานได้ ตารางสรุปการเลือกโมเดล และคำตอบที่ชัดเจนต่อคำถามที่สำคัญ: เอาอะไรไปไว้ตรงไหน


หนึ่งสตริง บนแบ็กเอนด์ใดก็ได้

Octomind คุยกับผู้ให้บริการทุกรายผ่านไลบรารีเดียว — octolib ซึ่งผมเขียนถึงไปก่อนหน้านี้ สิ่งที่ octolib ให้คุณ สิ่งที่ทำให้ทั้งหมดนี้เป็นไปได้ คือทุกโมเดลถูกตั้งชื่อแบบเดียวกัน: สตริง provider:model

model = "anthropic:claude-sonnet-5"
model = "openai:gpt-5.5"
model = "deepseek:deepseek-chat"
model = "openrouter:google/gemini-3.5-flash"
model = "ollama:glm-5"

ฟิลด์เดียวกัน รูปแบบเดียวกัน ทุกที่ที่กำหนดค่าโมเดล octolib แยกพรีฟิกซ์ กำหนดเส้นทางไปยังแบ็กเอนด์ที่ถูกต้อง และทำให้คำตอบเป็นมาตรฐาน — การใช้โทเค็น ต้นทุน เอาต์พุตแบบมีโครงสร้าง — เพื่อให้ส่วนที่เหลือของ Octomind ไม่ต้องสนใจว่าผู้ให้บริการรายใดตอบ

พรีฟิกซ์ผู้ให้บริการที่ octolib รู้จัก ณ รุ่นปัจจุบัน มีดังนี้:

openrouter  openai      anthropic   google      amazon
cloudflare  deepseek    cerebras    groq        together
fireworks   nvidia      minimax     moonshot    zai
byteplus    featherless octohub     ollama      local

ผู้ให้บริการบนเครือข่ายยี่สิบราย บวกกับเมตา-โปรไวเดอร์พิเศษ cli สำหรับเอเจนต์ที่อิงกับ CLI ในเครื่อง (รายละเอียดด้านล่าง) moonshot และ kimi เป็นชื่อแทนของผู้ให้บริการเดียวกัน ผู้ให้บริการใหม่ลงใน octolib แล้วพร้อมใช้งานใน Octomind โดยอัตโนมัติ — ไม่ต้องออก Octomind รุ่นใหม่

อ้อ คีย์ API มาจากตัวแปรสภาพแวดล้อมเท่านั้น คุณใส่มันในไฟล์คอนฟิกไม่ได้ นั่นถูกถอดออกด้วยเหตุผลด้านความปลอดภัย คุณ export OPENROUTER_API_KEY=... (หรือวางไฟล์ .env ในไดเรกทอรีทำงาน) แล้ว octomind config --show จะบอกคุณว่ามันตรวจพบคีย์ใดและมาจากไหน คีย์ OpenRouter ตัวเดียวให้คุณเข้าถึงแคตตาล็อกได้เกือบทั้งหมดผ่านพรีฟิกซ์เดียว ส่วนคีย์ของผู้ให้บริการเฉพาะให้ส่วนที่เหลือ


โมเดลถูกเลือกที่ไหน

ก่อนกระจายงานข้ามโมเดล คุณต้องรู้สี่จุดที่สามารถตั้งโมเดลได้ และจุดไหนชนะเมื่อมีมากกว่าหนึ่งจุดที่มีผล Octomind แก้ปัญหาว่าโมเดลใดทำงานจริงตามลำดับนี้ ลำดับความสำคัญสูงสุดก่อน:

CLI --model  >  role.model  >  config.model

บวกตะเข็บที่สี่สำหรับเอเจนต์ tap: รายการ [taps] จะแทนที่ config.model สำหรับแท็กของเอเจนต์ tap เฉพาะตัว

  • config.model — ค่าเริ่มต้นที่ราก ในคอนฟิกที่เพิ่งสร้างใหม่จะเป็น Claude คลาส Sonnet ที่ส่งผ่าน OpenRouter — วันนี้คุณจะตั้งเป็น openrouter:anthropic/claude-sonnet-5 ทุกอย่างจะตกกลับมาที่นี่เมื่อไม่มีการตั้งค่าที่เจาะจงกว่านี้
  • role.model — การแทนที่ต่อโรล นี่คือคันโยกหลัก แต่ละโรลตั้งชื่อโมเดลของตัวเองได้ และโมเดลของโรลจะถูกเคารพโดยตรงเหนือค่าเริ่มต้นที่ราก
  • การแทนที่ [taps] — สำหรับเอเจนต์ tap (เอเจนต์ category:variant ที่คุณติดตั้งจากรีจิสทรี) คุณปักหมุดโมเดลต่อแท็กได้โดยไม่ต้องแตะ manifest ของเอเจนต์:
[taps]
"developer:general" = "anthropic:claude-sonnet-5"
"octomind:assistant" = "openai:gpt-5.5"
  • CLI --model — ชนะทุกอย่างสำหรับการรันหนึ่งครั้ง: octomind run -m anthropic:claude-sonnet-5 และกลางเซสชันคุณสลับสด ๆ ได้ด้วย /model deepseek:deepseek-chat หรือปรับระดับความพยายามในการให้เหตุผลด้วย /effort high

ดังนั้นกลยุทธ์จึงตรงไปตรงมา: เลือกค่าเริ่มต้นที่เหมาะสมใน config.model แล้วแทนที่ต่อโรลตรงที่งานเฉพาะสมควรได้โมเดลที่ต่างออกไป การประหยัดส่วนใหญ่มาจากชั้นโรล


โรล: หน่วยของการเลือกโมเดล

โรล ใน Octomind คือชุดพฤติกรรมที่มีชื่อ: system prompt หนึ่ง temperature หนึ่ง ชุดของเซิร์ฟเวอร์ MCP และสิทธิ์เครื่องมือ — และโมเดล (ไม่บังคับ) ทุกเซสชันรันด้วยโรล โรลตัดสินว่าเอเจนต์ทำอะไรได้ และ โมเดลใดเป็นคนทำ

คอนฟิกที่มาพร้อมตัวก็ทำตามที่บทความนี้สั่งสอนอยู่แล้ว มันกำหนดสี่โรลธรรมดา และสามในนั้นจงใจรันบนโมเดลที่ถูกกว่าโมเดลหลัก — โดยตรงนี้ปรับสตริงโมเดลเป็นรุ่นปัจจุบันแล้ว:

# การปรับคำขอแบบเบา ๆ — ทำงานคลุมเครือให้ชัดขึ้น ไม่มีเครื่องมือ
[[roles]]
name = "task_refiner"
model = "openrouter:openai/gpt-5.4-mini"
# ...

# การสำรวจ — รวบรวมคอนเท็กซ์ อ่านไฟล์ รายงานสิ่งที่พบ
[[roles]]
name = "task_researcher"
model = "openrouter:google/gemini-3.5-flash"
# ...

# การบีบอัดประวัติเซสชัน — สรุปและลดทอน
[[roles]]
name = "reduce"
model = "openrouter:openai/gpt-5-mini"
# ...

อ่านการเลือกโมเดลเหล่านั้นเป็นคำประกาศเชิงออกแบบ การปรับคำขอที่คลุมเครือเป็นงานสำหรับโมเดลเล็กและเร็ว (gpt-5.4-mini) การค้นคว้าที่อ่านไฟล์เยอะ ๆ ต้องการหน้าต่างคอนเท็กซ์ใหญ่และราคาถูก (gemini-3.5-flash) การบีบอัดประวัติเป็นงานสรุปแบบมีโครงสร้างที่โมเดลให้เหตุผลขนาดเล็กจัดการได้ดี (gpt-5-mini) ไม่มีตัวไหนต้องใช้โมเดลระดับแนวหน้า และคอนฟิกเริ่มต้นก็ไม่เปลืองโมเดลแบบนั้นไปกับมัน

คุณกำหนดโรลของคุณเองด้วยวิธีเดียวกัน ทุกฟิลด์ยกเว้น model เป็นข้อบังคับ — system, welcome, temperature, top_p และ top_k ต้องมีครบ ไม่งั้นคอนฟิกจะ parse ไม่ผ่าน:

# คอนเท็กซ์กว้างราคาถูกสำหรับการกวาดดูโค้ดเบส
[[roles]]
name = "researcher"
model = "openrouter:google/gemini-3.5-flash"
temperature = 0.3
top_p = 0.7
top_k = 20
system = "You gather context and report findings. You do not modify files."
welcome = ""
[roles.mcp]
server_refs = ["filesystem"]
allowed_tools = ["view"]

# ความแม่นยำตรงที่สำคัญ — การรีวิวและการตัดสินใจที่ยาก
[[roles]]
name = "reviewer"
model = "anthropic:claude-opus-4-8"
temperature = 0.2
top_p = 0.7
top_k = 20
system = "You review changes for correctness, security, and edge cases."
welcome = "Reviewer ready."
[roles.mcp]
server_refs = ["filesystem"]
allowed_tools = ["view", "ast_grep"]

ตอนนี้ octomind run researcher กวาดดู repo บนโมเดลคอนเท็กซ์ใหญ่ราคาถูก และ octomind run reviewer นำโมเดลราคาแพงออกมาเฉพาะงานที่คุ้มค่าเท่านั้น สลับระหว่างกันกลางเซสชันด้วย /role reviewer เอเจนต์เดียวกัน เซสชันเดียวกัน สองโมเดล — เลือกตามงาน


เลเยอร์: ร้อยโมเดลในรอบเดียว

โรลให้ คุณ เลือกโมเดลต่อเซสชัน เลเยอร์ ให้ระบบร้อยโมเดลอัตโนมัติภายในโฟลว์เดียว

เลเยอร์คือสเตจที่เรียกใช้ผ่าน ACP ซึ่งอ้างอิงโรลผ่านฟิลด์ command โรลพาโมเดล system prompt และเครื่องมือไปด้วย ส่วนเลเยอร์บอกว่าบทสนทนาไหลเข้าและออกจากสเตจนั้นอย่างไร ฟิลด์มีไม่มากและฟิลด์โหมดทั้งหมดเป็นข้อบังคับ:

[[layers]]
name = "analysis"
description = "Detailed analysis of code, systems, or requirements"
command = "octomind acp analysis"   # spawns the `analysis` role over ACP
input_mode = "last"                 # last | all | summary
output_mode = "append"              # none | append | replace | last | restart
output_role = "assistant"

เนื่องจากเลเยอร์ชี้ไปยังโรล และโรลพาโมเดลไปด้วย เลเยอร์แต่ละตัวในห่วงโซ่จึงรันบนโมเดลที่ต่างกันได้ โมเดลราคาถูกรวบรวมคอนเท็กซ์ ส่งเอาต์พุตไปยังสเตจถัดไป โมเดลที่แข็งแกร่งกว่าให้เหตุผลกับมัน โครงสร้าง LayerConfig เดียวกันยังหนุน [[commands]] — เลเยอร์ที่คุณทริกเกอร์แบบโต้ตอบด้วย /run <name> — ดังนั้นคำสั่ง reduce ที่มาพร้อมตัวจึงเป็นเลเยอร์เองที่รันโรล reduce ราคาถูกเพื่อบีบอัดประวัติตามต้องการ

แบบจำลองในใจ: โรลตอบ "โมเดลใดสำหรับ เซสชัน นี้" เลเยอร์ตอบ "โมเดลใดสำหรับ สเตจ นี้" รวมกันแล้วมันให้คุณกำหนดเส้นทางคำขอเดียวผ่านไปป์ไลน์ถูกแล้วแพงโดยไม่ต้องเขียนโค้ดออร์เคสเตรชัน — ทั้งหมดเป็น TOML

หมายเหตุ: รายการ [[layers]] ต้องมีโรลที่ตรงกันใน [[roles]] โมเดลอยู่ในโรล ไม่เคยอยู่ในเลเยอร์ ถ้าคุณพบว่าตัวเองอยากตั้งโมเดลบนเลเยอร์ สิ่งที่คุณกำลังมองหาคือโรล


การบีบอัดมีโมเดลของตัวเอง — และมันควรราคาถูก

ยังมีการเลือกโมเดลอีกอย่างที่พลาดได้ง่ายและคืนทุนทันที Octomind บีบอัดเซสชันยาวโดยอัตโนมัติ และการเรียกแบบตัดสินใจ-บวก-สรุปที่ขับเคลื่อนการบีบอัดรันบนโมเดลที่กำหนดค่าไว้ ของมันเอง แยกจากตัวหลัก:

[compression.decision]
model = "openai:gpt-5-mini"   # ถูกโดยการออกแบบ
max_tokens = 16000
temperature = 0.3

ค่าเริ่มต้นที่มาพร้อมตัวคือ openai:gpt-5-mini ด้วยเหตุผล: การเรียกนี้ยิงซ้ำ ๆ ตลอดเซสชันยาว และคุณไม่อยากให้โมเดลระดับแนวหน้ามาตัดสินว่าจะบีบอัดหรือไม่ anthropic:claude-haiku-4-5 เป็นทางเลือกที่ดีถ้าคุณใช้ Anthropic อยู่แล้ว ประเด็นเดียวกันกับทุกที่ในบทความนี้ — งานปกติเชิงโครงสร้างได้โมเดลปกติราคาถูก และการประหยัดทบต้นเพราะมันรันบ่อย

ตัวเครื่องบีบอัดเองก็ตระหนักถึงต้นทุน: ก่อนบีบอัด มันคำนวณประโยชน์สุทธิโดยใช้ราคาต่อโมเดลที่ดึงมาจากผู้ให้บริการ และข้ามการบีบอัดเมื่อมันจะมีต้นทุนมากกว่าที่ประหยัดได้ สำหรับโมเดลเซสชันฟรี/ราคาศูนย์ — เช่นโมเดล Ollama ในเครื่อง — มันบีบอัดเสมอ เพราะต้นทุนไม่เกี่ยว และคุณสนใจแค่ว่าคอนเท็กซ์ยังจัดการได้ ซึ่งนำเข้าสู่หัวข้อถัดไปได้พอดี


โมเดลโลคัลสำหรับงานปริมาณมาก

ไม่ใช่ทุกการเรียกต้องออกจากเครื่องของคุณ Octomind คุยกับโมเดลโลคัลได้สองทาง

Ollama และเอนด์พอยต์ที่เข้ากันได้กับ OpenAI ผ่านพรีฟิกซ์ ollama: และ local::

model = "ollama:glm-5"
model = "local:my-finetune"   # set LOCAL_API_URL to your endpoint

ollama: ชี้ไปยังเดมอน Ollama ในเครื่องของคุณ local: ชี้ไปยังเซิร์ฟเวอร์ที่เข้ากันได้กับ OpenAI ใด ๆ ผ่าน LOCAL_API_URL ทั้งสองเป็นสตริง provider:model เดียวกันกับที่คอนฟิกส่วนที่เหลือใช้ — ใส่มันลงในฟิลด์ model ของโรล แล้วโรลนั้นจะรันในเครื่อง

เอเจนต์ CLI ในเครื่อง ผ่านเมตา-โปรไวเดอร์พิเศษ cli: ซึ่งรันเอเจนต์บรรทัดคำสั่งในเครื่องของคุณแทนการเรียก API บนเครือข่าย:

model = "cli:codex/gpt-5.2-codex"

รูปแบบคือ cli:<backend>/<model> โดย backend เป็นหนึ่งใน codex, claude, cursor, gemini หรือคำสั่งทั่วไป เนื่องจากมันรันผ่าน CLI ในเครื่อง จึงไม่ต้องใช้คีย์ API — Octomind ข้ามการตรวจสอบเครเดนเชียลทั้งหมดสำหรับโมเดล cli: พฤติกรรมปรับแต่งด้วยตัวแปรสภาพแวดล้อมเฉพาะ backend (สำหรับ backend codex คือ CODEX_COMMAND, CODEX_REASONING_EFFORT และพวกพ้อง)

โมเดลโลคัลคุ้มค่าตรงไหน: งานปริมาณมากเดิมพันต่ำที่ความหน่วงและความเป็นส่วนตัวสำคัญกว่าคุณภาพไม่กี่แต้มสุดท้าย การสรุปจำนวนมาก การจัดหมวดหมู่ การค้นคว้ารอบแรก อะไรก็ตามที่คุณรันเป็นพัน ๆ ครั้ง ใส่โมเดลโลคัลบนโรล researcher แล้วเฟสสำรวจไม่เสียค่าใช้จ่ายต่อโทเค็นเลย เก็บโมเดลบนคลาวด์ไว้ที่โรล reviewer ที่ช่องว่างด้านคุณภาพเห็นได้จริง


OctoHub: การกำหนดเส้นทางและการสำรองด้านล่าง

จนถึงตอนนี้การกำหนดเส้นทางเป็นแบบต่อโรลและต่อเลเยอร์ ตัดสินในคอนฟิก Octomind ของคุณ แต่ยังมีชั้นด้านล่าง — พร็อกซีจริง — และนั่นคือที่ที่การสำรอง (fallback) การกระจายโหลด และการบัญชีแบบรวมศูนย์อาศัยอยู่

OctoHub คือพร็อกซี LLM โอเพนซอร์สของเรา สำหรับ Octomind มันก็แค่ผู้ให้บริการอีกราย: คุณตั้งโมเดลแบบ octohub:my-model ชี้ Octomind ไปยังเอนด์พอยต์ของ OctoHub แล้วจากฝั่ง Octomind มันก็เป็นสตริง provider:model อีกหนึ่งตัว สิ่งที่ OctoHub ทำเบื้องหลังสตริงนั้นคือที่ที่มันมีประโยชน์ คอนฟิกของมันแมปชื่อโมเดลสั้น ๆ ไปยัง รายการ ของเป้าหมาย provider:model แบบเต็มรูปแบบ และสุ่มเลือกหนึ่งตัวต่อคำขอ:

[models]
# ชื่อแทนหนึ่งชื่อ หลายแบ็กเอนด์จริง — สุ่มเลือกต่อคำขอ = การกระจายโหลดแบบง่าย
"fast" = ["minimax:minimax-m3", "ollama:minimax-m3"]

แมปเดียวนั้นให้คุณการกระจายโหลดและรูปแบบ failover แบบนุ่ม ๆ: ถ้าแบ็กเอนด์หนึ่งถูกจำกัดอัตราหรือล่ม ตัวอื่นในรายการก็รับทราฟฟิกแทน OctoHub ยังทำการบันทึกคำขอ/คำตอบแบบเต็ม คีย์ API แบบหลายผู้เช่า (เพื่อให้นักพัฒนาหรือบริการแต่ละรายมีคีย์ของตัวเองและติดตามการใช้งานแยกกัน) และวิเคราะห์การใช้งานแบบรวมตามคีย์และช่วงเวลา สำหรับทีมที่รันเอเจนต์จำนวนมาก นั่นคือความต่างระหว่าง "เดือนที่แล้วเราใช้กับ LLM ไปสี่พันดอลลาร์" กับ "ไปป์ไลน์รีวิวบนบริการ auth ใช้ไปสี่พันดอลลาร์เดือนที่แล้ว นี่คือรายละเอียดแยกตามคีย์"

การแบ่งงานชัดเจน:

  • octolib คือไลบรารีที่รู้วิธี คุย กับผู้ให้บริการแต่ละราย — รูปแบบคำขอ การ parse คำตอบ ตารางต้นทุน
  • OctoHub คือพร็อกซีที่อยู่หน้าผู้ให้บริการและตัดสินว่าคำขอ ไปโดน รายใด บันทึกมัน และวัดต่อคีย์
  • Octomind คือเอเจนต์ที่ตัดสิน ต่อโรลและต่อเลเยอร์ ว่าจะส่ง สตริงโมเดลใด ตั้งแต่แรก

คุณรัน Octomind โดยไม่มีพร็อกซีเลยก็ได้ และกำหนดเส้นทางผ่านโรลและ OpenRouter ล้วน ๆ คุณเพิ่ม OctoHub เมื่ออยากได้การควบคุมแบบรวมศูนย์: ที่เดียวสำหรับหมุนคีย์ ปรับสมดุลทราฟฟิกใหม่ และดูว่าเงินไปไหน


ตารางสรุปการเลือกโมเดล

นี่คือที่ที่ผมจะวางโมเดลแต่ละประเภทจริง ๆ ปฏิบัติต่อชื่อโมเดลเฉพาะเป็นตัวอย่างปัจจุบัน ไม่ใช่บัญญัติ — โมเดลที่ถูกในไตรมาสนี้จะไม่ใช่โมเดลที่ถูกในไตรมาสหน้า แต่ รูปร่าง ของการตัดสินใจยังคงอยู่

งานในเอเจนต์ ประเภทโมเดล ตัวอย่างรูปธรรม ทำไม
รีวิวขั้นสุดท้าย การตัดสินใจออกแบบที่ยาก diff ใกล้ auth แนวหน้า anthropic:claude-opus-4-8 คุณภาพคุ้มราคาในส่วน 10% ที่สำคัญ
ลูปพัฒนาหลัก แข็งแกร่ง มีแคช anthropic:claude-sonnet-5 โค้ดดิ้งดี + แคช prompt ทำให้ต้นทุนสมเหตุสมผล
ค้นคว้า / กวาดคอนเท็กซ์ คอนเท็กซ์ใหญ่ ราคาถูก openrouter:google/gemini-3.5-flash อ่านไฟล์เยอะ ไม่ต้องเก่งเป็นเลิศ
ปรับงาน เล็ก เร็ว openrouter:openai/gpt-5.4-mini จัดระเบียบคำขอที่คลุมเครือ — งานเล็กน้อย
การตัดสินใจบีบอัด เล็ก ราคาถูก openai:gpt-5-mini ยิงตลอด อย่าใช้โมเดลแนวหน้าตรงนี้เด็ดขาด
ลดทอนเซสชัน / สรุป ให้เหตุผลขนาดเล็ก openrouter:openai/gpt-5-mini สรุปแบบมีโครงสร้าง รันบ่อย
ปริมาณมาก / สูง / เป็นส่วนตัว โลคัล ollama:glm-5, cli:codex/gpt-5.2-codex ความหน่วง + ความเป็นส่วนตัว + ต้นทุนต่อโทเค็นเป็นศูนย์
คลาวด์สำรองประหยัด เนทีฟราคาถูก deepseek:deepseek-chat ต้นทุนต่ำสุดเมื่อยังต้องใช้ API จริง

กฎใต้ตาราง: ใช้จ่ายกับการเรียกตามสัดส่วนที่คุณภาพเอาต์พุตเปลี่ยนผลลัพธ์ การรีวิวไม่จับบั๊กก็ไม่จับ — ใช้จ่ายตรงนั้น รายชื่อไฟล์กลับมาเหมือนกันจากโมเดลใดก็ตาม — อย่าใช้จ่าย


คอนฟิกหลายโมเดลฉบับสมบูรณ์

ประกอบทุกอย่างเข้าด้วยกัน นี่คือคอนฟิกที่กระจายงานข้ามสี่โมเดล — ค่าเริ่มต้นราคาถูก รีวิวเวอร์ที่แข็งแกร่ง รีเสิร์ชเชอร์ในเครื่อง และการตัดสินใจบีบอัดราคาถูก — บวกเพดานการใช้จ่ายแบบแข็งเพื่อให้ลูปที่หลุดการควบคุมไม่ทำให้คุณตกใจ:

# ค่าเริ่มต้นที่ถูกและมีความสามารถ กำหนดเส้นทางผ่านคีย์ OpenRouter เดียว
model = "openrouter:anthropic/claude-sonnet-5"

# เพดานแข็ง — บังคับใช้ ไม่ใช่แค่คำแนะนำ
max_request_spending_threshold = 0.50   # USD ต่อคำขอ หยุดการทำงาน
max_session_spending_threshold = 5.00   # USD ต่อเซสชัน ถาม/หยุด

# การบีบอัดรันบนโมเดลราคาถูก แยกจากตัวหลัก
[compression.decision]
model = "openai:gpt-5-mini"
max_tokens = 16000
temperature = 0.3

# โมเดลโลคัลสำหรับเฟสสำรวจปริมาณมาก
[[roles]]
name = "researcher"
model = "ollama:glm-5"
temperature = 0.3
top_p = 0.7
top_k = 20
system = "You gather context and report findings. You do not modify files."
welcome = ""
[roles.mcp]
server_refs = ["filesystem"]
allowed_tools = ["view"]

# โมเดลแนวหน้าสำหรับงานที่คุ้มค่า
[[roles]]
name = "reviewer"
model = "anthropic:claude-opus-4-8"
temperature = 0.2
top_p = 0.7
top_k = 20
system = "You review changes for correctness, security, and edge cases."
welcome = "Reviewer ready."
[roles.mcp]
server_refs = ["filesystem"]
allowed_tools = ["view", "ast_grep"]

ตรวจสอบความถูกต้องก่อนเชื่อใจมัน:

octomind config --validate
octomind config --show     # confirms which provider keys were detected

จากนั้นรันเส้นทางราคาถูกเป็นค่าเริ่มต้น และเรียกตัวแพงเฉพาะเมื่อคุณตั้งใจ:

octomind run researcher              # local model, free per token
octomind run reviewer                # frontier model, on purpose
octomind run -m deepseek:deepseek-chat   # one-off override for a session

ดูว่ามันมีต้นทุนจริงเท่าไรด้วย /info สำหรับภาพรวมเซสชัน และ /report สำหรับรายละเอียดต่อคำขอ ครั้งแรกที่คุณรันงานจริงแบบนี้แล้วเห็นว่าเฟสค้นคว้าไม่เสียอะไรเลยขณะที่การรีวิวเสียไม่กี่เซนต์ การแบ่งงานจะหยุดเป็นแค่ทฤษฎี


อะไรเปลี่ยนไปหลังแบ่งงาน

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

อาการค้างจากลิมิตอัตราคำขอก็หายไปด้วย ซึ่งผมไม่ได้คาดไว้ การกระจายทราฟฟิกข้ามผู้ให้บริการ — บางส่วนผ่าน OpenRouter บางส่วนตรง บางส่วนในเครื่อง บางส่วนหลังการแมปสุ่มเลือกของ OctoHub — หมายความว่า 429 ของผู้ให้บริการรายเดียวไม่หยุดทั้งเซสชัน เอเจนต์ที่เคยค้างอยู่กับลิมิตอัตราของ upstream รายหนึ่งตอนนี้แค่กำหนดเส้นทางอ้อมมันไป

ไม่มีสิ่งใดในนี้ต้องการเฟรมเวิร์ก ไลบรารีกำหนดเส้นทาง หรือโค้ดออร์เคสเตรชัน มันคือสตริง provider:model ใน TOML โรลพิเศษไม่กี่ตัว และโมเดลบีบอัดราคาถูกหนึ่งตัว ส่วนที่ยากไม่ใช่การเดินสาย — octolib และ Octomind มีมันครบอยู่แล้ว ส่วนที่ยากคือการเปลี่ยนกรอบคิด: เลิกจ่ายราคาระดับแนวหน้าให้งานหนักซ้ำซาก และวางโมเดลที่ดีที่สุดของคุณเฉพาะตรงที่คุณภาพเอาต์พุตเปลี่ยนสิ่งที่จะเกิดขึ้นต่อไปจริง ๆ

ถ้าคุณกำลังห่อเครื่องมือเฉพาะโปรเจกต์ให้เอเจนต์เหล่านี้ด้วย รูปแบบ custom MCP ในรีโปของคุณ ประกอบเข้ากับโรลหลายโมเดลได้อย่างสะอาด — เครื่องมือที่แคบและโมเดลขนาดพอดีดึงไปในทิศทางเดียวกัน


คำถามที่พบบ่อย

ผมต้องใช้ OpenRouter ไหม หรือใช้ผู้ให้บริการโดยตรงได้?

ได้ทั้งสองอย่าง OPENROUTER_API_KEY เดียวให้คุณเข้าถึงแคตตาล็อกเกือบทั้งหมดผ่านพรีฟิกซ์ openrouter: ซึ่งเริ่มได้ง่ายสุด หรือตั้งคีย์แยก (ANTHROPIC_API_KEY, DEEPSEEK_API_KEY, …) แล้วใช้พรีฟิกซ์เนทีฟ คุณผสมทั้งสองในคอนฟิกเดียวได้ — โรลต่าง ๆ ไปโดนผู้ให้บริการที่ต่างกันโดยสิ้นเชิงได้

ผมสลับโมเดลโดยไม่แก้คอนฟิกได้อย่างไร?

ต่อการรัน: octomind run -m anthropic:claude-sonnet-5 กลางเซสชัน: /model deepseek:deepseek-chat แฟล็ก CLI ชนะโมเดลของโรลและคอนฟิก คำสั่งสแลชสลับเซสชันสด ๆ และบันทึกมัน

โมเดลถูกตัดสินที่ไหนกันแน่?

ลำดับการแก้ปัญหาคือ CLI --model > role.model > config.model โดยมีการแทนที่ [taps] เสียบเข้าที่ระดับ config.model สำหรับเอเจนต์ tap ตั้ง config.model ค่าเริ่มต้นที่เหมาะสม แล้วแทนที่ต่อโรลสำหรับงานที่สมควรได้โมเดลที่ต่างออกไป

ขั้นตอนต่าง ๆ ของงานเดียวใช้โมเดลต่างกันได้ไหม?

ได้ — นั่นคือสิ่งที่เลเยอร์มีไว้ เลเยอร์อ้างอิงโรล โรลพาโมเดล ดังนั้นห่วงโซ่ของเลเยอร์จึงรันห่วงโซ่ของโมเดล โมเดลราคาถูกรวบรวมคอนเท็กซ์ โมเดลแข็งแกร่งให้เหตุผลกับมัน ทั้งหมดในโฟลว์เดียว

โมเดลโลคัลจะทำให้การติดตามต้นทุนพังไหม?

ไม่ โมเดลฟรีหรือราคาศูนย์ถูกจัดการอย่างชัดเจน: การติดตามต้นทุนรายงานเป็นศูนย์ และตัวเครื่องบีบอัดบีบอัดเสมอสำหรับโมเดลแบบนั้น (เพราะเกตต้นทุนไม่มีผล) เพื่อให้คอนเท็กซ์ยังจัดการได้

OctoHub เพิ่มอะไรที่โรลไม่มี?

โรลกำหนดเส้นทางในคอนฟิกของคุณ OctoHub กำหนดเส้นทางที่พร็อกซี มันแมปชื่อแทนหนึ่งไปยังแบ็กเอนด์จริงหลายตัวพร้อมการกระจายโหลดแบบสุ่ม บันทึกทุกคำขอ ออกคีย์ API ต่อคีย์สำหรับการติดตามการใช้งานแบบหลายผู้เช่า และรวมการวิเคราะห์ คุณต้องการมันเมื่อทีมต้องการที่เดียวเพื่อปรับสมดุลทราฟฟิกใหม่และคิดบัญชีค่าใช้จ่าย


ประเด็นไม่เคยเป็น "ใช้โมเดลที่ถูกกว่า" มันคือ "ใช้โมเดลที่ ถูกต้อง สำหรับการเรียกแต่ละครั้ง และให้การกำหนดเส้นทางเป็นคอนฟิก ไม่ใช่โค้ด" Octomind ยื่นตะเข็บให้คุณ — ค่าเริ่มต้นที่ราก ต่อโรล ต่อเลเยอร์ ต่อการรัน บวกพร็อกซีด้านล่าง — และสตริง provider:model เดียวร้อยทั้งหมดเข้าด้วยกัน

ใช้จ่ายโมเดลที่ดีที่สุดของคุณตรงที่คำตอบสำคัญจริง ๆ ปล่อยให้ที่เหลือรันราคาถูก

— Don


Octomind เป็นโอเพนซอร์สภายใต้ Apache-2.0 และ octolib กับ OctoHub ก็เช่นกัน การกำหนดเส้นทางหลายโมเดลคือคอนฟิก ไม่ใช่ปลั๊กอิน — ถ้าผู้ให้บริการที่คุณต้องการขาดไป มันจะลงใน octolib และโผล่ใน Octomind โดยอัตโนมัติ เปิด issue ถ้ามีอะไรในนี้ที่ไม่ตรงตามจริง