기억
OpenClaw 메모리는 에이전트 작업 공간의 일반 마크다운입니다. 파일은 진실의 근원; 모델은 디스크에 기록된 내용만 "기억"합니다.
메모리 검색 도구는 활성 메모리 플러그인에서 제공됩니다(기본값: memory-core). plugins.slots.memory = "none"를 사용하여 메모리 플러그인을 비활성화합니다.
메모리 파일(마크다운)
기본 작업 공간 레이아웃은 두 개의 메모리 레이어를 사용합니다.
memory/YYYY-MM-DD.md- 일일 로그(추가 전용).
- 오늘 + 어제 세션 시작 시 읽으세요.
MEMORY.md(선택 사항)- 선별된 장기 기억.
- 기본 비공개 세션에서만 로드됩니다(그룹 컨텍스트에서는 절대 로드되지 않음).
이 파일은 작업공간(agents.defaults.workspace 아래에 있습니다. 기본값은 ~/.openclaw/workspace). 전체 레이아웃은 에이전트 작업공간을 참조하세요.
메모리를 쓸 때
- 결정, 선호도, 지속 가능한 사실은
MEMORY.md에 저장됩니다. - 그날의 기록과 달리기 상황은
memory/YYYY-MM-DD.md에 있습니다. - 누군가가 "이것을 기억하세요"라고 말하면 적어두세요(RAM에 보관하지 마세요).
- 이 부분은 아직도 진화 중입니다. 모델이 기억을 저장하도록 상기시키는 데 도움이 됩니다. 무엇을 해야할지 알게 될 것입니다.
- 무언가를 고정하려면 봇에게 메모리에 기록해 달라고 요청하세요.
자동 메모리 플러시(압축 전 핑)
세션이 자동 압축에 가까워지면 OpenClaw는 자동 압축, 모델에게 내구성 메모리 전에 작성하도록 상기시키는 에이전트 턴 컨텍스트가 압축되었습니다. 기본 프롬프트에서는 모델이 응답할 수 있습니다라고 명시적으로 말합니다. 하지만 일반적으로 NO_REPLY가 올바른 응답이므로 사용자는 이번 차례를 볼 수 없습니다.
이는 agents.defaults.compaction.memoryFlush에 의해 제어됩니다:
{
agents: {
defaults: {
compaction: {
reserveTokensFloor: 20000,
memoryFlush: {
enabled: true,
softThresholdTokens: 4000,
systemPrompt: "Session nearing compaction. Store durable memories now.",
prompt: "Write any lasting notes to memory/YYYY-MM-DD.md; reply with NO_REPLY if nothing to store.",
},
},
},
},
}세부정보:
- 소프트 임계값: 세션 토큰 추정치가 초과되면 플러시가 트리거됩니다.
contextWindow - reserveTokensFloor - softThresholdTokens. - 기본적으로 자동: 프롬프트에
NO_REPLY가 포함되므로 아무것도 전달되지 않습니다. - 2개의 프롬프트: 사용자 프롬프트와 시스템 프롬프트가 알림을 추가합니다.
- 압축 주기당 한 번의 플러시(
sessions.json에서 추적됨). - 작업 공간은 쓰기 가능해야 합니다: 세션이 샌드박스로 실행되는 경우
workspaceAccess: "ro"또는"none", 플러시를 건너뜁니다.
전체 압축 수명주기는 다음을 참조하세요. 세션 관리 + 압축.
벡터 메모리 검색
OpenClaw는 MEMORY.md 및 memory/*.md에 대해 작은 벡터 인덱스를 구축할 수 있으므로 의미론적 쿼리는 표현이 다른 경우에도 관련 메모를 찾을 수 있습니다.
기본값:
- 기본적으로 활성화되어 있습니다.
- 메모리 파일의 변경 사항을 감시합니다(디바운스됨).
agents.defaults.memorySearch에서 메모리 검색 구성(최상위 수준 아님)memorySearch).- 기본적으로 원격 임베딩을 사용합니다.
memorySearch.provider가 설정되지 않은 경우 OpenClaw는 다음을 자동 선택합니다.localmemorySearch.local.modelPath가 구성되어 있고 파일이 존재하는 경우.- OpenAI 키를 확인할 수 있는 경우
openai. - Gemini 키를 해결할 수 있는 경우
gemini. - 항해 키를 해결할 수 있는 경우
voyage. - 그렇지 않으면 메모리 검색은 구성될 때까지 비활성화된 상태로 유지됩니다.
- 로컬 모드는 node-llama-cpp를 사용하며
pnpm approve-builds가 필요할 수 있습니다. - sqlite-vec(사용 가능한 경우)를 사용하여 SQLite 내에서 벡터 검색을 가속화합니다.
원격 임베딩에는 임베딩 공급자에 대한 API 키가 필요합니다. 오픈클로 인증 프로필, models.providers.*.apiKey 또는 환경에서 키를 확인합니다. 변수. Codex OAuth는 채팅/완료에만 적용되며 만족하지 않습니다 메모리 검색을 위한 임베딩. Gemini의 경우 GEMINI_API_KEY를 사용하거나 models.providers.google.apiKey. 항해의 경우 VOYAGE_API_KEY를 사용하거나 models.providers.voyage.apiKey. 사용자 정의 OpenAI 호환 엔드포인트를 사용하는 경우, memorySearch.remote.apiKey(선택 사항 memorySearch.remote.headers)를 설정합니다.
QMD 백엔드(실험적)
내장된 SQLite 인덱서를 다음으로 교체하려면 memory.backend = "qmd"를 설정합니다. QMD: 로컬 우선 검색 사이드카 BM25 + 벡터 + 순위 재지정. Markdown은 진실의 원천으로 남아 있습니다. OpenClaw 껍질 검색을 위해 QMD로 전송됩니다. 핵심 사항:
전제조건
- 기본적으로 비활성화되어 있습니다. 구성별로 선택합니다(
memory.backend = "qmd"). - QMD CLI를 별도로 설치(
bun install -g https://github.com/tobi/qmd또는 그랩 릴리스)qmd바이너리가 게이트웨이의PATH에 있는지 확인하세요. - QMD에는 확장(
brew install sqlite을 허용하는 SQLite 빌드가 필요합니다. macOS). - QMD는 Bun +
node-llama-cpp를 통해 완전히 로컬로 실행되고 GGUF를 자동 다운로드합니다. 처음 사용 시 HuggingFace의 모델(별도의 Ollama 데몬이 필요하지 않음) - 게이트웨이는 독립된 XDG 홈에서 QMD를 실행합니다.
~/.openclaw/agents/<agentId>/qmd/XDG_CONFIG_HOME설정으로XDG_CACHE_HOME. - OS 지원: Bun + SQLite를 사용하면 macOS 및 Linux가 즉시 작동합니다. 설치되었습니다. Windows는 WSL2를 통해 가장 잘 지원됩니다.
사이드카 실행 방법
- 게이트웨이는 다음과 같은 독립형 QMD 홈을 작성합니다.
~/.openclaw/agents/<agentId>/qmd/(구성 + 캐시 + sqlite DB). - 컬렉션은
memory.qmd.paths에서qmd collection add를 통해 생성됩니다. (기본 작업 공간 메모리 파일 포함), 그런 다음qmd update+qmd embed실행 부팅 시 및 구성 가능한 간격(memory.qmd.update.interval, 기본 5m). - 이제 게이트웨이는 시작 시 QMD 관리자를 초기화하므로 정기적인 업데이트가 가능합니다. 타이머는 첫 번째
memory_search호출 이전에도 작동됩니다. - 이제 부팅 새로 고침이 기본적으로 백그라운드에서 실행되므로 채팅이 시작되지 않습니다. 차단됨; 이전을 유지하려면
memory.qmd.update.waitForBootSync = true를 설정하세요. 차단 행동. - 검색은
memory.qmd.searchMode를 통해 실행됩니다(기본값qmd query --json; 또한search및vsearch)를 지원합니다. 선택한 모드가 귀하의 플래그를 거부하는 경우 QMD 빌드, OpenClaw가qmd query로 재시도합니다. QMD가 실패하거나 바이너리가 누락된 경우 OpenClaw는 자동으로 내장 SQLite 관리자로 대체되므로 메모리 도구는 계속 작동합니다. - OpenClaw는 현재 QMD 삽입 배치 크기 조정을 공개하지 않습니다. 배치 동작은 QMD 자체에 의해 제어됩니다.
- 첫 번째 검색은 느릴 수 있습니다: QMD는 로컬 GGUF 모델을 다운로드할 수 있습니다(재순위 지정/쿼리). 확장) 첫 번째
qmd query실행 시.OpenClaw는 QMD 실행 시
XDG_CONFIG_HOME/XDG_CACHE_HOME를 자동으로 설정합니다.수동으로 모델을 미리 다운로드하고 싶은 경우(동일 인덱스 OpenClaw를 따뜻하게 하는 경우) 사용) 에이전트의 XDG 디렉토리를 사용하여 일회성 쿼리를 실행합니다.
OpenClaw의 QMD 상태는 state dir 아래에 있습니다(기본값은
~/.openclaw). 동일한 XDG 변수를 내보내서 정확히 동일한 인덱스에서qmd를 가리킬 수 있습니다. OpenClaw는 다음을 사용합니다.bash# Pick the same state dir OpenClaw uses STATE_DIR="${OPENCLAW_STATE_DIR:-$HOME/.openclaw}" if [ -d "$HOME/.moltbot" ] && [ ! -d "$HOME/.openclaw" ] \ && [ -z "${OPENCLAW_STATE_DIR:-}" ]; then STATE_DIR="$HOME/.moltbot" fi export XDG_CONFIG_HOME="$STATE_DIR/agents/main/qmd/xdg-config" export XDG_CACHE_HOME="$STATE_DIR/agents/main/qmd/xdg-cache" # (Optional) force an index refresh + embeddings qmd update qmd embed # Warm up / trigger first-time model downloads qmd query "test" -c memory-root --json >/dev/null 2>&1
구성 표면 (memory.qmd.*)
command(기본값qmd): 실행 파일 경로를 재정의합니다.searchMode(기본값query): 어떤 QMD 명령이 백업되는지 선택memory_search(query,search,vsearch).includeDefaultMemory(기본값true): 자동 색인MEMORY.md+memory/**/*.md.paths[]: 추가 디렉터리/파일 추가 (path, 선택 사항pattern, 선택 사항 안정적name).sessions: 세션 JSONL 인덱싱 선택 (enabled,retentionDays,exportDir).update: 새로 고침 주기 및 유지 관리 실행을 제어합니다. (interval,debounceMs,onBoot,waitForBootSync,embedInterval,commandTimeoutMs,updateTimeoutMs,embedTimeoutMs).limits: 클램프 리콜 페이로드 (maxResults,maxSnippetChars,maxInjectedChars,timeoutMs).scope:session.sendPolicy과 동일한 스키마입니다. 기본값은 DM 전용입니다(deny전체,allow직접 채팅). 표면 QMD에 느슨하게 그룹/채널 히트.scope가 검색을 거부하면 OpenClaw는 파생된 경고를 기록합니다.channel/chatType따라서 빈 결과를 디버깅하기가 더 쉽습니다.- 작업공간 외부에서 가져온 스니펫은 다음과 같이 표시됩니다.
qmd/<collection>/<relative-path>memory_search결과;memory_get해당 접두사를 이해하고 구성된 QMD 컬렉션 루트에서 읽습니다. memory.qmd.sessions.enabled = true일 때 OpenClaw는 정리된 세션을 내보냅니다. 성적표(사용자/어시스턴트 전환)를 전용 QMD 컬렉션으로~/.openclaw/agents/<id>/qmd/sessions/,memory_search는 최근을 기억할 수 있습니다. 내장된 SQLite 인덱스를 건드리지 않고 대화합니다.memory_search조각에는 이제Source: <path#line>바닥글이 포함됩니다.memory.citations는auto/on입니다. 유지하려면memory.citations = "off"를 설정하세요. 경로 메타데이터 내부(에이전트는 계속해서memory_get, 그러나 스니펫 텍스트에는 바닥글과 시스템 프롬프트가 생략되어 있습니다. 상담원에게 인용하지 말라고 경고합니다.)
예
memory: {
backend: "qmd",
citations: "auto",
qmd: {
includeDefaultMemory: true,
update: { interval: "5m", debounceMs: 15000 },
limits: { maxResults: 6, timeoutMs: 4000 },
scope: {
default: "deny",
rules: [{ action: "allow", match: { chatType: "direct" } }]
},
paths: [
{ name: "docs", path: "~/notes", pattern: "**/*.md" }
]
}
}인용 및 대체
memory.citations는 백엔드(auto/on/off)와 관계없이 적용됩니다.qmd가 실행되면status().backend = "qmd"태그를 지정하여 진단에서 어떤 항목이 무엇인지 표시합니다. 엔진이 결과를 제공했습니다. QMD 하위 프로세스가 종료되거나 JSON 출력을 수행할 수 없는 경우 구문 분석되면 검색 관리자는 경고를 기록하고 내장 공급자를 반환합니다. (기존 Markdown 임베딩) QMD가 복구될 때까지.
추가 메모리 경로
기본 작업 공간 레이아웃 외부에서 Markdown 파일을 색인화하려면 다음을 추가하십시오. 명시적 경로:
agents: {
defaults: {
memorySearch: {
extraPaths: ["../team-docs", "/srv/shared-notes/overview.md"]
}
}
}참고:
- 경로는 절대 경로이거나 작업 공간 상대 경로일 수 있습니다.
.md파일에 대해 디렉터리를 반복적으로 검색합니다.- Markdown 파일만 색인화됩니다.
- Symlink는 무시됩니다(파일 또는 디렉터리).
Gemini 임베딩(네이티브)
Gemini 임베딩 API를 직접 사용하려면 공급자를 gemini로 설정하세요.
agents: {
defaults: {
memorySearch: {
provider: "gemini",
model: "gemini-embedding-001",
remote: {
apiKey: "YOUR_GEMINI_API_KEY"
}
}
}
}참고:
remote.baseUrl는 선택사항입니다(기본값은 Gemini API 기본 URL).remote.headers필요한 경우 추가 헤더를 추가할 수 있습니다.- 기본 모델 :
gemini-embedding-001.
사용자 지정 OpenAI 호환 엔드포인트(OpenRouter, vLLM 또는 프록시)를 사용하려는 경우 OpenAI 공급자와 함께 remote 구성을 사용할 수 있습니다.
agents: {
defaults: {
memorySearch: {
provider: "openai",
model: "text-embedding-3-small",
remote: {
baseUrl: "https://api.example.com/v1/",
apiKey: "YOUR_OPENAI_COMPAT_API_KEY",
headers: { "X-Custom-Header": "value" }
}
}
}
}API 키를 설정하지 않으려면 memorySearch.provider = "local"를 사용하거나 설정하세요. memorySearch.fallback = "none".
대체:
memorySearch.fallback는openai,gemini,local또는none일 수 있습니다.- 대체 공급자는 기본 포함 공급자가 실패한 경우에만 사용됩니다.
일괄 인덱싱(OpenAI + Gemini + Voyage):
- 기본적으로 비활성화되어 있습니다. 대규모 코퍼스 인덱싱(OpenAI, Gemini 및 Voyage)을 활성화하려면
agents.defaults.memorySearch.remote.batch.enabled = true을 설정합니다. - 기본 동작은 일괄 처리 완료를 기다립니다. 필요한 경우
remote.batch.wait,remote.batch.pollIntervalMs및remote.batch.timeoutMinutes를 조정하세요. remote.batch.concurrency를 설정하여 병렬로 제출하는 배치 작업 수를 제어합니다(기본값: 2).memorySearch.provider = "openai"또는"gemini"일 때 배치 모드가 적용되며 해당 API 키를 사용합니다.- Gemini 배치 작업은 비동기 임베딩 배치 엔드포인트를 사용하며 Gemini Batch API 가용성이 필요합니다.
OpenAI 배치가 빠르고 저렴한 이유:
- 대규모 백필의 경우 OpenAI는 단일 일괄 작업으로 많은 포함 요청을 제출하고 OpenAI가 이를 비동기식으로 처리할 수 있기 때문에 일반적으로 우리가 지원하는 가장 빠른 옵션입니다.
- OpenAI는 Batch API 워크로드에 대해 할인된 가격을 제공하므로 대규모 인덱싱 실행은 일반적으로 동일한 요청을 동기적으로 보내는 것보다 저렴합니다.
- 자세한 내용은 OpenAI Batch API 문서 및 가격을 참조하세요.
구성 예:
agents: {
defaults: {
memorySearch: {
provider: "openai",
model: "text-embedding-3-small",
fallback: "openai",
remote: {
batch: { enabled: true, concurrency: 2 }
},
sync: { watch: true }
}
}
}도구:
memory_search— 파일 + 줄 범위가 포함된 조각을 반환합니다.memory_get— 경로별로 메모리 파일 내용을 읽습니다.
로컬 모드:
agents.defaults.memorySearch.provider = "local"를 설정하세요.agents.defaults.memorySearch.local.modelPath(GGUF 또는hf:URI)를 제공합니다.- 선택 사항: 원격 폴백을 방지하려면
agents.defaults.memorySearch.fallback = "none"을 설정하세요.
메모리 도구의 작동 방식
memory_search는MEMORY.md+memory/**/*.md에서 마크다운 청크(~400개 토큰 대상, 80개 토큰 중복)를 의미론적으로 검색합니다. 스니펫 텍스트(최대 700자), 파일 경로, 줄 범위, 점수, 공급자/모델 및 로컬 → 원격 임베딩에서 대체되었는지 여부를 반환합니다. 전체 파일 페이로드가 반환되지 않습니다.memory_get는 선택적으로 시작 라인과 N 라인에 대해 특정 메모리 마크다운 파일(작업 공간 기준)을 읽습니다.MEMORY.md/memory/외부의 경로는 거부됩니다.- 두 도구 모두
memorySearch.enabled가 에이전트에 대해 true로 확인된 경우에만 활성화됩니다.
색인이 생성되는 항목 및 시기
- 파일 형식: 마크다운 전용(
MEMORY.md,memory/**/*.md). - 인덱스 저장소:
~/.openclaw/memory/<agentId>.sqlite의 에이전트별 SQLite(agents.defaults.memorySearch.store.path를 통해 구성 가능,{agentId}토큰 지원) - 신선도:
MEMORY.md+memory/의 감시자는 인덱스를 더티로 표시합니다(디바운스 1.5초). 동기화는 세션 시작 시, 검색 시 또는 일정 간격으로 예약되며 비동기식으로 실행됩니다. 세션 기록은 델타 임계값을 사용하여 백그라운드 동기화를 트리거합니다. - 재인덱싱 트리거: 인덱스는 임베딩 공급자/모델 + 엔드포인트 지문 + 청킹 매개변수를 저장합니다. 변경 사항이 있으면 OpenClaw는 자동으로 전체 매장을 재설정하고 다시 색인을 생성합니다.
하이브리드 검색(BM25 + 벡터)
활성화되면 OpenClaw는 다음을 결합합니다.
- 벡터 유사성(의미론적 일치, 표현은 다를 수 있음)
- BM25 키워드 관련성(ID, 환경 변수, 코드 기호와 같은 정확한 토큰)
플랫폼에서 전체 텍스트 검색을 사용할 수 없는 경우 OpenClaw는 벡터 전용 검색으로 대체됩니다.
왜 하이브리드인가?
벡터 검색은 "이것은 같은 것을 의미합니다"에 훌륭합니다.
- "Mac Studio 게이트웨이 호스트" 대 "게이트웨이를 실행하는 컴퓨터"
- "파일 업데이트 디바운스" vs "쓰기마다 인덱싱 방지"
그러나 정확한 신호가 높은 토큰에는 약할 수 있습니다.
- ID (
a828e60,b3b9895a…) - 코드 기호 (
memorySearch.query.hybrid) - 오류 문자열("sqlite-vec 사용할 수 없음")
BM25(전체 텍스트)는 그 반대입니다. 정확한 토큰에는 강하고 다른 표현에는 약합니다. 하이브리드 검색은 실용적인 중간 지점입니다. 검색 신호를 모두 사용하여 다음을 얻을 수 있습니다. "자연어" 쿼리와 "건초 더미 속의 바늘" 쿼리 모두에 대해 좋은 결과를 얻었습니다.
결과를 병합하는 방법(현재 디자인)
구현 스케치:
- 양쪽에서 후보 풀을 검색합니다.
- 벡터: 코사인 유사성에 따라 상위
maxResults * candidateMultiplier. - BM25: FTS5 BM25 등급으로 상위
maxResults * candidateMultiplier(낮을수록 좋음).
- BM25 순위를 0..1 정도의 점수로 변환합니다.
textScore = 1 / (1 + max(0, bm25Rank))
- 청크 ID별로 후보를 통합하고 가중치 점수를 계산합니다.
finalScore = vectorWeight * vectorScore + textWeight * textScore
참고:
vectorWeight+textWeight는 구성 해상도에서 1.0으로 정규화되므로 가중치는 백분율로 동작합니다.- 임베딩을 사용할 수 없는 경우(또는 공급자가 제로 벡터를 반환하는 경우) 우리는 계속 BM25를 실행하고 키워드 일치를 반환합니다.
- FTS5를 생성할 수 없는 경우 벡터 전용 검색을 유지합니다(하드 실패 없음).
이것은 "IR 이론의 완벽함"은 아니지만 간단하고 빠르며 실제 메모의 재현율/정밀도를 향상시키는 경향이 있습니다. 나중에 더 좋아지고 싶다면 일반적인 다음 단계는 RRF(Reciprocal Rank Fusion) 또는 점수 정규화입니다. (최소/최대 또는 z-점수) 혼합 전.
구성:
agents: {
defaults: {
memorySearch: {
query: {
hybrid: {
enabled: true,
vectorWeight: 0.7,
textWeight: 0.3,
candidateMultiplier: 4
}
}
}
}
}캐시 삽입
OpenClaw는 SQLite에 청크 임베딩을 캐시할 수 있으므로 재색인 및 빈번한 업데이트(특히 세션 기록)로 인해 변경되지 않은 텍스트가 다시 포함되지 않습니다.
구성:
agents: {
defaults: {
memorySearch: {
cache: {
enabled: true,
maxEntries: 50000
}
}
}
}세션 메모리 검색(실험적)
선택적으로 세션 기록을 색인화하고 memory_search를 통해 표시할 수 있습니다. 이것은 실험적인 깃발 뒤에 문이 있습니다.
agents: {
defaults: {
memorySearch: {
experimental: { sessionMemory: true },
sources: ["memory", "sessions"]
}
}
}참고:
- 세션 색인 생성은 선택(기본적으로 꺼져 있음)입니다.
- 세션 업데이트는 델타 임계값을 초과하면 디바운싱되고 비동기식으로 인덱싱됩니다(최선의 노력).
memory_search인덱싱을 차단하지 않습니다. 백그라운드 동기화가 완료될 때까지 결과가 약간 오래될 수 있습니다.- 결과에는 여전히 스니펫만 포함됩니다.
memory_get는 여전히 메모리 파일로 제한되어 있습니다. - 세션 인덱싱은 에이전트별로 분리됩니다(해당 에이전트의 세션 로그만 인덱싱됩니다).
- 세션 로그는 디스크(
~/.openclaw/agents/<agentId>/sessions/*.jsonl)에 저장됩니다. 파일 시스템 액세스 권한이 있는 모든 프로세스/사용자는 이를 읽을 수 있으므로 디스크 액세스를 신뢰 경계로 취급하십시오. 더 엄격하게 격리하려면 별도의 OS 사용자 또는 호스트에서 에이전트를 실행하세요.
델타 임계값(기본값 표시):
agents: {
defaults: {
memorySearch: {
sync: {
sessions: {
deltaBytes: 100000, // ~100 KB
deltaMessages: 50 // JSONL lines
}
}
}
}
}SQLite 벡터 가속(sqlite-vec)
sqlite-vec 확장을 사용할 수 있는 경우 OpenClaw는 임베딩을 SQLite 가상 테이블(vec0)에서 벡터 거리 쿼리를 수행합니다. 데이터베이스. 이렇게 하면 JS에 모든 임베딩을 로드하지 않고도 검색 속도가 빨라집니다.
구성(선택 사항):
agents: {
defaults: {
memorySearch: {
store: {
vector: {
enabled: true,
extensionPath: "/path/to/sqlite-vec"
}
}
}
}
}참고:
enabled기본값은 true입니다. 비활성화되면 검색이 진행 중으로 돌아갑니다. 저장된 임베딩에 대한 코사인 유사성.- sqlite-vec 확장이 없거나 로드에 실패한 경우 OpenClaw는 오류가 발생하고 JS 대체(벡터 테이블 없음)가 계속됩니다.
extensionPath는 번들로 제공되는 sqlite-vec 경로를 재정의합니다(사용자 정의 빌드에 유용함). 또는 비표준 설치 위치).
로컬 임베딩 자동 다운로드
- 기본 로컬 임베딩 모델:
hf:ggml-org/embeddinggemma-300M-GGUF/embeddinggemma-300M-Q8_0.gguf(~0.6GB). memorySearch.provider = "local"일 때,node-llama-cpp는modelPath를 해결합니다. GGUF가 없으면 캐시에 자동 다운로드하고(또는 설정된 경우local.modelCacheDir) 로드합니다. 재시도 시 다운로드가 재개됩니다.- 기본 빌드 요구 사항:
pnpm approve-builds를 실행하고node-llama-cpp를 선택한 다음pnpm rebuild node-llama-cpp를 선택합니다. - 대체: 로컬 설정이 실패하고
memorySearch.fallback = "openai"인 경우 자동으로 원격 임베딩(재정의되지 않는 한openai/text-embedding-3-small)으로 전환하고 이유를 기록합니다.
사용자 정의 OpenAI 호환 엔드포인트 예시
agents: {
defaults: {
memorySearch: {
provider: "openai",
model: "text-embedding-3-small",
remote: {
baseUrl: "https://api.example.com/v1/",
apiKey: "YOUR_REMOTE_API_KEY",
headers: {
"X-Organization": "org-id",
"X-Project": "project-id"
}
}
}
}
}참고:
remote.*는models.providers.openai.*보다 우선합니다.remote.headersOpenAI 헤더와 병합; 주요 충돌에서 원격 승리. OpenAI 기본값을 사용하려면remote.headers를 생략하세요.