Octolib 0.39.0: โมเดลที่เขียนประโยคไม่ได้แม้แต่ประโยคเดียว เพิ่งเข้ามาอยู่ในสแตก
ตั้งแต่วันที่เราแยกมันออกมาจาก Octocode การเรียกโมเดลทุกครั้งในสตกของเราเป็นอย่างใดอย่างหนึ่งในสามอย่าง สร้างข้อความ แปลงข้อความเป็นเวกเตอร์ จัดอันดับเวกเตอร์เทียบกับคำค้น Octolib — ไลบรารีภาษา Rust ใต้ Octomind, OctoHub, Octocode และ Octobrain — มีโมดูลให้แต่ละอย่าง: llm, embeddings, reranker จากนั้นก็มี media เพิ่มเข้ามา
วันนี้เพิ่มเข้ามาเป็นชนิดที่สี่ และอันนี้ไม่เหมือนพวกก่อน octolib::evaluation คุยกับโมเดลที่ สร้างโทเคนไม่ได้แม้แต่โทเคนเดียว คุณส่ง state กับชุดคำถามแบบไทป์แล้วให้มัน แล้วมันส่งความน่าจะเป็นกลับมา ใช่หรือไม่ใช่ หนึ่งใน N ตำแหน่งบนสเกล ภายใน 70 ถึง 500 มิลลิวินาที ในราคา $0.042 ต่อล้านโทเคนขาเข้า ส่วนขาออกฟรี — เพราะไม่มีขาออกให้คิดเงิน
โมเดลตัวนี้คือ Jev จาก TypeSafe AI ซึ่งออกจากสถานะ stealth เมื่อวันที่ 15 กันยายน TypeSafe เรียกหมวดนี้ว่า โมเดล System One เราคิดว่ามันเป็น primitive ใหม่ที่น่าสนใจที่สุดที่เข้ามาในสตก AI ปีนี้ และ Octolib 0.39.0 คือเดิมพันของเรา: สตริง provider:model เดียว สามเส้นทางเพื่อเข้าถึงมัน และการคิดต้นทุนแบบเดียวกับที่เราใช้กับทุกอย่างอื่น
นั่นคือพาดหัว ตัวรีลีสยังเปลี่ยน Cloudflare Workers AI ให้เป็นผู้ให้บริการสื่อเต็มตัว เพิ่มแบ็กเอนด์ embedding แบบ ONNX ในเครื่อง นำผู้ให้บริการ LLM ใหม่เข้ามาสองราย และสุดท้ายทำให้ structured output ตรวจความถูกต้องเพียงครั้งเดียวพอดี ทุกอย่างนับจาก 0.36.1 อยู่ด้านล่าง
ทำไมเอเจนต์ถึงต้องการโมเดลที่ตัดสินใจอย่างเดียว
ถ้าถอดเอเจนต์เขียนโค้ดจนเหลือแก่น จะมีโมเดลใหญ่หนึ่งตัวทำงานอยู่ รอบ ๆ มันมี control plane คอยตัดสินเรื่องเล็ก ๆ ที่มีขอบเขตชัดว่าโมเดลนั้นกำลังทำอะไร คำสั่ง shell นี้ควรทำงานไหม ในสี่สิบทักษะ มีอันไหนเข้ากับคำขอนี้บ้าง (ถ้ามี) ความทรงจำที่เรียกคืนมานี้เกี่ยวข้องจริงไหม เอเจนต์ต้องใช้ผลจากเครื่องมือขนาด 40 KB นี้ทั้งหมด หรือไม่ต้องใช้เลย
เอเจนต์เขียนโค้ดที่จริงจังทุกตัวมีชั้นที่สองนี้ ของเราคือ supervisor ของ Octomind ของ Anthropic คือตัวจำแนก auto-mode ใน Claude Code และในทั้งสองกรณี โมเดลอเนกประสงค์เป็นผู้ตัดสินใจเหล่านั้นโดยปิดความสามารถหลักของมัน — การเขียนคำอธิบายที่มีเหตุผล — ไว้เฉพาะในการเรียกเหล่านี้ การเรียกไปกลับถึงโมเดล frontier หนึ่งรอบ ส่งใหม่ทุกการตัดสินใจ เพื่อได้กลับมาหนึ่งคำ
Jev ถูกสร้างมาเพื่อการตัดสินใจเหล่านั้นและไม่มีอย่างอื่น สาม primitive:
- Noul — คำถามใช่/ไม่ใช่ ตอบเป็นความน่าจะเป็นที่คำตอบคือใช่
- Choice — ตัวเลือกหนึ่งจากชุดที่คุณกำหนด พร้อมความน่าจะเป็นของทุกตัวเลือก และค่า confidence ที่บอกว่ากราฟการกระจายแหลมแค่ไหน
- Score — ตำแหน่งบนรูบริกแบบเรียงลำดับของระดับที่อธิบายด้วยคำ ซึ่งอาจตกอยู่ระหว่างระดับก็ได้
มันรับ state เข้ามาครั้งเดียวแล้วประเมินทุกคำถามเทียบกับ state นั้นใน pass ขนานเดียว คำถามข้อที่สิบจึงแทบฟรี มันถูกฝึกเพื่อความคาลิเบรชัน ไม่ใช่ความชอบ ดังนั้นคำตอบ 90% ควรจะถูกต้องราว 90% ของครั้งเมื่อทำนายจำนวนมาก และพื้นที่คำตอบปิดตายโดยโครงสร้าง: มันเลือกตัวเลือกผิดได้ แต่คิดค้นตัวเลือกใหม่ไม่ได้ จึงไม่มี JSON ให้ซ่อม ไม่มี enum ให้ fuzzy-match
เราเขียนเวอร์ชันยาว — มันคืออะไร พังตรงไหน คนเอาไปสร้างอะไรใน 72 ชั่วโมงแรก และการตัดสินใจระดับ control plane ข้อไหนในเอเจนต์ที่มันรับช่วงต่อได้ พร้อมตัวเลขสด ๆ — ไว้ที่บล็อก Octomind: Jev Explained: โมเดล System One ของ TypeSafe และการตัดสินใจภายในเอเจนต์ AI ทุกตัว โพสต์นี้ว่าด้วยตัวไลบรารี
API
โมดูลชื่อ evaluation เปิดเป็นค่าเริ่มต้น และคอมไพล์เดี่ยวได้ถ้าคุณต้องการแค่นี้:
octolib = { version = "0.39", default-features = false, features = ["evaluation"] }
รูปทรงตามรอยส่วนที่เหลือของ Octolib หนึ่งไทป์คำขอ หนึ่ง helper ระดับสูง หนึ่งสตริง provider:model:
use octolib::{evaluate, Answer, EvaluationRequest, Question};
async fn triage() -> octolib::EvaluationResult<()> {
// ต้องมี TYPESAFE_API_KEY; ใช้ "cloudflare:typesafe/jev" เพื่อคิดเงินเป็นเครดิต AI Gateway แทน
let request = EvaluationRequest::new("Help! My payouts have been failing for 3 days.")
.with_question("is_urgent", Question::noul("Does this convey urgency?"))
.with_question(
"department",
Question::choice(
"Which team should handle this?",
[("billing", "Payments, refunds"), ("technical", "Bugs, outages")],
),
)
.with_question(
"frustration",
Question::score("How frustrated is the customer?", ["Calm", "Frustrated", "Very angry"]),
);
let response = evaluate("typesafe:jev-latest", request).await?;
if let Answer::Noul { noul } = response.answers["is_urgent"] {
println!("urgent with p={noul:.2}, cost {:?}", response.usage.cost);
}
Ok(())
}
state เป็นได้ทั้งสตริง อ็อบเจกต์ JSON หรืออาร์เรย์ คำตอบกลับมาแบบไทป์แล้วใต้ id เดียวกับคำถาม — Answer::Noul, Answer::Choice พร้อม map ความน่าจะเป็นและ confidence, Answer::Score พร้อม legend — คุณจึงแตกกิ่งด้วยตัวเลขใน Rust ไม่ใช่ด้วยข้อความที่ parse แล้ว
สามเส้นทางสู่โมเดลเดียวกัน:
| สตริงโมเดล | ไปถึง Jev ผ่าน | คีย์ |
|---|---|---|
typesafe:jev-latest |
API ของ TypeSafe โดยตรง (early access) | TYPESAFE_API_KEY |
cloudflare:typesafe/jev |
Cloudflare AI คิดเงินผ่านเครดิต AI Gateway | CLOUDFLARE_API_KEY, CLOUDFLARE_ACCOUNT_ID |
octohub:jev |
พร็อกซี OctoHub ของคุณเอง พร้อมต้นทุนที่ hub รายงาน | OCTOHUB_API_KEY, OCTOHUB_API_URL |
รายละเอียดบางอย่างที่สำคัญก็ต่อเมื่อคุณใช้งานมันหนัก ๆ — ซึ่งเป็นส่วนที่เราใส่ใจ:
- ที่นี่ retry ปลอดภัย การประเมินไม่มี side effect การเล่นซ้ำจึงทำให้งานซ้ำซ้อนไม่ได้ ไคลเอนต์ retry เมื่อเจอ 429, 529 และ 5xx พร้อม backoff และเคารพ
Retry-Afterโดยมีเพดาน 30 วินาที POST สำหรับ generation ที่อื่นใน Octolib จงใจ ไม่ เล่นซ้ำ; อันนี้เล่นซ้ำ - ต้นทุนคำนวณจากอัตราที่ประกาศไว้ $0.042 ต่อล้านโทเคนขาเข้า และไปลงที่
usage.costเหมือนการเรียกอื่น ๆ ทุกครั้ง ผ่าน OctoHub ต้นทุนที่ hub รายงานจะถูกใช้แทน - ฟิลด์
modelในคำตอบรายงานโมเดลแบบระบุเวอร์ชันที่ตอบjev-latestขยับเมื่อ TypeSafe ออกเวอร์ชันใหม่; ถ้าคุณจูน threshold ให้ log ค่านี้ไว้แล้ว pin - id โมเดลถูกตรวจก่อนคำขอออกจากเครื่อง
openai:jev-latestเป็นผู้ให้บริการที่ไม่สนับสนุน;cloudflare:@cf/zai-org/glm-5.3เป็นโมเดลแชต ไม่ใช่โมเดลประเมิน ทั้งคู่ fail ตอน construction ไม่ใช่ตอนส่งคำขอจริง
Jev มี context 32k และเอกสารของ TypeSafe เองบอกว่าความแม่นยำลดลงเมื่อ state เต็มไปด้วยเนื้อหาที่คำถามไม่ต้องการ ตัด state ให้สั้น ถามเยอะ ๆ; ส่งน้อย ๆ
มันเสียบเข้าตรงไหน: Octomind และ OctoHub
เราไม่ได้เพิ่มโมดูลเข้า Octolib เพื่อความสนุก ทุกโมดูลมีอยู่เพราะผลิตภัณฑ์สักตัวต้องการมัน ส่วนโมดูลนี้มีผลิตภัณฑ์ต้องการถึงสองตัว
supervisor ของ Octomind ทำงานบน invariant เดิมอยู่แล้วว่าสัญญาณฟรีเป็นตัวกรองก่อนถึงโมเดล และการเรียกโมเดลนั้นหายาก วันนี้บน main, [supervisor.evaluate] เพิ่มชั้นที่สามแบบคาลิเบรตระหว่าง "ฟรี" กับ "frontier" ที่สามจุดเชื่อม: ตัวกรองความเกี่ยวข้องหลังการเรียกคืนความทรงจำ, roster Choice เมื่อกฎเปิดใช้ทักษะทุกข้อสละสิทธิ์, และตัวกลั่นกรองล่วงหน้าที่จะตัดสินว่าชุดเครื่องมือจำเป็นต้องปลุกโมเดล authorizer หรือไม่ แต่ละจุดเชื่อมคือสวิตช์หนึ่งตัว ปิดเป็นค่าเริ่มต้น หนึ่งความพยายามต่อการเรียก timeout ห้าวินาที ไม่ retry; หากล้มเหลวจะคงพฤติกรรมเดิมไว้สำหรับเทิร์นนั้น และกฎหนึ่งข้อที่เราจะวางไว้บนสุดของการใช้งาน Jev ทุกแบบ: state ห้ามพกผลจากเครื่องมือหรือข้อความของ assistant เด็ดขาด เพราะผู้ตรวจต้องไม่ได้อ่านสิ่งที่อาจกำลังโต้แย้งอยู่
OctoHub ได้ POST /v1/evaluations ตั้งค่า alias ครั้งเดียว ในพร็อกซีของคุณเอง ด้วยคีย์ของคุณเอง:
[evaluation_models]
"jev" = ["typesafe:jev-latest", "cloudflare:typesafe/jev"]
แล้วไคลเอนต์ทุกตัวในทุกภาษา — Python hook, TypeScript worker, shell script — เรียก octohub:jev และได้คำตอบแบบไทป์แล้วชุดเดียวกัน แถวต้นทุนต่อคำขอเดียวกัน และการระบุที่มาเดียวกับ chat completions ของมัน นั่นคือเหตุผลที่ octohub เป็นผู้ให้บริการ evaluation รายที่สามใน Octolib: ไลบรารีเรียกพร็อกซี พร็อกซีเรียก Octolib
ทั้งสองจะมากับรีลีสถัดไปของ Octomind และ OctoHub; ไลบรารีออกก่อนเพราะไลบรารีออกก่อนเสมอ
Cloudflare Workers AI เป็นผู้ให้บริการสื่อแล้ว
รอบก่อน สแตก media ของ Octolib ครอบคลุมภาพ วิดีโอ เสียงพูด และการถอดเสียง ผ่าน OpenRouter, Replicate, fal, ElevenLabs และ Runway 0.39.0 เพิ่ม Cloudflare Workers AI สำหรับภาพ เสียงพูด และการถอดเสียง ผ่าน endpoint แบบ synchronous /ai/run ตัวเดียวกับที่ผู้ให้บริการแชตใช้
โมเดลที่ลงทะเบียนไว้ พร้อมความสามารถ ตัวเลือก และราคาอ้างอิง:
- ภาพ: FLUX.1 schnell, FLUX.2 dev, Leonardo Lucid Origin และ Phoenix 1.0 คิดราคาต่อ output tile และ step
- เสียงพูด: Deepgram Aura 1 และ Aura 2 (อังกฤษและสเปน), MeloTTS คิดราคาต่อตัวอักษร
- การถอดเสียง: Whisper, Whisper large-v3-turbo, Deepgram Nova 3 คิดราคาต่อนาทีเสียง พร้อม segments, คำ, ภาษา และ metadata ที่ถูก parse เข้า transcript แบบไทป์แล้ว
แคตตาล็อกโหลดแบบ lazy และแคชหน้าไว้ มี fallback ไป metadata สำหรับโมเดลที่ Cloudflare ยังไม่ขึ้นรายการ ตรงไหนที่ upstream รายงานต้นทุนเป็น neuron ค่าเหล่านั้นถูกเก็บตามที่รายงาน แทนที่จะถูกแทนด้วยการประมาณระยะเวลา seed ของภาพส่งเฉพาะให้โมเดลที่รับมัน; ชนิดของเสียงพูดถูกเก็บไว้แทนที่จะถูกบังคับแปลง
ฝั่งแชตของผู้ให้บริการ Cloudflare ได้รับการปรับปรุงแบบเดียวกัน: เลือกและ normalize ระดับ reasoning ต่อโมเดล บังคับใช้ schema เฉพาะกับโมเดลรูปทรง OpenAI ที่เคารพมันจริง ๆ แก้ id โมเดลที่ทับซ้อนกันด้วยการจับคู่ที่ยาวที่สุด และ fallback ไปความสามารถอ้างอิงสำหรับโมเดลที่ไม่รู้จักแทนที่จะ fail
อย่างอื่นทั้งหมดนับจาก 0.36.1
สิบรีลีสในสิบสองวัน เวอร์ชันย่อ
ผู้ให้บริการ LLM ใหม่สองราย Inception Labs ให้บริการตระกูล LLM แบบ diffusion ชื่อ Mercury: inception:mercury-2.5 พร้อม Mercury 2 ข้างเคียง, JSON schema output และ tool calling Tinker จาก Thinking Machines ให้บริการตระกูล Inkling ของตน บวกโมเดล open-weight (Nemotron, GLM, Kimi, Qwen, GPT-OSS, DeepSeek) และ sampler checkpoints โดยจัดการ id โมเดลที่มีโคลอน และ resolve ชื่อสั้นอย่าง tinker:inkling ไปเป็น id ของ serverless inference ทั้งคู่มาพร้อมตัวอย่างที่รับสเปกโมเดลจาก command line
ONNX embeddings ในเครื่อง ผู้ให้บริการ embedding onnx ตัวใหม่โหลดกราฟและ tokenizer ของ HuggingFace เข้า ONNX Runtime — onnx:<org>/<repo> พร้อม #path-to.onnx แบบไม่บังคับสำหรับกราฟเฉพาะ — เลือกกราฟที่ quantize แล้วก่อน คำนึงถึง metadata ของ pooling และมิติแบบ static ทำ batch พร้อมติดตามการใช้โทเคน มันอยู่ข้าง ๆ FastEmbed และแบ็กเอนด์ HuggingFace บน Candle ในฐานะวิธีที่สามในการทำ embedding โดยไม่ต้องมี API key นี่คือ breaking change เพียงข้อเดียวของรอบนี้: EmbeddingProviderType ได้ variant Onnx เพิ่ม exhaustive match จึงต้องมี arm ใหม่
Structured output ตรวจครั้งเดียว flow เก่า retry การตรวจ schema ที่ไม่ผ่านได้ และรวม usage ข้ามความพยายาม นั่นหวังดีแต่ผิด: มันซ่อนพฤติกรรมของผู้ให้บริการไว้หลังลูป ตอนนี้มีการเรียก schema ขึ้น upstream ครั้งเดียวพอดี มีขั้น extraction และ validation รวมศูนย์ขั้นเดียว และ error จากการ parse หรือ validate กลับมาพร้อม log คำตอบที่มีปัญหาไว้ และไม่ retry tool call ของไคลเอนต์ยังคงอยู่หลังการ validate output ขั้นสุดท้าย สองผู้ให้บริการเลิกสัญญาเกินตัวในการเปลี่ยนแปลงเดียวกัน: Ollama และ Cloudflare ไม่อ้างการบังคับใช้ schema แบบรับประกันที่ตัวเองส่งมอบไม่ได้อีก และ OpenAI fail แบบปิดตาย เมื่อคำแนะนำ schema ถูกเมิน แทนที่จะคืนบางอย่างที่แค่ดูถูกต้อง
ระดับ reasoning effort map ต่อผู้ให้บริการ โมเดล GLM ของ Alibaba และ Z.ai ถูก map ไปยังระดับ effort ที่มันรองรับ; Fireworks คงระดับสูงสุดไว้สำหรับ GLM 5.2 Z.ai ตอนนี้รับข้อความแบบ preserved-thinking และเก็บเทิร์น assistant ที่เป็น thinking-only ไว้แทนที่จะทิ้ง
รายชื่อโมเดลมีการเปลี่ยนแปลง โมเดลที่ Cerebras ปลดระวางถูกแทนด้วย qwen-3.8-27b พร้อมรองรับวิดีโอและขีดจำกัดขาเข้า 128K route V4 ที่ DeepSeek ปลดระวางถูกแทนด้วย deepseek-flash ซึ่งถูกมองเป็น multimodal พร้อมแก้ราคา V4.1 Flash และเพิ่มบน Alibaba โมเดลที่ Hetzner ถอนถูกสลับเป็น Qwen แคชของ BytePlus และราคาบุคคลที่สามถูกรีเฟรช OctoHub ตอนนี้ probe มิติ embedding ตอน construction และแคชไว้ต่อ endpoint และโมเดล ซึ่งทำให้การสร้าง provider ของ OctoHub เป็น async — การเปลี่ยน API เล็ก ๆ ข้อที่สองที่ควรรู้ ตัว map ผู้ให้บริการตรวจ alias ของโมเดล คงตัวที่ quantize ไว้ และปฏิเสธโมเดลที่ไม่ได้ map ตอน construction แทนที่จะเป็นตอนคำขอแรก
เล็กแต่จริง รูปแบบเสียงของ fal ถูก map ไปค่าที่ fal รับ (MP3 และ PCM; รูปแบบที่ไม่สนับสนุนจะใช้ค่าเริ่มต้นของโมเดลแทน) เนื้อหาข้อความว่างได้รับอนุญาตอีกครั้ง rustls อยู่ที่ 0.23.45, dirs อยู่ที่ 7.0
การอัปเกรด
cargo add [email protected]หรือ bump เวอร์ชัน ทุก feature เปิดเป็นค่าเริ่มต้น; featureevaluationตัวใหม่ไม่ลากของหนักอะไรเข้ามา- ถ้าคุณ
matchบนEmbeddingProviderTypeให้เพิ่ม armOnnx - ถ้าคุณสร้าง provider embedding ของ OctoHub ตรง ๆ ตอนนี้มันเป็น
async - ถ้าคุณพึ่งพาว่า structured output จะ retry การ validate ที่ไม่ผ่าน มันไม่ทำแล้ว error แนบสิ่งที่ผู้ให้บริการคืนมา; ตัดสินใจในโค้ดของคุณเอง
- ตั้ง
TYPESAFE_API_KEYหรือCLOUDFLARE_API_KEYบวกCLOUDFLARE_ACCOUNT_IDแล้วลองตัวอย่างด้านบน มันกินโทเคนขาเข้าไม่กี่ร้อย: ไม่ถึงสองในพันของเซนต์
FAQ
โมเดล evaluation คืออะไร? โมเดลที่ตอบคำถามแบบไทป์แล้วเกี่ยวกับ state ด้วยความน่าจะเป็นที่คาลิเบรตมา แทนที่จะสร้างข้อความ Jev ของ TypeSafe ซึ่งเป็นตัวแรก คืนความน่าจะเป็นใช่/ไม่ใช่ (Noul), ตัวเลือกหนึ่งจากชุด (Choice) หรือตำแหน่งบนรูบริก (Score) ภายใน 70 ถึง 500 ms มันเขียนโค้ดหรือร้อยแก้วไม่ได้ งานของมันคือการตัดสินใจรอบ ๆ LLM ของคุณ: routing, admission, การกรองความเกี่ยวข้อง, การเลือกทักษะ
ต้องใช้บัญชี TypeSafe ไหม?
ไม่ต้อง การเข้าถึงตรงอยู่ใน waitlist แต่ cloudflare:typesafe/jev ใช้ได้วันนี้ด้วยบัญชี Cloudflare และเครดิต AI Gateway ที่เติมไว้ และ octohub:jev ใช้ได้ผ่าน OctoHub ของคุณเอง โดยมีคีย์ตัวใดตัวหนึ่งอยู่เบื้องหลัง
Octolib 0.39.0 ทำอะไรพังไหม?
หนึ่ง variant ของ enum (EmbeddingProviderType::Onnx), หนึ่ง constructor กลายเป็น async (embeddings ของ OctoHub) และ structured output ไม่ retry ความล้มเหลวในการ validate อีก แชต สื่อ reranking และสตริงโมเดลทุกตัวที่คุณใช้อยู่ไม่เปลี่ยนแปลง
Jev อยู่ในตัว Octomind แล้วหรือยัง?
เกต evaluation อยู่บน main ของ Octomind เบื้องหลัง [supervisor.evaluate] ปิดเป็นค่าเริ่มต้น และจะออกในรีลีสถัดไป รีลีส Octolib นี้คือฐานที่เกตเหล่านั้นสร้างอยู่
ผลิตภัณฑ์ไหนบ้างที่รันบน Octolib?
Octomind (ทุกการเรียกแชต embedding และเกต evaluation), OctoHub (แชต, embeddings, มีเดีย และ route ใหม่ /v1/evaluations), Octocode (แชต, embeddings, reranking) และ Octobrain (embeddings, reranking) เมื่อผู้ให้บริการเปลี่ยน API หรือราคา การแก้จะอยู่ที่เดียวและทุกผลิตภัณฑ์ได้รับพร้อมกัน
ประเด็น
งานของ Octolib คือการทำให้โมเดลตัวถัดไปเป็นเพียงการแก้โค้ดบรรทัดเดียวสำหรับทุกอย่างที่เรา ship มาโดยตลอด ส่วนใหญ่นั่นหมายถึงผู้ให้บริการใหม่หรือราคาที่แก้แล้ว นาน ๆ ทีมันหมายถึงโมเดล ชนิด ใหม่ และไลบรารีต้องตัดสินใจว่าจะจัดวางมันอย่างไร
โมเดล evaluation ลงตัวเป็นโมดูลที่สี่เพราะมันเป็นฟังก์ชันคนละอย่าง: ไม่ใช่ "เขียนคำตอบให้ฉัน" แต่คือ "นี่คือ state นี่คือคำถามของฉัน — บอกมาว่าคุณเชื่ออะไร และเชื่อแค่ไหน" เอเจนต์ต้องการ primitive นี้มาตั้งแต่ pre-tool hook ตัวแรก เราเลียนแบบมันด้วยโทเคนเดียวจากโมเดล reasoning มาตลอด ตอนนี้มันคือการเรียกแบบไทป์แล้ว คิดราคาอย่างซื่อตรง ห่างไปแค่สตริงเดียว
github.com/muvon/octolib · Apache-2.0 · crates.io · บทความเจาะลึก Jev บนบล็อก Octomind



