Technical reference
ข้อมูลอ้างอิงการกำหนดค่าหน่วยความจำ
หน้านี้แสดงตัวเลือกการกำหนดค่าทั้งหมดสำหรับการค้นหาหน่วยความจำของ OpenClaw สำหรับภาพรวมเชิงแนวคิด โปรดดู:
วิธีการทำงานของหน่วยความจำ
แบ็กเอนด์ SQLite เริ่มต้น
ไซด์คาร์ที่ให้ความสำคัญกับการทำงานภายในเครื่อง
ไปป์ไลน์การค้นหาและการปรับแต่ง
เอเจนต์ย่อยด้านหน่วยความจำสำหรับเซสชันแบบโต้ตอบ
การตั้งค่าการค้นหาหน่วยความจำทั้งหมดอยู่ภายใต้ agents.defaults.memorySearch ใน openclaw.json (หรือการแทนที่ agents.list[].memorySearch รายเอเจนต์) เว้นแต่จะระบุไว้เป็นอย่างอื่น
จดจำข้ามบทสนทนา
| คีย์ | ชนิด | ค่าเริ่มต้น | คำอธิบาย |
|---|---|---|---|
rememberAcrossConversations |
boolean |
เปิดสำหรับการติดตั้งส่วนบุคคล; ปิดเมื่อกำหนดการแยก DM | ใช้บริบทที่เกี่ยวข้องจากบทสนทนาส่วนตัวอื่นที่ระบบรู้จักของเอเจนต์นี้ |
กำหนดค่าเป็นรายเอเจนต์เมื่อมีเพียงเอเจนต์ส่วนบุคคลที่เชื่อถือได้เท่านั้นที่ควรใช้ การเรียกคืนทรานสคริปต์ข้ามบทสนทนา:
{ agents: { list: [ { id: "personal", memorySearch: { rememberAcrossConversations: true, }, }, ], },}ค่านี้เป็นไปตามการสืบทอด agents.defaults.memorySearch ตามปกติพร้อม
การแทนที่รายเอเจนต์ เมื่อไม่ได้ตั้งค่า ระบบจะเปิดเป็นค่าเริ่มต้นเฉพาะเมื่อ session.dmScope
ส่วนกลางไม่ได้ตั้งค่า หรือเป็น "main" และไม่มีการผูกใดมีการแทนที่ session.dmScope
การกำหนดค่าการแยก DM ใดๆ จะทำให้ค่าเริ่มต้นเป็นปิด true หรือ
false ที่กำหนดไว้อย่างชัดเจนจะมีผลเหนือกว่าเสมอ การเปิดใช้งานจะหมายรวมถึงการทำดัชนีทรานสคริปต์เซสชันและ
เพิ่ม sessions ไปยังแหล่งหน่วยความจำที่แก้ไขแล้วของเอเจนต์ เมื่อใช้ QMD ระบบจะ
เปิดใช้งานการส่งออกเซสชันของเอเจนต์นั้นด้วย โดยไม่ต้องมีการตั้งค่า
memory.qmd.sessions.enabled แยกต่างหากสำหรับโหมดนี้
ผู้ให้บริการหน่วยความจำในตัวของ OpenClaw รองรับเส้นทางที่ได้รับการปกป้องนี้ทั้งกับ
แบ็กเอนด์ในตัวและ QMD ผู้ให้บริการหน่วยความจำทางเลือกยังคงใช้
ฮุกการเรียกคืนของตนเองและเครื่องมือ Active Memory ขั้นสูงได้ แต่ระบบจะข้ามการตั้งค่านี้
เว้นแต่ผู้ให้บริการปัจจุบันรองรับการเรียกคืนทรานสคริปต์ส่วนตัวที่ได้รับการปกป้อง
openclaw doctor จะรายงานผู้ให้บริการที่ไม่รองรับ หรือรายการ
toolsAllow ของ Active Memory ที่กำหนดไว้อย่างชัดเจนซึ่งไม่มี memory_search
ขอบเขตการเรียกค้นแคบกว่าการค้นหาเซสชันทั่วไป:
- มีเพียงบทสนทนาส่วนตัวที่ระบบรู้จักของเอเจนต์เดียวกันเท่านั้นที่มีสิทธิ์
- ไม่รวมบทสนทนาที่กำลังตอบ
- ไม่รวมกลุ่มและช่องทางทั้งในฐานะแหล่งที่มาและปลายทาง
- ชนิดบทสนทนาที่ไม่รู้จักจะปฏิเสธโดยค่าเริ่มต้น
- การเรียกคืนในแซนด์บ็อกซ์ไม่สามารถใช้การอนุญาตพิเศษสำหรับการข้ามบทสนทนา
การตั้งค่านี้ไม่เปลี่ยน tools.sessions.visibility, คีย์เซสชัน,
การจัดเก็บทรานสคริปต์ การกำหนดเส้นทางการส่ง หรือสิทธิ์ของ sessions_list,
sessions_history และ sessions_send Active Memory จะดำเนินการ
เรียกค้นแบบอ่านอย่างเดียวภายในขอบเขตที่จำกัด หากการเรียกค้นใช้งานไม่ได้หรือหมดเวลา จะไม่ขัดขวาง
การตอบกลับ
การเลือกผู้ให้บริการ
| คีย์ | ชนิด | ค่าเริ่มต้น | คำอธิบาย |
|---|---|---|---|
enabled |
boolean |
true |
เปิดหรือปิดการค้นหาหน่วยความจำ |
provider |
string |
"openai" |
ID อะแดปเตอร์การฝัง เช่น bedrock, deepinfra, gemini, github-copilot, local, mistral, ollama, openai, openai-compatible หรือ voyage; อาจเป็น models.providers.<id> ที่กำหนดค่าไว้ ซึ่ง api ชี้ไปยังอะแดปเตอร์การฝังสำหรับหน่วยความจำหรือ API โมเดลที่เข้ากันได้กับ OpenAI ก็ได้ |
model |
string |
ค่าเริ่มต้นของผู้ให้บริการ | ชื่อโมเดลการฝัง |
fallback |
string |
"none" |
ID อะแดปเตอร์สำรองเมื่ออะแดปเตอร์หลักล้มเหลว |
เมื่อไม่ได้ตั้งค่า provider OpenClaw จะใช้การฝังของ OpenAI ตั้งค่า provider
อย่างชัดเจนเพื่อใช้ Bedrock, DeepInfra, Gemini, GitHub Copilot, Mistral, Ollama,
Voyage, โมเดล GGUF ภายในเครื่อง หรือปลายทาง /v1/embeddings ที่เข้ากันได้กับ OpenAI
การกำหนดค่ารุ่นเก่าที่ยังระบุ provider: "auto" จะถูกแก้ไขเป็น openai
เมื่อไม่ได้ตั้งค่า provider, มี provider: "auto" รุ่นเก่าอยู่ หรือ
provider: "none" เลือกโหมด FTS เท่านั้นโดยเจตนา การเรียกคืนหน่วยความจำยังคง
ใช้การจัดอันดับ FTS เชิงคำศัพท์ได้เมื่อการฝังใช้งานไม่ได้
ผู้ให้บริการที่ไม่ใช่ภายในเครื่องซึ่งกำหนดไว้อย่างชัดเจนจะปฏิเสธโดยค่าเริ่มต้น หากตั้งค่า memorySearch.provider เป็น
ผู้ให้บริการที่ใช้ระบบระยะไกลรายใดรายหนึ่ง เช่น Bedrock, DeepInfra, Gemini, GitHub
Copilot, LM Studio, Mistral, Ollama, OpenAI, Voyage หรือผู้ให้บริการแบบกำหนดเอง
ที่เข้ากันได้กับ OpenAI และผู้ให้บริการนั้นใช้งานไม่ได้ขณะรันไทม์ memory_search
จะส่งคืนผลลัพธ์ว่าใช้งานไม่ได้ แทนที่จะใช้การเรียกคืนแบบ FTS เท่านั้นโดยไม่แจ้งให้ทราบ แก้ไข
การกำหนดค่าผู้ให้บริการ/การตรวจสอบสิทธิ์ เปลี่ยนไปใช้ผู้ให้บริการที่เข้าถึงได้ หรือตั้งค่า
provider: "none" หากต้องการใช้การเรียกคืนแบบ FTS เท่านั้นโดยเจตนา
ID ผู้ให้บริการแบบกำหนดเอง
memorySearch.provider สามารถชี้ไปยังรายการ models.providers.<id> แบบกำหนดเองสำหรับอะแดปเตอร์ผู้ให้บริการเฉพาะหน่วยความจำ เช่น ollama หรือสำหรับ API โมเดลที่เข้ากันได้กับ OpenAI เช่น openai-responses / openai-completions OpenClaw จะแก้ไขเจ้าของ api ของผู้ให้บริการนั้นสำหรับอะแดปเตอร์การฝัง ขณะเดียวกันยังคงรักษา ID ผู้ให้บริการแบบกำหนดเองไว้สำหรับการจัดการปลายทาง การตรวจสอบสิทธิ์ และคำนำหน้าโมเดล ซึ่งช่วยให้การตั้งค่าแบบหลาย GPU หรือหลายโฮสต์สามารถจัดสรรการฝังหน่วยความจำให้กับปลายทางภายในเครื่องที่ระบุได้:
{ models: { providers: { "ollama-5080": { api: "ollama", baseUrl: "http://gpu-box.local:11435", apiKey: "ollama-local", models: [{ id: "qwen3-embedding:0.6b", name: "Qwen3 Embedding 0.6B" }], }, }, }, agents: { defaults: { memorySearch: { provider: "ollama-5080", model: "qwen3-embedding:0.6b", }, }, },}การแก้ไข API key
การฝังระยะไกลต้องใช้ API key ส่วน Bedrock ใช้สายโซ่ข้อมูลประจำตัวเริ่มต้นของ AWS SDK แทน (บทบาทอินสแตนซ์, SSO, คีย์การเข้าถึง หรือ Bedrock API key)
| ผู้ให้บริการ | ตัวแปรสภาพแวดล้อม | คีย์การกำหนดค่า |
|---|---|---|
| Bedrock | สายโซ่ข้อมูลประจำตัว AWS หรือ AWS_BEARER_TOKEN_BEDROCK |
ไม่ต้องใช้ API key |
| DeepInfra | DEEPINFRA_API_KEY |
models.providers.deepinfra.apiKey |
| Gemini | GEMINI_API_KEY |
models.providers.google.apiKey |
| GitHub Copilot | COPILOT_GITHUB_TOKEN, GH_TOKEN, GITHUB_TOKEN |
โปรไฟล์การตรวจสอบสิทธิ์ผ่านการเข้าสู่ระบบด้วยอุปกรณ์ |
| Mistral | MISTRAL_API_KEY |
models.providers.mistral.apiKey |
| Ollama | OLLAMA_API_KEY (ตัวยึดตำแหน่ง) |
-- |
| OpenAI | OPENAI_API_KEY |
models.providers.openai.apiKey |
| Voyage | VOYAGE_API_KEY |
models.providers.voyage.apiKey |
การกำหนดค่าปลายทางระยะไกล
ใช้ provider: "openai-compatible" สำหรับเซิร์ฟเวอร์
/v1/embeddings ทั่วไปที่เข้ากันได้กับ OpenAI ซึ่งไม่ควรสืบทอดข้อมูลประจำตัวการแชต OpenAI ส่วนกลาง
remote.baseUrlstringURL ฐาน API แบบกำหนดเอง
remote.apiKeystringแทนที่ API key
remote.headersobjectส่วนหัว HTTP เพิ่มเติม (ผสานกับค่าเริ่มต้นของผู้ให้บริการ)
{ agents: { defaults: { memorySearch: { provider: "openai-compatible", model: "text-embedding-3-small", remote: { baseUrl: "https://api.example.com/v1/", apiKey: "YOUR_KEY", }, }, }, },}การกำหนดค่าเฉพาะผู้ให้บริการ
Gemini
| คีย์ | ชนิด | ค่าเริ่มต้น | คำอธิบาย |
|---|---|---|---|
model |
string |
gemini-embedding-001 |
รองรับ gemini-embedding-2-preview ด้วย |
outputDimensionality |
number |
3072 |
สำหรับ Embedding 2: 768, 1536 หรือ 3072 |
ชนิดอินพุตที่เข้ากันได้กับ OpenAI
ปลายทางการฝังที่เข้ากันได้กับ OpenAI สามารถเลือกใช้ฟิลด์คำขอ input_type เฉพาะผู้ให้บริการได้ ซึ่งมีประโยชน์สำหรับโมเดลการฝังแบบอสมมาตรที่ต้องใช้ป้ายกำกับต่างกันสำหรับการฝังคำค้นหาและเอกสาร
| คีย์ | ชนิด | ค่าเริ่มต้น | คำอธิบาย |
|---|---|---|---|
inputType |
string |
ไม่ได้ตั้งค่า | input_type ที่ใช้ร่วมกันสำหรับ embedding ของคำค้นและเอกสาร |
queryInputType |
string |
ไม่ได้ตั้งค่า | input_type ขณะค้นหา; แทนที่ inputType |
documentInputType |
string |
ไม่ได้ตั้งค่า | input_type สำหรับดัชนี/เอกสาร; แทนที่ inputType |
{ agents: { defaults: { memorySearch: { provider: "openai-compatible", remote: { baseUrl: "https://embeddings.example/v1", apiKey: "${EMBEDDINGS_API_KEY}", }, model: "asymmetric-embedder", queryInputType: "query", documentInputType: "passage", }, }, },}การเปลี่ยนค่าเหล่านี้ส่งผลต่ออัตลักษณ์ของแคช embedding สำหรับการทำดัชนีแบบแบตช์ของผู้ให้บริการ และควรทำดัชนีหน่วยความจำใหม่เมื่อโมเดลต้นทางตีความป้ายกำกับต่างกัน
Bedrock
การกำหนดค่า embedding ของ Bedrock
Bedrock ใช้สายโซ่ข้อมูลประจำตัวเริ่มต้นของ AWS SDK ร่วมกับโทเค็น bearer ที่ OpenClaw ตรวจสอบ จึงไม่มีการจัดเก็บคีย์ API ไว้ในการกำหนดค่า หาก OpenClaw ทำงานบน EC2 โดยใช้บทบาทอินสแตนซ์ที่เปิดใช้ Bedrock เพียงตั้งค่าผู้ให้บริการและโมเดล:
{ agents: { defaults: { memorySearch: { provider: "bedrock", model: "amazon.titan-embed-text-v2:0", }, }, },}| คีย์ | ชนิด | ค่าเริ่มต้น | คำอธิบาย |
|---|---|---|---|
model |
string |
amazon.titan-embed-text-v2:0 |
ID โมเดล embedding ของ Bedrock ใดก็ได้ |
outputDimensionality |
number |
ค่าเริ่มต้นของโมเดล | สำหรับ Titan V2: 256, 512 หรือ 1024 |
โมเดลที่รองรับ (พร้อมการตรวจหาตระกูลและค่าเริ่มต้นของมิติ):
| ID โมเดล | ผู้ให้บริการ | มิติเริ่มต้น | มิติที่กำหนดค่าได้ |
|---|---|---|---|
amazon.titan-embed-text-v2:0 |
Amazon | 1024 | 256, 512, 1024 |
amazon.titan-embed-text-v1 |
Amazon | 1536 | -- |
amazon.titan-embed-g1-text-02 |
Amazon | 1536 | -- |
amazon.titan-embed-image-v1 |
Amazon | 1024 | -- |
amazon.nova-2-multimodal-embeddings-v1:0 |
Amazon | 1024 | 256, 384, 1024, 3072 |
cohere.embed-english-v3 |
Cohere | 1024 | -- |
cohere.embed-multilingual-v3 |
Cohere | 1024 | -- |
cohere.embed-v4:0 |
Cohere | 1536 | 256, 384, 512, 768, 1024, 1536 |
twelvelabs.marengo-embed-3-0-v1:0 |
TwelveLabs | 512 | -- |
twelvelabs.marengo-embed-2-7-v1:0 |
TwelveLabs | 1024 | -- |
ตัวแปรที่มีส่วนต่อท้ายระบุปริมาณงาน (เช่น amazon.titan-embed-text-v1:2:8k) และ ID โปรไฟล์การอนุมานที่มีคำนำหน้าภูมิภาค (เช่น us.amazon.titan-embed-text-v2:0) จะสืบทอดการกำหนดค่าของโมเดลฐาน
ภูมิภาค: ได้รับการกำหนดตามลำดับนี้: ค่าที่แทนที่ด้วย memorySearch.remote.baseUrl, การกำหนดค่า models.providers.amazon-bedrock.baseUrl, AWS_REGION, AWS_DEFAULT_REGION แล้วจึงใช้ค่าเริ่มต้นเป็น us-east-1
การยืนยันตัวตน: OpenClaw ตรวจสอบ AWS_ACCESS_KEY_ID + AWS_SECRET_ACCESS_KEY หรือ AWS_BEARER_TOKEN_BEDROCK ก่อน จากนั้นจึงใช้สายโซ่ผู้ให้บริการข้อมูลประจำตัวเริ่มต้นมาตรฐานของ AWS SDK ตามลำดับ:
- ตัวแปรสภาพแวดล้อม (
AWS_ACCESS_KEY_ID+AWS_SECRET_ACCESS_KEY) เว้นแต่จะตั้งค่าAWS_PROFILEไว้ด้วย - SSO (เฉพาะเมื่อกำหนดค่าฟิลด์ SSO แล้ว)
- ไฟล์ข้อมูลประจำตัวและการกำหนดค่าที่ใช้ร่วมกัน (
fromIniรวมถึงAWS_PROFILE) - กระบวนการข้อมูลประจำตัว (
credential_processในไฟล์การกำหนดค่า AWS) - ข้อมูลประจำตัวจากโทเค็นข้อมูลประจำตัวเว็บ
- ข้อมูลประจำตัวจากเมทาดาทาของอินสแตนซ์ ECS หรือ EC2
สิทธิ์ IAM: บทบาทหรือผู้ใช้ IAM ต้องมี:
{ "Effect": "Allow", "Action": "bedrock:InvokeModel", "Resource": "*"}เพื่อใช้สิทธิ์เท่าที่จำเป็น ให้จำกัดขอบเขต InvokeModel ไว้ที่โมเดลที่ระบุ:
arn:aws:bedrock:*::foundation-model/amazon.titan-embed-text-v2:0ภายในเครื่อง (GGUF + llama.cpp)
| คีย์ | ชนิด | ค่าเริ่มต้น | คำอธิบาย |
|---|---|---|---|
local.modelPath |
string |
ดาวน์โหลดอัตโนมัติ | พาธไปยังไฟล์โมเดล GGUF |
local.modelCacheDir |
string |
ค่าเริ่มต้นของ node-llama-cpp | ไดเรกทอรีแคชสำหรับโมเดลที่ดาวน์โหลด |
local.contextSize |
number | "auto" |
4096 |
ขนาดหน้าต่างบริบทสำหรับบริบท embedding ค่า 4096 ครอบคลุมชังก์ทั่วไป (128-512 โทเค็น) พร้อมจำกัด VRAM ที่ไม่ใช่น้ำหนัก ลดลงเป็น 1024-2048 บนโฮสต์ที่มีทรัพยากรจำกัด "auto" ใช้ค่าสูงสุดที่โมเดลได้รับการฝึกมา ซึ่งไม่แนะนำสำหรับโมเดลขนาด 8B ขึ้นไป (Qwen3-Embedding-8B: สูงสุด 40 960 โทเค็นอาจเพิ่มการใช้ VRAM เป็น ~32 GB) |
ติดตั้งผู้ให้บริการ llama.cpp อย่างเป็นทางการก่อน: openclaw plugins install @openclaw/llama-cpp-provider
โมเดลเริ่มต้น: embeddinggemma-300m-qat-Q8_0.gguf (~0.6 GB ดาวน์โหลดอัตโนมัติ) เช็กเอาต์ซอร์สยังคงต้องอนุมัติการบิลด์แบบเนทีฟ: pnpm approve-builds แล้วจึง pnpm rebuild node-llama-cpp
ใช้ CLI แบบสแตนด์อโลนเพื่อตรวจสอบพาธผู้ให้บริการเดียวกับที่ Gateway ใช้:
openclaw memory status --deep --agent mainopenclaw memory index --force --agent mainค่า local.contextSize แบบตัวเลขยังใช้ประกอบการจัดวางเลเยอร์ GPU อัตโนมัติของ node-llama-cpp เพื่อให้ใส่ทั้งน้ำหนักโมเดลและบริบท embedding ที่ร้องขอได้พร้อมกัน openclaw memory status --deep รายงานแบ็กเอนด์ llama.cpp, อุปกรณ์, การออฟโหลด, บริบทที่ร้องขอ และข้อเท็จจริงด้านหน่วยความจำพร้อมประทับเวลาเท่าที่ทราบล่าสุดหลังจากรันไทม์โหลดแล้ว; สถานะแบบพาสซีฟจะไม่โหลดโมเดล
ตั้งค่า provider: "local" อย่างชัดเจนสำหรับ embedding จาก GGUF ภายในเครื่อง รองรับ hf: และการอ้างอิงโมเดลผ่าน HTTP(S) สำหรับการกำหนดค่าภายในเครื่องแบบชัดเจน (ผ่านการแก้ไขตำแหน่งโมเดลของ node-llama-cpp) แต่จะไม่เปลี่ยนผู้ให้บริการเริ่มต้น
การหมดเวลาของ embedding แบบอินไลน์
sync.embeddingBatchTimeoutSecondsnumberแทนที่ระยะหมดเวลาสำหรับแบตช์ embedding แบบอินไลน์ระหว่างการทำดัชนีหน่วยความจำ
หากไม่ได้ตั้งค่า จะใช้ค่าเริ่มต้นของผู้ให้บริการ: 600 วินาทีสำหรับผู้ให้บริการภายในเครื่อง/โฮสต์เอง เช่น local, ollama และ lmstudio และ 120 วินาทีสำหรับผู้ให้บริการแบบโฮสต์ เพิ่มค่านี้เมื่อแบตช์ embedding ภายในเครื่องที่ใช้ CPU ทำงานปกติแต่ช้า
ลักษณะการทำดัชนี
ทั้งหมดอยู่ภายใต้ memorySearch.sync เว้นแต่จะระบุไว้:
| คีย์ | ชนิด | ค่าเริ่มต้น | คำอธิบาย |
|---|---|---|---|
onSessionStart |
boolean |
true |
ซิงค์ดัชนีหน่วยความจำเมื่อเซสชันเริ่มต้น |
onSearch |
boolean |
true |
ซิงค์แบบหน่วงเวลาขณะค้นหาหลังตรวจพบการเปลี่ยนแปลงของเนื้อหา |
watch |
boolean |
true |
เฝ้าดูไฟล์หน่วยความจำ (chokidar) และกำหนดเวลาทำดัชนีใหม่เมื่อมีการเปลี่ยนแปลง |
sessions.postCompactionForce |
boolean |
true |
บังคับทำดัชนีเซสชันใหม่หลังการอัปเดตทรานสคริปต์ที่เกิดจาก Compaction |
การกำหนดค่าการค้นหาแบบไฮบริด
ทั้งหมดอยู่ภายใต้ memorySearch.query:
| คีย์ | ชนิด | ค่าเริ่มต้น | คำอธิบาย |
|---|---|---|---|
maxResults |
number |
6 |
จำนวนผลลัพธ์หน่วยความจำสูงสุดที่ส่งคืนก่อนแทรก |
minScore |
number |
0.35 |
คะแนนความเกี่ยวข้องขั้นต่ำสำหรับรวมผลลัพธ์ |
และภายใต้ memorySearch.query.hybrid:
| คีย์ | ชนิด | ค่าเริ่มต้น | คำอธิบาย |
|---|---|---|---|
enabled |
boolean |
true |
เปิดใช้การค้นหาแบบไฮบริด BM25 + เวกเตอร์ |
MMR (ความหลากหลาย)
| คีย์ | ชนิด | ค่าเริ่มต้น | คำอธิบาย |
|---|---|---|---|
mmr.enabled |
boolean |
false |
เปิดใช้การจัดอันดับใหม่ด้วย MMR |
การลดทอนตามเวลา (ความใหม่)
| คีย์ | ชนิด | ค่าเริ่มต้น | คำอธิบาย |
|---|---|---|---|
temporalDecay.enabled |
boolean |
false |
เปิดใช้การเพิ่มคะแนนตามความใหม่ |
ไฟล์ที่ไม่ล้าสมัย (MEMORY.md และไฟล์ที่ไม่มีวันที่ใน memory/) จะไม่ถูกลดทอน
ตัวอย่างฉบับเต็ม
{ agents: { defaults: { memorySearch: { query: { maxResults: 6, minScore: 0.35, hybrid: { mmr: { enabled: true }, temporalDecay: { enabled: true }, }, }, }, }, },}พาธหน่วยความจำเพิ่มเติม
| คีย์ | ชนิด | คำอธิบาย |
|---|---|---|
extraPaths |
string[] |
ไดเรกทอรีหรือไฟล์เพิ่มเติมที่จะทำดัชนี |
{ agents: { defaults: { memorySearch: { extraPaths: ["../team-docs", "/srv/shared-notes"], }, }, },}พาธอาจเป็นพาธสัมบูรณ์หรือสัมพันธ์กับเวิร์กสเปซ ระบบจะสแกนไดเรกทอรีแบบเรียกซ้ำเพื่อค้นหาไฟล์ .md การจัดการลิงก์สัญลักษณ์ขึ้นอยู่กับแบ็กเอนด์ที่ใช้งานอยู่: เอนจินในตัวจะข้ามลิงก์สัญลักษณ์ ขณะที่ QMD จะทำตามพฤติกรรมของตัวสแกน QMD ที่อยู่เบื้องหลัง
สำหรับการค้นหาทรานสคริปต์ข้ามเอเจนต์ที่กำหนดขอบเขตตามเอเจนต์ ให้ใช้ agents.list[].memorySearch.qmd.extraCollections แทน memory.qmd.paths คอลเลกชันเพิ่มเติมเหล่านั้นใช้รูปแบบ { path, name, pattern? } เดียวกัน แต่จะถูกรวมแยกตามเอเจนต์ และสามารถคงชื่อที่ใช้ร่วมกันซึ่งระบุไว้อย่างชัดเจนได้เมื่อพาธชี้ออกนอกเวิร์กสเปซปัจจุบัน หากพาธที่แก้ไขแล้วเดียวกันปรากฏทั้งใน memory.qmd.paths และ memorySearch.qmd.extraCollections QMD จะเก็บรายการแรกและข้ามรายการที่ซ้ำ
หน่วยความจำหลายรูปแบบ (Gemini)
จัดทำดัชนีรูปภาพและเสียงควบคู่กับ Markdown โดยใช้ Gemini Embedding 2:
| คีย์ | ชนิด | ค่าเริ่มต้น | คำอธิบาย |
|---|---|---|---|
multimodal.enabled |
boolean |
false |
เปิดใช้การจัดทำดัชนีหลายรูปแบบ |
multimodal.modalities |
string[] |
-- | ["image"], ["audio"] หรือ ["all"] |
multimodal.maxFileBytes |
number |
10485760 |
ขนาดไฟล์สูงสุดสำหรับการจัดทำดัชนี (10 MiB) |
รูปแบบที่รองรับ: .jpg, .jpeg, .png, .webp, .gif, .heic, .heif (รูปภาพ); .mp3, .wav, .ogg, .opus, .m4a, .aac, .flac (เสียง)
แคช Embedding
| คีย์ | ชนิด | ค่าเริ่มต้น | คำอธิบาย |
|---|---|---|---|
cache.enabled |
boolean |
true |
แคช Embedding ของส่วนข้อความใน SQLite |
ป้องกันไม่ให้สร้าง Embedding ซ้ำสำหรับข้อความที่ไม่มีการเปลี่ยนแปลงระหว่างการจัดทำดัชนีใหม่หรือการอัปเดตทรานสคริปต์
การจัดทำดัชนีแบบแบตช์
| คีย์ | ชนิด | ค่าเริ่มต้น | คำอธิบาย |
|---|---|---|---|
remote.nonBatchConcurrency |
number |
4 |
Embedding แบบอินไลน์ที่ทำงานขนานกัน |
remote.batch.enabled |
boolean |
false |
เปิดใช้ API การสร้าง Embedding แบบแบตช์ |
remote.batch.concurrency |
number |
2 |
งานแบตช์ที่ทำงานขนานกัน |
remote.batch.wait |
boolean |
true |
รอให้แบตช์เสร็จสมบูรณ์ |
remote.batch.pollIntervalMs |
number |
2000 |
ช่วงเวลาการสำรวจสถานะ |
remote.batch.timeoutMinutes |
number |
60 |
ระยะหมดเวลาของแบตช์ |
ใช้ได้กับ gemini, openai และ voyage โดยทั่วไปแบตช์ของ OpenAI จะเร็วที่สุดและมีค่าใช้จ่ายต่ำที่สุดสำหรับการเติมข้อมูลย้อนหลังขนาดใหญ่
remote.nonBatchConcurrency ควบคุมการเรียกสร้าง Embedding แบบอินไลน์ที่ผู้ให้บริการในเครื่อง/โฮสต์เองและผู้ให้บริการแบบโฮสต์ใช้ เมื่อ API แบบแบตช์ของผู้ให้บริการไม่ได้ทำงานอยู่ Ollama มีค่าเริ่มต้นเป็น 1 สำหรับการจัดทำดัชนีแบบไม่ใช้แบตช์ เพื่อหลีกเลี่ยงการสร้างภาระมากเกินไปให้แก่โฮสต์ในเครื่องขนาดเล็ก ให้ตั้งค่าที่สูงขึ้นบนเครื่องที่มีขนาดใหญ่กว่า
ค่านี้แยกจาก sync.embeddingBatchTimeoutSeconds ซึ่งควบคุมระยะหมดเวลาสำหรับการเรียกสร้าง Embedding แบบอินไลน์
การค้นหาหน่วยความจำเซสชัน (ทดลอง)
จัดทำดัชนีทรานสคริปต์ของเซสชันและแสดงผ่าน memory_search:
| คีย์ | ชนิด | ค่าเริ่มต้น | คำอธิบาย |
|---|---|---|---|
experimental.sessionMemory |
boolean |
false |
เปิดใช้การจัดทำดัชนีเซสชัน |
sources |
string[] |
["memory"] |
เพิ่ม "sessions" เพื่อรวมทรานสคริปต์ |
sync.sessions.deltaBytes |
number |
100000 |
เกณฑ์จำนวนไบต์สำหรับการจัดทำดัชนีใหม่ |
sync.sessions.deltaMessages |
number |
50 |
เกณฑ์จำนวนข้อความสำหรับการจัดทำดัชนีใหม่ |
การค้นหาทรานสคริปต์เซสชันทั่วไปที่โมเดลเรียกใช้จะเป็นไปตาม
tools.sessions.visibility การมองเห็นเริ่มต้นแบบ
tree จะเปิดให้เห็นเซสชันปัจจุบัน เซสชันที่เซสชันนี้สร้างขึ้น และ
เซสชันกลุ่มของเอเจนต์เดียวกันที่เฝ้าดูผ่านการรับรู้กลุ่มโดยรอบ ส่วนเซสชันอื่นที่
ไม่เกี่ยวข้องต้องใช้การมองเห็นแบบ agent (หรือ all เฉพาะเมื่อจำเป็นต้อง
เรียกคืนข้ามเอเจนต์ด้วย และนโยบายระหว่างเอเจนต์อนุญาต)
rememberAcrossConversations ไม่ได้ขยายการตั้งค่านั้น แต่ให้
การอนุญาตเฉพาะรันไทม์ที่แยกต่างหาก ซึ่งจำกัดไว้เฉพาะทรานสคริปต์ส่วนตัว
ของเอเจนต์เดียวกันระหว่างรอบ Active Memory ที่มีขอบเขตจำกัด
ตัวอย่างด้านล่างวางการตั้งค่าเหล่านี้ไว้ภายใต้ agents.defaults นอกจากนี้ยังสามารถ
ใช้การตั้งค่า memorySearch ที่เทียบเท่าในการแทนค่าระดับเอเจนต์ เมื่อควรมีเพียงเอเจนต์เดียว
ที่จัดทำดัชนีและค้นหาทรานสคริปต์เซสชัน
สำหรับการเรียกคืนจาก Gateway ไปยังข้อความส่วนตัวภายในเอเจนต์เดียวกัน:
แบ็กเอนด์ในตัว
{ agents: { defaults: { memorySearch: { experimental: { sessionMemory: true }, sources: ["memory", "sessions"], }, }, }, tools: { sessions: { visibility: "agent" }, },}แบ็กเอนด์ QMD
{ agents: { defaults: { memorySearch: { experimental: { sessionMemory: true }, sources: ["memory", "sessions"], }, }, }, memory: { backend: "qmd", qmd: { sessions: { enabled: true }, }, }, tools: { sessions: { visibility: "agent" }, },}เมื่อใช้ QMD ค่า agents.defaults.memorySearch.experimental.sessionMemory และ
sources: ["sessions"] เพียงอย่างเดียวจะไม่ส่งออกทรานสคริปต์ไปยัง QMD ต้องตั้งค่า
memory.qmd.sessions.enabled: true ด้วย ข้อยกเว้นคือการตั้งค่าระดับสูงกว่าอย่าง
rememberAcrossConversations: true ซึ่งจะเปิดใช้การส่งออกเซสชัน QMD
ที่จำเป็นสำหรับเอเจนต์นั้นโดยนัย การส่งออกโดยนัยยังคงเป็นส่วนตัว:
จะใช้ตำแหน่งส่งออกภายในเริ่มต้นเสมอ (sessions.exportDir ที่กำหนดค่าไว้
ใช้กับการส่งออกโดยชัดแจ้งเท่านั้น) จะถูกค้นหาเฉพาะระหว่างการเรียกคืนข้ามบทสนทนา
ของเอเจนต์นั้น และ memory_get ทั่วไปไม่สามารถอ่านได้ การตั้งค่า
memory.qmd.sessions.enabled: true โดยชัดแจ้งจะคงลักษณะการทำงานเดิม และทำให้
ทรานสคริปต์ที่ส่งออกเป็นส่วนหนึ่งของคลังหน่วยความจำทั่วไป
การเร่งความเร็วเวกเตอร์ SQLite (sqlite-vec)
| คีย์ | ชนิด | ค่าเริ่มต้น | คำอธิบาย |
|---|---|---|---|
store.vector.enabled |
boolean |
true |
ใช้ sqlite-vec สำหรับคิวรีเวกเตอร์ |
store.vector.extensionPath |
string |
bundled | แทนที่พาธ sqlite-vec |
เมื่อ sqlite-vec ใช้งานไม่ได้ OpenClaw จะถอยกลับไปใช้การคำนวณความคล้ายคลึงแบบโคไซน์ภายในกระบวนการโดยอัตโนมัติ
ที่จัดเก็บดัชนี
ดัชนีหน่วยความจำในตัวจะอยู่ในฐานข้อมูล SQLite ของ OpenClaw สำหรับแต่ละเอเจนต์ที่
agents/<agentId>/agent/openclaw-agent.sqlite
| คีย์ | ชนิด | ค่าเริ่มต้น | คำอธิบาย |
|---|---|---|---|
store.fts.tokenizer |
string |
unicode61 |
ตัวตัดคำ FTS5 (unicode61 หรือ trigram) |
การกำหนดค่าแบ็กเอนด์ QMD
ตั้งค่า memory.backend = "qmd" เพื่อเปิดใช้ การตั้งค่า QMD ทั้งหมดอยู่ภายใต้ memory.qmd:
| คีย์ | ชนิด | ค่าเริ่มต้น | คำอธิบาย |
|---|---|---|---|
command |
string |
qmd |
พาธไฟล์ปฏิบัติการ QMD; ตั้งเป็นพาธสัมบูรณ์เมื่อ PATH ของบริการแตกต่างจากเชลล์ของคุณ |
searchMode |
string |
search |
คำสั่งค้นหา: search, vsearch, query |
rerank |
boolean |
-- | ตั้งเป็น false ร่วมกับ searchMode: "query" และ QMD 2.1+ เพื่อข้ามการจัดอันดับใหม่ของ QMD |
includeDefaultMemory |
boolean |
true |
จัดทำดัชนี MEMORY.md + memory/**/*.md โดยอัตโนมัติ |
paths[] |
array |
-- | พาธเพิ่มเติม: { name, path, pattern? } |
sessions.enabled |
boolean |
false |
ส่งออกทรานสคริปต์เซสชันไปยัง QMD |
sessions.retentionDays |
number |
-- | ระยะเวลาการเก็บรักษาทรานสคริปต์ |
sessions.exportDir |
string |
-- | ไดเรกทอรีส่งออก |
searchMode: "search" ใช้เฉพาะการค้นหาเชิงคำศัพท์/BM25 เท่านั้น OpenClaw จะไม่ดำเนินการตรวจสอบความพร้อมของเวกเตอร์เชิงความหมายหรือบำรุงรักษา Embedding ของ QMD สำหรับโหมดดังกล่าว รวมถึงระหว่าง memory status --deep; ส่วน vsearch และ query ยังคงต้องใช้ความพร้อมของเวกเตอร์และ Embedding ของ QMD
rerank: false เปลี่ยนเฉพาะโหมด query ของ QMD และต้องใช้ QMD 2.1 หรือใหม่กว่า ในโหมด CLI โดยตรง OpenClaw จะส่ง --no-rerank; ในโหมด MCP ที่รองรับโดย mcporter จะส่ง rerank: false ไปยังเครื่องมือคิวรีแบบรวมของ QMD เว้นว่างไว้เพื่อใช้ลักษณะการจัดอันดับคิวรีใหม่ตามค่าเริ่มต้นของ QMD
OpenClaw เลือกใช้รูปแบบคอลเลกชันและคิวรี MCP ปัจจุบันของ QMD แต่ยังคงรองรับ QMD รุ่นเก่าโดยลองใช้แฟล็กรูปแบบคอลเลกชันที่เข้ากันได้และชื่อเครื่องมือ MCP รุ่นเก่าเมื่อจำเป็น เมื่อ QMD ประกาศว่ารองรับตัวกรองหลายคอลเลกชัน ระบบจะค้นหาคอลเลกชันจากแหล่งเดียวกันด้วยกระบวนการ QMD เดียว ส่วนบิลด์ QMD รุ่นเก่าจะยังคงใช้เส้นทางความเข้ากันได้แยกตามคอลเลกชัน แหล่งเดียวกันหมายถึงคอลเลกชันหน่วยความจำแบบคงทน (ไฟล์หน่วยความจำเริ่มต้นรวมกับพาธแบบกำหนดเอง) จะถูกจัดกลุ่มเข้าด้วยกัน ขณะที่คอลเลกชันทรานสคริปต์เซสชันยังคงเป็นอีกกลุ่มแยกต่างหาก เพื่อให้การกระจายแหล่งข้อมูลยังคงมีข้อมูลนำเข้าจากทั้งสองแหล่ง
การผสานรวม mcporter
ทั้งหมดอยู่ภายใต้ memory.qmd.mcporter โดยกำหนดเส้นทางการค้นหา QMD ผ่านดีมอน MCP mcporter ที่ทำงานต่อเนื่อง แทนการสร้าง qmd ต่อคิวรี ซึ่งช่วยลดโอเวอร์เฮดจากการเริ่มต้นแบบเย็นสำหรับโมเดลขนาดใหญ่
| คีย์ | ชนิด | ค่าเริ่มต้น | คำอธิบาย |
|---|---|---|---|
enabled |
boolean |
false |
กำหนดเส้นทางการเรียก QMD ผ่าน mcporter แทนการสร้าง qmd ต่อคำขอ |
serverName |
string |
qmd |
ชื่อเซิร์ฟเวอร์ mcporter ที่เรียกใช้ qmd mcp ร่วมกับ lifecycle: keep-alive |
startDaemon |
boolean |
true |
เริ่มดีมอน mcporter โดยอัตโนมัติเมื่อ enabled เป็น true |
ต้องติดตั้ง mcporter และให้อยู่ใน PATH พร้อมทั้งกำหนดค่าเซิร์ฟเวอร์ mcporter ที่เรียกใช้ qmd mcp ให้ปิดใช้งานไว้สำหรับการตั้งค่าในเครื่องแบบเรียบง่าย ซึ่งยอมรับต้นทุนการสร้างกระบวนการต่อคิวรีได้
กำหนดการอัปเดต
| คีย์ | ชนิด | ค่าเริ่มต้น | คำอธิบาย |
|---|---|---|---|
update.interval |
string |
5m |
ช่วงเวลาการรีเฟรช |
update.debounceMs |
number |
15000 |
หน่วงการเปลี่ยนแปลงไฟล์เพื่อรวมเหตุการณ์ |
update.onBoot |
boolean |
true |
รีเฟรชเมื่อเปิดตัวจัดการ QMD ที่ทำงานระยะยาว ตั้งค่าเป็น false เพื่อข้ามการอัปเดตทันทีขณะบูต |
update.startup |
string |
off |
การเริ่มต้น QMD เมื่อ Gateway เริ่มทำงานซึ่งกำหนดหรือไม่ก็ได้: off, idle หรือ immediate |
update.startupDelayMs |
number |
120000 |
ระยะหน่วงก่อนการรีเฟรช startup: "idle" ทำงาน |
update.waitForBootSync |
boolean |
false |
ระงับการเปิดตัวจัดการจนกว่าการรีเฟรชครั้งแรกจะเสร็จสมบูรณ์ |
update.embedInterval |
string |
60m |
รอบเวลาการฝังข้อมูลที่แยกต่างหาก |
update.commandTimeoutMs |
number |
30000 |
หมดเวลาสำหรับคำสั่งบำรุงรักษา QMD (แสดงรายการ/เพิ่มคอลเลกชัน) |
update.updateTimeoutMs |
number |
120000 |
หมดเวลาสำหรับแต่ละรอบ qmd update |
update.embedTimeoutMs |
number |
120000 |
หมดเวลาสำหรับแต่ละรอบ qmd embed |
ขีดจำกัด
| คีย์ | ชนิด | ค่าเริ่มต้น | คำอธิบาย |
|---|---|---|---|
limits.maxResults |
number |
4 |
จำนวนผลการค้นหาสูงสุด |
limits.maxSnippetChars |
number |
450 |
จำกัดความยาวของข้อความตัดตอน |
limits.maxInjectedChars |
number |
2200 |
จำกัดจำนวนอักขระทั้งหมดที่แทรก |
limits.timeoutMs |
number |
4000 |
ระยะหมดเวลาของคำสั่ง QMD ระหว่างการค้นหาที่ใช้ QMD รวมถึง memory_search; งานตั้งค่า ซิงค์ ทางเลือกสำรองในตัว และงานเสริมยังคงใช้กำหนดเวลาสิ้นสุดเริ่มต้นของเครื่องมือ |
ขอบเขต
ควบคุมว่าเซสชันใดรับผลการค้นหา QMD ได้ ใช้สคีมาเดียวกับ session.sendPolicy:
{ memory: { qmd: { scope: { default: "deny", rules: [{ action: "allow", match: { chatType: "direct" } }], }, }, },}ค่าเริ่มต้นที่จัดส่งอนุญาตเฉพาะ DM/โดยตรง และปฏิเสธกลุ่มกับช่องทางชนิดอื่น match.keyPrefix จับคู่กับคีย์เซสชันที่ปรับเป็นรูปแบบมาตรฐานแล้ว ส่วน match.rawKeyPrefix จับคู่กับคีย์ดิบซึ่งรวม agent:<id>:
การอ้างอิง
memory.citations มีผลกับแบ็กเอนด์ทั้งหมด:
| ค่า | ลักษณะการทำงาน |
|---|---|
auto (ค่าเริ่มต้น) |
ใส่ส่วนท้าย Source: <path#line> ในข้อความตัดตอน |
on |
ใส่ส่วนท้ายเสมอ |
off |
ไม่ใส่ส่วนท้าย (เส้นทางยังคงถูกส่งให้เอเจนต์ภายใน) |
เมื่อเปิดใช้การเริ่มต้น QMD ขณะ Gateway เริ่มทำงาน OpenClaw จะเริ่ม QMD เฉพาะสำหรับเอเจนต์ที่เข้าเกณฑ์ หาก update.onBoot เป็น true และไม่ได้กำหนดการบำรุงรักษาตามช่วงเวลาหรือการฝังข้อมูล การเริ่มทำงานจะใช้ตัวจัดการแบบครั้งเดียวสำหรับการรีเฟรชขณะบูตแล้วปิดตัวจัดการ หากกำหนดช่วงเวลาอัปเดตหรือฝังข้อมูล การเริ่มทำงานจะเปิดตัวจัดการ QMD ที่ทำงานระยะยาวเพื่อให้รับผิดชอบตัวเฝ้าดูและตัวจับเวลาตามช่วงเวลา โดย update.onBoot: false จะข้ามเฉพาะการรีเฟรชทันทีขณะบูต
ตัวอย่าง QMD แบบสมบูรณ์
{ memory: { backend: "qmd", citations: "auto", qmd: { includeDefaultMemory: true, update: { interval: "5m", debounceMs: 15000 }, limits: { maxResults: 4, timeoutMs: 4000 }, scope: { default: "deny", rules: [{ action: "allow", match: { chatType: "direct" } }], }, paths: [{ name: "docs", path: "~/notes", pattern: "**/*.md" }], }, },}Dreaming
กำหนดค่า Dreaming ภายใต้ plugins.entries.memory-core.config.dreaming ไม่ใช่ภายใต้ agents.defaults.memorySearch
Dreaming ทำงานเป็นการกวาดตามกำหนดการหนึ่งครั้ง และใช้เฟส light/deep/REM ภายในเป็นรายละเอียดการนำไปใช้
สำหรับพฤติกรรมเชิงแนวคิดและคำสั่งเครื่องหมายทับ โปรดดู Dreaming
การตั้งค่าของผู้ใช้
| คีย์ | ชนิด | ค่าเริ่มต้น | คำอธิบาย |
|---|---|---|---|
enabled |
boolean |
false |
เปิดหรือปิด Dreaming ทั้งหมด |
frequency |
string |
0 3 * * * |
รอบเวลา Cron ซึ่งกำหนดหรือไม่ก็ได้สำหรับการกวาด Dreaming แบบเต็ม |
model |
string |
โมเดลเริ่มต้น | การแทนที่โมเดลของเอเจนต์ย่อย Dream Diary ซึ่งกำหนดหรือไม่ก็ได้ |
phases.deep.maxPromotedSnippetTokens |
number |
160 |
จำนวนโทเค็นโดยประมาณสูงสุดที่เก็บไว้จากแต่ละข้อความตัดตอนการระลึกระยะสั้นซึ่งเลื่อนระดับไปยัง MEMORY.md; ข้อมูลเมตาที่มาที่ไปยังคงมองเห็นได้ |
ตัวอย่าง
{ plugins: { entries: { "memory-core": { subagent: { allowModelOverride: true, allowedModels: ["anthropic/claude-sonnet-4-6"], }, config: { dreaming: { enabled: true, frequency: "0 3 * * *", model: "anthropic/claude-sonnet-4-6", }, }, }, }, },}