Technical reference
เอกสารอ้างอิงการกำหนดค่าหน่วยความจำ
หน้านี้แสดงตัวเลือกการกำหนดค่าทั้งหมดสำหรับการค้นหาหน่วยความจำของ OpenClaw สำหรับภาพรวมเชิงแนวคิด โปรดดู:
วิธีการทำงานของหน่วยความจำ
แบ็กเอนด์ SQLite เริ่มต้น
ไซด์คาร์ที่ให้ความสำคัญกับการทำงานในเครื่อง
ไปป์ไลน์การค้นหาและการปรับแต่ง
เอเจนต์ย่อยด้านหน่วยความจำสำหรับเซสชันแบบโต้ตอบ
การตั้งค่าการค้นหาหน่วยความจำทั้งหมดอยู่ภายใต้ agents.defaults.memorySearch ใน openclaw.json (หรือกำหนดค่าแทนที่รายเอเจนต์ด้วย agents.list[].memorySearch) เว้นแต่จะระบุไว้เป็นอย่างอื่น
การเลือกผู้ให้บริการ
| คีย์ | ชนิด | ค่าเริ่มต้นของผู้ให้บริการ | คำอธิบาย |
|---|---|---|---|
enabled |
boolean |
true |
เปิดหรือปิดการค้นหาหน่วยความจำ |
provider |
string |
"openai" |
รหัสอะแดปเตอร์การฝัง เช่น bedrock, deepinfra, gemini, github-copilot, local, mistral, ollama, openai, openai-compatible หรือ voyage; อาจเป็น models.providers.<id> ที่กำหนดค่าไว้และมี api ชี้ไปยังอะแดปเตอร์การฝังหน่วยความจำหรือ API โมเดลที่เข้ากันได้กับ OpenAI ก็ได้ |
model |
string |
ค่าเริ่มต้นของผู้ให้บริการ | ชื่อโมเดลการฝัง |
fallback |
string |
"none" |
รหัสอะแดปเตอร์สำรองเมื่ออะแดปเตอร์หลักล้มเหลว |
เมื่อไม่ได้ตั้งค่า 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 เท่านั้นโดยเจตนา
รหัสผู้ให้บริการแบบกำหนดเอง
memorySearch.provider สามารถชี้ไปยังรายการ models.providers.<id> แบบกำหนดเองสำหรับอะแดปเตอร์ผู้ให้บริการเฉพาะหน่วยความจำ เช่น ollama หรือสำหรับ API โมเดลที่เข้ากันได้กับ OpenAI เช่น openai-responses / openai-completions OpenClaw จะแก้ไขเจ้าของ api ของผู้ให้บริการนั้นสำหรับอะแดปเตอร์การฝัง พร้อมคงรหัสผู้ให้บริการแบบกำหนดเองไว้สำหรับการจัดการปลายทาง การยืนยันตัวตน และคำนำหน้าโมเดล ซึ่งช่วยให้การตั้งค่าหลาย 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
การฝังระยะไกลต้องใช้คีย์ API แต่ Bedrock ใช้ห่วงโซ่ข้อมูลประจำตัวเริ่มต้นของ AWS SDK แทน (บทบาทอินสแตนซ์, SSO, คีย์การเข้าถึง หรือคีย์ API ของ Bedrock)
| ผู้ให้บริการ | ตัวแปรสภาพแวดล้อม | คีย์การกำหนดค่า |
|---|---|---|
| Bedrock | ห่วงโซ่ข้อมูลประจำตัว AWS หรือ AWS_BEARER_TOKEN_BEDROCK |
ไม่ต้องใช้คีย์ API |
| 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 แทน
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 ที่ใช้ร่วมกันสำหรับการฝังคำค้นและเอกสาร |
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", }, }, },}การเปลี่ยนค่าเหล่านี้ส่งผลต่ออัตลักษณ์แคชการฝังสำหรับการจัดทำดัชนีแบบกลุ่มของผู้ให้บริการ และควรจัดทำดัชนีหน่วยความจำใหม่หลังจากนั้น เมื่อโมเดลต้นทางตีความป้ายกำกับแตกต่างกัน
Bedrock
การกำหนดค่าการฝัง Bedrock
Bedrock ใช้ห่วงโซ่ข้อมูลประจำตัวเริ่มต้นของ AWS SDK ร่วมกับโทเค็นผู้ถือที่ 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 |
รหัสโมเดลการฝัง 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 |
ขนาดหน้าต่างบริบทสำหรับบริบทการฝังข้อมูล ค่า 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 เพื่อให้น้ำหนักโมเดลและบริบทการฝังข้อมูลที่ร้องขอถูกจัดสรรร่วมกันได้ openclaw memory status --deep รายงานแบ็กเอนด์ llama.cpp, อุปกรณ์, การถ่ายโอนภาระ, บริบทที่ร้องขอ และข้อมูลหน่วยความจำพร้อมการประทับเวลาที่ทราบล่าสุดหลังจากรันไทม์โหลดแล้ว สถานะแบบพาสซีฟจะไม่โหลดโมเดล
ตั้งค่า provider: "local" อย่างชัดเจนสำหรับการฝังข้อมูล GGUF ภายในเครื่อง การอ้างอิงโมเดลแบบ hf: และ HTTP(S) รองรับในการกำหนดค่าภายในเครื่องแบบชัดเจน (ผ่านการแก้ไขโมเดลของ node-llama-cpp) แต่จะไม่เปลี่ยนผู้ให้บริการเริ่มต้น
ระยะหมดเวลาของการฝังข้อมูลแบบอินไลน์
sync.embeddingBatchTimeoutSecondsnumberเขียนทับระยะหมดเวลาสำหรับชุดการฝังข้อมูลแบบอินไลน์ระหว่างการทำดัชนีหน่วยความจำ
เมื่อไม่ได้ตั้งค่า จะใช้ค่าเริ่มต้นของผู้ให้บริการ: 600 วินาทีสำหรับผู้ให้บริการภายในเครื่อง/โฮสต์เอง เช่น local, ollama และ lmstudio และ 120 วินาทีสำหรับผู้ให้บริการแบบโฮสต์ เพิ่มค่านี้เมื่อชุดการฝังข้อมูลภายในเครื่องที่ใช้ CPU ประมวลผลทำงานปกติแต่ช้า
ลักษณะการทำงานของการทำดัชนี
ทั้งหมดอยู่ภายใต้ memorySearch.sync เว้นแต่จะระบุไว้เป็นอย่างอื่น:
| คีย์ | ชนิด | ค่าเริ่มต้น | คำอธิบาย |
|---|---|---|---|
onSessionStart |
boolean |
true |
ซิงค์ดัชนีหน่วยความจำเมื่อเซสชันเริ่มต้น |
onSearch |
boolean |
true |
ซิงค์แบบหน่วงเวลาเมื่อค้นหาหลังจากตรวจพบการเปลี่ยนแปลงเนื้อหา |
watch |
boolean |
true |
เฝ้าดูไฟล์หน่วยความจำ (chokidar) และกำหนดเวลาทำดัชนีใหม่เมื่อมีการเปลี่ยนแปลง |
watchDebounceMs |
number |
1500 |
ช่วงเวลาดีบาวซ์สำหรับรวมเหตุการณ์เฝ้าดูไฟล์ที่เกิดขึ้นอย่างรวดเร็ว |
intervalMinutes |
number |
0 |
ช่วงเวลาการทำดัชนีใหม่เป็นระยะในหน่วยนาที (0 หมายถึงปิดใช้งาน) |
sessions.postCompactionForce |
boolean |
true |
บังคับทำดัชนีเซสชันใหม่หลังการอัปเดตบทถอดความที่เกิดจาก Compaction |
chunking.tokensnumberขนาดส่วนย่อยในหน่วยโทเค็นที่ใช้เมื่อแบ่งแหล่งข้อมูลหน่วยความจำก่อนสร้างเวกเตอร์ฝังตัว (ค่าเริ่มต้น: 400)
chunking.overlapnumberจำนวนโทเค็นที่ซ้อนทับกันระหว่างส่วนย่อยที่อยู่ติดกัน เพื่อรักษาบริบทบริเวณขอบเขตการแบ่ง (ค่าเริ่มต้น: 80)
การกำหนดค่าการค้นหาแบบผสม
ทั้งหมดอยู่ภายใต้ memorySearch.query:
| คีย์ | ชนิด | ค่าเริ่มต้น | คำอธิบาย |
|---|---|---|---|
maxResults |
number |
6 |
จำนวนผลลัพธ์หน่วยความจำสูงสุดที่ส่งคืนก่อนแทรกข้อมูล |
minScore |
number |
0.35 |
คะแนนความเกี่ยวข้องขั้นต่ำสำหรับรวมผลลัพธ์ |
และภายใต้ memorySearch.query.hybrid:
| คีย์ | ชนิด | ค่าเริ่มต้น | คำอธิบาย |
|---|---|---|---|
enabled |
boolean |
true |
เปิดใช้การค้นหาแบบผสม BM25 + เวกเตอร์ |
vectorWeight |
number |
0.7 |
น้ำหนักของคะแนนเวกเตอร์ (0-1) |
textWeight |
number |
0.3 |
น้ำหนักของคะแนน BM25 (0-1) |
candidateMultiplier |
number |
4 |
ตัวคูณขนาดกลุ่มรายการที่เป็นตัวเลือก |
MMR (ความหลากหลาย)
| คีย์ | ชนิด | ค่าเริ่มต้น | คำอธิบาย |
|---|---|---|---|
mmr.enabled |
boolean |
false |
เปิดใช้การจัดอันดับใหม่ด้วย MMR |
mmr.lambda |
number |
0.7 |
0 = ความหลากหลายสูงสุด, 1 = ความเกี่ยวข้องสูงสุด |
การลดทอนตามเวลา (ความใหม่)
| คีย์ | ชนิด | ค่าเริ่มต้น | คำอธิบาย |
|---|---|---|---|
temporalDecay.enabled |
boolean |
false |
เปิดใช้การเพิ่มคะแนนตามความใหม่ |
temporalDecay.halfLifeDays |
number |
30 |
คะแนนลดลงครึ่งหนึ่งทุก N วัน |
ไฟล์ที่มีเนื้อหาใช้ได้เสมอ (MEMORY.md และไฟล์ที่ไม่มีวันที่ใน memory/) จะไม่มีการลดทอนคะแนน
ตัวอย่างฉบับเต็ม
{ agents: { defaults: { memorySearch: { query: { maxResults: 6, minScore: 0.35, hybrid: { vectorWeight: 0.7, textWeight: 0.3, mmr: { enabled: true, lambda: 0.7 }, temporalDecay: { enabled: true, halfLifeDays: 30 }, }, }, }, }, },}เส้นทางหน่วยความจำเพิ่มเติม
| คีย์ | ชนิด | คำอธิบาย |
|---|---|---|
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 |
cache.maxEntries |
number |
ไม่ได้ตั้งค่า | ขีดจำกัดสูงสุดโดยประมาณของ Embedding ที่แคชไว้ |
ป้องกันการสร้าง Embedding ซ้ำสำหรับข้อความที่ไม่มีการเปลี่ยนแปลงระหว่างการจัดทำดัชนีใหม่หรือการอัปเดตบทถอดเสียง ปล่อย maxEntries ไว้โดยไม่ตั้งค่าสำหรับแคชแบบไม่จำกัด หรือกำหนดค่าเมื่อการเพิ่มขึ้นของพื้นที่ดิสก์สำคัญกว่าความเร็วสูงสุดในการจัดทำดัชนีใหม่ เมื่อกำหนดค่าแล้ว รายการที่เก่าที่สุด (ตามเวลาที่อัปเดตล่าสุด) จะถูกลบออกก่อนเมื่อแคชเกินขีดจำกัด
การจัดทำดัชนีแบบแบตช์
| คีย์ | ชนิด | ค่าเริ่มต้น | คำอธิบาย |
|---|---|---|---|
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 จะแสดงเฉพาะเซสชันปัจจุบันและเซสชันที่เซสชันนี้สร้างขึ้นเท่านั้น หากต้องการ
เรียกคืนเซสชันที่ไม่เกี่ยวข้องกันซึ่งดำเนินการโดยเอเจนต์เดียวกันและ Gateway เป็นผู้ส่งงานจากอีก
เซสชันหนึ่ง เช่น DM ให้ขยายการมองเห็นเป็น agent โดยตั้งใจ (หรือใช้ all เฉพาะ
เมื่อจำเป็นต้องเรียกคืนข้ามเอเจนต์ด้วย และนโยบายระหว่างเอเจนต์อนุญาต)
ตัวอย่างด้านล่างวางการตั้งค่าเหล่านี้ไว้ภายใต้ agents.defaults นอกจากนี้ คุณยังสามารถ
ใช้การตั้งค่า memorySearch ที่เทียบเท่ากันในการกำหนดค่าทับสำหรับแต่ละเอเจนต์ เมื่อควรมีเพียง
เอเจนต์เดียวที่จัดทำดัชนีและค้นหาบทถอดเสียงของเซสชัน
สำหรับการเรียกคืนจาก Gateway ไปยัง DM ภายในเอเจนต์เดียวกัน:
แบ็กเอนด์ในตัว
{ 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 เพิ่มเติมด้วย
การเร่งความเร็วเวกเตอร์ด้วย SQLite (sqlite-vec)
| คีย์ | ชนิด | ค่าเริ่มต้น | คำอธิบาย |
|---|---|---|---|
store.vector.enabled |
boolean |
true |
ใช้ sqlite-vec สำหรับการสืบค้นเวกเตอร์ |
store.vector.extensionPath |
string |
รวมมาให้ | แทนที่พาธของ 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 จะไม่เรียกใช้การตรวจสอบความพร้อมของเวกเตอร์เชิงความหมายหรือการบำรุงรักษาเอ็มเบดดิงของ QMD สำหรับโหมดนี้ รวมถึงระหว่าง memory status --deep; ส่วน vsearch และ query ยังคงต้องใช้ความพร้อมของเวกเตอร์และเอ็มเบดดิงจาก 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 schedule
| คีย์ | ชนิด | ค่าเริ่มต้น | คำอธิบาย |
|---|---|---|---|
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
| คีย์ | ชนิด | ค่าเริ่มต้น | คำอธิบาย |
|---|---|---|---|
limits.maxResults |
number |
4 |
จำนวนผลการค้นหาสูงสุด |
limits.maxSnippetChars |
number |
450 |
จำกัดความยาวของข้อความตัดตอน |
limits.maxInjectedChars |
number |
2200 |
จำกัดจำนวนอักขระที่แทรกทั้งหมด |
limits.timeoutMs |
number |
4000 |
ระยะหมดเวลาของการค้นหา |
Scope
ควบคุมว่าเซสชันใดสามารถรับผลการค้นหาจาก 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 เป็นจริงและไม่ได้กำหนดการบำรุงรักษาตามช่วงเวลา/การฝังข้อมูลไว้ การเริ่มต้นระบบจะใช้ตัวจัดการแบบทำงานครั้งเดียวสำหรับการรีเฟรชตอนบูต แล้วปิดตัวจัดการนั้น หากกำหนดช่วงเวลาการอัปเดตหรือการฝังข้อมูลไว้ การเริ่มต้นระบบจะเปิดตัวจัดการ 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 ทำงานเป็นการกวาดตามกำหนดเวลาเพียงครั้งเดียว และใช้ระยะเบา/ลึก/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", }, }, }, }, },}