memory-lancedb-pro 1.1.0-beta.1 → 1.1.0-beta.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +36 -9
- package/README.md +172 -19
- package/README_CN.md +170 -18
- package/cli.ts +67 -14
- package/index.ts +1890 -278
- package/openclaw.plugin.json +215 -70
- package/package.json +2 -2
- package/scripts/jsonl_distill.py +2 -0
- package/src/access-tracker.ts +330 -0
- package/src/adaptive-retrieval.ts +10 -12
- package/src/embedder.ts +146 -10
- package/src/reflection-retry.ts +180 -0
- package/src/retriever.ts +185 -222
- package/src/self-improvement-files.ts +39 -0
- package/src/session-recovery.ts +137 -0
- package/src/store.ts +208 -68
- package/src/tools.ts +714 -89
- package/test/access-tracker.test.mjs +770 -0
- package/test/cli-smoke.mjs +102 -7
- package/test/config-session-strategy-migration.test.mjs +66 -0
- package/test/embedder-error-hints.test.mjs +110 -0
- package/test/helpers/openclaw-plugin-sdk-stub.mjs +7 -0
- package/test/jsonl-distill-slash-filter.test.mjs +81 -0
- package/test/reflection-command-reset-fallback.test.mjs +80 -0
- package/test/reflection-retry.test.mjs +158 -0
- package/test/self-improvement-tools-file-write.test.mjs +113 -0
- package/test/session-recovery-paths.test.mjs +58 -0
- package/CHANGELOG-v1.1.0.md +0 -227
- package/src/decay-engine.ts +0 -227
- package/src/extraction-prompts.ts +0 -205
- package/src/llm-client.ts +0 -92
- package/src/memory-categories.ts +0 -69
- package/src/smart-extractor.ts +0 -524
- package/src/tier-manager.ts +0 -189
package/CHANGELOG.md
CHANGED
|
@@ -1,17 +1,44 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
-
## 1.1.0
|
|
3
|
+
## 1.1.0
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
- Feat: add integrated self-improvement governance flow (`agent:bootstrap`, `command:new/reset`, governance tools, and `.learnings` file bootstrap).
|
|
6
|
+
- Feat: add `memoryReflection` session strategy with inheritance/derived injection, reflection persistence, and dedicated reflection-agent support.
|
|
7
|
+
- Fix: keep session-strategy compatibility by mapping legacy `sessionMemory.enabled` to `systemSessionMemory` / `none` and trimming reflection input toward recent conversation tail.
|
|
8
|
+
- Fix: retry early transient upstream reflection failures once and broaden session recovery search paths to real OpenClaw agent session directories.
|
|
9
|
+
- Docs: update README / README_CN for session strategy, self-improvement, memoryReflection, mdMirror, and reflection fallback behavior.
|
|
10
|
+
- Tests: add targeted coverage for reflection retry classification and session recovery path resolution.
|
|
6
11
|
|
|
7
|
-
|
|
8
|
-
- **Smart Extraction (LLM-powered)**: 6-category extraction with L0/L1/L2 metadata (falls back to regex capture when disabled or init fails)
|
|
9
|
-
- **Lifecycle scoring integrated into retrieval**: decay-based score adjustment + tier floors
|
|
10
|
-
- **Tier transitions (best-effort)**: records access stats for top results and can promote/demote tiers via metadata
|
|
11
|
-
- Rebases the smart-memory branch onto `main@1.0.25` (keeps multi-key rotation & other recent fixes)
|
|
12
|
+
PRs: #43, #2
|
|
12
13
|
|
|
13
|
-
|
|
14
|
-
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## 1.0.32
|
|
17
|
+
|
|
18
|
+
- Fix: strip OpenClaw `Conversation info` / `Sender` metadata noise before auto-capture matching and adaptive retrieval normalization, reducing false captures and noisy retrieval triggers.
|
|
19
|
+
- Fix: parse `autoRecallMinRepeated` from plugin config so repeated-memory suppression works when configured.
|
|
20
|
+
|
|
21
|
+
PR: #50
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
## 1.0.31
|
|
27
|
+
|
|
28
|
+
- Fix: `memory-pro import` now preserves provided IDs and is idempotent (skips if ID already exists).
|
|
29
|
+
|
|
30
|
+
## 1.0.26
|
|
31
|
+
|
|
32
|
+
**Access Reinforcement for Time Decay**
|
|
33
|
+
|
|
34
|
+
- **Feat**: Access reinforcement — frequently *manually recalled* memories decay more slowly (spaced-repetition style)
|
|
35
|
+
- **New**: `AccessTracker` with debounced metadata write-back (records accessCount / lastAccessedAt)
|
|
36
|
+
- **New**: Config options under `retrieval`: `reinforcementFactor` (default: 0.5) and `maxHalfLifeMultiplier` (default: 3)
|
|
37
|
+
- **New**: `MemoryStore.getById()` pure-read helper for efficient metadata lookup
|
|
38
|
+
|
|
39
|
+
PR: #37
|
|
40
|
+
|
|
41
|
+
Breaking changes: None. Backward compatible (set `reinforcementFactor: 0` to disable).
|
|
15
42
|
|
|
16
43
|
---
|
|
17
44
|
|
package/README.md
CHANGED
|
@@ -80,7 +80,7 @@ The built-in `memory-lancedb` plugin in OpenClaw provides basic vector search. *
|
|
|
80
80
|
|
|
81
81
|
| File | Purpose |
|
|
82
82
|
|------|---------|
|
|
83
|
-
| `index.ts` | Plugin entry point. Registers with OpenClaw Plugin API, parses config, mounts `before_agent_start` (auto-recall), `agent_end` (auto-capture),
|
|
83
|
+
| `index.ts` | Plugin entry point. Registers with OpenClaw Plugin API, parses config, mounts `before_agent_start` (auto-recall), `agent_end` (auto-capture), integrated `self-improvement` (`agent:bootstrap`, `command:new/reset`) and integrated `memory-reflection` (`command:new/reset`) hooks |
|
|
84
84
|
| `openclaw.plugin.json` | Plugin metadata + full JSON Schema config declaration (with `uiHints`) |
|
|
85
85
|
| `package.json` | NPM package info. Depends on `@lancedb/lancedb`, `openai`, `@sinclair/typebox` |
|
|
86
86
|
| `cli.ts` | CLI commands: `memory list/search/stats/delete/delete-bulk/export/import/reembed/migrate` |
|
|
@@ -88,7 +88,7 @@ The built-in `memory-lancedb` plugin in OpenClaw provides basic vector search. *
|
|
|
88
88
|
| `src/embedder.ts` | Embedding abstraction. Compatible with any OpenAI-API provider (OpenAI, Gemini, Jina, Ollama, etc.). Supports task-aware embedding (`taskQuery`/`taskPassage`) |
|
|
89
89
|
| `src/retriever.ts` | Hybrid retrieval engine. Vector + BM25 → RRF fusion → Jina Cross-Encoder Rerank → Recency Boost → Importance Weight → Length Norm → Time Decay → Hard Min Score → Noise Filter → MMR Diversity |
|
|
90
90
|
| `src/scopes.ts` | Multi-scope access control. Supports `global`, `agent:<id>`, `custom:<name>`, `project:<id>`, `user:<id>` |
|
|
91
|
-
| `src/tools.ts` | Agent tool definitions: `memory_recall`, `memory_store`, `memory_forget` (core)
|
|
91
|
+
| `src/tools.ts` | Agent tool definitions: `memory_recall`, `memory_store`, `memory_forget` (core), `self_improvement_log` (default), and governance tools `self_improvement_review` / `self_improvement_extract_skill` (management mode) |
|
|
92
92
|
| `src/noise-filter.ts` | Noise filter. Filters out agent refusals, meta-questions, greetings, and low-quality content |
|
|
93
93
|
| `src/adaptive-retrieval.ts` | Adaptive retrieval. Determines whether a query needs memory retrieval (skips greetings, slash commands, simple confirmations, emoji) |
|
|
94
94
|
| `src/migrate.ts` | Migration tool. Migrates data from the built-in `memory-lancedb` plugin to Pro |
|
|
@@ -146,13 +146,108 @@ Filters out low-quality content at both auto-capture and tool-store stages:
|
|
|
146
146
|
- Meta-questions ("do you remember")
|
|
147
147
|
- Greetings ("hi", "hello", "HEARTBEAT")
|
|
148
148
|
|
|
149
|
-
### 7. Session
|
|
150
|
-
|
|
151
|
-
-
|
|
152
|
-
-
|
|
153
|
-
-
|
|
154
|
-
|
|
155
|
-
|
|
149
|
+
### 7. Session Strategy
|
|
150
|
+
|
|
151
|
+
- `sessionStrategy: "systemSessionMemory"` (default): disable plugin reflection hooks; use OpenClaw built-in `session-memory`
|
|
152
|
+
- `sessionStrategy: "memoryReflection"`: use plugin reflection hooks (explicit opt-in)
|
|
153
|
+
- `sessionStrategy: "none"`: disable plugin session strategy hooks
|
|
154
|
+
- Compatibility: legacy `sessionMemory.enabled=true|false` maps to `systemSessionMemory|none`
|
|
155
|
+
- Upgrade behavior note:
|
|
156
|
+
- Previous plugin-driven session-summary behavior is no longer the implicit default.
|
|
157
|
+
- After upgrading, deployments that want plugin reflection on `/new` / `/reset` must explicitly set `sessionStrategy: "memoryReflection"`.
|
|
158
|
+
- Keeping legacy `sessionMemory.enabled: true` now preserves safer compatibility through `systemSessionMemory`, instead of silently enabling the newer reflection pipeline.
|
|
159
|
+
|
|
160
|
+
### 8. Self-Improvement
|
|
161
|
+
|
|
162
|
+
- Hooks: `agent:bootstrap`, `command:new`, `command:reset`
|
|
163
|
+
- `agent:bootstrap`: injects `SELF_IMPROVEMENT_REMINDER.md` into bootstrap context
|
|
164
|
+
- `command:new` / `command:reset`: appends a short `/note self-improvement ...` reminder before reset
|
|
165
|
+
- Files: ensures `.learnings/LEARNINGS.md`, `.learnings/ERRORS.md`, `.learnings/FEATURE_REQUESTS.md`
|
|
166
|
+
- Behavior note:
|
|
167
|
+
- This flow is integrated into the plugin lifecycle and can coexist with `sessionStrategy=systemSessionMemory`.
|
|
168
|
+
- It is separate from `memoryReflection`: seeing self-improvement notes or `.learnings/*` activity does not by itself mean reflection storage is enabled.
|
|
169
|
+
- Governance-oriented extraction/review actions remain explicitly tool-driven rather than background-triggered.
|
|
170
|
+
- Tools:
|
|
171
|
+
- `self_improvement_log`: write structured LRN/ERR/FEAT entries
|
|
172
|
+
- `self_improvement_review`: summarize governance backlog (pending/high/promoted)
|
|
173
|
+
- `self_improvement_extract_skill`: extract a reusable `SKILL.md` scaffold from a learning entry
|
|
174
|
+
- Trigger: explicit tool call by user/model (not background auto-trigger)
|
|
175
|
+
- Timing: on-demand, one-shot execution
|
|
176
|
+
- Inputs: explicit `learningId` and `skillName`
|
|
177
|
+
- Risk profile: low and controllable; fewer accidental writes
|
|
178
|
+
- Recommended mode: stabilize workflow first with human review/approval
|
|
179
|
+
|
|
180
|
+
### 9. memoryReflection
|
|
181
|
+
|
|
182
|
+
- Trigger conditions:
|
|
183
|
+
- `sessionStrategy` must be `memoryReflection` (explicitly configured).
|
|
184
|
+
- Trigger event is `command:new` / `command:reset`.
|
|
185
|
+
- Reflection generation is skipped when session context is incomplete (for example missing `cfg`, session file, or readable conversation content).
|
|
186
|
+
- Reflection runner chain:
|
|
187
|
+
- First try embedded runner (`runEmbeddedPiAgent`).
|
|
188
|
+
- If embedded path fails, automatically fallback to `openclaw agent --local --json`.
|
|
189
|
+
- Only if both fail, write minimal fallback reflection text.
|
|
190
|
+
- Reflect output:
|
|
191
|
+
- Structured output should include these sections: `## Context`, `## Decisions (durable)`, `## User model deltas (about the human)`, `## Agent model deltas (about the assistant/system)`, `## Lessons & pitfalls (symptom / cause / fix / prevention)`, `## Learning governance candidates (.learnings / promotion / skill extraction)`, `## Open loops / next actions`, `## Retrieval tags / keywords`, `## Invariants`, `## Derived`.
|
|
192
|
+
- `## Invariants` is for stable rule-like carryover; `## Derived` is for concrete next-run deltas.
|
|
193
|
+
- Markdown artifacts are written under `memory/reflections/YYYY-MM-DD/`.
|
|
194
|
+
- Filename uses high-resolution timestamp + agent/session token (with conflict-safe suffix), for example `HHMMSSmmm-agent-session[-xxxxxx].md`.
|
|
195
|
+
- Store to LanceDB (optional):
|
|
196
|
+
- Controlled by `memoryReflection.storeToLanceDB` (effective only under `sessionStrategy=memoryReflection`).
|
|
197
|
+
- Only non-fallback reflections are eligible for LanceDB persistence.
|
|
198
|
+
- Additional similarity dedupe is applied before write (`> 0.97` hit skips storing).
|
|
199
|
+
- Reflections are stored with category `reflection`, and are displayed as `reflection:<scope>`.
|
|
200
|
+
- Stored metadata includes reflection execution fields such as `type`, `stage`, `sessionKey`, `sessionId`, `agentId`, `command`, `storedAt`, `invariants[]`, `derived[]`, `usedFallback`, and `errorSignals[]`.
|
|
201
|
+
- Dedicated agent (optional): run reflection generation with another agent via `memoryReflection.agentId` (e.g. `memory-distiller`)
|
|
202
|
+
- If configured `memoryReflection.agentId` is not found in `cfg.agents.list`, plugin logs a clear warning and falls back to runtime agent id.
|
|
203
|
+
- For embedded runs, the plugin resolves the target agent's primary model ref (`provider/model`) and passes `provider` + `model` explicitly.
|
|
204
|
+
- Inherit: `before_agent_start` injects `<inherited-rules>` from stable reflection invariants.
|
|
205
|
+
- Derive: `before_prompt_build` injects `<derived-focus>` and `<error-detected>` blocks.
|
|
206
|
+
- `<derived-focus>` is sourced only from the latest recent non-fallback reflection and skips placeholder lines.
|
|
207
|
+
- Reflection-derived lines are extracted with `reflect|inherit|derive|change|apply` matching.
|
|
208
|
+
- Error loop: `after_tool_call` captures and deduplicates tool error signatures for reminder/reflection context
|
|
209
|
+
|
|
210
|
+
### 10. Markdown Mirror (`mdMirror`)
|
|
211
|
+
|
|
212
|
+
- Purpose:
|
|
213
|
+
- Dual-write memory entries to readable Markdown files in addition to LanceDB.
|
|
214
|
+
- Useful for audit/debug/manual review.
|
|
215
|
+
- Write paths:
|
|
216
|
+
- Preferred: mapped agent workspace `memory/YYYY-MM-DD.md`.
|
|
217
|
+
- Fallback: `mdMirror.dir` (default: `memory-md`) when agent workspace mapping is unavailable.
|
|
218
|
+
- Trigger points:
|
|
219
|
+
- `memory_store` tool writes.
|
|
220
|
+
- Auto-capture writes from `agent_end`.
|
|
221
|
+
- Compatibility:
|
|
222
|
+
- Does not replace LanceDB storage or retrieval flow.
|
|
223
|
+
- Existing retrieval remains vector/BM25/rerank based.
|
|
224
|
+
- Config:
|
|
225
|
+
- `mdMirror.enabled`: enable/disable dual-write (`false` by default).
|
|
226
|
+
- `mdMirror.dir`: fallback directory for Markdown mirror files.
|
|
227
|
+
|
|
228
|
+
### 11. Long Context Chunking
|
|
229
|
+
|
|
230
|
+
Automatically handles documents that exceed embedding model context limits:
|
|
231
|
+
|
|
232
|
+
- **Smart splitting**: Chunks at sentence boundaries with configurable overlap (default: 200 chars)
|
|
233
|
+
- **Averaged embedding**: Each chunk is embedded separately, then averaged for semantic preservation
|
|
234
|
+
- **Graceful error handling**: Detects "Input length exceeds context length" errors and retries with chunking
|
|
235
|
+
- **Config toggle**: `embedding.chunking` — set `false` to disable (default: auto-enabled on context-length errors)
|
|
236
|
+
- **Adapts to model limits**: Jina (8192 tokens), OpenAI (8191), Gemini (2048), etc.
|
|
237
|
+
|
|
238
|
+
See [`docs/long-context-chunking.md`](docs/long-context-chunking.md) for implementation details.
|
|
239
|
+
|
|
240
|
+
### 12. Embedding Error Diagnostics
|
|
241
|
+
|
|
242
|
+
When embedding calls fail, the plugin provides **actionable error messages** instead of generic errors:
|
|
243
|
+
|
|
244
|
+
- **Auth errors** (401/403): hints to check API key validity and format
|
|
245
|
+
- **Network errors** (ECONNREFUSED, ETIMEDOUT): hints to verify `baseURL` and network connectivity
|
|
246
|
+
- **Rate limits** (429): suggests retry or upgrading plan
|
|
247
|
+
- **Model not found** (404): suggests checking model name against provider docs
|
|
248
|
+
- **Context length exceeded**: automatically retries with chunking (see above)
|
|
249
|
+
|
|
250
|
+
### 13. Auto-Capture & Auto-Recall
|
|
156
251
|
|
|
157
252
|
- **Auto-Capture** (`agent_end` hook): Extracts preference/fact/decision/entity from conversations, deduplicates, stores up to 3 per turn
|
|
158
253
|
- Skips memory-management prompts (e.g. delete/forget/cleanup memory entries) to reduce noise
|
|
@@ -337,11 +432,12 @@ openclaw config get plugins.slots.memory
|
|
|
337
432
|
"dbPath": "~/.openclaw/memory/lancedb-pro",
|
|
338
433
|
"autoCapture": true,
|
|
339
434
|
"autoRecall": false,
|
|
435
|
+
"autoRecallMinLength": 8,
|
|
340
436
|
"retrieval": {
|
|
341
437
|
"mode": "hybrid",
|
|
342
438
|
"vectorWeight": 0.7,
|
|
343
439
|
"bm25Weight": 0.3,
|
|
344
|
-
"minScore": 0.
|
|
440
|
+
"minScore": 0.45,
|
|
345
441
|
"rerank": "cross-encoder",
|
|
346
442
|
"rerankApiKey": "${JINA_API_KEY}",
|
|
347
443
|
"rerankModel": "jina-reranker-v3",
|
|
@@ -352,10 +448,13 @@ openclaw config get plugins.slots.memory
|
|
|
352
448
|
"recencyWeight": 0.1,
|
|
353
449
|
"filterNoise": true,
|
|
354
450
|
"lengthNormAnchor": 500,
|
|
355
|
-
"hardMinScore": 0.
|
|
356
|
-
"timeDecayHalfLifeDays": 60
|
|
451
|
+
"hardMinScore": 0.55,
|
|
452
|
+
"timeDecayHalfLifeDays": 60,
|
|
453
|
+
"reinforcementFactor": 0.5,
|
|
454
|
+
"maxHalfLifeMultiplier": 3
|
|
357
455
|
},
|
|
358
456
|
"enableManagementTools": false,
|
|
457
|
+
"sessionStrategy": "systemSessionMemory",
|
|
359
458
|
"scopes": {
|
|
360
459
|
"default": "global",
|
|
361
460
|
"definitions": {
|
|
@@ -366,15 +465,67 @@ openclaw config get plugins.slots.memory
|
|
|
366
465
|
"discord-bot": ["global", "agent:discord-bot"]
|
|
367
466
|
}
|
|
368
467
|
},
|
|
369
|
-
"
|
|
468
|
+
"selfImprovement": {
|
|
469
|
+
"enabled": true,
|
|
470
|
+
"beforeResetNote": true,
|
|
471
|
+
"skipSubagentBootstrap": true,
|
|
472
|
+
"ensureLearningFiles": true
|
|
473
|
+
},
|
|
474
|
+
"memoryReflection": {
|
|
475
|
+
"storeToLanceDB": true,
|
|
476
|
+
"injectMode": "inheritance+derived",
|
|
477
|
+
"agentId": "memory-distiller",
|
|
478
|
+
"messageCount": 120,
|
|
479
|
+
"maxInputChars": 24000,
|
|
480
|
+
"timeoutMs": 20000,
|
|
481
|
+
"thinkLevel": "medium",
|
|
482
|
+
"errorReminderMaxEntries": 3,
|
|
483
|
+
"dedupeErrorSignals": true
|
|
484
|
+
},
|
|
485
|
+
"mdMirror": {
|
|
370
486
|
"enabled": false,
|
|
371
|
-
"
|
|
487
|
+
"dir": "memory-md"
|
|
372
488
|
}
|
|
373
489
|
}
|
|
374
490
|
```
|
|
375
491
|
|
|
376
492
|
</details>
|
|
377
493
|
|
|
494
|
+
### Parameter Mapping Notes (avoid common misconfig)
|
|
495
|
+
|
|
496
|
+
`memory-lancedb-pro` does **not** support `recallTopK` / `recallThreshold`.
|
|
497
|
+
|
|
498
|
+
Use these equivalents instead:
|
|
499
|
+
|
|
500
|
+
- `recallTopK` → `retrieval.candidatePoolSize`
|
|
501
|
+
- `recallThreshold` → combine `retrieval.minScore` + `retrieval.hardMinScore`
|
|
502
|
+
|
|
503
|
+
A practical starting point for Chinese chat workloads:
|
|
504
|
+
|
|
505
|
+
```json
|
|
506
|
+
{
|
|
507
|
+
"autoCapture": true,
|
|
508
|
+
"autoRecall": true,
|
|
509
|
+
"autoRecallMinLength": 8,
|
|
510
|
+
"retrieval": {
|
|
511
|
+
"candidatePoolSize": 20,
|
|
512
|
+
"minScore": 0.45,
|
|
513
|
+
"hardMinScore": 0.55
|
|
514
|
+
}
|
|
515
|
+
}
|
|
516
|
+
```
|
|
517
|
+
|
|
518
|
+
### Access Reinforcement (1.0.26)
|
|
519
|
+
|
|
520
|
+
To make frequently used memories decay more slowly, the retriever can extend the effective time-decay half-life based on **manual recall frequency** (spaced-repetition style).
|
|
521
|
+
|
|
522
|
+
Config keys (under `retrieval`):
|
|
523
|
+
- `reinforcementFactor` (range: 0–2, default: `0.5`) — set `0` to disable
|
|
524
|
+
- `maxHalfLifeMultiplier` (range: 1–10, default: `3`) — hard cap: effective half-life ≤ base × multiplier
|
|
525
|
+
|
|
526
|
+
Notes:
|
|
527
|
+
- Reinforcement is **whitelisted to `source: "manual"`** (i.e. user/tool initiated recall), to avoid accidental strengthening from auto-recall.
|
|
528
|
+
|
|
378
529
|
### Embedding Providers
|
|
379
530
|
|
|
380
531
|
This plugin works with **any OpenAI-compatible embedding API**:
|
|
@@ -506,7 +657,7 @@ and keeps a cursor here:
|
|
|
506
657
|
|
|
507
658
|
The script is **safe**: it never modifies session logs.
|
|
508
659
|
|
|
509
|
-
By default it skips historical reset snapshots (`*.reset.*`) and excludes the distiller agent itself (`memory-distiller`) to prevent self-ingestion loops.
|
|
660
|
+
By default it skips historical reset snapshots (`*.reset.*`), slash-command/control-note lines (for example `/note self-improvement ...`), and excludes the distiller agent itself (`memory-distiller`) to prevent self-ingestion loops.
|
|
510
661
|
|
|
511
662
|
### Optional: restrict distillation sources (allowlist)
|
|
512
663
|
|
|
@@ -767,29 +918,31 @@ Config-only changes do NOT need cache clearing.
|
|
|
767
918
|
|
|
768
919
|
## Contributors
|
|
769
920
|
|
|
770
|
-
Top contributors (from GitHub
|
|
921
|
+
Top contributors (from GitHub's contributors list, sorted by commit contributions; bots excluded):
|
|
771
922
|
|
|
772
923
|
<p>
|
|
773
924
|
<a href="https://github.com/win4r"><img src="https://avatars.githubusercontent.com/u/42172631?v=4" width="48" height="48" alt="@win4r" /></a>
|
|
774
925
|
<a href="https://github.com/kctony"><img src="https://avatars.githubusercontent.com/u/1731141?v=4" width="48" height="48" alt="@kctony" /></a>
|
|
775
926
|
<a href="https://github.com/Akatsuki-Ryu"><img src="https://avatars.githubusercontent.com/u/8062209?v=4" width="48" height="48" alt="@Akatsuki-Ryu" /></a>
|
|
927
|
+
<a href="https://github.com/AliceLJY"><img src="https://avatars.githubusercontent.com/u/136287420?v=4" width="48" height="48" alt="@AliceLJY" /></a>
|
|
776
928
|
<a href="https://github.com/JasonSuz"><img src="https://avatars.githubusercontent.com/u/612256?v=4" width="48" height="48" alt="@JasonSuz" /></a>
|
|
777
929
|
<a href="https://github.com/Minidoracat"><img src="https://avatars.githubusercontent.com/u/11269639?v=4" width="48" height="48" alt="@Minidoracat" /></a>
|
|
930
|
+
<a href="https://github.com/rwmjhb"><img src="https://avatars.githubusercontent.com/u/91475811?v=4" width="48" height="48" alt="@rwmjhb" /></a>
|
|
778
931
|
<a href="https://github.com/furedericca-lab"><img src="https://avatars.githubusercontent.com/u/263020793?v=4" width="48" height="48" alt="@furedericca-lab" /></a>
|
|
779
932
|
<a href="https://github.com/joe2643"><img src="https://avatars.githubusercontent.com/u/19421931?v=4" width="48" height="48" alt="@joe2643" /></a>
|
|
780
|
-
<a href="https://github.com/AliceLJY"><img src="https://avatars.githubusercontent.com/u/136287420?v=4" width="48" height="48" alt="@AliceLJY" /></a>
|
|
781
933
|
<a href="https://github.com/chenjiyong"><img src="https://avatars.githubusercontent.com/u/8199522?v=4" width="48" height="48" alt="@chenjiyong" /></a>
|
|
782
934
|
</p>
|
|
783
935
|
|
|
784
|
-
- [@win4r](https://github.com/win4r) (
|
|
936
|
+
- [@win4r](https://github.com/win4r) (4 commits)
|
|
785
937
|
- [@kctony](https://github.com/kctony) (2 commits)
|
|
786
938
|
- [@Akatsuki-Ryu](https://github.com/Akatsuki-Ryu) (1 commit)
|
|
787
939
|
- [@AliceLJY](https://github.com/AliceLJY) (1 commit)
|
|
788
|
-
- [@chenjiyong](https://github.com/chenjiyong) (1 commit)
|
|
789
940
|
- [@JasonSuz](https://github.com/JasonSuz) (1 commit)
|
|
790
941
|
- [@Minidoracat](https://github.com/Minidoracat) (1 commit)
|
|
942
|
+
- [@rwmjhb](https://github.com/rwmjhb) (1 commit)
|
|
791
943
|
- [@furedericca-lab](https://github.com/furedericca-lab) (1 commit)
|
|
792
944
|
- [@joe2643](https://github.com/joe2643) (1 commit)
|
|
945
|
+
- [@chenjiyong](https://github.com/chenjiyong) (1 commit)
|
|
793
946
|
|
|
794
947
|
Full list: https://github.com/win4r/memory-lancedb-pro/graphs/contributors
|
|
795
948
|
|
package/README_CN.md
CHANGED
|
@@ -80,7 +80,7 @@ OpenClaw 内置的 `memory-lancedb` 插件仅提供基本的向量搜索。**mem
|
|
|
80
80
|
|
|
81
81
|
| 文件 | 用途 |
|
|
82
82
|
|------|------|
|
|
83
|
-
| `index.ts` | 插件入口。注册到 OpenClaw Plugin API,解析配置,挂载 `before_agent_start`(自动回忆)、`agent_end
|
|
83
|
+
| `index.ts` | 插件入口。注册到 OpenClaw Plugin API,解析配置,挂载 `before_agent_start`(自动回忆)、`agent_end`(自动捕获)、集成 `self-improvement`(`agent:bootstrap`、`command:new/reset`)和集成 `memory-reflection`(`command:new/reset`)钩子 |
|
|
84
84
|
| `openclaw.plugin.json` | 插件元数据 + 完整 JSON Schema 配置声明(含 `uiHints`) |
|
|
85
85
|
| `package.json` | NPM 包信息,依赖 `@lancedb/lancedb`、`openai`、`@sinclair/typebox` |
|
|
86
86
|
| `cli.ts` | CLI 命令实现:`memory list/search/stats/delete/delete-bulk/export/import/reembed/migrate` |
|
|
@@ -88,7 +88,7 @@ OpenClaw 内置的 `memory-lancedb` 插件仅提供基本的向量搜索。**mem
|
|
|
88
88
|
| `src/embedder.ts` | Embedding 抽象层。兼容 OpenAI API 的任意 Provider(OpenAI、Gemini、Jina、Ollama 等),支持 task-aware embedding(`taskQuery`/`taskPassage`) |
|
|
89
89
|
| `src/retriever.ts` | 混合检索引擎。Vector + BM25 → RRF 融合 → Jina Cross-Encoder Rerank → Recency Boost → Importance Weight → Length Norm → Time Decay → Hard Min Score → Noise Filter → MMR Diversity |
|
|
90
90
|
| `src/scopes.ts` | 多 Scope 访问控制。支持 `global`、`agent:<id>`、`custom:<name>`、`project:<id>`、`user:<id>` 等 Scope 模式 |
|
|
91
|
-
| `src/tools.ts` | Agent 工具定义:`memory_recall`、`memory_store`、`memory_forget
|
|
91
|
+
| `src/tools.ts` | Agent 工具定义:`memory_recall`、`memory_store`、`memory_forget`(核心)、`self_improvement_log`(默认)+ `self_improvement_review`、`self_improvement_extract_skill`(管理模式) |
|
|
92
92
|
| `src/noise-filter.ts` | 噪声过滤器。过滤 Agent 拒绝回复、Meta 问题、寒暄等低质量记忆 |
|
|
93
93
|
| `src/adaptive-retrieval.ts` | 自适应检索。判断 query 是否需要触发记忆检索(跳过问候、命令、简单确认等) |
|
|
94
94
|
| `src/migrate.ts` | 迁移工具。从旧版 `memory-lancedb` 插件迁移数据到 Pro 版 |
|
|
@@ -146,14 +146,108 @@ Query → BM25 FTS ─────┘
|
|
|
146
146
|
- 过滤 Meta 问题("do you remember")
|
|
147
147
|
- 过滤寒暄("hi"、"hello"、"HEARTBEAT")
|
|
148
148
|
|
|
149
|
-
### 7. Session
|
|
150
|
-
|
|
151
|
-
-
|
|
152
|
-
-
|
|
153
|
-
-
|
|
154
|
-
-
|
|
155
|
-
|
|
156
|
-
|
|
149
|
+
### 7. Session 策略
|
|
150
|
+
|
|
151
|
+
- `sessionStrategy: "systemSessionMemory"`(默认):关闭插件反思 hooks,改用 OpenClaw 内置 `session-memory`
|
|
152
|
+
- `sessionStrategy: "memoryReflection"`:使用插件的 memory-reflection hooks(需显式开启)
|
|
153
|
+
- `sessionStrategy: "none"`:禁用本插件的会话策略 hooks
|
|
154
|
+
- 兼容说明:`sessionMemory.enabled=true|false` 映射为 `systemSessionMemory|none`
|
|
155
|
+
- 升级行为说明:
|
|
156
|
+
- 旧版插件式 session summary 行为不再作为隐式默认值。
|
|
157
|
+
- 升级后,如果你希望 `/new` / `/reset` 走插件反思链路,必须显式设置 `sessionStrategy: "memoryReflection"`。
|
|
158
|
+
- 保留 `sessionMemory.enabled: true` 时,现在会走更安全的兼容路径 `systemSessionMemory`,而不是静默切到新的 reflection pipeline。
|
|
159
|
+
|
|
160
|
+
### 8. Self-Improvement
|
|
161
|
+
|
|
162
|
+
- 触发事件:`agent:bootstrap`、`command:new`、`command:reset`
|
|
163
|
+
- `agent:bootstrap`:注入 `SELF_IMPROVEMENT_REMINDER.md` 到 bootstrap 上下文
|
|
164
|
+
- `command:new` / `command:reset`:在会话重置前注入简短 `/note self-improvement ...` 提醒
|
|
165
|
+
- 文件:确保 `.learnings/LEARNINGS.md`、`.learnings/ERRORS.md`、`.learnings/FEATURE_REQUESTS.md` 存在
|
|
166
|
+
- 行为说明:
|
|
167
|
+
- 这条链路集成在插件生命周期内,可与 `sessionStrategy=systemSessionMemory` 共存。
|
|
168
|
+
- 它与 `memoryReflection` 是分开的:看到 self-improvement note 或 `.learnings/*` 写入,并不等于 reflection 存储已经开启。
|
|
169
|
+
- 治理类 extract/review 动作仍然是显式工具触发,不是后台自动触发。
|
|
170
|
+
- 工具:
|
|
171
|
+
- `self_improvement_log`:写入结构化 LRN/ERR/FEAT 条目
|
|
172
|
+
- `self_improvement_review`:汇总治理 backlog(pending/high/promoted)
|
|
173
|
+
- `self_improvement_extract_skill`:从学习条目提炼可复用 `SKILL.md` 脚手架
|
|
174
|
+
- 触发者:由用户/模型显式调用工具触发(非后台自动触发)
|
|
175
|
+
- 时机:按需、单次执行
|
|
176
|
+
- 输入:需明确提供 `learningId` 与 `skillName`
|
|
177
|
+
- 风险画像:低风险、可控,误写概率更低
|
|
178
|
+
- 推荐方式:先稳定流程,再由人工把关质量
|
|
179
|
+
|
|
180
|
+
### 9. memoryReflection
|
|
181
|
+
|
|
182
|
+
- 触发条件:
|
|
183
|
+
- `sessionStrategy` 必须为 `memoryReflection`(需显式配置)。
|
|
184
|
+
- 触发事件为 `command:new` / `command:reset`。
|
|
185
|
+
- 若会话上下文不完整(例如缺少 `cfg`、session 文件、可读对话内容),会跳过反思生成。
|
|
186
|
+
- 反思执行链:
|
|
187
|
+
- 先尝试 embedded runner(`runEmbeddedPiAgent`)。
|
|
188
|
+
- 若 embedded 路径失败,自动回退到 `openclaw agent --local --json`。
|
|
189
|
+
- 仅当两者都失败时,才写入最小 fallback 反思文本。
|
|
190
|
+
- Reflect 产物:
|
|
191
|
+
- 结构化输出应包含这些段落:`## Context`、`## Decisions (durable)`、`## User model deltas (about the human)`、`## Agent model deltas (about the assistant/system)`、`## Lessons & pitfalls (symptom / cause / fix / prevention)`、`## Learning governance candidates (.learnings / promotion / skill extraction)`、`## Open loops / next actions`、`## Retrieval tags / keywords`、`## Invariants`、`## Derived`。
|
|
192
|
+
- `## Invariants` 用于稳定规则沉淀;`## Derived` 用于下一次执行增量。
|
|
193
|
+
- Markdown 产物写入 `memory/reflections/YYYY-MM-DD/`。
|
|
194
|
+
- 文件名为高精度时间戳 + agent/session token(带冲突后缀),例如 `HHMMSSmmm-agent-session[-xxxxxx].md`。
|
|
195
|
+
- 写入 LanceDB(可选):
|
|
196
|
+
- 由 `memoryReflection.storeToLanceDB` 控制(且仅在 `sessionStrategy=memoryReflection` 下生效)。
|
|
197
|
+
- 只有非 fallback 反思才会进入 LanceDB 持久化流程。
|
|
198
|
+
- 写入前会做相似度去重(命中 `> 0.97` 则跳过入库)。
|
|
199
|
+
- 反思记忆写入时使用分类 `reflection`,展示标签为 `reflection:<scope>`。
|
|
200
|
+
- 写入的 metadata 会包含反思执行字段,例如 `type`、`stage`、`sessionKey`、`sessionId`、`agentId`、`command`、`storedAt`、`invariants[]`、`derived[]`、`usedFallback`、`errorSignals[]`。
|
|
201
|
+
- 独立代理(可选):通过 `memoryReflection.agentId` 指定用于反思生成的代理(例如 `memory-distiller`)
|
|
202
|
+
- 若配置的 `memoryReflection.agentId` 不在 `cfg.agents.list` 中,插件会明确 `warn` 并回退到当前 runtime agent id。
|
|
203
|
+
- 对 embedded 运行,插件会解析目标代理主模型引用(`provider/model`),并显式传入 `provider` 与 `model`。
|
|
204
|
+
- Inherit:`before_agent_start` 注入 `<inherited-rules>`,来源是稳定的 reflection invariants。
|
|
205
|
+
- Derive:`before_prompt_build` 注入 `<derived-focus>` 与 `<error-detected>`。
|
|
206
|
+
- `<derived-focus>` 仅取最近且非 fallback 的反思,并过滤占位行。
|
|
207
|
+
- 派生行提取关键词:`reflect|inherit|derive|change|apply`。
|
|
208
|
+
- 错误闭环:`after_tool_call` 捕获并去重工具错误签名,用于提醒与反思上下文
|
|
209
|
+
|
|
210
|
+
### 10. Markdown 镜像(`mdMirror`)
|
|
211
|
+
|
|
212
|
+
- 作用:
|
|
213
|
+
- 在写入 LanceDB 的同时,把记忆双写到可读的 Markdown 文件。
|
|
214
|
+
- 便于审计、排查和人工复核。
|
|
215
|
+
- 写入路径:
|
|
216
|
+
- 优先:按 agent workspace 映射写入 `memory/YYYY-MM-DD.md`。
|
|
217
|
+
- 回退:当 agent workspace 不可解析时,写入 `mdMirror.dir`(默认 `memory-md`)。
|
|
218
|
+
- 触发路径:
|
|
219
|
+
- `memory_store` 工具写入。
|
|
220
|
+
- `agent_end` 自动捕获写入。
|
|
221
|
+
- 兼容性:
|
|
222
|
+
- 不替代 LanceDB 存储,不影响现有检索链路。
|
|
223
|
+
- 检索仍走 vector/BM25/rerank。
|
|
224
|
+
- 配置项:
|
|
225
|
+
- `mdMirror.enabled`:是否开启双写(默认 `false`)。
|
|
226
|
+
- `mdMirror.dir`:Markdown 镜像回退目录。
|
|
227
|
+
|
|
228
|
+
### 11. 长文本分块嵌入(Long Context Chunking)
|
|
229
|
+
|
|
230
|
+
自动处理超出 Embedding 模型上下文限制的长文本:
|
|
231
|
+
|
|
232
|
+
- **智能分割**:在句子边界分块,支持可配置重叠区(默认 200 字符)
|
|
233
|
+
- **平均嵌入**:分别 embed 每个块,再取平均向量保留语义
|
|
234
|
+
- **优雅降级**:检测到 "Input length exceeds context length" 时自动重试分块
|
|
235
|
+
- **配置开关**:`embedding.chunking` — 设为 `false` 可关闭(默认:遇到上下文超限自动开启)
|
|
236
|
+
- **适配各模型限制**:Jina(8192 tokens)、OpenAI(8191)、Gemini(2048)等
|
|
237
|
+
|
|
238
|
+
详细实现参见 [`docs/long-context-chunking.md`](docs/long-context-chunking.md)。
|
|
239
|
+
|
|
240
|
+
### 12. Embedding 错误诊断
|
|
241
|
+
|
|
242
|
+
当 Embedding 调用失败时,插件提供**可操作的错误提示**,而非笼统的报错信息:
|
|
243
|
+
|
|
244
|
+
- **认证错误**(401/403):提示检查 API key 有效性和格式
|
|
245
|
+
- **网络错误**(ECONNREFUSED、ETIMEDOUT):提示检查 `baseURL` 和网络连通性
|
|
246
|
+
- **频率限制**(429):建议重试或升级套餐
|
|
247
|
+
- **模型未找到**(404):建议核对模型名称是否与提供商文档一致
|
|
248
|
+
- **上下文超长**:自动重试分块嵌入(见上文)
|
|
249
|
+
|
|
250
|
+
### 13. 自动捕获 & 自动回忆
|
|
157
251
|
|
|
158
252
|
- **Auto-Capture**(`agent_end` hook): 从对话中提取 preference/fact/decision/entity,去重后存储(每次最多 3 条)
|
|
159
253
|
- 触发词支持 **简体中文 + 繁體中文**(例如:记住/記住、偏好/喜好/喜歡、决定/決定 等)
|
|
@@ -338,11 +432,12 @@ openclaw config get plugins.slots.memory
|
|
|
338
432
|
"dbPath": "~/.openclaw/memory/lancedb-pro",
|
|
339
433
|
"autoCapture": true,
|
|
340
434
|
"autoRecall": false,
|
|
435
|
+
"autoRecallMinLength": 8,
|
|
341
436
|
"retrieval": {
|
|
342
437
|
"mode": "hybrid",
|
|
343
438
|
"vectorWeight": 0.7,
|
|
344
439
|
"bm25Weight": 0.3,
|
|
345
|
-
"minScore": 0.
|
|
440
|
+
"minScore": 0.45,
|
|
346
441
|
"rerank": "cross-encoder",
|
|
347
442
|
"rerankApiKey": "${JINA_API_KEY}",
|
|
348
443
|
"rerankModel": "jina-reranker-v3",
|
|
@@ -352,9 +447,12 @@ openclaw config get plugins.slots.memory
|
|
|
352
447
|
"filterNoise": true,
|
|
353
448
|
"lengthNormAnchor": 500,
|
|
354
449
|
"hardMinScore": 0.35,
|
|
355
|
-
"timeDecayHalfLifeDays": 60
|
|
450
|
+
"timeDecayHalfLifeDays": 60,
|
|
451
|
+
"reinforcementFactor": 0.5,
|
|
452
|
+
"maxHalfLifeMultiplier": 3
|
|
356
453
|
},
|
|
357
454
|
"enableManagementTools": false,
|
|
455
|
+
"sessionStrategy": "systemSessionMemory",
|
|
358
456
|
"scopes": {
|
|
359
457
|
"default": "global",
|
|
360
458
|
"definitions": {
|
|
@@ -365,15 +463,67 @@ openclaw config get plugins.slots.memory
|
|
|
365
463
|
"discord-bot": ["global", "agent:discord-bot"]
|
|
366
464
|
}
|
|
367
465
|
},
|
|
368
|
-
"
|
|
466
|
+
"selfImprovement": {
|
|
467
|
+
"enabled": true,
|
|
468
|
+
"beforeResetNote": true,
|
|
469
|
+
"skipSubagentBootstrap": true,
|
|
470
|
+
"ensureLearningFiles": true
|
|
471
|
+
},
|
|
472
|
+
"memoryReflection": {
|
|
473
|
+
"storeToLanceDB": true,
|
|
474
|
+
"injectMode": "inheritance+derived",
|
|
475
|
+
"agentId": "memory-distiller",
|
|
476
|
+
"messageCount": 120,
|
|
477
|
+
"maxInputChars": 24000,
|
|
478
|
+
"timeoutMs": 20000,
|
|
479
|
+
"thinkLevel": "medium",
|
|
480
|
+
"errorReminderMaxEntries": 3,
|
|
481
|
+
"dedupeErrorSignals": true
|
|
482
|
+
},
|
|
483
|
+
"mdMirror": {
|
|
369
484
|
"enabled": false,
|
|
370
|
-
"
|
|
485
|
+
"dir": "memory-md"
|
|
371
486
|
}
|
|
372
487
|
}
|
|
373
488
|
```
|
|
374
489
|
|
|
375
490
|
</details>
|
|
376
491
|
|
|
492
|
+
### 参数映射提示(避免常见误配)
|
|
493
|
+
|
|
494
|
+
`memory-lancedb-pro` **不支持** `recallTopK` / `recallThreshold` 这两个字段。
|
|
495
|
+
|
|
496
|
+
如果你希望达到类似效果,请使用下列等价参数:
|
|
497
|
+
|
|
498
|
+
- `recallTopK` → `retrieval.candidatePoolSize`
|
|
499
|
+
- `recallThreshold` → 组合使用 `retrieval.minScore` + `retrieval.hardMinScore`
|
|
500
|
+
|
|
501
|
+
实战上,中文对话可先从以下配置起步(再按误召回情况微调):
|
|
502
|
+
|
|
503
|
+
```json
|
|
504
|
+
{
|
|
505
|
+
"autoCapture": true,
|
|
506
|
+
"autoRecall": true,
|
|
507
|
+
"autoRecallMinLength": 8,
|
|
508
|
+
"retrieval": {
|
|
509
|
+
"candidatePoolSize": 20,
|
|
510
|
+
"minScore": 0.45,
|
|
511
|
+
"hardMinScore": 0.55
|
|
512
|
+
}
|
|
513
|
+
}
|
|
514
|
+
```
|
|
515
|
+
|
|
516
|
+
### 访问强化(1.0.26)
|
|
517
|
+
|
|
518
|
+
为了让“经常被用到的记忆”衰减得更慢,检索器可以根据 **手动 recall 的频率**(类似间隔重复/记忆强化)来延长有效的 time-decay half-life。
|
|
519
|
+
|
|
520
|
+
配置项(位于 `retrieval` 下):
|
|
521
|
+
- `reinforcementFactor`(范围 0–2,默认 `0.5`)— 设为 `0` 可关闭
|
|
522
|
+
- `maxHalfLifeMultiplier`(范围 1–10,默认 `3`)— 硬上限:有效 half-life ≤ 基础值 × multiplier
|
|
523
|
+
|
|
524
|
+
说明:
|
|
525
|
+
- 强化逻辑只对白名单 `source: "manual"` 生效(用户/工具主动 recall),避免 auto-recall 意外“强化”噪声。
|
|
526
|
+
|
|
377
527
|
### Embedding 提供商
|
|
378
528
|
|
|
379
529
|
本插件支持 **任意 OpenAI 兼容的 Embedding API**:
|
|
@@ -427,7 +577,7 @@ Legacy 方案:本插件也提供一个安全的 extractor 脚本 `scripts/json
|
|
|
427
577
|
- Cursor:`~/.openclaw/state/jsonl-distill/cursor.json`
|
|
428
578
|
- Batches:`~/.openclaw/state/jsonl-distill/batches/`
|
|
429
579
|
|
|
430
|
-
> 脚本只读 session JSONL
|
|
580
|
+
> 脚本只读 session JSONL,不会修改原始日志。默认会跳过 `*.reset.*` 快照与 slash 命令/控制注记行(例如 `/note self-improvement ...`)。
|
|
431
581
|
|
|
432
582
|
### (可选)启用 Agent 来源白名单(提高信噪比)
|
|
433
583
|
|
|
@@ -647,23 +797,25 @@ Config-only changes do NOT need cache clearing.
|
|
|
647
797
|
<a href="https://github.com/win4r"><img src="https://avatars.githubusercontent.com/u/42172631?v=4" width="48" height="48" alt="@win4r" /></a>
|
|
648
798
|
<a href="https://github.com/kctony"><img src="https://avatars.githubusercontent.com/u/1731141?v=4" width="48" height="48" alt="@kctony" /></a>
|
|
649
799
|
<a href="https://github.com/Akatsuki-Ryu"><img src="https://avatars.githubusercontent.com/u/8062209?v=4" width="48" height="48" alt="@Akatsuki-Ryu" /></a>
|
|
800
|
+
<a href="https://github.com/AliceLJY"><img src="https://avatars.githubusercontent.com/u/136287420?v=4" width="48" height="48" alt="@AliceLJY" /></a>
|
|
650
801
|
<a href="https://github.com/JasonSuz"><img src="https://avatars.githubusercontent.com/u/612256?v=4" width="48" height="48" alt="@JasonSuz" /></a>
|
|
651
802
|
<a href="https://github.com/Minidoracat"><img src="https://avatars.githubusercontent.com/u/11269639?v=4" width="48" height="48" alt="@Minidoracat" /></a>
|
|
803
|
+
<a href="https://github.com/rwmjhb"><img src="https://avatars.githubusercontent.com/u/91475811?v=4" width="48" height="48" alt="@rwmjhb" /></a>
|
|
652
804
|
<a href="https://github.com/furedericca-lab"><img src="https://avatars.githubusercontent.com/u/263020793?v=4" width="48" height="48" alt="@furedericca-lab" /></a>
|
|
653
805
|
<a href="https://github.com/joe2643"><img src="https://avatars.githubusercontent.com/u/19421931?v=4" width="48" height="48" alt="@joe2643" /></a>
|
|
654
|
-
<a href="https://github.com/AliceLJY"><img src="https://avatars.githubusercontent.com/u/136287420?v=4" width="48" height="48" alt="@AliceLJY" /></a>
|
|
655
806
|
<a href="https://github.com/chenjiyong"><img src="https://avatars.githubusercontent.com/u/8199522?v=4" width="48" height="48" alt="@chenjiyong" /></a>
|
|
656
807
|
</p>
|
|
657
808
|
|
|
658
|
-
- [@win4r](https://github.com/win4r)(
|
|
809
|
+
- [@win4r](https://github.com/win4r)(4 次提交)
|
|
659
810
|
- [@kctony](https://github.com/kctony)(2 次提交)
|
|
660
811
|
- [@Akatsuki-Ryu](https://github.com/Akatsuki-Ryu)(1 次提交)
|
|
661
812
|
- [@AliceLJY](https://github.com/AliceLJY)(1 次提交)
|
|
662
|
-
- [@chenjiyong](https://github.com/chenjiyong)(1 次提交)
|
|
663
813
|
- [@JasonSuz](https://github.com/JasonSuz)(1 次提交)
|
|
664
814
|
- [@Minidoracat](https://github.com/Minidoracat)(1 次提交)
|
|
815
|
+
- [@rwmjhb](https://github.com/rwmjhb)(1 次提交)
|
|
665
816
|
- [@furedericca-lab](https://github.com/furedericca-lab)(1 次提交)
|
|
666
817
|
- [@joe2643](https://github.com/joe2643)(1 次提交)
|
|
818
|
+
- [@chenjiyong](https://github.com/chenjiyong)(1 次提交)
|
|
667
819
|
|
|
668
820
|
完整列表:https://github.com/win4r/memory-lancedb-pro/graphs/contributors
|
|
669
821
|
|