ข้ามไปยังเนื้อหา

โมเดลเอเจนต์

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

เอเจนต์แต่ละตัวสังกัดเวิร์กสเปซเพียงหนึ่งเดียวเท่านั้น นี่คือค่าคงที่ตายตัว — agent.workspaceId ไม่เป็นค่าว่าง เวิร์กสเปซของเอเจนต์เองเป็นตัวเลือกไฟล์ฐานข้อมูลที่แถวข้อมูลของมันไปลง และการสร้างเอเจนต์ที่ไม่มีเวิร์กสเปซจะถูกปฏิเสธ

เอเจนต์ยังเป็นไดเรกทอรีด้วย คำนิยามของมันอยู่ที่ agents/<slug>/AGENTS.md ใต้ไดเรกทอรีข้อมูลของเวิร์กสเปซ โดยสกิลที่มันถืออยู่ถูกลิงก์แบบซิมลิงก์เข้าไปใน agents/<slug>/.agents/skills แถวในฐานข้อมูลและไฟล์ถูกเขียนพร้อมกัน การซีดเป็นแบบทำซ้ำได้: ถ้าแถวของเอเจนต์มีอยู่แล้ว ไฟล์บนดิสก์และลิงก์สกิลก็ยังถูกเขียนใหม่ทับ ผู้เรียกใช้ในโปรดักชันคือการสร้างเวิร์กสเปซ ไม่ใช่การเปิดเซิร์ฟเวอร์ทุกครั้ง

แอตทริบิวต์ สิ่งที่มันทำ
name ตัวระบุสั้นคล้าย slug (architect, qa) และเป็นสิ่งที่ @mentions ใช้อ้างถึง
title ตำแหน่งงานที่มนุษย์อ่านได้
persona ข้อความอิสระว่าด้วยบุคลิกและคำแนะนำด้านพฤติกรรม ถูกฉีดเป็นส่วนหนึ่งของพรอมต์
systemPrompt คำแนะนำเพิ่มเติมแบบไม่บังคับ ถูกฉีดเป็นส่วน “Agent instructions” — ไม่ได้แทนที่ส่วนที่เหลือของพรอมต์ที่ประกอบขึ้น
skills ชุดชื่อสกิลที่ไม่คำนึงถึงตัวพิมพ์เล็ก-ใหญ่ สะท้อนเป็นลิงก์สกิลบนดิสก์
adapterId ตัวรันที่เอเจนต์ส่งงานไปให้ ค่า null จะถอยกลับไปใช้ลูปในตัว
modelId โมเดลใดภายในอะแดปเตอร์นั้น
effort ระดับการใช้เหตุผล ซึ่งดึงมาจากคำศัพท์ของโมเดลที่เลือกเอง
contextSize การแทนที่ขนาดหน้าต่างบริบท
silenceTimeoutMinutes การแทนที่ต่อเอเจนต์ (1–240) สำหรับตัวเฝ้าระวังความเงียบ
reportsTo รหัสเอเจนต์แม่ — สายการรายงานที่ผังองค์กรวาดขึ้น

คุณแก้ไขทั้งหมดนี้ได้ที่ การตั้งค่า → เวิร์กสเปซ → เอเจนต์ เอเจนต์ใหม่ จะสร้างเอเจนต์ที่ยังไม่มีชื่อ ซึ่งคุณค่อยเติมข้อมูลทีหลัง

สกิลคือชื่อที่ไม่คำนึงถึงตัวพิมพ์เล็ก-ใหญ่บนเอนทิตีเอเจนต์ มีสองสิ่งเกิดขึ้นแยกกันกับมัน:

  • การที่ชื่อเหล่านี้ถูกระบุไว้ในพรอมต์ที่ประกอบขึ้นภายใต้หัวข้อ “Skills” คือทั้งหมดที่ชุดของเอนทิตีทำได้ด้วยตัวเอง — ไม่มีคลังพรอมต์แยกตามสกิลที่ผูกอยู่กับมัน
  • ไดเรกทอรีของสกิลที่ถูกเอ่ยชื่อแต่ละตัว (skills/<slug>/SKILL.md ในเวิร์กสเปซ) ถูกลิงก์เข้าไปในโฟลเดอร์ของเอเจนต์เอง บนฮาร์เนสในตัว ฟรอนต์แมตเทอร์ของสกิลที่ลิงก์ไว้จะถูกโหลดอัตโนมัติเข้าสู่พรอมต์ระบบ และเอเจนต์จะอ่านเนื้อหาเต็มเมื่อต้องการ การพิมพ์ /skill:<name> ในบทสนทนาจะโหลดเนื้อหานั้นเป็นคำสั่งสำหรับเทิร์นนั้น

