Technical reference

ข้อมูลอ้างอิงการกำหนดค่าหน่วยความจำ

หน้านี้แสดงตัวเลือกการกำหนดค่าทั้งหมดสำหรับการค้นหาหน่วยความจำของ OpenClaw สำหรับภาพรวมเชิงแนวคิด โปรดดู:

การตั้งค่าการค้นหาหน่วยความจำทั้งหมดอยู่ภายใต้ agents.defaults.memorySearch ใน openclaw.json (หรือการแทนที่ agents.list[].memorySearch รายเอเจนต์) เว้นแต่จะระบุไว้เป็นอย่างอื่น


จดจำข้ามบทสนทนา

คีย์ ชนิด ค่าเริ่มต้น คำอธิบาย
rememberAcrossConversations boolean เปิดสำหรับการติดตั้งส่วนบุคคล; ปิดเมื่อกำหนดการแยก DM ใช้บริบทที่เกี่ยวข้องจากบทสนทนาส่วนตัวอื่นที่ระบบรู้จักของเอเจนต์นี้

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

json5
{  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 หรือหลายโฮสต์สามารถจัดสรรการฝังหน่วยความจำให้กับปลายทางภายในเครื่องที่ระบุได้:

json5
{  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.baseUrlstring

URL ฐาน API แบบกำหนดเอง

remote.apiKeystring

แทนที่ API key

remote.headersobject

ส่วนหัว HTTP เพิ่มเติม (ผสานกับค่าเริ่มต้นของผู้ให้บริการ)

json5
{  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
json5
{  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 เพียงตั้งค่าผู้ให้บริการและโมเดล:

json5
{  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 ตามลำดับ:

  1. ตัวแปรสภาพแวดล้อม (AWS_ACCESS_KEY_ID + AWS_SECRET_ACCESS_KEY) เว้นแต่จะตั้งค่า AWS_PROFILE ไว้ด้วย
  2. SSO (เฉพาะเมื่อกำหนดค่าฟิลด์ SSO แล้ว)
  3. ไฟล์ข้อมูลประจำตัวและการกำหนดค่าที่ใช้ร่วมกัน (fromIni รวมถึง AWS_PROFILE)
  4. กระบวนการข้อมูลประจำตัว (credential_process ในไฟล์การกำหนดค่า AWS)
  5. ข้อมูลประจำตัวจากโทเค็นข้อมูลประจำตัวเว็บ
  6. ข้อมูลประจำตัวจากเมทาดาทาของอินสแตนซ์ ECS หรือ EC2

สิทธิ์ IAM: บทบาทหรือผู้ใช้ IAM ต้องมี:

json
{  "Effect": "Allow",  "Action": "bedrock:InvokeModel",  "Resource": "*"}

เพื่อใช้สิทธิ์เท่าที่จำเป็น ให้จำกัดขอบเขต InvokeModel ไว้ที่โมเดลที่ระบุ:

text
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 ใช้:

bash
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/) จะไม่ถูกลดทอน

ตัวอย่างฉบับเต็ม

json5
{  agents: {    defaults: {      memorySearch: {        query: {          maxResults: 6,          minScore: 0.35,          hybrid: {            mmr: { enabled: true },            temporalDecay: { enabled: true },          },        },      },    },  },}

พาธหน่วยความจำเพิ่มเติม

คีย์ ชนิด คำอธิบาย
extraPaths string[] ไดเรกทอรีหรือไฟล์เพิ่มเติมที่จะทำดัชนี
json5
{  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 ไปยังข้อความส่วนตัวภายในเอเจนต์เดียวกัน:

แบ็กเอนด์ในตัว

json5
{  agents: {    defaults: {      memorySearch: {        experimental: { sessionMemory: true },        sources: ["memory", "sessions"],      },    },  },  tools: {    sessions: { visibility: "agent" },  },}

แบ็กเอนด์ QMD

json5
{  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:

json5
{  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 แบบสมบูรณ์

json5
{  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; ข้อมูลเมตาที่มาที่ไปยังคงมองเห็นได้

ตัวอย่าง

json5
{  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",          },        },      },    },  },}

ที่เกี่ยวข้อง

Was this useful?
On this page

On this page