สกิลที่ดึงมาจากภายนอกต้องผ่านการสแกนซัพพลายเชนแบบปิดไว้ก่อนระหว่างการดึงกับการเขียน — ไม่มีเนื้อหาสกิลใดถึงดิสก์หรือพรอมต์ได้หากไม่มีคำตัดสิน ภายนอกหมายถึงรีโพสิทอรี GitHub ที่คุณลงทะเบียนเองเป็นแหล่งสกิล ไม่มีที่เก็บที่คัดสรรไว้แล้ว ดังนั้นเมตาดาต้าของรีโพสิทอรีเอง (คำอธิบาย ดาว ชื่อสกิล) จึงเป็นข้อมูลสำหรับแสดงที่ไม่น่าเชื่อถือ และคำตัดสินจากการสแกนคือสัญญาณความปลอดภัยเดียว การติดตั้งจะดึงไดเรกทอรีทั้งหมดของสกิล ปักหมุดไว้ที่คอมมิตต้นทางใน skills-lock.json และการอัปเดตครั้งต่อไปจะผ่านด่านตรวจอีกครั้งก่อนจะแทนที่สิ่งใด วิธีทำอยู่ใน ติดตั้งและจัดการสกิล

รีโปหนึ่งสามารถมีสกิลของตัวเองได้ ในตำแหน่งมาตรฐานใดก็ได้ (.agents/skills/, .claude/skills/, .opencode/skills/) สเปซจะเช็กเอาต์รีโปที่ลิงก์ไว้ทุกตัววางเคียงกันไว้ใต้ repos/<name>/ แต่เอเจนต์ทำงานในรีโปทีละตัวเท่านั้น — มันจึงถือสกิลของ เฉพาะรีโปนั้น และสกิลจะสลับไปเมื่อมันย้ายรีโป

รีโปใดเป็นรีโปที่ใช้งานอยู่จะอนุมานจากไฟล์ที่เอเจนต์แตะ: การเขียนไฟล์ใต้ repos/<name>/ ทำให้รีโปนั้นเป็นรีโปที่ใช้งานอยู่ ขณะที่การอ่านข้ามรีโปเฉย ๆ ไม่ทำให้ ดังนั้นการไล่ตามสัญลักษณ์เข้าไปในเซอร์วิสพี่น้องจึงไม่สลับชุดสกิลไปจากใต้โจทย์ที่กำลังทำ บนสเปซที่มีรีโปเดียว คำตอบเป็นที่รู้กันก่อนเทิร์นแรก

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

สกิลของรีโปถูกโหลดให้ ทุก อะแดปเตอร์ ไม่ใช่แค่ฮาร์เนสในตัว สกิลของรีโปที่ใช้งานอยู่จะถูกทำให้ปรากฏเป็นไฟล์จริงในไดเรกทอรีทำงานของเอเจนต์ ซึ่งเป็นพาธที่ Claude Code สแกนอยู่แล้ว และดัชนีเดียวกันนี้ถูกประกอบเข้าไปใน AGENTS.md ที่ฮาร์เนสในตัวอ่าน สกิลของรีโปผ่านการสแกนแบบปิดไว้ก่อนเช่นเดียวกับสกิลที่ติดตั้ง ก่อนที่สิ่งใดจะเกิดขึ้น — รีโปที่เช็กเอาต์มาเป็นเนื้อหาที่โคลนมา และฟรอนต์แมตเทอร์ของมันไปถึงพรอมต์ได้

เอเจนต์ไม่ได้พกแฟล็กสิทธิ์ใด ๆ การที่มันจะสร้างคอมมิต พุช เปิด pull request เขียนไปยังตัวติดตาม หรือเข้าถึงเครือข่ายได้หรือไม่ ถูกตัดสินโดยกฎคุมการกระทำ — อนุญาต ถามก่อน หรือปฏิเสธ ในขอบเขตเวิร์กสเปซ เอเจนต์ หรือสเปซ — และกฎชุดเดียวกันใช้ได้ไม่ว่าอะแดปเตอร์ใดจะรันมัน

สิ่งที่การรันได้รับ มอบให้ ไม่ได้เปลี่ยนไปตามกฎเหล่านั้น การรันใน worktree ของ GitHub จะได้โทเคน GitHub แบบอ่านอย่างเดียวเสมอ และการพุชจะถูกถามในจังหวะที่มันเกิดขึ้น: การตั้งค่า git ของเอเจนต์ส่งทุกการพุชไปยัง GitHub ผ่าน Control Center ซึ่งใช้กฎ พุชไปยังรีโมต ก่อนส่งต่อ

ดู แซนด์บ็อกซ์และความปลอดภัย ว่าสิ่งนี้ทำงานอย่างไร รวมถึงสิ่งที่บังคับใช้และไม่บังคับใช้ในระดับไฟล์ซิสเต็ม

อะแดปเตอร์เป็นตัวกำหนดว่าอะไรบังคับใช้ได้

หัวข้อที่มีชื่อว่า “อะแดปเตอร์เป็นตัวกำหนดว่าอะไรบังคับใช้ได้”

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

ช่องทางขนส่ง อะแดปเตอร์ สิ่งที่ Control Center บังคับใช้
ฮาร์เนสในตัว Control Center (built-in) ทุกอย่าง ชุดเครื่องมือถูก สร้าง ขึ้นจากโหมด เครื่องมือที่ไม่อนุญาตจึงมองไม่เห็น แทนที่จะแค่ถูกปฏิเสธ ทุกการเรียกผ่านด่านอนุมัติและกฎคุมการกระทำ และข้อกำหนดการเสร็จงานสามารถกระตุ้นเตือนแล้วทำให้การรันที่จบลงโดยไม่มีผลงานส่งมอบล้มเหลวได้
Claude CLI Claude Code เครื่องมือ mcp__* ที่ถูกป้อนให้ และคำสั่ง Bash ของมัน ซึ่งฮุกส่งให้นโยบายการกระทำตรวจก่อนรัน เครื่องมืออ่าน เขียน และแก้ไขของ Claude เองอยู่ในโปรเซสของมันและทำงานโดยไม่ถูกมองเห็น — และมันถูกเรียกด้วย --dangerously-skip-permissions เพราะไม่เช่นนั้น claude -p แบบไม่โต้ตอบจะค้างตลอดไปกับพรอมต์ของตัวเอง

พูดให้ชัดคือ มีเพียงฮาร์เนสในตัวเท่านั้นที่รองรับเอเจนต์ย่อย การกำกับระหว่างการรัน การหยุดชั่วคราวและรันต่อ (และด้วยเหตุนั้นจึงรับช่วงงานได้) และการบังคับใช้โหมดเชิงโครงสร้าง Claude Code ไม่ได้สิ่งเหล่านี้เลย

เอเจนต์ที่ ไม่มี อะแดปเตอร์จะถอยกลับไปใช้ Control Center (built-in) — ลูปที่อยู่ภายในเซิร์ฟเวอร์ จึงไม่มี CLI ให้ติดตั้ง — และบันทึกการรันของมันจะระบุ cc-harness เอเจนต์ที่ถูกซีดทุกตัวถูกสร้างขึ้นโดยไม่มีอะแดปเตอร์หรือโมเดล ดังนั้นเอเจนต์ทั้งห้าตัวของเวิร์กสเปซใหม่จะรันที่นั่น บนโมเดลเริ่มต้นของ Anthropic จนกว่าคุณจะตั้งอะแดปเตอร์และโมเดลให้แต่ละเอเจนต์ ตัวเลือก “อะแดปเตอร์เริ่มต้น” ในขั้นตอนเริ่มต้นใช้งานเป็นค่ากำหนดฝั่งไคลเอนต์ที่เซิร์ฟเวอร์ไม่เคยอ่าน และไม่ย้อนไปมีผลกับเอเจนต์ที่สร้างไว้แล้ว

  • ถูกซีดมาพร้อมกับเวิร์กสเปซ ทุกเวิร์กสเปซ — ไม่ใช่แค่แห่งแรก — จะได้ CEO หนึ่งคนพร้อมผู้เชี่ยวชาญอีกสี่คน (qa, architect, engineer, librarian) ที่รายงานต่อ CEO สร้างขึ้นแบบทำซ้ำได้เบื้องหลังเมื่อเวิร์กสเปซถูกสร้าง ดู เวิร์กสเปซและการแยกโดเมน
  • เพิ่มด้วยมือ ที่ การตั้งค่า → เวิร์กสเปซ → เอเจนต์ การขอให้เอเจนต์จ้างเพื่อนร่วมงานจะไม่สร้างแถวข้อมูล ต้องใช้หน้าจอนั้น

เอเจนต์ไม่มีคอลัมน์สถานะที่จัดเก็บไว้ สถานะสดของมันถูกอนุมานจากบันทึกการรันล่าสุดทุกครั้งที่ถูกอ่าน

สถานะ ความหมาย
neverRun ยังไม่มีบันทึกการรัน
running มีการรันอย่างน้อยหนึ่งรายการกำลังดำเนินอยู่
failed การรันล่าสุดเกิดข้อผิดพลาด หรือสถานะความมีชีวิตของมันคือล้มเหลวหรือตายแล้ว
blocked สถานะความมีชีวิตของการรันล่าสุดคือถูกบล็อก หยุดชะงัก หรือวนซ้ำ
idle กรณีอื่นทั้งหมด — เอเจนต์เคยรันมาก่อนและไม่มีอะไรกำลังดำเนินอยู่

มีสถานะอีกสองอย่างคือ queued และ succeeded สำหรับการรันแต่ละรายการในแผนผังการรันของการสนทนา รายชื่อเอเจนต์ไม่เคยสร้างสถานะเหล่านี้ เพราะการที่การรันที่จบแล้วเป็นสีเขียวเป็นข้อเท็จจริงเกี่ยวกับการรัน ไม่ใช่เกี่ยวกับเอเจนต์

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